summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGard Spreemann <gspreemann@gmail.com>2017-04-20 11:10:45 +0200
committerGard Spreemann <gspreemann@gmail.com>2017-04-20 11:10:45 +0200
commit8d7329f3e5ad843e553c3c5503cecc28ef2eead6 (patch)
tree6d80d83a7c4bcd3296e12a28404bfe84ef84ed55
parent55c7181126aa7defce38c9b82872d14223d4c1dd (diff)
GUDHI 2.0.0 as released by upstream in a tarball.upstream/2.0.0
-rw-r--r--CMakeGUDHIVersion.txt6
-rw-r--r--CMakeLists.txt213
-rw-r--r--Conventions.txt1
-rw-r--r--Doxyfile34
-rw-r--r--GUDHIVersion.cmake.in1
-rw-r--r--GudhUI/CMakeLists.txt69
-rw-r--r--GudhUI/gui/MainWindow.h4
-rw-r--r--GudhUI/gui/Menu_edge_contraction.h5
-rw-r--r--GudhUI/gui/Menu_k_nearest_neighbors.h2
-rw-r--r--GudhUI/gui/Menu_persistence.h2
-rw-r--r--GudhUI/gui/Menu_uniform_neighbors.h2
-rw-r--r--GudhUI/model/Model.h10
-rw-r--r--GudhUI/utils/Critical_points.h1
-rw-r--r--GudhUI/utils/Edge_contractor.h2
-rw-r--r--GudhUI/utils/Furthest_point_epsilon_net.h2
-rw-r--r--GudhUI/utils/Is_manifold.h1
-rw-r--r--GudhUI/utils/Persistence_compute.h17
-rw-r--r--GudhUI/utils/Vertex_collapsor.h1
-rw-r--r--GudhUI/view/FirstCoordProjector.h6
-rw-r--r--GudhUI/view/Viewer.h3
-rw-r--r--GudhUI/view/Viewer_instructor.h3
-rw-r--r--biblio/bibliography.bib41
-rw-r--r--biblio/how_to_cite_gudhi.bib62
-rw-r--r--cmake/modules/FindCython.cmake44
-rw-r--r--cmake/modules/FindGMPXX.cmake4
-rw-r--r--cmake/modules/FindQGLViewer.cmake2
-rw-r--r--cmake/modules/GUDHI_doxygen_target.cmake (renamed from cmake/modules/GUDHI_doxygen_target.txt)0
-rw-r--r--cmake/modules/GUDHI_test_coverage.cmake14
-rw-r--r--cmake/modules/GUDHI_third_party_libraries.cmake144
-rw-r--r--cmake/modules/GUDHI_user_version_target.txt112
-rw-r--r--concept/Alpha_complex/SimplicialComplexForAlpha.h89
-rw-r--r--concept/Bottleneck_distance/Persistence_diagram.h50
-rw-r--r--concept/Rips_complex/SimplicialComplexForRips.h54
-rw-r--r--concept/Skeleton_blocker/SkeletonBlockerDS.h213
-rw-r--r--concept/Skeleton_blocker/SkeletonBlockerGeometricDS.h113
-rw-r--r--concept/Witness_complex/SimplicialComplexForWitness.h (renamed from concept/Witness_complex/Simplicial_complex_for_witness.h)65
-rw-r--r--cython/CMakeLists.txt284
-rw-r--r--cython/CONVENTIONS9
-rw-r--r--cython/README3
-rw-r--r--cython/cython/alpha_complex.pyx121
-rw-r--r--cython/cython/bottleneck_distance.pyx61
-rw-r--r--cython/cython/cubical_complex.pyx197
-rw-r--r--cython/cython/euclidean_strong_witness_complex.pyx97
-rw-r--r--cython/cython/euclidean_witness_complex.pyx97
-rw-r--r--cython/cython/off_reader.pyx49
-rw-r--r--cython/cython/periodic_cubical_complex.pyx197
-rwxr-xr-xcython/cython/persistence_graphical_tools.py152
-rw-r--r--cython/cython/rips_complex.pyx125
-rw-r--r--cython/cython/simplex_tree.pyx401
-rw-r--r--cython/cython/strong_witness_complex.pyx81
-rw-r--r--cython/cython/subsampling.pyx140
-rw-r--r--cython/cython/tangential_complex.pyx151
-rw-r--r--cython/cython/witness_complex.pyx81
-rw-r--r--cython/cythonize_gudhi.py.in48
-rw-r--r--cython/doc/Makefile.in44
-rw-r--r--cython/doc/_templates/layout.html270
-rw-r--r--cython/doc/alpha_complex_ref.rst10
-rw-r--r--cython/doc/alpha_complex_sum.rst22
-rw-r--r--cython/doc/alpha_complex_user.rst205
-rw-r--r--cython/doc/bottleneck_distance_sum.rst15
-rw-r--r--cython/doc/bottleneck_distance_user.rst36
-rw-r--r--cython/doc/citation.rst15
-rwxr-xr-xcython/doc/conf.py278
-rw-r--r--cython/doc/cubical_complex_ref.rst9
-rw-r--r--cython/doc/cubical_complex_sum.rst15
-rw-r--r--cython/doc/cubical_complex_user.rst160
-rw-r--r--cython/doc/euclidean_strong_witness_complex_ref.rst10
-rw-r--r--cython/doc/euclidean_witness_complex_ref.rst10
-rw-r--r--cython/doc/examples.rst4
-rwxr-xr-xcython/doc/generate_examples.py43
-rw-r--r--cython/doc/img/graphical_tools_representation.pngbin0 -> 10846 bytes
-rw-r--r--cython/doc/index.rst87
-rw-r--r--cython/doc/installation.rst176
-rw-r--r--cython/doc/make.bat.in67
-rw-r--r--cython/doc/periodic_cubical_complex_ref.rst9
-rw-r--r--cython/doc/persistence_graphical_tools_ref.rst8
-rw-r--r--cython/doc/persistence_graphical_tools_sum.rst12
-rw-r--r--cython/doc/persistence_graphical_tools_user.rst66
-rw-r--r--cython/doc/persistent_cohomology_sum.rst27
-rw-r--r--cython/doc/persistent_cohomology_user.rst114
-rwxr-xr-xcython/doc/pyplots/barcode_persistence.py5
-rwxr-xr-xcython/doc/pyplots/diagram_persistence.py5
-rwxr-xr-xcython/doc/pyplots/show_palette_values.py2
-rwxr-xr-xcython/doc/python3-sphinx-build11
-rw-r--r--cython/doc/rips_complex_ref.rst10
-rw-r--r--cython/doc/rips_complex_sum.rst17
-rw-r--r--cython/doc/rips_complex_user.rst240
-rw-r--r--cython/doc/simplex_tree_ref.rst10
-rw-r--r--cython/doc/simplex_tree_sum.rst14
-rw-r--r--cython/doc/simplex_tree_user.rst68
-rw-r--r--cython/doc/strong_witness_complex_ref.rst10
-rw-r--r--cython/doc/tangential_complex_ref.rst10
-rw-r--r--cython/doc/tangential_complex_sum.rst15
-rw-r--r--cython/doc/tangential_complex_user.rst195
-rw-r--r--cython/doc/todos.rst5
-rw-r--r--cython/doc/witness_complex_ref.rst10
-rw-r--r--cython/doc/witness_complex_sum.rst17
-rw-r--r--cython/doc/witness_complex_user.rst131
-rwxr-xr-xcython/example/alpha_complex_diagram_persistence_from_off_file_example.py70
-rwxr-xr-xcython/example/alpha_complex_from_points_example.py67
-rwxr-xr-xcython/example/alpha_rips_persistence_bottleneck_distance.py100
-rwxr-xr-xcython/example/bottleneck_basic_example.py48
-rwxr-xr-xcython/example/euclidean_strong_witness_complex_diagram_persistence_from_off_file_example.py78
-rwxr-xr-xcython/example/euclidean_witness_complex_diagram_persistence_from_off_file_example.py78
-rwxr-xr-xcython/example/gudhi_graphical_tools_example.py47
-rwxr-xr-xcython/example/periodic_cubical_complex_barcode_persistence_from_perseus_file_example.py76
-rwxr-xr-xcython/example/random_cubical_complex_persistence_example.py58
-rwxr-xr-xcython/example/rips_complex_diagram_persistence_from_distance_matrix_file_example.py71
-rwxr-xr-xcython/example/rips_complex_diagram_persistence_from_off_file_example.py71
-rwxr-xr-xcython/example/rips_complex_from_points_example.py40
-rwxr-xr-xcython/example/rips_persistence_diagram.py42
-rwxr-xr-xcython/example/simplex_tree_example.py66
-rwxr-xr-xcython/example/tangential_complex_plain_homology_from_off_file_example.py66
-rwxr-xr-xcython/example/witness_complex_from_nearest_landmark_table.py46
-rw-r--r--cython/gudhi.pyx.in39
-rw-r--r--cython/include/Alpha_complex_interface.h82
-rw-r--r--cython/include/Bottleneck_distance_interface.h53
-rw-r--r--cython/include/Cubical_complex_interface.h56
-rw-r--r--cython/include/Euclidean_strong_witness_complex_interface.h93
-rw-r--r--cython/include/Euclidean_witness_complex_interface.h92
-rw-r--r--cython/include/Off_reader_interface.h42
-rw-r--r--cython/include/Persistent_cohomology_interface.h95
-rw-r--r--cython/include/Rips_complex_interface.h87
-rw-r--r--cython/include/Simplex_tree_interface.h154
-rw-r--r--cython/include/Strong_witness_complex_interface.h73
-rw-r--r--cython/include/Subsampling_interface.h119
-rw-r--r--cython/include/Tangential_complex_interface.h123
-rw-r--r--cython/include/Witness_complex_interface.h74
-rwxr-xr-xcython/test/test_alpha_complex.py86
-rwxr-xr-xcython/test/test_bottleneck_distance.py35
-rwxr-xr-xcython/test/test_cubical_complex.py86
-rwxr-xr-xcython/test/test_euclidean_witness_complex.py71
-rwxr-xr-xcython/test/test_rips_complex.py111
-rwxr-xr-xcython/test/test_simplex_tree.py132
-rwxr-xr-xcython/test/test_subsampling.py133
-rwxr-xr-xcython/test/test_tangential_complex.py52
-rwxr-xr-xcython/test/test_witness_complex.py62
-rw-r--r--data/bitmap/cubicalcomplexdoc.txt12
-rw-r--r--data/bitmap/periodiccubicalcomplexdoc.txt12
-rw-r--r--data/distance_matrix/full_square_distance_matrix.csv7
-rw-r--r--data/distance_matrix/lower_triangular_distance_matrix.csv5
-rw-r--r--data/filtered_simplicial_complex/Klein_bottle_complex.fsc (renamed from data/points/Klein_bottle_complex.txt)0
-rw-r--r--data/filtered_simplicial_complex/bunny_5000_complex.fsc (renamed from data/points/bunny_5000.st)0
-rw-r--r--data/meshes/min_cube3D_8.off16
-rw-r--r--data/points/COIL_database/README2
-rw-r--r--data/points/Kl.txt10000
-rw-r--r--data/points/README2
-rw-r--r--data/points/SO3.COPYRIGHT2
-rw-r--r--data/points/SO3_10000.off4
-rw-r--r--data/points/SO3_50000.off4
-rw-r--r--data/points/bunny.COPYRIGHT6
-rw-r--r--data/points/bunny_1011
-rw-r--r--data/points/bunny_10.st100
-rw-r--r--data/points/bunny_10001001
-rw-r--r--data/points/bunny_1000.st26914
-rw-r--r--data/points/bunny_5000.off (renamed from data/points/bunny_5000)3
-rw-r--r--data/points/generator/CMakeLists.txt29
-rw-r--r--data/points/generator/README8
-rw-r--r--data/points/generator/hypergenerator.cpp16
-rw-r--r--data/points/sphere3D_pts_on_grid.off17286
-rw-r--r--data/points/tore3D_1307.txt1307
-rw-r--r--data/points/tore3D_300.weights300
-rw-r--r--debian/changelog5
-rw-r--r--debian/compat1
-rw-r--r--debian/control26
-rw-r--r--debian/copyright28
-rw-r--r--debian/docs2
-rwxr-xr-xdebian/rules28
-rw-r--r--debian/source/format1
-rw-r--r--doc/Alpha_complex/COPYRIGHT19
-rw-r--r--doc/Alpha_complex/Intro_alpha_complex.h40
-rw-r--r--doc/Alpha_complex/alpha_complex_doc.ipe315
-rw-r--r--doc/Alpha_complex/alpha_complex_doc.pngbin25554 -> 18720 bytes
-rw-r--r--doc/Bitmap_cubical_complex/COPYRIGHT19
-rw-r--r--doc/Bitmap_cubical_complex/Gudhi_Cubical_Complex_doc.h2
-rw-r--r--doc/Bottleneck_distance/COPYRIGHT19
-rw-r--r--doc/Bottleneck_distance/Intro_bottleneck_distance.h51
-rw-r--r--doc/Bottleneck_distance/perturb_pd.pngbin0 -> 20864 bytes
-rw-r--r--doc/Contraction/COPYRIGHT18
-rw-r--r--doc/Persistent_cohomology/COPYRIGHT19
-rw-r--r--doc/Persistent_cohomology/Intro_persistent_cohomology.h44
-rw-r--r--doc/Rips_complex/COPYRIGHT19
-rw-r--r--doc/Rips_complex/Intro_rips_complex.h158
-rw-r--r--doc/Rips_complex/rips_complex_representation.ipe326
-rw-r--r--doc/Rips_complex/rips_complex_representation.pngbin0 -> 15677 bytes
-rw-r--r--doc/Rips_complex/rips_one_skeleton.ipe326
-rw-r--r--doc/Rips_complex/rips_one_skeleton.pngbin0 -> 47651 bytes
-rw-r--r--doc/Simplex_tree/COPYRIGHT19
-rw-r--r--doc/Simplex_tree/Intro_simplex_tree.h7
-rw-r--r--doc/Skeleton_blocker/COPYRIGHT18
-rw-r--r--doc/Spatial_searching/Intro_spatial_searching.h62
-rw-r--r--doc/Subsampling/Intro_subsampling.h70
-rw-r--r--doc/Tangential_complex/COPYRIGHT19
-rw-r--r--doc/Tangential_complex/Intro_tangential_complex.h119
-rw-r--r--doc/Tangential_complex/tc_example_01.pngbin0 -> 20323 bytes
-rw-r--r--doc/Tangential_complex/tc_example_02.pngbin0 -> 36017 bytes
-rw-r--r--doc/Tangential_complex/tc_example_03.pngbin0 -> 62990 bytes
-rw-r--r--doc/Tangential_complex/tc_example_05.pngbin0 -> 36032 bytes
-rw-r--r--doc/Tangential_complex/tc_example_06.pngbin0 -> 37195 bytes
-rw-r--r--doc/Tangential_complex/tc_example_07.pngbin0 -> 49399 bytes
-rw-r--r--doc/Tangential_complex/tc_example_07_after.pngbin0 -> 50132 bytes
-rw-r--r--doc/Tangential_complex/tc_example_07_before.pngbin0 -> 48898 bytes
-rw-r--r--doc/Tangential_complex/tc_example_08.pngbin0 -> 63636 bytes
-rw-r--r--doc/Tangential_complex/tc_example_09.pngbin0 -> 35453 bytes
-rw-r--r--doc/Tangential_complex/tc_examples.pngbin0 -> 150776 bytes
-rw-r--r--doc/Witness_complex/COPYRIGHT19
-rw-r--r--doc/Witness_complex/Witness_complex_doc.h105
-rw-r--r--doc/Witness_complex/Witness_complex_representation.ipe280
-rw-r--r--doc/Witness_complex/Witness_complex_representation.pngbin48899 -> 21202 bytes
-rw-r--r--doc/Witness_complex/swit.svg1303
-rw-r--r--doc/common/header.html24
-rw-r--r--doc/common/main_page.h190
-rw-r--r--doc/common/main_page.h~341
-rw-r--r--example/Alpha_complex/Alpha_complex_from_off.cpp47
-rw-r--r--example/Alpha_complex/Alpha_complex_from_points.cpp46
-rw-r--r--example/Alpha_complex/CMakeLists.txt53
-rw-r--r--example/Bitmap_cubical_complex/CMakeLists.txt20
-rw-r--r--example/Bottleneck_distance/CMakeLists.txt22
-rw-r--r--example/Bottleneck_distance/alpha_rips_persistence_bottleneck_distance.cpp190
-rw-r--r--example/Bottleneck_distance/bottleneck_basic_example.cpp50
-rw-r--r--example/Bottleneck_distance/bottleneck_read_file_example.cpp72
-rw-r--r--example/Contraction/CMakeLists.txt9
-rw-r--r--example/Contraction/Garland_heckbert.cpp26
-rw-r--r--example/Contraction/Garland_heckbert/Error_quadric.h6
-rw-r--r--example/Contraction/Rips_contraction.cpp25
-rw-r--r--example/Persistent_cohomology/CMakeLists.txt102
-rw-r--r--example/Persistent_cohomology/README50
-rw-r--r--example/Persistent_cohomology/alpha_complex_3d_helper.h76
-rw-r--r--example/Persistent_cohomology/alpha_complex_3d_persistence.cpp118
-rw-r--r--example/Persistent_cohomology/alpha_complex_persistence.cpp66
-rw-r--r--example/Persistent_cohomology/custom_persistence_sort.cpp89
-rw-r--r--example/Persistent_cohomology/exact_alpha_complex_3d_persistence.cpp245
-rw-r--r--example/Persistent_cohomology/performance_rips_persistence.cpp214
-rw-r--r--example/Persistent_cohomology/periodic_alpha_complex_3d_persistence.cpp79
-rw-r--r--example/Persistent_cohomology/persistence_from_simple_simplex_tree.cpp19
-rw-r--r--example/Persistent_cohomology/plain_homology.cpp11
-rw-r--r--example/Persistent_cohomology/rips_distance_matrix_persistence.cpp144
-rw-r--r--example/Persistent_cohomology/rips_multifield_persistence.cpp58
-rw-r--r--example/Persistent_cohomology/rips_persistence.cpp60
-rw-r--r--example/Persistent_cohomology/rips_persistence_step_by_step.cpp217
-rw-r--r--example/Persistent_cohomology/rips_persistence_via_boundary_matrix.cpp52
-rw-r--r--example/Persistent_cohomology/weighted_alpha_complex_3d_persistence.cpp263
-rw-r--r--example/Rips_complex/CMakeLists.txt58
-rw-r--r--example/Rips_complex/example_one_skeleton_rips_from_distance_matrix.cpp58
-rw-r--r--example/Rips_complex/example_one_skeleton_rips_from_points.cpp52
-rw-r--r--example/Rips_complex/example_rips_complex_from_csv_distance_matrix_file.cpp72
-rw-r--r--example/Rips_complex/example_rips_complex_from_off_file.cpp71
-rw-r--r--example/Rips_complex/full_skeleton_rips_for_doc.txt26
-rw-r--r--example/Rips_complex/one_skeleton_rips_for_doc.txt20
-rw-r--r--example/Simplex_tree/CMakeLists.txt29
-rw-r--r--example/Simplex_tree/README8
-rw-r--r--example/Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp (renamed from example/Simplex_tree/simplex_tree_from_alpha_shapes_3.cpp)26
-rw-r--r--example/Simplex_tree/mini_simplex_tree.cpp9
-rw-r--r--example/Simplex_tree/simple_simplex_tree.cpp15
-rw-r--r--example/Simplex_tree/simplex_tree_from_cliques_of_graph.cpp11
-rw-r--r--example/Skeleton_blocker/CMakeLists.txt14
-rw-r--r--example/Skeleton_blocker/Skeleton_blocker_from_simplices.cpp11
-rw-r--r--example/Skeleton_blocker/Skeleton_blocker_iteration.cpp10
-rw-r--r--example/Skeleton_blocker/Skeleton_blocker_link.cpp22
-rw-r--r--example/Spatial_searching/CMakeLists.txt9
-rw-r--r--example/Spatial_searching/example_spatial_searching.cpp52
-rw-r--r--example/Subsampling/CMakeLists.txt17
-rw-r--r--example/Subsampling/example_choose_n_farthest_points.cpp29
-rw-r--r--example/Subsampling/example_custom_kernel.cpp65
-rw-r--r--example/Subsampling/example_pick_n_random_points.cpp27
-rw-r--r--example/Subsampling/example_sparsify_point_set.cpp27
-rw-r--r--example/Tangential_complex/CMakeLists.txt18
-rw-r--r--example/Tangential_complex/example_basic.cpp46
-rw-r--r--example/Tangential_complex/example_with_perturb.cpp53
-rw-r--r--example/Witness_complex/CMakeLists.txt54
-rw-r--r--example/Witness_complex/example_nearest_landmark_table.cpp69
-rw-r--r--example/Witness_complex/example_strong_witness_complex_off.cpp79
-rw-r--r--example/Witness_complex/example_strong_witness_persistence.cpp171
-rw-r--r--example/Witness_complex/example_witness_complex_off.cpp60
-rw-r--r--example/Witness_complex/example_witness_complex_persistence.cpp171
-rw-r--r--example/Witness_complex/example_witness_complex_sphere.cpp (renamed from example/Witness_complex/witness_complex_sphere.cpp)34
-rw-r--r--example/Witness_complex/generators.h31
-rw-r--r--example/Witness_complex/witness_complex_from_file.cpp100
-rw-r--r--example/common/CMakeLists.txt27
-rw-r--r--example/common/example_CGAL_3D_points_off_reader.cpp (renamed from example/common/CGAL_3D_points_off_reader.cpp)2
-rw-r--r--example/common/example_CGAL_points_off_reader.cpp (renamed from example/common/CGAL_points_off_reader.cpp)4
-rw-r--r--example/common/example_vector_double_points_off_reader.cpp41
-rw-r--r--include/gudhi/Active_witness/Active_witness.h67
-rw-r--r--include/gudhi/Active_witness/Active_witness_iterator.h108
-rw-r--r--include/gudhi/Alpha_complex.h233
-rw-r--r--include/gudhi/Alpha_complex.h~417
-rw-r--r--include/gudhi/Bottleneck.h115
-rw-r--r--include/gudhi/Clock.h48
-rw-r--r--include/gudhi/Debug_utils.h2
-rw-r--r--include/gudhi/Edge_contraction.h2
-rw-r--r--include/gudhi/Euclidean_strong_witness_complex.h104
-rw-r--r--include/gudhi/Euclidean_witness_complex.h106
-rw-r--r--include/gudhi/Graph_matching.h174
-rw-r--r--include/gudhi/Internal_point.h91
-rw-r--r--include/gudhi/Kd_tree_search.h264
-rw-r--r--include/gudhi/Landmark_choice_by_furthest_point.h105
-rw-r--r--include/gudhi/Landmark_choice_by_random_point.h96
-rw-r--r--include/gudhi/Neighbors_finder.h192
-rw-r--r--include/gudhi/Null_output_iterator.h48
-rw-r--r--include/gudhi/Persistence_graph.h188
-rw-r--r--include/gudhi/Persistent_cohomology.h26
-rw-r--r--include/gudhi/Points_3D_off_io.h4
-rw-r--r--include/gudhi/Points_off_io.h13
-rw-r--r--include/gudhi/Rips_complex.h185
-rw-r--r--include/gudhi/Simplex_tree.h2
-rw-r--r--include/gudhi/Skeleton_blocker.h219
-rw-r--r--include/gudhi/Skeleton_blocker/Skeleton_blocker_complex_visitor.h53
-rw-r--r--include/gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.h14
-rw-r--r--include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h11
-rw-r--r--include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h13
-rw-r--r--include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h38
-rw-r--r--include/gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h12
-rw-r--r--include/gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h49
-rw-r--r--include/gudhi/Skeleton_blocker/internal/Top_faces.h5
-rw-r--r--include/gudhi/Skeleton_blocker/internal/Trie.h9
-rw-r--r--include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h3
-rw-r--r--include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h3
-rw-r--r--include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_iterators.h2
-rw-r--r--include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h38
-rw-r--r--include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_triangles_iterators.h14
-rw-r--r--include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_vertices_iterators.h12
-rw-r--r--include/gudhi/Skeleton_blocker_complex.h33
-rw-r--r--include/gudhi/Skeleton_blocker_geometric_complex.h3
-rw-r--r--include/gudhi/Skeleton_blocker_link_complex.h30
-rw-r--r--include/gudhi/Skeleton_blocker_simplifiable_complex.h13
-rw-r--r--include/gudhi/Strong_witness_complex.h185
-rw-r--r--include/gudhi/Tangential_complex.h2276
-rw-r--r--include/gudhi/Tangential_complex/Simplicial_complex.h539
-rw-r--r--include/gudhi/Tangential_complex/config.h43
-rw-r--r--include/gudhi/Tangential_complex/utilities.h195
-rw-r--r--include/gudhi/Test.h105
-rw-r--r--include/gudhi/Witness_complex.h333
-rw-r--r--include/gudhi/Witness_complex/all_faces_in.h55
-rw-r--r--include/gudhi/choose_n_farthest_points.h133
-rw-r--r--include/gudhi/console_color.h97
-rw-r--r--include/gudhi/distance_functions.h40
-rw-r--r--include/gudhi/graph_simplicial_complex.h59
-rw-r--r--include/gudhi/pick_n_random_points.h86
-rw-r--r--include/gudhi/random_point_generators.h474
-rw-r--r--include/gudhi/reader_utils.h166
-rw-r--r--include/gudhi/sparsify_point_set.h113
-rw-r--r--include/gudhi_patches/Bottleneck_distance_CGAL_patches.txt3
-rw-r--r--include/gudhi_patches/CGAL/Convex_hull.h56
-rw-r--r--include/gudhi_patches/CGAL/Delaunay_triangulation.h933
-rw-r--r--include/gudhi_patches/CGAL/Epeck_d.h53
-rw-r--r--include/gudhi_patches/CGAL/Epick_d.h71
-rw-r--r--include/gudhi_patches/CGAL/IO/Triangulation_off_ostream.h320
-rw-r--r--include/gudhi_patches/CGAL/Kd_tree.h582
-rw-r--r--include/gudhi_patches/CGAL/Kd_tree_node.h586
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Cartesian_LA_base.h177
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Cartesian_LA_functors.h344
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Cartesian_base.h40
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Cartesian_change_FT.h117
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Cartesian_complete.h33
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Cartesian_filter_K.h79
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Cartesian_filter_NT.h93
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Cartesian_per_dimension.h33
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Cartesian_static_filters.h95
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Coaffine.h330
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Define_kernel_types.h50
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Dimension_base.h49
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Filtered_predicate2.h137
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/KernelD_converter.h199
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Kernel_2_interface.h104
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Kernel_3_interface.h102
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Kernel_d_interface.h298
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Kernel_object_converter.h134
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/LA_eigen/LA.h175
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/LA_eigen/constructors.h162
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Lazy_cartesian.h188
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Types/Aff_transformation.h59
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Types/Hyperplane.h159
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Types/Iso_box.h88
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Types/Line.h66
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Types/Ray.h66
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Types/Segment.h121
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Types/Sphere.h132
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Types/Weighted_point.h205
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Vector/array.h165
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Vector/avx4.h213
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_iterator_to_vectors.h76
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_points.h211
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_vectors_from_vectors.h201
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_points_from_vectors.h164
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_vectors_small_dim.h58
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_vectors_small_dim_internal.h164
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Vector/mix.h46
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Vector/sse2.h145
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Vector/v2int.h181
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Vector/vector.h167
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Cartesian_wrap.h305
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Hyperplane_d.h131
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Point_d.h284
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Ref_count_obj.h120
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Segment_d.h133
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Sphere_d.h130
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Vector_d.h266
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Weighted_point_d.h129
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/function_objects_cartesian.h1355
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/functor_properties.h40
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/functor_tags.h363
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/static_int.h61
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/store_kernel.h104
-rw-r--r--include/gudhi_patches/CGAL/NewKernel_d/utils.h306
-rw-r--r--include/gudhi_patches/CGAL/Orthogonal_incremental_neighbor_search.h620
-rw-r--r--include/gudhi_patches/CGAL/Regular_triangulation.h1169
-rw-r--r--include/gudhi_patches/CGAL/Regular_triangulation_traits_adapter.h288
-rw-r--r--include/gudhi_patches/CGAL/TDS_full_cell_default_storage_policy.h99
-rw-r--r--include/gudhi_patches/CGAL/TDS_full_cell_mirror_storage_policy.h71
-rw-r--r--include/gudhi_patches/CGAL/Triangulation.h1424
-rw-r--r--include/gudhi_patches/CGAL/Triangulation_data_structure.h1603
-rw-r--r--include/gudhi_patches/CGAL/Triangulation_ds_full_cell.h311
-rw-r--r--include/gudhi_patches/CGAL/Triangulation_ds_vertex.h154
-rw-r--r--include/gudhi_patches/CGAL/Triangulation_face.h111
-rw-r--r--include/gudhi_patches/CGAL/Triangulation_full_cell.h148
-rw-r--r--include/gudhi_patches/CGAL/Triangulation_vertex.h128
-rw-r--r--include/gudhi_patches/CGAL/argument_swaps.h88
-rw-r--r--include/gudhi_patches/CGAL/determinant_of_vectors.h117
-rw-r--r--include/gudhi_patches/CGAL/internal/Combination_enumerator.h148
-rw-r--r--include/gudhi_patches/CGAL/internal/Static_or_dynamic_array.h116
-rw-r--r--include/gudhi_patches/CGAL/internal/Triangulation/Dummy_TDS.h49
-rw-r--r--include/gudhi_patches/CGAL/internal/Triangulation/Triangulation_ds_iterators.h154
-rw-r--r--include/gudhi_patches/CGAL/internal/Triangulation/utilities.h154
-rw-r--r--include/gudhi_patches/CGAL/iterator_from_indices.h75
-rw-r--r--include/gudhi_patches/CGAL/transforming_iterator.h123
-rw-r--r--include/gudhi_patches/CGAL/transforming_pair_iterator.h127
-rw-r--r--include/gudhi_patches/CGAL/typeset.h117
-rw-r--r--include/gudhi_patches/Tangential_complex_CGAL_patches.txt82
428 files changed, 58785 insertions, 43074 deletions
diff --git a/CMakeGUDHIVersion.txt b/CMakeGUDHIVersion.txt
index a00ae1b2..bd0c57ac 100644
--- a/CMakeGUDHIVersion.txt
+++ b/CMakeGUDHIVersion.txt
@@ -1,6 +1,6 @@
-set (GUDHI_MAJOR_VERSION 1)
-set (GUDHI_MINOR_VERSION 3)
-set (GUDHI_PATCH_VERSION 1)
+set (GUDHI_MAJOR_VERSION 2)
+set (GUDHI_MINOR_VERSION 0)
+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 cde949e1..ebcb6888 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,146 +2,89 @@ cmake_minimum_required(VERSION 2.6)
project(GUDHI)
include("CMakeGUDHIVersion.txt")
-# Generate GUDHI official version file
-configure_file(GUDHIVersion.cmake.in "${CMAKE_SOURCE_DIR}/GUDHIVersion.cmake" @ONLY)
enable_testing()
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules/")
-find_package(Boost REQUIRED COMPONENTS system filesystem program_options chrono timer date_time REQUIRED)
+# For "make doxygen"
+set(GUDHI_USER_VERSION_DIR ${CMAKE_SOURCE_DIR})
+include(GUDHI_doxygen_target)
-if(NOT Boost_FOUND)
- message(FATAL_ERROR "NOTICE: This demo requires Boost and will not be compiled.")
+# This variable is used by Cython CMakeLists.txt to know its path
+set(GUDHI_CYTHON_PATH "cython")
+# For third parties libraries management - To be done last as CGAL updates CMAKE_MODULE_PATH
+include(GUDHI_third_party_libraries)
+
+if(MSVC)
+ # Turn off some VC++ warnings
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4267 /wd4668 /wd4311 /wd4800 /wd4820 /wd4503 /wd4244 /wd4345 /wd4996 /wd4396 /wd4018")
else()
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -pedantic")
+endif()
- # For "make doxygen"
- set(GUDHI_USER_VERSION_DIR ${CMAKE_SOURCE_DIR})
- include(${CMAKE_MODULE_PATH}/GUDHI_doxygen_target.txt)
-
- find_package(GMP)
- if(GMP_FOUND)
- message(STATUS "GMP_LIBRARIES = ${GMP_LIBRARIES}")
- INCLUDE_DIRECTORIES(${GMP_INCLUDE_DIR})
- find_package(GMPXX)
- if(GMPXX_FOUND)
- message(STATUS "GMPXX_LIBRARIES = ${GMPXX_LIBRARIES}")
- INCLUDE_DIRECTORIES(${GMPXX_INCLUDE_DIR})
- endif()
- endif()
-
- # In CMakeLists.txt, when include(${CGAL_USE_FILE}), CMAKE_CXX_FLAGS are overwritten.
- # cf. http://doc.cgal.org/latest/Manual/installation.html#title40
- # A workaround is to include(${CGAL_USE_FILE}) before adding "-std=c++11".
- # A fix would be to use https://cmake.org/cmake/help/v3.1/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.html
- # or even better https://cmake.org/cmake/help/v3.1/variable/CMAKE_CXX_STANDARD.html
- # but it implies to use cmake version 3.1 at least.
-
- # find CGAL in QUIET mode for cmake to be less verbose when CGAL is not found.
- find_package(CGAL QUIET)
- # Only CGAL versions > 4.4 supports what Gudhi uses from CGAL
- if (CGAL_VERSION VERSION_LESS 4.4.0 AND CGAL_FOUND)
- message("CGAL version ${CGAL_VERSION} is considered too old to be used by Gudhi.")
- unset(CGAL_FOUND)
- endif(CGAL_VERSION VERSION_LESS 4.4.0 AND CGAL_FOUND)
- if(CGAL_FOUND)
- message(STATUS "CGAL version: ${CGAL_VERSION}.")
- include( ${CGAL_USE_FILE} )
- endif()
-
- if(MSVC)
- # Turn off some VC++ warnings
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4267 /wd4668 /wd4311 /wd4800 /wd4820 /wd4503 /wd4244 /wd4345 /wd4996 /wd4396 /wd4018")
- else()
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wpedantic -Wsign-compare")
- endif()
-
- if(CMAKE_BUILD_TYPE MATCHES Debug)
- message("++ Debug compilation flags are: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}")
- else()
- message("++ Release compilation flags are: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}")
- endif()
-
- set(Boost_USE_STATIC_LIBS ON)
- set(Boost_USE_MULTITHREADED ON)
- set(Boost_USE_STATIC_RUNTIME OFF)
-
- # Find TBB package for parallel sort - not mandatory, just optional.
- set(TBB_FIND_QUIETLY ON)
- find_package(TBB)
- if (TBB_FOUND)
- include(${TBB_USE_FILE})
- message("TBB found in ${TBB_LIBRARY_DIRS}")
- add_definitions(-DGUDHI_USE_TBB)
- endif()
-
- find_package(Eigen3 3.1.0)
- if (EIGEN3_FOUND)
- message(STATUS "Eigen3 version: ${EIGEN3_VERSION}.")
- include( ${EIGEN3_USE_FILE} )
- #include_directories (BEFORE "../../include")
- endif (EIGEN3_FOUND)
-
- # BOOST ISSUE result_of vs C++11
- add_definitions(-DBOOST_RESULT_OF_USE_DECLTYPE)
- # BOOST ISSUE with Libraries name resolution under Windows
- add_definitions(-DBOOST_ALL_NO_LIB)
-
- INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
- LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})
-
- if (DEBUG_TRACES)
- message(STATUS "DEBUG_TRACES are activated")
- # For programs to be more verbose
- add_definitions(-DDEBUG_TRACES)
- endif()
-
- #---------------------------------------------------------------------------------------
- # Gudhi compilation part
- include_directories(include)
-
- add_subdirectory(example/common)
- add_subdirectory(example/Simplex_tree)
- add_subdirectory(example/Persistent_cohomology)
- add_subdirectory(example/Skeleton_blocker)
- add_subdirectory(example/Contraction)
- add_subdirectory(example/Bitmap_cubical_complex)
- add_subdirectory(example/Witness_complex)
- add_subdirectory(example/Alpha_complex)
-
- # data points generator
- add_subdirectory(data/points/generator)
-
- # Please let GudhUI in last compilation position as QT is known to modify CMAKE_CXX_FLAGS
- # GudhUI
- add_subdirectory(GudhUI)
- #---------------------------------------------------------------------------------------
-
- #---------------------------------------------------------------------------------------
- # GUDHIConfig.cmake
- # Export the package for use from the build-tree
- # (this registers the build-tree with a global CMake-registry)
- export(PACKAGE GUDHI)
-
- message("++ make install will install ${PROJECT_NAME} in the following directory : ${CMAKE_INSTALL_PREFIX}")
- # Create the GUDHIConfig.cmake and GUDHIConfigVersion files
- set(CONF_INCLUDE_DIRS "${CMAKE_INSTALL_PREFIX}/include")
- configure_file(GUDHIConfig.cmake.in "${PROJECT_BINARY_DIR}/GUDHIConfig.cmake" @ONLY)
- configure_file(GUDHIConfigVersion.cmake.in "${PROJECT_BINARY_DIR}/GUDHIConfigVersion.cmake" @ONLY)
-
- #---------------------------------------------------------------------------------------
-
- #---------------------------------------------------------------------------------------
- # Gudhi installation part
-
- # Install the GUDHIConfig.cmake and GUDHIConfigVersion.cmake
- install(FILES
- "${PROJECT_BINARY_DIR}/GUDHIConfig.cmake"
- "${PROJECT_BINARY_DIR}/GUDHIConfigVersion.cmake"
- DESTINATION share/gudhi)
-
- # install the include file on "make install"
- install(DIRECTORY include/gudhi DESTINATION include)
- #---------------------------------------------------------------------------------------
-
-endif()
+if(CMAKE_BUILD_TYPE MATCHES Debug)
+ message("++ Debug compilation flags are: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}")
+else()
+ message("++ Release compilation flags are: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}")
+endif()
+
+if (DEBUG_TRACES)
+ message(STATUS "DEBUG_TRACES are activated")
+ # For programs to be more verbose
+ add_definitions(-DDEBUG_TRACES)
+endif()
+
+#---------------------------------------------------------------------------------------
+# Gudhi compilation part
+include_directories(include)
+
+add_subdirectory(example/common)
+add_subdirectory(example/Simplex_tree)
+add_subdirectory(example/Persistent_cohomology)
+add_subdirectory(example/Skeleton_blocker)
+add_subdirectory(example/Contraction)
+add_subdirectory(example/Bitmap_cubical_complex)
+add_subdirectory(example/Witness_complex)
+add_subdirectory(example/Alpha_complex)
+add_subdirectory(example/Rips_complex)
+add_subdirectory(example/Spatial_searching)
+add_subdirectory(example/Subsampling)
+add_subdirectory(example/Tangential_complex)
+add_subdirectory(example/Bottleneck_distance)
+
+# data points generator
+add_subdirectory(data/points/generator)
+
+add_subdirectory(GudhUI)
+
+# specific for cython module
+add_subdirectory(${GUDHI_CYTHON_PATH})
+#---------------------------------------------------------------------------------------
+
+#---------------------------------------------------------------------------------------
+# GUDHIConfig.cmake
+# Export the package for use from the build-tree
+# (this registers the build-tree with a global CMake-registry)
+export(PACKAGE GUDHI)
+
+message("++ make install will install ${PROJECT_NAME} in the following directory : ${CMAKE_INSTALL_PREFIX}")
+# Create the GUDHIConfig.cmake and GUDHIConfigVersion files
+set(CONF_INCLUDE_DIRS "${CMAKE_INSTALL_PREFIX}/include")
+configure_file(GUDHIConfig.cmake.in "${PROJECT_BINARY_DIR}/GUDHIConfig.cmake" @ONLY)
+configure_file(GUDHIConfigVersion.cmake.in "${PROJECT_BINARY_DIR}/GUDHIConfigVersion.cmake" @ONLY)
+
+#---------------------------------------------------------------------------------------
+
+#---------------------------------------------------------------------------------------
+# Gudhi installation part
+
+# Install the GUDHIConfig.cmake and GUDHIConfigVersion.cmake
+install(FILES
+ "${PROJECT_BINARY_DIR}/GUDHIConfig.cmake"
+ "${PROJECT_BINARY_DIR}/GUDHIConfigVersion.cmake"
+ DESTINATION share/gudhi)
+
+# install the include file on "make install"
+install(DIRECTORY include/gudhi DESTINATION include)
+#---------------------------------------------------------------------------------------
diff --git a/Conventions.txt b/Conventions.txt
new file mode 100644
index 00000000..e4ae7925
--- /dev/null
+++ b/Conventions.txt
@@ -0,0 +1 @@
+Please refer to the Wiki: https://gforge.inria.fr/plugins/mediawiki/wiki/gudhi/index.php/Conventions \ No newline at end of file
diff --git a/Doxyfile b/Doxyfile
index 49e37c72..d2d0a447 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -38,7 +38,7 @@ PROJECT_NAME = "GUDHI"
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = "1.3.1"
+PROJECT_NUMBER = "2.0.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
@@ -500,7 +500,7 @@ HIDE_SCOPE_NAMES = NO
# the files that are included by a file in the documentation of that file.
# The default value is: YES.
-SHOW_INCLUDE_FILES = YES
+SHOW_INCLUDE_FILES = NO
# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
# grouped member an include statement to the documentation, telling the reader
@@ -781,8 +781,11 @@ RECURSIVE = YES
# run.
EXCLUDE = data/ \
- example/ \
- GudhUI/
+ example/ \
+ GudhUI/ \
+ cmake/ \
+ src/cython/ \
+ include/gudhi_patches/
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
# directories that are symbolic links (a Unix file system feature) are excluded
@@ -843,7 +846,12 @@ IMAGE_PATH = doc/Skeleton_blocker/ \
doc/Simplex_tree/ \
doc/Persistent_cohomology/ \
doc/Witness_complex/ \
- doc/Bitmap_cubical_complex/
+ doc/Bitmap_cubical_complex/ \
+ doc/Rips_complex/ \
+ doc/Subsampling/ \
+ doc/Spatial_searching/ \
+ doc/Tangential_complex/ \
+ doc/Bottleneck_distance/
# 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
@@ -1801,18 +1809,6 @@ GENERATE_XML = NO
XML_OUTPUT = xml
-# The XML_SCHEMA tag can be used to specify a XML schema, which can be used by a
-# validating XML parser to check the syntax of the XML files.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
-XML_SCHEMA =
-
-# The XML_DTD tag can be used to specify a XML DTD, which can be used by a
-# validating XML parser to check the syntax of the XML files.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
-XML_DTD =
-
# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
# listings (including syntax highlighting and cross-referencing information) to
# the XML output. Note that enabling this will significantly increase the size
@@ -2157,7 +2153,7 @@ TEMPLATE_RELATIONS = YES
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
-INCLUDE_GRAPH = YES
+INCLUDE_GRAPH = NO
# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
# set to YES then doxygen will generate a graph for each documented file showing
@@ -2166,7 +2162,7 @@ INCLUDE_GRAPH = YES
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
-INCLUDED_BY_GRAPH = YES
+INCLUDED_BY_GRAPH = NO
# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
# dependency graph for every global function or class method.
diff --git a/GUDHIVersion.cmake.in b/GUDHIVersion.cmake.in
deleted file mode 100644
index 2f433c1c..00000000
--- a/GUDHIVersion.cmake.in
+++ /dev/null
@@ -1 +0,0 @@
-@GUDHI_VERSION@
diff --git a/GudhUI/CMakeLists.txt b/GudhUI/CMakeLists.txt
index a43294ea..ca2e47c1 100644
--- a/GudhUI/CMakeLists.txt
+++ b/GudhUI/CMakeLists.txt
@@ -1,46 +1,42 @@
cmake_minimum_required(VERSION 2.8)
project(GudhUI)
-find_package(Qt4)
+find_package(Qt5 COMPONENTS Widgets Xml OpenGL)
find_package(QGLViewer)
find_package(OpenGL)
-if ( CGAL_FOUND AND QT4_FOUND AND OPENGL_FOUND AND QGLVIEWER_FOUND )
- set( QT_USE_QTXML TRUE )
- set( QT_USE_QTMAIN TRUE )
- set( QT_USE_QTSCRIPT TRUE )
- set( QT_USE_QTOPENGL TRUE )
- SET(Boost_USE_STATIC_LIBS ON)
- SET(Boost_USE_MULTITHREAD OFF)
+if (CGAL_VERSION VERSION_EQUAL 4.8.0)
+ message(ERROR " GudhUI does not compile with CGAL 4.8.0. 4.8.1, 4.8.2 and 4.9 are OK.")
+endif()
+
+if (NOT CGAL_FOUND)
+ message(ERROR " GudhUI requires CGAL and will not be compiled.")
+endif()
+
+if (NOT Qt5_FOUND)
+ message(ERROR " GudhUI requires Qt5 and will not be compiled.")
+endif()
+
+if (NOT OPENGL_FOUND)
+ message(ERROR " GudhUI requires OpenGL and will not be compiled.")
+endif()
+
+if (NOT QGLVIEWER_FOUND)
+ message(ERROR " GudhUI requires QGLViewer and will not be compiled.")
+endif()
- include(${QT_USE_FILE})
+
+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})
- include_directories(.)
- # qt : ui file, created wih Qt Designer ###############
- set(CMAKE_CURRENT_BINARY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/gui")
- qt4_wrap_ui( uis
- gui/main_window.ui
- gui/MenuEdgeContraction.ui
- gui/KNearestNeighborsMenu.ui
- gui/UniformNeighborsMenu.ui
- gui/PersistenceMenu.ui
- )
-
- set(CMAKE_CURRENT_BINARY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/gui")
- qt4_automoc(
- gui/MainWindow.cpp
- gui/Menu_k_nearest_neighbors.cpp
- gui/Menu_uniform_neighbors.cpp
- gui/Menu_edge_contraction.cpp
- gui/Menu_persistence.cpp
- )
-
- set(CMAKE_CURRENT_BINARY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/view")
- qt4_automoc(view/Viewer_instructor.cpp
- view/Viewer.cpp
- )
#####################################################################
add_executable ( GudhUI
@@ -52,10 +48,9 @@ if ( CGAL_FOUND AND QT4_FOUND AND OPENGL_FOUND AND QGLVIEWER_FOUND )
gui/Menu_persistence.cpp
view/Viewer_instructor.cpp
view/Viewer.cpp
- ${uis}
)
-
- target_link_libraries( GudhUI ${QT_LIBRARIES} ${QGLVIEWER_LIBRARIES} )
+ 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})
@@ -64,5 +59,5 @@ endif()
###############################################################################
else()
- message(STATUS "NOTICE: GudhUI requires CGAL, the QGLViewer, OpenGL and Qt4, and will not be compiled.")
+ message(STATUS "NOTICE: GudhUI requires CGAL, the QGLViewer, OpenGL and Qt5, and will not be compiled.")
endif()
diff --git a/GudhUI/gui/MainWindow.h b/GudhUI/gui/MainWindow.h
index c8c3fcf6..15664dcb 100644
--- a/GudhUI/gui/MainWindow.h
+++ b/GudhUI/gui/MainWindow.h
@@ -23,8 +23,8 @@
#ifndef GUI_MAINWINDOW_H_
#define GUI_MAINWINDOW_H_
-// Workaround for moc-qt4 not parsing boost headers
-#include <CGAL/config.h>
+// Workaround https://svn.boost.org/trac/boost/ticket/12534
+#include <boost/container/flat_map.hpp>
#include <QMainWindow>
#include "ui_main_window.h"
diff --git a/GudhUI/gui/Menu_edge_contraction.h b/GudhUI/gui/Menu_edge_contraction.h
index 08f0bf67..2d5640e8 100644
--- a/GudhUI/gui/Menu_edge_contraction.h
+++ b/GudhUI/gui/Menu_edge_contraction.h
@@ -23,11 +23,8 @@
#ifndef GUI_MENU_EDGE_CONTRACTION_H_
#define GUI_MENU_EDGE_CONTRACTION_H_
-// Workaround for moc-qt4 not parsing boost headers
-#include <CGAL/config.h>
-
#include "gui/MainWindow.h"
-#include "gui/ui_MenuEdgeContraction.h"
+#include "ui_MenuEdgeContraction.h"
#include "model/Model.h"
diff --git a/GudhUI/gui/Menu_k_nearest_neighbors.h b/GudhUI/gui/Menu_k_nearest_neighbors.h
index 8088b768..77303b67 100644
--- a/GudhUI/gui/Menu_k_nearest_neighbors.h
+++ b/GudhUI/gui/Menu_k_nearest_neighbors.h
@@ -24,7 +24,7 @@
#define GUI_MENU_K_NEAREST_NEIGHBORS_H_
#include <QMainWindow>
-#include "gui/ui_KNearestNeighborsMenu.h"
+#include "ui_KNearestNeighborsMenu.h"
class QWidget;
diff --git a/GudhUI/gui/Menu_persistence.h b/GudhUI/gui/Menu_persistence.h
index 8c4df158..1a2a2408 100644
--- a/GudhUI/gui/Menu_persistence.h
+++ b/GudhUI/gui/Menu_persistence.h
@@ -25,7 +25,7 @@
#define GUI_MENU_PERSISTENCE_H_
#include <QMainWindow>
-#include "gui/ui_PersistenceMenu.h"
+#include "ui_PersistenceMenu.h"
class QWidget;
diff --git a/GudhUI/gui/Menu_uniform_neighbors.h b/GudhUI/gui/Menu_uniform_neighbors.h
index 0b6f65fe..61316966 100644
--- a/GudhUI/gui/Menu_uniform_neighbors.h
+++ b/GudhUI/gui/Menu_uniform_neighbors.h
@@ -25,7 +25,7 @@
#define GUI_MENU_UNIFORM_NEIGHBORS_H_
#include <QMainWindow>
-#include "gui/ui_UniformNeighborsMenu.h"
+#include "ui_UniformNeighborsMenu.h"
class Menu_uniform_neighbors : public QDialog, public Ui::UniformMenu {
Q_OBJECT
diff --git a/GudhUI/model/Model.h b/GudhUI/model/Model.h
index 1c39c0d7..fc284cc6 100644
--- a/GudhUI/model/Model.h
+++ b/GudhUI/model/Model.h
@@ -72,8 +72,8 @@ class CGAL_geometric_flag_complex_wrapper {
void maximal_face(std::vector<int> vertices) {
if (!load_only_points_) {
// std::cout << "size:" << vertices.size() << std::endl;
- for (int i = 0; i < vertices.size(); ++i)
- for (int j = i + 1; j < vertices.size(); ++j)
+ for (std::size_t i = 0; i < vertices.size(); ++i)
+ for (std::size_t j = i + 1; j < vertices.size(); ++j)
complex_.add_edge(Vertex_handle(vertices[i]), Vertex_handle(vertices[j]));
}
}
@@ -187,7 +187,7 @@ class Model {
}
void contract_edges(unsigned num_contractions) {
- Clock c;
+ Gudhi::Clock c;
Edge_contractor<Complex> contractor(complex_, num_contractions);
std::cout << "Time to simplify: " << c.num_seconds() << "s" << std::endl;
}
@@ -248,7 +248,7 @@ class Model {
unsigned num_simplices = 0;
int euler = 0;
int dimension = 0;
- Clock clock;
+ Gudhi::Clock clock;
for (const auto &s : complex_.complex_simplex_range()) {
num_simplices++;
dimension = (std::max)(s.dimension(), dimension);
@@ -271,7 +271,7 @@ class Model {
#ifdef _WIN32
std::cout << "Works only on linux x64 for the moment\n";
#else
- Clock clock;
+ Gudhi::Clock clock;
run_chomp();
clock.end();
#endif
diff --git a/GudhUI/utils/Critical_points.h b/GudhUI/utils/Critical_points.h
index 3021a5fe..2a18e079 100644
--- a/GudhUI/utils/Critical_points.h
+++ b/GudhUI/utils/Critical_points.h
@@ -106,6 +106,7 @@ template<typename SkBlComplex> class Critical_points {
return 0;
Edge_contractor<Complex> contractor(link, link.num_vertices() - 1);
+ (void)contractor;
if (link.num_connected_components() > 1)
// one than more CC -> not contractible
diff --git a/GudhUI/utils/Edge_contractor.h b/GudhUI/utils/Edge_contractor.h
index 45079a40..8a29ff4b 100644
--- a/GudhUI/utils/Edge_contractor.h
+++ b/GudhUI/utils/Edge_contractor.h
@@ -65,7 +65,7 @@ template<typename SkBlComplex> class Edge_contractor {
Placement_type operator()(const EdgeProfile& profile) const override {
std::vector<double> mid_coords(profile.p0().dimension(), 0);
- for (size_t i = 0; i < profile.p0().dimension(); ++i) {
+ for (int i = 0; i < profile.p0().dimension(); ++i) {
mid_coords[i] = (profile.p0()[i] + profile.p1()[i]) / 2.;
}
return Point(profile.p0().dimension(), mid_coords.begin(), mid_coords.end());
diff --git a/GudhUI/utils/Furthest_point_epsilon_net.h b/GudhUI/utils/Furthest_point_epsilon_net.h
index f2a216f6..98346daa 100644
--- a/GudhUI/utils/Furthest_point_epsilon_net.h
+++ b/GudhUI/utils/Furthest_point_epsilon_net.h
@@ -73,7 +73,7 @@ template<typename SkBlComplex> class Furthest_point_epsilon_net {
complex_(complex) {
if (!complex.empty()) {
init_filtration();
- for (int k = 2; k < net_filtration_.size(); ++k) {
+ for (std::size_t k = 2; k < net_filtration_.size(); ++k) {
update_radius_value(k);
}
}
diff --git a/GudhUI/utils/Is_manifold.h b/GudhUI/utils/Is_manifold.h
index 0640ea47..d0974463 100644
--- a/GudhUI/utils/Is_manifold.h
+++ b/GudhUI/utils/Is_manifold.h
@@ -77,6 +77,7 @@ template<typename SkBlComplex> class Is_manifold {
bool is_k_sphere(Vertex_handle v, int k) {
auto link = input_complex_.link(v);
Edge_contractor<Complex> contractor(link, link.num_vertices() - 1);
+ (void)contractor;
return (is_sphere_simplex(link) == k);
}
diff --git a/GudhUI/utils/Persistence_compute.h b/GudhUI/utils/Persistence_compute.h
index 97165490..2dc03c8e 100644
--- a/GudhUI/utils/Persistence_compute.h
+++ b/GudhUI/utils/Persistence_compute.h
@@ -29,6 +29,7 @@
#include <gudhi/Simplex_tree.h>
#include <gudhi/distance_functions.h>
#include <gudhi/Persistent_cohomology.h>
+#include <gudhi/Rips_complex.h>
#include <vector>
@@ -69,21 +70,23 @@ template<typename SkBlComplex> class Persistence_compute {
points.emplace_back(std::move(pt_to_add));
}
+ using Simplex_tree = Gudhi::Simplex_tree<>;
+ 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>;
- Graph_t prox_graph = compute_proximity_graph(points, params.threshold, euclidean_distance<Point_t>);
- Gudhi::Simplex_tree<> st;
- st.insert_graph(prox_graph);
- st.expansion(params.max_dim);
+ Rips_complex rips_complex(points, params.threshold, Euclidean_distance());
- Gudhi::persistent_cohomology::Persistent_cohomology< Gudhi::Simplex_tree<>,
- Gudhi::persistent_cohomology::Field_Zp > pcoh(st);
+ Simplex_tree st;
+ rips_complex.create_complex(st, params.max_dim);
+ Persistent_cohomology pcoh(st);
// initializes the coefficient field for homology
pcoh.init_coefficients(params.p);
// put params.min_pers
pcoh.compute_persistent_cohomology(params.min_pers);
stream << "persistence: \n";
stream << "p dimension birth death: \n";
-
pcoh.output_diagram(stream);
}
};
diff --git a/GudhUI/utils/Vertex_collapsor.h b/GudhUI/utils/Vertex_collapsor.h
index 2b36cb3a..568dab2f 100644
--- a/GudhUI/utils/Vertex_collapsor.h
+++ b/GudhUI/utils/Vertex_collapsor.h
@@ -81,6 +81,7 @@ template<typename SkBlComplex> class Vertex_collapsor {
if (link.is_cone()) return true;
if (link.num_connected_components() > 1) return false;
Edge_contractor<Complex> contractor(link, link.num_vertices() - 1);
+ (void)contractor;
return (link.num_vertices() == 1);
}
};
diff --git a/GudhUI/view/FirstCoordProjector.h b/GudhUI/view/FirstCoordProjector.h
index a4027b7f..1333f5d3 100644
--- a/GudhUI/view/FirstCoordProjector.h
+++ b/GudhUI/view/FirstCoordProjector.h
@@ -33,9 +33,11 @@ class FirstCoordProjector3D : public Projector3D {
Point_3 operator()(const Point& p) const {
if (p.dimension() >= 3)
- return Point_3(p.x(), p.y(), p.z());
+ return Point_3(p.x(), p.y(), p.z());
else if (p.dimension() >= 2)
- return Point_3(p.x(), p.y(), 0.0);
+ return Point_3(p.x(), p.y(), 0.0);
+ else
+ return Point_3(0.0, 0.0, 0.0);
}
};
diff --git a/GudhUI/view/Viewer.h b/GudhUI/view/Viewer.h
index 319c8e04..797ddc53 100644
--- a/GudhUI/view/Viewer.h
+++ b/GudhUI/view/Viewer.h
@@ -24,9 +24,6 @@
#ifndef VIEW_VIEWER_H_
#define VIEW_VIEWER_H_
-// Workaround for moc-qt4 not parsing boost headers
-#include <CGAL/config.h>
-
#include <QGLViewer/qglviewer.h>
#include <vector>
diff --git a/GudhUI/view/Viewer_instructor.h b/GudhUI/view/Viewer_instructor.h
index 1da28009..05c5c1fc 100644
--- a/GudhUI/view/Viewer_instructor.h
+++ b/GudhUI/view/Viewer_instructor.h
@@ -26,9 +26,6 @@
// todo do a viewer instructor that have directely a pointer to a QGLviewer and buffer ot not triangles
-// Workaround for moc-qt4 not parsing boost headers
-#include <CGAL/config.h>
-
#include <QFileDialog>
#include <QKeyEvent>
#include <QGLViewer/camera.h>
diff --git a/biblio/bibliography.bib b/biblio/bibliography.bib
index 9fc01a5d..29fc5650 100644
--- a/biblio/bibliography.bib
+++ b/biblio/bibliography.bib
@@ -25,7 +25,8 @@ year={2014},
issn={0178-4617},
journal={Algorithmica},
doi={10.1007/s00453-014-9887-3},
-title={\href{http://dx.doi.org/10.1007/s00453-014-9887-3}{The Simplex Tree: An Efficient Data Structure for General Simplicial Complexes}},
+title={The Simplex Tree: An Efficient Data Structure for General Simplicial Complexes},
+url={http://dx.doi.org/10.1007/s00453-014-9887-3},
publisher={Springer US},
keywords={Simplicial complexes; Data structure; Computational topology; Flag complexes; Witness complexes},
author={Boissonnat, Jean-Daniel and Maria, Cl\'ement},
@@ -74,8 +75,9 @@ language={English},
author = {Jean-Daniel Boissonnat and
Tamal K. Dey and
Cl{\'e}ment Maria},
- title = {\href{http://dx.doi.org/10.1007/978-3-642-40450-4_59}{The Compressed Annotation Matrix: An Efficient Data Structure
- for Computing Persistent Cohomology}},
+ title = {The Compressed Annotation Matrix: An Efficient Data Structure for Computing Persistent Cohomology},
+ url = {http://dx.doi.org/10.1007/978-3-642-40450-4_59},
+ doi = {10.1007/978-3-642-40450-4_59},
booktitle = {ESA},
year = {2013},
pages = {695-706},
@@ -93,8 +95,9 @@ language={English},
@inproceedings{DBLP:conf/esa/BoissonnatM12,
author = {Jean-Daniel Boissonnat and
Cl{\'e}ment Maria},
- title = {\href{http://dx.doi.org/10.1007/978-3-642-33090-2_63}{The Simplex Tree: An Efficient Data Structure for General
- Simplicial Complexes}},
+ title = {The Simplex Tree: An Efficient Data Structure for General Simplicial Complexes},
+ url = {http://dx.doi.org/10.1007/978-3-642-33090-2_63},
+ doi = {10.1007/978-3-642-33090-2_63},
booktitle = {ESA},
year = {2012},
pages = {731-742},
@@ -108,7 +111,7 @@ language={English},
@techreport{boissonnat:hal-00922572,
hal_id = {hal-00922572},
url = {http://hal.inria.fr/hal-00922572},
- title = {\href{http://hal.inria.fr/hal-00922572}{Computing Persistent Homology with Various Coefficient Fields in a Single Pass}},
+ title = {Computing Persistent Homology with Various Coefficient Fields in a Single Pass},
author = {Boissonnat, Jean-Daniel and Maria, Cl{\'e}ment},
abstract = {{In this article, we introduce the multi-field persistence diagram for the persistence homology of a filtered complex. It encodes compactly the superimposition of the persistence diagrams of the complex with several field coefficients, and provides a substantially more precise description of the topology of the filtered complex. Specifically, the multi-field persistence diagram encodes the Betti numbers of integral homology and the prime divisors of the torsion coefficients of the underlying shape. Moreover, it enjoys similar stability properties as the ones of standard persistence diagrams, with the appropriate notion of distance. These properties make the multi-field persistence diagram a useful tool in computational topology.}},
keywords = {Computational Topology, Persistent homology, Modular reconstruction},
@@ -176,7 +179,7 @@ language={English},
@article{RS62,
author={J. B. Rosser and L. Schoenfeld},
title={Approximate Formulas for some Functions of Prime Numbers},
- journal= ijm,
+ journal= {ijm},
volume= 6,
year= 1962,
pages={64-94},
@@ -306,6 +309,21 @@ language={English},
bibsource = {DBLP, http://dblp.uni-trier.de}
}
+%------------------------------------------------------------------
+@article{tangentialcomplex2014,
+author="Boissonnat, Jean-Daniel and Ghosh, Arijit",
+title="Manifold Reconstruction Using Tangential Delaunay Complexes",
+journal="Discrete {\&} Computational Geometry",
+year="2014",
+volume="51",
+number="1",
+pages="221--267",
+abstract="We give a provably correct algorithm to reconstruct a k-dimensional smooth manifold embedded in d-dimensional Euclidean space. The input to our algorithm is a point sample coming from an unknown manifold. Our approach is based on two main ideas: the notion of tangential Delaunay complex defined in Boissonnat and Fl{\"o}totto (Comput. Aided Des. 36:161--174, 2004), Fl{\"o}totto (A coordinate system associated to a point cloud issued from a manifold: definition, properties and applications. Ph.D. thesis, 2003), Freedman (IEEE Trans. Pattern Anal. Mach. Intell. 24(10), 2002), and the technique of sliver removal by weighting the sample points (Cheng et al. in J. ACM 47:883--904, 2000). Differently from previous methods, we do not construct any subdivision of the d-dimensional ambient space. As a result, the running time of our algorithm depends only linearly on the extrinsic dimension d while it depends quadratically on the size of the input sample, and exponentially on the intrinsic dimension k. To the best of our knowledge, this is the first certified algorithm for manifold reconstruction whose complexity depends linearly on the ambient dimension. We also prove that for a dense enough sample the output of our algorithm is isotopic to the manifold and a close geometric approximation of the manifold.",
+issn="1432-0444",
+doi="10.1007/s00454-013-9557-2",
+url="http://dx.doi.org/10.1007/s00454-013-9557-2"
+}
+
%BOOKS
%------------------------------------------------------------------
@book{DBLP:tibkat_237559129,
@@ -939,7 +957,7 @@ misc{jplex_cite,
publisher={Springer New York}
}
-@ARTICLE{peikert2012topological,
+@inbook{peikert2012topological,
year={2012},
isbn={978-3-642-23174-2},
booktitle={Topological Methods in Data Analysis and Visualization II},
@@ -954,3 +972,10 @@ pages={91-106},
language={English}
}
+@article{de2004topological,
+ title={Topological estimation using witness complexes},
+ author={De Silva, Vin and Carlsson, Gunnar},
+ journal={Proc. Sympos. Point-Based Graphics},
+ pages={157-166},
+ year={2004}
+}
diff --git a/biblio/how_to_cite_gudhi.bib b/biblio/how_to_cite_gudhi.bib
index 3c0d0b20..59c05a5b 100644
--- a/biblio/how_to_cite_gudhi.bib
+++ b/biblio/how_to_cite_gudhi.bib
@@ -33,7 +33,7 @@
, year = 2015
}
-@incollection{gudhi:Skeleton-Blocker
+@incollection{gudhi:SkeletonBlocker
, author = "David Salinas"
, title = "Skeleton-Blocker"
, publisher = "{GUDHI Editorial Board}"
@@ -42,7 +42,7 @@
, year = 2015
}
-@incollection{gudhi:Alpha complex
+@incollection{gudhi:AlphaComplex
, author = "Vincent Rouvreau"
, title = "Alpha complex"
, publisher = "{GUDHI Editorial Board}"
@@ -51,7 +51,7 @@
, year = 2015
}
-@incollection{gudhi:Cubical complex
+@incollection{gudhi:CubicalComplex
, author = "Pawel Dlotko"
, title = "Cubical complex"
, publisher = "{GUDHI Editorial Board}"
@@ -60,7 +60,7 @@
, year = 2015
}
-@incollection{gudhi:Witness complex
+@incollection{gudhi:WitnessComplex
, author = "Siargey Kachanovich"
, title = "Witness complex"
, publisher = "{GUDHI Editorial Board}"
@@ -68,3 +68,57 @@
, url = "http://gudhi.gforge.inria.fr/doc/latest/group__witness__complex.html"
, year = 2015
}
+
+@incollection{gudhi:SubSampling
+, author = "Cl\'ement Jamin, Siargey Kachanovich"
+, title = "Subsampling"
+, publisher = "{GUDHI Editorial Board}"
+, booktitle = "{GUDHI} User and Reference Manual"
+, url = "http://gudhi.gforge.inria.fr/doc/latest/group__subsampling.html"
+, year = 2016
+}
+
+@incollection{gudhi:SpatialSearching
+, author = "Cl\'ement Jamin"
+, title = "Spatial searching"
+, publisher = "{GUDHI Editorial Board}"
+, booktitle = "{GUDHI} User and Reference Manual"
+, url = "http://gudhi.gforge.inria.fr/doc/latest/group__spatial__searching.html"
+, year = 2016
+}
+
+@incollection{gudhi:TangentialComplex
+, author = "Cl\'ement Jamin"
+, title = "Tangential complex"
+, publisher = "{GUDHI Editorial Board}"
+, booktitle = "{GUDHI} User and Reference Manual"
+, url = "http://gudhi.gforge.inria.fr/doc/latest/group__tangential__complex.html"
+, year = 2016
+}
+
+@incollection{gudhi:RipsComplex
+, author = "Cl\'ement Maria, Pawel Dlotko, Vincent Rouvreau"
+, title = "Rips complex"
+, publisher = "{GUDHI Editorial Board}"
+, booktitle = "{GUDHI} User and Reference Manual"
+, url = "http://gudhi.gforge.inria.fr/doc/latest/group__rips__complex.html"
+, year = 2016
+}
+
+@incollection{gudhi:BottleneckDistance
+, author = "Fran{{\c{c}}ois Godi"
+, title = "Bottleneck distance"
+, publisher = "{GUDHI Editorial Board}"
+, booktitle = "{GUDHI} User and Reference Manual"
+, url = "http://gudhi.gforge.inria.fr/doc/latest/group__bottleneck__distance.html"
+, year = 2016
+}
+
+@incollection{gudhi:cython
+, author = "Vincent Rouvreau"
+, title = "Cython interface"
+, publisher = "{GUDHI Editorial Board}"
+, booktitle = "{GUDHI} User and Reference Manual"
+, url = "http://gudhi.gforge.inria.fr/python/latest/"
+, year = 2016
+}
diff --git a/cmake/modules/FindCython.cmake b/cmake/modules/FindCython.cmake
new file mode 100644
index 00000000..04aed1f8
--- /dev/null
+++ b/cmake/modules/FindCython.cmake
@@ -0,0 +1,44 @@
+# Find the Cython compiler.
+#
+# This code sets the following variables:
+#
+# CYTHON_EXECUTABLE
+#
+# See also UseCython.cmake
+
+#=============================================================================
+# Copyright 2011 Kitware, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#=============================================================================
+
+# Use the Cython executable that lives next to the Python executable
+# if it is a local installation.
+find_package( PythonInterp )
+if( PYTHONINTERP_FOUND )
+ get_filename_component( _python_path ${PYTHON_EXECUTABLE} PATH )
+ find_program( CYTHON_EXECUTABLE
+ NAMES cython cython.bat cython3
+ HINTS ${_python_path}
+ )
+else()
+ find_program( CYTHON_EXECUTABLE
+ NAMES cython cython.bat cython3
+ )
+endif()
+
+
+include( FindPackageHandleStandardArgs )
+FIND_PACKAGE_HANDLE_STANDARD_ARGS( Cython REQUIRED_VARS CYTHON_EXECUTABLE )
+
+mark_as_advanced( CYTHON_EXECUTABLE )
diff --git a/cmake/modules/FindGMPXX.cmake b/cmake/modules/FindGMPXX.cmake
index 277e4b19..dda302c0 100644
--- a/cmake/modules/FindGMPXX.cmake
+++ b/cmake/modules/FindGMPXX.cmake
@@ -33,6 +33,10 @@ if(GMP_FOUND)
DOC "Path to the GMPXX library"
)
+ if ( GMPXX_LIBRARIES )
+ get_filename_component(GMPXX_LIBRARIES_DIR ${GMPXX_LIBRARIES} PATH CACHE )
+ endif()
+
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(GMPXX "DEFAULT_MSG" GMPXX_LIBRARIES GMPXX_INCLUDE_DIR )
diff --git a/cmake/modules/FindQGLViewer.cmake b/cmake/modules/FindQGLViewer.cmake
index 65723d67..56c1b3cf 100644
--- a/cmake/modules/FindQGLViewer.cmake
+++ b/cmake/modules/FindQGLViewer.cmake
@@ -15,7 +15,7 @@ find_path(QGLVIEWER_INCLUDE_DIR
)
find_library(QGLVIEWER_LIBRARY_RELEASE
- NAMES qglviewer-qt4 qglviewer QGLViewer QGLViewer2
+ NAMES qglviewer-qt5 QGLViewer-qt5 qglviewer QGLViewer QGLViewer2
PATHS /usr/lib
/usr/local/lib
ENV QGLVIEWERROOT
diff --git a/cmake/modules/GUDHI_doxygen_target.txt b/cmake/modules/GUDHI_doxygen_target.cmake
index d2cb952d..d2cb952d 100644
--- a/cmake/modules/GUDHI_doxygen_target.txt
+++ b/cmake/modules/GUDHI_doxygen_target.cmake
diff --git a/cmake/modules/GUDHI_test_coverage.cmake b/cmake/modules/GUDHI_test_coverage.cmake
new file mode 100644
index 00000000..ce171a0e
--- /dev/null
+++ b/cmake/modules/GUDHI_test_coverage.cmake
@@ -0,0 +1,14 @@
+
+if (GCOVR_PATH)
+ # for gcovr to make coverage reports - Corbera Jenkins plugin
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
+endif()
+if (GPROF_PATH)
+ # for gprof to make coverage reports - Jenkins
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
+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")
+endfunction()
diff --git a/cmake/modules/GUDHI_third_party_libraries.cmake b/cmake/modules/GUDHI_third_party_libraries.cmake
new file mode 100644
index 00000000..5f84c602
--- /dev/null
+++ b/cmake/modules/GUDHI_third_party_libraries.cmake
@@ -0,0 +1,144 @@
+# This files manage third party libraries required by GUDHI
+
+find_package(Boost REQUIRED COMPONENTS system filesystem unit_test_framework chrono timer date_time program_options thread)
+
+if(NOT Boost_FOUND)
+ message(FATAL_ERROR "NOTICE: This program requires Boost and will not be compiled.")
+endif(NOT Boost_FOUND)
+
+find_package(GMP)
+if(GMP_FOUND)
+ message(STATUS "GMP_LIBRARIES = ${GMP_LIBRARIES}")
+ INCLUDE_DIRECTORIES(${GMP_INCLUDE_DIR})
+ find_package(GMPXX)
+ if(GMPXX_FOUND)
+ message(STATUS "GMPXX_LIBRARIES = ${GMPXX_LIBRARIES}")
+ INCLUDE_DIRECTORIES(${GMPXX_INCLUDE_DIR})
+ endif()
+endif()
+
+# In CMakeLists.txt, when include(${CGAL_USE_FILE}), CMAKE_CXX_FLAGS are overwritten.
+# cf. http://doc.cgal.org/latest/Manual/installation.html#title40
+# A workaround is to include(${CGAL_USE_FILE}) before adding "-std=c++11".
+# A fix would be to use https://cmake.org/cmake/help/v3.1/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.html
+# or even better https://cmake.org/cmake/help/v3.1/variable/CMAKE_CXX_STANDARD.html
+# but it implies to use cmake version 3.1 at least.
+find_package(CGAL)
+
+# Only CGAL versions > 4.4 supports what Gudhi uses from CGAL
+if (CGAL_VERSION VERSION_LESS 4.4.0)
+ message("CGAL version ${CGAL_VERSION} is considered too old to be used by Gudhi.")
+ unset(CGAL_FOUND)
+endif()
+if(CGAL_FOUND)
+ message(STATUS "CGAL version: ${CGAL_VERSION}.")
+ include( ${CGAL_USE_FILE} )
+
+ if (NOT CGAL_VERSION VERSION_LESS 4.8.0)
+ # HACK to detect CGAL version 4.8.0
+ # CGAL version 4.8, 4.8.1 and 4.8.2 are identified as version 4.8.1000)
+ # cf. https://github.com/CGAL/cgal/issues/1559
+ # Limit the HACK between CGAL versions 4.8 and 4.9 because of file read
+ if (NOT CGAL_VERSION VERSION_GREATER 4.9.0)
+ foreach(CGAL_INCLUDE_DIR ${CGAL_INCLUDE_DIRS})
+ if (EXISTS "${CGAL_INCLUDE_DIR}/CGAL/version.h")
+ FILE(READ "${CGAL_INCLUDE_DIR}/CGAL/version.h" contents)
+ STRING(REGEX REPLACE "\n" ";" contents "${contents}")
+ foreach(Line ${contents})
+ if("${Line}" STREQUAL "#define CGAL_VERSION 4.8")
+ set(CGAL_VERSION 4.8.0)
+ message (">>>>> HACK CGAL version to ${CGAL_VERSION}")
+ endif("${Line}" STREQUAL "#define CGAL_VERSION 4.8")
+ endforeach(Line ${contents})
+ endif (EXISTS "${CGAL_INCLUDE_DIR}/CGAL/version.h")
+ 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")
+ endif()
+endif()
+
+# Find TBB package for parallel sort - not mandatory, just optional.
+set(TBB_FIND_QUIETLY ON)
+find_package(TBB)
+if (TBB_FOUND)
+ include(${TBB_USE_FILE})
+ message("TBB found in ${TBB_LIBRARY_DIRS}")
+ add_definitions(-DGUDHI_USE_TBB)
+endif()
+
+set(CGAL_WITH_EIGEN3_VERSION 0.0.0)
+find_package(Eigen3 3.1.0)
+if (EIGEN3_FOUND)
+ message(STATUS "Eigen3 version: ${EIGEN3_VERSION}.")
+ include( ${EIGEN3_USE_FILE} )
+ set(CGAL_WITH_EIGEN3_VERSION ${CGAL_VERSION})
+endif (EIGEN3_FOUND)
+
+# Required programs for unitary tests purpose
+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}")
+endif()
+FIND_PROGRAM( DIFF_PATH diff )
+if (DIFF_PATH)
+ message("diff found in ${DIFF_PATH}")
+endif()
+
+# BOOST ISSUE result_of vs C++11
+add_definitions(-DBOOST_RESULT_OF_USE_DECLTYPE)
+# BOOST ISSUE with Libraries name resolution under Windows
+add_definitions(-DBOOST_ALL_NO_LIB)
+# problem with Visual Studio link on Boost program_options
+add_definitions( -DBOOST_ALL_DYN_LINK )
+
+INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
+LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})
+
+message(STATUS "boost include dirs:" ${Boost_INCLUDE_DIRS})
+message(STATUS "boost library dirs:" ${Boost_LIBRARY_DIRS})
+
+macro( find_the_lib placeholder THE_LIBS )
+ set (THE_LIB_WE_FOUND "NO")
+ foreach(THE_LIB ${THE_LIBS})
+ if(EXISTS ${THE_LIB})
+ get_filename_component(THE_LIB_WE ${THE_LIB} NAME_WE)
+ if (NOT THE_LIB_WE_FOUND)
+ set (THE_LIB_WE_FOUND "YES")
+ set(returnValue "${THE_LIB_WE}")
+ endif(NOT THE_LIB_WE_FOUND)
+ endif(EXISTS ${THE_LIB})
+ endforeach(THE_LIB ${THE_LIBS})
+endmacro( find_the_lib )
+
+# Find the correct Python interpreter.
+# Can be set with -DPYTHON_EXECUTABLE=/usr/bin/python3 or -DPython_ADDITIONAL_VERSIONS=3 for instance.
+find_package(Cython)
+
+if(NOT GUDHI_CYTHON_PATH)
+ message(FATAL_ERROR "ERROR: GUDHI_CYTHON_PATH is not valid.")
+endif(NOT GUDHI_CYTHON_PATH)
+
+if(PYTHONINTERP_FOUND AND CYTHON_FOUND)
+ # Unitary tests are available through py.test
+ find_program( PYTEST_PATH py.test )
+ # Default found version 2
+ if(PYTHON_VERSION_MAJOR EQUAL 2)
+ # Documentation generation is available through sphinx
+ find_program( SPHINX_PATH sphinx-build )
+ elseif(PYTHON_VERSION_MAJOR EQUAL 3)
+ # Documentation generation is available through sphinx
+ set(SPHINX_PATH "${CMAKE_SOURCE_DIR}/${GUDHI_CYTHON_PATH}/doc/python3-sphinx-build")
+ else()
+ message(FATAL_ERROR "ERROR: Try to compile the Cython interface. Python version ${PYTHON_VERSION_STRING} is not valid.")
+ endif(PYTHON_VERSION_MAJOR EQUAL 2)
+endif(PYTHONINTERP_FOUND AND CYTHON_FOUND)
+
diff --git a/cmake/modules/GUDHI_user_version_target.txt b/cmake/modules/GUDHI_user_version_target.txt
index 805f0a83..ca6bcd34 100644
--- a/cmake/modules/GUDHI_user_version_target.txt
+++ b/cmake/modules/GUDHI_user_version_target.txt
@@ -1,8 +1,6 @@
# Some functionnalities requires CMake 2.8.11 minimum
if (NOT CMAKE_VERSION VERSION_LESS 2.8.11)
- string(TIMESTAMP DATE_AND_TIME "%Y-%m-%d-%H-%M-%S")
-
# Definition of the custom target user_version
add_custom_target(user_version)
@@ -11,6 +9,7 @@ if (NOT CMAKE_VERSION VERSION_LESS 2.8.11)
set(GUDHI_USER_VERSION_DIR ${CMAKE_CURRENT_BINARY_DIR}/${USER_VERSION_DIR})
else()
# set the GUDHI_USER_VERSION_DIR with timestamp and Gudhi version number
+ string(TIMESTAMP DATE_AND_TIME "%Y-%m-%d-%H-%M-%S")
set(GUDHI_USER_VERSION_DIR ${CMAKE_CURRENT_BINARY_DIR}/${DATE_AND_TIME}_GUDHI_${GUDHI_VERSION})
endif()
@@ -21,6 +20,8 @@ if (NOT CMAKE_VERSION VERSION_LESS 2.8.11)
COMMENT "user_version creation in ${GUDHI_USER_VERSION_DIR}")
add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
+ copy ${CMAKE_SOURCE_DIR}/Conventions.txt ${GUDHI_USER_VERSION_DIR}/Conventions.txt)
+ add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
copy ${CMAKE_SOURCE_DIR}/README ${GUDHI_USER_VERSION_DIR}/README)
add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
copy ${CMAKE_SOURCE_DIR}/COPYING ${GUDHI_USER_VERSION_DIR}/COPYING)
@@ -34,82 +35,57 @@ if (NOT CMAKE_VERSION VERSION_LESS 2.8.11)
copy ${CMAKE_SOURCE_DIR}/src/GUDHIConfig.cmake.in ${GUDHI_USER_VERSION_DIR}/GUDHIConfig.cmake.in)
add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
copy ${CMAKE_SOURCE_DIR}/CMakeGUDHIVersion.txt ${GUDHI_USER_VERSION_DIR}/CMakeGUDHIVersion.txt)
- add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
- copy ${CMAKE_SOURCE_DIR}/GUDHIVersion.cmake.in ${GUDHI_USER_VERSION_DIR}/GUDHIVersion.cmake.in)
add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
copy_directory ${CMAKE_SOURCE_DIR}/biblio ${GUDHI_USER_VERSION_DIR}/biblio)
add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
+ copy_directory ${CMAKE_SOURCE_DIR}/src/cython ${GUDHI_USER_VERSION_DIR}/cython)
+ add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
copy_directory ${CMAKE_SOURCE_DIR}/data ${GUDHI_USER_VERSION_DIR}/data)
add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
copy_directory ${CMAKE_SOURCE_DIR}/src/cmake ${GUDHI_USER_VERSION_DIR}/cmake)
add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
- copy_directory ${CMAKE_SOURCE_DIR}/src/debian ${GUDHI_USER_VERSION_DIR}/debian)
- add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
copy_directory ${CMAKE_SOURCE_DIR}/src/GudhUI ${GUDHI_USER_VERSION_DIR}/GudhUI)
- set(GUDHI_MODULES "common;Alpha_complex;Bitmap_cubical_complex;Contraction;Hasse_complex;Persistent_cohomology;Simplex_tree;Skeleton_blocker;Witness_complex")
-
+ set(GUDHI_MODULES "common;Alpha_complex;Bitmap_cubical_complex;Bottleneck_distance;Contraction;Hasse_complex;Persistent_cohomology;Rips_complex;Simplex_tree;Skeleton_blocker;Spatial_searching;Subsampling;Tangential_complex;Witness_complex")
+ set(GUDHI_DIRECTORIES "doc;example;concept")
+ set(GUDHI_INCLUDE_DIRECTORIES "include/gudhi;include/gudhi_patches")
+
foreach(GUDHI_MODULE ${GUDHI_MODULES})
- # doc files
- file(GLOB GUDHI_DOC_FILES ${CMAKE_SOURCE_DIR}/src/${GUDHI_MODULE}/doc/*)
-
- foreach(GUDHI_DOC_FILE ${GUDHI_DOC_FILES})
- get_filename_component(GUDHI_DOC_FILE_NAME ${GUDHI_DOC_FILE} NAME)
- # GUDHI_DOC_FILE can be a file or a directory
- if(IS_DIRECTORY ${GUDHI_DOC_FILE})
- add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
- copy_directory ${GUDHI_DOC_FILE} ${GUDHI_USER_VERSION_DIR}/doc/${GUDHI_MODULE}/${GUDHI_DOC_FILE_NAME})
- else()
- add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
- copy ${GUDHI_DOC_FILE} ${GUDHI_USER_VERSION_DIR}/doc/${GUDHI_MODULE}/${GUDHI_DOC_FILE_NAME})
- endif()
- endforeach()
-
- # example files
- file(GLOB GUDHI_EXAMPLE_FILES ${CMAKE_SOURCE_DIR}/src/${GUDHI_MODULE}/example/*)
-
- foreach(GUDHI_EXAMPLE_FILE ${GUDHI_EXAMPLE_FILES})
- get_filename_component(GUDHI_EXAMPLE_FILE_NAME ${GUDHI_EXAMPLE_FILE} NAME)
- # GUDHI_EXAMPLE_FILE can be a file or a directory
- if(IS_DIRECTORY ${GUDHI_EXAMPLE_FILE})
- add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
- copy_directory ${GUDHI_EXAMPLE_FILE} ${GUDHI_USER_VERSION_DIR}/example/${GUDHI_MODULE}/${GUDHI_EXAMPLE_FILE_NAME})
- else()
- add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
- copy ${GUDHI_EXAMPLE_FILE} ${GUDHI_USER_VERSION_DIR}/example/${GUDHI_MODULE}/${GUDHI_EXAMPLE_FILE_NAME})
- endif()
- endforeach()
-
- # include files
- file(GLOB GUDHI_INCLUDE_FILES ${CMAKE_SOURCE_DIR}/src/${GUDHI_MODULE}/include/gudhi/*)
-
- foreach(GUDHI_INCLUDE_FILE ${GUDHI_INCLUDE_FILES})
- get_filename_component(GUDHI_INCLUDE_FILE_NAME ${GUDHI_INCLUDE_FILE} NAME)
- # GUDHI_INCLUDE_FILE can be a file or a directory
- if(IS_DIRECTORY ${GUDHI_INCLUDE_FILE})
- add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
- copy_directory ${GUDHI_INCLUDE_FILE} ${GUDHI_USER_VERSION_DIR}/include/gudhi/${GUDHI_INCLUDE_FILE_NAME})
- else()
- add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
- copy ${GUDHI_INCLUDE_FILE} ${GUDHI_USER_VERSION_DIR}/include/gudhi/${GUDHI_INCLUDE_FILE_NAME})
- endif()
- endforeach()
-
- # concept files
- file(GLOB GUDHI_CONCEPT_FILES ${CMAKE_SOURCE_DIR}/src/${GUDHI_MODULE}/concept/*.h)
-
- foreach(GUDHI_CONCEPT_FILE ${GUDHI_CONCEPT_FILES})
- get_filename_component(GUDHI_CONCEPT_FILE_NAME ${GUDHI_CONCEPT_FILE} NAME)
- # GUDHI_CONCEPT_FILE can be a file or a directory
- if(IS_DIRECTORY ${GUDHI_CONCEPT_FILE})
- add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
- copy_directory ${GUDHI_CONCEPT_FILE} ${GUDHI_USER_VERSION_DIR}/concept/${GUDHI_MODULE}/${GUDHI_CONCEPT_FILE_NAME})
- else()
- add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
- copy ${GUDHI_CONCEPT_FILE} ${GUDHI_USER_VERSION_DIR}/concept/${GUDHI_MODULE}/${GUDHI_CONCEPT_FILE_NAME})
- endif()
- endforeach()
- endforeach()
+ foreach(GUDHI_DIRECTORY ${GUDHI_DIRECTORIES})
+ # Find files
+ file(GLOB GUDHI_FILES ${CMAKE_SOURCE_DIR}/src/${GUDHI_MODULE}/${GUDHI_DIRECTORY}/*)
+
+ foreach(GUDHI_FILE ${GUDHI_FILES})
+ get_filename_component(GUDHI_FILE_NAME ${GUDHI_FILE} NAME)
+ # GUDHI_FILE can be a file or a directory
+ if(IS_DIRECTORY ${GUDHI_FILE})
+ add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
+ copy_directory ${GUDHI_FILE} ${GUDHI_USER_VERSION_DIR}/${GUDHI_DIRECTORY}/${GUDHI_MODULE}/${GUDHI_FILE_NAME})
+ else()
+ add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
+ copy ${GUDHI_FILE} ${GUDHI_USER_VERSION_DIR}/${GUDHI_DIRECTORY}/${GUDHI_MODULE}/${GUDHI_FILE_NAME})
+ endif()
+ endforeach()
+ endforeach(GUDHI_DIRECTORY ${GUDHI_DIRECTORIES})
+
+ foreach(GUDHI_INCLUDE_DIRECTORY ${GUDHI_INCLUDE_DIRECTORIES})
+ # include files
+ file(GLOB GUDHI_INCLUDE_FILES ${CMAKE_SOURCE_DIR}/src/${GUDHI_MODULE}/${GUDHI_INCLUDE_DIRECTORY}/*)
+
+ foreach(GUDHI_INCLUDE_FILE ${GUDHI_INCLUDE_FILES})
+ get_filename_component(GUDHI_INCLUDE_FILE_NAME ${GUDHI_INCLUDE_FILE} NAME)
+ # GUDHI_INCLUDE_FILE can be a file or a directory
+ if(IS_DIRECTORY ${GUDHI_INCLUDE_FILE})
+ add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
+ copy_directory ${GUDHI_INCLUDE_FILE} ${GUDHI_USER_VERSION_DIR}/${GUDHI_INCLUDE_DIRECTORY}/${GUDHI_INCLUDE_FILE_NAME})
+ else()
+ add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
+ copy ${GUDHI_INCLUDE_FILE} ${GUDHI_USER_VERSION_DIR}/${GUDHI_INCLUDE_DIRECTORY}/${GUDHI_INCLUDE_FILE_NAME})
+ endif()
+ endforeach()
+ endforeach(GUDHI_INCLUDE_DIRECTORY ${GUDHI_INCLUDE_DIRECTORIES})
+
+ endforeach(GUDHI_MODULE ${GUDHI_MODULES})
endif()
diff --git a/concept/Alpha_complex/SimplicialComplexForAlpha.h b/concept/Alpha_complex/SimplicialComplexForAlpha.h
new file mode 100644
index 00000000..2b8bff94
--- /dev/null
+++ b/concept/Alpha_complex/SimplicialComplexForAlpha.h
@@ -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): Vincent Rouvreau
+ *
+ * Copyright (C) 2016 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 CONCEPT_ALPHA_COMPLEX_SIMPLICIAL_COMPLEX_FOR_ALPHA_H_
+#define CONCEPT_ALPHA_COMPLEX_SIMPLICIAL_COMPLEX_FOR_ALPHA_H_
+
+namespace Gudhi {
+
+namespace alpha_complex {
+
+/** \brief The concept SimplicialComplexForAlpha describes the requirements for a type to implement a simplicial
+ * complex, that can be created from a `Alpha_complex`.
+ */
+struct SimplicialComplexForAlpha {
+ /** Handle to specify a simplex. */
+ typedef unspecified Simplex_handle;
+ /** Handle to specify a vertex. Must be a non-negative integer. */
+ typedef unspecified Vertex_handle;
+ /** Handle to specify the simplex filtration value. */
+ typedef unspecified Filtration_value;
+
+ /** Returns the number of vertices in the simplicial complex. */
+ std::size_t num_vertices();
+
+ /** Sets the simplicial complex dimension. */
+ void set_dimension(int dimension);
+
+ /** Gets the 'simplex' dimension. */
+ int dimension(Simplex_handle simplex);
+
+ /** Assigns the 'simplex' with the given 'filtration' value. */
+ int assign_filtration(Simplex_handle simplex, Filtration_value filtration);
+
+ /** \brief Inserts a simplex with vertices from a given simplex (represented by a vector of Vertex_handle) in the
+ * simplicial complex with the given 'filtration' value. */
+ void insert_simplex_and_subfaces(std::vector<Vertex_handle> const & vertex_range, Filtration_value filtration);
+
+ /** Browses the simplicial complex to make the filtration non-decreasing. */
+ void make_filtration_non_decreasing();
+
+ /** Prune the simplicial complex above 'filtration' value given as parameter. */
+ void prune_above_filtration(Filtration_value filtration);
+
+ /** \brief Iterator over vertices of a simplex.
+ *
+ * 'value type' must be 'Vertex_handle'.*/
+ typedef unspecified Simplex_vertex_range;
+
+ /** \brief Returns a range over vertices of a given
+ * simplex. */
+ Simplex_vertex_range simplex_vertex_range(Simplex_handle const & simplex);
+
+ /** \brief Iterator over the boundaries of the complex, in an arbitrary order.
+ *
+ * 'value_type' must be 'Simplex_handle'.*/
+ typedef unspecified Boundary_simplex_range;
+
+ /** \brief Returns a range over boundaries of a given simplex. */
+ Boundary_simplex_range boundary_simplex_range(Simplex_handle const & simplex);
+
+ /** \brief Return type of an insertion of a simplex
+ */
+ typedef unspecified Insertion_result_type;
+};
+
+} // namespace alpha_complex
+
+} // namespace Gudhi
+
+#endif // CONCEPT_ALPHA_COMPLEX_SIMPLICIAL_COMPLEX_FOR_ALPHA_H_
diff --git a/concept/Bottleneck_distance/Persistence_diagram.h b/concept/Bottleneck_distance/Persistence_diagram.h
new file mode 100644
index 00000000..b157f22a
--- /dev/null
+++ b/concept/Bottleneck_distance/Persistence_diagram.h
@@ -0,0 +1,50 @@
+/* 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: François Godi
+ *
+ * Copyright (C) 2015 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 CONCEPT_BOTTLENECK_DISTANCE_PERSISTENCE_DIAGRAM_H_
+#define CONCEPT_BOTTLENECK_DISTANCE_PERSISTENCE_DIAGRAM_H_
+
+namespace Gudhi {
+
+namespace persistence_diagram {
+
+/** \brief Concept of point in a persistence diagram. std::get<0>(point) must return the birth of the corresponding component and std::get<1>(point) its death.
+ * Both should be convertible to `double`.
+ * A valid implementation of this concept is std::pair<double,double>.
+ * Death should be larger than birth, death can be std::numeric_limits<double>::infinity() for components which stay alive.
+ *
+ * \ingroup bottleneck_distance
+ */
+struct DiagramPoint{};
+
+/** \brief Concept of persistence diagram. It is a range of `DiagramPoint`.
+ * std::begin(diagram) and std::end(diagram) must return corresponding iterators.
+ *
+ * \ingroup bottleneck_distance
+ */
+struct PersistenceDiagram{};
+
+} // namespace persistence_diagram
+
+} // namespace Gudhi
+
+#endif // CONCEPT_BOTTLENECK_DISTANCE_PERSISTENCE_DIAGRAM_H_
diff --git a/concept/Rips_complex/SimplicialComplexForRips.h b/concept/Rips_complex/SimplicialComplexForRips.h
new file mode 100644
index 00000000..7dab0615
--- /dev/null
+++ b/concept/Rips_complex/SimplicialComplexForRips.h
@@ -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): Vincent Rouvreau
+ *
+ * Copyright (C) 2016 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 CONCEPT_RIPS_COMPLEX_SIMPLICIAL_COMPLEX_FOR_RIPS_H_
+#define CONCEPT_RIPS_COMPLEX_SIMPLICIAL_COMPLEX_FOR_RIPS_H_
+
+namespace Gudhi {
+
+namespace rips_complex {
+
+/** \brief The concept SimplicialComplexForRips describes the requirements for a type to implement a simplicial
+ * complex, that can be created from a `Rips_complex`. The only available model for the moment is the `Simplex_tree`.
+ */
+struct SimplicialComplexForRips {
+ /** \brief Type used to store the filtration values of the simplicial complex. */
+ typedef unspecified Filtration_value;
+
+ /** \brief Inserts a given `Gudhi::rips_complex::Rips_complex::OneSkeletonGraph` in the simplicial complex. */
+ template<class OneSkeletonGraph>
+ void insert_graph(const OneSkeletonGraph& skel_graph);
+
+ /** \brief Expands the simplicial complex containing only its one skeleton until a given maximal dimension as
+ * explained in \ref ripsdefinition. */
+ void expansion(int max_dim);
+
+ /** \brief Returns the number of vertices in the simplicial complex. */
+ std::size_t num_vertices();
+
+};
+
+} // namespace rips_complex
+
+} // namespace Gudhi
+
+#endif // CONCEPT_RIPS_COMPLEX_SIMPLICIAL_COMPLEX_FOR_RIPS_H_
diff --git a/concept/Skeleton_blocker/SkeletonBlockerDS.h b/concept/Skeleton_blocker/SkeletonBlockerDS.h
index 3c650f99..d82425a0 100644
--- a/concept/Skeleton_blocker/SkeletonBlockerDS.h
+++ b/concept/Skeleton_blocker/SkeletonBlockerDS.h
@@ -1,128 +1,129 @@
-/*
- * SkeletonBlockerDS.h
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
*
- * Created on: Feb 20, 2014
- * Author: David Salinas
- * Copyright 2013 INRIA. All rights reserved
+ * Author(s): David Salinas
+ *
+ * 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/>.
*/
-#ifndef GUDHI_SKELETONBLOCKERDS_H_
-#define GUDHI_SKELETONBLOCKERDS_H_
-
+#ifndef CONCEPT_SKELETON_BLOCKER_SKELETONBLOCKERDS_H_
+#define CONCEPT_SKELETON_BLOCKER_SKELETONBLOCKERDS_H_
namespace Gudhi {
namespace skeleton_blocker {
-
-
/** \brief Concept for the template class passed for Skeleton_blocker_complex.
* Most importantly, it contains the nodes for vertices and edges
* (Graph_vertex and Graph_edge) that are stored in the simplicial
* complex. The user can redefine these classes to attach
* additional information to vertices and edges.
*/
-struct SkeletonBlockerDS
-{
- /**
- * @brief index that allows to find the vertex in the boost graph
- */
- typedef int boost_vertex_handle;
-
-
- /**
- * @brief Root_vertex_handle and Vertex_handle are similar to global and local vertex descriptor
- * used in <a href="http://www.boost.org/doc/libs/1_38_0/libs/graph/doc/subgraph.html">boost subgraphs</a>
- * and allow to localize a vertex of a subcomplex on its parent root complex.
- *
- * In gross, vertices are stored in a vector
- * and the Root_vertex_handle and Vertex_handle store indices of a vertex in this vector.
- *
- * For the root simplicial complex, the Root_vertex_handle and Vertex_handle of a vertex
- * are the same.
- *
- *
- * For a subcomplex L of a simplicial complex K, the local descriptor, ie the Vertex_handle, of a
- * vertex v (that belongs to L) is its position in the vector of vertices
- * of the subcomplex L whereas its Root_vertex_handle (global descriptor) is the position of v in the vector of the
- * vertices of the root simplicial complex K.
- */
- struct Root_vertex_handle{
-
- boost_vertex_handle vertex;
-
- friend ostream& operator << (ostream& o, const Root_vertex_handle & v);
- };
-
- /**
- * A Vertex_handle must be Default Constructible, Assignable and Equality Comparable.
- */
- struct Vertex_handle{
- boost_vertex_handle vertex;
-
- friend ostream& operator << (ostream& o, const Vertex_handle & v);
- };
-
-
- /**
- * \brief The type of vertices that are stored the boost graph.
- * A Vertex must be Default Constructible and Equality Comparable.
- *
- */
- struct Graph_vertex{
- /** \brief Used to deactivate a vertex for example when contracting an edge.
- * It allows in some cases to remove the vertex at low cost.
- */
- void deactivate();
-
- /** \brief Used to activate a vertex.
- */
- void activate();
-
- /** \brief Tells if the vertex is active.
- */
- bool is_active() const;
-
- void set_id(Root_vertex_handle i);
- Root_vertex_handle get_id() const;
- virtual string to_string() const ;
- friend ostream& operator << (ostream& o, const Graph_vertex & v);
- };
-
-
- /**
- * \brief The type of edges that are stored the boost graph.
- * An Edge must be Default Constructible and Equality Comparable.
- */
- struct Graph_edge{
- /**
- * @brief Allows to modify vertices of the edge.
- */
- void setId(Root_vertex_handle a,Root_vertex_handle b);
-
- /**
- * @brief Returns the first vertex of the edge.
- */
- Root_vertex_handle first() const ;
-
- /**
- * @brief Returns the second vertex of the edge.
- */
- Root_vertex_handle second() const ;
-
- friend ostream& operator << (ostream& o, const Simple_edge & v);
- };
-
-
+struct SkeletonBlockerDS {
+ /**
+ * @brief index that allows to find the vertex in the boost graph
+ */
+ typedef int boost_vertex_handle;
+
+ /**
+ * @brief Root_vertex_handle and Vertex_handle are similar to global and local vertex descriptor
+ * used in <a href="http://www.boost.org/doc/libs/1_38_0/libs/graph/doc/subgraph.html">boost subgraphs</a>
+ * and allow to localize a vertex of a subcomplex on its parent root complex.
+ *
+ * In gross, vertices are stored in a vector
+ * and the Root_vertex_handle and Vertex_handle store indices of a vertex in this vector.
+ *
+ * For the root simplicial complex, the Root_vertex_handle and Vertex_handle of a vertex
+ * are the same.
+ *
+ *
+ * For a subcomplex L of a simplicial complex K, the local descriptor, ie the Vertex_handle, of a
+ * vertex v (that belongs to L) is its position in the vector of vertices
+ * of the subcomplex L whereas its Root_vertex_handle (global descriptor) is the position of v in the vector of the
+ * vertices of the root simplicial complex K.
+ */
+ struct Root_vertex_handle {
+ boost_vertex_handle vertex;
+
+ friend ostream& operator<<(ostream& o, const Root_vertex_handle & v);
+ };
+
+ /**
+ * A Vertex_handle must be Default Constructible, Assignable and Equality Comparable.
+ */
+ struct Vertex_handle {
+ boost_vertex_handle vertex;
+
+ friend ostream& operator<<(ostream& o, const Vertex_handle & v);
+ };
+
+ /**
+ * \brief The type of vertices that are stored the boost graph.
+ * A Vertex must be Default Constructible and Equality Comparable.
+ *
+ */
+ struct Graph_vertex {
+ /** \brief Used to deactivate a vertex for example when contracting an edge.
+ * It allows in some cases to remove the vertex at low cost.
+ */
+ void deactivate();
+
+ /** \brief Used to activate a vertex.
+ */
+ void activate();
+
+ /** \brief Tells if the vertex is active.
+ */
+ bool is_active() const;
+
+ void set_id(Root_vertex_handle i);
+ Root_vertex_handle get_id() const;
+ virtual string to_string() const;
+ friend ostream& operator<<(ostream& o, const Graph_vertex & v);
+ };
+
+ /**
+ * \brief The type of edges that are stored the boost graph.
+ * An Edge must be Default Constructible and Equality Comparable.
+ */
+ struct Graph_edge {
+ /**
+ * @brief Allows to modify vertices of the edge.
+ */
+ void setId(Root_vertex_handle a, Root_vertex_handle b);
+
+ /**
+ * @brief Returns the first vertex of the edge.
+ */
+ Root_vertex_handle first() const;
+
+ /**
+ * @brief Returns the second vertex of the edge.
+ */
+ Root_vertex_handle second() const;
+
+ friend ostream& operator<<(ostream& o, const Simple_edge & v);
+ };
};
-
-
} // namespace skeleton_blocker
namespace skbl = skeleton_blocker;
} // namespace Gudhi
-
-#endif /* GUDHI_SKELETONBLOCKERDS_H_ */
+#endif // CONCEPT_SKELETON_BLOCKER_SKELETONBLOCKERDS_H_
diff --git a/concept/Skeleton_blocker/SkeletonBlockerGeometricDS.h b/concept/Skeleton_blocker/SkeletonBlockerGeometricDS.h
index c5d52800..477464c4 100644
--- a/concept/Skeleton_blocker/SkeletonBlockerGeometricDS.h
+++ b/concept/Skeleton_blocker/SkeletonBlockerGeometricDS.h
@@ -1,13 +1,27 @@
-/*
- * SkeletonBlockerGeometricDS.h
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
*
- * Created on: Feb 20, 2014
- * Author: David Salinas
- * Copyright 2013 INRIA. All rights reserved
+ * Author(s): David Salinas
+ *
+ * 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/>.
*/
-#ifndef GUDHI_SKELETONBLOCKERGEOMETRICDS_H_
-#define GUDHI_SKELETONBLOCKERGEOMETRICDS_H_
+#ifndef CONCEPT_SKELETON_BLOCKER_SKELETONBLOCKERGEOMETRICDS_H_
+#define CONCEPT_SKELETON_BLOCKER_SKELETONBLOCKERGEOMETRICDS_H_
namespace Gudhi {
namespace skeleton_blocker {
@@ -20,52 +34,51 @@ namespace skeleton_blocker {
* Graph_edge must specify how to access to an index.
*
*/
- //todo the index is just for contraction, to remove
-template<typename GeometryTrait>
-struct SkeletonBlockerGeometricDS : public SkeletonBlockerDS
-{
+// TODO(DS): the index is just for contraction, to remove
- /**
- * Geometry information.
- */
- typedef GeometryTrait GT ;
+template<typename GeometryTrait>
+struct SkeletonBlockerGeometricDS : public SkeletonBlockerDS {
+ /**
+ * Geometry information.
+ */
+ typedef GeometryTrait GT;
- /**
- * Type of point (should be the same as GT::Point).
- */
- typedef typename GeometryTrait::Point Point;
+ /**
+ * Type of point (should be the same as GT::Point).
+ */
+ typedef typename GeometryTrait::Point Point;
- /**
- * @brief Vertex that stores a point.
- */
- class Graph_vertex : public SkeletonBlockerDS::Graph_vertex{
- public:
- /**
- * @brief Access to the point.
- */
- Point& point();
- /**
- * @brief Access to the point.
- */
- const Point& point();
- };
+ /**
+ * @brief Vertex that stores a point.
+ */
+ class Graph_vertex : public SkeletonBlockerDS::Graph_vertex {
+ public:
+ /**
+ * @brief Access to the point.
+ */
+ Point& point();
+ /**
+ * @brief Access to the point.
+ */
+ const Point& point();
+ };
- /**
- * @brief Edge that allows to access to an index.
- * The indices of the edges are used to store heap information
- * in the edge contraction algorithm.
- */
- class Graph_Edge : public SkeletonBlockerDS::Graph_edge{
- public:
- /**
- * @brief Access to the index.
- */
- int& index();
- /**
- * @brief Access to the index.
- */
- int index();
- };
+ /**
+ * @brief Edge that allows to access to an index.
+ * The indices of the edges are used to store heap information
+ * in the edge contraction algorithm.
+ */
+ class Graph_Edge : public SkeletonBlockerDS::Graph_edge {
+ public:
+ /**
+ * @brief Access to the index.
+ */
+ int& index();
+ /**
+ * @brief Access to the index.
+ */
+ int index();
+ };
};
} // namespace skeleton_blocker
@@ -74,4 +87,4 @@ namespace skbl = skeleton_blocker;
} // namespace Gudhi
-#endif /* GUDHI_SKELETONBLOCKERGEOMETRICDS_H_ */
+#endif // CONCEPT_SKELETON_BLOCKER_SKELETONBLOCKERGEOMETRICDS_H_
diff --git a/concept/Witness_complex/Simplicial_complex_for_witness.h b/concept/Witness_complex/SimplicialComplexForWitness.h
index caaf0db6..d78cc83f 100644
--- a/concept/Witness_complex/Simplicial_complex_for_witness.h
+++ b/concept/Witness_complex/SimplicialComplexForWitness.h
@@ -27,57 +27,70 @@ namespace Gudhi {
namespace witness_complex {
-/** \brief The concept Simplicial_Complex describes the requirements
+/** \brief The concept SimplicialComplexForWitness describes the requirements
* for a type to implement a simplicial complex,
- * used for example to build a 'Witness_complex'.
+ * used for example to build a Witness_complex or Strong_witness_complex.
*/
struct SimplicialComplexForWitness {
/** Handle to specify a simplex. */
typedef unspecified Simplex_handle;
- /** Handle to specify a vertex. Must be a non-negative integer. */
- typedef unspecified Vertex_handle;
+ // /** Handle to specify a vertex. Must be a non-negative integer. */
+ // typedef unspecified Vertex_handle;
- /** Returns a Simplex_hanlde that is different from all simplex handles
+ /** \brief Returns a Simplex_hanlde that is different from all simplex handles
* of the simplices. */
Simplex_handle null_simplex();
- /** \brief Iterator over the simplices of the complex,
- * in an arbitrary order.
- *
- * 'value_type' must be 'Simplex_handle'.*/
- typedef unspecified Complex_simplex_range;
-
- /**
- * \brief Returns a range over all the simplices of a
- * complex.
+ /** Returns the number of vertices in the simplicial complex
*/
- Complex_simplex_range complex_simplex_range();
-
- /** \brief Iterator over vertices of a simplex.
- *
- * 'value type' must be 'Vertex_handle'.*/
- typedef unspecified Simplex_vertex_range;
-
- /** \brief Returns a range over vertices of a given
- * simplex. */
- Simplex_vertex_range simplex_vertex_range(Simplex_handle const & simplex);
-
+ std::size_t num_vertices();
+
/** \brief Return type of an insertion of a simplex
*/
typedef unspecified Insertion_result_type;
/** \brief Inserts a simplex with vertices from a given range
* 'vertex_range' in the simplicial complex.
+ * The function is only used in Witness_complex class
+ * and by construction, it is not necessary to check if
+ * the faces are in the simplicial complex before insertion.
+ * The simplex is given the filtration value 'filtration'.
+ * Filtration_value should be convertible from double.
+ * The return type is not used.
* */
template< typedef Input_vertex_range >
- Insertion_result_type insert_simplex(Input_vertex_range const & vertex_range);
+ Insertion_result_type insert_simplex(Input_vertex_range const & vertex_range, Filtration_value filtration);
+ /** \brief Inserts a simplex and all its faces
+ * with vertices from a given range
+ * 'vertex_range' in the simplicial complex.
+ * The function is only used in Strong_witness_complex class.
+ * All inserted simplices are given the filtration
+ * value 'filtration'.
+ * Filtration_value should be convertible from double.
+ * The return type is not used.
+ */
+
+ template< typedef Input_vertex_range,
+ typedef Filtration_value>
+ Insertion_result_type insert_simplex_and_subfaces(Input_vertex_range const & vertex_range, Filtration_value filtration);
+
/** \brief Finds a simplex with vertices given by a range
*
* If a simplex exists, its Simplex_handle is returned.
* Otherwise null_simplex() is returned. */
template< typedef Input_vertex_range >
Simplex_handle find(Input_vertex_range const & vertex_range);
+
+ /** \brief Sets the dimension of the simplicial complex to
+ * 'dimension'.
+ */
+ void set_dimension(int dimension);
+
+ /** \brief Returns the filtration of the simplex given by
+ * the simplex handle 'sh'.
+ */
+ double filtration(Simplex_handle sh);
};
} // namespace witness_complex
diff --git a/cython/CMakeLists.txt b/cython/CMakeLists.txt
new file mode 100644
index 00000000..96c2acb3
--- /dev/null
+++ b/cython/CMakeLists.txt
@@ -0,0 +1,284 @@
+cmake_minimum_required(VERSION 2.8)
+project(Cython)
+
+if(CYTHON_FOUND)
+ message("++ ${PYTHON_EXECUTABLE} v.${PYTHON_VERSION_STRING} - Cython is ${CYTHON_EXECUTABLE} - py.test is ${PYTEST_PATH} - Sphinx is ${SPHINX_PATH}")
+
+ set(GUDHI_CYTHON_EXTRA_COMPILE_ARGS "${GUDHI_CYTHON_EXTRA_COMPILE_ARGS}'-DBOOST_RESULT_OF_USE_DECLTYPE', ")
+ set(GUDHI_CYTHON_EXTRA_COMPILE_ARGS "${GUDHI_CYTHON_EXTRA_COMPILE_ARGS}'-DBOOST_ALL_NO_LIB', ")
+ set(GUDHI_CYTHON_LIBRARY_DIRS "${GUDHI_CYTHON_LIBRARY_DIRS}'${Boost_LIBRARY_DIRS}', ")
+ if(WIN32)
+ set( returnValue "" )
+ find_the_lib (${returnValue} ${Boost_SYSTEM_LIBRARY})
+ set(BOOST_SYSTEM_LIB_NAME ${returnValue})
+ else()
+ set(BOOST_SYSTEM_LIB_NAME "boost_system")
+ endif()
+ set(GUDHI_CYTHON_LIBRARIES "${GUDHI_CYTHON_LIBRARIES}'${BOOST_SYSTEM_LIB_NAME}', ")
+
+ # Gudhi and CGAL compilation option
+ if(MSVC)
+ set(GUDHI_CYTHON_EXTRA_COMPILE_ARGS "${GUDHI_CYTHON_EXTRA_COMPILE_ARGS}'/fp:strict', ")
+ else(MSVC)
+ set(GUDHI_CYTHON_EXTRA_COMPILE_ARGS "${GUDHI_CYTHON_EXTRA_COMPILE_ARGS}'-std=c++11', ")
+ endif(MSVC)
+ if(CMAKE_COMPILER_IS_GNUCXX)
+ set(GUDHI_CYTHON_EXTRA_COMPILE_ARGS "${GUDHI_CYTHON_EXTRA_COMPILE_ARGS}'-frounding-math', ")
+ endif(CMAKE_COMPILER_IS_GNUCXX)
+ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
+ set(GUDHI_CYTHON_EXTRA_COMPILE_ARGS "${GUDHI_CYTHON_EXTRA_COMPILE_ARGS}'-fp-model strict', ")
+ endif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
+ if (DEBUG_TRACES)
+ # For programs to be more verbose
+ set(GUDHI_CYTHON_EXTRA_COMPILE_ARGS "${GUDHI_CYTHON_EXTRA_COMPILE_ARGS}'-DDEBUG_TRACES', ")
+ endif()
+
+ if (EIGEN3_FOUND)
+ # No problem, even if no CGAL found
+ set(GUDHI_CYTHON_EXTRA_COMPILE_ARGS "${GUDHI_CYTHON_EXTRA_COMPILE_ARGS}'-DCGAL_EIGEN3_ENABLED', ")
+ endif (EIGEN3_FOUND)
+
+ # Copy recursively include, cython, example, doc and test repositories before packages finding
+ # Some tests and doc files are removed in case some packages are not found
+ file(COPY include DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+ file(COPY cython DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+ file(COPY example DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+ file(COPY test DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+ file(COPY doc DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+ # Developper version for doc images
+ file(GLOB GUDHI_DEV_DOC_IMAGES "${CMAKE_SOURCE_DIR}/src/*/doc/*.png")
+ file(COPY ${GUDHI_DEV_DOC_IMAGES} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/doc/img")
+ file(GLOB GUDHI_DEV_DOC_IMAGES "${CMAKE_SOURCE_DIR}/src/*/doc/*.svg")
+ file(COPY ${GUDHI_DEV_DOC_IMAGES} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/doc/img")
+ # User version for doc images
+ file(GLOB GUDHI_USER_DOC_IMAGES "${CMAKE_SOURCE_DIR}/doc/*/*.png")
+ file(COPY ${GUDHI_USER_DOC_IMAGES} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/doc/img")
+ file(GLOB GUDHI_USER_DOC_IMAGES "${CMAKE_SOURCE_DIR}/doc/*/*.svg")
+ file(COPY ${GUDHI_USER_DOC_IMAGES} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/doc/img")
+ # Biblio
+ file(GLOB GUDHI_BIB_FILES "${CMAKE_SOURCE_DIR}/biblio/*.bib")
+ file(COPY ${GUDHI_BIB_FILES} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/doc/")
+ # Cubical complex perseus doc example
+ file(GLOB GUDHI_CUBICAL_PERSEUS_FILES "${CMAKE_SOURCE_DIR}/data/bitmap/*cubicalcomplexdoc.txt")
+ file(COPY ${GUDHI_CUBICAL_PERSEUS_FILES} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/doc/")
+ file(COPY "${CMAKE_SOURCE_DIR}/data/points/alphacomplexdoc.off" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/doc/")
+ file(COPY "${CMAKE_SOURCE_DIR}/data/distance_matrix/full_square_distance_matrix.csv" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/doc/")
+ # Persistence graphical tools examples
+ file(COPY "${CMAKE_SOURCE_DIR}/data/bitmap/3d_torus.txt" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/doc/")
+ file(COPY "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/doc/")
+
+ if (NOT CGAL_VERSION VERSION_LESS 4.8.1)
+ # If CGAL_VERSION >= 4.8.1, include subsampling
+ set(GUDHI_CYTHON_SUBSAMPLING "include 'cython/subsampling.pyx'")
+ set(GUDHI_CYTHON_TANGENTIAL_COMPLEX "include 'cython/tangential_complex.pyx'")
+ set(GUDHI_CYTHON_BOTTLENECK_DISTANCE "include 'cython/bottleneck_distance.pyx'")
+ else (NOT CGAL_VERSION VERSION_LESS 4.8.1)
+ # Remove subsampling unitary tests
+ file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/test/test_subsampling.py)
+ file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/doc/subsampling_ref.rst")
+ file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/doc/subsampling_sum.rst")
+ file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/doc/subsampling_user.rst")
+ # Remove tangential complex and bottleneck unitary tests
+ file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/test/test_tangential_complex.py)
+ file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/test/test_bottleneck_distance.py)
+ file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/doc/bottleneck_distance_ref.rst")
+ file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/doc/bottleneck_distance_sum.rst")
+ file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/doc/bottleneck_distance_user.rst")
+ file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/doc/tangential_complex_ref.rst")
+ file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/doc/tangential_complex_sum.rst")
+ file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/doc/tangential_complex_user.rst")
+ endif (NOT CGAL_VERSION VERSION_LESS 4.8.1)
+ if (NOT CGAL_VERSION VERSION_LESS 4.7.0)
+ # If CGAL_VERSION >= 4.7.0, include alpha
+ set(GUDHI_CYTHON_ALPHA_COMPLEX "include 'cython/alpha_complex.pyx'")
+ else (NOT CGAL_VERSION VERSION_LESS 4.7.0)
+ # Remove alpha complex unitary tests
+ file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/test/test_alpha_complex.py)
+ file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/doc/alpha_complex_ref.rst")
+ file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/doc/alpha_complex_sum.rst")
+ file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/doc/alpha_complex_user.rst")
+ endif (NOT CGAL_VERSION VERSION_LESS 4.7.0)
+ if (NOT CGAL_VERSION VERSION_LESS 4.6.0)
+ # If CGAL_VERSION >= 4.6.0, include euclidean versions of witness complex
+ set(GUDHI_CYTHON_EUCLIDEAN_WITNESS_COMPLEX
+ "include 'cython/euclidean_witness_complex.pyx'\ninclude 'cython/euclidean_strong_witness_complex.pyx'\n")
+ else (NOT CGAL_VERSION VERSION_LESS 4.6.0)
+ # Remove alpha complex unitary tests
+ file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/test/test_euclidean_witness_complex.py)
+ file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/doc/euclidean_witness_complex_ref.rst")
+ file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/doc/euclidean_strong_witness_complex_ref.rst")
+ endif (NOT CGAL_VERSION VERSION_LESS 4.6.0)
+
+ if(CGAL_FOUND)
+ # Add CGAL compilation args
+ if(CGAL_HEADER_ONLY)
+ set(GUDHI_CYTHON_EXTRA_COMPILE_ARGS "${GUDHI_CYTHON_EXTRA_COMPILE_ARGS}'-DCGAL_HEADER_ONLY', ")
+ else(CGAL_HEADER_ONLY)
+ if(WIN32)
+ set(GUDHI_CYTHON_LIBRARIES "${GUDHI_CYTHON_LIBRARIES}'CGAL-vc140-mt-4.7', ")
+ else(WIN32)
+ set(GUDHI_CYTHON_LIBRARIES "${GUDHI_CYTHON_LIBRARIES}'CGAL', ")
+ endif(WIN32)
+ set(GUDHI_CYTHON_LIBRARY_DIRS "${GUDHI_CYTHON_LIBRARY_DIRS}'${CGAL_LIBRARIES_DIR}', ")
+ endif(CGAL_HEADER_ONLY)
+ # GMP and GMPXX are not required, but if present, CGAL will link with them.
+ if(GMP_FOUND)
+ set(GUDHI_CYTHON_EXTRA_COMPILE_ARGS "${GUDHI_CYTHON_EXTRA_COMPILE_ARGS}'-DCGAL_USE_GMP', ")
+ if(WIN32)
+ set(GUDHI_CYTHON_LIBRARIES "${GUDHI_CYTHON_LIBRARIES}'libgmp-10', ")
+ else(WIN32)
+ set(GUDHI_CYTHON_LIBRARIES "${GUDHI_CYTHON_LIBRARIES}'gmp', ")
+ endif(WIN32)
+ set(GUDHI_CYTHON_LIBRARY_DIRS "${GUDHI_CYTHON_LIBRARY_DIRS}'${GMP_LIBRARIES_DIR}', ")
+ if(GMPXX_FOUND)
+ set(GUDHI_CYTHON_EXTRA_COMPILE_ARGS "${GUDHI_CYTHON_EXTRA_COMPILE_ARGS}'-DCGAL_USE_GMPXX', ")
+ set(GUDHI_CYTHON_LIBRARIES "${GUDHI_CYTHON_LIBRARIES}'gmpxx', ")
+ set(GUDHI_CYTHON_LIBRARY_DIRS "${GUDHI_CYTHON_LIBRARY_DIRS}'${GMPXX_LIBRARIES_DIR}', ")
+ endif(GMPXX_FOUND)
+ endif(GMP_FOUND)
+ endif(CGAL_FOUND)
+
+ # Specific for Mac
+ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+ set(GUDHI_CYTHON_EXTRA_COMPILE_ARGS "${GUDHI_CYTHON_EXTRA_COMPILE_ARGS}'-mmacosx-version-min=10.12', ")
+ set(GUDHI_CYTHON_EXTRA_LINK_ARGS "${GUDHI_CYTHON_EXTRA_LINK_ARGS}'-mmacosx-version-min=10.12', ")
+ endif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+
+ # Loop on INCLUDE_DIRECTORIES PROPERTY
+ get_property(GUDHI_INCLUDE_DIRECTORIES DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
+ foreach(GUDHI_INCLUDE_DIRECTORY ${GUDHI_INCLUDE_DIRECTORIES})
+ set(GUDHI_CYTHON_INCLUDE_DIRS "${GUDHI_CYTHON_INCLUDE_DIRS}'${GUDHI_INCLUDE_DIRECTORY}', ")
+ endforeach()
+ set(GUDHI_CYTHON_INCLUDE_DIRS "${GUDHI_CYTHON_INCLUDE_DIRS}'${CMAKE_SOURCE_DIR}/${GUDHI_CYTHON_PATH}/include', ")
+
+ if (TBB_FOUND)
+ set(GUDHI_CYTHON_EXTRA_COMPILE_ARGS "${GUDHI_CYTHON_EXTRA_COMPILE_ARGS}'-DGUDHI_USE_TBB', ")
+ set(GUDHI_CYTHON_LIBRARIES "${GUDHI_CYTHON_LIBRARIES}'tbb', 'tbbmalloc', ")
+ set(GUDHI_CYTHON_LIBRARY_DIRS "${GUDHI_CYTHON_LIBRARY_DIRS}'${TBB_LIBRARY_DIRS}', ")
+ set(GUDHI_CYTHON_INCLUDE_DIRS "${GUDHI_CYTHON_INCLUDE_DIRS}'${TBB_INCLUDE_DIRS}', ")
+ endif()
+
+ # set sphinx-build in make files
+ configure_file(doc/Makefile.in "${CMAKE_CURRENT_BINARY_DIR}/doc/Makefile" @ONLY)
+ configure_file(doc/make.bat.in "${CMAKE_CURRENT_BINARY_DIR}/doc/make.bat" @ONLY)
+
+ # Generate cythonize_gudhi.py file to cythonize Gudhi
+ configure_file(cythonize_gudhi.py.in "${CMAKE_CURRENT_BINARY_DIR}/cythonize_gudhi.py" @ONLY)
+ # Generate gudhi.pyx - Gudhi cython file
+ configure_file(gudhi.pyx.in "${CMAKE_CURRENT_BINARY_DIR}/gudhi.pyx" @ONLY)
+
+ add_custom_command(
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/gudhi.so"
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/cythonize_gudhi.py" "build_ext" "--inplace")
+
+ add_custom_target(cython ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/gudhi.so"
+ COMMENT "Do not forget to add ${CMAKE_CURRENT_BINARY_DIR}/ to your PYTHONPATH before using examples or tests")
+
+ if(UNIX)
+ set( ENV{PYTHONPATH} $ENV{PYTHONPATH}:${CMAKE_CURRENT_BINARY_DIR}/ )
+ endif(UNIX)
+
+ # Test examples
+ add_test(NAME alpha_complex_from_points_example_py_test
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/example/alpha_complex_from_points_example.py")
+ set_tests_properties(alpha_complex_from_points_example_py_test PROPERTIES ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}")
+
+ add_test(NAME alpha_complex_diagram_persistence_from_off_file_example_py_test
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/example/alpha_complex_diagram_persistence_from_off_file_example.py"
+ --no-diagram -f ${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off -a 0.6)
+ set_tests_properties(alpha_complex_diagram_persistence_from_off_file_example_py_test PROPERTIES ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}")
+
+ add_test(NAME alpha_rips_persistence_bottleneck_distance_py_test
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/example/alpha_rips_persistence_bottleneck_distance.py"
+ -f ${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off -t 0.15 -d 3)
+ set_tests_properties(alpha_rips_persistence_bottleneck_distance_py_test PROPERTIES ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}")
+
+ add_test(NAME bottleneck_basic_example_py_test
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/example/bottleneck_basic_example.py")
+ set_tests_properties(bottleneck_basic_example_py_test PROPERTIES ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}")
+
+ add_test(NAME euclidean_strong_witness_complex_diagram_persistence_from_off_file_example_py_test
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/example/euclidean_strong_witness_complex_diagram_persistence_from_off_file_example.py"
+ --no-diagram -f ${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off -a 1.0 -n 20 -d 2)
+ set_tests_properties(euclidean_strong_witness_complex_diagram_persistence_from_off_file_example_py_test PROPERTIES ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}")
+
+ add_test(NAME euclidean_witness_complex_diagram_persistence_from_off_file_example_py_test
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/example/euclidean_witness_complex_diagram_persistence_from_off_file_example.py"
+ --no-diagram -f ${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off -a 1.0 -n 20 -d 2)
+ set_tests_properties(euclidean_witness_complex_diagram_persistence_from_off_file_example_py_test PROPERTIES ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}")
+
+ add_test(NAME periodic_cubical_complex_barcode_persistence_from_perseus_file_example_py_test
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/example/periodic_cubical_complex_barcode_persistence_from_perseus_file_example.py"
+ --no-barcode -f ${CMAKE_SOURCE_DIR}/data/bitmap/CubicalTwoSphere.txt)
+ set_tests_properties(periodic_cubical_complex_barcode_persistence_from_perseus_file_example_py_test PROPERTIES ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}")
+
+ add_test(NAME random_cubical_complex_persistence_example_py_test
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/example/random_cubical_complex_persistence_example.py"
+ 10 10 10)
+ set_tests_properties(random_cubical_complex_persistence_example_py_test PROPERTIES ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}")
+
+ add_test(NAME rips_complex_diagram_persistence_from_distance_matrix_file_example_py_test
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/example/rips_complex_diagram_persistence_from_distance_matrix_file_example.py"
+ --no-diagram -f ${CMAKE_SOURCE_DIR}/data/distance_matrix/lower_triangular_distance_matrix.csv -e 12.0 -d 3)
+ set_tests_properties(rips_complex_diagram_persistence_from_distance_matrix_file_example_py_test PROPERTIES ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}")
+
+ add_test(NAME rips_complex_diagram_persistence_from_off_file_example_py_test
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/example/rips_complex_diagram_persistence_from_off_file_example.py
+ --no-diagram -f ${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off -e 0.25 -d 3)
+ set_tests_properties(rips_complex_diagram_persistence_from_off_file_example_py_test PROPERTIES ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}")
+
+ add_test(NAME rips_complex_from_points_example_py_test
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/example/rips_complex_from_points_example.py)
+ set_tests_properties(rips_complex_from_points_example_py_test PROPERTIES ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}")
+
+ add_test(NAME simplex_tree_example_py_test
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/example/simplex_tree_example.py)
+ set_tests_properties(simplex_tree_example_py_test PROPERTIES ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}")
+
+ add_test(NAME tangential_complex_plain_homology_from_off_file_example_py_test
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/example/tangential_complex_plain_homology_from_off_file_example.py"
+ --no-diagram -f ${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off)
+ set_tests_properties(tangential_complex_plain_homology_from_off_file_example_py_test PROPERTIES ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}")
+
+ add_test(NAME witness_complex_from_nearest_landmark_table_py_test
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/example/witness_complex_from_nearest_landmark_table.py)
+ set_tests_properties(witness_complex_from_nearest_landmark_table_py_test PROPERTIES ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}")
+
+ # Unitary tests are available through py.test
+ if(PYTEST_PATH)
+ add_test(
+ NAME gudhi_cython_py_test
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${PYTHON_EXECUTABLE} "${PYTEST_PATH}")
+ set_tests_properties(gudhi_cython_py_test PROPERTIES ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}")
+ endif(PYTEST_PATH)
+
+ # Documentation generation is available through sphinx
+ if(SPHINX_PATH)
+ if (UNIX)
+ add_custom_target(sphinx
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc
+ DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/gudhi.so"
+ COMMAND make html doctest)
+ else (UNIX)
+ add_custom_target(sphinx
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc
+ COMMAND make.bat html doctest)
+ endif (UNIX)
+ endif(SPHINX_PATH)
+endif(CYTHON_FOUND)
diff --git a/cython/CONVENTIONS b/cython/CONVENTIONS
new file mode 100644
index 00000000..804e97f3
--- /dev/null
+++ b/cython/CONVENTIONS
@@ -0,0 +1,9 @@
+Gudhi is following PEP8 conventions.
+
+Please refer to:
+https://www.python.org/dev/peps/pep-0008/
+
+A summary:
+ - modules (filenames) should have short, all-lowercase names, and they can contain underscores.
+ - packages (directories) should have short, all-lowercase names, preferably without underscores.
+ - classes should use the CapWords convention. \ No newline at end of file
diff --git a/cython/README b/cython/README
new file mode 100644
index 00000000..7d2c4491
--- /dev/null
+++ b/cython/README
@@ -0,0 +1,3 @@
+
+If you do not want to install the package, just launch the following command to help Python to find the compiled package :
+$> export PYTHONPATH=`pwd`:$PYTHONPATH
diff --git a/cython/cython/alpha_complex.pyx b/cython/cython/alpha_complex.pyx
new file mode 100644
index 00000000..a0e8f9b7
--- /dev/null
+++ b/cython/cython/alpha_complex.pyx
@@ -0,0 +1,121 @@
+from cython cimport numeric
+from libcpp.vector cimport vector
+from libcpp.utility cimport pair
+from libcpp.string cimport string
+from libcpp cimport bool
+import os
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+cdef extern from "Alpha_complex_interface.h" namespace "Gudhi":
+ cdef cppclass Alpha_complex_interface "Gudhi::alpha_complex::Alpha_complex_interface":
+ Alpha_complex_interface(vector[vector[double]] points)
+ # bool from_file is a workaround for cython to find the correct signature
+ Alpha_complex_interface(string off_file, bool from_file)
+ vector[double] get_point(int vertex)
+ void create_simplex_tree(Simplex_tree_interface_full_featured* simplex_tree, double max_alpha_square)
+
+# AlphaComplex python interface
+cdef class AlphaComplex:
+ """AlphaComplex is a simplicial complex constructed from the finite cells
+ of a Delaunay Triangulation.
+
+ The filtration value of each simplex is computed as the square of the
+ circumradius of the simplex if the circumsphere is empty (the simplex is
+ then said to be Gabriel), and as the minimum of the filtration values of
+ the codimension 1 cofaces that make it not Gabriel otherwise.
+
+ All simplices that have a filtration value strictly greater than a given
+ alpha squared value are not inserted into the complex.
+
+ .. note::
+
+ When Alpha_complex is constructed with an infinite value of alpha, the
+ complex is a Delaunay complex.
+
+ """
+
+ cdef Alpha_complex_interface * thisptr
+
+ # Fake constructor that does nothing but documenting the constructor
+ def __init__(self, points=None, off_file=''):
+ """AlphaComplex constructor.
+
+ :param points: A list of points in d-Dimension.
+ :type points: list of list of double
+
+ Or
+
+ :param off_file: An OFF file style name.
+ :type off_file: string
+ """
+
+ # The real cython constructor
+ def __cinit__(self, points=None, off_file=''):
+ if off_file is not '':
+ if os.path.isfile(off_file):
+ self.thisptr = new Alpha_complex_interface(str.encode(off_file), True)
+ else:
+ print("file " + off_file + " not found.")
+ else:
+ if points is None:
+ # Empty Alpha construction
+ points=[]
+ self.thisptr = new Alpha_complex_interface(points)
+
+
+ def __dealloc__(self):
+ if self.thisptr != NULL:
+ del self.thisptr
+
+ def __is_defined(self):
+ """Returns true if AlphaComplex pointer is not NULL.
+ """
+ return self.thisptr != NULL
+
+ def get_point(self, vertex):
+ """This function returns the point corresponding to a given vertex.
+
+ :param vertex: The vertex.
+ :type vertex: int
+ :rtype: list of float
+ :returns: the point.
+ """
+ cdef vector[double] point = self.thisptr.get_point(vertex)
+ return point
+
+ def create_simplex_tree(self, max_alpha_square=float('inf')):
+ """
+ :param max_alpha_square: The maximum alpha square threshold the
+ simplices shall not exceed. Default is set to infinity.
+ :type max_alpha_square: float
+ :returns: A simplex tree created from the Delaunay Triangulation.
+ :rtype: SimplexTree
+ """
+ simplex_tree = SimplexTree()
+ self.thisptr.create_simplex_tree(simplex_tree.thisptr, max_alpha_square)
+ return simplex_tree
diff --git a/cython/cython/bottleneck_distance.pyx b/cython/cython/bottleneck_distance.pyx
new file mode 100644
index 00000000..9fb377ff
--- /dev/null
+++ b/cython/cython/bottleneck_distance.pyx
@@ -0,0 +1,61 @@
+from cython cimport numeric
+from libcpp.vector cimport vector
+from libcpp.utility cimport pair
+import os
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+cdef extern from "Bottleneck_distance_interface.h" namespace "Gudhi::persistence_diagram":
+ double bottleneck(vector[pair[double, double]], vector[pair[double, double]], double)
+ double bottleneck(vector[pair[double, double]], vector[pair[double, double]])
+
+def bottleneck_distance(diagram_1, diagram_2, e=None):
+ """This function returns the point corresponding to a given vertex.
+
+ :param diagram_1: The first diagram.
+ :type diagram_1: vector[pair[double, double]]
+ :param diagram_2: The second diagram.
+ :type diagram_2: vector[pair[double, double]]
+ :param e: If `e` is 0, this uses an expensive algorithm to compute the
+ exact distance.
+ If `e` is not 0, it asks for an additive `e`-approximation, and
+ currently also allows a small multiplicative error (the last 2 or 3
+ bits of the mantissa may be wrong). This version of the algorithm takes
+ advantage of the limited precision of `double` and is usually a lot
+ faster to compute, whatever the value of `e`.
+
+ Thus, by default, `e` is the smallest positive double.
+ :type e: float
+ :rtype: float
+ :returns: the bottleneck distance.
+ """
+ if e is None:
+ # Default value is the smallest double value (not 0, 0 is for exact version)
+ return bottleneck(diagram_1, diagram_2)
+ else:
+ # Can be 0 for exact version
+ return bottleneck(diagram_1, diagram_2, e)
diff --git a/cython/cython/cubical_complex.pyx b/cython/cython/cubical_complex.pyx
new file mode 100644
index 00000000..ffc85130
--- /dev/null
+++ b/cython/cython/cubical_complex.pyx
@@ -0,0 +1,197 @@
+from cython cimport numeric
+from libcpp.vector cimport vector
+from libcpp.utility cimport pair
+from libcpp.string cimport string
+from libcpp cimport bool
+import os
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+cdef extern from "Cubical_complex_interface.h" namespace "Gudhi":
+ cdef cppclass Bitmap_cubical_complex_base_interface "Gudhi::Cubical_complex::Cubical_complex_interface<>":
+ Bitmap_cubical_complex_base_interface(vector[unsigned] dimensions, vector[double] top_dimensional_cells)
+ Bitmap_cubical_complex_base_interface(string perseus_file)
+ int num_simplices()
+ int dimension()
+
+cdef extern from "Persistent_cohomology_interface.h" namespace "Gudhi":
+ cdef cppclass Cubical_complex_persistence_interface "Gudhi::Persistent_cohomology_interface<Gudhi::Cubical_complex::Cubical_complex_interface<>>":
+ Cubical_complex_persistence_interface(Bitmap_cubical_complex_base_interface * st, bool persistence_dim_max)
+ vector[pair[int, pair[double, double]]] get_persistence(int homology_coeff_field, double min_persistence)
+ vector[int] betti_numbers()
+ vector[int] persistent_betti_numbers(double from_value, double to_value)
+ vector[pair[double,double]] intervals_in_dimension(int dimension)
+
+# CubicalComplex python interface
+cdef class CubicalComplex:
+ """The CubicalComplex is an example of a structured complex useful in
+ computational mathematics (specially rigorous numerics) and image
+ analysis.
+ """
+ cdef Bitmap_cubical_complex_base_interface * thisptr
+
+ cdef Cubical_complex_persistence_interface * pcohptr
+
+ # Fake constructor that does nothing but documenting the constructor
+ def __init__(self, dimensions=None, top_dimensional_cells=None,
+ perseus_file=''):
+ """CubicalComplex constructor from dimensions and
+ top_dimensional_cells or from a Perseus-style file name.
+
+ :param dimensions: A list of number of top dimensional cells.
+ :type dimensions: list of int
+ :param top_dimensional_cells: A list of cells filtration values.
+ :type top_dimensional_cells: list of double
+
+ Or
+
+ :param perseus_file: A Perseus-style file name.
+ :type perseus_file: string
+ """
+
+ # 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 Bitmap_cubical_complex_base_interface(dimensions, top_dimensional_cells)
+ elif (dimensions is None) and (top_dimensional_cells is None) and (perseus_file is not ''):
+ if os.path.isfile(perseus_file):
+ self.thisptr = new Bitmap_cubical_complex_base_interface(str.encode(perseus_file))
+ else:
+ print("file " + perseus_file + " not found.")
+ else:
+ print("CubicalComplex can be constructed from dimensions and "
+ "top_dimensional_cells or from a Perseus-style file name.")
+
+ def __dealloc__(self):
+ if self.thisptr != NULL:
+ del self.thisptr
+ if self.pcohptr != NULL:
+ del self.pcohptr
+
+ def __is_defined(self):
+ """Returns true if CubicalComplex pointer is not NULL.
+ """
+ return self.thisptr != NULL
+
+ def __is_persistence_defined(self):
+ """Returns true if Persistence pointer is not NULL.
+ """
+ return self.pcohptr != NULL
+
+ def num_simplices(self):
+ """This function returns the number of simplices of the simplicial
+ complex.
+
+ :returns: int -- the simplicial complex number of simplices.
+ """
+ return self.thisptr.num_simplices()
+
+ def dimension(self):
+ """This function returns the dimension of the simplicial complex.
+
+ :returns: int -- the simplicial complex dimension.
+ """
+ return self.thisptr.dimension()
+
+ def persistence(self, homology_coeff_field=11, min_persistence=0):
+ """This function returns the persistence of the simplicial complex.
+
+ :param homology_coeff_field: The homology coefficient field. Must be a
+ prime number
+ :type homology_coeff_field: int.
+ :param min_persistence: The minimum persistence value to take into
+ account (strictly greater than min_persistence). Default value is
+ 0.0.
+ Sets min_persistence to -1.0 to see all values.
+ :type min_persistence: float.
+ :returns: list of pairs(dimension, pair(birth, death)) -- the
+ persistence of the simplicial complex.
+ """
+ if self.pcohptr != NULL:
+ del self.pcohptr
+ if self.thisptr != NULL:
+ self.pcohptr = new Cubical_complex_persistence_interface(self.thisptr, True)
+ cdef vector[pair[int, pair[double, double]]] persistence_result
+ if self.pcohptr != NULL:
+ persistence_result = self.pcohptr.get_persistence(homology_coeff_field, min_persistence)
+ return persistence_result
+
+ def betti_numbers(self):
+ """This function returns the Betti numbers of the simplicial complex.
+
+ :returns: list of int -- The Betti numbers ([B0, B1, ..., Bn]).
+
+ :note: betti_numbers function requires persistence function to be
+ launched first.
+ """
+ cdef vector[int] bn_result
+ if self.pcohptr != NULL:
+ bn_result = self.pcohptr.betti_numbers()
+ return bn_result
+
+ def persistent_betti_numbers(self, from_value, to_value):
+ """This function returns the persistent Betti numbers of the
+ simplicial complex.
+
+ :param from_value: The persistence birth limit to be added in the
+ numbers (persistent birth <= from_value).
+ :type from_value: float.
+ :param to_value: The persistence death limit to be added in the
+ numbers (persistent death > to_value).
+ :type to_value: float.
+
+ :returns: list of int -- The persistent Betti numbers ([B0, B1, ...,
+ Bn]).
+
+ :note: persistent_betti_numbers function requires persistence
+ function to be launched first.
+ """
+ cdef vector[int] pbn_result
+ if self.pcohptr != NULL:
+ pbn_result = self.pcohptr.persistent_betti_numbers(<double>from_value, <double>to_value)
+ return pbn_result
+
+ def persistence_intervals_in_dimension(self, dimension):
+ """This function returns the persistence intervals of the simplicial
+ complex in a specific dimension.
+
+ :param dimension: The specific dimension.
+ :type from_value: int.
+ :returns: The persistence intervals.
+ :rtype: list of pair of float
+
+ :note: intervals_in_dim function requires persistence function to be
+ launched first.
+ """
+ cdef vector[pair[double,double]] intervals_result
+ if self.pcohptr != NULL:
+ intervals_result = self.pcohptr.intervals_in_dimension(dimension)
+ else:
+ print("intervals_in_dim function requires persistence function"
+ " to be launched first.")
+ return intervals_result
diff --git a/cython/cython/euclidean_strong_witness_complex.pyx b/cython/cython/euclidean_strong_witness_complex.pyx
new file mode 100644
index 00000000..c1523892
--- /dev/null
+++ b/cython/cython/euclidean_strong_witness_complex.pyx
@@ -0,0 +1,97 @@
+from cython cimport numeric
+from libcpp.vector cimport vector
+from libcpp.utility cimport pair
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+cdef extern from "Euclidean_strong_witness_complex_interface.h" namespace "Gudhi":
+ cdef cppclass Euclidean_strong_witness_complex_interface "Gudhi::witness_complex::Euclidean_strong_witness_complex_interface":
+ Euclidean_strong_witness_complex_interface(vector[vector[double]] landmarks, vector[vector[double]] witnesses)
+ void create_simplex_tree(Simplex_tree_interface_full_featured* simplex_tree, double max_alpha_square)
+ void create_simplex_tree(Simplex_tree_interface_full_featured* simplex_tree, double max_alpha_square,
+ unsigned limit_dimension)
+ vector[double] get_point(unsigned vertex)
+
+# EuclideanStrongWitnessComplex python interface
+cdef class EuclideanStrongWitnessComplex:
+ """Constructs strong witness complex for given sets of witnesses and
+ landmarks in Euclidean space.
+ """
+
+ cdef Euclidean_strong_witness_complex_interface * thisptr
+
+ # Fake constructor that does nothing but documenting the constructor
+ def __init__(self, landmarks=None, witnesses=None):
+ """WitnessComplex constructor.
+
+ :param landmarks: A list of landmarks (in the point cloud).
+ :type landmarks: list of list of double
+
+ :param witnesses: The point cloud.
+ :type witnesses: list of list of double
+ """
+
+ # The real cython constructor
+ def __cinit__(self, landmarks=None, witnesses=None):
+ if landmarks is not None and witnesses is not None:
+ self.thisptr = new Euclidean_strong_witness_complex_interface(landmarks, witnesses)
+
+ def __dealloc__(self):
+ if self.thisptr != NULL:
+ del self.thisptr
+
+ def __is_defined(self):
+ """Returns true if WitnessComplex pointer is not NULL.
+ """
+ return self.thisptr != NULL
+
+ def create_simplex_tree(self, max_alpha_square, limit_dimension = -1):
+ """
+ :param max_alpha_square: The maximum alpha square threshold the
+ simplices shall not exceed. Default is set to infinity.
+ :type max_alpha_square: float
+ :returns: A simplex tree created from the Delaunay Triangulation.
+ :rtype: SimplexTree
+ """
+ simplex_tree = SimplexTree()
+ if limit_dimension is not -1:
+ self.thisptr.create_simplex_tree(simplex_tree.thisptr, max_alpha_square, limit_dimension)
+ else:
+ self.thisptr.create_simplex_tree(simplex_tree.thisptr, max_alpha_square)
+ return simplex_tree
+
+ def get_point(self, vertex):
+ """This function returns the point corresponding to a given vertex.
+
+ :param vertex: The vertex.
+ :type vertex: int.
+ :returns: The point.
+ :rtype: list of float
+ """
+ cdef vector[double] point = self.thisptr.get_point(vertex)
+ return point
+
diff --git a/cython/cython/euclidean_witness_complex.pyx b/cython/cython/euclidean_witness_complex.pyx
new file mode 100644
index 00000000..7c443b6b
--- /dev/null
+++ b/cython/cython/euclidean_witness_complex.pyx
@@ -0,0 +1,97 @@
+from cython cimport numeric
+from libcpp.vector cimport vector
+from libcpp.utility cimport pair
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+cdef extern from "Euclidean_witness_complex_interface.h" namespace "Gudhi":
+ cdef cppclass Euclidean_witness_complex_interface "Gudhi::witness_complex::Euclidean_witness_complex_interface":
+ Euclidean_witness_complex_interface(vector[vector[double]] landmarks, vector[vector[double]] witnesses)
+ void create_simplex_tree(Simplex_tree_interface_full_featured* simplex_tree, double max_alpha_square)
+ void create_simplex_tree(Simplex_tree_interface_full_featured* simplex_tree, double max_alpha_square,
+ unsigned limit_dimension)
+ vector[double] get_point(unsigned vertex)
+
+# EuclideanWitnessComplex python interface
+cdef class EuclideanWitnessComplex:
+ """Constructs (weak) witness complex for given sets of witnesses and
+ landmarks in Euclidean space.
+ """
+
+ cdef Euclidean_witness_complex_interface * thisptr
+
+ # Fake constructor that does nothing but documenting the constructor
+ def __init__(self, landmarks=None, witnesses=None):
+ """WitnessComplex constructor.
+
+ :param landmarks: A list of landmarks (in the point cloud).
+ :type landmarks: list of list of double
+
+ :param witnesses: The point cloud.
+ :type witnesses: list of list of double
+ """
+
+ # The real cython constructor
+ def __cinit__(self, landmarks=None, witnesses=None):
+ if landmarks is not None and witnesses is not None:
+ self.thisptr = new Euclidean_witness_complex_interface(landmarks, witnesses)
+
+ def __dealloc__(self):
+ if self.thisptr != NULL:
+ del self.thisptr
+
+ def __is_defined(self):
+ """Returns true if WitnessComplex pointer is not NULL.
+ """
+ return self.thisptr != NULL
+
+ def create_simplex_tree(self, max_alpha_square, limit_dimension = -1):
+ """
+ :param max_alpha_square: The maximum alpha square threshold the
+ simplices shall not exceed. Default is set to infinity.
+ :type max_alpha_square: float
+ :returns: A simplex tree created from the Delaunay Triangulation.
+ :rtype: SimplexTree
+ """
+ simplex_tree = SimplexTree()
+ if limit_dimension is not -1:
+ self.thisptr.create_simplex_tree(simplex_tree.thisptr, max_alpha_square, limit_dimension)
+ else:
+ self.thisptr.create_simplex_tree(simplex_tree.thisptr, max_alpha_square)
+ return simplex_tree
+
+ def get_point(self, vertex):
+ """This function returns the point corresponding to a given vertex.
+
+ :param vertex: The vertex.
+ :type vertex: int.
+ :returns: The point.
+ :rtype: list of float
+ """
+ cdef vector[double] point = self.thisptr.get_point(vertex)
+ return point
+
diff --git a/cython/cython/off_reader.pyx b/cython/cython/off_reader.pyx
new file mode 100644
index 00000000..b6e107ef
--- /dev/null
+++ b/cython/cython/off_reader.pyx
@@ -0,0 +1,49 @@
+from cython cimport numeric
+from libcpp.vector cimport vector
+from libcpp.string cimport string
+import os
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+cdef extern from "Off_reader_interface.h" namespace "Gudhi":
+ vector[vector[double]] read_points_from_OFF_file(string off_file)
+
+def read_off(off_file=''):
+ """Read points from OFF file.
+
+ :param off_file: An OFF file style name.
+ :type off_file: string
+
+ :returns: The point set.
+ :rtype: vector[vector[double]]
+ """
+ if off_file is not '':
+ if os.path.isfile(off_file):
+ return read_points_from_OFF_file(str.encode(off_file))
+ else:
+ print("file " + off_file + " not found.")
+
diff --git a/cython/cython/periodic_cubical_complex.pyx b/cython/cython/periodic_cubical_complex.pyx
new file mode 100644
index 00000000..581c7b69
--- /dev/null
+++ b/cython/cython/periodic_cubical_complex.pyx
@@ -0,0 +1,197 @@
+from cython cimport numeric
+from libcpp.vector cimport vector
+from libcpp.utility cimport pair
+from libcpp.string cimport string
+from libcpp cimport bool
+import os
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__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(string perseus_file)
+ int num_simplices()
+ int dimension()
+
+cdef extern from "Persistent_cohomology_interface.h" namespace "Gudhi":
+ cdef cppclass Periodic_cubical_complex_persistence_interface "Gudhi::Persistent_cohomology_interface<Gudhi::Cubical_complex::Cubical_complex_interface<Gudhi::cubical_complex::Bitmap_cubical_complex_periodic_boundary_conditions_base<double>>>":
+ Periodic_cubical_complex_persistence_interface(Periodic_cubical_complex_base_interface * st, bool persistence_dim_max)
+ vector[pair[int, pair[double, double]]] get_persistence(int homology_coeff_field, double min_persistence)
+ vector[int] betti_numbers()
+ vector[int] persistent_betti_numbers(double from_value, double to_value)
+ vector[pair[double,double]] intervals_in_dimension(int dimension)
+
+# PeriodicCubicalComplex python interface
+cdef class PeriodicCubicalComplex:
+ """The PeriodicCubicalComplex is an example of a structured complex useful
+ in computational mathematics (specially rigorous numerics) and image
+ analysis.
+ """
+ cdef Periodic_cubical_complex_base_interface * thisptr
+
+ cdef Periodic_cubical_complex_persistence_interface * pcohptr
+
+ # Fake constructor that does nothing but documenting the constructor
+ def __init__(self, dimensions=None, top_dimensional_cells=None,
+ perseus_file=''):
+ """PeriodicCubicalComplex constructor from dimensions and
+ top_dimensional_cells or from a Perseus-style file name.
+
+ :param dimensions: A list of number of top dimensional cells.
+ :type dimensions: list of int
+ :param top_dimensional_cells: A list of cells filtration values.
+ :type top_dimensional_cells: list of double
+
+ Or
+
+ :param perseus_file: A Perseus-style file name.
+ :type perseus_file: string
+ """
+
+ # 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 ''):
+ if os.path.isfile(perseus_file):
+ self.thisptr = new Periodic_cubical_complex_base_interface(str.encode(perseus_file))
+ else:
+ print("file " + perseus_file + " not found.")
+ else:
+ print("CubicalComplex can be constructed from dimensions and "
+ "top_dimensional_cells or from a Perseus-style file name.")
+
+ def __dealloc__(self):
+ if self.thisptr != NULL:
+ del self.thisptr
+ if self.pcohptr != NULL:
+ del self.pcohptr
+
+ def __is_defined(self):
+ """Returns true if PeriodicCubicalComplex pointer is not NULL.
+ """
+ return self.thisptr != NULL
+
+ def __is_persistence_defined(self):
+ """Returns true if Persistence pointer is not NULL.
+ """
+ return self.pcohptr != NULL
+
+ def num_simplices(self):
+ """This function returns the number of simplices of the simplicial
+ complex.
+
+ :returns: int -- the simplicial complex number of simplices.
+ """
+ return self.thisptr.num_simplices()
+
+ def dimension(self):
+ """This function returns the dimension of the simplicial complex.
+
+ :returns: int -- the simplicial complex dimension.
+ """
+ return self.thisptr.dimension()
+
+ def persistence(self, homology_coeff_field=11, min_persistence=0):
+ """This function returns the persistence of the simplicial complex.
+
+ :param homology_coeff_field: The homology coefficient field. Must be a
+ prime number
+ :type homology_coeff_field: int.
+ :param min_persistence: The minimum persistence value to take into
+ account (strictly greater than min_persistence). Default value is
+ 0.0.
+ Sets min_persistence to -1.0 to see all values.
+ :type min_persistence: float.
+ :returns: list of pairs(dimension, pair(birth, death)) -- the
+ persistence of the simplicial complex.
+ """
+ if self.pcohptr != NULL:
+ del self.pcohptr
+ if self.thisptr != NULL:
+ self.pcohptr = new Periodic_cubical_complex_persistence_interface(self.thisptr, True)
+ cdef vector[pair[int, pair[double, double]]] persistence_result
+ if self.pcohptr != NULL:
+ persistence_result = self.pcohptr.get_persistence(homology_coeff_field, min_persistence)
+ return persistence_result
+
+ def betti_numbers(self):
+ """This function returns the Betti numbers of the simplicial complex.
+
+ :returns: list of int -- The Betti numbers ([B0, B1, ..., Bn]).
+
+ :note: betti_numbers function requires persistence function to be
+ launched first.
+ """
+ cdef vector[int] bn_result
+ if self.pcohptr != NULL:
+ bn_result = self.pcohptr.betti_numbers()
+ return bn_result
+
+ def persistent_betti_numbers(self, from_value, to_value):
+ """This function returns the persistent Betti numbers of the
+ simplicial complex.
+
+ :param from_value: The persistence birth limit to be added in the
+ numbers (persistent birth <= from_value).
+ :type from_value: float.
+ :param to_value: The persistence death limit to be added in the
+ numbers (persistent death > to_value).
+ :type to_value: float.
+
+ :returns: list of int -- The persistent Betti numbers ([B0, B1, ...,
+ Bn]).
+
+ :note: persistent_betti_numbers function requires persistence
+ function to be launched first.
+ """
+ cdef vector[int] pbn_result
+ if self.pcohptr != NULL:
+ pbn_result = self.pcohptr.persistent_betti_numbers(<double>from_value, <double>to_value)
+ return pbn_result
+
+ def persistence_intervals_in_dimension(self, dimension):
+ """This function returns the persistence intervals of the simplicial
+ complex in a specific dimension.
+
+ :param dimension: The specific dimension.
+ :type from_value: int.
+ :returns: The persistence intervals.
+ :rtype: list of pair of float
+
+ :note: intervals_in_dim function requires persistence function to be
+ launched first.
+ """
+ cdef vector[pair[double,double]] intervals_result
+ if self.pcohptr != NULL:
+ intervals_result = self.pcohptr.intervals_in_dimension(dimension)
+ else:
+ print("intervals_in_dim function requires persistence function"
+ " to be launched first.")
+ return intervals_result
diff --git a/cython/cython/persistence_graphical_tools.py b/cython/cython/persistence_graphical_tools.py
new file mode 100755
index 00000000..a984633e
--- /dev/null
+++ b/cython/cython/persistence_graphical_tools.py
@@ -0,0 +1,152 @@
+import matplotlib.pyplot as plt
+import numpy as np
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+def __min_birth_max_death(persistence):
+ """This function returns (min_birth, max_death) from the persistence.
+
+ :param persistence: The persistence to plot.
+ :type persistence: list of tuples(dimension, tuple(birth, death)).
+ :returns: (float, float) -- (min_birth, max_death).
+ """
+ # Look for minimum birth date and maximum death date for plot optimisation
+ max_death = 0
+ min_birth = persistence[0][1][0]
+ for interval in reversed(persistence):
+ if float(interval[1][1]) != float('inf'):
+ if float(interval[1][1]) > max_death:
+ max_death = float(interval[1][1])
+ if float(interval[1][0]) > max_death:
+ max_death = float(interval[1][0])
+ if float(interval[1][0]) < min_birth:
+ min_birth = float(interval[1][0])
+ return (min_birth, max_death)
+
+"""
+Only 13 colors for the palette
+"""
+palette = ['#ff0000', '#00ff00', '#0000ff', '#00ffff', '#ff00ff', '#ffff00',
+ '#000000', '#880000', '#008800', '#000088', '#888800', '#880088',
+ '#008888']
+
+def show_palette_values(alpha=0.6):
+ """This function shows palette color values in function of the dimension.
+
+ :param alpha: alpha value in [0.0, 1.0] for horizontal bars (default is 0.6).
+ :type alpha: float.
+ :returns: plot -- An horizontal bar plot of dimensions color.
+ """
+ colors = []
+ for color in palette:
+ colors.append(color)
+
+ y_pos = np.arange(len(palette))
+
+ plt.barh(y_pos, y_pos + 1, align='center', alpha=alpha, color=colors)
+ plt.ylabel('Dimension')
+ plt.title('Dimension palette values')
+
+ plt.show()
+
+def plot_persistence_barcode(persistence, alpha=0.6):
+ """This function plots the persistence bar code.
+
+ :param persistence: The persistence to plot.
+ :type persistence: list of tuples(dimension, tuple(birth, death)).
+ :param alpha: alpha value in [0.0, 1.0] for horizontal bars (default is 0.6).
+ :type alpha: float.
+ :returns: plot -- An horizontal bar plot of persistence.
+ """
+ (min_birth, max_death) = __min_birth_max_death(persistence)
+ ind = 0
+ delta = ((max_death - min_birth) / 10.0)
+ # Replace infinity values with max_death + delta for bar code to be more
+ # readable
+ infinity = max_death + delta
+ axis_start = min_birth - delta
+ # Draw horizontal bars in loop
+ for interval in reversed(persistence):
+ if float(interval[1][1]) != float('inf'):
+ # Finite death case
+ plt.barh(ind, (interval[1][1] - interval[1][0]), height=0.8,
+ left = interval[1][0], alpha=alpha,
+ color = palette[interval[0]])
+ else:
+ # Infinite death case for diagram to be nicer
+ plt.barh(ind, (infinity - interval[1][0]), height=0.8,
+ left = interval[1][0], alpha=alpha,
+ color = palette[interval[0]])
+ ind = ind + 1
+
+ plt.title('Persistence barcode')
+ # Ends plot on infinity value and starts a little bit before min_birth
+ plt.axis([axis_start, infinity, 0, ind])
+ plt.show()
+
+def plot_persistence_diagram(persistence, alpha=0.6):
+ """This function plots the persistence diagram.
+
+ :param persistence: The persistence to plot.
+ :type persistence: list of tuples(dimension, tuple(birth, death)).
+ :param alpha: alpha value in [0.0, 1.0] for points and horizontal infinity line (default is 0.6).
+ :type alpha: float.
+ :returns: plot -- An diagram plot of persistence.
+ """
+ (min_birth, max_death) = __min_birth_max_death(persistence)
+ ind = 0
+ delta = ((max_death - min_birth) / 10.0)
+ # Replace infinity values with max_death + delta for diagram to be more
+ # readable
+ infinity = max_death + delta
+ axis_start = min_birth - delta
+
+ # line display of equation : birth = death
+ x = np.linspace(axis_start, infinity, 1000)
+ # infinity line and text
+ plt.plot(x, x, color='k', linewidth=1.0)
+ plt.plot(x, [infinity] * len(x), linewidth=1.0, color='k', alpha=alpha)
+ plt.text(axis_start, infinity, r'$\infty$', color='k', alpha=alpha)
+
+ # Draw points in loop
+ for interval in reversed(persistence):
+ if float(interval[1][1]) != float('inf'):
+ # Finite death case
+ plt.scatter(interval[1][0], interval[1][1], alpha=alpha,
+ color = palette[interval[0]])
+ else:
+ # Infinite death case for diagram to be nicer
+ plt.scatter(interval[1][0], infinity, alpha=alpha,
+ color = palette[interval[0]])
+ ind = ind + 1
+
+ plt.title('Persistence diagram')
+ plt.xlabel('Birth')
+ plt.ylabel('Death')
+ # Ends plot on infinity value and starts a little bit before min_birth
+ plt.axis([axis_start, infinity, axis_start, infinity + delta])
+ plt.show()
diff --git a/cython/cython/rips_complex.pyx b/cython/cython/rips_complex.pyx
new file mode 100644
index 00000000..ad9b0a4d
--- /dev/null
+++ b/cython/cython/rips_complex.pyx
@@ -0,0 +1,125 @@
+from cython cimport numeric
+from libcpp.vector cimport vector
+from libcpp.utility cimport pair
+from libcpp.string cimport string
+from libcpp cimport bool
+import os
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+cdef extern from "Rips_complex_interface.h" namespace "Gudhi":
+ cdef cppclass Rips_complex_interface "Gudhi::rips_complex::Rips_complex_interface":
+ Rips_complex_interface(vector[vector[double]] values, double threshold, bool euclidean)
+ # bool from_file is a workaround for cython to find the correct signature
+ Rips_complex_interface(string file_name, double threshold, bool euclidean, bool from_file)
+ void create_simplex_tree(Simplex_tree_interface_full_featured* simplex_tree, int dim_max)
+
+# RipsComplex python interface
+cdef class RipsComplex:
+ """The data structure is a one skeleton graph, or Rips graph, containing
+ edges when the edge length is less or equal to a given threshold. Edge
+ length is computed from a user given point cloud with a given distance
+ function, or a distance matrix.
+ """
+
+ cdef Rips_complex_interface * thisptr
+
+ # Fake constructor that does nothing but documenting the constructor
+ def __init__(self, points=None, off_file='', distance_matrix=None, csv_file='', max_edge_length=float('inf')):
+ """RipsComplex constructor.
+
+ :param max_edge_length: Rips value.
+ :type max_edge_length: int
+
+ :param points: A list of points in d-Dimension.
+ :type points: list of list of double
+
+ Or
+
+ :param off_file: An OFF file style name.
+ :type off_file: string
+
+ Or
+
+ :param distance_matrix: A distance matrix (full square or lower
+ triangular).
+ :type points: list of list of double
+
+ Or
+
+ :param csv_file: A csv file style name containing a full square or a
+ lower triangular distance matrix.
+ :type csv_file: string
+ """
+
+ # The real cython constructor
+ def __cinit__(self, points=None, off_file='', distance_matrix=None, csv_file='', max_edge_length=float('inf')):
+ if off_file is not '':
+ if os.path.isfile(off_file):
+ self.thisptr = new Rips_complex_interface(str.encode(off_file),
+ max_edge_length,
+ True,
+ True)
+ else:
+ print("file " + off_file + " not found.")
+ elif csv_file is not '':
+ if os.path.isfile(csv_file):
+ self.thisptr = new Rips_complex_interface(str.encode(csv_file),
+ max_edge_length,
+ False,
+ True)
+ else:
+ print("file " + csv_file + " not found.")
+ elif distance_matrix is not None:
+ self.thisptr = new Rips_complex_interface(distance_matrix, max_edge_length, False)
+ else:
+ if points is None:
+ # Empty Rips construction
+ points=[]
+ self.thisptr = new Rips_complex_interface(points, max_edge_length, True)
+
+
+ def __dealloc__(self):
+ if self.thisptr != NULL:
+ del self.thisptr
+
+ def __is_defined(self):
+ """Returns true if RipsComplex pointer is not NULL.
+ """
+ return self.thisptr != NULL
+
+ def create_simplex_tree(self, max_dimension=1):
+ """
+ :param max_dimension: graph expansion for rips until this given maximal
+ dimension.
+ :type max_dimension: int
+ :returns: A simplex tree created from the Delaunay Triangulation.
+ :rtype: SimplexTree
+ """
+ simplex_tree = SimplexTree()
+ self.thisptr.create_simplex_tree(simplex_tree.thisptr, max_dimension)
+ return simplex_tree
diff --git a/cython/cython/simplex_tree.pyx b/cython/cython/simplex_tree.pyx
new file mode 100644
index 00000000..9d40a8b5
--- /dev/null
+++ b/cython/cython/simplex_tree.pyx
@@ -0,0 +1,401 @@
+from cython cimport numeric
+from libcpp.vector cimport vector
+from libcpp.utility cimport pair
+from libcpp cimport bool
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+cdef extern from "Simplex_tree_interface.h" namespace "Gudhi":
+ cdef cppclass Simplex_tree_options_full_featured:
+ pass
+
+ cdef cppclass Simplex_tree_interface_full_featured "Gudhi::Simplex_tree_interface<Gudhi::Simplex_tree_options_full_featured>":
+ Simplex_tree()
+ double filtration()
+ double simplex_filtration(vector[int] simplex)
+ void set_filtration(double filtration)
+ void initialize_filtration()
+ int num_vertices()
+ int num_simplices()
+ void set_dimension(int dimension)
+ int dimension()
+ bint find_simplex(vector[int] simplex)
+ bint insert_simplex_and_subfaces(vector[int] simplex,
+ double filtration)
+ vector[pair[vector[int], double]] get_filtration()
+ vector[pair[vector[int], double]] get_skeleton(int dimension)
+ 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)
+
+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>>":
+ Simplex_tree_persistence_interface(Simplex_tree_interface_full_featured * st, bool persistence_dim_max)
+ vector[pair[int, pair[double, double]]] get_persistence(int homology_coeff_field, double min_persistence)
+ vector[int] betti_numbers()
+ vector[int] persistent_betti_numbers(double from_value, double to_value)
+ vector[pair[double,double]] intervals_in_dimension(int dimension)
+
+# SimplexTree python interface
+cdef class SimplexTree:
+ """The simplex tree is an efficient and flexible data structure for
+ representing general (filtered) simplicial complexes. The data structure
+ is described in Jean-Daniel Boissonnat and Clément Maria. The Simplex
+ Tree: An Efficient Data Structure for General Simplicial Complexes.
+ Algorithmica, pages 1–22, 2014.
+
+ This class is a filtered, with keys, and non contiguous vertices version
+ of the simplex tree.
+ """
+ cdef Simplex_tree_interface_full_featured * thisptr
+
+ cdef Simplex_tree_persistence_interface * pcohptr
+
+ # Fake constructor that does nothing but documenting the constructor
+ def __init__(self):
+ """SimplexTree constructor.
+ """
+
+ # The real cython constructor
+ def __cinit__(self):
+ self.thisptr = new Simplex_tree_interface_full_featured()
+
+ def __dealloc__(self):
+ if self.thisptr != NULL:
+ del self.thisptr
+ if self.pcohptr != NULL:
+ del self.pcohptr
+
+ def __is_defined(self):
+ """Returns true if SimplexTree pointer is not NULL.
+ """
+ return self.thisptr != NULL
+
+ def __is_persistence_defined(self):
+ """Returns true if Persistence pointer is not NULL.
+ """
+ return self.pcohptr != NULL
+
+ def filtration(self, simplex):
+ """This function returns 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.
+ :returns: The simplicial complex filtration value.
+ :rtype: float
+ """
+ return self.thisptr.simplex_filtration(simplex)
+
+ def set_filtration(self, filtration):
+ """This function sets the main simplicial complex filtration value.
+
+ :param filtration: The filtration value.
+ :type filtration: float.
+ """
+ self.thisptr.set_filtration(<double> 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.
+ """
+ self.thisptr.initialize_filtration()
+
+ def num_vertices(self):
+ """This function returns the number of vertices of the simplicial
+ complex.
+
+ :returns: The simplicial complex number of vertices.
+ :rtype: int
+ """
+ return self.thisptr.num_vertices()
+
+ def num_simplices(self):
+ """This function returns the number of simplices of the simplicial
+ complex.
+
+ :returns: the simplicial complex number of simplices.
+ :rtype: int
+ """
+ return self.thisptr.num_simplices()
+
+ def dimension(self):
+ """This function returns the dimension of the simplicial complex.
+
+ :returns: the simplicial complex dimension.
+ :rtype: int
+ """
+ return self.thisptr.dimension()
+
+ def set_dimension(self, dimension):
+ """This function sets the dimension of the simplicial complex.
+
+ insert and remove_maximal_simplex functions do not update dimension
+ value of the `SimplexTree`.
+
+ `AlphaComplex`, `RipsComplex`, `TangentialComplex` and `WitnessComplex`
+ automatically sets the correct dimension in their `create_simplex_tree`
+ functions.
+
+ :param dimension: The new dimension value.
+ :type dimension: int.
+ """
+ self.thisptr.set_dimension(<int>dimension)
+
+ def find(self, simplex):
+ """This function returns if the N-simplex was found in the simplicial
+ complex or not.
+
+ :param simplex: The N-simplex to find, represented by a list of vertex.
+ :type simplex: list of int.
+ :returns: true if the simplex was found, false otherwise.
+ :rtype: bool
+ """
+ cdef vector[int] complex
+ for i in simplex:
+ complex.push_back(i)
+ return self.thisptr.find_simplex(complex)
+
+ 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').
+
+ :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.
+ :rtype: bool
+ """
+ cdef vector[int] complex
+ for i in simplex:
+ complex.push_back(i)
+ return self.thisptr.insert_simplex_and_subfaces(complex,
+ <double>filtration)
+
+ def get_filtration(self):
+ """This function returns a list of all simplices with their given
+ filtration values.
+
+ :returns: The simplices sorted by increasing filtration values.
+ :rtype: list of tuples(simplex, filtration)
+ """
+ cdef vector[pair[vector[int], double]] filtration \
+ = self.thisptr.get_filtration()
+ ct = []
+ for filtered_complex in filtration:
+ v = []
+ for vertex in filtered_complex.first:
+ v.append(vertex)
+ ct.append((v, filtered_complex.second))
+ return ct
+
+ def get_skeleton(self, dimension):
+ """This function returns the (simplices of the) skeleton of a maximum
+ given dimension.
+
+ :param dimension: The skeleton dimension value.
+ :type dimension: int.
+ :returns: The (simplices of the) skeleton of a maximum dimension.
+ :rtype: list of tuples(simplex, filtration)
+ """
+ cdef vector[pair[vector[int], double]] skeletons \
+ = self.thisptr.get_skeleton(<int>dimension)
+ ct = []
+ for filtered_complex in skeletons:
+ v = []
+ for vertex in filtered_complex.first:
+ v.append(vertex)
+ ct.append((v, filtered_complex.second))
+ return ct
+
+ def get_star(self, simplex):
+ """This function returns the stars of a given N-simplex.
+
+ :param simplex: The N-simplex, represented by a list of vertex.
+ :type simplex: list of int.
+ :returns: The (simplices of the) star of a simplex.
+ :rtype: list of tuples(simplex, filtration)
+ """
+ cdef vector[int] complex
+ for i in simplex:
+ complex.push_back(i)
+ cdef vector[pair[vector[int], double]] stars \
+ = self.thisptr.get_star(complex)
+ ct = []
+ for filtered_complex in stars:
+ v = []
+ for vertex in filtered_complex.first:
+ v.append(vertex)
+ ct.append((v, filtered_complex.second))
+ return ct
+
+ def get_cofaces(self, simplex, codimension):
+ """This function returns the cofaces of a given N-simplex with a
+ given codimension.
+
+ :param simplex: The N-simplex, represented by a list of vertex.
+ :type simplex: list of int.
+ :param codimension: The codimension. If codimension = 0, all cofaces
+ are returned (equivalent of get_star function)
+ :type codimension: int.
+ :returns: The (simplices of the) cofaces of a simplex
+ :rtype: list of tuples(simplex, filtration)
+ """
+ cdef vector[int] complex
+ for i in simplex:
+ complex.push_back(i)
+ cdef vector[pair[vector[int], double]] cofaces \
+ = self.thisptr.get_cofaces(complex, <int>codimension)
+ ct = []
+ for filtered_complex in cofaces:
+ v = []
+ for vertex in filtered_complex.first:
+ v.append(vertex)
+ ct.append((v, filtered_complex.second))
+ return ct
+
+ def remove_maximal_simplex(self, simplex):
+ """This function removes a given maximal N-simplex from the simplicial
+ complex.
+
+ :param simplex: The N-simplex, represented by a list of vertex.
+ :type simplex: list of int.
+ """
+ self.thisptr.remove_maximal_simplex(simplex)
+
+ def expansion(self, max_dim):
+ """Expands the Simplex_tree containing only its one skeleton
+ until dimension max_dim.
+
+ The expanded simplicial complex until dimension :math:`d`
+ attached to a graph :math:`G` is the maximal simplicial complex of
+ dimension at most :math:`d` admitting the graph :math:`G` as
+ :math:`1`-skeleton.
+ The filtration value assigned to a simplex is the maximal filtration
+ value of one of its edges.
+
+ The Simplex_tree must contain no simplex of dimension bigger than
+ 1 when calling the method.
+
+ :param max_dim: The maximal dimension.
+ :type max_dim: int.
+ """
+ self.thisptr.expansion(max_dim)
+
+ def persistence(self, homology_coeff_field=11, min_persistence=0, persistence_dim_max = False):
+ """This function returns the persistence of the simplicial complex.
+
+ :param homology_coeff_field: The homology coefficient field. Must be a
+ prime number
+ :type homology_coeff_field: int.
+ :param min_persistence: The minimum persistence value to take into
+ account (strictly greater than min_persistence). Default value is
+ 0.0.
+ Sets min_persistence to -1.0 to see all values.
+ :type min_persistence: float.
+ :returns: The persistence of the simplicial complex.
+ :rtype: list of pairs(dimension, pair(birth, death))
+ """
+ if self.pcohptr != NULL:
+ del self.pcohptr
+ self.pcohptr = new Simplex_tree_persistence_interface(self.thisptr, persistence_dim_max)
+ cdef vector[pair[int, pair[double, double]]] persistence_result
+ if self.pcohptr != NULL:
+ persistence_result = self.pcohptr.get_persistence(homology_coeff_field, min_persistence)
+ return persistence_result
+
+ def betti_numbers(self):
+ """This function returns the Betti numbers of the simplicial complex.
+
+ :returns: The Betti numbers ([B0, B1, ..., Bn]).
+ :rtype: list of int
+
+ :note: betti_numbers function requires persistence function to be
+ launched first.
+ """
+ cdef vector[int] bn_result
+ if self.pcohptr != NULL:
+ bn_result = self.pcohptr.betti_numbers()
+ else:
+ print("betti_numbers function requires persistence function"
+ " to be launched first.")
+ return bn_result
+
+ def persistent_betti_numbers(self, from_value, to_value):
+ """This function returns the persistent Betti numbers of the
+ simplicial complex.
+
+ :param from_value: The persistence birth limit to be added in the
+ numbers (persistent birth <= from_value).
+ :type from_value: float.
+ :param to_value: The persistence death limit to be added in the
+ numbers (persistent death > to_value).
+ :type to_value: float.
+
+ :returns: The persistent Betti numbers ([B0, B1, ..., Bn]).
+ :rtype: list of int
+
+ :note: persistent_betti_numbers function requires persistence
+ function to be launched first.
+ """
+ cdef vector[int] pbn_result
+ if self.pcohptr != NULL:
+ pbn_result = self.pcohptr.persistent_betti_numbers(<double>from_value, <double>to_value)
+ else:
+ print("persistent_betti_numbers function requires persistence function"
+ " to be launched first.")
+ return pbn_result
+
+ def persistence_intervals_in_dimension(self, dimension):
+ """This function returns the persistence intervals of the simplicial
+ complex in a specific dimension.
+
+ :param dimension: The specific dimension.
+ :type from_value: int.
+ :returns: The persistence intervals.
+ :rtype: list of pair of float
+
+ :note: intervals_in_dim function requires persistence function to be
+ launched first.
+ """
+ cdef vector[pair[double,double]] intervals_result
+ if self.pcohptr != NULL:
+ intervals_result = self.pcohptr.intervals_in_dimension(dimension)
+ else:
+ print("intervals_in_dim function requires persistence function"
+ " to be launched first.")
+ return intervals_result
diff --git a/cython/cython/strong_witness_complex.pyx b/cython/cython/strong_witness_complex.pyx
new file mode 100644
index 00000000..770b46f5
--- /dev/null
+++ b/cython/cython/strong_witness_complex.pyx
@@ -0,0 +1,81 @@
+from cython cimport numeric
+from libcpp.vector cimport vector
+from libcpp.utility cimport pair
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+cdef extern from "Strong_witness_complex_interface.h" namespace "Gudhi":
+ cdef cppclass Strong_witness_complex_interface "Gudhi::witness_complex::Strong_witness_complex_interface":
+ Strong_witness_complex_interface(vector[vector[pair[size_t, double]]] nearest_landmark_table)
+ void create_simplex_tree(Simplex_tree_interface_full_featured* simplex_tree, double max_alpha_square)
+ void create_simplex_tree(Simplex_tree_interface_full_featured* simplex_tree, double max_alpha_square,
+ unsigned limit_dimension)
+
+# StrongWitnessComplex python interface
+cdef class StrongWitnessComplex:
+ """Constructs (strong) witness complex for a given table of nearest
+ landmarks with respect to witnesses.
+ """
+
+ cdef Strong_witness_complex_interface * thisptr
+
+ # Fake constructor that does nothing but documenting the constructor
+ def __init__(self, nearest_landmark_table=None):
+ """StrongWitnessComplex constructor.
+
+ :param nearest_landmark_table: A list of nearest landmark.
+ :type nearest_landmark_table: list of list of pair of unsigned and double
+ """
+
+ # The real cython constructor
+ def __cinit__(self, nearest_landmark_table=None):
+ if nearest_landmark_table is not None:
+ self.thisptr = new Strong_witness_complex_interface(nearest_landmark_table)
+
+ def __dealloc__(self):
+ if self.thisptr != NULL:
+ del self.thisptr
+
+ def __is_defined(self):
+ """Returns true if StrongWitnessComplex pointer is not NULL.
+ """
+ return self.thisptr != NULL
+
+ def create_simplex_tree(self, max_alpha_square, limit_dimension = -1):
+ """
+ :param max_alpha_square: The maximum alpha square threshold the
+ simplices shall not exceed. Default is set to infinity.
+ :type max_alpha_square: float
+ :returns: A simplex tree created from the Delaunay Triangulation.
+ :rtype: SimplexTree
+ """
+ simplex_tree = SimplexTree()
+ if limit_dimension is not -1:
+ self.thisptr.create_simplex_tree(simplex_tree.thisptr, max_alpha_square, limit_dimension)
+ else:
+ self.thisptr.create_simplex_tree(simplex_tree.thisptr, max_alpha_square)
+ return simplex_tree
diff --git a/cython/cython/subsampling.pyx b/cython/cython/subsampling.pyx
new file mode 100644
index 00000000..894a4fbe
--- /dev/null
+++ b/cython/cython/subsampling.pyx
@@ -0,0 +1,140 @@
+from cython cimport numeric
+from libcpp.vector cimport vector
+from libcpp.string cimport string
+from libcpp cimport bool
+import os
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+cdef extern from "Subsampling_interface.h" namespace "Gudhi::subsampling":
+ vector[vector[double]] subsampling_n_farthest_points(vector[vector[double]] points, unsigned nb_points)
+ vector[vector[double]] subsampling_n_farthest_points(vector[vector[double]] points, unsigned nb_points, unsigned starting_point)
+ vector[vector[double]] subsampling_n_farthest_points_from_file(string off_file, unsigned nb_points)
+ vector[vector[double]] subsampling_n_farthest_points_from_file(string off_file, unsigned nb_points, unsigned starting_point)
+ vector[vector[double]] subsampling_n_random_points(vector[vector[double]] points, unsigned nb_points)
+ vector[vector[double]] subsampling_n_random_points_from_file(string off_file, unsigned nb_points)
+ vector[vector[double]] subsampling_sparsify_points(vector[vector[double]] points, double min_squared_dist)
+ vector[vector[double]] subsampling_sparsify_points_from_file(string off_file, double min_squared_dist)
+
+def choose_n_farthest_points(points=None, off_file='', nb_points=0, starting_point = ''):
+ """Subsample by a greedy strategy of iteratively adding the farthest point
+ from the current chosen point set to the subsampling.
+ The iteration starts with the landmark `starting point`.
+
+ :param points: The input point set.
+ :type points: vector[vector[double]].
+
+ Or
+
+ :param off_file: An OFF file style name.
+ :type off_file: string
+
+ :param nb_points: Number of points of the subsample.
+ :type nb_points: unsigned.
+ :param starting_point: The iteration starts with the landmark `starting \
+ point`,which is the index of the poit to start with. If not set, this \
+ index is choosen randomly.
+ :type starting_point: unsigned.
+ :returns: The subsample point set.
+ :rtype: vector[vector[double]]
+ """
+ if off_file is not '':
+ if os.path.isfile(off_file):
+ if starting_point is '':
+ return subsampling_n_farthest_points_from_file(str.encode(off_file),
+ nb_points)
+ else:
+ return subsampling_n_farthest_points_from_file(str.encode(off_file),
+ nb_points,
+ starting_point)
+ else:
+ print("file " + off_file + " not found.")
+ else:
+ if points is None:
+ # Empty points
+ points=[]
+ if starting_point is '':
+ return subsampling_n_farthest_points(points, nb_points)
+ else:
+ return subsampling_n_farthest_points(points, nb_points,
+ starting_point)
+
+def pick_n_random_points(points=None, off_file='', nb_points=0):
+ """Subsample a point set by picking random vertices.
+
+ :param points: The input point set.
+ :type points: vector[vector[double]].
+
+ Or
+
+ :param off_file: An OFF file style name.
+ :type off_file: string
+
+ :param nb_points: Number of points of the subsample.
+ :type nb_points: unsigned.
+ :returns: The subsample point set.
+ :rtype: vector[vector[double]]
+ """
+ if off_file is not '':
+ if os.path.isfile(off_file):
+ return subsampling_n_random_points_from_file(str.encode(off_file),
+ nb_points)
+ else:
+ print("file " + off_file + " not found.")
+ else:
+ if points is None:
+ # Empty points
+ points=[]
+ return subsampling_n_random_points(points, nb_points)
+
+def sparsify_point_set(points=None, off_file='', min_squared_dist=0.0):
+ """Subsample a point set by picking random vertices.
+
+ :param points: The input point set.
+ :type points: vector[vector[double]].
+
+ Or
+
+ :param off_file: An OFF file style name.
+ :type off_file: string
+
+ :param min_squared_dist: Number of points of the subsample.
+ :type min_squared_dist: unsigned.
+ :returns: The subsample point set.
+ :rtype: vector[vector[double]]
+ """
+ if off_file is not '':
+ if os.path.isfile(off_file):
+ return subsampling_sparsify_points_from_file(str.encode(off_file),
+ min_squared_dist)
+ else:
+ print("file " + off_file + " not found.")
+ else:
+ if points is None:
+ # Empty points
+ points=[]
+ return subsampling_sparsify_points(points, min_squared_dist)
diff --git a/cython/cython/tangential_complex.pyx b/cython/cython/tangential_complex.pyx
new file mode 100644
index 00000000..d55bb050
--- /dev/null
+++ b/cython/cython/tangential_complex.pyx
@@ -0,0 +1,151 @@
+from cython cimport numeric
+from libcpp.vector cimport vector
+from libcpp.utility cimport pair
+from libcpp.string cimport string
+from libcpp cimport bool
+import os
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+cdef extern from "Tangential_complex_interface.h" namespace "Gudhi":
+ cdef cppclass Tangential_complex_interface "Gudhi::tangential_complex::Tangential_complex_interface":
+ Tangential_complex_interface(vector[vector[double]] points)
+ # bool from_file is a workaround for cython to find the correct signature
+ Tangential_complex_interface(string off_file, bool from_file)
+ vector[double] get_point(unsigned vertex)
+ unsigned number_of_vertices()
+ unsigned number_of_simplices()
+ unsigned number_of_inconsistent_simplices()
+ unsigned number_of_inconsistent_stars()
+ void create_simplex_tree(Simplex_tree_interface_full_featured* simplex_tree)
+ void fix_inconsistencies_using_perturbation(double max_perturb, double time_limit)
+
+# TangentialComplex python interface
+cdef class TangentialComplex:
+ """The class Tangential_complex represents a tangential complex. After the
+ computation of the complex, an optional post-processing called perturbation
+ can be run to attempt to remove inconsistencies.
+ """
+
+ cdef Tangential_complex_interface * thisptr
+
+ # Fake constructor that does nothing but documenting the constructor
+ def __init__(self, points=None, off_file=''):
+ """TangentialComplex constructor.
+
+ :param points: A list of points in d-Dimension.
+ :type points: list of list of double
+
+ Or
+
+ :param off_file: An OFF file style name.
+ :type off_file: string
+ """
+
+ # The real cython constructor
+ def __cinit__(self, points=None, off_file=''):
+ if off_file is not '':
+ if os.path.isfile(off_file):
+ self.thisptr = new Tangential_complex_interface(str.encode(off_file), True)
+ else:
+ print("file " + off_file + " not found.")
+ else:
+ if points is None:
+ # Empty tangential construction
+ points=[]
+ self.thisptr = new Tangential_complex_interface(points)
+
+
+ def __dealloc__(self):
+ if self.thisptr != NULL:
+ del self.thisptr
+
+ def __is_defined(self):
+ """Returns true if TangentialComplex pointer is not NULL.
+ """
+ return self.thisptr != NULL
+
+ def get_point(self, vertex):
+ """This function returns the point corresponding to a given vertex.
+
+ :param vertex: The vertex.
+ :type vertex: int.
+ :returns: The point.
+ :rtype: list of float
+ """
+ cdef vector[double] point = self.thisptr.get_point(vertex)
+ return point
+
+ def num_vertices(self):
+ """
+ :returns: The number of vertices.
+ :rtype: unsigned
+ """
+ return self.thisptr.number_of_vertices()
+
+ def num_simplices(self):
+ """
+ :returns: Total number of simplices in stars (including duplicates that appear in several stars).
+ :rtype: unsigned
+ """
+ return self.thisptr.number_of_simplices()
+
+ def num_inconsistent_simplices(self):
+ """
+ :returns: The number of inconsistent simplices.
+ :rtype: unsigned
+ """
+ return self.thisptr.number_of_inconsistent_simplices()
+
+ def num_inconsistent_stars(self):
+ """
+ :returns: The number of stars containing at least one inconsistent simplex.
+ :rtype: unsigned
+ """
+ return self.thisptr.number_of_inconsistent_stars()
+
+ def create_simplex_tree(self):
+ """Exports the complex into a simplex tree.
+
+ :returns: A simplex tree created from the complex.
+ :rtype: SimplexTree
+ """
+ simplex_tree = SimplexTree()
+ self.thisptr.create_simplex_tree(simplex_tree.thisptr)
+ return simplex_tree
+
+ def fix_inconsistencies_using_perturbation(self, max_perturb, time_limit=-1.0):
+ """Attempts to fix inconsistencies by perturbing the point positions.
+
+ :param max_perturb: Maximum length of the translations used by the
+ perturbation.
+ :type max_perturb: double
+ :param time_limit: Time limit in seconds. If -1, no time limit is set.
+ :type time_limit: double
+ """
+ self.thisptr.fix_inconsistencies_using_perturbation(max_perturb,
+ time_limit)
diff --git a/cython/cython/witness_complex.pyx b/cython/cython/witness_complex.pyx
new file mode 100644
index 00000000..96d122bb
--- /dev/null
+++ b/cython/cython/witness_complex.pyx
@@ -0,0 +1,81 @@
+from cython cimport numeric
+from libcpp.vector cimport vector
+from libcpp.utility cimport pair
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+cdef extern from "Witness_complex_interface.h" namespace "Gudhi":
+ cdef cppclass Witness_complex_interface "Gudhi::witness_complex::Witness_complex_interface":
+ Witness_complex_interface(vector[vector[pair[size_t, double]]] nearest_landmark_table)
+ void create_simplex_tree(Simplex_tree_interface_full_featured* simplex_tree, double max_alpha_square)
+ void create_simplex_tree(Simplex_tree_interface_full_featured* simplex_tree, double max_alpha_square,
+ unsigned limit_dimension)
+
+# WitnessComplex python interface
+cdef class WitnessComplex:
+ """Constructs (weak) witness complex for a given table of nearest landmarks
+ with respect to witnesses.
+ """
+
+ cdef Witness_complex_interface * thisptr
+
+ # Fake constructor that does nothing but documenting the constructor
+ def __init__(self, nearest_landmark_table=None):
+ """WitnessComplex constructor.
+
+ :param nearest_landmark_table: A list of nearest landmark.
+ :type nearest_landmark_table: list of list of pair of unsigned and double
+ """
+
+ # The real cython constructor
+ def __cinit__(self, nearest_landmark_table=None):
+ if nearest_landmark_table is not None:
+ self.thisptr = new Witness_complex_interface(nearest_landmark_table)
+
+ def __dealloc__(self):
+ if self.thisptr != NULL:
+ del self.thisptr
+
+ def __is_defined(self):
+ """Returns true if WitnessComplex pointer is not NULL.
+ """
+ return self.thisptr != NULL
+
+ def create_simplex_tree(self, max_alpha_square, limit_dimension = -1):
+ """
+ :param max_alpha_square: The maximum alpha square threshold the
+ simplices shall not exceed. Default is set to infinity.
+ :type max_alpha_square: float
+ :returns: A simplex tree created from the Delaunay Triangulation.
+ :rtype: SimplexTree
+ """
+ simplex_tree = SimplexTree()
+ if limit_dimension is not -1:
+ self.thisptr.create_simplex_tree(simplex_tree.thisptr, max_alpha_square, limit_dimension)
+ else:
+ self.thisptr.create_simplex_tree(simplex_tree.thisptr, max_alpha_square)
+ return simplex_tree
diff --git a/cython/cythonize_gudhi.py.in b/cython/cythonize_gudhi.py.in
new file mode 100644
index 00000000..5a97e9f3
--- /dev/null
+++ b/cython/cythonize_gudhi.py.in
@@ -0,0 +1,48 @@
+from distutils.core import setup, Extension
+from Cython.Build import cythonize
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+gudhi = Extension(
+ "gudhi",
+ sources = ['gudhi.pyx',],
+ language = 'c++',
+ extra_compile_args=[@GUDHI_CYTHON_EXTRA_COMPILE_ARGS@],
+ extra_link_args=[@GUDHI_CYTHON_EXTRA_LINK_ARGS@],
+ libraries=[@GUDHI_CYTHON_LIBRARIES@],
+ library_dirs=[@GUDHI_CYTHON_LIBRARY_DIRS@],
+ include_dirs = [@GUDHI_CYTHON_INCLUDE_DIRS@],
+)
+
+setup(
+ name = 'gudhi',
+ author='Vincent Rouvreau',
+ author_email='gudhi-contact@lists.gforge.inria.fr',
+ version='0.1.0',
+ url='http://gudhi.gforge.inria.fr/',
+ ext_modules = cythonize(gudhi),
+)
diff --git a/cython/doc/Makefile.in b/cython/doc/Makefile.in
new file mode 100644
index 00000000..526350b3
--- /dev/null
+++ b/cython/doc/Makefile.in
@@ -0,0 +1,44 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS =
+SPHINXBUILD = @SPHINX_PATH@
+PAPER =
+BUILDDIR = _build
+
+# User-friendly check for sphinx-build
+ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
+$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
+endif
+
+# Internal variables.
+PAPEROPT_a4 = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+# the i18n builder cannot share the environment and doctrees with the others
+I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
+
+help:
+ @echo "Please use \`make <target>' where <target> is one of"
+ @echo " html to make standalone HTML files"
+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+ rm -f examples.inc
+ rm -rf $(BUILDDIR)/*
+
+# GUDHI specific : Examples.inc is generated with generate_examples.py (and deleted on clean)
+
+html:
+ ./generate_examples.py
+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+doctest:
+ $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+ @echo "Testing of doctests in the sources finished, look at the " \
+ "results in $(BUILDDIR)/doctest/output.txt."
diff --git a/cython/doc/_templates/layout.html b/cython/doc/_templates/layout.html
new file mode 100644
index 00000000..b11c1236
--- /dev/null
+++ b/cython/doc/_templates/layout.html
@@ -0,0 +1,270 @@
+{#
+ basic/layout.html
+ ~~~~~~~~~~~~~~~~~
+
+ Master layout template for Sphinx themes.
+
+ :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+#}
+{%- block doctype -%}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+{%- endblock %}
+{%- set reldelim1 = reldelim1 is not defined and ' &raquo;' or reldelim1 %}
+{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
+{%- set render_sidebar = (not embedded) and (not theme_nosidebar|tobool) and
+ (sidebars != []) %}
+{%- set url_root = pathto('', 1) %}
+{# XXX necessary? #}
+{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
+{%- if not embedded and docstitle %}
+ {%- set titlesuffix = " &mdash; "|safe + docstitle|e %}
+{%- else %}
+ {%- set titlesuffix = "" %}
+{%- endif %}
+
+{%- macro relbar() %}
+ <div class="related" role="navigation" aria-label="related navigation">
+ <h3>{{ _('Navigation') }}</h3>
+ <ul>
+ {%- for rellink in rellinks %}
+ <li class="right" {% if loop.first %}style="margin-right: 10px"{% endif %}>
+ <a href="{{ pathto(rellink[0]) }}" title="{{ rellink[1]|striptags|e }}"
+ {{ accesskey(rellink[2]) }}>{{ rellink[3] }}</a>
+ {%- if not loop.first %}{{ reldelim2 }}{% endif %}</li>
+ {%- endfor %}
+ {%- block rootrellink %}
+ <li class="nav-item nav-item-0"><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a>{{ reldelim1 }}</li>
+ {%- endblock %}
+ {%- for parent in parents %}
+ <li class="nav-item nav-item-{{ loop.index }}"><a href="{{ parent.link|e }}" {% if loop.last %}{{ accesskey("U") }}{% endif %}>{{ parent.title }}</a>{{ reldelim1 }}</li>
+ {%- endfor %}
+ {%- block relbaritems %} {% endblock %}
+ </ul>
+ </div>
+{%- endmacro %}
+
+{%- macro sidebar() %}
+ {%- if render_sidebar %}
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+ {%- block sidebarlogo %}
+ {%- if logo %}
+ <p class="logo"><a href="{{ pathto(master_doc) }}">
+ <img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/>
+ </a></p>
+ {%- endif %}
+ {%- endblock %}
+ {%- if sidebars != None %}
+ {#- new style sidebar: explicitly include/exclude templates #}
+ {%- for sidebartemplate in sidebars %}
+ {%- include sidebartemplate %}
+ {%- endfor %}
+ {%- else %}
+ {#- old style sidebars: using blocks -- should be deprecated #}
+ {%- block sidebartoc %}
+<h2><a href="index.html">GUDHI</a></h2>
+<h2><a href="installation.html">GUDHI installation</a></h2>
+<h2><a href="citation.html">Acknowledging the GUDHI library</a></h2>
+<h2><a href="genindex.html">Index</a></h2>
+<h2><a href="examples.html">Examples</a></h2>
+
+ {%- include "localtoc.html" %}
+ {%- endblock %}
+ {%- block sidebarrel %}
+ {%- include "relations.html" %}
+ {%- endblock %}
+ {%- block sidebarsourcelink %}
+ {%- include "sourcelink.html" %}
+ {%- endblock %}
+ {%- if customsidebar %}
+ {%- include customsidebar %}
+ {%- endif %}
+ {%- block sidebarsearch %}
+ {%- include "searchbox.html" %}
+ {%- endblock %}
+ {%- endif %}
+ </div>
+ </div>
+ {%- endif %}
+{%- endmacro %}
+
+{%- macro script() %}
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '{{ url_root }}',
+ VERSION: '{{ release|e }}',
+ COLLAPSE_INDEX: false,
+ FILE_SUFFIX: '{{ '' if no_search_suffix else file_suffix }}',
+ HAS_SOURCE: {{ has_source|lower }}
+ };
+ </script>
+ {%- for scriptfile in script_files %}
+ <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
+ {%- endfor %}
+{%- endmacro %}
+
+{%- macro css() %}
+<!-- GUDHI website css for header BEGIN -->
+<link rel="stylesheet" type="text/css" href="http://gudhi.gforge.inria.fr/assets/css/styles_feeling_responsive.css" />
+<!-- GUDHI website css for header END -->
+ <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
+ <link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
+ {%- for cssfile in css_files %}
+ <link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
+ {%- endfor %}
+{%- endmacro %}
+<!-- GUDHI website html class for header BEGIN -->
+<html xmlns="http://www.w3.org/1999/xhtml" class="no-js" lang="en">
+<!-- GUDHI website html class for header END -->
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset={{ encoding }}" />
+ {{ metatags }}
+ {%- block htmltitle %}
+ <title>{{ title|striptags|e }}{{ titlesuffix }}</title>
+ {%- endblock %}
+ {{ css() }}
+ {%- if not embedded %}
+ {{ script() }}
+ {%- if use_opensearch %}
+ <link rel="search" type="application/opensearchdescription+xml"
+ title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
+ href="{{ pathto('_static/opensearch.xml', 1) }}"/>
+ {%- endif %}
+ {%- if favicon %}
+ <link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
+ {%- endif %}
+ {%- endif %}
+{%- block linktags %}
+ {%- if hasdoc('about') %}
+ <link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
+ {%- endif %}
+ {%- if hasdoc('genindex') %}
+ <link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" />
+ {%- endif %}
+ {%- if hasdoc('search') %}
+ <link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" />
+ {%- endif %}
+ {%- if hasdoc('copyright') %}
+ <link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
+ {%- endif %}
+ <link rel="top" title="{{ docstitle|e }}" href="{{ pathto(master_doc) }}" />
+ {%- if parents %}
+ <link rel="up" title="{{ parents[-1].title|striptags|e }}" href="{{ parents[-1].link|e }}" />
+ {%- endif %}
+ {%- if next %}
+ <link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}" />
+ {%- endif %}
+ {%- if prev %}
+ <link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}" />
+ {%- endif %}
+{%- endblock %}
+{%- block extrahead %} {% endblock %}
+ </head>
+ <body role="document">
+ <!-- GUDHI website header BEGIN -->
+ <div id="navigation" class="sticky">
+ <nav class="top-bar" role="navigation" data-topbar>
+ <ul class="title-area">
+ <li class="name">
+ <h1 class="show-for-small-only"><a href="http://gudhi.gforge.inria.fr" class="icon-tree"> GUDHI C++ library</a></h1>
+ </li>
+ <!-- Remove the class "menu-icon" to get rid of menu icon. Take out "Menu" to just have icon alone -->
+ <li class="toggle-topbar menu-icon"><a href="#"><span>Navigation</span></a></li>
+ </ul>
+ <section class="top-bar-section">
+ <ul class="right">
+ <li class="divider"></li>
+ <li><a href="http://gudhi.gforge.inria.fr/contact/">Contact</a></li>
+ </ul>
+ <ul class="left">
+ <li><a href="http://gudhi.gforge.inria.fr/"> <img src="http://gudhi.gforge.inria.fr/assets/img/home.png" alt="&nbsp;&nbsp;GUDHI">&nbsp;&nbsp;GUDHI </a></li>
+ <li class="divider"></li>
+ <li class="has-dropdown">
+ <a href="#">Project</a>
+ <ul class="dropdown">
+ <li><a href="http://gudhi.gforge.inria.fr/people/">People</a></li>
+ <li><a href="http://gudhi.gforge.inria.fr/keepintouch/">Keep in touch</a></li>
+ <li><a href="http://gudhi.gforge.inria.fr/partners/">Partners and Funding</a></li>
+ <li><a href="http://gudhi.gforge.inria.fr/relatedprojects/">Related projects</a></li>
+ <li><a href="http://gudhi.gforge.inria.fr/theyaretalkingaboutus/">They are talking about us</a></li>
+ </ul>
+ </li>
+ <li class="divider"></li>
+ <li class="has-dropdown">
+ <a href="#">Download</a>
+ <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>
+ </ul>
+ </li>
+ <li class="divider"></li>
+ <li class="has-dropdown">
+ <a href="#">Documentation</a>
+ <ul class="dropdown">
+ <li><a href="http://gudhi.gforge.inria.fr/doc/latest/">C++ documentation</a></li>
+ <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>
+ </ul>
+ </li>
+ <li class="divider"></li>
+ <li><a href="http://gudhi.gforge.inria.fr/interfaces/">Interfaces</a></li>
+ <li class="divider"></li>
+ </ul>
+ </section>
+ </nav>
+ </div><!-- /#navigation -->
+ <!-- GUDHI website header BEGIN -->
+
+
+{%- block header %}{% endblock %}
+
+{%- block relbar1 %}{% endblock %}
+
+{%- block content %}
+ {%- block sidebar1 %} {# possible location for sidebar #} {% endblock %}
+
+ <div class="document">
+ {%- block document %}
+ <div class="documentwrapper">
+ {%- if render_sidebar %}
+ <div class="bodywrapper">
+ {%- endif %}
+ <div class="body" role="main">
+ {% block body %} {% endblock %}
+ </div>
+ {%- if render_sidebar %}
+ </div>
+ {%- endif %}
+ </div>
+ {%- endblock %}
+
+ {%- block sidebar2 %}{{ sidebar() }}{% endblock %}
+ <div class="clearer"></div>
+ </div>
+{%- endblock %}
+
+{%- block relbar2 %}{% endblock %}
+
+{%- block footer %}
+ <div class="footer" role="contentinfo">
+ {%- if show_copyright %}
+ {%- if hasdoc('copyright') %}
+ {% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
+ {%- else %}
+ {% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %}
+ {%- endif %}
+ {%- endif %}
+ {%- if last_updated %}
+ {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
+ {%- endif %}
+ {%- if show_sphinx %}
+ {% trans sphinx_version=sphinx_version|e %}Created using <a href="http://sphinx-doc.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %}
+ {%- endif %}
+ </div>
+{%- endblock %}
+ </body>
+</html>
+
diff --git a/cython/doc/alpha_complex_ref.rst b/cython/doc/alpha_complex_ref.rst
new file mode 100644
index 00000000..6a122b09
--- /dev/null
+++ b/cython/doc/alpha_complex_ref.rst
@@ -0,0 +1,10 @@
+==============================
+Alpha complex reference manual
+==============================
+
+.. autoclass:: gudhi.AlphaComplex
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+ .. automethod:: gudhi.AlphaComplex.__init__
diff --git a/cython/doc/alpha_complex_sum.rst b/cython/doc/alpha_complex_sum.rst
new file mode 100644
index 00000000..8437e901
--- /dev/null
+++ b/cython/doc/alpha_complex_sum.rst
@@ -0,0 +1,22 @@
+================================================================= =================================== ===================================
+:Author: Vincent Rouvreau :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3
+:Requires: CGAL :math:`\geq` 4.7.0 Eigen3
+================================================================= =================================== ===================================
+
++----------------------------------------------------------------+------------------------------------------------------------------------+
+| .. figure:: | Alpha_complex is a simplicial complex constructed from the finite |
+| img/alpha_complex_representation.png | cells of a Delaunay Triangulation. |
+| :alt: Alpha complex representation | |
+| :figclass: align-center | The filtration value of each simplex is computed as the square of the |
+| | circumradius of the simplex if the circumsphere is empty (the simplex |
+| Alpha complex representation | is then said to be Gabriel), and as the minimum of the filtration |
+| | values of the codimension 1 cofaces that make it not Gabriel |
+| | otherwise. All simplices that have a filtration value strictly |
+| | greater than a given alpha squared value are not inserted into the |
+| | complex. |
+| | |
+| | This package requires having CGAL version 4.7 or higher (4.8.1 is |
+| | advised for better perfomances). |
++----------------------------------------------------------------+------------------------------------------------------------------------+
+| :doc:`alpha_complex_user` | :doc:`alpha_complex_ref` |
++----------------------------------------------------------------+------------------------------------------------------------------------+
diff --git a/cython/doc/alpha_complex_user.rst b/cython/doc/alpha_complex_user.rst
new file mode 100644
index 00000000..e8268ef1
--- /dev/null
+++ b/cython/doc/alpha_complex_user.rst
@@ -0,0 +1,205 @@
+Alpha complex user manual
+=========================
+Definition
+----------
+
+.. include:: alpha_complex_sum.rst
+
+Alpha_complex is constructing a :doc:`Simplex_tree <simplex_tree_sum>` using
+`Delaunay Triangulation <http://doc.cgal.org/latest/Triangulation/index.html#Chapter_Triangulations>`_
+:cite:`cgal:hdj-t-15b` from `CGAL <http://www.cgal.org/>`_ (the Computational Geometry Algorithms Library
+:cite:`cgal:eb-15b`).
+
+Remarks
+^^^^^^^
+When Alpha_complex is constructed with an infinite value of :math:`\alpha`, the complex is a Delaunay complex.
+
+Example from points
+-------------------
+
+This example builds the Delaunay triangulation from the given points, and initializes the alpha complex with it:
+
+.. testcode::
+
+ import gudhi
+ alpha_complex = gudhi.AlphaComplex(points=[[1, 1], [7, 0], [4, 6], [9, 6], [0, 14], [2, 19], [9, 17]])
+
+ simplex_tree = alpha_complex.create_simplex_tree(max_alpha_square=60.0)
+ result_str = 'Alpha complex is of dimension ' + repr(simplex_tree.dimension()) + ' - ' + \
+ repr(simplex_tree.num_simplices()) + ' simplices - ' + \
+ repr(simplex_tree.num_vertices()) + ' vertices.'
+ print(result_str)
+ fmt = '%s -> %.2f'
+ for filtered_value in simplex_tree.get_filtration():
+ print(fmt % tuple(filtered_value))
+
+The output is:
+
+.. testoutput::
+
+ Alpha complex is of dimension 2 - 25 simplices - 7 vertices.
+ [0] -> 0.00
+ [1] -> 0.00
+ [2] -> 0.00
+ [3] -> 0.00
+ [4] -> 0.00
+ [5] -> 0.00
+ [6] -> 0.00
+ [2, 3] -> 6.25
+ [4, 5] -> 7.25
+ [0, 2] -> 8.50
+ [0, 1] -> 9.25
+ [1, 3] -> 10.00
+ [1, 2] -> 11.25
+ [1, 2, 3] -> 12.50
+ [0, 1, 2] -> 13.00
+ [5, 6] -> 13.25
+ [2, 4] -> 20.00
+ [4, 6] -> 22.74
+ [4, 5, 6] -> 22.74
+ [3, 6] -> 30.25
+ [2, 6] -> 36.50
+ [2, 3, 6] -> 36.50
+ [2, 4, 6] -> 37.24
+ [0, 4] -> 59.71
+ [0, 2, 4] -> 59.71
+
+
+Algorithm
+---------
+
+Data structure
+^^^^^^^^^^^^^^
+
+In order to build the alpha complex, first, a Simplex tree is built from the cells of a Delaunay Triangulation.
+(The filtration value is set to NaN, which stands for unknown value):
+
+.. figure::
+ img/alpha_complex_doc.png
+ :figclass: align-center
+ :alt: Simplex tree structure construction example
+
+ Simplex tree structure construction example
+
+Filtration value computation algorithm
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ **for** i : dimension :math:`\rightarrow` 0 **do**
+ **for all** :math:`\sigma` of dimension i
+ **if** filtration(:math:`\sigma`) is NaN **then**
+ filtration(:math:`\sigma`) = :math:`\alpha^2(\sigma)`
+ **end if**
+
+ *//propagate alpha filtration value*
+
+ **for all** :math:`\tau` face of :math:`\sigma`
+ **if** filtration(:math:`\tau`) is not NaN **then**
+ filtration(:math:`\tau`) = filtration(:math:`\sigma`)
+ **end if**
+ **end for**
+ **end for**
+ **end for**
+
+ make_filtration_non_decreasing()
+
+ prune_above_filtration()
+
+Dimension 2
+^^^^^^^^^^^
+
+From the example above, it means the algorithm looks into each triangle ([0,1,2], [0,2,4], [1,2,3], ...),
+computes the filtration value of the triangle, and then propagates the filtration value as described
+here:
+
+.. figure::
+ img/alpha_complex_doc_420.png
+ :figclass: align-center
+ :alt: Filtration value propagation example
+
+ Filtration value propagation example
+
+Dimension 1
+^^^^^^^^^^^
+
+Then, the algorithm looks into each edge ([0,1], [0,2], [1,2], ...),
+computes the filtration value of the edge (in this case, propagation will have no effect).
+
+Dimension 0
+^^^^^^^^^^^
+
+Finally, the algorithm looks into each vertex ([0], [1], [2], [3], [4], [5] and [6]) and
+sets the filtration value (0 in case of a vertex - propagation will have no effect).
+
+Non decreasing filtration values
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+As the squared radii computed by CGAL are an approximation, it might happen that these alpha squared values do not
+quite define a proper filtration (i.e. non-decreasing with respect to inclusion).
+We fix that up by calling `Simplex_tree::make_filtration_non_decreasing()` (cf.
+`C++ version <http://gudhi.gforge.inria.fr/doc/latest/index.html>`_).
+
+Prune above given filtration value
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The simplex tree is pruned from the given maximum alpha squared value (cf. `Simplex_tree::prune_above_filtration()`
+int he `C++ version <http://gudhi.gforge.inria.fr/doc/latest/index.html>`_).
+In the following example, the value is given by the user as argument of the program.
+
+
+Example from OFF file
+^^^^^^^^^^^^^^^^^^^^^
+
+This example builds the Delaunay triangulation from the points given by an OFF file, and initializes the alpha complex
+with it.
+
+
+Then, it is asked to display information about the alpha complex:
+
+.. testcode::
+
+ import gudhi
+ alpha_complex = gudhi.AlphaComplex(off_file='alphacomplexdoc.off')
+ simplex_tree = alpha_complex.create_simplex_tree(max_alpha_square=59.0)
+ result_str = 'Alpha complex is of dimension ' + repr(simplex_tree.dimension()) + ' - ' + \
+ repr(simplex_tree.num_simplices()) + ' simplices - ' + \
+ repr(simplex_tree.num_vertices()) + ' vertices.'
+ print(result_str)
+ fmt = '%s -> %.2f'
+ for filtered_value in simplex_tree.get_filtration():
+ print(fmt % tuple(filtered_value))
+
+the program output is:
+
+.. testoutput::
+
+ Alpha complex is of dimension 2 - 23 simplices - 7 vertices.
+ [0] -> 0.00
+ [1] -> 0.00
+ [2] -> 0.00
+ [3] -> 0.00
+ [4] -> 0.00
+ [5] -> 0.00
+ [6] -> 0.00
+ [2, 3] -> 6.25
+ [4, 5] -> 7.25
+ [0, 2] -> 8.50
+ [0, 1] -> 9.25
+ [1, 3] -> 10.00
+ [1, 2] -> 11.25
+ [1, 2, 3] -> 12.50
+ [0, 1, 2] -> 13.00
+ [5, 6] -> 13.25
+ [2, 4] -> 20.00
+ [4, 6] -> 22.74
+ [4, 5, 6] -> 22.74
+ [3, 6] -> 30.25
+ [2, 6] -> 36.50
+ [2, 3, 6] -> 36.50
+ [2, 4, 6] -> 37.24
+
+CGAL citations
+==============
+
+.. bibliography:: how_to_cite_cgal.bib
+ :filter: docnames
+ :style: unsrt
diff --git a/cython/doc/bottleneck_distance_sum.rst b/cython/doc/bottleneck_distance_sum.rst
new file mode 100644
index 00000000..5c475d0d
--- /dev/null
+++ b/cython/doc/bottleneck_distance_sum.rst
@@ -0,0 +1,15 @@
+================================================================= =================================== ===================================
+:Author: François Godi :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3
+:Requires: CGAL :math:`\geq` 4.8.0
+================================================================= =================================== ===================================
+
++-----------------------------------------------------------------+----------------------------------------------------------------------+
+| .. figure:: | Bottleneck distance measures the similarity between two persistence |
+| img/perturb_pd.png | diagrams. It's the shortest distance b for which there exists a |
+| :figclass: align-center | perfect matching between the points of the two diagrams (+ all the |
+| | diagonal points) such that any couple of matched points are at |
+| Bottleneck distance is the length of | distance at most b. |
+| the longest edge | |
++-----------------------------------------------------------------+----------------------------------------------------------------------+
+| :doc:`bottleneck_distance_user` | |
++-----------------------------------------------------------------+----------------------------------------------------------------------+
diff --git a/cython/doc/bottleneck_distance_user.rst b/cython/doc/bottleneck_distance_user.rst
new file mode 100644
index 00000000..0066992f
--- /dev/null
+++ b/cython/doc/bottleneck_distance_user.rst
@@ -0,0 +1,36 @@
+Bottleneck distance user manual
+===============================
+Definition
+----------
+
+.. include:: bottleneck_distance_sum.rst
+
+Function
+--------
+.. autofunction:: gudhi.bottleneck_distance
+
+
+Basic example
+-------------
+
+This example computes the bottleneck distance from 2 persistence diagrams:
+
+.. testcode::
+
+ import gudhi
+
+ diag1 = [[2.7, 3.7],[9.6, 14.],[34.2, 34.974], [3.,float('Inf')]]
+ diag2 = [[2.8, 4.45],[9.5, 14.1],[3.2,float('Inf')]]
+
+ message = "Bottleneck distance approximation=" + '%.2f' % gudhi.bottleneck_distance(diag1, diag2, 0.1)
+ print(message)
+
+ message = "Bottleneck distance exact value=" + '%.2f' % gudhi.bottleneck_distance(diag1, diag2, 0)
+ print(message)
+
+The output is:
+
+.. testoutput::
+
+ Bottleneck distance approximation=0.81
+ Bottleneck distance exact value=0.75
diff --git a/cython/doc/citation.rst b/cython/doc/citation.rst
new file mode 100644
index 00000000..6cdfb7cc
--- /dev/null
+++ b/cython/doc/citation.rst
@@ -0,0 +1,15 @@
+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 GUDHI bibtex entries for the modules of the User and Reference
+Manual, as well as for publications directly related to the GUDHI library.
+
+GUDHI bibtex
+************
+
+.. literalinclude:: how_to_cite_gudhi.bib
diff --git a/cython/doc/conf.py b/cython/doc/conf.py
new file mode 100755
index 00000000..42bfd59c
--- /dev/null
+++ b/cython/doc/conf.py
@@ -0,0 +1,278 @@
+# -*- coding: utf-8 -*-
+#
+# GUDHI documentation build configuration file, created by
+# sphinx-quickstart on Thu Jun 30 09:55:51 2016.
+#
+# This file is execfile()d with the current directory set to its
+# containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys
+import os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# Path to Gudhi.so from source path
+sys.path.insert(0, os.path.abspath('..'))
+
+# -- General configuration ------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+ 'matplotlib.sphinxext.plot_directive',
+ 'sphinx.ext.autodoc',
+ 'sphinx.ext.doctest',
+ 'sphinx.ext.todo',
+ 'sphinx.ext.mathjax',
+ 'sphinx.ext.ifconfig',
+ 'sphinx.ext.viewcode',
+ 'sphinxcontrib.bibtex',
+]
+
+todo_include_todos = True
+# plot option : do not show hyperlinks (Source code, png, hires.png, pdf)
+plot_html_show_source_link = False
+plot_html_show_formats = False
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'GUDHI'
+copyright = u'2016, GUDHI Editorial Board'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '2.0'
+# The full version, including alpha/beta/rc tags.
+release = '2.0.0'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ['_build']
+
+# The reST default role (used for this markup: `text`) to use for all
+# documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+# If true, keep warnings as "system message" paragraphs in the built documents.
+#keep_warnings = False
+
+
+# -- Options for HTML output ----------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+html_theme = 'classic'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+html_theme_options = {
+ "sidebarbgcolor": "#A1ADCD",
+ "sidebartextcolor": "black",
+ "sidebarlinkcolor": "#334D5C",
+}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo =
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon =
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# Add any extra paths that contain custom files (such as robots.txt or
+# .htaccess) here, relative to this directory. These files are copied
+# directly to the root of the documentation.
+#html_extra_path = []
+
+# 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'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {'installation': 'installation.html'}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'GUDHIdoc'
+
+
+# -- Options for LaTeX output ---------------------------------------------
+
+latex_elements = {
+# The paper size ('letterpaper' or 'a4paper').
+#'papersize': 'letterpaper',
+
+# The font size ('10pt', '11pt' or '12pt').
+#'pointsize': '10pt',
+
+# Additional stuff for the LaTeX preamble.
+#'preamble': '',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+# author, documentclass [howto, manual, or own class]).
+latex_documents = [
+ ('index', 'GUDHI.tex', u'GUDHI Documentation',
+ u'Vincent Rouvreau', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output ---------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+ ('index', 'gudhi', u'GUDHI Documentation',
+ [u'Vincent Rouvreau'], 1)
+]
+
+# If true, show URL addresses after external links.
+#man_show_urls = False
+
+
+# -- Options for Texinfo output -------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+# dir menu entry, description, category)
+texinfo_documents = [
+ ('index', 'GUDHI', u'GUDHI Documentation',
+ u'Vincent Rouvreau', 'GUDHI', 'One line description of project.',
+ 'Miscellaneous'),
+]
+
+# Documents to append as an appendix to all manuals.
+#texinfo_appendices = []
+
+# If false, no module index is generated.
+#texinfo_domain_indices = True
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+#texinfo_show_urls = 'footnote'
+
+# If true, do not generate a @detailmenu in the "Top" node's menu.
+#texinfo_no_detailmenu = False
diff --git a/cython/doc/cubical_complex_ref.rst b/cython/doc/cubical_complex_ref.rst
new file mode 100644
index 00000000..84aa4223
--- /dev/null
+++ b/cython/doc/cubical_complex_ref.rst
@@ -0,0 +1,9 @@
+Cubical complex reference manual
+################################
+
+.. autoclass:: gudhi.CubicalComplex
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+ .. automethod:: gudhi.CubicalComplex.__init__
diff --git a/cython/doc/cubical_complex_sum.rst b/cython/doc/cubical_complex_sum.rst
new file mode 100644
index 00000000..3ddf6375
--- /dev/null
+++ b/cython/doc/cubical_complex_sum.rst
@@ -0,0 +1,15 @@
+================================================================= =================================== ===================================
+:Author: Pawel Dlotko :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3
+================================================================= =================================== ===================================
+
++-----------------------------------------------------------------+----------------------------------------------------------------------+
+| .. figure:: | The cubical complex is an example of a structured complex useful in |
+| img/Cubical_complex_representation.png | computational mathematics (specially rigorous numerics) and image |
+| :alt: Cubical complex representation | analysis. |
+| :figclass: align-center | |
+| | |
+| Cubical complex representation | |
++-----------------------------------------------------------------+----------------------------------------------------------------------+
+| :doc:`cubical_complex_user` | * :doc:`cubical_complex_ref` |
+| | * :doc:`periodic_cubical_complex_ref` |
++-----------------------------------------------------------------+----------------------------------------------------------------------+
diff --git a/cython/doc/cubical_complex_user.rst b/cython/doc/cubical_complex_user.rst
new file mode 100644
index 00000000..344b9554
--- /dev/null
+++ b/cython/doc/cubical_complex_user.rst
@@ -0,0 +1,160 @@
+Cubical complex user manual
+===========================
+Definition
+----------
+
+===================================== ===================================== =====================================
+:Author: Pawel Dlotko :Introduced in: GUDHI PYTHON 2.0.0 :Copyright: GPL v3
+===================================== ===================================== =====================================
+
++---------------------------------------------+----------------------------------------------------------------------+
+| :doc:`cubical_complex_user` | * :doc:`cubical_complex_ref` |
+| | * :doc:`periodic_cubical_complex_ref` |
++---------------------------------------------+----------------------------------------------------------------------+
+
+The cubical complex is an example of a structured complex useful in computational mathematics (specially rigorous
+numerics) and image analysis.
+
+An *elementary interval* is an interval of a form :math:`[n,n+1]`, or :math:`[n,n]`, for :math:`n \in \mathcal{Z}`.
+The first one is called *non-degenerate*, while the second one is a *degenerate* interval. A
+*boundary of a elementary interval* is a chain :math:`\partial [n,n+1] = [n+1,n+1]-[n,n]` in case of
+non-degenerated elementary interval and :math:`\partial [n,n] = 0` in case of degenerate elementary interval. An
+*elementary cube* :math:`C` is a product of elementary intervals, :math:`C=I_1 \times \ldots \times I_n`.
+*Embedding dimension* of a cube is n, the number of elementary intervals (degenerate or not) in the product.
+A *dimension of a cube* :math:`C=I_1 \times ... \times I_n` is the number of non degenerate elementary
+intervals in the product. A *boundary of a cube* :math:`C=I_1 \times \ldots \times I_n` is a chain obtained
+in the following way:
+
+.. math::
+
+ \partial C = (\partial I_1 \times \ldots \times I_n) + (I_1 \times \partial I_2 \times \ldots \times I_n) +
+ \ldots + (I_1 \times I_2 \times \ldots \times \partial I_n).
+
+A *cubical complex* :math:`\mathcal{K}` is a collection of cubes closed under operation of taking boundary
+(i.e. boundary of every cube from the collection is in the collection). A cube :math:`C` in cubical complex
+:math:`\mathcal{K}` is *maximal* if it is not in a boundary of any other cube in :math:`\mathcal{K}`. A
+*support* of a cube :math:`C` is the set in :math:`\mathbb{R}^n` occupied by :math:`C` (:math:`n` is the embedding
+dimension of :math:`C`).
+
+Cubes may be equipped with a filtration values in which case we have filtered cubical complex. All the cubical
+complexes considered in this implementation are filtered cubical complexes (although, the range of a filtration may
+be a set of two elements).
+
+For further details and theory of cubical complexes, please consult :cite:`kaczynski2004computational` as well as the
+following paper :cite:`peikert2012topological`.
+
+Data structure.
+---------------
+
+The implementation of Cubical complex provides a representation of complexes that occupy a rectangular region in
+:math:`\mathbb{R}^n`. This extra assumption allows for a memory efficient way of storing cubical complexes in a form
+of so called bitmaps. Let
+:math:`R = [b_1,e_1] \times \ldots \times [b_n,e_n]`, for :math:`b_1,...b_n,e_1,...,e_n \in \mathbb{Z}`,
+:math:`b_i \leq d_i` be the considered rectangular region and let :math:`\mathcal{K}` be a filtered
+cubical complex having the rectangle :math:`R` as its support. Note that the structure of the coordinate system gives
+a way a lexicographical ordering of cells of :math:`\mathcal{K}`. This ordering is a base of the presented
+bitmap-based implementation. In this implementation, the whole cubical complex is stored as a vector of the values
+of filtration. This, together with dimension of :math:`\mathcal{K}` and the sizes of :math:`\mathcal{K}` in all
+directions, allows to determine, dimension, neighborhood, boundary and coboundary of every cube
+:math:`C \in \mathcal{K}`.
+
+.. figure::
+ img/Cubical_complex_representation.png
+ :alt: Cubical complex.
+ :figclass: align-center
+
+ Cubical complex.
+
+Note that the cubical complex in the figure above is, in a natural way, a product of one dimensional cubical
+complexes in :math:`\mathbb{R}`. The number of all cubes in each direction is equal :math:`2n+1`, where :math:`n` is
+the number of maximal cubes in the considered direction. Let us consider a cube at the position :math:`k` in the
+bitmap.
+Knowing the sizes of the bitmap, by a series of modulo operation, we can determine which elementary intervals are
+present in the product that gives the cube :math:`C`. In a similar way, we can compute boundary and the coboundary of
+each cube. Further details can be found in the literature.
+
+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 :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::
+ img/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:: cubicalcomplexdoc.txt
+
+.. centered:: cubicalcomplexdoc.txt
+
+.. testcode::
+
+ import gudhi
+ cubical_complex = gudhi.CubicalComplex(perseus_file='cubicalcomplexdoc.txt')
+ result_str = 'Cubical complex is of dimension ' + repr(cubical_complex.dimension()) + ' - ' + \
+ repr(cubical_complex.num_simplices()) + ' simplices.'
+ print(result_str)
+
+the program output is:
+
+.. testoutput::
+
+ Cubical complex is of dimension 2 - 49 simplices.
+
+Periodic boundary conditions.
+-----------------------------
+
+Often one would like to impose periodic boundary conditions to the cubical complex (cf.
+:doc:`periodic_cubical_complex_ref`).
+Let :math:`I_1\times ... \times I_n` be a box that is decomposed with a cubical complex :math:`\mathcal{K}`.
+Imposing periodic boundary conditions in the direction i, means that the left and the right side of a complex
+: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:: periodiccubicalcomplexdoc.txt
+
+.. centered:: periodiccubicalcomplexdoc.txt
+
+Indicate that we have imposed periodic boundary conditions in the direction x, but not in the direction y.
+
+.. testcode::
+
+ import gudhi
+ periodic_cc = gudhi.PeriodicCubicalComplex(perseus_file='periodiccubicalcomplexdoc.txt')
+ 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.
+---------
+
+End user programs are available in cython/example/ folder.
+
+Bibliography
+============
+
+.. bibliography:: bibliography.bib
+ :filter: docnames
+ :style: unsrt
diff --git a/cython/doc/euclidean_strong_witness_complex_ref.rst b/cython/doc/euclidean_strong_witness_complex_ref.rst
new file mode 100644
index 00000000..bebf0f9a
--- /dev/null
+++ b/cython/doc/euclidean_strong_witness_complex_ref.rst
@@ -0,0 +1,10 @@
+=================================================
+Euclidean strong witness complex reference manual
+=================================================
+
+.. autoclass:: gudhi.EuclideanStrongWitnessComplex
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+ .. automethod:: gudhi.EuclideanStrongWitnessComplex.__init__
diff --git a/cython/doc/euclidean_witness_complex_ref.rst b/cython/doc/euclidean_witness_complex_ref.rst
new file mode 100644
index 00000000..29b8806f
--- /dev/null
+++ b/cython/doc/euclidean_witness_complex_ref.rst
@@ -0,0 +1,10 @@
+==========================================
+Euclidean witness complex reference manual
+==========================================
+
+.. autoclass:: gudhi.EuclideanWitnessComplex
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+ .. automethod:: gudhi.EuclideanWitnessComplex.__init__
diff --git a/cython/doc/examples.rst b/cython/doc/examples.rst
new file mode 100644
index 00000000..a89e0596
--- /dev/null
+++ b/cython/doc/examples.rst
@@ -0,0 +1,4 @@
+Examples
+########
+
+.. include:: examples.inc
diff --git a/cython/doc/generate_examples.py b/cython/doc/generate_examples.py
new file mode 100755
index 00000000..d64d506c
--- /dev/null
+++ b/cython/doc/generate_examples.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python
+
+from os import listdir
+
+"""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/>.
+"""
+
+__author__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2017 INRIA"
+__license__ = "GPL v3"
+
+"""
+generate_examples.py generates examples.inc to be included in examples.rst.
+Refer to Makefile and make.bat to see if it is correctly launched.
+"""
+
+output_file = open('examples.inc','w')
+
+output_file.write('.. only:: builder_html\n\n')
+
+for file in listdir('../example/'):
+ output_file.write(" * :download:`" + file + " <../example/" + file + ">`\n")
+
+output_file.close()
diff --git a/cython/doc/img/graphical_tools_representation.png b/cython/doc/img/graphical_tools_representation.png
new file mode 100644
index 00000000..9759f7ba
--- /dev/null
+++ b/cython/doc/img/graphical_tools_representation.png
Binary files differ
diff --git a/cython/doc/index.rst b/cython/doc/index.rst
new file mode 100644
index 00000000..94dbc65a
--- /dev/null
+++ b/cython/doc/index.rst
@@ -0,0 +1,87 @@
+GUDHI documentation
+###################
+
+.. image:: img/Gudhi_banner.png
+ :align: center
+
+Introduction
+************
+
+The Gudhi library (Geometry Understanding in Higher Dimensions) is a generic
+open source `C++ library <http://gudhi.gforge.inria.fr/doc/latest/>`_, with a
+`Python interface <http://gudhi.gforge.inria.fr/python/latest/>`_, for
+Computational Topology and Topological Data Analysis
+(`TDA <https://en.wikipedia.org/wiki/Topological_data_analysis>`_).
+The GUDHI library intends to help the development of new algorithmic solutions
+in TDA and their transfer to applications. It provides robust, efficient,
+flexible and easy to use implementations of state-of-the-art algorithms and
+data structures.
+
+The current release of the GUDHI library includes:
+
+* Data structures to represent, construct and manipulate simplicial complexes.
+* Algorithms to compute persistent homology and multi-field persistent homology.
+* Simplication of simplicial complexes by edge contraction.
+
+All data-structures are generic and several of their aspects can be
+parameterized via template classes. We refer to :cite:`gudhilibrary_ICMS14`
+for a detailed description of the design of the library.
+
+Data structures
+***************
+
+Alpha complex
+=============
+
+.. include:: alpha_complex_sum.rst
+
+Cubical complex
+===============
+
+.. include:: cubical_complex_sum.rst
+
+Rips complex
+============
+
+.. include:: rips_complex_sum.rst
+
+Simplex tree
+============
+
+.. include:: simplex_tree_sum.rst
+
+Tangential complex
+==================
+
+.. include:: tangential_complex_sum.rst
+
+Witness complex
+===============
+
+.. include:: witness_complex_sum.rst
+
+
+Toolbox
+*******
+
+Bottleneck distance
+===================
+
+.. include:: bottleneck_distance_sum.rst
+
+Persistence cohomology
+======================
+
+.. include:: persistent_cohomology_sum.rst
+
+Persistence graphical tools
+===========================
+
+.. include:: persistence_graphical_tools_sum.rst
+
+Bibliography
+************
+
+.. bibliography:: bibliography.bib
+ :filter: docnames
+ :style: unsrt
diff --git a/cython/doc/installation.rst b/cython/doc/installation.rst
new file mode 100644
index 00000000..f98a5039
--- /dev/null
+++ b/cython/doc/installation.rst
@@ -0,0 +1,176 @@
+Installation
+############
+
+Compiling
+*********
+
+The library uses c++11 and requires `Boost <http://www.boost.org/>`_ with
+version 1.48.0 or more recent. It is a multi-platform library and compiles on
+Linux, Mac OSX and Visual Studio 2015.
+It also requires cmake to generate makefiles, and cython to compile the
+library.
+
+On `Windows <https://wiki.python.org/moin/WindowsCompilers>`_ , only Python
+3.5 and 3.6 are available because of the required Visual Studio version.
+
+On other systems, if you have several Python/cython installed, the version 2.X
+will be used by default, but you can force it by adding
+:code:`-DPython_ADDITIONAL_VERSIONS=3` to the cmake command.
+
+GUDHI Cythonization
+===================
+
+To build the GUDHI cython module, run the following commands in a terminal:
+
+.. code-block:: bash
+
+ cd /path-to-gudhi/
+ mkdir build
+ cd build/
+ cmake ..
+ make cython
+
+Test suites
+===========
+
+To test your build, `py.test <http://doc.pytest.org>`_ is optional. Run the
+following command in a terminal:
+
+.. code-block:: bash
+
+ cd /path-to-gudhi/build/cython
+ # For windows, you have to set PYTHONPATH environment variable
+ export PYTHONPATH='$PYTHONPATH:/path-to-gudhi/build/cython'
+ ctest -R py_test
+
+Documentation
+=============
+
+To build the documentation, `sphinx-doc <http://http://www.sphinx-doc.org>`_ is
+required. Please refer to *conf.py* file to see which
+`sphinx-doc <http://http://www.sphinx-doc.org>`_ modules are required to
+generate the documentation. Run the following commands in a terminal:
+
+.. code-block:: bash
+
+ make sphinx
+
+Optional third-party library
+****************************
+
+CGAL
+====
+
+The :doc:`Alpha complex </alpha_complex_user>`,
+:doc:`Tangential complex </tangential_complex_user>` and
+:doc:`Witness complex </witness_complex_user>` data structures, and
+:doc:`Bottleneck distance </bottleneck_distance_user>` requires CGAL, which is a
+C++ library which provides easy access to efficient and reliable geometric
+algorithms.
+
+Having CGAL version 4.6.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 Computational Geometry Algorithms Library:
+
+.. only:: builder_html
+
+ * :download:`euclidean_strong_witness_complex_diagram_persistence_from_off_file_example.py <../example/euclidean_strong_witness_complex_diagram_persistence_from_off_file_example.py>`
+ * :download:`euclidean_witness_complex_diagram_persistence_from_off_file_example.py <../example/euclidean_witness_complex_diagram_persistence_from_off_file_example.py>`
+
+The following example requires CGAL version ≥ 4.7.0:
+
+.. only:: builder_html
+
+ * :download:`alpha_complex_diagram_persistence_from_off_file_example.py <../example/alpha_complex_diagram_persistence_from_off_file_example.py>`
+ * :download:`alpha_complex_from_points_example.py <../example/alpha_complex_from_points_example.py>`
+
+The following example requires CGAL version ≥ 4.8.0:
+
+.. only:: builder_html
+
+ * :download:`bottleneck_basic_example.py <../example/bottleneck_basic_example.py>`
+ * :download:`tangential_complex_plain_homology_from_off_file_example.py <../example/tangential_complex_plain_homology_from_off_file_example.py>`
+
+Eigen3
+======
+
+The :doc:`Alpha complex </alpha_complex_user>`,
+:doc:`Tangential complex </tangential_complex_user>` and
+:doc:`Witness complex </witness_complex_user>` data structures and few
+examples requires `Eigen3 <http://eigen.tuxfamily.org/>`_, a C++ template
+library for linear algebra: matrices, vectors, numerical solvers, and related
+algorithms.
+
+The following examples require the `Eigen3 <http://eigen.tuxfamily.org/>`_:
+
+.. only:: builder_html
+
+ * :download:`alpha_complex_diagram_persistence_from_off_file_example.py <../example/alpha_complex_diagram_persistence_from_off_file_example.py>`
+ * :download:`alpha_complex_from_points_example.py <../example/alpha_complex_from_points_example.py>`
+ * :download:`tangential_complex_plain_homology_from_off_file_example.py <../example/tangential_complex_plain_homology_from_off_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>`
+ * :download:`euclidean_witness_complex_diagram_persistence_from_off_file_example.py <../example/euclidean_witness_complex_diagram_persistence_from_off_file_example.py>`
+
+Matplotlib
+==========
+
+The :doc:`persistence graphical tools </persistence_graphical_tools_user>`
+module requires `Matplotlib <http://matplotlib.org>`_, a Python 2D plotting
+library which produces publication quality figures in a variety of hardcopy
+formats and interactive environments across platforms.
+
+The following examples require the `Matplotlib <http://matplotlib.org>`_:
+
+.. only:: builder_html
+
+ * :download:`alpha_complex_diagram_persistence_from_off_file_example.py <../example/alpha_complex_diagram_persistence_from_off_file_example.py>`
+ * :download:`gudhi_graphical_tools_example.py <../example/gudhi_graphical_tools_example.py>`
+ * :download:`periodic_cubical_complex_barcode_persistence_from_perseus_file_example.py <../example/periodic_cubical_complex_barcode_persistence_from_perseus_file_example.py>`
+ * :download:`rips_complex_diagram_persistence_from_off_file_example.py <../example/rips_complex_diagram_persistence_from_off_file_example.py>`
+ * :download:`rips_persistence_diagram.py <../example/rips_persistence_diagram.py>`
+ * :download:`rips_complex_diagram_persistence_from_distance_matrix_file_example.py <../example/rips_complex_diagram_persistence_from_distance_matrix_file_example.py>`
+ * :download:`tangential_complex_plain_homology_from_off_file_example.py <../example/tangential_complex_plain_homology_from_off_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>`
+ * :download:`euclidean_witness_complex_diagram_persistence_from_off_file_example.py <../example/euclidean_witness_complex_diagram_persistence_from_off_file_example.py>`
+
+Numpy
+=====
+
+The :doc:`persistence graphical tools </persistence_graphical_tools_user>`
+module requires `NumPy <http://numpy.org>`_, a fundamental package for
+scientific computing with Python.
+
+The following examples require the `NumPy <http://numpy.org>`_:
+
+.. only:: builder_html
+
+ * :download:`alpha_complex_diagram_persistence_from_off_file_example.py <../example/alpha_complex_diagram_persistence_from_off_file_example.py>`
+ * :download:`gudhi_graphical_tools_example.py <../example/gudhi_graphical_tools_example.py>`
+ * :download:`periodic_cubical_complex_barcode_persistence_from_perseus_file_example.py <../example/periodic_cubical_complex_barcode_persistence_from_perseus_file_example.py>`
+ * :download:`rips_complex_diagram_persistence_from_off_file_example.py <../example/rips_complex_diagram_persistence_from_off_file_example.py>`
+ * :download:`rips_persistence_diagram.py <../example/rips_persistence_diagram.py>`
+ * :download:`rips_complex_diagram_persistence_from_distance_matrix_file_example.py <../example/rips_complex_diagram_persistence_from_distance_matrix_file_example.py>`
+ * :download:`tangential_complex_plain_homology_from_off_file_example.py <../example/tangential_complex_plain_homology_from_off_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>`
+ * :download:`euclidean_witness_complex_diagram_persistence_from_off_file_example.py <../example/euclidean_witness_complex_diagram_persistence_from_off_file_example.py>`
+
+Threading Building Blocks
+=========================
+
+`Intel® TBB <https://www.threadingbuildingblocks.org/>`_ 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.
+
+Bug reports and contributions
+*****************************
+
+Please help us improving the quality of the GUDHI library. You may report bugs or suggestions to:
+
+ Contact: gudhi-users@lists.gforge.inria.fr
+
+GUDHI is open to external contributions. If you want to join our development team, please contact us.
diff --git a/cython/doc/make.bat.in b/cython/doc/make.bat.in
new file mode 100644
index 00000000..ff1a6d56
--- /dev/null
+++ b/cython/doc/make.bat.in
@@ -0,0 +1,67 @@
+@ECHO OFF
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=@SPHINX_PATH@
+)
+set BUILDDIR=_build
+set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
+set I18NSPHINXOPTS=%SPHINXOPTS% .
+if NOT "%PAPER%" == "" (
+ set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
+ set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
+)
+
+if "%1" == "" goto help
+
+if "%1" == "help" (
+ :help
+ echo.Please use `make ^<target^>` where ^<target^> is one of
+ echo. html to make standalone HTML files
+ echo. doctest to run all doctests embedded in the documentation if enabled
+ goto end
+)
+
+if "%1" == "clean" (
+ del examples.inc
+ for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
+ del /q /s %BUILDDIR%\*
+ goto end
+)
+
+
+%SPHINXBUILD% 2> nul
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.http://sphinx-doc.org/
+ exit /b 1
+)
+
+:: GUDHI specific : Examples.inc is generated with generate_examples.py (and deleted on clean)
+
+if "%1" == "html" (
+ generate_examples.py
+ %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The HTML pages are in %BUILDDIR%/html.
+ goto end
+)
+
+if "%1" == "doctest" (
+ %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Testing of doctests in the sources finished, look at the ^
+results in %BUILDDIR%/doctest/output.txt.
+ goto end
+)
+
+:end
diff --git a/cython/doc/periodic_cubical_complex_ref.rst b/cython/doc/periodic_cubical_complex_ref.rst
new file mode 100644
index 00000000..c6190a1b
--- /dev/null
+++ b/cython/doc/periodic_cubical_complex_ref.rst
@@ -0,0 +1,9 @@
+Periodic cubical complex reference manual
+#########################################
+
+.. autoclass:: gudhi.PeriodicCubicalComplex
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+ .. automethod:: gudhi.PeriodicCubicalComplex.__init__
diff --git a/cython/doc/persistence_graphical_tools_ref.rst b/cython/doc/persistence_graphical_tools_ref.rst
new file mode 100644
index 00000000..27c2f68a
--- /dev/null
+++ b/cython/doc/persistence_graphical_tools_ref.rst
@@ -0,0 +1,8 @@
+============================================
+Persistence graphical tools reference manual
+============================================
+
+.. autofunction:: gudhi.__min_birth_max_death
+.. autofunction:: gudhi.show_palette_values
+.. autofunction:: gudhi.plot_persistence_barcode
+.. autofunction:: gudhi.plot_persistence_diagram
diff --git a/cython/doc/persistence_graphical_tools_sum.rst b/cython/doc/persistence_graphical_tools_sum.rst
new file mode 100644
index 00000000..d602daa7
--- /dev/null
+++ b/cython/doc/persistence_graphical_tools_sum.rst
@@ -0,0 +1,12 @@
+================================================================= =================================== ===================================
+:Author: Vincent Rouvreau :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3
+:Requires: Matplotlib Numpy
+================================================================= =================================== ===================================
+
++-----------------------------------------------------------------+-----------------------------------------------------------------------+
+| .. figure:: | These graphical tools comes on top of persistence results and allows |
+| img/graphical_tools_representation.png | the user to build easily barcode and persistence diagram. |
+| | |
++-----------------------------------------------------------------+-----------------------------------------------------------------------+
+| :doc:`persistence_graphical_tools_user` | :doc:`persistence_graphical_tools_ref` |
++-----------------------------------------------------------------+-----------------------------------------------------------------------+
diff --git a/cython/doc/persistence_graphical_tools_user.rst b/cython/doc/persistence_graphical_tools_user.rst
new file mode 100644
index 00000000..cae18323
--- /dev/null
+++ b/cython/doc/persistence_graphical_tools_user.rst
@@ -0,0 +1,66 @@
+Persistence graphical tools user manual
+=======================================
+Definition
+----------
+.. include:: persistence_graphical_tools_sum.rst
+
+
+Show palette values
+-------------------
+
+This function is useful to show the color palette values of dimension:
+
+
+.. testcode::
+
+ import gudhi
+ gudhi.show_palette_values(alpha=1.0)
+
+.. plot::
+
+ import gudhi
+ gudhi.show_palette_values(alpha=1.0)
+
+Show persistence as a barcode
+-----------------------------
+
+This function can display the persistence result as a barcode:
+
+.. testcode::
+
+ import gudhi
+
+ periodic_cc = gudhi.PeriodicCubicalComplex(perseus_file='3d_torus.txt')
+ diag = periodic_cc.persistence()
+ gudhi.plot_persistence_barcode(diag)
+
+.. plot::
+
+ import gudhi
+
+ periodic_cc = gudhi.PeriodicCubicalComplex(perseus_file='3d_torus.txt')
+ diag = periodic_cc.persistence()
+ gudhi.plot_persistence_barcode(diag)
+
+Show persistence as a diagram
+-----------------------------
+
+This function can display the persistence result as a diagram:
+
+.. testcode::
+
+ import gudhi
+
+ rips_complex = gudhi.RipsComplex(off_file='tore3D_300.off', max_edge_length=2.0)
+ simplex_tree = rips_complex.create_simplex_tree(max_dimension=3)
+ diag = simplex_tree.persistence()
+ gudhi.plot_persistence_diagram(diag)
+
+.. plot::
+
+ import gudhi
+
+ rips_complex = gudhi.RipsComplex(off_file='tore3D_300.off', max_edge_length=2.0)
+ simplex_tree = rips_complex.create_simplex_tree(max_dimension=3)
+ diag = simplex_tree.persistence()
+ gudhi.plot_persistence_diagram(diag)
diff --git a/cython/doc/persistent_cohomology_sum.rst b/cython/doc/persistent_cohomology_sum.rst
new file mode 100644
index 00000000..d1f79cb4
--- /dev/null
+++ b/cython/doc/persistent_cohomology_sum.rst
@@ -0,0 +1,27 @@
+================================================================= =================================== ===================================
+:Author: Clément Maria :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3
+================================================================= =================================== ===================================
+
++-----------------------------------------------------------------+-----------------------------------------------------------------------+
+| .. figure:: | The theory of homology consists in attaching to a topological space |
+| img/3DTorus_poch.png | a sequence of (homology) groups, capturing global topological |
+| :figclass: align-center | features like connected components, holes, cavities, etc. Persistent |
+| | homology studies the evolution -- birth, life and death -- of these |
+| Rips Persistent Cohomology on a 3D | features when the topological space is changing. Consequently, the |
+| Torus | theory is essentially composed of three elements: topological spaces, |
+| | their homology groups and an evolution scheme. |
+| | |
+| | Computation of persistent cohomology using the algorithm of |
+| | :cite:`DBLP:journals/dcg/SilvaMV11` and |
+| | :cite:`DBLP:journals/corr/abs-1208-5018` and the Compressed |
+| | Annotation Matrix implementation of |
+| | :cite:`DBLP:conf/esa/BoissonnatDM13`. |
+| | |
++-----------------------------------------------------------------+-----------------------------------------------------------------------+
+| :doc:`persistent_cohomology_user` | Please refer to each data structure that contains persistence |
+| | feature for reference: |
+| | |
+| | * :doc:`simplex_tree_ref` |
+| | * :doc:`cubical_complex_ref` |
+| | * :doc:`periodic_cubical_complex_ref` |
++-----------------------------------------------------------------+-----------------------------------------------------------------------+
diff --git a/cython/doc/persistent_cohomology_user.rst b/cython/doc/persistent_cohomology_user.rst
new file mode 100644
index 00000000..72f1a7f7
--- /dev/null
+++ b/cython/doc/persistent_cohomology_user.rst
@@ -0,0 +1,114 @@
+Persistent cohomology user manual
+=================================
+Definition
+----------
+===================================== ===================================== =====================================
+:Author: Clément Maria :Introduced in: GUDHI PYTHON 2.0.0 :Copyright: GPL v3
+===================================== ===================================== =====================================
+
++---------------------------------------------+----------------------------------------------------------------------+
+| :doc:`persistent_cohomology_user` | Please refer to each data structure that contains persistence |
+| | feature for reference: |
+| | |
+| | * :doc:`simplex_tree_ref` |
++---------------------------------------------+----------------------------------------------------------------------+
+
+
+Computation of persistent cohomology using the algorithm of :cite:`DBLP:journals/dcg/SilvaMV11` and
+:cite:`DBLP:journals/corr/abs-1208-5018` and the Compressed Annotation Matrix implementation of
+:cite:`DBLP:conf/esa/BoissonnatDM13`.
+
+The theory of homology consists in attaching to a topological space a sequence of (homology) groups, capturing global
+topological features like connected components, holes, cavities, etc. Persistent homology studies the evolution --
+birth, life and death -- of these features when the topological space is changing. Consequently, the theory is
+essentially composed of three elements:
+
+* topological spaces
+* their homology groups
+* an evolution scheme.
+
+Topological Spaces
+------------------
+
+Topological spaces are represented by simplicial complexes.
+Let :math:`V = \{1, \cdots ,|V|\}` be a set of *vertices*.
+A *simplex* :math:`\sigma` is a subset of vertices :math:`\sigma \subseteq V`.
+A *simplicial complex* :math:`\mathbf{K}` on :math:`V` is a collection of simplices :math:`\{\sigma\}`,
+:math:`\sigma \subseteq V`, such that :math:`\tau \subseteq \sigma \in \mathbf{K} \Rightarrow \tau \in \mathbf{K}`.
+The dimension :math:`n=|\sigma|-1` of :math:`\sigma` is its number of elements minus 1.
+A *filtration* of a simplicial complex is a function :math:`f:\mathbf{K} \rightarrow \mathbb{R}` satisfying
+:math:`f(\tau)\leq f(\sigma)` whenever :math:`\tau \subseteq \sigma`.
+
+Homology
+--------
+
+For a ring :math:`\mathcal{R}`, the group of *n-chains*, denoted :math:`\mathbf{C}_n(\mathbf{K},\mathcal{R})`, of
+:math:`\mathbf{K}` is the group of formal sums of n-simplices with :math:`\mathcal{R}` coefficients. The
+*boundary operator* is a linear operator
+:math:`\partial_n: \mathbf{C}_n(\mathbf{K},\mathcal{R}) \rightarrow \mathbf{C}_{n-1}(\mathbf{K},\mathcal{R})`
+such that :math:`\partial_n \sigma = \partial_n [v_0, \cdots , v_n] = \sum_{i=0}^n (-1)^{i}[v_0,\cdots ,\widehat{v_i}, \cdots,v_n]`,
+where :math:`\widehat{v_i}` means :math:`v_i` is omitted from the list. The chain groups form a sequence:
+
+.. math::
+
+ \cdots \ \ \mathbf{C}_n(\mathbf{K},\mathcal{R}) \xrightarrow{\ \partial_n\ }
+ \mathbf{C}_{n-1}(\mathbf{K},\mathcal{R}) \xrightarrow{\partial_{n-1}} \cdots \xrightarrow{\ \partial_2 \ }
+ \mathbf{C}_1(\mathbf{K},\mathcal{R}) \xrightarrow{\ \partial_1 \ } \mathbf{C}_0(\mathbf{K},\mathcal{R})
+
+of finitely many groups :math:`\mathbf{C}_n(\mathbf{K},\mathcal{R})` and homomorphisms :math:`\partial_n`, indexed by
+the dimension :math:`n \geq 0`. The boundary operators satisfy the property :math:`\partial_n \circ \partial_{n+1}=0`
+for every :math:`n > 0` and we define the homology groups:
+
+.. math::
+
+ \mathbf{H}_n(\mathbf{K},\mathcal{R}) = \ker \partial_n / \mathrm{im} \ \partial_{n+1}
+
+We refer to :cite:`Munkres-elementsalgtop1984` for an introduction to homology
+theory and to :cite:`DBLP:books/daglib/0025666` for an introduction to persistent homology.
+
+Indexing Scheme
+---------------
+
+"Changing" a simplicial complex consists in applying a simplicial map. An *indexing scheme* is a directed graph
+together with a traversal order, such that two consecutive nodes in the graph are connected by an arrow (either forward
+or backward).
+The nodes represent simplicial complexes and the directed edges simplicial maps.
+
+From the computational point of view, there are two types of indexing schemes of interest in persistent homology:
+
+* linear ones
+ :math:`\bullet \longrightarrow \bullet \longrightarrow \cdots \longrightarrow \bullet \longrightarrow \bullet`
+ in persistent homology :cite:`DBLP:journals/dcg/ZomorodianC05`,
+* zigzag ones
+ :math:`\bullet \longrightarrow \bullet \longleftarrow \cdots \longrightarrow \bullet \longleftarrow \bullet`
+ in zigzag persistent homology :cite:`DBLP:journals/focm/CarlssonS10`.
+
+These indexing schemes have a natural left-to-right traversal order, and we describe them with ranges and iterators.
+In the current release of the Gudhi library, only the linear case is implemented.
+
+In the following, we consider the case where the indexing scheme is induced by a filtration.
+
+Ordering the simplices by increasing filtration values (breaking ties so as a simplex appears after its subsimplices of
+same filtration value) provides an indexing scheme.
+
+Examples
+--------
+
+We provide several example files: run these examples with -h for details on their use.
+
+.. only:: builder_html
+
+ * :download:`alpha_complex_diagram_persistence_from_off_file_example.py <../example/alpha_complex_diagram_persistence_from_off_file_example.py>`
+ * :download:`periodic_cubical_complex_barcode_persistence_from_perseus_file_example.py <../example/periodic_cubical_complex_barcode_persistence_from_perseus_file_example.py>`
+ * :download:`rips_complex_diagram_persistence_from_off_file_example.py <../example/rips_complex_diagram_persistence_from_off_file_example.py>`
+ * :download:`rips_persistence_diagram.py <../example/rips_persistence_diagram.py>`
+ * :download:`rips_complex_diagram_persistence_from_distance_matrix_file_example.py <../example/rips_complex_diagram_persistence_from_distance_matrix_file_example.py>`
+ * :download:`random_cubical_complex_persistence_example.py <../example/random_cubical_complex_persistence_example.py>`
+ * :download:`tangential_complex_plain_homology_from_off_file_example.py <../example/tangential_complex_plain_homology_from_off_file_example.py>`
+
+Bibliography
+============
+
+.. bibliography:: bibliography.bib
+ :filter: docnames
+ :style: unsrt
diff --git a/cython/doc/pyplots/barcode_persistence.py b/cython/doc/pyplots/barcode_persistence.py
new file mode 100755
index 00000000..c06ac5a7
--- /dev/null
+++ b/cython/doc/pyplots/barcode_persistence.py
@@ -0,0 +1,5 @@
+import gudhi
+
+periodic_cc = gudhi.PeriodicCubicalComplex(perseus_file='../3d_torus.txt')
+diag = periodic_cc.persistence()
+gudhi.plot_persistence_barcode(diag)
diff --git a/cython/doc/pyplots/diagram_persistence.py b/cython/doc/pyplots/diagram_persistence.py
new file mode 100755
index 00000000..b4714fe3
--- /dev/null
+++ b/cython/doc/pyplots/diagram_persistence.py
@@ -0,0 +1,5 @@
+import gudhi
+
+alpha_complex = gudhi.AlphaComplex(off_file='../tore3D_300.off')
+diag = alpha_complex.persistence()
+gudhi.plot_persistence_diagram(diag)
diff --git a/cython/doc/pyplots/show_palette_values.py b/cython/doc/pyplots/show_palette_values.py
new file mode 100755
index 00000000..e72a55fd
--- /dev/null
+++ b/cython/doc/pyplots/show_palette_values.py
@@ -0,0 +1,2 @@
+import gudhi
+gudhi.show_palette_values(alpha=1.0)
diff --git a/cython/doc/python3-sphinx-build b/cython/doc/python3-sphinx-build
new file mode 100755
index 00000000..44b94169
--- /dev/null
+++ b/cython/doc/python3-sphinx-build
@@ -0,0 +1,11 @@
+#!/usr/bin/python3
+
+"""
+Emulate sphinx-build for python3
+"""
+
+from sys import exit, argv
+from sphinx import main
+
+if __name__ == '__main__':
+ exit(main(argv))
diff --git a/cython/doc/rips_complex_ref.rst b/cython/doc/rips_complex_ref.rst
new file mode 100644
index 00000000..b17dc4e0
--- /dev/null
+++ b/cython/doc/rips_complex_ref.rst
@@ -0,0 +1,10 @@
+=============================
+Rips complex reference manual
+=============================
+
+.. autoclass:: gudhi.RipsComplex
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+ .. automethod:: gudhi.RipsComplex.__init__
diff --git a/cython/doc/rips_complex_sum.rst b/cython/doc/rips_complex_sum.rst
new file mode 100644
index 00000000..2b65fc19
--- /dev/null
+++ b/cython/doc/rips_complex_sum.rst
@@ -0,0 +1,17 @@
+================================================================= =================================== ===================================
+:Author: Clément Maria, Pawel Dlotko, Vincent Rouvreau :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3
+================================================================= =================================== ===================================
+
++----------------------------------------------------------------+------------------------------------------------------------------------+
+| .. figure:: | Rips complex is a simplicial complex constructed from a one skeleton |
+| img/rips_complex_representation.png | graph. |
+| :figclass: align-center | |
+| | The filtration value of each edge is computed from a user-given |
+| Rips complex representation | distance function and is inserted until a user-given threshold |
+| | value. |
+| | |
+| | This complex can be built from a point cloud and a distance function, |
+| | or from a distance matrix. |
++----------------------------------------------------------------+------------------------------------------------------------------------+
+| :doc:`rips_complex_user` | :doc:`rips_complex_ref` |
++----------------------------------------------------------------+------------------------------------------------------------------------+
diff --git a/cython/doc/rips_complex_user.rst b/cython/doc/rips_complex_user.rst
new file mode 100644
index 00000000..f9760976
--- /dev/null
+++ b/cython/doc/rips_complex_user.rst
@@ -0,0 +1,240 @@
+Rips complex user manual
+=========================
+Definition
+----------
+
+======================================================= ===================================== =====================================
+:Authors: Clément Maria, Pawel Dlotko, Vincent Rouvreau :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3
+======================================================= ===================================== =====================================
+
++-------------------------------------------+----------------------------------------------------------------------+
+| :doc:`rips_complex_user` | :doc:`rips_complex_ref` |
++-------------------------------------------+----------------------------------------------------------------------+
+
+`Rips complex <https://en.wikipedia.org/wiki/Vietoris%E2%80%93Rips_complex>`_ is a one skeleton graph that allows to
+construct a simplicial complex from it. The input can be a point cloud with a given distance function, or a distance
+matrix.
+
+The filtration value of each edge is computed from a user-given distance function, or directly from the distance
+matrix.
+
+All edges that have a filtration value strictly greater than a given threshold value are not inserted into the complex.
+
+When creating a simplicial complex from this one skeleton graph, Rips inserts the one skeleton graph into the data
+structure, and then expands the simplicial complex when required.
+
+Vertex name correspond to the index of the point in the given range (aka. the point cloud).
+
+.. figure::
+ img/rips_complex_representation.png
+ :align: center
+
+ Rips-complex one skeleton graph representation
+
+On this example, as edges (4,5), (4,6) and (5,6) are in the complex, simplex (4,5,6) is added with the filtration value
+set with :math:`max(filtration(4,5), filtration(4,6), filtration(5,6))`. And so on for simplex (0,1,2,3).
+
+If the Rips_complex interfaces are not detailed enough for your need, please refer to rips_persistence_step_by_step.cpp
+example, where the graph construction over the Simplex_tree is more detailed.
+
+Point cloud
+-----------
+
+Example from a point cloud
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This example builds the one skeleton graph from the given points, and max_edge_length value.
+Then it creates a :doc:`Simplex_tree <simplex_tree_ref>` with it.
+
+Finally, it is asked to display information about the simplicial complex.
+
+.. testcode::
+
+ import gudhi
+ rips_complex = gudhi.RipsComplex(points=[[1, 1], [7, 0], [4, 6], [9, 6], [0, 14], [2, 19], [9, 17]],
+ max_edge_length=12.0)
+
+ simplex_tree = rips_complex.create_simplex_tree(max_dimension=1)
+ result_str = 'Rips complex is of dimension ' + repr(simplex_tree.dimension()) + ' - ' + \
+ repr(simplex_tree.num_simplices()) + ' simplices - ' + \
+ repr(simplex_tree.num_vertices()) + ' vertices.'
+ print(result_str)
+ fmt = '%s -> %.2f'
+ for filtered_value in simplex_tree.get_filtration():
+ print(fmt % tuple(filtered_value))
+
+When launching (Rips maximal distance between 2 points is 12.0, is expanded
+until dimension 1 - one skeleton graph in other words), the output is:
+
+.. testoutput::
+
+ Rips complex is of dimension 1 - 18 simplices - 7 vertices.
+ [0] -> 0.00
+ [1] -> 0.00
+ [2] -> 0.00
+ [3] -> 0.00
+ [4] -> 0.00
+ [5] -> 0.00
+ [6] -> 0.00
+ [2, 3] -> 5.00
+ [4, 5] -> 5.39
+ [0, 2] -> 5.83
+ [0, 1] -> 6.08
+ [1, 3] -> 6.32
+ [1, 2] -> 6.71
+ [5, 6] -> 7.28
+ [2, 4] -> 8.94
+ [0, 3] -> 9.43
+ [4, 6] -> 9.49
+ [3, 6] -> 11.00
+
+Example from OFF file
+^^^^^^^^^^^^^^^^^^^^^
+
+This example builds the :doc:`Rips_complex <rips_complex_ref>` from the given
+points in an OFF file, and max_edge_length value.
+Then it creates a :doc:`Simplex_tree <simplex_tree_ref>` with it.
+
+Finally, it is asked to display information about the Rips complex.
+
+
+.. testcode::
+
+ import gudhi
+ rips_complex = gudhi.RipsComplex(off_file='alphacomplexdoc.off', max_edge_length=12.0)
+ simplex_tree = rips_complex.create_simplex_tree(max_dimension=1)
+ result_str = 'Rips complex is of dimension ' + repr(simplex_tree.dimension()) + ' - ' + \
+ repr(simplex_tree.num_simplices()) + ' simplices - ' + \
+ repr(simplex_tree.num_vertices()) + ' vertices.'
+ print(result_str)
+ fmt = '%s -> %.2f'
+ for filtered_value in simplex_tree.get_filtration():
+ print(fmt % tuple(filtered_value))
+
+the program output is:
+
+.. testoutput::
+
+ Rips complex is of dimension 1 - 18 simplices - 7 vertices.
+ [0] -> 0.00
+ [1] -> 0.00
+ [2] -> 0.00
+ [3] -> 0.00
+ [4] -> 0.00
+ [5] -> 0.00
+ [6] -> 0.00
+ [2, 3] -> 5.00
+ [4, 5] -> 5.39
+ [0, 2] -> 5.83
+ [0, 1] -> 6.08
+ [1, 3] -> 6.32
+ [1, 2] -> 6.71
+ [5, 6] -> 7.28
+ [2, 4] -> 8.94
+ [0, 3] -> 9.43
+ [4, 6] -> 9.49
+ [3, 6] -> 11.00
+
+Distance matrix
+---------------
+
+Example from a distance matrix
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This example builds the one skeleton graph from the given distance matrix, and max_edge_length value.
+Then it creates a :doc:`Simplex_tree <simplex_tree_ref>` with it.
+
+Finally, it is asked to display information about the simplicial complex.
+
+.. testcode::
+
+ import gudhi
+ rips_complex = gudhi.RipsComplex(distance_matrix=[[],
+ [6.0827625303],
+ [5.8309518948, 6.7082039325],
+ [9.4339811321, 6.3245553203, 5],
+ [13.0384048104, 15.6524758425, 8.94427191, 12.0415945788],
+ [18.0277563773, 19.6468827044, 13.152946438, 14.7648230602, 5.3851648071],
+ [17.88854382, 17.1172427686, 12.0830459736, 11, 9.4868329805, 7.2801098893]],
+ max_edge_length=12.0)
+
+ simplex_tree = rips_complex.create_simplex_tree(max_dimension=1)
+ result_str = 'Rips complex is of dimension ' + repr(simplex_tree.dimension()) + ' - ' + \
+ repr(simplex_tree.num_simplices()) + ' simplices - ' + \
+ repr(simplex_tree.num_vertices()) + ' vertices.'
+ print(result_str)
+ fmt = '%s -> %.2f'
+ for filtered_value in simplex_tree.get_filtration():
+ print(fmt % tuple(filtered_value))
+
+When launching (Rips maximal distance between 2 points is 12.0, is expanded
+until dimension 1 - one skeleton graph in other words), the output is:
+
+.. testoutput::
+
+ Rips complex is of dimension 1 - 18 simplices - 7 vertices.
+ [0] -> 0.00
+ [1] -> 0.00
+ [2] -> 0.00
+ [3] -> 0.00
+ [4] -> 0.00
+ [5] -> 0.00
+ [6] -> 0.00
+ [2, 3] -> 5.00
+ [4, 5] -> 5.39
+ [0, 2] -> 5.83
+ [0, 1] -> 6.08
+ [1, 3] -> 6.32
+ [1, 2] -> 6.71
+ [5, 6] -> 7.28
+ [2, 4] -> 8.94
+ [0, 3] -> 9.43
+ [4, 6] -> 9.49
+ [3, 6] -> 11.00
+
+Example from csv file
+^^^^^^^^^^^^^^^^^^^^^
+
+This example builds the :doc:`Rips_complex <rips_complex_ref>` from the given
+points in an OFF file, and max_edge_length value.
+Then it creates a :doc:`Simplex_tree <simplex_tree_ref>` with it.
+
+Finally, it is asked to display information about the Rips complex.
+
+
+.. testcode::
+
+ import gudhi
+ rips_complex = gudhi.RipsComplex(csv_file='full_square_distance_matrix.csv', max_edge_length=12.0)
+ simplex_tree = rips_complex.create_simplex_tree(max_dimension=1)
+ result_str = 'Rips complex is of dimension ' + repr(simplex_tree.dimension()) + ' - ' + \
+ repr(simplex_tree.num_simplices()) + ' simplices - ' + \
+ repr(simplex_tree.num_vertices()) + ' vertices.'
+ print(result_str)
+ fmt = '%s -> %.2f'
+ for filtered_value in simplex_tree.get_filtration():
+ print(fmt % tuple(filtered_value))
+
+the program output is:
+
+.. testoutput::
+
+ Rips complex is of dimension 1 - 18 simplices - 7 vertices.
+ [0] -> 0.00
+ [1] -> 0.00
+ [2] -> 0.00
+ [3] -> 0.00
+ [4] -> 0.00
+ [5] -> 0.00
+ [6] -> 0.00
+ [2, 3] -> 5.00
+ [4, 5] -> 5.39
+ [0, 2] -> 5.83
+ [0, 1] -> 6.08
+ [1, 3] -> 6.32
+ [1, 2] -> 6.71
+ [5, 6] -> 7.28
+ [2, 4] -> 8.94
+ [0, 3] -> 9.43
+ [4, 6] -> 9.49
+ [3, 6] -> 11.00
diff --git a/cython/doc/simplex_tree_ref.rst b/cython/doc/simplex_tree_ref.rst
new file mode 100644
index 00000000..6d196843
--- /dev/null
+++ b/cython/doc/simplex_tree_ref.rst
@@ -0,0 +1,10 @@
+=============================
+Simplex tree reference manual
+=============================
+
+.. autoclass:: gudhi.SimplexTree
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+ .. automethod:: gudhi.SimplexTree.__init__
diff --git a/cython/doc/simplex_tree_sum.rst b/cython/doc/simplex_tree_sum.rst
new file mode 100644
index 00000000..3174fb62
--- /dev/null
+++ b/cython/doc/simplex_tree_sum.rst
@@ -0,0 +1,14 @@
+================================================================= =================================== ===================================
+:Author: Clément Maria :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3
+================================================================= =================================== ===================================
+
++----------------------------------------------------------------+------------------------------------------------------------------------+
+| .. figure:: | The simplex tree is an efficient and flexible data structure for |
+| img/Simplex_tree_representation.png | representing general (filtered) simplicial complexes. |
+| :alt: Simplex tree representation | |
+| :figclass: align-center | The data structure is described in |
+| | :cite:`boissonnatmariasimplextreealgorithmica` |
+| Simplex tree representation | |
++----------------------------------------------------------------+------------------------------------------------------------------------+
+| :doc:`simplex_tree_user` | :doc:`simplex_tree_ref` |
++----------------------------------------------------------------+------------------------------------------------------------------------+
diff --git a/cython/doc/simplex_tree_user.rst b/cython/doc/simplex_tree_user.rst
new file mode 100644
index 00000000..4b1dde19
--- /dev/null
+++ b/cython/doc/simplex_tree_user.rst
@@ -0,0 +1,68 @@
+Simplex tree user manual
+========================
+Definition
+----------
+
+.. include:: simplex_tree_sum.rst
+
+A simplicial complex :math:`\mathbf{K}` on a set of vertices :math:`V = \{1, \cdots ,|V|\}` is a collection of
+simplices :math:`\{\sigma\}`, :math:`\sigma \subseteq V` such that
+:math:`\tau \subseteq \sigma \in \mathbf{K} \rightarrow \tau \in \mathbf{K}`. The dimension :math:`n=|\sigma|-1` of
+:math:`\sigma` is its number of elements minus `1`.
+
+A filtration of a simplicial complex is a function :math:`f:\mathbf{K} \rightarrow \mathbb{R}` satisfying
+:math:`f(\tau)\leq f(\sigma)` whenever :math:`\tau \subseteq \sigma`. Ordering the simplices by increasing filtration
+values (breaking ties so as a simplex appears after its subsimplices of same filtration value) provides an indexing
+scheme.
+
+
+Implementation
+--------------
+
+There are two implementation of complexes. The first on is the Simplex_tree data structure.
+The simplex tree is an efficient and flexible data structure for representing general (filtered) simplicial complexes.
+The data structure is described in :cite`boissonnatmariasimplextreealgorithmica`.
+
+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.
+
+Example
+-------
+
+.. testcode::
+
+ import gudhi
+ st = gudhi.SimplexTree()
+ if st.insert([0, 1]):
+ print("[0, 1] inserted")
+ if st.insert([0, 1, 2], filtration=4.0):
+ print("[0, 1, 2] inserted")
+ if st.find([0, 1]):
+ print("[0, 1] found")
+ result_str = 'num_vertices=' + repr(st.num_vertices())
+ print(result_str)
+ result_str = 'num_simplices=' + repr(st.num_simplices())
+ print(result_str)
+ print("skeleton(2) =")
+ for sk_value in st.get_skeleton(2):
+ print(sk_value)
+
+
+The output is:
+
+.. testoutput::
+
+ [0, 1] inserted
+ [0, 1, 2] inserted
+ [0, 1] found
+ num_vertices=3
+ num_simplices=7
+ skeleton(2) =
+ ([0, 1, 2], 4.0)
+ ([0, 1], 0.0)
+ ([0, 2], 4.0)
+ ([0], 0.0)
+ ([1, 2], 4.0)
+ ([1], 0.0)
+ ([2], 4.0)
diff --git a/cython/doc/strong_witness_complex_ref.rst b/cython/doc/strong_witness_complex_ref.rst
new file mode 100644
index 00000000..4ed4fe46
--- /dev/null
+++ b/cython/doc/strong_witness_complex_ref.rst
@@ -0,0 +1,10 @@
+=======================================
+Strong witness complex reference manual
+=======================================
+
+.. autoclass:: gudhi.StrongWitnessComplex
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+ .. automethod:: gudhi.StrongWitnessComplex.__init__
diff --git a/cython/doc/tangential_complex_ref.rst b/cython/doc/tangential_complex_ref.rst
new file mode 100644
index 00000000..35589475
--- /dev/null
+++ b/cython/doc/tangential_complex_ref.rst
@@ -0,0 +1,10 @@
+===================================
+Tangential complex reference manual
+===================================
+
+.. autoclass:: gudhi.TangentialComplex
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+ .. automethod:: gudhi.TangentialComplex.__init__
diff --git a/cython/doc/tangential_complex_sum.rst b/cython/doc/tangential_complex_sum.rst
new file mode 100644
index 00000000..2b05bc10
--- /dev/null
+++ b/cython/doc/tangential_complex_sum.rst
@@ -0,0 +1,15 @@
+================================================================= =================================== ===================================
+:Author: Clément Jamin :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3
+:Requires: CGAL :math:`\geq` 4.8.0 Eigen3
+================================================================= =================================== ===================================
+
++----------------------------------------------------------------+------------------------------------------------------------------------+
+| .. figure:: | A Tangential Delaunay complex is a simplicial complex designed to |
+| img/tc_examples.png | reconstruct a :math:`k`-dimensional manifold embedded in :math:`d`- |
+| :figclass: align-center | dimensional Euclidean space. The input is a point sample coming from |
+| | an unknown manifold. The running time depends only linearly on the |
+| **Tangential complex representation** | extrinsic dimension :math:`d` and exponentially on the intrinsic |
+| | dimension :math:`k`. |
++----------------------------------------------------------------+------------------------------------------------------------------------+
+| :doc:`tangential_complex_user` | :doc:`tangential_complex_ref` |
++----------------------------------------------------------------+------------------------------------------------------------------------+
diff --git a/cython/doc/tangential_complex_user.rst b/cython/doc/tangential_complex_user.rst
new file mode 100644
index 00000000..03f9fea6
--- /dev/null
+++ b/cython/doc/tangential_complex_user.rst
@@ -0,0 +1,195 @@
+Tangential complex user manual
+==============================
+.. include:: tangential_complex_sum.rst
+
+Definition
+----------
+
+A Tangential Delaunay complex is a simplicial complex designed to reconstruct a
+:math:`k`-dimensional smooth manifold embedded in :math:`d`-dimensional
+Euclidean space. The input is a point sample coming from an unknown manifold,
+which means that the points lie close to a structure of "small" intrinsic
+dimension. The running time depends only linearly on the extrinsic dimension
+:math:`d` and exponentially on the intrinsic dimension :math:`k`.
+
+An extensive description of the Tangential complex can be found in
+:cite:`tangentialcomplex2014`.
+
+What is a Tangential Complex?
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Let us start with the description of the Tangential complex of a simple
+example, with :math:`k = 1` and :math:`d = 2`. The input data is 4 points
+:math:`P` located on a curve embedded in 2D.
+
+.. figure:: img/tc_example_01.png
+ :alt: The input
+ :figclass: align-center
+
+ The input
+
+For each point :math:`p`, estimate its tangent subspace :math:`T_p` (e.g.
+using PCA).
+
+.. figure:: img/tc_example_02.png
+ :alt: The estimated normals
+ :figclass: align-center
+
+ The estimated normals
+
+
+Let us add the Voronoi diagram of the points in orange. For each point
+:math:`p`, construct its star in the Delaunay triangulation of :math:`P`
+restricted to :math:`T_p`.
+
+.. figure:: img/tc_example_03.png
+ :alt: The Voronoi diagram
+ :figclass: align-center
+
+ The Voronoi diagram
+
+The Tangential Delaunay complex is the union of those stars.
+
+In practice, neither the ambient Voronoi diagram nor the ambient Delaunay
+triangulation is computed. Instead, local :math:`k`-dimensional regular
+triangulations are computed with a limited number of points as we only need the
+star of each point. More details can be found in :cite:`tangentialcomplex2014`.
+
+Inconsistencies
+^^^^^^^^^^^^^^^
+Inconsistencies between the stars can occur. An inconsistency occurs when a
+simplex is not in the star of all its vertices.
+
+Let us take the same example.
+
+.. figure:: img/tc_example_07_before.png
+ :alt: Before
+ :figclass: align-center
+
+ Before
+
+Let us slightly move the tangent subspace :math:`T_q`
+
+.. figure:: img/tc_example_07_after.png
+ :alt: After
+ :figclass: align-center
+
+ After
+
+Now, the star of :math:`Q` contains :math:`QP`, but the star of :math:`P` does
+not contain :math:`QP`. We have an inconsistency.
+
+.. figure:: img/tc_example_08.png
+ :alt: After
+ :figclass: align-center
+
+ After
+
+One way to solve inconsistencies is to randomly perturb the positions of the
+points involved in an inconsistency. In the current implementation, this
+perturbation is done in the tangent subspace of each point. The maximum
+perturbation radius is given as a parameter to the constructor.
+
+In most cases, we recommend to provide a point set where the minimum distance
+between any two points is not too small. This can be achieved using the
+functions provided by the Subsampling module. Then, a good value to start with
+for the maximum perturbation radius would be around half the minimum distance
+between any two points. The Example with perturbation below shows an example of
+such a process.
+
+In most cases, this process is able to dramatically reduce the number of
+inconsistencies, but is not guaranteed to succeed.
+
+Output
+^^^^^^
+The result of the computation is exported as a Simplex_tree. It is the union of
+the stars of all the input points. A vertex in the Simplex Tree is the index of
+the point in the range provided by the user. The point corresponding to a
+vertex can also be obtained through the Tangential_complex::get_point function.
+Note that even if the positions of the points are perturbed, their original
+positions are kept (e.g. Tangential_complex::get_point returns the original
+position of the point).
+
+The result can be obtained after the computation of the Tangential complex
+itself and/or after the perturbation process.
+
+
+Simple example
+--------------
+
+This example builds the Tangential complex of point set read in an OFF file.
+
+.. testcode::
+
+ import gudhi
+ tc = gudhi.TangentialComplex(off_file='alphacomplexdoc.off')
+ result_str = 'Tangential contains ' + repr(tc.num_simplices()) + \
+ ' simplices - ' + repr(tc.num_vertices()) + ' vertices.'
+ print(result_str)
+
+ st = tc.create_simplex_tree()
+ result_str = 'Simplex tree is of dimension ' + repr(st.dimension()) + \
+ ' - ' + repr(st.num_simplices()) + ' simplices - ' + \
+ repr(st.num_vertices()) + ' vertices.'
+ print(result_str)
+ for filtered_value in st.get_filtration():
+ print(filtered_value[0])
+
+The output is:
+
+.. testoutput::
+
+ Tangential contains 12 simplices - 7 vertices.
+ Simplex tree is of dimension 1 - 15 simplices - 7 vertices.
+ [0]
+ [1]
+ [0, 1]
+ [2]
+ [0, 2]
+ [1, 2]
+ [3]
+ [1, 3]
+ [4]
+ [2, 4]
+ [5]
+ [4, 5]
+ [6]
+ [3, 6]
+ [5, 6]
+
+
+Example with perturbation
+-------------------------
+
+This example builds the Tangential complex of a point set, then tries to solve
+inconsistencies by perturbing the positions of points involved in inconsistent
+simplices.
+
+.. testcode::
+
+ import gudhi
+ tc = gudhi.TangentialComplex(points=[[0.0, 0.0], [1.0, 0.0], [0.0, 1.0], [1.0, 1.0]])
+ result_str = 'Tangential contains ' + repr(tc.num_vertices()) + ' vertices.'
+ print(result_str)
+
+ if tc.num_inconsistent_simplices() > 0:
+ print('Tangential contains inconsistencies.')
+
+ tc.fix_inconsistencies_using_perturbation(10, 60)
+ if tc.num_inconsistent_simplices() == 0:
+ print('Inconsistencies has been fixed.')
+
+The output is:
+
+.. testoutput::
+
+ Tangential contains 4 vertices.
+ Inconsistencies has been fixed.
+
+
+Bibliography
+============
+
+.. bibliography:: bibliography.bib
+ :filter: docnames
+ :style: unsrt
diff --git a/cython/doc/todos.rst b/cython/doc/todos.rst
new file mode 100644
index 00000000..78972a4c
--- /dev/null
+++ b/cython/doc/todos.rst
@@ -0,0 +1,5 @@
+==========
+To be done
+==========
+
+.. todolist::
diff --git a/cython/doc/witness_complex_ref.rst b/cython/doc/witness_complex_ref.rst
new file mode 100644
index 00000000..c78760cb
--- /dev/null
+++ b/cython/doc/witness_complex_ref.rst
@@ -0,0 +1,10 @@
+================================
+Witness complex reference manual
+================================
+
+.. autoclass:: gudhi.WitnessComplex
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+ .. automethod:: gudhi.WitnessComplex.__init__
diff --git a/cython/doc/witness_complex_sum.rst b/cython/doc/witness_complex_sum.rst
new file mode 100644
index 00000000..b65522ba
--- /dev/null
+++ b/cython/doc/witness_complex_sum.rst
@@ -0,0 +1,17 @@
+================================================================= =================================== ===================================
+:Author: Siargey Kachanovich :Introduced in: GUDHI 2.0.0 :Copyright: GPL v3
+:Euclidean version requires: CGAL :math:`\geq` 4.6.0 Eigen3
+================================================================= =================================== ===================================
+
++-----------------------------------------------------------------+----------------------------------------------------------------------+
+| .. image:: | Witness complex :math:`Wit(W,L)` is a simplicial complex defined on |
+| img/Witness_complex_representation.png | two sets of points in :math:`\mathbb{R}^D`. |
+| | |
+| | The data structure is described in |
+| | :cite:`boissonnatmariasimplextreealgorithmica`. |
++-----------------------------------------------------------------+----------------------------------------------------------------------+
+| :doc:`witness_complex_user` | * :doc:`witness_complex_ref` |
+| | * :doc:`strong_witness_complex_ref` |
+| | * :doc:`euclidean_witness_complex_ref` |
+| | * :doc:`euclidean_strong_witness_complex_ref` |
++-----------------------------------------------------------------+----------------------------------------------------------------------+
diff --git a/cython/doc/witness_complex_user.rst b/cython/doc/witness_complex_user.rst
new file mode 100644
index 00000000..aa9cbb2c
--- /dev/null
+++ b/cython/doc/witness_complex_user.rst
@@ -0,0 +1,131 @@
+Witness complex user manual
+===========================
+
+.. include:: witness_complex_sum.rst
+
+Definitions
+-----------
+
+Witness complex is a simplicial complex defined on two sets of points in :math:`\mathbb{R}^D`:
+
+- :math:`W` set of **witnesses** and
+- :math:`L` set of **landmarks**.
+
+Even though often the set of landmarks :math:`L` is a subset of the set of witnesses :math:`W`, it is not a requirement
+for the current implementation.
+
+Landmarks are the vertices of the simplicial complex and witnesses help to decide on which simplices are inserted via a
+predicate "is witnessed".
+
+De Silva and Carlsson in their paper :cite:`de2004topological` differentiate **weak witnessing** and
+**strong witnessing**:
+
+- *weak*: :math:`\sigma \subset L` is witnessed by :math:`w \in W` if :math:`\forall l \in \sigma,\ \forall l' \in \mathbf{L \setminus \sigma},\ d(w,l) \leq d(w,l')`
+- *strong*: :math:`\sigma \subset L` is witnessed by :math:`w \in W` if :math:`\forall l \in \sigma,\ \forall l' \in \mathbf{L},\ d(w,l) \leq d(w,l')`
+
+where :math:`d(.,.)` is a distance function.
+
+Both definitions can be relaxed by a real value :math:`\alpha`:
+
+- *weak*: :math:`\sigma \subset L` is :math:`\alpha`-witnessed by :math:`w \in W` if :math:`\forall l \in \sigma,\ \forall l' \in \mathbf{L \setminus \sigma},\ d(w,l)^2 \leq d(w,l')^2 + \alpha^2`
+- *strong*: :math:`\sigma \subset L` is :math:`\alpha`-witnessed by :math:`w \in W` if :math:`\forall l \in \sigma,\ \forall l' \in \mathbf{L},\ d(w,l)^2 \leq d(w,l')^2 + \alpha^2`
+
+which leads to definitions of **weak relaxed witness complex** (or just relaxed witness complex for short) and
+**strong relaxed witness complex** respectively.
+
+.. figure:: img/swit.svg
+ :alt: Strongly witnessed simplex
+ :figclass: align-center
+
+ Strongly witnessed simplex
+
+
+In particular case of 0-relaxation, weak complex corresponds to **witness complex** introduced in
+:cite:`de2004topological`, whereas 0-relaxed strong witness complex consists of just vertices and is not very
+interesting. Hence for small relaxation weak version is preferable.
+However, to capture the homotopy type (for example using Gudhi::persistent_cohomology::Persistent_cohomology) it is
+often necessary to work with higher filtration values. In this case strong relaxed witness complex is faster to compute
+and offers similar results.
+
+Implementation
+--------------
+
+The two complexes described above are implemented in the corresponding classes
+
+- :doc:`witness_complex_ref`
+- :doc:`strong_witness_complex_ref`
+- :doc:`euclidean_witness_complex_ref`
+- :doc:`euclidean_strong_witness_complex_ref`
+
+The construction of the Euclidean versions of complexes follow the same scheme:
+
+1. Construct a search tree on landmarks.
+2. Construct lists of nearest landmarks for each witness.
+3. Construct the witness complex for nearest landmark lists.
+
+In the non-Euclidean classes, the lists of nearest landmarks are supposed to be given as input.
+
+The constructors take on the steps 1 and 2, while the function 'create_complex' executes the step 3.
+
+Constructing weak relaxed witness complex from an off file
+----------------------------------------------------------
+
+Let's start with a simple example, which reads an off point file and computes a weak witness complex.
+
+.. code-block:: python
+
+ import gudhi
+ import argparse
+
+ parser = argparse.ArgumentParser(description='EuclideanWitnessComplex creation from '
+ 'points read in a OFF file.',
+ epilog='Example: '
+ 'example/witness_complex_diagram_persistence_from_off_file_example.py '
+ '-f ../data/points/tore3D_300.off -a 1.0 -n 20 -d 2'
+ '- Constructs a alpha complex with the '
+ 'points from the given OFF file.')
+ parser.add_argument("-f", "--file", type=str, required=True)
+ parser.add_argument("-a", "--max_alpha_square", type=float, required=True)
+ parser.add_argument("-n", "--number_of_landmarks", type=int, required=True)
+ parser.add_argument("-d", "--limit_dimension", type=int, required=True)
+
+ args = parser.parse_args()
+
+ with open(args.file, 'r') as f:
+ first_line = f.readline()
+ if (first_line == 'OFF\n') or (first_line == 'nOFF\n'):
+ print("#####################################################################")
+ print("EuclideanWitnessComplex creation from points read in a OFF file")
+
+ witnesses = gudhi.read_off(off_file=args.file)
+ landmarks = gudhi.pick_n_random_points(points=witnesses, nb_points=args.number_of_landmarks)
+
+ message = "EuclideanWitnessComplex with max_edge_length=" + repr(args.max_alpha_square) + \
+ " - Number of landmarks=" + repr(args.number_of_landmarks)
+ print(message)
+
+ witness_complex = gudhi.EuclideanWitnessComplex(witnesses=witnesses, landmarks=landmarks)
+ simplex_tree = witness_complex.create_simplex_tree(max_alpha_square=args.max_alpha_square,
+ limit_dimension=args.limit_dimension)
+
+ message = "Number of simplices=" + repr(simplex_tree.num_simplices())
+ print(message)
+ else:
+ print(args.file, "is not a valid OFF file")
+
+ f.close()
+
+
+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>`
+
+Bibliography
+============
+
+.. bibliography:: bibliography.bib
+ :filter: docnames
+ :style: unsrt
diff --git a/cython/example/alpha_complex_diagram_persistence_from_off_file_example.py b/cython/example/alpha_complex_diagram_persistence_from_off_file_example.py
new file mode 100755
index 00000000..adedc7d2
--- /dev/null
+++ b/cython/example/alpha_complex_diagram_persistence_from_off_file_example.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python
+
+import gudhi
+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): Vincent Rouvreau
+
+ Copyright (C) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+parser = argparse.ArgumentParser(description='AlphaComplex creation from '
+ 'points read in a OFF file.',
+ epilog='Example: '
+ 'example/alpha_complex_diagram_persistence_from_off_file_example.py '
+ '-f ../data/points/tore3D_300.off -a 0.6'
+ '- Constructs a alpha complex with the '
+ 'points from the given OFF file.')
+parser.add_argument("-f", "--file", type=str, required=True)
+parser.add_argument("-a", "--max_alpha_square", type=float, default=0.5)
+parser.add_argument('--no-diagram', default=False, action='store_true' , help='Flag for not to display the diagrams')
+
+args = parser.parse_args()
+
+with open(args.file, 'r') as f:
+ first_line = f.readline()
+ if (first_line == 'OFF\n') or (first_line == 'nOFF\n'):
+ print("#####################################################################")
+ print("AlphaComplex creation from points read in a OFF file")
+
+ message = "AlphaComplex with max_edge_length=" + repr(args.max_alpha_square)
+ print(message)
+
+ alpha_complex = gudhi.AlphaComplex(off_file=args.file)
+ simplex_tree = alpha_complex.create_simplex_tree(max_alpha_square=args.max_alpha_square)
+
+ message = "Number of simplices=" + repr(simplex_tree.num_simplices())
+ print(message)
+
+ diag = simplex_tree.persistence()
+
+ print("betti_numbers()=")
+ print(simplex_tree.betti_numbers())
+
+ if args.no_diagram == False:
+ gudhi.plot_persistence_diagram(diag)
+ else:
+ print(args.file, "is not a valid OFF file")
+
+ f.close()
diff --git a/cython/example/alpha_complex_from_points_example.py b/cython/example/alpha_complex_from_points_example.py
new file mode 100755
index 00000000..7d6278ce
--- /dev/null
+++ b/cython/example/alpha_complex_from_points_example.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python
+
+from gudhi import AlphaComplex, SimplexTree
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+print("#####################################################################")
+print("AlphaComplex creation from points")
+alpha_complex = AlphaComplex(points=[[0, 0], [1, 0], [0, 1], [1, 1]])
+simplex_tree = alpha_complex.create_simplex_tree(max_alpha_square=60.0)
+
+if simplex_tree.find([0, 1]):
+ print("[0, 1] Found !!")
+else:
+ print("[0, 1] Not found...")
+
+if simplex_tree.find([4]):
+ print("[4] Found !!")
+else:
+ print("[4] Not found...")
+
+if simplex_tree.insert([0, 1, 2], filtration=4.0):
+ print("[0, 1, 2] Inserted !!")
+else:
+ print("[0, 1, 2] Not inserted...")
+
+if simplex_tree.insert([0, 1, 4], filtration=4.0):
+ print("[0, 1, 4] Inserted !!")
+else:
+ print("[0, 1, 4] Not inserted...")
+
+if simplex_tree.find([4]):
+ print("[4] Found !!")
+else:
+ print("[4] Not found...")
+
+print("dimension=", simplex_tree.dimension())
+print("filtrations=", simplex_tree.get_filtration())
+print("star([0])=", simplex_tree.get_star([0]))
+print("coface([0], 1)=", simplex_tree.get_cofaces([0], 1))
+
+print("point[0]=", alpha_complex.get_point(0))
+print("point[5]=", alpha_complex.get_point(5))
diff --git a/cython/example/alpha_rips_persistence_bottleneck_distance.py b/cython/example/alpha_rips_persistence_bottleneck_distance.py
new file mode 100755
index 00000000..ab5fc1e9
--- /dev/null
+++ b/cython/example/alpha_rips_persistence_bottleneck_distance.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python
+
+import gudhi
+import argparse
+import math
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+parser = argparse.ArgumentParser(description='AlphaComplex and RipsComplex '
+ 'persistence creation from points read in '
+ 'a OFF file. Bottleneck distance computation'
+ ' on each dimension',
+ epilog='Example: '
+ 'example/alpha_rips_persistence_bottleneck_distance.py '
+ '-f ../data/points/tore3D_1307.off -t 0.15 -d 3')
+parser.add_argument("-f", "--file", type=str, required=True)
+parser.add_argument("-t", "--threshold", type=float, default=0.5)
+parser.add_argument("-d", "--max_dimension", type=int, default=1)
+
+args = parser.parse_args()
+with open(args.file, 'r') as f:
+ first_line = f.readline()
+ if (first_line == 'OFF\n') or (first_line == 'nOFF\n'):
+ print("#####################################################################")
+ print("RipsComplex creation from points read in a OFF file")
+
+ message = "RipsComplex with max_edge_length=" + repr(args.threshold)
+ print(message)
+
+ rips_complex = gudhi.RipsComplex(off_file=args.file,
+ max_edge_length=args.threshold)
+
+ rips_stree = rips_complex.create_simplex_tree(max_dimension=args.max_dimension)
+
+ message = "Number of simplices=" + repr(rips_stree.num_simplices())
+ print(message)
+
+ rips_diag = rips_stree.persistence()
+
+ print("#####################################################################")
+ print("AlphaComplex creation from points read in a OFF file")
+
+ message = "AlphaComplex with max_edge_length=" + repr(args.threshold)
+ print(message)
+
+ alpha_complex = gudhi.AlphaComplex(off_file=args.file)
+ alpha_stree = alpha_complex.create_simplex_tree(max_alpha_square=(args.threshold * args.threshold))
+
+ message = "Number of simplices=" + repr(alpha_stree.num_simplices())
+ print(message)
+
+ alpha_diag = alpha_stree.persistence()
+
+ max_b_distance = 0.0
+ for dim in range(args.max_dimension):
+ # Alpha persistence values needs to be transform because filtration
+ # values are alpha square values
+ funcs = [math.sqrt, math.sqrt]
+ alpha_intervals = []
+ for interval in alpha_stree.persistence_intervals_in_dimension(dim):
+ alpha_intervals.append(map(lambda func,value: func(value), funcs, interval))
+
+ rips_intervals = rips_stree.persistence_intervals_in_dimension(dim)
+ bottleneck_distance = gudhi.bottleneck_distance(rips_intervals, alpha_intervals)
+ message = "In dimension " + repr(dim) + ", bottleneck distance = " + repr(bottleneck_distance)
+ print(message)
+ max_b_distance = max(bottleneck_distance, max_b_distance)
+
+ print("================================================================================")
+ message = "Bottleneck distance is " + repr(max_b_distance)
+ print(message)
+
+ else:
+ print(args.file, "is not a valid OFF file")
+
+ f.close()
diff --git a/cython/example/bottleneck_basic_example.py b/cython/example/bottleneck_basic_example.py
new file mode 100755
index 00000000..31cecb29
--- /dev/null
+++ b/cython/example/bottleneck_basic_example.py
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+
+import gudhi
+
+"""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): Francois Godi, Vincent Rouvreau
+
+ Copyright (C) 2016 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__ = "Francois Godi, Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+import gudhi
+
+diag1 = [[2.7, 3.7],[9.6, 14.],[34.2, 34.974], [3.,float('Inf')]]
+
+diag2 = [[2.8, 4.45],[9.5, 14.1],[3.2,float('Inf')]]
+
+message = "diag1=" + repr(diag1)
+print(message)
+
+message = "diag2=" + repr(diag2)
+print(message)
+
+message = "Bottleneck distance approximation=" + repr(gudhi.bottleneck_distance(diag1, diag2, 0.1))
+print(message)
+
+message = "Bottleneck distance exact value=" + repr(gudhi.bottleneck_distance(diag1, diag2))
+print(message)
+
diff --git a/cython/example/euclidean_strong_witness_complex_diagram_persistence_from_off_file_example.py b/cython/example/euclidean_strong_witness_complex_diagram_persistence_from_off_file_example.py
new file mode 100755
index 00000000..2371c36c
--- /dev/null
+++ b/cython/example/euclidean_strong_witness_complex_diagram_persistence_from_off_file_example.py
@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+
+import gudhi
+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): Vincent Rouvreau
+
+ Copyright (C) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+parser = argparse.ArgumentParser(description='EuclideanStrongWitnessComplex creation from '
+ 'points read in a OFF file.',
+ epilog='Example: '
+ 'example/euclidean_strong_witness_complex_diagram_persistence_from_off_file_example.py '
+ '-f ../data/points/tore3D_300.off -a 1.0 -n 20 -d 2'
+ '- Constructs a strong witness complex with the '
+ 'points from the given OFF file.')
+parser.add_argument("-f", "--file", type=str, required=True)
+parser.add_argument("-a", "--max_alpha_square", type=float, required=True)
+parser.add_argument("-n", "--number_of_landmarks", type=int, required=True)
+parser.add_argument("-d", "--limit_dimension", type=int, required=True)
+parser.add_argument('--no-diagram', default=False, action='store_true' , help='Flag for not to display the diagrams')
+
+args = parser.parse_args()
+
+with open(args.file, 'r') as f:
+ first_line = f.readline()
+ if (first_line == 'OFF\n') or (first_line == 'nOFF\n'):
+ print("#####################################################################")
+ print("EuclideanStrongWitnessComplex creation from points read in a OFF file")
+
+ witnesses = gudhi.read_off(off_file=args.file)
+ landmarks = gudhi.pick_n_random_points(points=witnesses, nb_points=args.number_of_landmarks)
+
+ message = "EuclideanStrongWitnessComplex with max_edge_length=" + repr(args.max_alpha_square) + \
+ " - Number of landmarks=" + repr(args.number_of_landmarks)
+ print(message)
+
+ witness_complex = gudhi.EuclideanStrongWitnessComplex(witnesses=witnesses, landmarks=landmarks)
+ simplex_tree = witness_complex.create_simplex_tree(max_alpha_square=args.max_alpha_square,
+ limit_dimension=args.limit_dimension)
+
+ message = "Number of simplices=" + repr(simplex_tree.num_simplices())
+ print(message)
+
+ diag = simplex_tree.persistence()
+
+ print("betti_numbers()=")
+ print(simplex_tree.betti_numbers())
+
+ if args.no_diagram == False:
+ gudhi.plot_persistence_diagram(diag)
+
+ else:
+ print(args.file, "is not a valid OFF file")
+
+ f.close()
diff --git a/cython/example/euclidean_witness_complex_diagram_persistence_from_off_file_example.py b/cython/example/euclidean_witness_complex_diagram_persistence_from_off_file_example.py
new file mode 100755
index 00000000..5748aa8a
--- /dev/null
+++ b/cython/example/euclidean_witness_complex_diagram_persistence_from_off_file_example.py
@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+
+import gudhi
+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): Vincent Rouvreau
+
+ Copyright (C) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+parser = argparse.ArgumentParser(description='EuclideanWitnessComplex creation from '
+ 'points read in a OFF file.',
+ epilog='Example: '
+ 'example/euclidean_witness_complex_diagram_persistence_from_off_file_example.py '
+ '-f ../data/points/tore3D_300.off -a 1.0 -n 20 -d 2'
+ '- Constructs a weak witness complex with the '
+ 'points from the given OFF file.')
+parser.add_argument("-f", "--file", type=str, required=True)
+parser.add_argument("-a", "--max_alpha_square", type=float, required=True)
+parser.add_argument("-n", "--number_of_landmarks", type=int, required=True)
+parser.add_argument("-d", "--limit_dimension", type=int, required=True)
+parser.add_argument('--no-diagram', default=False, action='store_true' , help='Flag for not to display the diagrams')
+
+args = parser.parse_args()
+
+with open(args.file, 'r') as f:
+ first_line = f.readline()
+ if (first_line == 'OFF\n') or (first_line == 'nOFF\n'):
+ print("#####################################################################")
+ print("EuclideanWitnessComplex creation from points read in a OFF file")
+
+ witnesses = gudhi.read_off(off_file=args.file)
+ landmarks = gudhi.pick_n_random_points(points=witnesses, nb_points=args.number_of_landmarks)
+
+ message = "EuclideanWitnessComplex with max_edge_length=" + repr(args.max_alpha_square) + \
+ " - Number of landmarks=" + repr(args.number_of_landmarks)
+ print(message)
+
+ witness_complex = gudhi.EuclideanWitnessComplex(witnesses=witnesses, landmarks=landmarks)
+ simplex_tree = witness_complex.create_simplex_tree(max_alpha_square=args.max_alpha_square,
+ limit_dimension=args.limit_dimension)
+
+ message = "Number of simplices=" + repr(simplex_tree.num_simplices())
+ print(message)
+
+ diag = simplex_tree.persistence()
+
+ print("betti_numbers()=")
+ print(simplex_tree.betti_numbers())
+
+ if args.no_diagram == False:
+ gudhi.plot_persistence_diagram(diag)
+
+ else:
+ print(args.file, "is not a valid OFF file")
+
+ f.close()
diff --git a/cython/example/gudhi_graphical_tools_example.py b/cython/example/gudhi_graphical_tools_example.py
new file mode 100755
index 00000000..bc3b16ec
--- /dev/null
+++ b/cython/example/gudhi_graphical_tools_example.py
@@ -0,0 +1,47 @@
+#!/usr/bin/env python
+
+import gudhi
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+print("#####################################################################")
+print("Show palette colors values for dimension")
+
+gudhi.show_palette_values()
+
+print("#####################################################################")
+print("Show barcode persistence example")
+
+persistence = [(2, (1.0, float('inf'))), (1, (1.4142135623730951, float('inf'))),
+ (1, (1.4142135623730951, float('inf'))), (0, (0.0, float('inf'))),
+ (0, (0.0, 1.0)), (0, (0.0, 1.0)), (0, (0.0, 1.0))]
+gudhi.plot_persistence_barcode(persistence)
+
+print("#####################################################################")
+print("Show diagram persistence example")
+
+gudhi.plot_persistence_diagram(persistence)
diff --git a/cython/example/periodic_cubical_complex_barcode_persistence_from_perseus_file_example.py b/cython/example/periodic_cubical_complex_barcode_persistence_from_perseus_file_example.py
new file mode 100755
index 00000000..00334121
--- /dev/null
+++ b/cython/example/periodic_cubical_complex_barcode_persistence_from_perseus_file_example.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+
+import gudhi
+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): Vincent Rouvreau
+
+ Copyright (C) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+def is_file_perseus(file):
+ num_lines = open(file).read().count('\n')
+ try:
+ f = open(file)
+ num_dim = int(f.readline())
+ coeff = 1
+ for dim in range(0, num_dim):
+ try:
+ line = int(f.readline())
+ coeff *= abs(line)
+ except ValueError:
+ return False
+ if num_lines == (1 + num_dim + coeff):
+ return True
+ else:
+ return False
+ except ValueError:
+ return False
+
+parser = argparse.ArgumentParser(description='Periodic cubical complex from a '
+ 'Perseus-style file name.',
+ epilog='Example: '
+ './periodic_cubical_complex_barcode_persistence_from_perseus_file_example.py'
+ ' -f ../data/bitmap/CubicalTwoSphere.txt')
+
+parser.add_argument("-f", "--file", type=str, required=True)
+parser.add_argument('--no-barcode', default=False, action='store_true' , help='Flag for not to display the barcodes')
+
+args = parser.parse_args()
+
+if is_file_perseus(args.file):
+ print("#####################################################################")
+ print("PeriodicCubicalComplex creation")
+ periodic_cubical_complex = gudhi.PeriodicCubicalComplex(perseus_file=args.file)
+
+ print("persistence(homology_coeff_field=3, min_persistence=0)=")
+ diag = periodic_cubical_complex.persistence(homology_coeff_field=3, min_persistence=0)
+ print(diag)
+
+ print("betti_numbers()=")
+ print(periodic_cubical_complex.betti_numbers())
+ if args.no_barcode == False:
+ gudhi.plot_persistence_barcode(diag)
+else:
+ print(args.file, "is not a valid perseus style file")
diff --git a/cython/example/random_cubical_complex_persistence_example.py b/cython/example/random_cubical_complex_persistence_example.py
new file mode 100755
index 00000000..c832d6bf
--- /dev/null
+++ b/cython/example/random_cubical_complex_persistence_example.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+
+import gudhi
+import numpy
+from functools import reduce
+import argparse
+import operator
+
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+parser = argparse.ArgumentParser(description='Random cubical complex.',
+ epilog='Example: '
+ './random_cubical_complex_persistence_example.py'
+ ' 10 10 10 - Constructs a random cubical '
+ 'complex in a dimension [10, 10, 10] (aka. '
+ '1000 random top dimensional cells).')
+parser.add_argument('dimension', type=int, nargs="*",
+ help='Cubical complex dimensions')
+
+args = parser.parse_args()
+dimension_multiplication = reduce(operator.mul, args.dimension, 1)
+
+if dimension_multiplication > 1:
+ print("#####################################################################")
+ print("CubicalComplex creation")
+ cubical_complex = gudhi.CubicalComplex(dimensions=args.dimension,
+ top_dimensional_cells = numpy.random.rand(dimension_multiplication))
+
+ print("persistence(homology_coeff_field=2, min_persistence=0)=")
+ print(cubical_complex.persistence(homology_coeff_field=2, min_persistence=0))
+
+ print("betti_numbers()=")
+ print(cubical_complex.betti_numbers())
diff --git a/cython/example/rips_complex_diagram_persistence_from_distance_matrix_file_example.py b/cython/example/rips_complex_diagram_persistence_from_distance_matrix_file_example.py
new file mode 100755
index 00000000..664eb5c4
--- /dev/null
+++ b/cython/example/rips_complex_diagram_persistence_from_distance_matrix_file_example.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+
+import gudhi
+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): Vincent Rouvreau
+
+ Copyright (C) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+parser = argparse.ArgumentParser(description='RipsComplex creation from '
+ 'a distance matrix read in a OFF file.',
+ epilog='Example: '
+ 'example/rips_complex_diagram_persistence_from_distance_matrix_file_example.py '
+ '-f ../data/distance_matrix/lower_triangular_distance_matrix.csv -e 12.0 -d 3'
+ '- Constructs a Rips complex with the '
+ 'points from the given OFF file.')
+parser.add_argument("-f", "--file", type=str, required=True)
+parser.add_argument("-e", "--max_edge_length", type=float, default=0.5)
+parser.add_argument("-d", "--max_dimension", type=int, default=1)
+parser.add_argument('--no-diagram', default=False, action='store_true' , help='Flag for not to display the diagrams')
+
+args = parser.parse_args()
+
+with open(args.file, 'r') as f:
+ first_line = f.readline()
+ if (first_line == 'OFF\n') or (first_line == 'nOFF\n'):
+ print("#####################################################################")
+ print("RipsComplex creation from distance matrix read in a csv file")
+
+ message = "RipsComplex with max_edge_length=" + repr(args.max_edge_length)
+ print(message)
+
+ rips_complex = gudhi.RipsComplex(off_file=args.file, max_edge_length=args.max_edge_length)
+ simplex_tree = rips_complex.create_simplex_tree(max_dimension=args.max_dimension)
+
+ message = "Number of simplices=" + repr(simplex_tree.num_simplices())
+ print(message)
+
+ diag = simplex_tree.persistence()
+
+ print("betti_numbers()=")
+ print(simplex_tree.betti_numbers())
+
+ if args.no_diagram == False:
+ gudhi.plot_persistence_diagram(diag)
+ else:
+ print(args.file, "is not a valid OFF file")
+
+ f.close()
diff --git a/cython/example/rips_complex_diagram_persistence_from_off_file_example.py b/cython/example/rips_complex_diagram_persistence_from_off_file_example.py
new file mode 100755
index 00000000..4c21b98e
--- /dev/null
+++ b/cython/example/rips_complex_diagram_persistence_from_off_file_example.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+
+import gudhi
+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): Vincent Rouvreau
+
+ Copyright (C) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+parser = argparse.ArgumentParser(description='RipsComplex creation from '
+ 'points read in a OFF file.',
+ epilog='Example: '
+ 'example/rips_complex_diagram_persistence_from_off_file_example.py '
+ '-f ../data/points/tore3D_300.off -a 0.6'
+ '- Constructs a Rips complex with the '
+ 'points from the given OFF file.')
+parser.add_argument("-f", "--file", type=str, required=True)
+parser.add_argument("-e", "--max_edge_length", type=float, default=0.5)
+parser.add_argument("-d", "--max_dimension", type=int, default=1)
+parser.add_argument('--no-diagram', default=False, action='store_true' , help='Flag for not to display the diagrams')
+
+args = parser.parse_args()
+
+with open(args.file, 'r') as f:
+ first_line = f.readline()
+ if (first_line == 'OFF\n') or (first_line == 'nOFF\n'):
+ print("#####################################################################")
+ print("RipsComplex creation from points read in a OFF file")
+
+ message = "RipsComplex with max_edge_length=" + repr(args.max_edge_length)
+ print(message)
+
+ rips_complex = gudhi.RipsComplex(off_file=args.file, max_edge_length=args.max_edge_length)
+ simplex_tree = rips_complex.create_simplex_tree(max_dimension=args.max_dimension)
+
+ message = "Number of simplices=" + repr(simplex_tree.num_simplices())
+ print(message)
+
+ diag = simplex_tree.persistence()
+
+ print("betti_numbers()=")
+ print(simplex_tree.betti_numbers())
+
+ if args.no_diagram == False:
+ gudhi.plot_persistence_diagram(diag)
+ else:
+ print(args.file, "is not a valid OFF file")
+
+ f.close()
diff --git a/cython/example/rips_complex_from_points_example.py b/cython/example/rips_complex_from_points_example.py
new file mode 100755
index 00000000..5d411b1a
--- /dev/null
+++ b/cython/example/rips_complex_from_points_example.py
@@ -0,0 +1,40 @@
+#!/usr/bin/env python
+
+import gudhi
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+print("#####################################################################")
+print("RipsComplex creation from points")
+rips = gudhi.RipsComplex(points=[[0, 0], [1, 0], [0, 1], [1, 1]],
+ max_edge_length=42)
+
+simplex_tree = rips.create_simplex_tree(max_dimension=1)
+
+print("filtrations=", simplex_tree.get_filtration())
+print("star([0])=", simplex_tree.get_star([0]))
+print("coface([0], 1)=", simplex_tree.get_cofaces([0], 1))
diff --git a/cython/example/rips_persistence_diagram.py b/cython/example/rips_persistence_diagram.py
new file mode 100755
index 00000000..4e5cd2c8
--- /dev/null
+++ b/cython/example/rips_persistence_diagram.py
@@ -0,0 +1,42 @@
+#!/usr/bin/env python
+
+import gudhi
+
+"""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): Marc Glisse
+
+ Copyright (C) 2016 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__ = "Marc Glisse"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+print("#####################################################################")
+print("RipsComplex creation from points")
+rips = gudhi.RipsComplex(points=[[0, 0], [1, 0], [0, 1], [1, 1]],
+ max_edge_length=42)
+
+simplex_tree = rips.create_simplex_tree(max_dimension=1)
+
+
+diag = simplex_tree.persistence(homology_coeff_field=2, min_persistence=0)
+print("diag=", diag)
+
+gudhi.plot_persistence_diagram(diag)
diff --git a/cython/example/simplex_tree_example.py b/cython/example/simplex_tree_example.py
new file mode 100755
index 00000000..3af20fcf
--- /dev/null
+++ b/cython/example/simplex_tree_example.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+
+import gudhi
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+print("#####################################################################")
+print("SimplexTree creation from insertion")
+
+st = gudhi.SimplexTree()
+
+if st.insert([0, 1]):
+ print("Inserted !!")
+else:
+ print("Not inserted...")
+
+if st.find([0, 1]):
+ print("Found !!")
+else:
+ print("Not found...")
+
+if st.insert([0, 1, 2], filtration=4.0):
+ print("Inserted !!")
+else:
+ print("Not inserted...")
+
+# FIXME: Remove this line
+st.set_dimension(3)
+print("dimension=", st.dimension())
+
+st.set_filtration(4.0)
+st.initialize_filtration()
+print("filtration=", st.get_filtration())
+print("filtration[1, 2]=", st.filtration([1, 2]))
+print("filtration[4, 2]=", st.filtration([4, 2]))
+
+print("num_simplices=", st.num_simplices())
+print("num_vertices=", st.num_vertices())
+
+print("skeleton[2]=", st.get_skeleton(2))
+print("skeleton[1]=", st.get_skeleton(1))
+print("skeleton[0]=", st.get_skeleton(0))
diff --git a/cython/example/tangential_complex_plain_homology_from_off_file_example.py b/cython/example/tangential_complex_plain_homology_from_off_file_example.py
new file mode 100755
index 00000000..4845eb47
--- /dev/null
+++ b/cython/example/tangential_complex_plain_homology_from_off_file_example.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+
+import gudhi
+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): Vincent Rouvreau
+
+ Copyright (C) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+parser = argparse.ArgumentParser(description='TangentialComplex creation from '
+ 'points read in a OFF file.',
+ epilog='Example: '
+ 'example/tangential_complex_plain_homology_from_off_file_example.py '
+ '-f ../data/points/tore3D_300.off'
+ '- Constructs a tangential complex with the '
+ 'points from the given OFF file')
+parser.add_argument("-f", "--file", type=str, required=True)
+parser.add_argument('--no-diagram', default=False, action='store_true' , help='Flag for not to display the diagrams')
+
+args = parser.parse_args()
+
+with open(args.file, 'r') as f:
+ first_line = f.readline()
+ if (first_line == 'OFF\n') or (first_line == 'nOFF\n'):
+ print("#####################################################################")
+ print("TangentialComplex creation from points read in a OFF file")
+
+ tc = gudhi.TangentialComplex(off_file=args.file)
+ st = tc.create_simplex_tree()
+
+ message = "Number of simplices=" + repr(st.num_simplices())
+ print(message)
+
+ diag = st.persistence(persistence_dim_max = True)
+
+ print("betti_numbers()=")
+ print(st.betti_numbers())
+
+ if args.no_diagram == False:
+ gudhi.plot_persistence_diagram(diag)
+ else:
+ print(args.file, "is not a valid OFF file")
+
+ f.close()
diff --git a/cython/example/witness_complex_from_nearest_landmark_table.py b/cython/example/witness_complex_from_nearest_landmark_table.py
new file mode 100755
index 00000000..92ed970b
--- /dev/null
+++ b/cython/example/witness_complex_from_nearest_landmark_table.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python
+
+from gudhi import StrongWitnessComplex, SimplexTree
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+print("#####################################################################")
+print("WitnessComplex creation from nearest landmark table")
+nearest_landmark_table = [[[0, 0], [1, 1], [2, 2], [3, 3], [4, 4]],
+ [[1, 0], [2, 1], [3, 2], [4, 3], [0, 4]],
+ [[2, 0], [3, 1], [4, 2], [0, 3], [1, 4]],
+ [[3, 0], [4, 1], [0, 2], [1, 3], [2, 4]],
+ [[4, 0], [0, 1], [1, 2], [2, 3], [3, 4]]]
+
+witness_complex = StrongWitnessComplex(nearest_landmark_table=nearest_landmark_table)
+simplex_tree = witness_complex.create_simplex_tree(max_alpha_square=4.1)
+
+message = "Number of simplices: " + repr(simplex_tree.num_simplices())
+print(message)
+
+diag = simplex_tree.persistence(min_persistence=-0.1, homology_coeff_field=11)
+print(diag)
diff --git a/cython/gudhi.pyx.in b/cython/gudhi.pyx.in
new file mode 100644
index 00000000..34d7c3b5
--- /dev/null
+++ b/cython/gudhi.pyx.in
@@ -0,0 +1,39 @@
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+include "cython/off_reader.pyx"
+include "cython/simplex_tree.pyx"
+include "cython/rips_complex.pyx"
+include "cython/cubical_complex.pyx"
+include "cython/periodic_cubical_complex.pyx"
+include "cython/persistence_graphical_tools.py"
+include "cython/witness_complex.pyx"
+include "cython/strong_witness_complex.pyx"
+@GUDHI_CYTHON_ALPHA_COMPLEX@
+@GUDHI_CYTHON_EUCLIDEAN_WITNESS_COMPLEX@
+@GUDHI_CYTHON_SUBSAMPLING@
+@GUDHI_CYTHON_TANGENTIAL_COMPLEX@
+@GUDHI_CYTHON_BOTTLENECK_DISTANCE@
diff --git a/cython/include/Alpha_complex_interface.h b/cython/include/Alpha_complex_interface.h
new file mode 100644
index 00000000..d47db71f
--- /dev/null
+++ b/cython/include/Alpha_complex_interface.h
@@ -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): Vincent Rouvreau
+ *
+ * Copyright (C) 2016 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 INCLUDE_ALPHA_COMPLEX_INTERFACE_H_
+#define INCLUDE_ALPHA_COMPLEX_INTERFACE_H_
+
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/Alpha_complex.h>
+#include <CGAL/Epick_d.h>
+
+#include "Simplex_tree_interface.h"
+
+#include <iostream>
+#include <vector>
+#include <string>
+
+namespace Gudhi {
+
+namespace alpha_complex {
+
+class Alpha_complex_interface {
+ using Dynamic_kernel = CGAL::Epick_d< CGAL::Dynamic_dimension_tag >;
+ using Point_d = Dynamic_kernel::Point_d;
+
+ public:
+ Alpha_complex_interface(const std::vector<std::vector<double>>& points) {
+ alpha_complex_ = new Alpha_complex<Dynamic_kernel>(points);
+ }
+
+ Alpha_complex_interface(const std::string& off_file_name, bool from_file = true) {
+ alpha_complex_ = new Alpha_complex<Dynamic_kernel>(off_file_name);
+ }
+
+ ~Alpha_complex_interface() {
+ delete alpha_complex_;
+ }
+
+ std::vector<double> get_point(int vh) {
+ std::vector<double> vd;
+ try {
+ Point_d ph = alpha_complex_->get_point(vh);
+ for (auto coord = ph.cartesian_begin(); coord < ph.cartesian_end(); coord++)
+ vd.push_back(*coord);
+ } catch (std::out_of_range outofrange) {
+ // std::out_of_range is thrown in case not found. Other exceptions must be re-thrown
+ }
+ return vd;
+ }
+
+ void create_simplex_tree(Simplex_tree_interface<>* simplex_tree, double max_alpha_square) {
+ alpha_complex_->create_complex(*simplex_tree, max_alpha_square);
+ simplex_tree->initialize_filtration();
+ }
+
+ private:
+ Alpha_complex<Dynamic_kernel>* alpha_complex_;
+};
+
+} // namespace alpha_complex
+
+} // namespace Gudhi
+
+#endif // INCLUDE_ALPHA_COMPLEX_INTERFACE_H_
diff --git a/cython/include/Bottleneck_distance_interface.h b/cython/include/Bottleneck_distance_interface.h
new file mode 100644
index 00000000..d5fbf6ea
--- /dev/null
+++ b/cython/include/Bottleneck_distance_interface.h
@@ -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): Vincent Rouvreau
+ *
+ * Copyright (C) 2016 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 INCLUDE_BOTTLENECK_DISTANCE_INTERFACE_H_
+#define INCLUDE_BOTTLENECK_DISTANCE_INTERFACE_H_
+
+#include <gudhi/Bottleneck.h>
+
+#include <iostream>
+#include <vector>
+#include <utility> // for std::pair
+
+namespace Gudhi {
+
+namespace persistence_diagram {
+
+ // bottleneck_distance function renamed for the python function can be called bottleneck_dstance
+ double bottleneck(const std::vector<std::pair<double, double>>& diag1,
+ const std::vector<std::pair<double, double>>& diag2,
+ double e) {
+ return bottleneck_distance(diag1, diag2, e);
+ }
+
+ double bottleneck(const std::vector<std::pair<double, double>>& diag1,
+ const std::vector<std::pair<double, double>>& diag2) {
+ return bottleneck_distance(diag1, diag2);
+ }
+
+} // namespace persistence_diagram
+
+} // namespace Gudhi
+
+
+#endif // INCLUDE_BOTTLENECK_DISTANCE_INTERFACE_H_
diff --git a/cython/include/Cubical_complex_interface.h b/cython/include/Cubical_complex_interface.h
new file mode 100644
index 00000000..7c0148f1
--- /dev/null
+++ b/cython/include/Cubical_complex_interface.h
@@ -0,0 +1,56 @@
+/* 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) 2016 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 INCLUDE_CUBICAL_COMPLEX_INTERFACE_H_
+#define INCLUDE_CUBICAL_COMPLEX_INTERFACE_H_
+
+#include <gudhi/Bitmap_cubical_complex.h>
+#include <gudhi/Bitmap_cubical_complex_base.h>
+#include <gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h>
+
+#include <iostream>
+#include <vector>
+#include <string>
+
+namespace Gudhi {
+
+namespace cubical_complex {
+
+template<typename CubicalComplexOptions = Bitmap_cubical_complex_base<double>>
+class Cubical_complex_interface : public Bitmap_cubical_complex<CubicalComplexOptions> {
+ public:
+ Cubical_complex_interface(const std::vector<unsigned>& dimensions,
+ const std::vector<double>& top_dimensional_cells)
+ : Bitmap_cubical_complex<CubicalComplexOptions>(dimensions, top_dimensional_cells) {
+ }
+
+ Cubical_complex_interface(const std::string& perseus_file)
+ : Bitmap_cubical_complex<CubicalComplexOptions>(perseus_file.c_str()) {
+ }
+};
+
+} // namespace cubical_complex
+
+} // namespace Gudhi
+
+#endif // INCLUDE_CUBICAL_COMPLEX_INTERFACE_H_
+
diff --git a/cython/include/Euclidean_strong_witness_complex_interface.h b/cython/include/Euclidean_strong_witness_complex_interface.h
new file mode 100644
index 00000000..b9dd8177
--- /dev/null
+++ b/cython/include/Euclidean_strong_witness_complex_interface.h
@@ -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): Vincent Rouvreau
+ *
+ * Copyright (C) 2016 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 INCLUDE_EUCLIDEAN_STRONG_WITNESS_COMPLEX_INTERFACE_H_
+#define INCLUDE_EUCLIDEAN_STRONG_WITNESS_COMPLEX_INTERFACE_H_
+
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/Euclidean_strong_witness_complex.h>
+
+#include "Simplex_tree_interface.h"
+
+#include <CGAL/Epick_d.h>
+
+#include <vector>
+#include <utility> // std::pair
+#include <iostream>
+#include <cstddef>
+
+namespace Gudhi {
+
+namespace witness_complex {
+
+
+class Euclidean_strong_witness_complex_interface {
+ using Dynamic_kernel = CGAL::Epick_d< CGAL::Dynamic_dimension_tag >;
+ using Point_d = Dynamic_kernel::Point_d;
+
+ typedef typename Simplex_tree<>::Simplex_key Simplex_key;
+
+ public:
+ Euclidean_strong_witness_complex_interface(const std::vector<std::vector<double>>& landmarks,
+ const std::vector<std::vector<double>>& witnesses) {
+ landmarks_.reserve(landmarks.size());
+ for (auto& landmark : landmarks)
+ landmarks_.emplace_back(landmark.begin(), landmark.end());
+ witness_complex_ = new Euclidean_strong_witness_complex<Dynamic_kernel>(landmarks_, witnesses);
+ }
+
+ ~Euclidean_strong_witness_complex_interface() {
+ delete witness_complex_;
+ }
+
+ void create_simplex_tree(Gudhi::Simplex_tree<>* simplex_tree, double max_alpha_square,
+ std::size_t limit_dimension) {
+ witness_complex_->create_complex(*simplex_tree, max_alpha_square, limit_dimension);
+ simplex_tree->initialize_filtration();
+ }
+
+ void create_simplex_tree(Gudhi::Simplex_tree<>* simplex_tree, double max_alpha_square) {
+ witness_complex_->create_complex(*simplex_tree, max_alpha_square);
+ simplex_tree->initialize_filtration();
+ }
+
+ std::vector<double> get_point(unsigned vh) {
+ std::vector<double> vd;
+ if (vh < landmarks_.size()) {
+ Point_d ph = witness_complex_->get_point(vh);
+ for (auto coord = ph.cartesian_begin(); coord < ph.cartesian_end(); coord++)
+ vd.push_back(*coord);
+ }
+ return vd;
+ }
+
+ private:
+ std::vector<Point_d> landmarks_;
+ Euclidean_strong_witness_complex<Dynamic_kernel>* witness_complex_;
+};
+
+} // namespace witness_complex
+
+} // namespace Gudhi
+
+#endif // INCLUDE_EUCLIDEAN_STRONG_WITNESS_COMPLEX_INTERFACE_H_
+
diff --git a/cython/include/Euclidean_witness_complex_interface.h b/cython/include/Euclidean_witness_complex_interface.h
new file mode 100644
index 00000000..2a09b3b5
--- /dev/null
+++ b/cython/include/Euclidean_witness_complex_interface.h
@@ -0,0 +1,92 @@
+/* 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) 2016 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 INCLUDE_EUCLIDEAN_WITNESS_COMPLEX_INTERFACE_H_
+#define INCLUDE_EUCLIDEAN_WITNESS_COMPLEX_INTERFACE_H_
+
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/Euclidean_witness_complex.h>
+
+#include "Simplex_tree_interface.h"
+
+#include <CGAL/Epick_d.h>
+
+#include <vector>
+#include <utility> // std::pair
+#include <iostream>
+#include <cstddef>
+
+namespace Gudhi {
+
+namespace witness_complex {
+
+
+class Euclidean_witness_complex_interface {
+ using Dynamic_kernel = CGAL::Epick_d< CGAL::Dynamic_dimension_tag >;
+ using Point_d = Dynamic_kernel::Point_d;
+
+ typedef typename Simplex_tree<>::Simplex_key Simplex_key;
+
+ public:
+ Euclidean_witness_complex_interface(const std::vector<std::vector<double>>& landmarks,
+ const std::vector<std::vector<double>>& witnesses) {
+ landmarks_.reserve(landmarks.size());
+ for (auto& landmark : landmarks)
+ landmarks_.emplace_back(landmark.begin(), landmark.end());
+ witness_complex_ = new Euclidean_witness_complex<Dynamic_kernel>(landmarks_, witnesses);
+ }
+
+ ~Euclidean_witness_complex_interface() {
+ delete witness_complex_;
+ }
+
+ void create_simplex_tree(Gudhi::Simplex_tree<>* simplex_tree, double max_alpha_square, std::size_t limit_dimension) {
+ witness_complex_->create_complex(*simplex_tree, max_alpha_square, limit_dimension);
+ simplex_tree->initialize_filtration();
+ }
+
+ void create_simplex_tree(Gudhi::Simplex_tree<>* simplex_tree, double max_alpha_square) {
+ witness_complex_->create_complex(*simplex_tree, max_alpha_square);
+ simplex_tree->initialize_filtration();
+ }
+
+ std::vector<double> get_point(unsigned vh) {
+ std::vector<double> vd;
+ if (vh < landmarks_.size()) {
+ Point_d ph = witness_complex_->get_point(vh);
+ for (auto coord = ph.cartesian_begin(); coord < ph.cartesian_end(); coord++)
+ vd.push_back(*coord);
+ }
+ return vd;
+ }
+
+ private:
+ std::vector<Point_d> landmarks_;
+ Euclidean_witness_complex<Dynamic_kernel>* witness_complex_;
+};
+
+} // namespace witness_complex
+
+} // namespace Gudhi
+
+#endif // INCLUDE_EUCLIDEAN_WITNESS_COMPLEX_INTERFACE_H_
+
diff --git a/cython/include/Off_reader_interface.h b/cython/include/Off_reader_interface.h
new file mode 100644
index 00000000..0ca55500
--- /dev/null
+++ b/cython/include/Off_reader_interface.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): Vincent Rouvreau
+ *
+ * Copyright (C) 2016 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 INCLUDE_OFF_READER_INTERFACE_H_
+#define INCLUDE_OFF_READER_INTERFACE_H_
+
+#include <gudhi/Points_off_io.h>
+
+#include <iostream>
+#include <vector>
+#include <string>
+
+namespace Gudhi {
+
+std::vector<std::vector<double>> read_points_from_OFF_file(const std::string& off_file) {
+ Gudhi::Points_off_reader<std::vector<double>> off_reader(off_file);
+ return off_reader.get_point_cloud();
+}
+
+} // namespace Gudhi
+
+#endif // INCLUDE_OFF_READER_INTERFACE_H_
+
diff --git a/cython/include/Persistent_cohomology_interface.h b/cython/include/Persistent_cohomology_interface.h
new file mode 100644
index 00000000..55028fd0
--- /dev/null
+++ b/cython/include/Persistent_cohomology_interface.h
@@ -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): Vincent Rouvreau
+ *
+ * Copyright (C) 2016 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 INCLUDE_PERSISTENT_COHOMOLOGY_INTERFACE_H_
+#define INCLUDE_PERSISTENT_COHOMOLOGY_INTERFACE_H_
+
+#include <gudhi/Persistent_cohomology.h>
+
+#include <vector>
+#include <utility> // for std::pair
+#include <algorithm> // for sort
+
+namespace Gudhi {
+
+template<class FilteredComplex>
+class Persistent_cohomology_interface : public
+persistent_cohomology::Persistent_cohomology<FilteredComplex, persistent_cohomology::Field_Zp> {
+ private:
+ /*
+ * Compare two intervals by dimension, then by length.
+ */
+ struct cmp_intervals_by_dim_then_length {
+ explicit cmp_intervals_by_dim_then_length(FilteredComplex * sc)
+ : sc_(sc) { }
+
+ template<typename Persistent_interval>
+ bool operator()(const Persistent_interval & p1, const Persistent_interval & p2) {
+ if (sc_->dimension(get < 0 > (p1)) == sc_->dimension(get < 0 > (p2)))
+ return (sc_->filtration(get < 1 > (p1)) - sc_->filtration(get < 0 > (p1))
+ > sc_->filtration(get < 1 > (p2)) - sc_->filtration(get < 0 > (p2)));
+ else
+ return (sc_->dimension(get < 0 > (p1)) > sc_->dimension(get < 0 > (p2)));
+ }
+ FilteredComplex* sc_;
+ };
+
+ public:
+ Persistent_cohomology_interface(FilteredComplex* stptr)
+ : persistent_cohomology::Persistent_cohomology<FilteredComplex, persistent_cohomology::Field_Zp>(*stptr),
+ stptr_(stptr) { }
+
+ Persistent_cohomology_interface(FilteredComplex* stptr, bool persistence_dim_max)
+ : persistent_cohomology::Persistent_cohomology<FilteredComplex,
+ persistent_cohomology::Field_Zp>(*stptr, persistence_dim_max),
+ stptr_(stptr) { }
+
+ std::vector<std::pair<int, std::pair<double, double>>> get_persistence(int homology_coeff_field,
+ double min_persistence) {
+ persistent_cohomology::Persistent_cohomology<FilteredComplex,
+ persistent_cohomology::Field_Zp>::init_coefficients(homology_coeff_field);
+ persistent_cohomology::Persistent_cohomology<FilteredComplex,
+ persistent_cohomology::Field_Zp>::compute_persistent_cohomology(min_persistence);
+
+ // Custom sort and output persistence
+ cmp_intervals_by_dim_then_length cmp(stptr_);
+ auto persistent_pairs = persistent_cohomology::Persistent_cohomology<FilteredComplex,
+ persistent_cohomology::Field_Zp>::get_persistent_pairs();
+ std::sort(std::begin(persistent_pairs), std::end(persistent_pairs), cmp);
+
+ std::vector<std::pair<int, std::pair<double, double>>> persistence;
+ for (auto pair : persistent_pairs) {
+ persistence.push_back(std::make_pair(stptr_->dimension(get<0>(pair)),
+ std::make_pair(stptr_->filtration(get<0>(pair)),
+ stptr_->filtration(get<1>(pair)))));
+ }
+ return persistence;
+ }
+
+ private:
+ // A copy
+ FilteredComplex* stptr_;
+};
+
+} // namespace Gudhi
+
+#endif // INCLUDE_PERSISTENT_COHOMOLOGY_INTERFACE_H_
diff --git a/cython/include/Rips_complex_interface.h b/cython/include/Rips_complex_interface.h
new file mode 100644
index 00000000..6d813f4a
--- /dev/null
+++ b/cython/include/Rips_complex_interface.h
@@ -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): Vincent Rouvreau
+ *
+ * Copyright (C) 2016 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 INCLUDE_RIPS_COMPLEX_INTERFACE_H_
+#define INCLUDE_RIPS_COMPLEX_INTERFACE_H_
+
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/Rips_complex.h>
+#include <gudhi/Points_off_io.h>
+#include <gudhi/distance_functions.h>
+#include <gudhi/reader_utils.h>
+
+#include "Simplex_tree_interface.h"
+
+#include <iostream>
+#include <vector>
+#include <utility> // std::pair
+#include <string>
+
+namespace Gudhi {
+
+namespace rips_complex {
+
+class Rips_complex_interface {
+ using Point_d = std::vector<double>;
+ using Distance_matrix = std::vector<std::vector<Simplex_tree_interface<>::Filtration_value>>;
+
+ public:
+ Rips_complex_interface(const std::vector<std::vector<double>>& values, double threshold, bool euclidean) {
+ if (euclidean) {
+ // Rips construction where values is a vector of points
+ rips_complex_ = new Rips_complex<Simplex_tree_interface<>::Filtration_value>(values, threshold,
+ Gudhi::Euclidean_distance());
+ } else {
+ // Rips construction where values is a distance matrix
+ rips_complex_ = new Rips_complex<Simplex_tree_interface<>::Filtration_value>(values, threshold);
+ }
+ }
+
+ Rips_complex_interface(const std::string& file_name, double threshold, bool euclidean, bool from_file = true) {
+ if (euclidean) {
+ // Rips construction where file_name is an OFF file
+ Gudhi::Points_off_reader<Point_d> off_reader(file_name);
+ rips_complex_ = new Rips_complex<Simplex_tree_interface<>::Filtration_value>(off_reader.get_point_cloud(),
+ threshold,
+ Gudhi::Euclidean_distance());
+ } else {
+ // Rips construction where values is a distance matrix
+ Distance_matrix distances =
+ read_lower_triangular_matrix_from_csv_file<Simplex_tree_interface<>::Filtration_value>(file_name);
+ rips_complex_ = new Rips_complex<Simplex_tree_interface<>::Filtration_value>(distances, threshold);
+ }
+ }
+
+ void create_simplex_tree(Simplex_tree_interface<>* simplex_tree, int dim_max) {
+ rips_complex_->create_complex(*simplex_tree, dim_max);
+ simplex_tree->initialize_filtration();
+ }
+
+ private:
+ Rips_complex<Simplex_tree_interface<>::Filtration_value>* rips_complex_;
+};
+
+} // namespace rips_complex
+
+} // namespace Gudhi
+
+#endif // INCLUDE_RIPS_COMPLEX_INTERFACE_H_
diff --git a/cython/include/Simplex_tree_interface.h b/cython/include/Simplex_tree_interface.h
new file mode 100644
index 00000000..45ce1916
--- /dev/null
+++ b/cython/include/Simplex_tree_interface.h
@@ -0,0 +1,154 @@
+/* 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) 2016 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 INCLUDE_SIMPLEX_TREE_INTERFACE_H_
+#define INCLUDE_SIMPLEX_TREE_INTERFACE_H_
+
+#include <gudhi/graph_simplicial_complex.h>
+#include <gudhi/distance_functions.h>
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/Points_off_io.h>
+
+#include "Persistent_cohomology_interface.h"
+
+#include <iostream>
+#include <vector>
+#include <utility> // std::pair
+
+namespace Gudhi {
+
+template<typename SimplexTreeOptions = Simplex_tree_options_full_featured>
+class Simplex_tree_interface : public Simplex_tree<SimplexTreeOptions> {
+ public:
+ using Base = Simplex_tree<SimplexTreeOptions>;
+ using Filtration_value = typename Base::Filtration_value;
+ using Vertex_handle = typename Base::Vertex_handle;
+ using Simplex_handle = typename Base::Simplex_handle;
+ using Insertion_result = typename std::pair<Simplex_handle, bool>;
+ using Simplex = std::vector<Vertex_handle>;
+ using Complex = std::vector<std::pair<Simplex, Filtration_value>>;
+
+ public:
+ bool find_simplex(const Simplex& vh) {
+ return (Base::find(vh) != Base::null_simplex());
+ }
+
+ bool insert(const Simplex& simplex, Filtration_value filtration = 0) {
+ Insertion_result result = Base::insert_simplex_and_subfaces(simplex, filtration);
+ return (result.second);
+ }
+
+ // Do not interface this function, only used in alpha complex interface for complex creation
+ bool insert_simplex(const Simplex& simplex, Filtration_value filtration = 0) {
+ Insertion_result result = Base::insert_simplex(simplex, filtration);
+ return (result.second);
+ }
+
+ // Do not interface this function, only used in interface for complex creation
+ bool insert_simplex_and_subfaces(const Simplex& simplex, Filtration_value filtration = 0) {
+ Insertion_result result = Base::insert_simplex_and_subfaces(simplex, filtration);
+ return (result.second);
+ }
+
+ // Do not interface this function, only used in strong witness interface for complex creation
+ bool insert_simplex(const std::vector<std::size_t>& complex, Filtration_value filtration = 0) {
+ Insertion_result result = Base::insert_simplex(complex, filtration);
+ return (result.second);
+ }
+
+ // Do not interface this function, only used in strong witness interface for complex creation
+ bool insert_simplex_and_subfaces(const std::vector<std::size_t>& complex, Filtration_value filtration = 0) {
+ Insertion_result result = Base::insert_simplex_and_subfaces(complex, filtration);
+ return (result.second);
+ }
+
+ Filtration_value simplex_filtration(const Simplex& simplex) {
+ return Base::filtration(Base::find(simplex));
+ }
+
+ void remove_maximal_simplex(const Simplex& simplex) {
+ Base::remove_maximal_simplex(Base::find(simplex));
+ Base::initialize_filtration();
+ }
+
+ Complex get_filtration() {
+ Base::initialize_filtration();
+ Complex filtrations;
+ for (auto f_simplex : Base::filtration_simplex_range()) {
+ Simplex simplex;
+ for (auto vertex : Base::simplex_vertex_range(f_simplex)) {
+ simplex.insert(simplex.begin(), vertex);
+ }
+ filtrations.push_back(std::make_pair(simplex, Base::filtration(f_simplex)));
+ }
+ return filtrations;
+ }
+
+ Complex get_skeleton(int dimension) {
+ Complex skeletons;
+ for (auto f_simplex : Base::skeleton_simplex_range(dimension)) {
+ Simplex simplex;
+ for (auto vertex : Base::simplex_vertex_range(f_simplex)) {
+ simplex.insert(simplex.begin(), vertex);
+ }
+ skeletons.push_back(std::make_pair(simplex, Base::filtration(f_simplex)));
+ }
+ return skeletons;
+ }
+
+ Complex get_star(const Simplex& simplex) {
+ Complex star;
+ for (auto f_simplex : Base::star_simplex_range(Base::find(simplex))) {
+ Simplex simplex_star;
+ for (auto vertex : Base::simplex_vertex_range(f_simplex)) {
+ std::cout << vertex << " ";
+ simplex_star.insert(simplex_star.begin(), vertex);
+ }
+ std::cout << std::endl;
+ star.push_back(std::make_pair(simplex_star, Base::filtration(f_simplex)));
+ }
+ return star;
+ }
+
+ Complex get_cofaces(const Simplex& simplex, int dimension) {
+ Complex cofaces;
+ for (auto f_simplex : Base::cofaces_simplex_range(Base::find(simplex), dimension)) {
+ Simplex simplex_coface;
+ for (auto vertex : Base::simplex_vertex_range(f_simplex)) {
+ std::cout << vertex << " ";
+ simplex_coface.insert(simplex_coface.begin(), vertex);
+ }
+ std::cout << std::endl;
+ cofaces.push_back(std::make_pair(simplex_coface, Base::filtration(f_simplex)));
+ }
+ return cofaces;
+ }
+
+ void create_persistence(Gudhi::Persistent_cohomology_interface<Base>* pcoh) {
+ Base::initialize_filtration();
+ pcoh = new Gudhi::Persistent_cohomology_interface<Base>(*this);
+ }
+};
+
+} // namespace Gudhi
+
+#endif // INCLUDE_SIMPLEX_TREE_INTERFACE_H_
diff --git a/cython/include/Strong_witness_complex_interface.h b/cython/include/Strong_witness_complex_interface.h
new file mode 100644
index 00000000..d05eaac5
--- /dev/null
+++ b/cython/include/Strong_witness_complex_interface.h
@@ -0,0 +1,73 @@
+/* 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) 2016 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 INCLUDE_STRONG_WITNESS_COMPLEX_INTERFACE_H_
+#define INCLUDE_STRONG_WITNESS_COMPLEX_INTERFACE_H_
+
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/Strong_witness_complex.h>
+
+#include "Simplex_tree_interface.h"
+
+#include <vector>
+#include <utility> // std::pair
+#include <iostream>
+#include <cstddef>
+
+namespace Gudhi {
+
+namespace witness_complex {
+
+class Strong_witness_complex_interface {
+ using Nearest_landmark_range = std::vector<std::pair<std::size_t, double>>;
+ using Nearest_landmark_table = std::vector<Nearest_landmark_range>;
+
+ public:
+ Strong_witness_complex_interface(const Nearest_landmark_table& nlt) {
+ witness_complex_ = new Strong_witness_complex<Nearest_landmark_table>(nlt);
+ }
+
+ ~Strong_witness_complex_interface() {
+ delete witness_complex_;
+ }
+
+ void create_simplex_tree(Simplex_tree_interface<>* simplex_tree, double max_alpha_square,
+ std::size_t limit_dimension) {
+ witness_complex_->create_complex(*simplex_tree, max_alpha_square, limit_dimension);
+ simplex_tree->initialize_filtration();
+ }
+
+ void create_simplex_tree(Simplex_tree_interface<>* simplex_tree,
+ double max_alpha_square) {
+ witness_complex_->create_complex(*simplex_tree, max_alpha_square);
+ simplex_tree->initialize_filtration();
+ }
+
+ private:
+ Strong_witness_complex<Nearest_landmark_table>* witness_complex_;
+};
+
+} // namespace witness_complex
+
+} // namespace Gudhi
+
+#endif // INCLUDE_STRONG_WITNESS_COMPLEX_INTERFACE_H_
diff --git a/cython/include/Subsampling_interface.h b/cython/include/Subsampling_interface.h
new file mode 100644
index 00000000..b0f4a50a
--- /dev/null
+++ b/cython/include/Subsampling_interface.h
@@ -0,0 +1,119 @@
+/* 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) 2016 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 INCLUDE_SUBSAMPLING_INTERFACE_H_
+#define INCLUDE_SUBSAMPLING_INTERFACE_H_
+
+#include <gudhi/choose_n_farthest_points.h>
+#include <gudhi/pick_n_random_points.h>
+#include <gudhi/sparsify_point_set.h>
+#include <gudhi/Points_off_io.h>
+#include <CGAL/Epick_d.h>
+
+#include <iostream>
+#include <vector>
+#include <string>
+
+namespace Gudhi {
+
+namespace subsampling {
+
+using Subsampling_dynamic_kernel = CGAL::Epick_d< CGAL::Dynamic_dimension_tag >;
+using Subsampling_point_d = Subsampling_dynamic_kernel::Point_d;
+using Subsampling_ft = Subsampling_dynamic_kernel::FT;
+
+// ------ choose_n_farthest_points ------
+std::vector<std::vector<double>> subsampling_n_farthest_points(const std::vector<std::vector<double>>& points,
+ unsigned nb_points) {
+ std::vector<std::vector<double>> landmarks;
+ Subsampling_dynamic_kernel k;
+ choose_n_farthest_points(k, points, nb_points, random_starting_point, std::back_inserter(landmarks));
+
+ return landmarks;
+}
+
+std::vector<std::vector<double>> subsampling_n_farthest_points(const std::vector<std::vector<double>>& points,
+ unsigned nb_points, unsigned starting_point) {
+ std::vector<std::vector<double>> landmarks;
+ Subsampling_dynamic_kernel k;
+ choose_n_farthest_points(k, points, nb_points, starting_point, std::back_inserter(landmarks));
+
+ return landmarks;
+}
+
+std::vector<std::vector<double>> subsampling_n_farthest_points_from_file(const std::string& off_file,
+ unsigned nb_points) {
+ Gudhi::Points_off_reader<std::vector<double>> off_reader(off_file);
+ std::vector<std::vector<double>> points = off_reader.get_point_cloud();
+ return subsampling_n_farthest_points(points, nb_points);
+}
+
+std::vector<std::vector<double>> subsampling_n_farthest_points_from_file(const std::string& off_file,
+ unsigned nb_points, unsigned starting_point) {
+ Gudhi::Points_off_reader<std::vector<double>> off_reader(off_file);
+ std::vector<std::vector<double>> points = off_reader.get_point_cloud();
+ return subsampling_n_farthest_points(points, nb_points, starting_point);
+}
+
+// ------ pick_n_random_points ------
+std::vector<std::vector<double>> subsampling_n_random_points(const std::vector<std::vector<double>>& points,
+ unsigned nb_points) {
+ std::vector<std::vector<double>> landmarks;
+ pick_n_random_points(points, nb_points, std::back_inserter(landmarks));
+
+ return landmarks;
+}
+
+std::vector<std::vector<double>> subsampling_n_random_points_from_file(const std::string& off_file,
+ unsigned nb_points) {
+ Gudhi::Points_off_reader<std::vector<double>> off_reader(off_file);
+ std::vector<std::vector<double>> points = off_reader.get_point_cloud();
+ return subsampling_n_random_points(points, nb_points);
+}
+
+// ------ sparsify_point_set ------
+std::vector<std::vector<double>> subsampling_sparsify_points(const std::vector<std::vector<double>>& points,
+ double min_squared_dist) {
+ std::vector<Subsampling_point_d> input, output;
+ for (auto point : points)
+ input.push_back(Subsampling_point_d(point.size(), point.begin(), point.end()));
+ Subsampling_dynamic_kernel k;
+ sparsify_point_set(k, input, min_squared_dist, std::back_inserter(output));
+
+ std::vector<std::vector<double>> landmarks;
+ for (auto point : output)
+ landmarks.push_back(std::vector<double>(point.cartesian_begin(), point.cartesian_end()));
+ return landmarks;
+}
+
+std::vector<std::vector<double>> subsampling_sparsify_points_from_file(const std::string& off_file,
+ double min_squared_dist) {
+ Gudhi::Points_off_reader<std::vector<double>> off_reader(off_file);
+ std::vector<std::vector<double>> points = off_reader.get_point_cloud();
+ return subsampling_sparsify_points(points, min_squared_dist);
+}
+
+} // namespace subsampling
+
+} // namespace Gudhi
+
+#endif // INCLUDE_SUBSAMPLING_INTERFACE_H_
diff --git a/cython/include/Tangential_complex_interface.h b/cython/include/Tangential_complex_interface.h
new file mode 100644
index 00000000..5e9dc0e4
--- /dev/null
+++ b/cython/include/Tangential_complex_interface.h
@@ -0,0 +1,123 @@
+/* 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) 2016 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 INCLUDE_TANGENTIAL_COMPLEX_INTERFACE_H_
+#define INCLUDE_TANGENTIAL_COMPLEX_INTERFACE_H_
+
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/Tangential_complex.h>
+#include <gudhi/Points_off_io.h>
+#include <CGAL/Epick_d.h>
+
+#include "Simplex_tree_interface.h"
+
+#include <vector>
+#include <utility> // std::pair
+#include <iostream>
+#include <string>
+
+namespace Gudhi {
+
+namespace tangential_complex {
+
+class Tangential_complex_interface {
+ using Dynamic_kernel = CGAL::Epick_d< CGAL::Dynamic_dimension_tag >;
+ using Point_d = Dynamic_kernel::Point_d;
+ using TC = Tangential_complex<Dynamic_kernel, CGAL::Dynamic_dimension_tag, CGAL::Parallel_tag>;
+
+ public:
+ Tangential_complex_interface(const std::vector<std::vector<double>>& points) {
+ Dynamic_kernel k;
+ unsigned intrisic_dim = 0;
+ if (points.size() > 0)
+ intrisic_dim = points[0].size() - 1;
+
+ tangential_complex_ = new TC(points, intrisic_dim, k);
+ tangential_complex_->compute_tangential_complex();
+ num_inconsistencies_ = tangential_complex_->number_of_inconsistent_simplices();
+ }
+
+ Tangential_complex_interface(const std::string& off_file_name, bool from_file = true) {
+ Gudhi::Points_off_reader<Point_d> off_reader(off_file_name);
+ Dynamic_kernel k;
+ unsigned intrisic_dim = 0;
+ std::vector<Point_d> points = off_reader.get_point_cloud();
+ if (points.size() > 0)
+ intrisic_dim = points[0].size() - 1;
+
+ tangential_complex_ = new TC(points, intrisic_dim, k);
+ tangential_complex_->compute_tangential_complex();
+ num_inconsistencies_ = tangential_complex_->number_of_inconsistent_simplices();
+ }
+
+ ~Tangential_complex_interface() {
+ delete tangential_complex_;
+ }
+
+ std::vector<double> get_point(unsigned vh) {
+ std::vector<double> vd;
+ if (vh < tangential_complex_->number_of_vertices()) {
+ Point_d ph = tangential_complex_->get_point(vh);
+ for (auto coord = ph.cartesian_begin(); coord < ph.cartesian_end(); coord++)
+ vd.push_back(*coord);
+ }
+ return vd;
+ }
+
+ unsigned number_of_vertices() {
+ return tangential_complex_->number_of_vertices();
+ }
+
+ unsigned number_of_simplices() {
+ return num_inconsistencies_.num_simplices;
+ }
+
+ unsigned number_of_inconsistent_simplices() {
+ return num_inconsistencies_.num_inconsistent_simplices;
+ }
+
+ unsigned number_of_inconsistent_stars() {
+ return num_inconsistencies_.num_inconsistent_stars;
+ }
+
+ void fix_inconsistencies_using_perturbation(double max_perturb, double time_limit) {
+ tangential_complex_->fix_inconsistencies_using_perturbation(max_perturb, time_limit);
+ num_inconsistencies_ = tangential_complex_->number_of_inconsistent_simplices();
+ }
+
+ 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);
+ simplex_tree->initialize_filtration();
+ }
+
+ private:
+ TC* tangential_complex_;
+ TC::Num_inconsistencies num_inconsistencies_;
+};
+
+} // namespace tangential_complex
+
+} // namespace Gudhi
+
+#endif // INCLUDE_TANGENTIAL_COMPLEX_INTERFACE_H_
diff --git a/cython/include/Witness_complex_interface.h b/cython/include/Witness_complex_interface.h
new file mode 100644
index 00000000..6501cc35
--- /dev/null
+++ b/cython/include/Witness_complex_interface.h
@@ -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): Vincent Rouvreau
+ *
+ * Copyright (C) 2016 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 INCLUDE_WITNESS_COMPLEX_INTERFACE_H_
+#define INCLUDE_WITNESS_COMPLEX_INTERFACE_H_
+
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/Witness_complex.h>
+
+#include "Simplex_tree_interface.h"
+
+#include <vector>
+#include <utility> // std::pair
+#include <iostream>
+#include <cstddef>
+
+namespace Gudhi {
+
+namespace witness_complex {
+
+class Witness_complex_interface {
+ using Nearest_landmark_range = std::vector<std::pair<std::size_t, double>>;
+ using Nearest_landmark_table = std::vector<Nearest_landmark_range>;
+
+ public:
+ Witness_complex_interface(const Nearest_landmark_table& nlt) {
+ witness_complex_ = new Witness_complex<Nearest_landmark_table>(nlt);
+ }
+
+ ~Witness_complex_interface() {
+ delete witness_complex_;
+ }
+
+ void create_simplex_tree(Simplex_tree_interface<>* simplex_tree, double max_alpha_square,
+ std::size_t limit_dimension) {
+ witness_complex_->create_complex(*simplex_tree, max_alpha_square, limit_dimension);
+ simplex_tree->initialize_filtration();
+ }
+
+ void create_simplex_tree(Simplex_tree_interface<>* simplex_tree,
+ double max_alpha_square) {
+ witness_complex_->create_complex(*simplex_tree, max_alpha_square);
+ simplex_tree->initialize_filtration();
+ }
+
+ private:
+ Witness_complex<Nearest_landmark_table>* witness_complex_;
+};
+
+} // namespace witness_complex
+
+} // namespace Gudhi
+
+#endif // INCLUDE_WITNESS_COMPLEX_INTERFACE_H_
+
diff --git a/cython/test/test_alpha_complex.py b/cython/test/test_alpha_complex.py
new file mode 100755
index 00000000..2c76d9d7
--- /dev/null
+++ b/cython/test/test_alpha_complex.py
@@ -0,0 +1,86 @@
+from gudhi import AlphaComplex, SimplexTree
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+
+def test_empty_alpha():
+ alpha_complex = AlphaComplex(points=[[0,0]])
+ assert alpha_complex.__is_defined() == True
+
+def test_infinite_alpha():
+ point_list = [[0, 0], [1, 0], [0, 1], [1, 1]]
+ alpha_complex = AlphaComplex(points=point_list)
+ assert alpha_complex.__is_defined() == True
+
+ simplex_tree = alpha_complex.create_simplex_tree()
+ assert simplex_tree.__is_persistence_defined() == False
+
+ assert simplex_tree.num_simplices() == 11
+ assert simplex_tree.num_vertices() == 4
+
+ assert simplex_tree.get_filtration() == \
+ [([0], 0.0), ([1], 0.0), ([2], 0.0), ([3], 0.0),
+ ([0, 1], 0.25), ([0, 2], 0.25), ([1, 3], 0.25),
+ ([2, 3], 0.25), ([1, 2], 0.5), ([0, 1, 2], 0.5),
+ ([1, 2, 3], 0.5)]
+ assert simplex_tree.get_star([0]) == \
+ [([0], 0.0), ([0, 1], 0.25), ([0, 1, 2], 0.5),
+ ([0, 2], 0.25)]
+ assert simplex_tree.get_cofaces([0], 1) == \
+ [([0, 1], 0.25), ([0, 2], 0.25)]
+
+ assert point_list[0] == alpha_complex.get_point(0)
+ assert point_list[1] == alpha_complex.get_point(1)
+ assert point_list[2] == alpha_complex.get_point(2)
+ assert point_list[3] == alpha_complex.get_point(3)
+ assert alpha_complex.get_point(4) == []
+ assert alpha_complex.get_point(125) == []
+
+def test_filtered_alpha():
+ point_list = [[0, 0], [1, 0], [0, 1], [1, 1]]
+ filtered_alpha = AlphaComplex(points=point_list)
+
+ simplex_tree = filtered_alpha.create_simplex_tree(max_alpha_square=0.25)
+
+ assert simplex_tree.num_simplices() == 8
+ assert simplex_tree.num_vertices() == 4
+
+ assert point_list[0] == filtered_alpha.get_point(0)
+ assert point_list[1] == filtered_alpha.get_point(1)
+ assert point_list[2] == filtered_alpha.get_point(2)
+ assert point_list[3] == filtered_alpha.get_point(3)
+ assert filtered_alpha.get_point(4) == []
+ assert filtered_alpha.get_point(125) == []
+
+ assert simplex_tree.get_filtration() == \
+ [([0], 0.0), ([1], 0.0), ([2], 0.0), ([3], 0.0),
+ ([0, 1], 0.25), ([0, 2], 0.25), ([1, 3], 0.25),
+ ([2, 3], 0.25)]
+ assert simplex_tree.get_star([0]) == \
+ [([0], 0.0), ([0, 1], 0.25), ([0, 2], 0.25)]
+ assert simplex_tree.get_cofaces([0], 1) == \
+ [([0, 1], 0.25), ([0, 2], 0.25)]
diff --git a/cython/test/test_bottleneck_distance.py b/cython/test/test_bottleneck_distance.py
new file mode 100755
index 00000000..3d982d34
--- /dev/null
+++ b/cython/test/test_bottleneck_distance.py
@@ -0,0 +1,35 @@
+import gudhi
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+
+def test_basic_bottleneck():
+ diag1 = [[2.7, 3.7],[9.6, 14.],[34.2, 34.974], [3.,float('Inf')]]
+ diag2 = [[2.8, 4.45],[9.5, 14.1],[3.2,float('Inf')]]
+
+ assert(gudhi.bottleneck_distance(diag1, diag2, 0.1) == 0.8081763781405569)
+ assert(gudhi.bottleneck_distance(diag1, diag2) == 0.75)
diff --git a/cython/test/test_cubical_complex.py b/cython/test/test_cubical_complex.py
new file mode 100755
index 00000000..2e281ee4
--- /dev/null
+++ b/cython/test/test_cubical_complex.py
@@ -0,0 +1,86 @@
+from gudhi import CubicalComplex
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+
+def test_empty_constructor():
+ # Try to create an empty CubicalComplex
+ cub = CubicalComplex()
+ assert cub.__is_defined() == False
+ assert cub.__is_persistence_defined() == False
+
+def test_non_existing_perseus_file_constructor():
+ # Try to open a non existing file
+ cub = CubicalComplex(perseus_file='pouetpouettralala.toubiloubabdou')
+ assert cub.__is_defined() == False
+ assert cub.__is_persistence_defined() == False
+
+def test_dimension_or_perseus_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')
+ test_file.close()
+ # CubicalComplex can be constructed from dimensions and
+ # top_dimensional_cells OR from a Perseus-style file name.
+ cub = CubicalComplex(dimensions=[3, 3],
+ top_dimensional_cells = [1,2,3,4,5,6,7,8,9],
+ perseus_file='CubicalOneSphere.txt')
+ assert cub.__is_defined() == False
+ assert cub.__is_persistence_defined() == False
+
+ cub = CubicalComplex(top_dimensional_cells = [1,2,3,4,5,6,7,8,9],
+ perseus_file='CubicalOneSphere.txt')
+ assert cub.__is_defined() == False
+ assert cub.__is_persistence_defined() == False
+
+ cub = CubicalComplex(dimensions=[3, 3],
+ perseus_file='CubicalOneSphere.txt')
+ assert cub.__is_defined() == False
+ assert cub.__is_persistence_defined() == False
+
+def test_dimension_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, 1.8446744073709552e+19))]
+ assert cub.__is_persistence_defined() == True
+ assert cub.betti_numbers() == [1, 0]
+ assert cub.persistent_betti_numbers(0, 1000) == [0, 0]
+
+def test_dimension_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')
+ test_file.close()
+ cub = CubicalComplex(perseus_file='CubicalOneSphere.txt')
+ assert cub.__is_defined() == True
+ assert cub.__is_persistence_defined() == False
+ assert cub.persistence() == [(1, (0.0, 100.0)), (0, (0.0, 1.8446744073709552e+19))]
+ assert cub.__is_persistence_defined() == True
+ assert cub.betti_numbers() == [1, 0, 0]
+ assert cub.persistent_betti_numbers(0, 1000) == [1, 0, 0]
diff --git a/cython/test/test_euclidean_witness_complex.py b/cython/test/test_euclidean_witness_complex.py
new file mode 100755
index 00000000..737f1ef4
--- /dev/null
+++ b/cython/test/test_euclidean_witness_complex.py
@@ -0,0 +1,71 @@
+import gudhi
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+
+def test_empty_euclidean_witness_complex():
+ euclidean_witness = gudhi.EuclideanWitnessComplex()
+ assert euclidean_witness.__is_defined() == False
+
+def test_witness_complex():
+ point_cloud = [[1.0, 1.0], [7.0, 0.0], [4.0, 6.0], [9.0, 6.0],
+ [0.0, 14.0], [2.0, 19.0], [9.0, 17.0]]
+ landmarks = [[1.0, 1.0], [7.0, 0.0], [4.0, 6.0]]
+ euclidean_witness_complex = gudhi.EuclideanWitnessComplex(landmarks=landmarks, witnesses = point_cloud)
+ simplex_tree = euclidean_witness_complex.create_simplex_tree(max_alpha_square=4.1)
+
+ assert landmarks[0] == euclidean_witness_complex.get_point(0)
+ assert landmarks[1] == euclidean_witness_complex.get_point(1)
+ assert landmarks[2] == euclidean_witness_complex.get_point(2)
+
+ assert simplex_tree.get_filtration() == [([0], 0.0), ([1], 0.0),
+ ([0, 1], 0.0), ([2], 0.0), ([0, 2], 0.0), ([1, 2], 0.0),
+ ([0, 1, 2], 0.0)]
+
+def test_empty_euclidean_strong_witness_complex():
+ euclidean_strong_witness = gudhi.EuclideanStrongWitnessComplex()
+ assert euclidean_strong_witness.__is_defined() == False
+
+def test_strong_witness_complex():
+ point_cloud = [[1.0, 1.0], [7.0, 0.0], [4.0, 6.0], [9.0, 6.0],
+ [0.0, 14.0], [2.0, 19.0], [9.0, 17.0]]
+ landmarks = [[1.0, 1.0], [7.0, 0.0], [4.0, 6.0]]
+ euclidean_strong_witness_complex = gudhi.EuclideanStrongWitnessComplex(landmarks=landmarks, witnesses = point_cloud)
+ simplex_tree = euclidean_strong_witness_complex.create_simplex_tree(max_alpha_square=14.9)
+
+ assert landmarks[0] == euclidean_strong_witness_complex.get_point(0)
+ assert landmarks[1] == euclidean_strong_witness_complex.get_point(1)
+ assert landmarks[2] == euclidean_strong_witness_complex.get_point(2)
+
+ assert simplex_tree.get_filtration() == [([0], 0.0), ([1], 0.0), ([2], 0.0)]
+
+ simplex_tree = euclidean_strong_witness_complex.create_simplex_tree(max_alpha_square=100.0)
+
+ assert simplex_tree.get_filtration() == [([0], 0.0), ([1], 0.0),
+ ([2], 0.0), ([1, 2], 15.0), ([0, 2], 34.0), ([0, 1], 37.0),
+ ([0, 1, 2], 37.0)]
+
diff --git a/cython/test/test_rips_complex.py b/cython/test/test_rips_complex.py
new file mode 100755
index 00000000..c7d2ead4
--- /dev/null
+++ b/cython/test/test_rips_complex.py
@@ -0,0 +1,111 @@
+from gudhi import RipsComplex
+from math import sqrt
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+
+def test_empty_rips():
+ rips_complex = RipsComplex()
+ assert rips_complex.__is_defined() == True
+
+def test_rips_from_points():
+ point_list = [[0, 0], [1, 0], [0, 1], [1, 1]]
+ rips_complex = RipsComplex(points=point_list, max_edge_length=42)
+
+ simplex_tree = rips_complex.create_simplex_tree(max_dimension=1)
+
+ assert simplex_tree.__is_defined() == True
+ assert simplex_tree.__is_persistence_defined() == False
+
+ assert simplex_tree.num_simplices() == 10
+ assert simplex_tree.num_vertices() == 4
+
+ assert simplex_tree.get_filtration() == \
+ [([0], 0.0), ([1], 0.0), ([2], 0.0), ([3], 0.0),
+ ([0, 1], 1.0), ([0, 2], 1.0), ([1, 3], 1.0),
+ ([2, 3], 1.0), ([1, 2], 1.4142135623730951),
+ ([0, 3], 1.4142135623730951)]
+ assert simplex_tree.get_star([0]) == \
+ [([0], 0.0), ([0, 1], 1.0), ([0, 2], 1.0),
+ ([0, 3], 1.4142135623730951)]
+ assert simplex_tree.get_cofaces([0], 1) == \
+ [([0, 1], 1.0), ([0, 2], 1.0),
+ ([0, 3], 1.4142135623730951)]
+
+def test_filtered_rips_from_points():
+ point_list = [[0, 0], [1, 0], [0, 1], [1, 1]]
+ filtered_rips = RipsComplex(points=point_list, max_edge_length=1.0)
+
+ simplex_tree = filtered_rips.create_simplex_tree(max_dimension=1)
+
+ assert simplex_tree.__is_defined() == True
+ assert simplex_tree.__is_persistence_defined() == False
+
+ assert simplex_tree.num_simplices() == 8
+ assert simplex_tree.num_vertices() == 4
+
+def test_rips_from_distance_matrix():
+ distance_matrix = [[0],
+ [1, 0],
+ [1, sqrt(2), 0],
+ [sqrt(2), 1, 1, 0]]
+ rips_complex = RipsComplex(distance_matrix=distance_matrix, max_edge_length=42)
+
+ simplex_tree = rips_complex.create_simplex_tree(max_dimension=1)
+
+ assert simplex_tree.__is_defined() == True
+ assert simplex_tree.__is_persistence_defined() == False
+
+ assert simplex_tree.num_simplices() == 10
+ assert simplex_tree.num_vertices() == 4
+
+ assert simplex_tree.get_filtration() == \
+ [([0], 0.0), ([1], 0.0), ([2], 0.0), ([3], 0.0),
+ ([0, 1], 1.0), ([0, 2], 1.0), ([1, 3], 1.0),
+ ([2, 3], 1.0), ([1, 2], 1.4142135623730951),
+ ([0, 3], 1.4142135623730951)]
+ assert simplex_tree.get_star([0]) == \
+ [([0], 0.0), ([0, 1], 1.0), ([0, 2], 1.0),
+ ([0, 3], 1.4142135623730951)]
+ assert simplex_tree.get_cofaces([0], 1) == \
+ [([0, 1], 1.0), ([0, 2], 1.0),
+ ([0, 3], 1.4142135623730951)]
+
+def test_filtered_rips_from_distance_matrix():
+ distance_matrix = [[0],
+ [1, 0],
+ [1, sqrt(2), 0],
+ [sqrt(2), 1, 1, 0]]
+ filtered_rips = RipsComplex(distance_matrix=distance_matrix, max_edge_length=1.0)
+
+ simplex_tree = filtered_rips.create_simplex_tree(max_dimension=1)
+
+ assert simplex_tree.__is_defined() == True
+ assert simplex_tree.__is_persistence_defined() == False
+
+ assert simplex_tree.num_simplices() == 8
+ assert simplex_tree.num_vertices() == 4
diff --git a/cython/test/test_simplex_tree.py b/cython/test/test_simplex_tree.py
new file mode 100755
index 00000000..3ae537e3
--- /dev/null
+++ b/cython/test/test_simplex_tree.py
@@ -0,0 +1,132 @@
+from gudhi import SimplexTree
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+
+def test_insertion():
+ st = SimplexTree()
+ assert st.__is_defined() == True
+ assert st.__is_persistence_defined() == False
+
+ # insert test
+ assert st.insert([0, 1]) == True
+ assert st.insert([0, 1, 2], filtration=4.0) == True
+ # FIXME: Remove this line
+ st.set_dimension(2)
+ assert st.num_simplices() == 7
+ assert st.num_vertices() == 3
+
+ # find test
+ assert st.find([0, 1, 2]) == True
+ assert st.find([0, 1]) == True
+ assert st.find([0, 2]) == True
+ assert st.find([0]) == True
+ assert st.find([1]) == True
+ assert st.find([2]) == True
+ assert st.find([3]) == False
+ assert st.find([0, 3]) == False
+ assert st.find([1, 3]) == False
+ assert st.find([2, 3]) == False
+
+ # filtration test
+ st.set_filtration(5.0)
+ st.initialize_filtration()
+ assert st.filtration([0, 1, 2]) == 4.0
+ assert st.filtration([0, 2]) == 4.0
+ assert st.filtration([1, 2]) == 4.0
+ assert st.filtration([2]) == 4.0
+ assert st.filtration([0, 1]) == 0.0
+ assert st.filtration([0]) == 0.0
+ assert st.filtration([1]) == 0.0
+
+ # skeleton test
+ assert st.get_skeleton(2) == \
+ [([0, 1, 2], 4.0), ([0, 1], 0.0), ([0, 2], 4.0),
+ ([0], 0.0), ([1, 2], 4.0), ([1], 0.0), ([2], 4.0)]
+ assert st.get_skeleton(1) == \
+ [([0, 1], 0.0), ([0, 2], 4.0), ([0], 0.0),
+ ([1, 2], 4.0), ([1], 0.0), ([2], 4.0)]
+ assert st.get_skeleton(0) == \
+ [([0], 0.0), ([1], 0.0), ([2], 4.0)]
+
+ # remove_maximal_simplex test
+ assert st.get_cofaces([0, 1, 2], 1) == []
+ st.remove_maximal_simplex([0, 1, 2])
+ assert st.get_skeleton(2) == \
+ [([0, 1], 0.0), ([0, 2], 4.0), ([0], 0.0),
+ ([1, 2], 4.0), ([1], 0.0), ([2], 4.0)]
+ assert st.find([0, 1, 2]) == False
+ assert st.find([0, 1]) == True
+ assert st.find([0, 2]) == True
+ assert st.find([0]) == True
+ assert st.find([1]) == True
+ assert st.find([2]) == True
+
+ st.initialize_filtration()
+ assert st.persistence() == [(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]
+ assert st.persistent_betti_numbers(3.9, 10000.0) == [1, 0]
+ assert st.persistent_betti_numbers(4.0, 10000.0) == [1, 1]
+ assert st.persistent_betti_numbers(9999.0, 10000.0) == [1, 1]
+
+def test_expansion():
+ st = SimplexTree()
+ assert st.__is_defined() == True
+ assert st.__is_persistence_defined() == False
+
+ # insert test
+ assert st.insert([3, 2], 0.1) == True
+ assert st.insert([2, 0], 0.2) == True
+ assert st.insert([1, 0], 0.3) == True
+ assert st.insert([3, 1], 0.4) == True
+ assert st.insert([2, 1], 0.5) == True
+ assert st.insert([6, 5], 0.6) == True
+ assert st.insert([4, 2], 0.7) == True
+ assert st.insert([3, 0], 0.8) == True
+ assert st.insert([6, 4], 0.9) == True
+ assert st.insert([6, 3], 1.0) == True
+
+ assert st.num_vertices() == 7
+ assert st.num_simplices() == 17
+ assert st.get_filtration() == [([2], 0.1), ([3], 0.1), ([2, 3], 0.1),
+ ([0], 0.2), ([0, 2], 0.2), ([1], 0.3), ([0, 1], 0.3), ([1, 3], 0.4),
+ ([1, 2], 0.5), ([5], 0.6), ([6], 0.6), ([5, 6], 0.6), ([4], 0.7),
+ ([2, 4], 0.7), ([0, 3], 0.8), ([4, 6], 0.9), ([3, 6], 1.0)]
+
+ st.expansion(3)
+ assert st.num_vertices() == 7
+ assert st.num_simplices() == 22
+ st.initialize_filtration()
+
+ assert st.get_filtration() == [([2], 0.1), ([3], 0.1), ([2, 3], 0.1),
+ ([0], 0.2), ([0, 2], 0.2), ([1], 0.3), ([0, 1], 0.3), ([1, 3], 0.4),
+ ([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)]
diff --git a/cython/test/test_subsampling.py b/cython/test/test_subsampling.py
new file mode 100755
index 00000000..2caf4ddb
--- /dev/null
+++ b/cython/test/test_subsampling.py
@@ -0,0 +1,133 @@
+import gudhi
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+
+def test_write_off_file_for_tests():
+ file = open("subsample.off", "w")
+ file.write("nOFF\n")
+ file.write("2 7 0 0\n")
+ file.write("1.0 1.0\n")
+ file.write("7.0 0.0\n")
+ file.write("4.0 6.0\n")
+ file.write("9.0 6.0\n")
+ file.write("0.0 14.0\n")
+ file.write("2.0 19.0\n")
+ file.write("9.0 17.0\n")
+ file.close()
+
+def test_simple_choose_n_farthest_points_with_a_starting_point():
+ point_set = [[0,1], [0,0], [1,0], [1,1]]
+ i = 0
+ for point in point_set:
+ # The iteration starts with the given starting point
+ sub_set = gudhi.choose_n_farthest_points(points = point_set, nb_points = 1, starting_point = i)
+ assert sub_set[0] == point_set[i]
+ i = i + 1
+
+ # The iteration finds then the farthest
+ sub_set = gudhi.choose_n_farthest_points(points = point_set, nb_points = 2, starting_point = 1)
+ assert sub_set[1] == point_set[3]
+ sub_set = gudhi.choose_n_farthest_points(points = point_set, nb_points = 2, starting_point = 3)
+ assert sub_set[1] == point_set[1]
+ sub_set = gudhi.choose_n_farthest_points(points = point_set, nb_points = 2, starting_point = 0)
+ assert sub_set[1] == point_set[2]
+ sub_set = gudhi.choose_n_farthest_points(points = point_set, nb_points = 2, starting_point = 2)
+ assert sub_set[1] == point_set[0]
+
+ # Test the limits
+ assert gudhi.choose_n_farthest_points(points = [], nb_points = 0, starting_point = 0) == []
+ assert gudhi.choose_n_farthest_points(points = [], nb_points = 1, starting_point = 0) == []
+ assert gudhi.choose_n_farthest_points(points = [], nb_points = 0, starting_point = 1) == []
+ assert gudhi.choose_n_farthest_points(points = [], nb_points = 1, starting_point = 1) == []
+
+ # From off file test
+ for i in range (0, 7):
+ assert len(gudhi.choose_n_farthest_points(off_file = 'subsample.off', nb_points = i, starting_point = i)) == i
+
+def test_simple_choose_n_farthest_points_randomed():
+ point_set = [[0,1], [0,0], [1,0], [1,1]]
+ # Test the limits
+ assert gudhi.choose_n_farthest_points(points = [], nb_points = 0) == []
+ assert gudhi.choose_n_farthest_points(points = [], nb_points = 1) == []
+ assert gudhi.choose_n_farthest_points(points = point_set, nb_points = 0) == []
+
+ # Go furter than point set on purpose
+ for iter in range(1,10):
+ sub_set = gudhi.choose_n_farthest_points(points = point_set, nb_points = iter)
+ for sub in sub_set:
+ found = False
+ for point in point_set:
+ if point == sub:
+ found = True
+ # Check each sub set point is existing in the point set
+ assert found == True
+
+ # From off file test
+ for i in range (0, 7):
+ assert len(gudhi.choose_n_farthest_points(off_file = 'subsample.off', nb_points = i)) == i
+
+def test_simple_pick_n_random_points():
+ point_set = [[0,1], [0,0], [1,0], [1,1]]
+ # Test the limits
+ assert gudhi.pick_n_random_points(points = [], nb_points = 0) == []
+ assert gudhi.pick_n_random_points(points = [], nb_points = 1) == []
+ assert gudhi.pick_n_random_points(points = point_set, nb_points = 0) == []
+
+ # Go furter than point set on purpose
+ for iter in range(1,10):
+ sub_set = gudhi.pick_n_random_points(points = point_set, nb_points = iter)
+ print(5)
+ for sub in sub_set:
+ found = False
+ for point in point_set:
+ if point == sub:
+ found = True
+ # Check each sub set point is existing in the point set
+ assert found == True
+
+ # From off file test
+ for i in range (0, 7):
+ assert len(gudhi.pick_n_random_points(off_file = 'subsample.off', nb_points = i)) == i
+
+def test_simple_sparsify_points():
+ point_set = [[0,1], [0,0], [1,0], [1,1]]
+ # Test the limits
+ # assert gudhi.sparsify_point_set(points = [], min_squared_dist = 0.0) == []
+ # assert gudhi.sparsify_point_set(points = [], min_squared_dist = 10.0) == []
+ assert gudhi.sparsify_point_set(points = point_set, min_squared_dist = 0.0) == point_set
+ assert gudhi.sparsify_point_set(points = point_set, min_squared_dist = 1.0) == point_set
+ assert gudhi.sparsify_point_set(points = point_set, min_squared_dist = 2.0) == [[0,1], [1,0]]
+ assert gudhi.sparsify_point_set(points = point_set, min_squared_dist = 2.01) == [[0,1]]
+
+ assert len(gudhi.sparsify_point_set(off_file = 'subsample.off', min_squared_dist = 0.0)) == 7
+ assert len(gudhi.sparsify_point_set(off_file = 'subsample.off', min_squared_dist = 30.0)) == 5
+ assert len(gudhi.sparsify_point_set(off_file = 'subsample.off', min_squared_dist = 40.0)) == 4
+ assert len(gudhi.sparsify_point_set(off_file = 'subsample.off', min_squared_dist = 90.0)) == 3
+ assert len(gudhi.sparsify_point_set(off_file = 'subsample.off', min_squared_dist = 100.0)) == 2
+ assert len(gudhi.sparsify_point_set(off_file = 'subsample.off', min_squared_dist = 325.0)) == 2
+ assert len(gudhi.sparsify_point_set(off_file = 'subsample.off', min_squared_dist = 325.01)) == 1
diff --git a/cython/test/test_tangential_complex.py b/cython/test/test_tangential_complex.py
new file mode 100755
index 00000000..8aa4023c
--- /dev/null
+++ b/cython/test/test_tangential_complex.py
@@ -0,0 +1,52 @@
+from gudhi import TangentialComplex, SimplexTree
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+
+def test_tangential():
+ point_list = [[0.0, 0.0], [1.0, 0.0], [0.0, 1.0], [1.0, 1.0]]
+ tc = TangentialComplex(points=point_list)
+ assert tc.__is_defined() == True
+ assert tc.num_vertices() == 4
+
+ st = tc.create_simplex_tree()
+ assert st.__is_defined() == True
+ assert st.__is_persistence_defined() == False
+
+ assert st.num_simplices() == 6
+ assert st.num_vertices() == 4
+
+ assert st.get_filtration() == \
+ [([0], 0.0), ([1], 0.0), ([2], 0.0), ([0, 2], 0.0), ([3], 0.0), ([1, 3], 0.0)]
+ assert st.get_cofaces([0], 1) == [([0, 2], 0.0)]
+
+ assert point_list[0] == tc.get_point(0)
+ assert point_list[1] == tc.get_point(1)
+ assert point_list[2] == tc.get_point(2)
+ assert point_list[3] == tc.get_point(3)
+ assert tc.get_point(4) == []
+ assert tc.get_point(125) == []
diff --git a/cython/test/test_witness_complex.py b/cython/test/test_witness_complex.py
new file mode 100755
index 00000000..7d1fb6be
--- /dev/null
+++ b/cython/test/test_witness_complex.py
@@ -0,0 +1,62 @@
+from gudhi import WitnessComplex, StrongWitnessComplex, SimplexTree
+
+"""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) 2016 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__ = "Vincent Rouvreau"
+__copyright__ = "Copyright (C) 2016 INRIA"
+__license__ = "GPL v3"
+
+
+def test_empty_witness_complex():
+ witness = WitnessComplex()
+ assert witness.__is_defined() == False
+
+def test_witness_complex():
+ nearest_landmark_table = [[[0, 0], [1, 1], [2, 2], [3, 3], [4, 4]],
+ [[1, 0], [2, 1], [3, 2], [4, 3], [0, 4]],
+ [[2, 0], [3, 1], [4, 2], [0, 3], [1, 4]],
+ [[3, 0], [4, 1], [0, 2], [1, 3], [2, 4]],
+ [[4, 0], [0, 1], [1, 2], [2, 3], [3, 4]]]
+
+ witness_complex = WitnessComplex(nearest_landmark_table=nearest_landmark_table)
+ simplex_tree = witness_complex.create_simplex_tree(max_alpha_square=4.1)
+ assert simplex_tree.num_vertices() == 5
+ assert simplex_tree.num_simplices() == 31
+ simplex_tree = witness_complex.create_simplex_tree(max_alpha_square=4.1, limit_dimension=2)
+ assert simplex_tree.num_vertices() == 5
+ assert simplex_tree.num_simplices() == 25
+
+def test_strong_witness_complex():
+ nearest_landmark_table = [[[0, 0], [1, 1], [2, 2], [3, 3], [4, 4]],
+ [[1, 0], [2, 1], [3, 2], [4, 3], [0, 4]],
+ [[2, 0], [3, 1], [4, 2], [0, 3], [1, 4]],
+ [[3, 0], [4, 1], [0, 2], [1, 3], [2, 4]],
+ [[4, 0], [0, 1], [1, 2], [2, 3], [3, 4]]]
+
+ strong_witness_complex = StrongWitnessComplex(nearest_landmark_table=nearest_landmark_table)
+ simplex_tree = strong_witness_complex.create_simplex_tree(max_alpha_square=4.1)
+ assert simplex_tree.num_vertices() == 5
+ assert simplex_tree.num_simplices() == 31
+ simplex_tree = strong_witness_complex.create_simplex_tree(max_alpha_square=4.1, limit_dimension=2)
+ assert simplex_tree.num_vertices() == 5
+ assert simplex_tree.num_simplices() == 25
diff --git a/data/bitmap/cubicalcomplexdoc.txt b/data/bitmap/cubicalcomplexdoc.txt
new file mode 100644
index 00000000..a87ad775
--- /dev/null
+++ b/data/bitmap/cubicalcomplexdoc.txt
@@ -0,0 +1,12 @@
+2
+3
+3
+1
+4
+6
+8
+20
+4
+7
+6
+5
diff --git a/data/bitmap/periodiccubicalcomplexdoc.txt b/data/bitmap/periodiccubicalcomplexdoc.txt
new file mode 100644
index 00000000..e93cb2b3
--- /dev/null
+++ b/data/bitmap/periodiccubicalcomplexdoc.txt
@@ -0,0 +1,12 @@
+2
+-3
+3
+1
+4
+6
+8
+20
+4
+7
+6
+5
diff --git a/data/distance_matrix/full_square_distance_matrix.csv b/data/distance_matrix/full_square_distance_matrix.csv
new file mode 100644
index 00000000..51512b03
--- /dev/null
+++ b/data/distance_matrix/full_square_distance_matrix.csv
@@ -0,0 +1,7 @@
+0;6.0827625303;5.8309518948;9.4339811321;13.0384048104;18.0277563773;17.88854382;
+6.0827625303;0;6.7082039325;6.3245553203;15.6524758425;19.6468827044;17.1172427686;
+5.8309518948;6.7082039325;0;5;8.94427191;13.152946438;12.0830459736;
+9.4339811321;6.3245553203;5;0;12.0415945788;14.7648230602;11;
+13.0384048104;15.6524758425;8.94427191;12.0415945788;0;5.3851648071;9.4868329805;
+18.0277563773;19.6468827044;13.152946438;14.7648230602;5.3851648071;0;7.2801098893;
+17.88854382;17.1172427686;12.0830459736;11;9.4868329805;7.2801098893;0; \ No newline at end of file
diff --git a/data/distance_matrix/lower_triangular_distance_matrix.csv b/data/distance_matrix/lower_triangular_distance_matrix.csv
new file mode 100644
index 00000000..d8a4c0a3
--- /dev/null
+++ b/data/distance_matrix/lower_triangular_distance_matrix.csv
@@ -0,0 +1,5 @@
+
+1,
+2,3,
+4,5,6,
+7,8,9,10, \ No newline at end of file
diff --git a/data/points/Klein_bottle_complex.txt b/data/filtered_simplicial_complex/Klein_bottle_complex.fsc
index 430e4f73..430e4f73 100644
--- a/data/points/Klein_bottle_complex.txt
+++ b/data/filtered_simplicial_complex/Klein_bottle_complex.fsc
diff --git a/data/points/bunny_5000.st b/data/filtered_simplicial_complex/bunny_5000_complex.fsc
index 4f09ee88..4f09ee88 100644
--- a/data/points/bunny_5000.st
+++ b/data/filtered_simplicial_complex/bunny_5000_complex.fsc
diff --git a/data/meshes/min_cube3D_8.off b/data/meshes/min_cube3D_8.off
deleted file mode 100644
index 7398eaea..00000000
--- a/data/meshes/min_cube3D_8.off
+++ /dev/null
@@ -1,16 +0,0 @@
-OFF
-8 6 0
--0.500000 -0.500000 0.500000
- 0.500000 -0.500000 0.500000
--0.500000 0.500000 0.500000
- 0.500000 0.500000 0.500000
--0.500000 0.500000 -0.500000
- 0.500000 0.500000 -0.500000
--0.500000 -0.500000 -0.500000
- 0.500000 -0.500000 -0.500000
-4 0 1 3 2
-4 2 3 5 4
-4 4 5 7 6
-4 6 7 1 0
-4 1 7 5 3
-4 6 0 2 4
diff --git a/data/points/COIL_database/README b/data/points/COIL_database/README
index 70e013d7..32d059cf 100644
--- a/data/points/COIL_database/README
+++ b/data/points/COIL_database/README
@@ -1,5 +1,7 @@
The datasets in this folder come from the Columbia University Image Library (COIL-100) dataset.
+Ambient dimension is 16384 (128*128)
+
References:
http://www.cs.columbia.edu/CAVE/software/softlib/coil-100.php
diff --git a/data/points/Kl.txt b/data/points/Kl.txt
deleted file mode 100644
index c5b9539a..00000000
--- a/data/points/Kl.txt
+++ /dev/null
@@ -1,10000 +0,0 @@
-0.5 0 0 0 1
-0.562791 0 0.125333 0 0.998027
-0.625333 0 0.24869 0 0.992115
-0.687381 0 0.368124 0 0.982287
-0.74869 0 0.481754 0 0.968583
-0.809017 0 0.587785 0 0.951057
-0.868124 0 0.684547 0 0.929777
-0.925779 0 0.770513 0 0.904827
-0.981754 0 0.844328 0 0.876307
-1.03583 0 0.904827 0 0.844328
-1.08779 0 0.951056 0 0.809017
-1.13742 0 0.982287 0 0.770513
-1.18455 0 0.998027 0 0.728969
-1.22897 0 0.998027 0 0.684547
-1.27051 0 0.982287 0 0.637424
-1.30902 0 0.951057 0 0.587785
-1.34433 0 0.904827 0 0.535827
-1.37631 0 0.844328 0 0.481754
-1.40483 0 0.770514 0 0.42578
-1.42978 0 0.684547 0 0.368125
-1.45106 0 0.587786 0 0.309017
-1.46858 0 0.481754 0 0.24869
-1.48229 0 0.368125 0 0.187382
-1.49211 0 0.24869 0 0.125334
-1.49803 0 0.125334 0 0.0627908
-1.5 0 6.5359e-07 0 3.26795e-07
-1.49803 0 -0.125333 0 -0.0627902
-1.49211 0 -0.248689 0 -0.125333
-1.48229 0 -0.368124 0 -0.187381
-1.46858 0 -0.481753 0 -0.24869
-1.45106 0 -0.587785 0 -0.309017
-1.42978 0 -0.684547 0 -0.368124
-1.40483 0 -0.770513 0 -0.425779
-1.37631 0 -0.844327 0 -0.481753
-1.34433 0 -0.904827 0 -0.535826
-1.30902 0 -0.951056 0 -0.587785
-1.27051 0 -0.982287 0 -0.637424
-1.22897 0 -0.998027 0 -0.684547
-1.18455 0 -0.998027 0 -0.728968
-1.13742 0 -0.982287 0 -0.770513
-1.08779 0 -0.951057 0 -0.809017
-1.03583 0 -0.904828 0 -0.844328
-0.981754 0 -0.844329 0 -0.876306
-0.92578 0 -0.770514 0 -0.904827
-0.868125 0 -0.684548 0 -0.929776
-0.809018 0 -0.587786 0 -0.951056
-0.74869 0 -0.481755 0 -0.968583
-0.687382 0 -0.368126 0 -0.982287
-0.625334 0 -0.248691 0 -0.992115
-0.562791 0 -0.125335 0 -0.998027
-0.500001 0 -1.30718e-06 0 -1
-0.43721 0 0.125332 0 -0.998027
-0.374667 0 0.248689 0 -0.992115
-0.312619 0 0.368123 0 -0.982287
-0.251311 0 0.481752 0 -0.968583
-0.190984 0 0.587784 0 -0.951057
-0.131876 0 0.684546 0 -0.929777
-0.0742214 0 0.770512 0 -0.904827
-0.018247 0 0.844327 0 -0.876307
--0.0358261 -0 0.904826 0 -0.844328
--0.0877846 0 0.951056 0 -0.809017
--0.137423 -0 0.982287 0 -0.770514
--0.184547 0 0.998027 0 -0.728969
--0.228968 0 0.998027 0 -0.684548
--0.270513 -0 0.982288 0 -0.637425
--0.309016 -0 0.951057 0 -0.587786
--0.344327 0 0.904828 0 -0.535828
--0.376306 0 0.844329 0 -0.481754
--0.404827 -0 0.770514 0 -0.42578
--0.429776 0 0.684548 0 -0.368125
--0.451056 -0 0.587787 0 -0.309018
--0.468583 0 0.481755 0 -0.248691
--0.482287 -0 0.368126 0 -0.187382
--0.492115 -0 0.248692 0 -0.125334
--0.498027 -0 0.125335 0 -0.0627915
--0.5 0 1.96077e-06 0 -9.80385e-07
--0.498027 -0 -0.125331 0 0.0627895
--0.492115 -0 -0.248688 0 0.125332
--0.482287 -0 -0.368123 0 0.18738
--0.468583 0 -0.481752 0 0.248689
--0.451057 0 -0.587784 0 0.309016
--0.429777 -0 -0.684546 0 0.368124
--0.404828 0 -0.770512 0 0.425778
--0.376307 0 -0.844327 0 0.481753
--0.344329 -0 -0.904826 0 0.535826
--0.309018 0 -0.951056 0 0.587784
--0.270514 -0 -0.982287 0 0.637423
--0.228969 0 -0.998027 0 0.684546
--0.184548 0 -0.998027 0 0.728968
--0.137425 0 -0.982288 0 0.770513
--0.0877862 -0 -0.951057 0 0.809016
--0.0358278 0 -0.904828 0 0.844327
-0.0182453 0 -0.844329 0 0.876306
-0.0742196 0 -0.770515 0 0.904827
-0.131874 0 -0.684549 0 0.929776
-0.190982 0 -0.587787 0 0.951056
-0.251309 0 -0.481756 0 0.968583
-0.312617 0 -0.368127 0 0.982287
-0.374665 0 -0.248692 0 0.992115
-0.437208 0 -0.125336 0 0.998027
-0.499013 0.0313953 0 0.0627905 1
-0.55772 0.0350888 0.127244 0.0627905 0.998027
-0.616241 0.0387706 0.252504 0.0627905 0.992115
-0.674392 0.0424292 0.373829 0.0627905 0.982287
-0.731988 0.0460527 0.489327 0.0627905 0.968583
-0.788842 0.0496297 0.597202 0.0627905 0.951057
-0.84477 0.0531484 0.695772 0.0627905 0.929777
-0.899588 0.0565973 0.783507 0.0627905 0.904827
-0.95311 0.0599646 0.859043 0.0627905 0.876307
-1.00515 0.0632389 0.921211 0.0627905 0.844328
-1.05553 0.0664086 0.96905 0.0627905 0.809017
-1.10407 0.0694623 1.00182 0.0627905 0.770513
-1.15059 0.0723887 1.01904 0.0627905 0.728969
-1.1949 0.0751766 1.02043 0.0627905 0.684547
-1.23683 0.0778149 1.00601 0.0627905 0.637424
-1.27622 0.080293 0.975999 0.0627905 0.587785
-1.31289 0.0826003 0.930902 0.0627905 0.535827
-1.34669 0.0847266 0.871437 0.0627905 0.481754
-1.37745 0.0866621 0.798555 0.0627905 0.42578
-1.40504 0.0883974 0.713415 0.0627905 0.368125
-1.4293 0.0899238 0.617369 0.0627905 0.309017
-1.45011 0.0912329 0.51194 0.0627905 0.24869
-1.46734 0.0923171 0.398798 0.0627905 0.187382
-1.48089 0.0931694 0.279731 0.0627905 0.125334
-1.49065 0.0937837 0.156621 0.0627905 0.0627908
-1.49655 0.0941548 0.0314114 0.0627905 3.26795e-07
-1.49851 0.0942781 -0.0939219 0.0627905 -0.0627902
-1.49648 0.0941504 -0.217403 0.0627905 -0.125333
-1.49042 0.0937692 -0.337088 0.0627905 -0.187381
-1.48031 0.0931332 -0.451091 0.0627905 -0.24869
-1.46615 0.0922424 -0.557621 0.0627905 -0.309017
-1.44796 0.0910977 -0.655004 0.0627905 -0.368124
-1.42576 0.0897015 -0.741711 0.0627905 -0.425779
-1.39963 0.0880571 -0.816385 0.0627905 -0.481753
-1.36962 0.0861695 -0.877859 0.0627905 -0.535826
-1.33585 0.0840446 -0.925175 0.0627905 -0.587785
-1.29842 0.0816897 -0.9576 0.0627905 -0.637424
-1.25747 0.0791134 -0.974637 0.0627905 -0.684547
-1.21316 0.0763255 -0.976032 0.0627905 -0.728968
-1.16566 0.0733371 -0.961781 0.0627905 -0.770513
-1.11516 0.0701602 -0.932125 0.0627905 -0.809017
-1.06188 0.0668081 -0.88755 0.0627905 -0.844328
-1.00605 0.0632952 -0.82878 0.0627905 -0.876306
-0.947898 0.0596367 -0.75676 0.0627905 -0.904827
-0.88769 0.0558487 -0.672647 0.0627905 -0.929776
-0.825695 0.0519483 -0.57779 0.0627905 -0.951056
-0.762193 0.0479531 -0.473705 0.0627905 -0.968583
-0.697474 0.0438813 -0.362058 0.0627905 -0.982287
-0.631834 0.0397516 -0.244632 0.0627905 -0.992115
-0.565579 0.0355832 -0.1233 0.0627905 -0.998027
-0.499014 0.0313953 -1.286e-06 0.0627905 -1
-0.432449 0.0272074 0.123298 0.0627905 -0.998027
-0.366194 0.023039 0.244629 0.0627905 -0.992115
-0.300555 0.0189093 0.362056 0.0627905 -0.982287
-0.235835 0.0148375 0.473703 0.0627905 -0.968583
-0.172333 0.0108423 0.577788 0.0627905 -0.951057
-0.110338 0.00694185 0.672645 0.0627905 -0.929777
-0.05013 0.00315391 0.756758 0.0627905 -0.904827
--0.00802039 -0.0005046 0.828778 0.0627905 -0.876307
--0.0638568 -0.00401753 0.887549 0.0627905 -0.844328
--0.117136 -0.00736959 0.932124 0.0627905 -0.809017
--0.167632 -0.0105465 0.96178 0.0627905 -0.770514
--0.215132 -0.013535 0.976032 0.0627905 -0.728969
--0.259444 -0.0163228 0.974637 0.0627905 -0.684548
--0.300393 -0.0188991 0.9576 0.0627905 -0.637425
--0.337823 -0.021254 0.925176 0.0627905 -0.587786
--0.371597 -0.0233789 0.87786 0.0627905 -0.535828
--0.401601 -0.0252666 0.816387 0.0627905 -0.481754
--0.427737 -0.0269109 0.741713 0.0627905 -0.42578
--0.44993 -0.0283072 0.655006 0.0627905 -0.368125
--0.468124 -0.0294519 0.557623 0.0627905 -0.309018
--0.482284 -0.0303427 0.451094 0.0627905 -0.248691
--0.492392 -0.0309787 0.33709 0.0627905 -0.187382
--0.498451 -0.0313599 0.217406 0.0627905 -0.125334
--0.500482 -0.0314876 0.0939245 0.0627905 -0.0627915
--0.498521 -0.0313643 -0.0314088 0.0627905 -9.80385e-07
--0.492624 -0.0309932 -0.156618 0.0627905 0.0627895
--0.482859 -0.0303789 -0.279728 0.0627905 0.125332
--0.469312 -0.0295266 -0.398795 0.0627905 0.18738
--0.452079 -0.0284424 -0.511938 0.0627905 0.248689
--0.431272 -0.0271333 -0.617367 0.0627905 0.309016
--0.407011 -0.025607 -0.713413 0.0627905 0.368124
--0.379428 -0.0238716 -0.798553 0.0627905 0.425778
--0.348664 -0.0219361 -0.871436 0.0627905 0.481753
--0.314868 -0.0198098 -0.930901 0.0627905 0.535826
--0.278195 -0.0175025 -0.975998 0.0627905 0.587784
--0.238807 -0.0150245 -1.006 0.0627905 0.637423
--0.196872 -0.0123861 -1.02043 0.0627905 0.684546
--0.15256 -0.00959824 -1.01904 0.0627905 0.728968
--0.106046 -0.00667187 -1.00182 0.0627905 0.770513
--0.057509 -0.00361816 -0.969051 0.0627905 0.809016
--0.00712798 -0.000448454 -0.921212 0.0627905 0.844327
-0.0449152 0.00282582 -0.859045 0.0627905 0.876306
-0.0984375 0.00619316 -0.783509 0.0627905 0.904827
-0.153255 0.00964199 -0.695774 0.0627905 0.929776
-0.209184 0.0131607 -0.597204 0.0627905 0.951056
-0.266038 0.0167377 -0.48933 0.0627905 0.968583
-0.323633 0.0203613 -0.373831 0.0627905 0.982287
-0.381784 0.0240198 -0.252507 0.0627905 0.992115
-0.440306 0.0277017 -0.127246 0.0627905 0.998027
-0.496057 0.0626666 0 0.125333 1
-0.550422 0.0695345 0.129029 0.125333 0.998027
-0.604665 0.0763869 0.256069 0.125333 0.992115
-0.658662 0.0832083 0.379164 0.125333 0.982287
-0.712288 0.0899829 0.496418 0.125333 0.968583
-0.765416 0.0966945 0.606029 0.125333 0.951057
-0.817914 0.103327 0.706311 0.125333 0.929777
-0.869646 0.109862 0.795728 0.125333 0.904827
-0.920471 0.116283 0.872911 0.125333 0.876307
-0.970243 0.12257 0.936686 0.125333 0.844328
-1.01881 0.128706 0.986087 0.125333 0.809017
-1.06602 0.134669 1.02037 0.125333 0.770513
-1.11169 0.14044 1.03904 0.125333 0.728969
-1.15568 0.145996 1.04183 0.125333 0.684547
-1.19779 0.151317 1.02873 0.125333 0.637424
-1.23786 0.156379 0.999979 0.125333 0.587785
-1.27571 0.161159 0.956058 0.125333 0.535827
-1.31114 0.165636 0.897686 0.125333 0.481754
-1.34398 0.169784 0.825808 0.125333 0.42578
-1.37404 0.173581 0.741578 0.125333 0.368125
-1.40114 0.177005 0.646343 0.125333 0.309017
-1.4251 0.180031 0.541621 0.125333 0.24869
-1.44574 0.18264 0.429077 0.125333 0.187382
-1.46291 0.184809 0.310495 0.125333 0.125334
-1.47645 0.186519 0.187753 0.125333 0.0627908
-1.48621 0.187752 0.0627912 0.125333 3.26795e-07
-1.49207 0.188492 -0.0624186 0.125333 -0.0627902
-1.4939 0.188723 -0.185903 0.125333 -0.125333
-1.49161 0.188434 -0.305719 0.125333 -0.187381
-1.48512 0.187614 -0.419985 0.125333 -0.24869
-1.47437 0.186256 -0.526907 0.125333 -0.309017
-1.45933 0.184356 -0.624815 0.125333 -0.368124
-1.43998 0.181911 -0.712178 0.125333 -0.425779
-1.41634 0.178925 -0.787638 0.125333 -0.481753
-1.38844 0.175401 -0.850025 0.125333 -0.535826
-1.35636 0.171348 -0.898381 0.125333 -0.587785
-1.32018 0.166777 -0.931968 0.125333 -0.637424
-1.28002 0.161705 -0.950285 0.125333 -0.684547
-1.23604 0.156148 -0.953074 0.125333 -0.728968
-1.1884 0.15013 -0.940325 0.125333 -0.770513
-1.1373 0.143675 -0.912273 0.125333 -0.809017
-1.08298 0.136812 -0.869397 0.125333 -0.844328
-1.02567 0.129572 -0.812413 0.125333 -0.876306
-0.965646 0.121989 -0.742259 0.125333 -0.904827
-0.903203 0.114101 -0.660082 0.125333 -0.929776
-0.83865 0.105946 -0.567223 0.125333 -0.951056
-0.772311 0.0975656 -0.465189 0.125333 -0.968583
-0.704527 0.0890025 -0.355633 0.125333 -0.982287
-0.63565 0.0803012 -0.240331 0.125333 -0.992115
-0.566038 0.0715072 -0.121144 0.125333 -0.998027
-0.496058 0.0626667 -1.26356e-06 0.125333 -1
-0.426078 0.0538261 0.121142 0.125333 -0.998027
-0.356466 0.0450322 0.240328 0.125333 -0.992115
-0.287589 0.0363309 0.355631 0.125333 -0.982287
-0.219805 0.0277678 0.465186 0.125333 -0.968583
-0.153466 0.0193873 0.567221 0.125333 -0.951057
-0.0889129 0.0112323 0.660081 0.125333 -0.929777
-0.0264703 0.00334398 0.742257 0.125333 -0.904827
--0.0335514 -0.00423853 0.812412 0.125333 -0.876307
--0.0908612 -0.0114784 0.869396 0.125333 -0.844328
--0.145188 -0.0183415 0.912272 0.125333 -0.809017
--0.196284 -0.0247964 0.940324 0.125333 -0.770514
--0.243924 -0.0308147 0.953074 0.125333 -0.728969
--0.287908 -0.0363712 0.950285 0.125333 -0.684548
--0.328063 -0.041444 0.931968 0.125333 -0.637425
--0.364242 -0.0460145 0.898382 0.125333 -0.587786
--0.396326 -0.0500676 0.850027 0.125333 -0.535828
--0.424221 -0.0535916 0.787639 0.125333 -0.481754
--0.447863 -0.0565782 0.712179 0.125333 -0.42578
--0.467211 -0.0590225 0.624817 0.125333 -0.368125
--0.482254 -0.0609228 0.52691 0.125333 -0.309018
--0.493003 -0.0622807 0.419987 0.125333 -0.248691
--0.499494 -0.0631007 0.305722 0.125333 -0.187382
--0.501784 -0.0633901 0.185906 0.125333 -0.125334
--0.499954 -0.0631588 0.0624212 0.125333 -0.0627915
--0.4941 -0.0624193 -0.0627885 0.125333 -9.80385e-07
--0.484338 -0.0611861 -0.187751 0.125333 0.0627895
--0.4708 -0.0594759 -0.310493 0.125333 0.125332
--0.453629 -0.0573067 -0.429075 0.125333 0.18738
--0.432981 -0.0546983 -0.541619 0.125333 0.248689
--0.409022 -0.0516715 -0.646341 0.125333 0.309016
--0.381924 -0.0482482 -0.741576 0.125333 0.368124
--0.351865 -0.0444508 -0.825806 0.125333 0.425778
--0.319027 -0.0403024 -0.897684 0.125333 0.481753
--0.283594 -0.0358262 -0.956056 0.125333 0.535826
--0.245751 -0.0310455 -0.999978 0.125333 0.587784
--0.20568 -0.0259835 -1.02873 0.125333 0.637423
--0.163564 -0.020663 -1.04183 0.125333 0.684546
--0.11958 -0.0151065 -1.03904 0.125333 0.728968
--0.0739014 -0.00933591 -1.02037 0.125333 0.770513
--0.0266968 -0.00337259 -0.986088 0.125333 0.809016
-0.0218703 0.00276286 -0.936687 0.125333 0.844327
-0.0716424 0.00905053 -0.872913 0.125333 0.876306
-0.122467 0.0154712 -0.795729 0.125333 0.904827
-0.174199 0.0220065 -0.706313 0.125333 0.929776
-0.226697 0.0286385 -0.606031 0.125333 0.951056
-0.279825 0.0353501 -0.496421 0.125333 0.968583
-0.333452 0.0421248 -0.379166 0.125333 0.982287
-0.387449 0.0489462 -0.256071 0.125333 0.992115
-0.441691 0.0557986 -0.129031 0.125333 0.998027
-0.491144 0.0936906 0 0.187381 1
-0.540962 0.103194 0.130686 0.187381 0.998027
-0.590721 0.112686 0.259381 0.187381 0.992115
-0.640359 0.122155 0.384125 0.187381 0.982287
-0.68981 0.131588 0.503019 0.187381 0.968583
-0.739004 0.140973 0.614258 0.187381 0.951057
-0.787862 0.150293 0.716153 0.187381 0.929777
-0.836298 0.159532 0.807163 0.187381 0.904827
-0.884213 0.168673 0.885918 0.187381 0.876307
-0.9315 0.177693 0.951237 0.187381 0.844328
-0.978038 0.186571 1.00215 0.187381 0.809017
-1.02369 0.19528 1.03791 0.187381 0.770513
-1.06832 0.203793 1.05802 0.187381 0.728969
-1.11176 0.21208 1.0622 0.187381 0.684547
-1.15385 0.220108 1.05044 0.187381 0.637424
-1.19439 0.227841 1.02297 0.187381 0.587785
-1.23319 0.235244 0.98027 0.187381 0.535827
-1.27006 0.242276 0.923049 0.187381 0.481754
-1.30477 0.248898 0.852246 0.187381 0.42578
-1.33712 0.255069 0.769009 0.187381 0.368125
-1.36687 0.260745 0.674679 0.187381 0.309017
-1.39381 0.265884 0.570768 0.187381 0.24869
-1.41772 0.270444 0.458933 0.187381 0.187382
-1.43837 0.274384 0.340953 0.187381 0.125334
-1.45556 0.277662 0.2187 0.187381 0.0627908
-1.46907 0.28024 0.0941089 0.187381 3.26795e-07
-1.47873 0.282082 -0.0308537 0.187381 -0.0627902
-1.48435 0.283155 -0.154219 0.187381 -0.125333
-1.48578 0.283428 -0.274049 0.187381 -0.187381
-1.48288 0.282875 -0.388463 0.187381 -0.24869
-1.47554 0.281475 -0.495674 0.187381 -0.309017
-1.46368 0.279212 -0.594009 0.187381 -0.368124
-1.44723 0.276073 -0.681941 0.187381 -0.425779
-1.42616 0.272054 -0.758113 0.187381 -0.481753
-1.40048 0.267156 -0.821353 0.187381 -0.535826
-1.37022 0.261384 -0.8707 0.187381 -0.587785
-1.33545 0.254751 -0.905416 0.187381 -0.637424
-1.29628 0.247279 -0.924995 0.187381 -0.684547
-1.25284 0.238992 -0.929176 0.187381 -0.728968
-1.2053 0.229924 -0.917941 0.187381 -0.770513
-1.15387 0.220113 -0.891521 0.187381 -0.809017
-1.09879 0.209605 -0.850386 0.187381 -0.844328
-1.04032 0.198451 -0.795244 0.187381 -0.876306
-0.978753 0.186707 -0.727025 0.187381 -0.904827
-0.914424 0.174436 -0.646866 0.187381 -0.929776
-0.847676 0.161703 -0.556096 0.187381 -0.951056
-0.778879 0.148579 -0.456213 0.187381 -0.968583
-0.70842 0.135138 -0.348858 0.187381 -0.982287
-0.6367 0.121457 -0.235792 0.187381 -0.992115
-0.564135 0.107614 -0.118869 0.187381 -0.998027
-0.491144 0.0936908 -1.23987e-06 0.187381 -1
-0.418154 0.0797671 0.118867 0.187381 -0.998027
-0.345588 0.0659245 0.23579 0.187381 -0.992115
-0.273869 0.0522433 0.348855 0.187381 -0.982287
-0.20341 0.0388025 0.456211 0.187381 -0.968583
-0.134612 0.0256787 0.556094 0.187381 -0.951057
-0.0678647 0.0129459 0.646864 0.187381 -0.929777
-0.00353565 0.000674461 0.727023 0.187381 -0.904827
--0.0580268 -0.0110692 0.795243 0.187381 -0.876307
--0.116499 -0.0222234 0.850385 0.187381 -0.844328
--0.171584 -0.0327314 0.89152 0.187381 -0.809017
--0.223014 -0.0425423 0.917941 0.187381 -0.770514
--0.270552 -0.0516106 0.929176 0.187381 -0.728969
--0.313994 -0.0598975 0.924996 0.187381 -0.684548
--0.353166 -0.06737 0.905417 0.187381 -0.637425
--0.387933 -0.0740022 0.870701 0.187381 -0.587786
--0.418191 -0.0797742 0.821354 0.187381 -0.535828
--0.443872 -0.084673 0.758114 0.187381 -0.481754
--0.464939 -0.0886918 0.681943 0.187381 -0.42578
--0.481391 -0.0918302 0.594011 0.187381 -0.368125
--0.493257 -0.0940937 0.495676 0.187381 -0.309018
--0.500595 -0.0954935 0.388466 0.187381 -0.248691
--0.503492 -0.0960463 0.274051 0.187381 -0.187382
--0.502062 -0.0957735 0.154222 0.187381 -0.125334
--0.496441 -0.0947011 0.0308563 0.187381 -0.0627915
--0.486784 -0.0928591 -0.0941063 0.187381 -9.80385e-07
--0.473269 -0.0902808 -0.218698 0.187381 0.0627895
--0.456084 -0.0870027 -0.34095 0.187381 0.125332
--0.435433 -0.0830632 -0.45893 0.187381 0.18738
--0.411527 -0.078503 -0.570766 0.187381 0.248689
--0.384586 -0.0733637 -0.674677 0.187381 0.309016
--0.354831 -0.0676876 -0.769007 0.187381 0.368124
--0.322485 -0.0615173 -0.852244 0.187381 0.425778
--0.287771 -0.0548952 -0.923047 0.187381 0.481753
--0.250905 -0.0478627 -0.980269 0.187381 0.535826
--0.2121 -0.0404603 -1.02297 0.187381 0.587784
--0.171559 -0.0327267 -1.05044 0.187381 0.637423
--0.129477 -0.024699 -1.0622 0.187381 0.684546
--0.0860359 -0.0164122 -1.05802 0.187381 0.728968
--0.0414079 -0.00789897 -1.03792 0.187381 0.770513
-0.00424818 0.000810384 -1.00215 0.187381 0.809016
-0.0507863 0.009688 -0.951238 0.187381 0.844327
-0.0980732 0.0187085 -0.885919 0.187381 0.876306
-0.145989 0.0278488 -0.807165 0.187381 0.904827
-0.194424 0.0370883 -0.716155 0.187381 0.929776
-0.243282 0.0464085 -0.61426 0.187381 0.951056
-0.292476 0.0557927 -0.503022 0.187381 0.968583
-0.341927 0.0652261 -0.384127 0.187381 0.982287
-0.391565 0.074695 -0.259384 0.187381 0.992115
-0.441324 0.084187 -0.130689 0.187381 0.998027
-0.484292 0.124345 0 0.24869 1
-0.529415 0.135931 0.132215 0.24869 0.998027
-0.57454 0.147517 0.262437 0.24869 0.992115
-0.619666 0.159103 0.388707 0.24869 0.982287
-0.664786 0.170688 0.509124 0.24869 0.968583
-0.709885 0.182268 0.62188 0.24869 0.951057
-0.754938 0.193835 0.725287 0.24869 0.929777
-0.799905 0.205381 0.817802 0.24869 0.904827
-0.844733 0.21689 0.89805 0.24869 0.876307
-0.88935 0.228346 0.964849 0.24869 0.844328
-0.933667 0.239725 1.01723 0.24869 0.809017
-0.977576 0.250999 1.05443 0.24869 0.770513
-1.02095 0.262135 1.07595 0.24869 0.728969
-1.06363 0.273095 1.08152 0.24869 0.684547
-1.10547 0.283836 1.07111 0.24869 0.637424
-1.14626 0.294309 1.04495 0.24869 0.587785
-1.1858 0.304462 1.00351 0.24869 0.535827
-1.22388 0.314238 0.947501 0.24869 0.481754
-1.26024 0.323576 0.877843 0.24869 0.42578
-1.29466 0.332411 0.795681 0.24869 0.368125
-1.32685 0.340677 0.70235 0.24869 0.309017
-1.35656 0.348306 0.599351 0.24869 0.24869
-1.38353 0.355229 0.488336 0.24869 0.187382
-1.40747 0.361377 0.371074 0.24869 0.125334
-1.42813 0.36668 0.249431 0.24869 0.0627908
-1.44524 0.371074 0.125334 0.24869 3.26795e-07
-1.45856 0.374493 0.000741619 0.24869 -0.0627902
-1.46785 0.37688 -0.122383 0.24869 -0.125333
-1.4729 0.378178 -0.242108 0.24869 -0.187381
-1.47353 0.378338 -0.356559 0.24869 -0.24869
-1.46956 0.377319 -0.463951 0.24869 -0.309017
-1.46086 0.375084 -0.562617 0.24869 -0.368124
-1.44732 0.371608 -0.651032 0.24869 -0.425779
-1.42887 0.366872 -0.727839 0.24869 -0.481753
-1.40549 0.360868 -0.791869 0.24869 -0.535826
-1.37717 0.353596 -0.84216 0.24869 -0.587785
-1.34396 0.34507 -0.877971 0.24869 -0.637424
-1.30595 0.33531 -0.898793 0.24869 -0.684547
-1.26326 0.32435 -0.904361 0.24869 -0.728968
-1.21607 0.312233 -0.894651 0.24869 -0.770513
-1.16458 0.299012 -0.869888 0.24869 -0.809017
-1.10903 0.284752 -0.830536 0.24869 -0.844328
-1.04973 0.269525 -0.777291 0.24869 -0.876306
-0.98698 0.253413 -0.711074 0.24869 -0.904827
-0.921141 0.236509 -0.633012 0.24869 -0.929776
-0.852595 0.218909 -0.544421 0.24869 -0.951056
-0.781753 0.20072 -0.446787 0.24869 -0.968583
-0.709044 0.182052 -0.341738 0.24869 -0.982287
-0.634921 0.16302 -0.231022 0.24869 -0.992115
-0.559846 0.143744 -0.116476 0.24869 -0.998027
-0.484292 0.124345 -1.21496e-06 0.24869 -1
-0.408739 0.104946 0.116474 0.24869 -0.998027
-0.333664 0.0856704 0.231019 0.24869 -0.992115
-0.25954 0.0666386 0.341735 0.24869 -0.982287
-0.186832 0.0479703 0.446785 0.24869 -0.968583
-0.115989 0.029781 0.544419 0.24869 -0.951057
-0.0474437 0.0121815 0.63301 0.24869 -0.929777
--0.0183953 -0.00472312 0.711072 0.24869 -0.904827
--0.0811445 -0.0208344 0.77729 0.24869 -0.876307
--0.14045 -0.0360615 0.830535 0.24869 -0.844328
--0.195992 -0.0503221 0.869888 0.24869 -0.809017
--0.247483 -0.0635428 0.894651 0.24869 -0.770514
--0.294676 -0.07566 0.90436 0.24869 -0.728969
--0.337363 -0.0866201 0.898793 0.24869 -0.684548
--0.375375 -0.0963798 0.877971 0.24869 -0.637425
--0.408583 -0.104906 0.842161 0.24869 -0.587786
--0.436903 -0.112178 0.791871 0.24869 -0.535828
--0.460289 -0.118182 0.727841 0.24869 -0.481754
--0.478735 -0.122918 0.651034 0.24869 -0.42578
--0.492274 -0.126394 0.562619 0.24869 -0.368125
--0.500976 -0.128629 0.463953 0.24869 -0.309018
--0.504947 -0.129648 0.356561 0.24869 -0.248691
--0.504322 -0.129488 0.24211 0.24869 -0.187382
--0.499267 -0.12819 0.122386 0.24869 -0.125334
--0.489973 -0.125804 -0.000739035 0.24869 -0.0627915
--0.476654 -0.122384 -0.125331 0.24869 -9.80385e-07
--0.459543 -0.117991 -0.249429 0.24869 0.0627895
--0.438887 -0.112687 -0.371072 0.24869 0.125332
--0.414945 -0.10654 -0.488333 0.24869 0.18738
--0.387982 -0.0996168 -0.599349 0.24869 0.248689
--0.358268 -0.0919876 -0.702348 0.24869 0.309016
--0.326073 -0.0837212 -0.79568 0.24869 0.368124
--0.291662 -0.074886 -0.877841 0.24869 0.425778
--0.255294 -0.0655484 -0.947499 0.24869 0.481753
--0.21722 -0.0557727 -1.00351 0.24869 0.535826
--0.177676 -0.0456195 -1.04495 0.24869 0.587784
--0.136885 -0.0351461 -1.07111 0.24869 0.637423
--0.0950523 -0.0244053 -1.08152 0.24869 0.684546
--0.0523656 -0.0134452 -1.07595 0.24869 0.728968
--0.00899362 -0.00230917 -1.05443 0.24869 0.770513
-0.0349152 0.0089647 -1.01723 0.24869 0.809016
-0.0792324 0.0203434 -0.96485 0.24869 0.844327
-0.123849 0.0317991 -0.898051 0.24869 0.876306
-0.168677 0.0433089 -0.817803 0.24869 0.904827
-0.213644 0.0548545 -0.725289 0.24869 0.929776
-0.258697 0.066422 -0.621883 0.24869 0.951056
-0.303796 0.0780015 -0.509126 0.24869 0.968583
-0.348916 0.0895864 -0.388709 0.24869 0.982287
-0.394042 0.101173 -0.26244 0.24869 0.992115
-0.439167 0.112759 -0.132217 0.24869 0.998027
-0.475528 0.154508 0 0.309017 1
-0.515864 0.167614 0.133613 0.309017 0.998027
-0.55626 0.18074 0.265234 0.309017 0.992115
-0.596776 0.193904 0.392905 0.309017 0.982287
-0.63746 0.207123 0.514726 0.309017 0.968583
-0.678353 0.22041 0.628889 0.309017 0.951057
-0.71948 0.233773 0.733706 0.309017 0.929777
-0.760847 0.247214 0.827633 0.309017 0.904827
-0.802445 0.26073 0.909296 0.309017 0.876307
-0.844237 0.274309 0.977509 0.309017 0.844328
-0.886166 0.287933 1.0313 0.309017 0.809017
-0.928148 0.301574 1.06991 0.309017 0.770513
-0.970071 0.315195 1.09283 0.309017 0.728969
-1.0118 0.328753 1.09978 0.309017 0.684547
-1.05317 0.342194 1.09073 0.309017 0.637424
-1.09398 0.355456 1.06591 0.309017 0.587785
-1.13403 0.368468 1.02577 0.309017 0.535827
-1.17307 0.381153 0.971018 0.309017 0.481754
-1.21084 0.393426 0.902573 0.309017 0.42578
-1.24707 0.405196 0.821569 0.309017 0.368125
-1.28145 0.416369 0.729327 0.309017 0.309017
-1.31369 0.426844 0.627343 0.309017 0.24869
-1.34347 0.436519 0.517256 0.309017 0.187382
-1.37047 0.445292 0.40083 0.309017 0.125334
-1.39438 0.45306 0.279917 0.309017 0.0627908
-1.41488 0.459721 0.156435 0.309017 3.26795e-07
-1.43167 0.465177 0.0323362 0.309017 -0.0627902
-1.44447 0.469336 -0.0904265 0.309017 -0.125333
-1.45301 0.47211 -0.209928 0.309017 -0.187381
-1.45704 0.47342 -0.324302 0.309017 -0.24869
-1.45635 0.473197 -0.43177 0.309017 -0.309017
-1.45076 0.471379 -0.53067 0.309017 -0.368124
-1.44011 0.46792 -0.61948 0.309017 -0.425779
-1.4243 0.462784 -0.696848 0.309017 -0.481753
-1.40326 0.455948 -0.761605 0.309017 -0.535826
-1.37697 0.447405 -0.812789 0.309017 -0.587785
-1.34545 0.437163 -0.849659 0.309017 -0.637424
-1.30877 0.425244 -0.871703 0.309017 -0.684547
-1.26704 0.411686 -0.878653 0.309017 -0.728968
-1.22043 0.396543 -0.870479 0.309017 -0.770513
-1.16916 0.379883 -0.847398 0.309017 -0.809017
-1.11347 0.36179 -0.809866 0.309017 -0.844328
-1.05368 0.342361 -0.75857 0.309017 -0.876306
-0.990119 0.321709 -0.694421 0.309017 -0.904827
-0.923171 0.299956 -0.618533 0.309017 -0.929776
-0.853253 0.277239 -0.532209 0.309017 -0.951056
-0.78081 0.2537 -0.43692 0.309017 -0.968583
-0.706314 0.229495 -0.33428 0.309017 -0.982287
-0.63026 0.204784 -0.226023 0.309017 -0.992115
-0.553158 0.179732 -0.113969 0.309017 -0.998027
-0.475529 0.154509 -1.18884e-06 0.309017 -1
-0.3979 0.129286 0.113966 0.309017 -0.998027
-0.320798 0.104234 0.22602 0.309017 -0.992115
-0.244744 0.0795222 0.334278 0.309017 -0.982287
-0.170249 0.0553171 0.436918 0.309017 -0.968583
-0.0978052 0.0317788 0.532207 0.309017 -0.951057
-0.0278867 0.00906092 0.618531 0.309017 -0.929777
--0.0390611 -0.0126917 0.69442 0.309017 -0.904827
--0.102622 -0.0333441 0.758569 0.309017 -0.876307
--0.162417 -0.0527724 0.809865 0.309017 -0.844328
--0.218102 -0.0708656 0.847397 0.309017 -0.809017
--0.269376 -0.0875257 0.870478 0.309017 -0.770514
--0.315983 -0.102669 0.878653 0.309017 -0.728969
--0.35771 -0.116227 0.871704 0.309017 -0.684548
--0.394394 -0.128146 0.849659 0.309017 -0.637425
--0.425916 -0.138388 0.81279 0.309017 -0.587786
--0.452207 -0.146931 0.761606 0.309017 -0.535828
--0.473245 -0.153767 0.696849 0.309017 -0.481754
--0.489054 -0.158903 0.619482 0.309017 -0.42578
--0.4997 -0.162362 0.530671 0.309017 -0.368125
--0.505294 -0.16418 0.431772 0.309017 -0.309018
--0.505982 -0.164404 0.324304 0.309017 -0.248691
--0.50195 -0.163093 0.209931 0.309017 -0.187382
--0.493412 -0.160319 0.090429 0.309017 -0.125334
--0.480613 -0.15616 -0.0323337 0.309017 -0.0627915
--0.463819 -0.150704 -0.156432 0.309017 -9.80385e-07
--0.443319 -0.144043 -0.279914 0.309017 0.0627895
--0.419413 -0.136276 -0.400827 0.309017 0.125332
--0.392412 -0.127502 -0.517254 0.309017 0.18738
--0.362634 -0.117827 -0.62734 0.309017 0.248689
--0.330395 -0.107352 -0.729325 0.309017 0.309016
--0.29601 -0.0961794 -0.821567 0.309017 0.368124
--0.259784 -0.0844089 -0.902572 0.309017 0.425778
--0.222011 -0.0721359 -0.971016 0.309017 0.481753
--0.182971 -0.059451 -1.02577 0.309017 0.535826
--0.142924 -0.0464389 -1.0659 0.309017 0.587784
--0.102109 -0.0331773 -1.09073 0.309017 0.637423
--0.0607429 -0.0197366 -1.09978 0.309017 0.684546
--0.0190157 -0.00617856 -1.09283 0.309017 0.728968
-0.0229076 0.00744313 -1.06991 0.309017 0.770513
-0.0648892 0.0210838 -1.0313 0.309017 0.809016
-0.106818 0.0347074 -0.97751 0.309017 0.844327
-0.148611 0.0482866 -0.909297 0.309017 0.876306
-0.190208 0.0618024 -0.827635 0.309017 0.904827
-0.231576 0.0752436 -0.733709 0.309017 0.929776
-0.272703 0.0886064 -0.628892 0.309017 0.951056
-0.313596 0.101893 -0.514729 0.309017 0.968583
-0.35428 0.115113 -0.392908 0.309017 0.982287
-0.394796 0.128277 -0.265237 0.309017 0.992115
-0.435192 0.141402 -0.133616 0.309017 0.998027
-0.464888 0.184062 0 0.368124 1
-0.500399 0.198122 0.134879 0.368124 0.998027
-0.536029 0.212229 0.26777 0.368124 0.992115
-0.571889 0.226427 0.396716 0.368124 0.982287
-0.608086 0.240758 0.51982 0.368124 0.968583
-0.64471 0.255259 0.635278 0.368124 0.951057
-0.681836 0.269958 0.741401 0.368124 0.929777
-0.719515 0.284876 0.836648 0.368124 0.904827
-0.757776 0.300025 0.919644 0.368124 0.876307
-0.796621 0.315405 0.989204 0.368124 0.844328
-0.836021 0.331004 1.04435 0.368124 0.809017
-0.875916 0.346799 1.08433 0.368124 0.770513
-0.916211 0.362754 1.10862 0.368124 0.728969
-0.956782 0.378817 1.11694 0.368124 0.684547
-0.997467 0.394925 1.10927 0.368124 0.637424
-1.03807 0.411002 1.08581 0.368124 0.587785
-1.07838 0.42696 1.04701 0.368124 0.535827
-1.11812 0.442697 0.993576 0.368124 0.481754
-1.15703 0.458102 0.926413 0.368124 0.42578
-1.1948 0.473053 0.846645 0.368124 0.368125
-1.23109 0.487423 0.755585 0.368124 0.309017
-1.26557 0.501075 0.654715 0.368124 0.24869
-1.29788 0.513868 0.545667 0.368124 0.187382
-1.32767 0.52566 0.430189 0.368124 0.125334
-1.35456 0.536307 0.310125 0.368124 0.0627908
-1.3782 0.545666 0.187382 0.368124 3.26795e-07
-1.39823 0.553598 0.063899 0.368124 -0.0627902
-1.41432 0.559969 -0.0583805 0.368124 -0.125333
-1.42615 0.564654 -0.177541 0.368124 -0.187381
-1.43344 0.567537 -0.291725 0.368124 -0.24869
-1.4359 0.568513 -0.399163 0.368124 -0.309017
-1.43332 0.567493 -0.498199 0.368124 -0.368124
-1.42551 0.564401 -0.587317 0.368124 -0.425779
-1.41233 0.55918 -0.665169 0.368124 -0.481753
-1.39366 0.551789 -0.730588 0.368124 -0.535826
-1.36947 0.54221 -0.782616 0.368124 -0.587785
-1.33974 0.530441 -0.820508 0.368124 -0.637424
-1.30454 0.516504 -0.843754 0.368124 -0.684547
-1.26397 0.500441 -0.852078 0.368124 -0.728968
-1.21819 0.482315 -0.845447 0.368124 -0.770513
-1.16741 0.462211 -0.824071 0.368124 -0.809017
-1.1119 0.440234 -0.788397 0.368124 -0.844328
-1.05198 0.416508 -0.739101 0.368124 -0.876306
-0.987997 0.391176 -0.677083 0.368124 -0.904827
-0.920364 0.364398 -0.603443 0.368124 -0.929776
-0.849522 0.336349 -0.519471 0.368124 -0.951056
-0.775952 0.307221 -0.426622 0.368124 -0.968583
-0.700161 0.277213 -0.326493 0.368124 -0.982287
-0.622684 0.246538 -0.220801 0.368124 -0.992115
-0.544072 0.215413 -0.111349 0.368124 -0.998027
-0.464889 0.184063 -1.16156e-06 0.368124 -1
-0.385706 0.152712 0.111346 0.368124 -0.998027
-0.307094 0.121587 0.220799 0.368124 -0.992115
-0.229617 0.0909116 0.326491 0.368124 -0.982287
-0.153826 0.0609041 0.42662 0.368124 -0.968583
-0.080256 0.0317756 0.519469 0.368124 -0.951057
-0.00941445 0.00372744 0.603441 0.368124 -0.929777
--0.0582193 -0.0230507 0.677081 0.368124 -0.904827
--0.122201 -0.0483829 0.7391 0.368124 -0.876307
--0.182127 -0.0721092 0.788396 0.368124 -0.844328
--0.237635 -0.0940865 0.82407 0.368124 -0.809017
--0.288412 -0.11419 0.845447 0.368124 -0.770514
--0.334192 -0.132316 0.852078 0.368124 -0.728969
--0.374763 -0.148379 0.843754 0.368124 -0.684548
--0.409964 -0.162316 0.820509 0.368124 -0.637425
--0.439688 -0.174085 0.782617 0.368124 -0.587786
--0.463884 -0.183665 0.73059 0.368124 -0.535828
--0.48255 -0.191055 0.66517 0.368124 -0.481754
--0.495738 -0.196276 0.587319 0.368124 -0.42578
--0.503547 -0.199368 0.498201 0.368124 -0.368125
--0.506124 -0.200389 0.399165 0.368124 -0.309018
--0.503659 -0.199413 0.291728 0.368124 -0.248691
--0.496378 -0.19653 0.177544 0.368124 -0.187382
--0.484545 -0.191845 0.058383 0.368124 -0.125334
--0.468453 -0.185474 -0.0638964 0.368124 -0.0627915
--0.44842 -0.177542 -0.187379 0.368124 -9.80385e-07
--0.424782 -0.168183 -0.310123 0.368124 0.0627895
--0.397891 -0.157536 -0.430187 0.368124 0.125332
--0.368107 -0.145744 -0.545664 0.368124 0.18738
--0.335794 -0.13295 -0.654713 0.368124 0.248689
--0.301314 -0.119299 -0.755583 0.368124 0.309016
--0.265021 -0.104929 -0.846643 0.368124 0.368124
--0.227257 -0.0899774 -0.926412 0.368124 0.425778
--0.188349 -0.0745726 -0.993575 0.368124 0.481753
--0.148602 -0.0588357 -1.04701 0.368124 0.535826
--0.108298 -0.0428783 -1.0858 0.368124 0.587784
--0.0676913 -0.0268009 -1.10927 0.368124 0.637423
--0.0270062 -0.0106925 -1.11694 0.368124 0.684546
-0.0135643 0.0053705 -1.10862 0.368124 0.728968
-0.0538601 0.0213247 -1.08433 0.368124 0.770513
-0.0937544 0.03712 -1.04435 0.368124 0.809016
-0.133154 0.0527195 -0.989205 0.368124 0.844327
-0.171999 0.0680993 -0.919646 0.368124 0.876306
-0.210261 0.0832482 -0.83665 0.368124 0.904827
-0.24794 0.0981665 -0.741404 0.368124 0.929776
-0.285065 0.112865 -0.63528 0.368124 0.951056
-0.32169 0.127366 -0.519823 0.368124 0.968583
-0.357886 0.141697 -0.396718 0.368124 0.982287
-0.393747 0.155895 -0.267773 0.368124 0.992115
-0.429376 0.170002 -0.134882 0.368124 0.998027
-0.452414 0.21289 0 0.425779 1
-0.483121 0.22734 0.136012 0.425779 0.998027
-0.514 0.24187 0.270041 0.425779 0.992115
-0.545217 0.25656 0.400135 0.425779 0.982287
-0.576926 0.271481 0.524401 0.425779 0.968583
-0.609268 0.2867 0.641039 0.425779 0.951057
-0.642364 0.302273 0.748365 0.425779 0.929777
-0.676307 0.318246 0.844838 0.425779 0.904827
-0.711164 0.334648 0.929085 0.425779 0.876307
-0.746971 0.351498 0.999923 0.425779 0.844328
-0.783728 0.368794 1.05637 0.425779 0.809017
-0.821396 0.38652 1.09768 0.425779 0.770513
-0.859901 0.404638 1.12332 0.425779 0.728969
-0.899127 0.423097 1.13301 0.425779 0.684547
-0.938919 0.441821 1.12671 0.425779 0.637424
-0.979083 0.460721 1.10463 0.425779 0.587785
-1.01939 0.479688 1.06722 0.425779 0.535827
-1.05957 0.498595 1.01515 0.425779 0.481754
-1.09932 0.517302 0.949339 0.425779 0.42578
-1.13832 0.535654 0.870886 0.425779 0.368125
-1.17621 0.553483 0.781096 0.425779 0.309017
-1.21262 0.570614 0.681442 0.425779 0.24869
-1.24715 0.586863 0.573539 0.425779 0.187382
-1.2794 0.60204 0.459124 0.425779 0.125334
-1.30897 0.615954 0.340028 0.425779 0.0627908
-1.33545 0.628415 0.218144 0.425779 3.26795e-07
-1.35845 0.639236 0.0953986 0.425779 -0.0627902
-1.37757 0.648237 -0.0262769 0.425779 -0.125333
-1.39247 0.655246 -0.144979 0.425779 -0.187381
-1.4028 0.660106 -0.258861 0.425779 -0.24869
-1.40825 0.662671 -0.366162 0.425779 -0.309017
-1.40856 0.662816 -0.465236 0.425779 -0.368124
-1.40349 0.660434 -0.554574 0.425779 -0.425779
-1.39288 0.655439 -0.632833 0.425779 -0.481753
-1.37658 0.64777 -0.698851 0.425779 -0.535826
-1.35453 0.637391 -0.75167 0.425779 -0.587785
-1.32669 0.624293 -0.790548 0.425779 -0.637424
-1.29311 0.608492 -0.814971 0.425779 -0.684547
-1.25389 0.590034 -0.824662 0.425779 -0.728968
-1.20917 0.568991 -0.819581 0.425779 -0.770513
-1.15917 0.545464 -0.799931 0.425779 -0.809017
-1.10416 0.51958 -0.766149 0.425779 -0.844328
-1.04447 0.491492 -0.718903 0.425779 -0.876306
-0.980478 0.461378 -0.659077 0.425779 -0.904827
-0.912599 0.429436 -0.587758 0.425779 -0.929776
-0.841305 0.395888 -0.50622 0.425779 -0.951056
-0.767106 0.360973 -0.415902 0.425779 -0.968583
-0.69054 0.324943 -0.318384 0.425779 -0.982287
-0.612175 0.288068 -0.215361 0.425779 -0.992115
-0.532599 0.250622 -0.108619 0.425779 -0.998027
-0.452414 0.21289 -1.13312e-06 0.425779 -1
-0.37223 0.175158 0.108616 0.425779 -0.998027
-0.292654 0.137712 0.215359 0.425779 -0.992115
-0.214289 0.100837 0.318382 0.425779 -0.982287
-0.137723 0.0648074 0.4159 0.425779 -0.968583
-0.0635231 0.0298917 0.506219 0.425779 -0.951057
--0.00777004 -0.0036563 0.587756 0.425779 -0.929777
--0.0756494 -0.0355979 0.659075 0.425779 -0.904827
--0.139647 -0.0657127 0.718902 0.425779 -0.876307
--0.199337 -0.0938006 0.766148 0.425779 -0.844328
--0.254343 -0.119685 0.79993 0.425779 -0.809017
--0.30434 -0.143211 0.819581 0.425779 -0.770514
--0.349058 -0.164254 0.824662 0.425779 -0.728969
--0.388284 -0.182712 0.814972 0.425779 -0.684548
--0.421863 -0.198513 0.790549 0.425779 -0.637425
--0.449699 -0.211612 0.751671 0.425779 -0.587786
--0.471755 -0.221991 0.698852 0.425779 -0.535828
--0.488052 -0.22966 0.632834 0.425779 -0.481754
--0.498666 -0.234655 0.554576 0.425779 -0.42578
--0.50373 -0.237037 0.465238 0.425779 -0.368125
--0.503422 -0.236892 0.366164 0.425779 -0.309018
--0.49797 -0.234327 0.258863 0.425779 -0.248691
--0.487643 -0.229467 0.144981 0.425779 -0.187382
--0.472747 -0.222458 0.0262794 0.425779 -0.125334
--0.453619 -0.213457 -0.095396 0.425779 -0.0627915
--0.430623 -0.202636 -0.218141 0.425779 -9.80385e-07
--0.404142 -0.190175 -0.340026 0.425779 0.0627895
--0.374573 -0.176261 -0.459122 0.425779 0.125332
--0.342321 -0.161084 -0.573536 0.425779 0.18738
--0.307791 -0.144836 -0.68144 0.425779 0.248689
--0.271386 -0.127705 -0.781094 0.425779 0.309016
--0.233496 -0.109875 -0.870884 0.425779 0.368124
--0.194497 -0.0915231 -0.949337 0.425779 0.425778
--0.154742 -0.0728162 -1.01515 0.425779 0.481753
--0.114563 -0.0539091 -1.06722 0.425779 0.535826
--0.0742569 -0.0349426 -1.10463 0.425779 0.587784
--0.0340924 -0.0160426 -1.12671 0.425779 0.637423
-0.00569972 0.00268209 -1.13301 0.425779 0.684546
-0.0449255 0.0211403 -1.12332 0.425779 0.728968
-0.0834303 0.0392593 -1.09768 0.425779 0.770513
-0.121099 0.0569847 -1.05637 0.425779 0.809016
-0.157855 0.0742809 -0.999924 0.425779 0.844327
-0.193662 0.0911304 -0.929087 0.425779 0.876306
-0.22852 0.107533 -0.844839 0.425779 0.904827
-0.262463 0.123506 -0.748367 0.425779 0.929776
-0.295558 0.139079 -0.641042 0.425779 0.951056
-0.3279 0.154298 -0.524404 0.425779 0.968583
-0.35961 0.169219 -0.400137 0.425779 0.982287
-0.390826 0.183909 -0.270044 0.425779 0.992115
-0.421705 0.198439 -0.136015 0.425779 0.998027
-0.438153 0.240877 0 0.481754 1
-0.464135 0.25516 0.137011 0.481754 0.998027
-0.490337 0.269565 0.272046 0.481754 0.992115
-0.516973 0.284208 0.403159 0.481754 0.982287
-0.544247 0.299202 0.528465 0.481754 0.968583
-0.572344 0.314649 0.646168 0.481754 0.951057
-0.601426 0.330637 0.75459 0.481754 0.929777
-0.631628 0.34724 0.852193 0.481754 0.904827
-0.663051 0.364515 0.937609 0.481754 0.876307
-0.695763 0.382499 1.00965 0.481754 0.844328
-0.729789 0.401205 1.06735 0.481754 0.809017
-0.765115 0.420625 1.10995 0.481754 0.770513
-0.801682 0.440728 1.13691 0.481754 0.728969
-0.839386 0.461456 1.14796 0.481754 0.684547
-0.878078 0.482727 1.14305 0.481754 0.637424
-0.917565 0.504436 1.12237 0.481754 0.587785
-0.957611 0.526451 1.08638 0.481754 0.535827
-0.997938 0.548621 1.03573 0.481754 0.481754
-1.03823 0.570773 0.971328 0.481754 0.42578
-1.07814 0.592714 0.894267 0.481754 0.368125
-1.11729 0.614236 0.805837 0.481754 0.309017
-1.15528 0.635118 0.707496 0.481754 0.24869
-1.19167 0.655126 0.600845 0.481754 0.187382
-1.22604 0.674021 0.487606 0.481754 0.125334
-1.25794 0.691559 0.369595 0.481754 0.0627908
-1.28693 0.707495 0.24869 0.481754 3.26795e-07
-1.31257 0.72159 0.126804 0.481754 -0.0627902
-1.33443 0.733611 0.00585268 0.481754 -0.125333
-1.35212 0.743334 -0.112274 0.481754 -0.187381
-1.36525 0.750553 -0.225741 0.481754 -0.24869
-1.37348 0.755078 -0.3328 0.481754 -0.309017
-1.37651 0.756741 -0.431814 0.481754 -0.368124
-1.37407 0.755399 -0.521284 0.481754 -0.425779
-1.36594 0.750934 -0.599873 0.481754 -0.481753
-1.35199 0.743261 -0.666424 0.481754 -0.535826
-1.33209 0.732323 -0.719983 0.481754 -0.587785
-1.30622 0.718098 -0.759808 0.481754 -0.637424
-1.27438 0.700598 -0.785385 0.481754 -0.684547
-1.23668 0.67987 -0.796432 0.481754 -0.728968
-1.19325 0.655996 -0.792906 0.481754 -0.770513
-1.14431 0.629092 -0.775001 0.481754 -0.809017
-1.09014 0.599309 -0.743146 0.481754 -0.844328
-1.03106 0.566829 -0.697995 0.481754 -0.876306
-0.967462 0.531867 -0.64042 0.481754 -0.904827
-0.899792 0.494665 -0.571493 0.481754 -0.929776
-0.828535 0.455491 -0.49247 0.481754 -0.951056
-0.754224 0.414638 -0.404773 0.481754 -0.968583
-0.677424 0.372417 -0.30996 0.481754 -0.982287
-0.598731 0.329155 -0.209709 0.481754 -0.992115
-0.518763 0.285192 -0.105781 0.481754 -0.998027
-0.438154 0.240877 -1.10357e-06 0.481754 -1
-0.357545 0.196562 0.105779 0.481754 -0.998027
-0.277578 0.1526 0.209707 0.481754 -0.992115
-0.198885 0.109338 0.309958 0.481754 -0.982287
-0.122084 0.0671164 0.404771 0.481754 -0.968583
-0.0477728 0.0262633 0.492469 0.481754 -0.951057
--0.0234835 -0.0129101 0.571491 0.481754 -0.929777
--0.0911539 -0.0501123 0.640418 0.481754 -0.904827
--0.15475 -0.0850745 0.697994 0.481754 -0.876307
--0.213831 -0.117554 0.743145 0.481754 -0.844328
--0.268006 -0.147338 0.775001 0.481754 -0.809017
--0.316945 -0.174242 0.792906 0.481754 -0.770514
--0.360372 -0.198116 0.796432 0.481754 -0.728969
--0.398076 -0.218844 0.785385 0.481754 -0.684548
--0.429908 -0.236344 0.759809 0.481754 -0.637425
--0.455783 -0.250569 0.719984 0.481754 -0.587786
--0.475679 -0.261507 0.666425 0.481754 -0.535828
--0.489638 -0.269181 0.599874 0.481754 -0.481754
--0.497759 -0.273645 0.521286 0.481754 -0.42578
--0.500201 -0.274988 0.431816 0.481754 -0.368125
--0.497176 -0.273325 0.332802 0.481754 -0.309018
--0.488945 -0.2688 0.225743 0.481754 -0.248691
--0.475814 -0.261581 0.112276 0.481754 -0.187382
--0.458127 -0.251857 -0.00585018 0.481754 -0.125334
--0.436262 -0.239837 -0.126802 0.481754 -0.0627915
--0.410623 -0.225742 -0.248688 0.481754 -9.80385e-07
--0.381635 -0.209805 -0.369593 0.481754 0.0627895
--0.349734 -0.192268 -0.487604 0.481754 0.125332
--0.315364 -0.173373 -0.600842 0.481754 0.18738
--0.278969 -0.153365 -0.707494 0.481754 0.248689
--0.240986 -0.132483 -0.805835 0.481754 0.309016
--0.201837 -0.110961 -0.894265 0.481754 0.368124
--0.161926 -0.0890195 -0.971326 0.481754 0.425778
--0.121632 -0.0668678 -1.03573 0.481754 0.481753
--0.0813049 -0.0446977 -1.08638 0.481754 0.535826
--0.0412591 -0.0226824 -1.12237 0.481754 0.587784
--0.00177198 -0.000974157 -1.14305 0.481754 0.637423
-0.0369202 0.020297 -1.14796 0.481754 0.684546
-0.0746241 0.0410249 -1.13691 0.481754 0.728968
-0.111191 0.0611278 -1.10995 0.481754 0.770513
-0.146517 0.0805484 -1.06735 0.481754 0.809016
-0.180544 0.0992546 -1.00966 0.481754 0.844327
-0.213255 0.117238 -0.937611 0.481754 0.876306
-0.244678 0.134513 -0.852195 0.481754 0.904827
-0.27488 0.151116 -0.754592 0.481754 0.929776
-0.303962 0.167104 -0.646171 0.481754 0.951056
-0.332059 0.182551 -0.528468 0.481754 0.968583
-0.359333 0.197545 -0.403162 0.481754 0.982287
-0.38597 0.212189 -0.272049 0.481754 0.992115
-0.412171 0.226593 -0.137014 0.481754 0.998027
-0.422164 0.267913 0 0.535827 1
-0.443551 0.281486 0.137875 0.535827 0.998027
-0.465203 0.295227 0.273782 0.535827 0.992115
-0.487378 0.309299 0.405785 0.535827 0.982287
-0.510321 0.323859 0.532007 0.535827 0.968583
-0.534257 0.33905 0.650659 0.535827 0.951057
-0.559389 0.354999 0.76007 0.535827 0.929777
-0.585885 0.371814 0.858707 0.535827 0.904827
-0.613881 0.389581 0.945208 0.535827 0.876307
-0.643473 0.40836 1.01839 0.535827 0.844328
-0.674711 0.428185 1.07728 0.535827 0.809017
-0.707602 0.449057 1.12112 0.535827 0.770513
-0.742102 0.470952 1.14938 0.535827 0.728969
-0.778119 0.493809 1.16177 0.535827 0.684547
-0.815511 0.517539 1.15825 0.535827 0.637424
-0.854086 0.54202 1.139 0.535827 0.587785
-0.893606 0.5671 1.10446 0.535827 0.535827
-0.933786 0.592598 1.05528 0.535827 0.481754
-0.974298 0.618308 0.992358 0.535827 0.42578
-1.01478 0.643997 0.916766 0.535827 0.368125
-1.05482 0.669412 0.829783 0.535827 0.309017
-1.09401 0.694281 0.732851 0.535827 0.24869
-1.13189 0.718319 0.627558 0.535827 0.187382
-1.16799 0.74123 0.515607 0.535827 0.125334
-1.20184 0.762713 0.398798 0.535827 0.0627908
-1.23297 0.782464 0.278992 0.535827 3.26795e-07
-1.26089 0.800185 0.158084 0.535827 -0.0627902
-1.28515 0.815584 0.0379765 0.535827 -0.125333
-1.30532 0.828381 -0.0794577 0.535827 -0.187381
-1.32098 0.838316 -0.192398 0.535827 -0.24869
-1.33174 0.845149 -0.29911 0.535827 -0.309017
-1.33728 0.848664 -0.397966 0.535827 -0.368124
-1.3373 0.848678 -0.48748 0.535827 -0.425779
-1.33157 0.845037 -0.566321 0.535827 -0.481753
-1.31989 0.837627 -0.633339 0.535827 -0.535826
-1.30215 0.826368 -0.687585 0.535827 -0.587785
-1.27829 0.811225 -0.728318 0.535827 -0.637424
-1.24831 0.792201 -0.755023 0.535827 -0.684547
-1.21229 0.769344 -0.767416 0.535827 -0.728968
-1.17038 0.742744 -0.765449 0.535827 -0.770513
-1.12277 0.712533 -0.749307 0.535827 -0.809017
-1.06976 0.678887 -0.719409 0.535827 -0.844328
-1.01166 0.64202 -0.676398 0.535827 -0.876306
-0.94889 0.602184 -0.621131 0.535827 -0.904827
-0.881893 0.559666 -0.554663 0.535827 -0.929776
-0.811175 0.514787 -0.478234 0.535827 -0.951056
-0.737285 0.467895 -0.393244 0.535827 -0.968583
-0.660809 0.419362 -0.301231 0.535827 -0.982287
-0.582367 0.369581 -0.203849 0.535827 -0.992115
-0.502599 0.318959 -0.10284 0.535827 -0.998027
-0.422165 0.267914 -1.07293e-06 0.535827 -1
-0.341731 0.216869 0.102838 0.535827 -0.998027
-0.261963 0.166247 0.203847 0.535827 -0.992115
-0.18352 0.116465 0.301229 0.535827 -0.982287
-0.107044 0.0679325 0.393242 0.535827 -0.968583
-0.0331543 0.0210404 0.478233 0.535827 -0.951057
--0.0375635 -0.0238385 0.554662 0.535827 -0.929777
--0.10456 -0.066356 0.62113 0.535827 -0.904827
--0.167332 -0.106192 0.676397 0.535827 -0.876307
--0.225426 -0.14306 0.719408 0.535827 -0.844328
--0.278444 -0.176706 0.749306 0.535827 -0.809017
--0.326048 -0.206916 0.765449 0.535827 -0.770514
--0.367963 -0.233517 0.767416 0.535827 -0.728969
--0.403981 -0.256374 0.755023 0.535827 -0.684548
--0.433958 -0.275398 0.728318 0.535827 -0.637425
--0.45782 -0.290541 0.687586 0.535827 -0.587786
--0.47556 -0.3018 0.633341 0.535827 -0.535828
--0.487238 -0.30921 0.566322 0.535827 -0.481754
--0.492974 -0.312851 0.487482 0.535827 -0.42578
--0.492953 -0.312838 0.397968 0.535827 -0.368125
--0.487414 -0.309322 0.299112 0.535827 -0.309018
--0.476648 -0.30249 0.192401 0.535827 -0.248691
--0.460993 -0.292555 0.0794601 0.535827 -0.187382
--0.440827 -0.279757 -0.037974 0.535827 -0.125334
--0.416563 -0.264359 -0.158082 0.535827 -0.0627915
--0.388639 -0.246638 -0.278989 0.535827 -9.80385e-07
--0.357516 -0.226886 -0.398795 0.535827 0.0627895
--0.323665 -0.205404 -0.515605 0.535827 0.125332
--0.287563 -0.182493 -0.627555 0.535827 0.18738
--0.249685 -0.158455 -0.732849 0.535827 0.248689
--0.210497 -0.133586 -0.829781 0.535827 0.309016
--0.17045 -0.108171 -0.916764 0.535827 0.368124
--0.129971 -0.0824821 -0.992356 0.535827 0.425778
--0.0894588 -0.0567723 -1.05528 0.535827 0.481753
--0.0492792 -0.0312735 -1.10446 0.535827 0.535826
--0.00975915 -0.00619335 -1.139 0.535827 0.587784
-0.0288165 0.0182875 -1.15825 0.535827 0.637423
-0.0662086 0.0420173 -1.16177 0.535827 0.684546
-0.102226 0.0648744 -1.14938 0.535827 0.728968
-0.136726 0.0867688 -1.12112 0.535827 0.770513
-0.169616 0.107642 -1.07728 0.535827 0.809016
-0.200855 0.127466 -1.01839 0.535827 0.844327
-0.230446 0.146245 -0.945209 0.535827 0.876306
-0.258442 0.164013 -0.858709 0.535827 0.904827
-0.284939 0.180828 -0.760072 0.535827 0.929776
-0.31007 0.196777 -0.650662 0.535827 0.951056
-0.334007 0.211967 -0.53201 0.535827 0.968583
-0.35695 0.226527 -0.405788 0.535827 0.982287
-0.379124 0.2406 -0.273785 0.535827 0.992115
-0.400776 0.25434 -0.137878 0.535827 0.998027
-0.404509 0.293893 0 0.587785 1
-0.421488 0.306229 0.138602 0.587785 0.998027
-0.43877 0.318785 0.275248 0.587785 0.992115
-0.456653 0.331777 0.408011 0.587785 0.982287
-0.475417 0.345411 0.535024 0.587785 0.968583
-0.495326 0.359876 0.654508 0.587785 0.951057
-0.516615 0.375342 0.7648 0.587785 0.929777
-0.539484 0.391958 0.864375 0.587785 0.904827
-0.564098 0.409841 0.951874 0.587785 0.876307
-0.590578 0.42908 1.02612 0.587785 0.844328
-0.618999 0.449729 1.08614 0.587785 0.809017
-0.649384 0.471805 1.13119 0.587785 0.770513
-0.681707 0.495289 1.16072 0.587785 0.728969
-0.715886 0.520121 1.17444 0.587785 0.684547
-0.751786 0.546204 1.17231 0.587785 0.637424
-0.789219 0.573401 1.15451 0.587785 0.587785
-0.827945 0.601537 1.12145 0.587785 0.535827
-0.867675 0.630403 1.0738 0.587785 0.481754
-0.908073 0.659753 1.01241 0.587785 0.42578
-0.948761 0.689315 0.93836 0.587785 0.368125
-0.989325 0.718786 0.85291 0.587785 0.309017
-1.02932 0.747843 0.757484 0.587785 0.24869
-1.06827 0.776143 0.653651 0.587785 0.187382
-1.10569 0.80333 0.543099 0.587785 0.125334
-1.14108 0.829041 0.427607 0.587785 0.0627908
-1.17393 0.852909 0.309018 0.587785 3.26795e-07
-1.20374 0.874571 0.189209 0.587785 -0.0627902
-1.23003 0.893672 0.0700628 0.587785 -0.125333
-1.25233 0.909872 -0.0465632 0.587785 -0.187381
-1.2702 0.92285 -0.158866 0.587785 -0.24869
-1.28322 0.932312 -0.265124 0.587785 -0.309017
-1.29103 0.937991 -0.363726 0.587785 -0.368124
-1.29333 0.939659 -0.453194 0.587785 -0.425779
-1.28984 0.937123 -0.532209 0.587785 -0.481753
-1.28036 0.930235 -0.59963 0.587785 -0.535826
-1.26475 0.918893 -0.654508 0.587785 -0.587785
-1.24293 0.903041 -0.696109 0.587785 -0.637424
-1.2149 0.882676 -0.723916 0.587785 -0.684547
-1.18072 0.857843 -0.737643 0.587785 -0.728968
-1.14053 0.828642 -0.737236 0.587785 -0.770513
-1.09453 0.79522 -0.722873 0.587785 -0.809017
-1.04299 0.757778 -0.694962 0.587785 -0.844328
-0.986262 0.716561 -0.654134 0.587785 -0.876306
-0.924741 0.671863 -0.601229 0.587785 -0.904827
-0.858889 0.624019 -0.537287 0.587785 -0.929776
-0.78922 0.573401 -0.463526 0.587785 -0.951056
-0.716295 0.520419 -0.381326 0.587785 -0.968583
-0.640716 0.465507 -0.292204 0.587785 -0.982287
-0.563116 0.409127 -0.197789 0.587785 -0.992115
-0.484155 0.351759 -0.0997967 0.587785 -0.998027
-0.404509 0.293893 -1.04123e-06 0.587785 -1
-0.324864 0.236027 0.0997946 0.587785 -0.998027
-0.245903 0.178659 0.197787 0.587785 -0.992115
-0.168303 0.122279 0.292202 0.587785 -0.982287
-0.0927238 0.0673677 0.381325 0.587785 -0.968583
-0.0197989 0.0143847 0.463525 0.587785 -0.951057
--0.0498702 -0.0362328 0.537285 0.587785 -0.929777
--0.115723 -0.0840773 0.601228 0.587785 -0.904827
--0.177244 -0.128775 0.654133 0.587785 -0.876307
--0.233974 -0.169992 0.694962 0.587785 -0.844328
--0.285509 -0.207435 0.722873 0.587785 -0.809017
--0.33151 -0.240856 0.737236 0.587785 -0.770514
--0.371703 -0.270058 0.737643 0.587785 -0.728969
--0.405881 -0.29489 0.723916 0.587785 -0.684548
--0.433912 -0.315255 0.69611 0.587785 -0.637425
--0.45573 -0.331107 0.654509 0.587785 -0.587786
--0.471342 -0.34245 0.599631 0.587785 -0.535828
--0.480822 -0.349338 0.532211 0.587785 -0.481754
--0.484313 -0.351874 0.453196 0.587785 -0.42578
--0.482018 -0.350206 0.363728 0.587785 -0.368125
--0.474201 -0.344527 0.265126 0.587785 -0.309018
--0.461178 -0.335066 0.158868 0.587785 -0.248691
--0.443315 -0.322087 0.0465656 0.587785 -0.187382
--0.421018 -0.305888 -0.0700603 0.587785 -0.125334
--0.394728 -0.286787 -0.189206 0.587785 -0.0627915
--0.364913 -0.265125 -0.309015 0.587785 -9.80385e-07
--0.332061 -0.241257 -0.427604 0.587785 0.0627895
--0.296673 -0.215546 -0.543097 0.587785 0.125332
--0.259253 -0.188359 -0.653649 0.587785 0.18738
--0.220302 -0.160059 -0.757482 0.587785 0.248689
--0.180309 -0.131002 -0.852908 0.587785 0.309016
--0.139745 -0.101531 -0.938358 0.587785 0.368124
--0.0990568 -0.0719689 -1.01241 0.587785 0.425778
--0.0586589 -0.0426182 -1.0738 0.587785 0.481753
--0.018929 -0.0137527 -1.12145 0.587785 0.535826
-0.0197973 0.0143836 -1.15451 0.587785 0.587784
-0.0572306 0.0415805 -1.17231 0.587785 0.637423
-0.0931308 0.0676635 -1.17444 0.587785 0.684546
-0.12731 0.0924959 -1.16072 0.587785 0.728968
-0.159632 0.11598 -1.13119 0.587785 0.770513
-0.190018 0.138056 -1.08615 0.587785 0.809016
-0.218438 0.158705 -1.02612 0.587785 0.844327
-0.244919 0.177944 -0.951875 0.587785 0.876306
-0.269533 0.195827 -0.864376 0.587785 0.904827
-0.292402 0.212443 -0.764802 0.587785 0.929776
-0.31369 0.227909 -0.654511 0.587785 0.951056
-0.333599 0.242374 -0.535027 0.587785 0.968583
-0.352364 0.256007 -0.408014 0.587785 0.982287
-0.370247 0.269 -0.275251 0.587785 0.992115
-0.387529 0.281556 -0.138605 0.587785 0.998027
-0.385257 0.318712 0 0.637424 1
-0.398065 0.329308 0.139193 0.637424 0.998027
-0.41121 0.340182 0.276443 0.637424 0.992115
-0.42502 0.351607 0.409834 0.637424 0.982287
-0.439808 0.363841 0.537513 0.637424 0.968583
-0.455869 0.377127 0.657711 0.637424 0.951057
-0.473464 0.391684 0.768775 0.637424 0.929777
-0.492825 0.4077 0.869189 0.637424 0.904827
-0.514138 0.425332 0.9576 0.637424 0.876307
-0.537549 0.444699 1.03284 0.637424 0.844328
-0.56315 0.465878 1.09394 0.637424 0.809017
-0.590985 0.488905 1.14013 0.637424 0.770513
-0.62104 0.513769 1.17091 0.637424 0.728969
-0.653244 0.54041 1.18595 0.637424 0.684547
-0.68747 0.568724 1.18522 0.637424 0.637424
-0.723535 0.59856 1.16888 0.637424 0.587785
-0.7612 0.629719 1.13734 0.637424 0.535827
-0.800174 0.661961 1.09125 0.637424 0.481754
-0.840115 0.695004 1.03146 0.637424 0.42578
-0.88064 0.728529 0.959028 0.637424 0.368125
-0.921322 0.762184 0.875195 0.637424 0.309017
-0.961703 0.79559 0.781369 0.637424 0.24869
-1.0013 0.828343 0.6791 0.637424 0.187382
-1.03959 0.860026 0.570055 0.637424 0.125334
-1.07607 0.890206 0.455994 0.637424 0.0627908
-1.11022 0.918452 0.338738 0.637424 3.26795e-07
-1.1415 0.94433 0.220146 0.637424 -0.0627902
-1.16941 0.96742 0.10208 0.637424 -0.125333
-1.19346 0.987314 -0.0136228 0.637424 -0.187381
-1.21318 1.00363 -0.125176 0.637424 -0.24869
-1.22815 1.01601 -0.230876 0.637424 -0.309017
-1.23798 1.02414 -0.329126 0.637424 -0.368124
-1.24233 1.02774 -0.418461 0.637424 -0.425779
-1.24092 1.02657 -0.497573 0.637424 -0.481753
-1.23352 1.02046 -0.565328 0.637424 -0.535826
-1.21999 1.00926 -0.620786 0.637424 -0.587785
-1.20023 0.992915 -0.663213 0.637424 -0.637424
-1.17422 0.971397 -0.692095 0.637424 -0.684547
-1.14201 0.944756 -0.707142 0.637424 -0.728968
-1.10374 0.913096 -0.708296 0.637424 -0.770513
-1.05961 0.876582 -0.695726 0.637424 -0.809017
-1.00987 0.835439 -0.66983 0.637424 -0.844328
-0.954881 0.789946 -0.631224 0.637424 -0.876306
-0.895036 0.740438 -0.580734 0.637424 -0.904827
-0.830801 0.687299 -0.51938 0.637424 -0.929776
-0.762696 0.630957 -0.448361 0.637424 -0.951056
-0.691287 0.571882 -0.369033 0.637424 -0.968583
-0.617183 0.510578 -0.282889 0.637424 -0.982287
-0.541028 0.447577 -0.191533 0.637424 -0.992115
-0.46349 0.383432 -0.0966551 0.637424 -0.998027
-0.385257 0.318713 -1.0085e-06 0.637424 -1
-0.307025 0.253993 0.0966531 0.637424 -0.998027
-0.229487 0.189848 0.191531 0.637424 -0.992115
-0.153332 0.126847 0.282887 0.637424 -0.982287
-0.0792283 0.0655433 0.369031 0.637424 -0.968583
-0.00781899 0.00646843 0.448359 0.637424 -0.951057
--0.0602868 -0.0498735 0.519379 0.637424 -0.929777
--0.124522 -0.103013 0.580733 0.637424 -0.904827
--0.184367 -0.152521 0.631223 0.637424 -0.876307
--0.239358 -0.198014 0.669829 0.637424 -0.844328
--0.289092 -0.239158 0.695725 0.637424 -0.809017
--0.333229 -0.275671 0.708296 0.637424 -0.770514
--0.3715 -0.307331 0.707142 0.637424 -0.728969
--0.403704 -0.333973 0.692095 0.637424 -0.684548
--0.429714 -0.35549 0.663214 0.637424 -0.637425
--0.449477 -0.371839 0.620787 0.637424 -0.587786
--0.46301 -0.383035 0.565329 0.637424 -0.535828
--0.470403 -0.389151 0.497575 0.637424 -0.481754
--0.471813 -0.390318 0.418463 0.637424 -0.42578
--0.467463 -0.386719 0.329128 0.637424 -0.368125
--0.457636 -0.378589 0.230879 0.637424 -0.309018
--0.442667 -0.366206 0.125179 0.637424 -0.248691
--0.422945 -0.34989 0.0136252 0.637424 -0.187382
--0.398897 -0.329996 -0.102077 0.637424 -0.125334
--0.370987 -0.306907 -0.220144 0.637424 -0.0627915
--0.339705 -0.281028 -0.338736 0.637424 -9.80385e-07
--0.305562 -0.252783 -0.455991 0.637424 0.0627895
--0.26908 -0.222602 -0.570053 0.637424 0.125332
--0.230783 -0.19092 -0.679097 0.637424 0.18738
--0.191191 -0.158167 -0.781367 0.637424 0.248689
--0.15081 -0.124761 -0.875193 0.637424 0.309016
--0.110128 -0.0911055 -0.959026 0.637424 0.368124
--0.069603 -0.0575806 -1.03146 0.637424 0.425778
--0.0296611 -0.0245377 -1.09125 0.637424 0.481753
-0.00931271 0.00770414 -1.13734 0.637424 0.535826
-0.0469778 0.0388634 -1.16888 0.637424 0.587784
-0.0830428 0.068699 -1.18522 0.637424 0.637423
-0.117269 0.0970134 -1.18595 0.637424 0.684546
-0.149473 0.123655 -1.17091 0.637424 0.728968
-0.179527 0.148518 -1.14014 0.637424 0.770513
-0.207362 0.171545 -1.09394 0.637424 0.809016
-0.232964 0.192725 -1.03284 0.637424 0.844327
-0.256375 0.212092 -0.957602 0.637424 0.876306
-0.277688 0.229724 -0.869191 0.637424 0.904827
-0.297048 0.24574 -0.768777 0.637424 0.929776
-0.314644 0.260296 -0.657714 0.637424 0.951056
-0.330705 0.273582 -0.537516 0.637424 0.968583
-0.345493 0.285817 -0.409837 0.637424 0.982287
-0.359303 0.297241 -0.276445 0.637424 0.992115
-0.372448 0.308116 -0.139196 0.637424 0.998027
-0.364484 0.342273 0 0.684547 1
-0.373409 0.350654 0.139647 0.684547 0.998027
-0.382696 0.359376 0.277364 0.684547 0.992115
-0.392701 0.36877 0.411253 0.684547 0.982287
-0.403762 0.379157 0.539472 0.684547 0.968583
-0.416196 0.390834 0.660266 0.684547 0.951057
-0.430292 0.404071 0.771991 0.684547 0.929777
-0.4463 0.419103 0.873145 0.684547 0.904827
-0.46443 0.436129 0.962381 0.684547 0.876307
-0.484844 0.455299 1.03854 0.684547 0.844328
-0.507655 0.47672 1.10065 0.684547 0.809017
-0.532918 0.500443 1.14796 0.684547 0.770513
-0.560634 0.52647 1.17994 0.684547 0.728969
-0.590741 0.554743 1.19629 0.684547 0.684547
-0.623123 0.585151 1.19695 0.684547 0.637424
-0.657601 0.617528 1.18209 0.684547 0.587785
-0.69394 0.651653 1.1521 0.684547 0.535827
-0.731849 0.687252 1.10763 0.684547 0.481754
-0.770988 0.724006 1.04949 0.684547 0.42578
-0.810967 0.761549 0.97875 0.684547 0.368125
-0.851356 0.799477 0.896616 0.684547 0.309017
-0.891689 0.837352 0.804483 0.684547 0.24869
-0.93147 0.874708 0.703878 0.684547 0.187382
-0.970181 0.911061 0.596448 0.684547 0.125334
-1.00729 0.945909 0.483931 0.684547 0.0627908
-1.04226 0.978749 0.368125 0.684547 3.26795e-07
-1.07456 1.00908 0.250867 0.684547 -0.0627902
-1.10365 1.0364 0.133996 0.684547 -0.125333
-1.12904 1.06024 0.0193311 0.684547 -0.187381
-1.15025 1.08015 -0.0913634 0.684547 -0.24869
-1.16682 1.09572 -0.196401 0.684547 -0.309017
-1.17837 1.10656 -0.294202 0.684547 -0.368124
-1.18452 1.11234 -0.383316 0.684547 -0.425779
-1.185 1.11279 -0.462446 0.684547 -0.481753
-1.17956 1.10768 -0.530469 0.684547 -0.535826
-1.16804 1.09686 -0.586451 0.684547 -0.587785
-1.15032 1.08022 -0.629663 0.684547 -0.637424
-1.12639 1.05775 -0.65959 0.684547 -0.684547
-1.09628 1.02947 -0.675943 0.684547 -0.728968
-1.06011 0.995514 -0.678656 0.684547 -0.770513
-1.01809 0.95605 -0.667892 0.684547 -0.809017
-0.970468 0.91133 -0.644036 0.684547 -0.844328
-0.917583 0.861668 -0.607691 0.684547 -0.876306
-0.859837 0.80744 -0.559666 0.684547 -0.904827
-0.797691 0.749081 -0.500961 0.684547 -0.929776
-0.731663 0.687077 -0.432753 0.684547 -0.951056
-0.662321 0.62196 -0.356375 0.684547 -0.968583
-0.590275 0.554305 -0.273295 0.684547 -0.982287
-0.516169 0.484715 -0.185089 0.684547 -0.992115
-0.440677 0.413823 -0.0934181 0.684547 -0.998027
-0.364485 0.342274 -9.74782e-07 0.684547 -1
-0.288294 0.270726 0.0934162 0.684547 -0.998027
-0.212801 0.199833 0.185087 0.684547 -0.992115
-0.138696 0.130244 0.273293 0.684547 -0.982287
-0.0666494 0.062588 0.356374 0.684547 -0.968583
--0.00269268 -0.00252859 0.432751 0.684547 -0.951057
--0.0687207 -0.064533 0.500959 0.684547 -0.929777
--0.130867 -0.122892 0.559665 0.684547 -0.904827
--0.188613 -0.17712 0.60769 0.684547 -0.876307
--0.241498 -0.226782 0.644036 0.684547 -0.844328
--0.28912 -0.271502 0.667892 0.684547 -0.809017
--0.331145 -0.310966 0.678656 0.684547 -0.770514
--0.367308 -0.344925 0.675943 0.684547 -0.728969
--0.397416 -0.373198 0.659591 0.684547 -0.684548
--0.42135 -0.395674 0.629663 0.684547 -0.637425
--0.439067 -0.412311 0.586452 0.684547 -0.587786
--0.450594 -0.423136 0.53047 0.684547 -0.535828
--0.456033 -0.428244 0.462447 0.684547 -0.481754
--0.455556 -0.427795 0.383317 0.684547 -0.42578
--0.449397 -0.422012 0.294204 0.684547 -0.368125
--0.437854 -0.411172 0.196403 0.684547 -0.309018
--0.421279 -0.395608 0.0913657 0.684547 -0.248691
--0.400075 -0.375696 -0.0193287 0.684547 -0.187382
--0.374686 -0.351853 -0.133994 0.684547 -0.125334
--0.34559 -0.324531 -0.250864 0.684547 -0.0627915
--0.313294 -0.294203 -0.368123 0.684547 -9.80385e-07
--0.278323 -0.261363 -0.483928 0.684547 0.0627895
--0.241214 -0.226515 -0.596446 0.684547 0.125332
--0.202502 -0.190162 -0.703876 0.684547 0.18738
--0.162721 -0.152806 -0.804481 0.684547 0.248689
--0.122389 -0.114931 -0.896615 0.684547 0.309016
--0.0819993 -0.0770024 -0.978748 0.684547 0.368124
--0.04202 -0.0394594 -1.04949 0.684547 0.425778
--0.00288125 -0.00270568 -1.10763 0.684547 0.481753
-0.0350283 0.0328937 -1.1521 0.684547 0.535826
-0.071367 0.0670181 -1.18209 0.684547 0.587784
-0.105845 0.0993949 -1.19695 0.684547 0.637423
-0.138227 0.129803 -1.19629 0.684547 0.684546
-0.168335 0.158077 -1.17994 0.684547 0.728968
-0.19605 0.184103 -1.14796 0.684547 0.770513
-0.221313 0.207827 -1.10065 0.684547 0.809016
-0.244124 0.229247 -1.03854 0.684547 0.844327
-0.264538 0.248418 -0.962383 0.684547 0.876306
-0.282668 0.265443 -0.873147 0.684547 0.904827
-0.298676 0.280476 -0.771994 0.684547 0.929776
-0.312772 0.293712 -0.660268 0.684547 0.951056
-0.325207 0.305389 -0.539475 0.684547 0.968583
-0.336268 0.315776 -0.411256 0.684547 0.982287
-0.346272 0.325171 -0.277367 0.684547 0.992115
-0.355559 0.333892 -0.139649 0.684547 0.998027
-0.342274 0.364484 0 0.728969 1
-0.347648 0.370207 0.139962 0.728969 0.998027
-0.353403 0.376336 0.278012 0.728969 0.992115
-0.359915 0.38327 0.412266 0.728969 0.982287
-0.367539 0.39139 0.540898 0.728969 0.968583
-0.376613 0.401052 0.662168 0.728969 0.951057
-0.387441 0.412583 0.774446 0.728969 0.929777
-0.400291 0.426267 0.876239 0.728969 0.904827
-0.415389 0.442344 0.966213 0.728969 0.876307
-0.432913 0.461005 1.04321 0.728969 0.844328
-0.452987 0.482382 1.10627 0.728969 0.809017
-0.475682 0.50655 1.15465 0.728969 0.770513
-0.501008 0.533519 1.18781 0.728969 0.728969
-0.528915 0.563238 1.20545 0.728969 0.684547
-0.559295 0.595588 1.20751 0.728969 0.637424
-0.591975 0.630389 1.19414 0.728969 0.587785
-0.626727 0.667397 1.16573 0.728969 0.535827
-0.663266 0.706306 1.12291 0.728969 0.481754
-0.701251 0.746756 1.06649 0.728969 0.42578
-0.740297 0.788336 0.997505 0.728969 0.368125
-0.779972 0.830586 0.917153 0.728969 0.309017
-0.81981 0.873008 0.826803 0.728969 0.24869
-0.859311 0.915073 0.727962 0.728969 0.187382
-0.897955 0.956225 0.622253 0.728969 0.125334
-0.935206 0.995893 0.51139 0.728969 0.0627908
-0.97052 1.0335 0.397148 0.728969 3.26795e-07
-1.00335 1.06846 0.28134 0.728969 -0.0627902
-1.03318 1.10022 0.165781 0.728969 -0.125333
-1.05947 1.12822 0.0522659 0.728969 -0.187381
-1.08176 1.15195 -0.0574603 0.728969 -0.24869
-1.09957 1.17092 -0.161732 0.728969 -0.309017
-1.11251 1.1847 -0.258987 0.728969 -0.368124
-1.1202 1.1929 -0.347791 0.728969 -0.425779
-1.12235 1.19519 -0.426862 0.728969 -0.481753
-1.11871 1.19131 -0.495086 0.728969 -0.535826
-1.1091 1.18107 -0.551537 0.728969 -0.587785
-1.0934 1.16435 -0.595491 0.728969 -0.637424
-1.07158 1.14111 -0.626435 0.728969 -0.684547
-1.04367 1.11139 -0.644077 0.728969 -0.728968
-1.00978 1.07531 -0.648347 0.728969 -0.770513
-0.970108 1.03306 -0.639399 0.728969 -0.809017
-0.924897 0.984915 -0.617607 0.728969 -0.844328
-0.874479 0.931225 -0.583559 0.728969 -0.876306
-0.819245 0.872407 -0.538045 0.728969 -0.904827
-0.759652 0.808947 -0.482047 0.728969 -0.929776
-0.696212 0.74139 -0.416718 0.728969 -0.951056
-0.629485 0.670334 -0.343366 0.728969 -0.968583
-0.560077 0.596421 -0.263431 0.728969 -0.982287
-0.488625 0.520333 -0.178461 0.728969 -0.992115
-0.415796 0.442778 -0.090089 0.728969 -0.998027
-0.342274 0.364485 -9.40098e-07 0.728969 -1
-0.268753 0.286192 0.0900871 0.728969 -0.998027
-0.195924 0.208638 0.17846 0.728969 -0.992115
-0.124472 0.132549 0.263429 0.728969 -0.982287
-0.0550632 0.0586363 0.343364 0.728969 -0.968583
--0.0116635 -0.0124204 0.416716 0.728969 -0.951057
--0.075104 -0.0799776 0.482046 0.728969 -0.929777
--0.134697 -0.143437 0.538044 0.728969 -0.904827
--0.18993 -0.202255 0.583558 0.728969 -0.876307
--0.240349 -0.255946 0.617606 0.728969 -0.844328
--0.28556 -0.304091 0.639399 0.728969 -0.809017
--0.325236 -0.346341 0.648347 0.728969 -0.770514
--0.35912 -0.382424 0.644077 0.728969 -0.728969
--0.387028 -0.412143 0.626436 0.728969 -0.684548
--0.408849 -0.43538 0.595492 0.728969 -0.637425
--0.424549 -0.452098 0.551538 0.728969 -0.587786
--0.434164 -0.462338 0.495087 0.728969 -0.535828
--0.437807 -0.466217 0.426864 0.728969 -0.481754
--0.435657 -0.463928 0.347793 0.728969 -0.42578
--0.427961 -0.455732 0.258989 0.728969 -0.368125
--0.415024 -0.441955 0.161734 0.728969 -0.309018
--0.397208 -0.422984 0.0574626 0.728969 -0.248691
--0.374926 -0.399255 -0.0522635 0.728969 -0.187382
--0.34863 -0.371253 -0.165778 0.728969 -0.125334
--0.318807 -0.339495 -0.281337 0.728969 -0.0627915
--0.285973 -0.304531 -0.397146 0.728969 -9.80385e-07
--0.25066 -0.266925 -0.511388 0.728969 0.0627895
--0.213409 -0.227257 -0.622251 0.728969 0.125332
--0.174765 -0.186105 -0.72796 0.728969 0.18738
--0.135263 -0.144041 -0.826801 0.728969 0.248689
--0.0954258 -0.101618 -0.917151 0.728969 0.309016
--0.0557504 -0.0593681 -0.997504 0.728969 0.368124
--0.0167047 -0.0177887 -1.06649 0.728969 0.425778
-0.0212809 0.0226618 -1.12291 0.728969 0.481753
-0.0578191 0.0615711 -1.16573 0.728969 0.535826
-0.0925713 0.0985784 -1.19414 0.728969 0.587784
-0.125252 0.13338 -1.20751 0.728969 0.637423
-0.155631 0.16573 -1.20545 0.728969 0.684546
-0.183539 0.195449 -1.18781 0.728969 0.728968
-0.208865 0.222418 -1.15465 0.728969 0.770513
-0.23156 0.246586 -1.10628 0.728969 0.809016
-0.251634 0.267963 -1.04321 0.728969 0.844327
-0.269158 0.286624 -0.966215 0.728969 0.876306
-0.284256 0.302701 -0.876241 0.728969 0.904827
-0.297106 0.316385 -0.774448 0.728969 0.929776
-0.307934 0.327916 -0.66217 0.728969 0.951056
-0.317008 0.337579 -0.540901 0.728969 0.968583
-0.324633 0.345698 -0.412269 0.728969 0.982287
-0.331144 0.352632 -0.278015 0.728969 0.992115
-0.336899 0.358761 -0.139965 0.728969 0.998027
-0.318712 0.385257 0 0.770513 1
-0.320911 0.387915 0.14014 0.770513 0.998027
-0.323504 0.391049 0.278386 0.770513 0.992115
-0.326876 0.395125 0.412872 0.770513 0.982287
-0.331397 0.40059 0.541791 0.770513 0.968583
-0.337414 0.407864 0.663417 0.770513 0.951057
-0.345244 0.417328 0.776136 0.770513 0.929777
-0.355165 0.429321 0.878469 0.770513 0.904827
-0.367415 0.444129 0.969091 0.770513 0.876307
-0.382183 0.46198 1.04686 0.770513 0.844328
-0.399604 0.483038 1.11081 0.770513 0.809017
-0.419757 0.507399 1.1602 0.770513 0.770513
-0.442664 0.535089 1.19451 0.770513 0.728969
-0.468285 0.566059 1.21342 0.770513 0.684547
-0.496517 0.600186 1.21687 0.770513 0.637424
-0.527201 0.637276 1.205 0.770513 0.587785
-0.560114 0.677061 1.17821 0.770513 0.535827
-0.594977 0.719204 1.13708 0.770513 0.481754
-0.63146 0.763304 1.08244 0.770513 0.42578
-0.669181 0.808901 1.01528 0.770513 0.368125
-0.707716 0.855481 0.936784 0.770513 0.309017
-0.746602 0.902486 0.848307 0.770513 0.24869
-0.785345 0.949318 0.751327 0.770513 0.187382
-0.823428 0.995353 0.647444 0.770513 0.125334
-0.860317 1.03994 0.538344 0.770513 0.0627908
-0.895471 1.08244 0.42578 0.770513 3.26795e-07
-0.928348 1.12218 0.311535 0.770513 -0.0627902
-0.958418 1.15853 0.197401 0.770513 -0.125333
-0.985164 1.19086 0.0851491 0.770513 -0.187381
-1.0081 1.21858 -0.0235006 0.770513 -0.24869
-1.02677 1.24115 -0.126903 0.770513 -0.309017
-1.04076 1.25806 -0.223517 0.770513 -0.368124
-1.0497 1.26887 -0.311924 0.770513 -0.425779
-1.05328 1.2732 -0.390857 0.770513 -0.481753
-1.05126 1.27075 -0.459214 0.770513 -0.535826
-1.04344 1.2613 -0.516079 0.770513 -0.587785
-1.02971 1.2447 -0.560731 0.770513 -0.637424
-1.01002 1.2209 -0.592662 0.770513 -0.684547
-0.984397 1.18993 -0.611576 0.770513 -0.728968
-0.952947 1.15191 -0.617398 0.770513 -0.770513
-0.915841 1.10706 -0.610275 0.770513 -0.809017
-0.873327 1.05567 -0.590568 0.770513 -0.844328
-0.82572 0.998124 -0.55885 0.770513 -0.876306
-0.773403 0.934884 -0.515894 0.770513 -0.904827
-0.716819 0.866485 -0.462658 0.770513 -0.929776
-0.656467 0.793532 -0.400272 0.770513 -0.951056
-0.592896 0.716687 -0.330017 0.770513 -0.968583
-0.526696 0.636666 -0.253307 0.770513 -0.982287
-0.458495 0.554225 -0.171658 0.770513 -0.992115
-0.388943 0.470152 -0.0866709 0.770513 -0.998027
-0.318713 0.385257 -9.04487e-07 0.770513 -1
-0.248482 0.300363 0.0866691 0.770513 -0.998027
-0.178931 0.21629 0.171656 0.770513 -0.992115
-0.110729 0.133849 0.253305 0.770513 -0.982287
-0.0445299 0.0538274 0.330016 0.770513 -0.968583
--0.0190415 -0.0230172 0.40027 0.770513 -0.951057
--0.0793937 -0.0959704 0.462656 0.770513 -0.929777
--0.135978 -0.164369 0.515893 0.770513 -0.904827
--0.188295 -0.22761 0.55885 0.770513 -0.876307
--0.235902 -0.285156 0.590568 0.770513 -0.844328
--0.278416 -0.336547 0.610275 0.770513 -0.809017
--0.315522 -0.3814 0.617398 0.770513 -0.770514
--0.346972 -0.419417 0.611576 0.770513 -0.728969
--0.372593 -0.450387 0.592662 0.770513 -0.684548
--0.392283 -0.474188 0.560732 0.770513 -0.637425
--0.406014 -0.490786 0.51608 0.770513 -0.587786
--0.413833 -0.500238 0.459216 0.770513 -0.535828
--0.415858 -0.502685 0.390859 0.770513 -0.481754
--0.412274 -0.498353 0.311926 0.770513 -0.42578
--0.403332 -0.487545 0.223519 0.770513 -0.368125
--0.389344 -0.470636 0.126905 0.770513 -0.309018
--0.370676 -0.44807 0.0235028 0.770513 -0.248691
--0.347741 -0.420346 -0.0851468 0.770513 -0.187382
--0.320994 -0.388015 -0.197399 0.770513 -0.125334
--0.290925 -0.351667 -0.311532 0.770513 -0.0627915
--0.258047 -0.311925 -0.425777 0.770513 -9.80385e-07
--0.222893 -0.269432 -0.538342 0.770513 0.0627895
--0.186004 -0.224841 -0.647441 0.770513 0.125332
--0.147921 -0.178806 -0.751325 0.770513 0.18738
--0.109178 -0.131974 -0.848305 0.770513 0.248689
--0.0702926 -0.0849691 -0.936783 0.770513 0.309016
--0.0317578 -0.0383885 -1.01528 0.770513 0.368124
-0.00596342 0.00720853 -1.08244 0.770513 0.425778
-0.0424463 0.0513087 -1.13708 0.770513 0.481753
-0.0773099 0.0934516 -1.17821 0.770513 0.535826
-0.110223 0.133236 -1.205 0.770513 0.587784
-0.140906 0.170326 -1.21687 0.770513 0.637423
-0.169139 0.204454 -1.21342 0.770513 0.684546
-0.19476 0.235424 -1.19451 0.770513 0.728968
-0.217667 0.263114 -1.1602 0.770513 0.770513
-0.23782 0.287475 -1.11081 0.770513 0.809016
-0.255241 0.308533 -1.04686 0.770513 0.844327
-0.270008 0.326384 -0.969093 0.770513 0.876306
-0.282259 0.341192 -0.878471 0.770513 0.904827
-0.29218 0.353185 -0.776139 0.770513 0.929776
-0.30001 0.362649 -0.663419 0.770513 0.951056
-0.306027 0.369923 -0.541793 0.770513 0.968583
-0.310548 0.375388 -0.412875 0.770513 0.982287
-0.31392 0.379464 -0.278388 0.770513 0.992115
-0.316513 0.382598 -0.140143 0.770513 0.998027
-0.293893 0.404508 0 0.809017 1
-0.293332 0.403737 0.140179 0.809017 0.998027
-0.29317 0.403513 0.278484 0.809017 0.992115
-0.293795 0.404373 0.413071 0.809017 0.982287
-0.295581 0.406833 0.542148 0.809017 0.968583
-0.298881 0.411375 0.664011 0.809017 0.951057
-0.304016 0.418443 0.777061 0.809017 0.929777
-0.311271 0.428428 0.879832 0.809017 0.904827
-0.320889 0.441666 0.971013 0.809017 0.876307
-0.333064 0.458423 1.04947 0.809017 0.844328
-0.34794 0.478897 1.11425 0.809017 0.809017
-0.365602 0.503208 1.16461 0.809017 0.770513
-0.386082 0.531396 1.20003 0.809017 0.728969
-0.409346 0.563416 1.22019 0.809017 0.684547
-0.435304 0.599144 1.22503 0.809017 0.637424
-0.463803 0.63837 1.21468 0.809017 0.587785
-0.494632 0.680803 1.18952 0.809017 0.535827
-0.527524 0.726075 1.15014 0.809017 0.481754
-0.562159 0.773745 1.09732 0.809017 0.42578
-0.598165 0.823303 1.03205 0.809017 0.368125
-0.635131 0.874182 0.955491 0.809017 0.309017
-0.672604 0.92576 0.868974 0.809017 0.24869
-0.710103 0.977373 0.773951 0.809017 0.187382
-0.747121 1.02832 0.671995 0.809017 0.125334
-0.783135 1.07789 0.564768 0.809017 0.0627908
-0.817613 1.12535 0.453991 0.809017 3.26795e-07
-0.850025 1.16996 0.341422 0.809017 -0.0627902
-0.879846 1.211 0.228827 0.809017 -0.125333
-0.90657 1.24779 0.117948 0.809017 -0.187381
-0.929715 1.27964 0.0104824 0.809017 -0.24869
-0.94883 1.30595 -0.0919494 0.809017 -0.309017
-0.963506 1.32615 -0.187826 0.809017 -0.368124
-0.97338 1.33974 -0.275749 0.809017 -0.425779
-0.978141 1.34629 -0.354466 0.809017 -0.481753
-0.977537 1.34546 -0.42289 0.809017 -0.535826
-0.97138 1.33699 -0.480111 0.809017 -0.587785
-0.959549 1.32071 -0.525418 0.809017 -0.637424
-0.941991 1.29654 -0.558303 0.809017 -0.684547
-0.918727 1.26452 -0.57847 0.809017 -0.728968
-0.889847 1.22477 -0.58584 0.809017 -0.770513
-0.855517 1.17752 -0.580549 0.809017 -0.809017
-0.815969 1.12308 -0.562947 0.809017 -0.844328
-0.771505 1.06189 -0.53359 0.809017 -0.876306
-0.722493 0.994426 -0.493233 0.809017 -0.904827
-0.669358 0.921292 -0.442811 0.809017 -0.929776
-0.612582 0.843146 -0.38343 0.809017 -0.951056
-0.552693 0.760716 -0.316344 0.809017 -0.968583
-0.490262 0.674788 -0.242933 0.809017 -0.982287
-0.425896 0.586195 -0.164685 0.809017 -0.992115
-0.360223 0.495804 -0.0831673 0.809017 -0.998027
-0.293893 0.404509 -8.67982e-07 0.809017 -1
-0.227564 0.313214 0.0831656 0.809017 -0.998027
-0.161891 0.222824 0.164683 0.809017 -0.992115
-0.0975243 0.134231 0.242931 0.809017 -0.982287
-0.0350939 0.0483026 0.316342 0.809017 -0.968583
--0.0247951 -0.0341275 0.383429 0.809017 -0.951057
--0.0815718 -0.112274 0.44281 0.809017 -0.929777
--0.134707 -0.185408 0.493232 0.809017 -0.904827
--0.183719 -0.252868 0.53359 0.809017 -0.876307
--0.228182 -0.314066 0.562946 0.809017 -0.844328
--0.267731 -0.368499 0.580549 0.809017 -0.809017
--0.302061 -0.415752 0.58584 0.809017 -0.770514
--0.330941 -0.455501 0.578471 0.809017 -0.728969
--0.354205 -0.487522 0.558304 0.809017 -0.684548
--0.371763 -0.511688 0.525419 0.809017 -0.637425
--0.383595 -0.527972 0.480112 0.809017 -0.587786
--0.389751 -0.536447 0.422891 0.809017 -0.535828
--0.390355 -0.537278 0.354468 0.809017 -0.481754
--0.385595 -0.530725 0.275751 0.809017 -0.42578
--0.375721 -0.517136 0.187828 0.809017 -0.368125
--0.361045 -0.496936 0.0919514 0.809017 -0.309018
--0.34193 -0.470626 -0.0104802 0.809017 -0.248691
--0.318785 -0.43877 -0.117946 0.809017 -0.187382
--0.292061 -0.401988 -0.228825 0.809017 -0.125334
--0.26224 -0.360942 -0.34142 0.809017 -0.0627915
--0.229828 -0.316332 -0.453989 0.809017 -9.80385e-07
--0.19535 -0.268876 -0.564766 0.809017 0.0627895
--0.159336 -0.219307 -0.671993 0.809017 0.125332
--0.122318 -0.168357 -0.773949 0.809017 0.18738
--0.0848195 -0.116744 -0.868972 0.809017 0.248689
--0.047346 -0.0651661 -0.95549 0.809017 0.309016
--0.0103804 -0.0142874 -1.03204 0.809017 0.368124
-0.0256261 0.0352713 -1.09731 0.809017 0.425778
-0.0602602 0.082941 -1.15014 0.809017 0.481753
-0.0931523 0.128213 -1.18952 0.809017 0.535826
-0.123982 0.170646 -1.21468 0.809017 0.587784
-0.152481 0.209872 -1.22503 0.809017 0.637423
-0.178439 0.2456 -1.22019 0.809017 0.684546
-0.201703 0.277621 -1.20003 0.809017 0.728968
-0.222183 0.305808 -1.16461 0.809017 0.770513
-0.239846 0.330119 -1.11425 0.809017 0.809016
-0.254721 0.350593 -1.04947 0.809017 0.844327
-0.266896 0.367351 -0.971015 0.809017 0.876306
-0.276514 0.380588 -0.879834 0.809017 0.904827
-0.283769 0.390574 -0.777063 0.809017 0.929776
-0.288904 0.397642 -0.664014 0.809017 0.951056
-0.292204 0.402184 -0.542151 0.809017 0.968583
-0.293991 0.404644 -0.413073 0.809017 0.982287
-0.294616 0.405504 -0.278487 0.809017 0.992115
-0.294453 0.40528 -0.140182 0.809017 0.998027
-0.267913 0.422164 0 0.844328 1
-0.265044 0.417642 0.14008 0.844328 0.998027
-0.262568 0.41374 0.278308 0.844328 0.992115
-0.260872 0.411068 0.412862 0.844328 0.982287
-0.260327 0.41021 0.541971 0.844328 0.968583
-0.261283 0.411716 0.66395 0.844328 0.951057
-0.264059 0.416091 0.777218 0.844328 0.929777
-0.26894 0.423781 0.880326 0.844328 0.904827
-0.276168 0.435172 0.971977 0.844328 0.876307
-0.285941 0.450571 1.05104 0.844328 0.844328
-0.298405 0.470211 1.11658 0.844328 0.809017
-0.313651 0.494234 1.16787 0.844328 0.770513
-0.331715 0.522698 1.20436 0.844328 0.728969
-0.352573 0.555565 1.22576 0.844328 0.684547
-0.376143 0.592706 1.23198 0.844328 0.637424
-0.402284 0.633898 1.22316 0.844328 0.587785
-0.430798 0.678828 1.19966 0.844328 0.535827
-0.46143 0.727097 1.16205 0.844328 0.481754
-0.493876 0.778224 1.11111 0.844328 0.42578
-0.527782 0.831651 1.0478 0.844328 0.368125
-0.562752 0.886755 0.973255 0.844328 0.309017
-0.598352 0.942852 0.888783 0.844328 0.24869
-0.634119 0.999211 0.795811 0.844328 0.187382
-0.669564 1.05506 0.695884 0.844328 0.125334
-0.704182 1.10961 0.590634 0.844328 0.0627908
-0.737462 1.16205 0.481754 0.844328 3.26795e-07
-0.768889 1.21157 0.370973 0.844328 -0.0627902
-0.797956 1.25738 0.260027 0.844328 -0.125333
-0.824172 1.29869 0.150631 0.844328 -0.187381
-0.847069 1.33477 0.044455 0.844328 -0.24869
-0.86621 1.36493 -0.0569047 0.844328 -0.309017
-0.881195 1.38854 -0.151949 0.844328 -0.368124
-0.891672 1.40505 -0.239302 0.844328 -0.425779
-0.897334 1.41397 -0.317726 0.844328 -0.481753
-0.897936 1.41492 -0.386148 0.844328 -0.535826
-0.893289 1.4076 -0.44367 0.844328 -0.587785
-0.883271 1.39181 -0.489587 0.844328 -0.637424
-0.867827 1.36748 -0.523394 0.844328 -0.684547
-0.846969 1.33461 -0.544794 0.844328 -0.728968
-0.82078 1.29334 -0.553704 0.844328 -0.770513
-0.78941 1.24391 -0.55025 0.844328 -0.809017
-0.75308 1.18666 -0.53477 0.844328 -0.844328
-0.712073 1.12205 -0.507804 0.844328 -0.876306
-0.666736 1.05061 -0.470086 0.844328 -0.904827
-0.617473 0.972981 -0.422528 0.844328 -0.929776
-0.564741 0.88989 -0.366211 0.844328 -0.951056
-0.509044 0.802125 -0.302357 0.844328 -0.968583
-0.450925 0.710544 -0.232319 0.844328 -0.982287
-0.39096 0.616054 -0.15755 0.844328 -0.992115
-0.32975 0.519603 -0.0795816 0.844328 -0.998027
-0.267914 0.422165 -8.30621e-07 0.844328 -1
-0.206078 0.324727 0.07958 0.844328 -0.998027
-0.144868 0.228276 0.157548 0.844328 -0.992115
-0.0849031 0.133786 0.232318 0.844328 -0.982287
-0.0267839 0.0422046 0.302356 0.844328 -0.968583
--0.0289133 -0.0455601 0.366209 0.844328 -0.951057
--0.081645 -0.128652 0.422527 0.844328 -0.929777
--0.130908 -0.206277 0.470085 0.844328 -0.904827
--0.176245 -0.277717 0.507803 0.844328 -0.876307
--0.217252 -0.342334 0.534769 0.844328 -0.844328
--0.253582 -0.399582 0.550249 0.844328 -0.809017
--0.284952 -0.449012 0.553704 0.844328 -0.770514
--0.311142 -0.490281 0.544795 0.844328 -0.728969
--0.332 -0.523148 0.523395 0.844328 -0.684548
--0.347444 -0.547484 0.489588 0.844328 -0.637425
--0.357462 -0.563269 0.443671 0.844328 -0.587786
--0.362109 -0.570592 0.386149 0.844328 -0.535828
--0.361507 -0.569644 0.317727 0.844328 -0.481754
--0.355845 -0.560721 0.239303 0.844328 -0.42578
--0.345369 -0.544214 0.151951 0.844328 -0.368125
--0.330383 -0.5206 0.0569067 0.844328 -0.309018
--0.311242 -0.490439 -0.0444529 0.844328 -0.248691
--0.288345 -0.454359 -0.150629 0.844328 -0.187382
--0.262129 -0.413049 -0.260025 0.844328 -0.125334
--0.233062 -0.367247 -0.370971 0.844328 -0.0627915
--0.201636 -0.317727 -0.481752 0.844328 -9.80385e-07
--0.168356 -0.265287 -0.590632 0.844328 0.0627895
--0.133737 -0.210736 -0.695882 0.844328 0.125332
--0.0982925 -0.154884 -0.795809 0.844328 0.18738
--0.0625259 -0.098525 -0.888781 0.844328 0.248689
--0.0269257 -0.042428 -0.973254 0.844328 0.309016
-0.00804413 0.0126755 -1.0478 0.844328 0.368124
-0.0419501 0.0661028 -1.11111 0.844328 0.425778
-0.0743961 0.117229 -1.16205 0.844328 0.481753
-0.105029 0.165499 -1.19966 0.844328 0.535826
-0.133543 0.210429 -1.22316 0.844328 0.587784
-0.159684 0.251621 -1.23198 0.844328 0.637423
-0.183254 0.288762 -1.22576 0.844328 0.684546
-0.204112 0.321629 -1.20436 0.844328 0.728968
-0.222176 0.350093 -1.16787 0.844328 0.770513
-0.237422 0.374117 -1.11659 0.844328 0.809016
-0.249885 0.393756 -1.05104 0.844328 0.844327
-0.259658 0.409156 -0.971978 0.844328 0.876306
-0.266887 0.420546 -0.880329 0.844328 0.904827
-0.271768 0.428237 -0.777221 0.844328 0.929776
-0.274544 0.432612 -0.663953 0.844328 0.951056
-0.2755 0.434118 -0.541974 0.844328 0.968583
-0.274955 0.43326 -0.412864 0.844328 0.982287
-0.273259 0.430588 -0.278311 0.844328 0.992115
-0.270783 0.426686 -0.140083 0.844328 0.998027
-0.240877 0.438153 0 0.876307 1
-0.236178 0.429606 0.139843 0.876307 0.998027
-0.231861 0.421754 0.277858 0.876307 0.992115
-0.228301 0.415279 0.412245 0.876307 0.982287
-0.225858 0.410835 0.541259 0.876307 0.968583
-0.224872 0.40904 0.663234 0.876307 0.951057
-0.225652 0.41046 0.776609 0.876307 0.929777
-0.228478 0.4156 0.879952 0.876307 0.904827
-0.233587 0.424893 0.971981 0.876307 0.876307
-0.241173 0.438692 1.05158 0.876307 0.844328
-0.251381 0.457261 1.11782 0.876307 0.809017
-0.264306 0.480771 1.16997 0.876307 0.770513
-0.279986 0.509293 1.20751 0.876307 0.728969
-0.298407 0.542799 1.23012 0.876307 0.684547
-0.319494 0.581156 1.23772 0.876307 0.637424
-0.343118 0.62413 1.23044 0.876307 0.587785
-0.369098 0.671386 1.20862 0.876307 0.535827
-0.397195 0.722494 1.17283 0.876307 0.481754
-0.427123 0.776933 1.12381 0.876307 0.42578
-0.45855 0.834099 1.06251 0.876307 0.368125
-0.491103 0.893313 0.990059 0.876307 0.309017
-0.524373 0.953831 0.907715 0.876307 0.24869
-0.557922 1.01486 0.816886 0.876307 0.187382
-0.591286 1.07554 0.719086 0.876307 0.125334
-0.623989 1.13503 0.615917 0.876307 0.0627908
-0.655543 1.19243 0.509042 0.876307 3.26795e-07
-0.68546 1.24685 0.400158 0.876307 -0.0627902
-0.71326 1.29741 0.29097 0.876307 -0.125333
-0.738474 1.34328 0.183165 0.876307 -0.187381
-0.760657 1.38363 0.0783838 0.876307 -0.24869
-0.779392 1.41771 -0.0218038 0.876307 -0.309017
-0.794297 1.44482 -0.115923 0.876307 -0.368124
-0.805033 1.46435 -0.202618 0.876307 -0.425779
-0.811308 1.47576 -0.280672 0.876307 -0.481753
-0.812884 1.47863 -0.349024 0.876307 -0.535826
-0.809579 1.47262 -0.406791 0.876307 -0.587785
-0.801271 1.45751 -0.453273 0.876307 -0.637424
-0.787904 1.43319 -0.487968 0.876307 -0.684547
-0.769484 1.39969 -0.510581 0.876307 -0.728968
-0.746084 1.35712 -0.521021 0.876307 -0.770513
-0.717842 1.30575 -0.519407 0.876307 -0.809017
-0.684959 1.24594 -0.506065 0.876307 -0.844328
-0.647701 1.17816 -0.481516 0.876307 -0.876306
-0.606388 1.10302 -0.446474 0.876307 -0.904827
-0.561399 1.02118 -0.401828 0.876307 -0.929776
-0.51316 0.933435 -0.34863 0.876307 -0.951056
-0.462142 0.840633 -0.288073 0.876307 -0.968583
-0.408854 0.743703 -0.221476 0.876307 -0.982287
-0.353836 0.643625 -0.150259 0.876307 -0.992115
-0.29765 0.541424 -0.0759174 0.876307 -0.998027
-0.240878 0.438154 -7.9244e-07 0.876307 -1
-0.184105 0.334885 0.0759158 0.876307 -0.998027
-0.127919 0.232684 0.150257 0.876307 -0.992115
-0.0729008 0.132606 0.221475 0.876307 -0.982287
-0.0196126 0.0356752 0.288072 0.876307 -0.968583
--0.0314054 -0.0571262 0.348628 0.876307 -0.951057
--0.0796445 -0.144873 0.401827 0.876307 -0.929777
--0.124634 -0.226708 0.446473 0.876307 -0.904827
--0.165946 -0.301855 0.481516 0.876307 -0.876307
--0.203205 -0.369628 0.506065 0.876307 -0.844328
--0.236087 -0.429441 0.519407 0.876307 -0.809017
--0.26433 -0.480813 0.521021 0.876307 -0.770514
--0.28773 -0.523378 0.510581 0.876307 -0.728969
--0.30615 -0.556884 0.487969 0.876307 -0.684548
--0.319517 -0.5812 0.453273 0.876307 -0.637425
--0.327825 -0.596311 0.406792 0.876307 -0.587786
--0.33113 -0.602323 0.349026 0.876307 -0.535828
--0.329554 -0.599457 0.280673 0.876307 -0.481754
--0.323279 -0.588042 0.20262 0.876307 -0.42578
--0.312543 -0.568513 0.115925 0.876307 -0.368125
--0.297638 -0.541401 0.0218059 0.876307 -0.309018
--0.278903 -0.507323 -0.0783817 0.876307 -0.248691
--0.256721 -0.466973 -0.183163 0.876307 -0.187382
--0.231506 -0.421108 -0.290968 0.876307 -0.125334
--0.203707 -0.370541 -0.400156 0.876307 -0.0627915
--0.173789 -0.316122 -0.50904 0.876307 -9.80385e-07
--0.142235 -0.258725 -0.615915 0.876307 0.0627895
--0.109533 -0.199239 -0.719084 0.876307 0.125332
--0.0761684 -0.13855 -0.816884 0.876307 0.18738
--0.0426202 -0.0775259 -0.907713 0.876307 0.248689
--0.00935013 -0.0170078 -0.990057 0.876307 0.309016
-0.0232031 0.0422063 -1.06251 0.876307 0.368124
-0.0546305 0.0993725 -1.12381 0.876307 0.425778
-0.0845588 0.153812 -1.17282 0.876307 0.481753
-0.112656 0.20492 -1.20862 0.876307 0.535826
-0.138635 0.252176 -1.23044 0.876307 0.587784
-0.16226 0.29515 -1.23772 0.876307 0.637423
-0.183347 0.333507 -1.23012 0.876307 0.684546
-0.201767 0.367013 -1.20751 0.876307 0.728968
-0.217448 0.395536 -1.16997 0.876307 0.770513
-0.230372 0.419046 -1.11782 0.876307 0.809016
-0.240581 0.437615 -1.05158 0.876307 0.844327
-0.248167 0.451413 -0.971983 0.876307 0.876306
-0.253276 0.460707 -0.879954 0.876307 0.904827
-0.256102 0.465847 -0.776611 0.876307 0.929776
-0.256882 0.467267 -0.663236 0.876307 0.951056
-0.255895 0.465472 -0.541262 0.876307 0.968583
-0.253453 0.461028 -0.412248 0.876307 0.982287
-0.249892 0.454552 -0.27786 0.876307 0.992115
-0.245576 0.4467 -0.139845 0.876307 0.998027
-0.21289 0.452413 0 0.904827 1
-0.206869 0.439618 0.139467 0.904827 0.998027
-0.20121 0.427592 0.277133 0.904827 0.992115
-0.196267 0.417089 0.411222 0.904827 0.982287
-0.192384 0.408836 0.540013 0.904827 0.968583
-0.189881 0.403517 0.661863 0.904827 0.951057
-0.189054 0.401761 0.775233 0.904827 0.929777
-0.190168 0.404128 0.87871 0.904827 0.904827
-0.193451 0.411103 0.971026 0.904827 0.876307
-0.199087 0.423082 1.05108 0.904827 0.844328
-0.207219 0.440363 1.11795 0.904827 0.809017
-0.217939 0.463144 1.17092 0.904827 0.770513
-0.231289 0.491514 1.20946 0.904827 0.728969
-0.247258 0.52545 1.23326 0.904827 0.684547
-0.265784 0.56482 1.24223 0.904827 0.637424
-0.286751 0.609377 1.2365 0.904827 0.587785
-0.309993 0.658767 1.21638 0.904827 0.535827
-0.335291 0.71253 1.18244 0.904827 0.481754
-0.362385 0.770106 1.1354 0.904827 0.42578
-0.390967 0.830846 1.07618 0.904827 0.368125
-0.420692 0.894016 1.00589 0.904827 0.309017
-0.451184 0.958814 0.925751 0.904827 0.24869
-0.482034 1.02437 0.837154 0.904827 0.187382
-0.512815 1.08979 0.741578 0.904827 0.125334
-0.543084 1.15411 0.640592 0.904827 0.0627908
-0.572387 1.21638 0.535827 0.904827 3.26795e-07
-0.600272 1.27564 0.428948 0.904827 -0.0627902
-0.62629 1.33093 0.321626 0.904827 -0.125333
-0.650005 1.38133 0.215518 0.904827 -0.187381
-0.671002 1.42595 0.112235 0.904827 -0.24869
-0.688892 1.46397 0.0133185 0.904827 -0.309017
-0.703317 1.49462 -0.0797826 0.904827 -0.368124
-0.713961 1.51724 -0.165735 0.904827 -0.425779
-0.720548 1.53124 -0.243341 0.904827 -0.481753
-0.722854 1.53614 -0.311557 0.904827 -0.535826
-0.720707 1.53158 -0.36951 0.904827 -0.587785
-0.71399 1.51731 -0.416511 0.904827 -0.637424
-0.702646 1.4932 -0.452061 0.904827 -0.684547
-0.686677 1.45926 -0.475863 0.904827 -0.728968
-0.666145 1.41563 -0.487824 0.904827 -0.770513
-0.641175 1.36257 -0.488053 0.904827 -0.809017
-0.611949 1.30046 -0.476861 0.904827 -0.844328
-0.578708 1.22982 -0.454753 0.904827 -0.876306
-0.541745 1.15127 -0.422422 0.904827 -0.904827
-0.501405 1.06554 -0.380732 0.904827 -0.929776
-0.458081 0.97347 -0.330704 0.904827 -0.951056
-0.412203 0.875975 -0.273504 0.904827 -0.968583
-0.364239 0.774046 -0.210415 0.904827 -0.982287
-0.314684 0.668738 -0.14282 0.904827 -0.992115
-0.264057 0.56115 -0.0721783 0.904827 -0.998027
-0.21289 0.452415 -7.53477e-07 0.904827 -1
-0.161723 0.343679 0.0721768 0.904827 -0.998027
-0.111096 0.236091 0.142818 0.904827 -0.992115
-0.0615417 0.130783 0.210413 0.904827 -0.982287
-0.0135777 0.028854 0.273503 0.904827 -0.968583
--0.0323003 -0.0686416 0.330703 0.904827 -0.951057
--0.075625 -0.160711 0.380731 0.904827 -0.929777
--0.115964 -0.246437 0.422422 0.904827 -0.904827
--0.152927 -0.324987 0.454753 0.904827 -0.876307
--0.186169 -0.395629 0.47686 0.904827 -0.844328
--0.215395 -0.457738 0.488053 0.904827 -0.809017
--0.240365 -0.510802 0.487824 0.904827 -0.770514
--0.260897 -0.554434 0.475864 0.904827 -0.728969
--0.276866 -0.588371 0.452061 0.904827 -0.684548
--0.288211 -0.612479 0.416512 0.904827 -0.637425
--0.294928 -0.626753 0.369511 0.904827 -0.587786
--0.297075 -0.631316 0.311558 0.904827 -0.535828
--0.294769 -0.626415 0.243342 0.904827 -0.481754
--0.288181 -0.612416 0.165737 0.904827 -0.42578
--0.277538 -0.589798 0.0797845 0.904827 -0.368125
--0.263113 -0.559143 -0.0133165 0.904827 -0.309018
--0.245223 -0.521125 -0.112233 0.904827 -0.248691
--0.224226 -0.476504 -0.215516 0.904827 -0.187382
--0.200511 -0.426106 -0.321624 0.904827 -0.125334
--0.174493 -0.370816 -0.428945 0.904827 -0.0627915
--0.146608 -0.311558 -0.535825 0.904827 -9.80385e-07
--0.117305 -0.249285 -0.64059 0.904827 0.0627895
--0.0870364 -0.184962 -0.741576 0.904827 0.125332
--0.0562552 -0.119548 -0.837152 0.904827 0.18738
--0.0254048 -0.0539879 -0.925749 0.904827 0.248689
-0.00508645 0.0108093 -1.00588 0.904827 0.309016
-0.0348122 0.0739797 -1.07618 0.904827 0.368124
-0.0633942 0.134719 -1.1354 0.904827 0.425778
-0.0904876 0.192296 -1.18244 0.904827 0.481753
-0.115786 0.246058 -1.21638 0.904827 0.535826
-0.139028 0.295448 -1.2365 0.904827 0.587784
-0.159995 0.340006 -1.24223 0.904827 0.637423
-0.178521 0.379376 -1.23326 0.904827 0.684546
-0.19449 0.413313 -1.20946 0.904827 0.728968
-0.20784 0.441682 -1.17092 0.904827 0.770513
-0.21856 0.464464 -1.11796 0.904827 0.809016
-0.226692 0.481745 -1.05108 0.904827 0.844327
-0.232329 0.493723 -0.971028 0.904827 0.876306
-0.235611 0.500699 -0.878712 0.904827 0.904827
-0.236725 0.503066 -0.775235 0.904827 0.929776
-0.235899 0.50131 -0.661865 0.904827 0.951056
-0.233396 0.495991 -0.540015 0.904827 0.968583
-0.229512 0.487738 -0.411224 0.904827 0.982287
-0.22457 0.477235 -0.277136 0.904827 0.992115
-0.218911 0.465209 -0.13947 0.904827 0.998027
-0.184062 0.464888 0 0.929776 1
-0.177247 0.447673 0.138954 0.929776 0.998027
-0.170764 0.431301 0.276134 0.929776 0.992115
-0.164943 0.416598 0.409793 0.929776 0.982287
-0.160098 0.404361 0.538233 0.929776 0.968583
-0.156526 0.395339 0.659839 0.929776 0.951057
-0.154501 0.390224 0.773092 0.929776 0.929777
-0.154267 0.389633 0.8766 0.929776 0.904827
-0.156036 0.394101 0.969113 0.929776 0.876307
-0.159981 0.404066 1.04954 0.929776 0.844328
-0.166235 0.419862 1.11698 0.929776 0.809017
-0.174886 0.441712 1.17072 0.929776 0.770513
-0.185977 0.469724 1.21022 0.929776 0.728969
-0.199502 0.503885 1.23519 0.929776 0.684547
-0.215408 0.544058 1.24552 0.929776 0.637424
-0.233593 0.589989 1.24134 0.929776 0.587785
-0.25391 0.641303 1.22295 0.929776 0.535827
-0.276165 0.697512 1.19088 0.929776 0.481754
-0.300122 0.758021 1.14586 0.929776 0.42578
-0.325506 0.822134 1.08879 0.929776 0.368125
-0.352007 0.889067 1.02072 0.929776 0.309017
-0.379283 0.957958 0.942874 0.929776 0.24869
-0.406967 1.02788 0.856596 0.929776 0.187382
-0.434672 1.09786 0.763338 0.929776 0.125334
-0.461997 1.16687 0.664635 0.929776 0.0627908
-0.488531 1.23389 0.562084 0.929776 3.26795e-07
-0.513864 1.29787 0.457314 0.929776 -0.0627902
-0.537588 1.35779 0.351965 0.929776 -0.125333
-0.559309 1.41265 0.247659 0.929776 -0.187381
-0.578649 1.4615 0.145976 0.929776 -0.24869
-0.595252 1.50343 0.0484277 0.929776 -0.309017
-0.608795 1.53764 -0.0435633 0.929776 -0.368124
-0.618986 1.56338 -0.128688 0.929776 -0.425779
-0.625576 1.58002 -0.205769 0.929776 -0.481753
-0.628358 1.58705 -0.273782 0.929776 -0.535826
-0.627172 1.58406 -0.331865 0.929776 -0.587785
-0.621911 1.57077 -0.379338 0.929776 -0.637424
-0.612519 1.54705 -0.415707 0.929776 -0.684547
-0.598994 1.51289 -0.440676 0.929776 -0.728968
-0.58139 1.46842 -0.454145 0.929776 -0.770513
-0.559814 1.41393 -0.456216 0.929776 -0.809017
-0.534429 1.34981 -0.447186 0.929776 -0.844328
-0.505447 1.27661 -0.427542 0.929776 -0.876306
-0.473131 1.19499 -0.397953 0.929776 -0.904827
-0.437789 1.10573 -0.359259 0.929776 -0.929776
-0.399771 1.00971 -0.312453 0.929776 -0.951056
-0.359464 0.907902 -0.258665 0.929776 -0.968583
-0.317286 0.801372 -0.199145 0.929776 -0.982287
-0.273681 0.691239 -0.13524 0.929776 -0.992115
-0.229114 0.578676 -0.0683679 0.929776 -0.998027
-0.184063 0.464889 -7.13771e-07 0.929776 -1
-0.139012 0.351103 0.0683665 0.929776 -0.998027
-0.0944447 0.23854 0.135238 0.929776 -0.992115
-0.0508399 0.128407 0.199144 0.929776 -0.982287
-0.0086616 0.0218767 0.258664 0.929776 -0.968583
--0.0316459 -0.0799282 0.312452 0.929776 -0.951057
--0.0696639 -0.175951 0.359259 0.929776 -0.929777
--0.105006 -0.265214 0.397953 0.929776 -0.904827
--0.137322 -0.346835 0.427541 0.929776 -0.876307
--0.166304 -0.420035 0.447185 0.929776 -0.844328
--0.191689 -0.484151 0.456216 0.929776 -0.809017
--0.213265 -0.538645 0.454146 0.929776 -0.770514
--0.230869 -0.583109 0.440676 0.929776 -0.728969
--0.244394 -0.617269 0.415708 0.929776 -0.684548
--0.253787 -0.640991 0.379339 0.929776 -0.637425
--0.259048 -0.654279 0.331866 0.929776 -0.587786
--0.260233 -0.657273 0.273783 0.929776 -0.535828
--0.257451 -0.650248 0.205771 0.929776 -0.481754
--0.250862 -0.633603 0.12869 0.929776 -0.42578
--0.24067 -0.607863 0.0435651 0.929776 -0.368125
--0.227128 -0.573658 -0.0484258 0.929776 -0.309018
--0.210524 -0.531723 -0.145974 0.929776 -0.248691
--0.191185 -0.482878 -0.247657 0.929776 -0.187382
--0.169464 -0.428017 -0.351963 0.929776 -0.125334
--0.14574 -0.368096 -0.457312 0.929776 -0.0627915
--0.120407 -0.304113 -0.562082 0.929776 -9.80385e-07
--0.0938726 -0.237095 -0.664633 0.929776 0.0627895
--0.066548 -0.168081 -0.763336 0.929776 0.125332
--0.0388428 -0.0981057 -0.856594 0.929776 0.18738
--0.0111586 -0.0281833 -0.942872 0.929776 0.248689
-0.0161175 0.040708 -1.02072 0.929776 0.309016
-0.0426182 0.107641 -1.08879 0.929776 0.368124
-0.0680024 0.171754 -1.14586 0.929776 0.425778
-0.0919595 0.232263 -1.19088 0.929776 0.481753
-0.114214 0.288472 -1.22295 0.929776 0.535826
-0.134531 0.339787 -1.24134 0.929776 0.587784
-0.152716 0.385718 -1.24552 0.929776 0.637423
-0.168622 0.425891 -1.23519 0.929776 0.684546
-0.182147 0.460051 -1.21022 0.929776 0.728968
-0.193238 0.488064 -1.17072 0.929776 0.770513
-0.201889 0.509914 -1.11699 0.929776 0.809016
-0.208144 0.52571 -1.04955 0.929776 0.844327
-0.212089 0.535675 -0.969115 0.929776 0.876306
-0.213858 0.540143 -0.876602 0.929776 0.904827
-0.213624 0.539553 -0.773094 0.929776 0.929776
-0.211599 0.534438 -0.659841 0.929776 0.951056
-0.208027 0.525416 -0.538236 0.929776 0.968583
-0.203182 0.513178 -0.409795 0.929776 0.982287
-0.197361 0.498476 -0.276137 0.929776 0.992115
-0.190878 0.482103 -0.138957 0.929776 0.998027
-0.154509 0.475528 0 0.951056 1
-0.147441 0.453777 0.138304 0.951056 0.998027
-0.140671 0.43294 0.274863 0.951056 0.992115
-0.134489 0.413916 0.407959 0.951056 0.982287
-0.129177 0.397567 0.535923 0.951056 0.968583
-0.125 0.384711 0.657164 0.951056 0.951057
-0.122202 0.376098 0.770188 0.951056 0.929777
-0.121001 0.372402 0.873625 0.951056 0.904827
-0.121587 0.374206 0.966243 0.951056 0.876307
-0.124116 0.381991 1.04697 0.951056 0.844328
-0.128709 0.396126 1.11491 0.951056 0.809017
-0.135446 0.41686 1.16936 0.951056 0.770513
-0.144368 0.444319 1.20979 0.951056 0.728969
-0.155474 0.478498 1.2359 0.951056 0.684547
-0.168719 0.519262 1.24758 0.951056 0.637424
-0.184017 0.566346 1.24495 0.951056 0.587785
-0.201242 0.619358 1.2283 0.951056 0.535827
-0.220225 0.677783 1.19816 0.951056 0.481754
-0.240763 0.740991 1.1552 0.951056 0.42578
-0.262615 0.808244 1.10032 0.951056 0.368125
-0.28551 0.878709 1.03455 0.951056 0.309017
-0.309151 0.951468 0.959066 0.951056 0.24869
-0.333216 1.02553 0.875193 0.951056 0.187382
-0.357366 1.09986 0.784345 0.951056 0.125334
-0.38125 1.17337 0.688023 0.951056 0.0627908
-0.404509 1.24495 0.587786 0.951056 3.26795e-07
-0.42678 1.31349 0.485229 0.951056 -0.0627902
-0.447708 1.3779 0.381957 0.951056 -0.125333
-0.466945 1.43711 0.279555 0.951056 -0.187381
-0.484158 1.49008 0.179572 0.951056 -0.24869
-0.499036 1.53587 0.0834892 0.951056 -0.309017
-0.511291 1.57359 -0.00730092 0.951056 -0.368124
-0.520668 1.60245 -0.0915139 0.951056 -0.425779
-0.526946 1.62177 -0.167995 0.951056 -0.481753
-0.52994 1.63099 -0.235737 0.951056 -0.535826
-0.529509 1.62966 -0.293892 0.951056 -0.587785
-0.525556 1.61749 -0.341791 0.951056 -0.637424
-0.518028 1.59433 -0.378943 0.951056 -0.684547
-0.506923 1.56015 -0.405054 0.951056 -0.728968
-0.492283 1.51509 -0.420019 0.951056 -0.770513
-0.474201 1.45944 -0.42393 0.951056 -0.809017
-0.452815 1.39362 -0.41707 0.951056 -0.844328
-0.428308 1.31819 -0.399908 0.951056 -0.876306
-0.400907 1.23386 -0.373092 0.951056 -0.904827
-0.370878 1.14145 -0.337433 0.951056 -0.929776
-0.338526 1.04188 -0.293893 0.951056 -0.951056
-0.304185 0.936185 -0.243571 0.951056 -0.968583
-0.268219 0.825492 -0.18768 0.951056 -0.982287
-0.231013 0.710985 -0.127526 0.951056 -0.992115
-0.192972 0.593905 -0.06449 0.951056 -0.998027
-0.154509 0.475529 -6.7336e-07 0.951056 -1
-0.116046 0.357154 0.0644887 0.951056 -0.998027
-0.0780047 0.240074 0.127525 0.951056 -0.992115
-0.0407991 0.125567 0.187678 0.951056 -0.982287
-0.0048328 0.0148738 0.24357 0.951056 -0.968583
--0.0295081 -0.0908166 0.293892 0.951056 -0.951057
--0.0618605 -0.190387 0.337432 0.951056 -0.929777
--0.0918887 -0.282804 0.373091 0.951056 -0.904827
--0.11929 -0.367136 0.399908 0.951056 -0.876307
--0.143797 -0.442561 0.417069 0.951056 -0.844328
--0.165183 -0.508382 0.423929 0.951056 -0.809017
--0.183266 -0.564034 0.420019 0.951056 -0.770514
--0.197905 -0.60909 0.405054 0.951056 -0.728969
--0.209011 -0.643269 0.378944 0.951056 -0.684548
--0.216538 -0.666436 0.341791 0.951056 -0.637425
--0.220492 -0.678603 0.293894 0.951056 -0.587786
--0.220923 -0.679929 0.235738 0.951056 -0.535828
--0.217928 -0.670714 0.167997 0.951056 -0.481754
--0.211651 -0.651395 0.0915156 0.951056 -0.42578
--0.202274 -0.622535 0.00730275 0.951056 -0.368125
--0.190019 -0.584817 -0.0834872 0.951056 -0.309018
--0.175141 -0.539029 -0.17957 0.951056 -0.248691
--0.157928 -0.486053 -0.279553 0.951056 -0.187382
--0.138692 -0.426848 -0.381954 0.951056 -0.125334
--0.117764 -0.362439 -0.485227 0.951056 -0.0627915
--0.095492 -0.293894 -0.587784 0.951056 -9.80385e-07
--0.0722337 -0.222312 -0.68802 0.951056 0.0627895
--0.0483497 -0.148805 -0.784343 0.951056 0.125332
--0.0241992 -0.0744775 -0.875191 0.951056 0.18738
--0.000134092 -0.000412692 -0.959064 0.951056 0.248689
-0.0235067 0.0723461 -1.03454 0.951056 0.309016
-0.0464021 0.142811 -1.10032 0.951056 0.368124
-0.068254 0.210064 -1.1552 0.951056 0.425778
-0.0887915 0.273272 -1.19816 0.951056 0.481753
-0.107775 0.331697 -1.2283 0.951056 0.535826
-0.125 0.384709 -1.24495 0.951056 0.587784
-0.140298 0.431794 -1.24758 0.951056 0.637423
-0.153543 0.472558 -1.2359 0.951056 0.684546
-0.164649 0.506737 -1.20979 0.951056 0.728968
-0.173571 0.534196 -1.16936 0.951056 0.770513
-0.180308 0.55493 -1.11491 0.951056 0.809016
-0.184901 0.569065 -1.04697 0.951056 0.844327
-0.18743 0.57685 -0.966245 0.951056 0.876306
-0.188016 0.578655 -0.873627 0.951056 0.904827
-0.186816 0.574959 -0.770191 0.951056 0.929776
-0.184017 0.566346 -0.657166 0.951056 0.951056
-0.17984 0.55349 -0.535926 0.951056 0.968583
-0.174528 0.537141 -0.407962 0.951056 0.982287
-0.168346 0.518116 -0.274866 0.951056 0.992115
-0.161576 0.49728 -0.138307 0.951056 0.998027
-0.124345 0.484292 0 0.968583 1
-0.11758 0.457943 0.137517 0.968583 0.998027
-0.111067 0.432578 0.273321 0.968583 0.992115
-0.105055 0.409163 0.405723 0.968583 0.982287
-0.0997828 0.388628 0.533084 0.968583 0.968583
-0.0954756 0.371852 0.65384 0.968583 0.951057
-0.0923416 0.359646 0.766524 0.968583 0.929777
-0.0905677 0.352737 0.869788 0.968583 0.904827
-0.0903157 0.351756 0.96242 0.968583 0.876307
-0.0917198 0.357225 1.04337 0.968583 0.844328
-0.0948833 0.369546 1.11174 0.968583 0.809017
-0.0998772 0.388996 1.16684 0.968583 0.770513
-0.106738 0.415717 1.20816 0.968583 0.728969
-0.115467 0.449714 1.23539 0.968583 0.684547
-0.12603 0.490853 1.24841 0.968583 0.637424
-0.138356 0.538861 1.24733 0.968583 0.587785
-0.152341 0.59333 1.23245 0.968583 0.535827
-0.167847 0.65372 1.20424 0.968583 0.481754
-0.184702 0.719367 1.1634 0.968583 0.42578
-0.202708 0.789496 1.11077 0.968583 0.368125
-0.221639 0.863225 1.04735 0.968583 0.309017
-0.241244 0.939584 0.974312 0.968583 0.24869
-0.261257 1.01753 0.892927 0.968583 0.187382
-0.281393 1.09595 0.804578 0.968583 0.125334
-0.301357 1.17371 0.710731 0.968583 0.0627908
-0.320849 1.24962 0.612907 0.968583 3.26795e-07
-0.339565 1.32252 0.512665 0.968583 -0.0627902
-0.357206 1.39122 0.411571 0.968583 -0.125333
-0.373479 1.4546 0.311176 0.968583 -0.187381
-0.388106 1.51157 0.212992 0.968583 -0.24869
-0.400824 1.5611 0.118468 0.968583 -0.309017
-0.411391 1.60226 0.0289686 0.968583 -0.368124
-0.419592 1.6342 -0.0542497 0.968583 -0.425779
-0.425238 1.65619 -0.130055 0.968583 -0.481753
-0.428176 1.66763 -0.197459 0.968583 -0.535826
-0.428284 1.66805 -0.25563 0.968583 -0.587785
-0.425478 1.65713 -0.303906 0.968583 -0.637424
-0.419713 1.63467 -0.341806 0.968583 -0.684547
-0.410984 1.60068 -0.369032 0.968583 -0.728968
-0.399325 1.55527 -0.385478 0.968583 -0.770513
-0.384811 1.49874 -0.391224 0.968583 -0.809017
-0.367555 1.43153 -0.386542 0.968583 -0.844328
-0.347707 1.35423 -0.37188 0.968583 -0.876306
-0.325457 1.26757 -0.347862 0.968583 -0.904827
-0.301025 1.17241 -0.315273 0.968583 -0.929776
-0.274661 1.06973 -0.275043 0.968583 -0.951056
-0.246645 0.960616 -0.228237 0.968583 -0.968583
-0.217277 0.846239 -0.176029 0.968583 -0.982287
-0.18688 0.727849 -0.119687 0.968583 -0.992115
-0.155788 0.606753 -0.0605486 0.968583 -0.998027
-0.124345 0.484293 -6.32285e-07 0.968583 -1
-0.0929031 0.361833 0.0605473 0.968583 -0.998027
-0.0618107 0.240736 0.119685 0.968583 -0.992115
-0.0314133 0.122347 0.176028 0.968583 -0.982287
-0.00204611 0.00796906 0.228236 0.968583 -0.968583
--0.0259702 -0.101147 0.275042 0.968583 -0.951057
--0.0523339 -0.203827 0.315272 0.968583 -0.929777
--0.0767665 -0.298986 0.347862 0.968583 -0.904827
--0.0990169 -0.385645 0.37188 0.968583 -0.876307
--0.118864 -0.462944 0.386542 0.968583 -0.844328
--0.136121 -0.530154 0.391224 0.968583 -0.809017
--0.150635 -0.586684 0.385478 0.968583 -0.770514
--0.162294 -0.632093 0.369033 0.968583 -0.728969
--0.171023 -0.66609 0.341806 0.968583 -0.684548
--0.176788 -0.688542 0.303907 0.968583 -0.637425
--0.179594 -0.69947 0.255631 0.968583 -0.587786
--0.179486 -0.699051 0.19746 0.968583 -0.535828
--0.176548 -0.68761 0.130057 0.968583 -0.481754
--0.170902 -0.665617 0.0542513 0.968583 -0.42578
--0.162701 -0.633678 -0.0289668 0.968583 -0.368125
--0.152134 -0.592522 -0.118466 0.968583 -0.309018
--0.139416 -0.54299 -0.21299 0.968583 -0.248691
--0.124789 -0.486022 -0.311174 0.968583 -0.187382
--0.108516 -0.422641 -0.411569 0.968583 -0.125334
--0.090875 -0.353934 -0.512663 0.968583 -0.0627915
--0.072159 -0.28104 -0.612905 0.968583 -9.80385e-07
--0.0526675 -0.205126 -0.710729 0.968583 0.0627895
--0.0327033 -0.127371 -0.804576 0.968583 0.125332
--0.0125674 -0.0489469 -0.892925 0.968583 0.18738
-0.00744527 0.0289974 -0.97431 0.968583 0.248689
-0.0270511 0.105357 -1.04735 0.968583 0.309016
-0.0459815 0.179086 -1.11076 0.968583 0.368124
-0.0639875 0.249215 -1.1634 0.968583 0.425778
-0.080843 0.314862 -1.20424 0.968583 0.481753
-0.0963485 0.375252 -1.23245 0.968583 0.535826
-0.110334 0.429721 -1.24733 0.968583 0.587784
-0.12266 0.477729 -1.24841 0.968583 0.637423
-0.133223 0.518869 -1.23539 0.968583 0.684546
-0.141952 0.552866 -1.20816 0.968583 0.728968
-0.148813 0.579587 -1.16684 0.968583 0.770513
-0.153807 0.599037 -1.11174 0.968583 0.809016
-0.15697 0.611358 -1.04337 0.968583 0.844327
-0.158374 0.616827 -0.962422 0.968583 0.876306
-0.158123 0.615846 -0.86979 0.968583 0.904827
-0.156349 0.608937 -0.766527 0.968583 0.929776
-0.153215 0.596731 -0.653842 0.968583 0.951056
-0.148907 0.579956 -0.533086 0.968583 0.968583
-0.143635 0.559421 -0.405725 0.968583 0.982287
-0.137623 0.536006 -0.273324 0.968583 0.992115
-0.13111 0.510641 -0.13752 0.968583 0.998027
-0.0936908 0.491144 0 0.982287 1
-0.0877865 0.460192 0.136595 0.982287 0.998027
-0.0820825 0.430291 0.271509 0.982287 0.992115
-0.0767756 0.402471 0.403086 0.982287 0.982287
-0.0720553 0.377726 0.529718 0.982287 0.968583
-0.0681007 0.356996 0.649871 0.982287 0.951057
-0.0650773 0.341147 0.762104 0.982287 0.929777
-0.0631336 0.330957 0.865092 0.982287 0.904827
-0.0623986 0.327104 0.957647 0.982287 0.876307
-0.0629796 0.33015 1.03873 0.982287 0.844328
-0.0649596 0.34053 1.10747 0.982287 0.809017
-0.0683962 0.358545 1.16317 0.982287 0.770513
-0.0733199 0.384356 1.20534 0.982287 0.728969
-0.0797335 0.417977 1.23365 0.982287 0.684547
-0.0876116 0.459275 1.24801 0.982287 0.637424
-0.096901 0.507972 1.24849 0.982287 0.587785
-0.107521 0.563644 1.23538 0.982287 0.535827
-0.119364 0.625728 1.20914 0.982287 0.481754
-0.132298 0.693532 1.17045 0.982287 0.42578
-0.146169 0.766241 1.12011 0.982287 0.368125
-0.160798 0.842933 1.05912 0.982287 0.309017
-0.175993 0.922588 0.988596 0.982287 0.24869
-0.191544 1.00411 0.909779 0.982287 0.187382
-0.207228 1.08633 0.824017 0.982287 0.125334
-0.222816 1.16804 0.732737 0.982287 0.0627908
-0.238071 1.24801 0.637424 0.982287 3.26795e-07
-0.252756 1.32499 0.539596 0.982287 -0.0627902
-0.266636 1.39775 0.440779 0.982287 -0.125333
-0.279483 1.4651 0.342489 0.982287 -0.187381
-0.291076 1.52587 0.246201 0.982287 -0.24869
-0.30121 1.579 0.15333 0.982287 -0.309017
-0.309695 1.62348 0.0652096 0.982287 -0.368124
-0.316361 1.65842 -0.0169318 0.982287 -0.425779
-0.32106 1.68305 -0.0919866 0.982287 -0.481753
-0.323669 1.69673 -0.158986 0.982287 -0.535826
-0.324092 1.69895 -0.217115 0.982287 -0.587785
-0.322263 1.68936 -0.265722 0.982287 -0.637424
-0.318145 1.66777 -0.304331 0.982287 -0.684547
-0.311732 1.63415 -0.332646 0.982287 -0.728968
-0.303048 1.58863 -0.350556 0.982287 -0.770513
-0.292151 1.53151 -0.358133 0.982287 -0.809017
-0.279128 1.46324 -0.355633 0.982287 -0.844328
-0.264094 1.38443 -0.343485 0.982287 -0.876306
-0.247196 1.29585 -0.322289 0.982287 -0.904827
-0.228604 1.19838 -0.292802 0.982287 -0.929776
-0.208513 1.09306 -0.255922 0.982287 -0.951056
-0.187138 0.981011 -0.212677 0.982287 -0.968583
-0.164714 0.863462 -0.164204 0.982287 -0.982287
-0.141491 0.741718 -0.111729 0.982287 -0.992115
-0.117727 0.617144 -0.0565473 0.982287 -0.998027
-0.093691 0.491145 -5.90586e-07 0.982287 -1
-0.0696554 0.365146 0.0565462 0.982287 -0.998027
-0.0458915 0.240572 0.111728 0.982287 -0.992115
-0.0226676 0.118827 0.164203 0.982287 -0.982287
-0.000243811 0.0012781 0.212676 0.982287 -0.968583
--0.0211308 -0.110771 0.255921 0.982287 -0.951057
--0.0412221 -0.216094 0.292801 0.982287 -0.929777
--0.0598143 -0.313557 0.322289 0.982287 -0.904827
--0.0767124 -0.40214 0.343484 0.982287 -0.876307
--0.0917456 -0.480947 0.355632 0.982287 -0.844328
--0.104769 -0.549218 0.358133 0.982287 -0.809017
--0.115666 -0.606343 0.350556 0.982287 -0.770514
--0.12435 -0.651864 0.332647 0.982287 -0.728969
--0.130763 -0.685485 0.304331 0.982287 -0.684548
--0.134882 -0.707074 0.265722 0.982287 -0.637425
--0.136711 -0.716661 0.217116 0.982287 -0.587786
--0.136287 -0.714441 0.158987 0.982287 -0.535828
--0.133678 -0.700765 0.0919881 0.982287 -0.481754
--0.128979 -0.676133 0.0169335 0.982287 -0.42578
--0.122314 -0.64119 -0.0652078 0.982287 -0.368125
--0.113829 -0.596711 -0.153328 0.982287 -0.309018
--0.103695 -0.543586 -0.246199 0.982287 -0.248691
--0.0921014 -0.482812 -0.342487 0.982287 -0.187382
--0.0792548 -0.415468 -0.440777 0.982287 -0.125334
--0.0653745 -0.342705 -0.539594 0.982287 -0.0627915
--0.0506895 -0.265723 -0.637422 0.982287 -9.80385e-07
--0.0354346 -0.185754 -0.732736 0.982287 0.0627895
--0.0198471 -0.104042 -0.824015 0.982287 0.125332
--0.00416276 -0.0218219 -0.909777 0.982287 0.18738
-0.0113879 0.0596972 -0.988594 0.982287 0.248689
-0.0265829 0.139352 -1.05912 0.982287 0.309016
-0.0412127 0.216044 -1.12011 0.982287 0.368124
-0.0550829 0.288754 -1.17045 0.982287 0.425778
-0.0680172 0.356558 -1.20914 0.982287 0.481753
-0.0798604 0.418642 -1.23538 0.982287 0.535826
-0.0904804 0.474314 -1.24849 0.982287 0.587784
-0.0997698 0.523011 -1.24801 0.982287 0.637423
-0.107648 0.56431 -1.23366 0.982287 0.684546
-0.114062 0.597931 -1.20534 0.982287 0.728968
-0.118985 0.623742 -1.16318 0.982287 0.770513
-0.122422 0.641757 -1.10747 0.982287 0.809016
-0.124402 0.652137 -1.03873 0.982287 0.844327
-0.124983 0.655183 -0.957649 0.982287 0.876306
-0.124248 0.65133 -0.865095 0.982287 0.904827
-0.122304 0.641141 -0.762106 0.982287 0.929776
-0.119281 0.625292 -0.649873 0.982287 0.951056
-0.115326 0.604561 -0.529721 0.982287 0.968583
-0.110606 0.579817 -0.403089 0.982287 0.982287
-0.105299 0.551997 -0.271512 0.982287 0.992115
-0.0995952 0.522096 -0.136598 0.982287 0.998027
-0.0626668 0.496057 0 0.992115 1
-0.0581818 0.460555 0.135538 0.992115 0.998027
-0.0538373 0.426165 0.269429 0.992115 0.992115
-0.0497714 0.39398 0.400052 0.992115 0.982287
-0.0461172 0.365054 0.52583 0.992115 0.968583
-0.0430004 0.340382 0.645261 0.992115 0.951057
-0.0405373 0.320885 0.756931 0.992115 0.929777
-0.0388324 0.307389 0.859543 0.992115 0.904827
-0.0379767 0.300616 0.951929 0.992115 0.876307
-0.0380459 0.301163 1.03307 0.992115 0.844328
-0.039099 0.3095 1.10211 0.992115 0.809017
-0.0411772 0.32595 1.15836 0.992115 0.770513
-0.0443028 0.350692 1.20133 0.992115 0.728969
-0.0484791 0.383751 1.23071 0.992115 0.684547
-0.0536894 0.424994 1.24637 0.992115 0.637424
-0.0598979 0.474139 1.24841 0.992115 0.587785
-0.0670493 0.530748 1.23708 0.992115 0.535827
-0.0750702 0.59424 1.21285 0.992115 0.481754
-0.0838696 0.663895 1.17634 0.992115 0.42578
-0.0933404 0.738864 1.12836 0.992115 0.368125
-0.103361 0.818186 1.06985 0.992115 0.309017
-0.113797 0.900796 1.0019 0.992115 0.24869
-0.124504 0.985546 0.925733 0.992115 0.187382
-0.135327 1.07122 0.842643 0.992115 0.125334
-0.146107 1.15655 0.754021 0.992115 0.0627908
-0.156681 1.24025 0.661312 0.992115 3.26795e-07
-0.166883 1.32102 0.565993 0.992115 -0.0627902
-0.176552 1.39755 0.469553 0.992115 -0.125333
-0.185527 1.4686 0.373464 0.992115 -0.187381
-0.193657 1.53295 0.279167 0.992115 -0.24869
-0.200798 1.58947 0.188041 0.992115 -0.309017
-0.206817 1.63712 0.101386 0.992115 -0.368124
-0.211597 1.67496 0.0204027 0.992115 -0.425779
-0.215034 1.70216 -0.0538274 0.992115 -0.481753
-0.217042 1.71806 -0.120356 0.992115 -0.535826
-0.217554 1.72211 -0.178385 0.992115 -0.587785
-0.216522 1.71395 -0.227275 0.992115 -0.637424
-0.213921 1.69336 -0.266555 0.992115 -0.684547
-0.209745 1.6603 -0.295932 0.992115 -0.728968
-0.20401 1.6149 -0.315289 0.992115 -0.770513
-0.196755 1.55747 -0.324689 0.992115 -0.809017
-0.188038 1.48847 -0.324372 0.992115 -0.844328
-0.17794 1.40854 -0.314751 0.992115 -0.876306
-0.16656 1.31845 -0.296398 0.992115 -0.904827
-0.154014 1.21914 -0.270042 0.992115 -0.929776
-0.140437 1.11167 -0.236548 0.992115 -0.951056
-0.125977 0.99721 -0.196908 0.992115 -0.968583
-0.110795 0.877032 -0.152217 0.992115 -0.982287
-0.0950626 0.752496 -0.103661 0.992115 -0.992115
-0.0789583 0.625018 -0.0524903 0.992115 -0.998027
-0.0626669 0.496059 -5.48303e-07 0.992115 -1
-0.0463756 0.367099 0.0524892 0.992115 -0.998027
-0.0302713 0.239621 0.10366 0.992115 -0.992115
-0.0145386 0.115085 0.152216 0.992115 -0.982287
--0.000643349 -0.00509262 0.196907 0.992115 -0.968583
--0.0151033 -0.119555 0.236547 0.992115 -0.951057
--0.0286803 -0.227028 0.270041 0.992115 -0.929777
--0.041226 -0.326336 0.296397 0.992115 -0.904827
--0.0526065 -0.416422 0.31475 0.992115 -0.876307
--0.0627046 -0.496356 0.324372 0.992115 -0.844328
--0.0714211 -0.565355 0.324689 0.992115 -0.809017
--0.0786764 -0.622786 0.315289 0.992115 -0.770514
--0.0844112 -0.668182 0.295932 0.992115 -0.728969
--0.0885875 -0.70124 0.266556 0.992115 -0.684548
--0.0911887 -0.721831 0.227276 0.992115 -0.637425
--0.0922201 -0.729995 0.178386 0.992115 -0.587786
--0.0917081 -0.725943 0.120358 0.992115 -0.535828
--0.0897002 -0.710048 0.0538289 0.992115 -0.481754
--0.0862634 -0.682844 -0.0204011 0.992115 -0.42578
--0.0814838 -0.645009 -0.101384 0.992115 -0.368125
--0.0754643 -0.59736 -0.188039 0.992115 -0.309018
--0.0683237 -0.540837 -0.279165 0.992115 -0.248691
--0.060194 -0.476484 -0.373462 0.992115 -0.187382
--0.0512187 -0.405437 -0.469551 0.992115 -0.125334
--0.0415501 -0.328902 -0.565991 0.992115 -0.0627915
--0.0313475 -0.24814 -0.66131 0.992115 -9.80385e-07
--0.0207738 -0.164441 -0.754019 0.992115 0.0627895
--0.00999361 -0.0791074 -0.842641 0.992115 0.125332
-0.00082959 0.00656686 -0.925731 0.992115 0.18738
-0.0115361 0.0913171 -1.0019 0.992115 0.248689
-0.0219722 0.173927 -1.06985 0.992115 0.309016
-0.0319929 0.253249 -1.12836 0.992115 0.368124
-0.0414638 0.328219 -1.17634 0.992115 0.425778
-0.0502632 0.397873 -1.21285 0.992115 0.481753
-0.0582841 0.461365 -1.23708 0.992115 0.535826
-0.0654355 0.517974 -1.24841 0.992115 0.587784
-0.071644 0.567119 -1.24637 0.992115 0.637423
-0.0768543 0.608363 -1.23071 0.992115 0.684546
-0.0810306 0.641422 -1.20133 0.992115 0.728968
-0.0841563 0.666164 -1.15836 0.992115 0.770513
-0.0862345 0.682615 -1.10211 0.992115 0.809016
-0.0872877 0.690951 -1.03307 0.992115 0.844327
-0.0873569 0.691499 -0.951931 0.992115 0.876306
-0.0865012 0.684726 -0.859545 0.992115 0.904827
-0.0847963 0.67123 -0.756934 0.992115 0.929776
-0.0823332 0.651733 -0.645263 0.992115 0.951056
-0.0792164 0.627061 -0.525833 0.992115 0.968583
-0.0755622 0.598135 -0.400054 0.992115 0.982287
-0.0714963 0.56595 -0.269432 0.992115 0.992115
-0.0671519 0.53156 -0.135541 0.992115 0.998027
-0.0313954 0.499013 0 0.998027 1
-0.0288823 0.459068 0.134347 0.998027 0.998027
-0.0264427 0.420293 0.267084 0.998027 0.992115
-0.0241491 0.383838 0.396623 0.998027 0.982287
-0.0220712 0.350811 0.521423 0.998027 0.968583
-0.020275 0.32226 0.640014 0.998027 0.951057
-0.0188213 0.299155 0.751012 0.998027 0.929777
-0.0177652 0.282369 0.853146 0.998027 0.904827
-0.0171545 0.272662 0.945272 0.998027 0.876307
-0.0170291 0.270669 1.02639 0.998027 0.844328
-0.0174203 0.276887 1.09566 0.998027 0.809017
-0.01835 0.291664 1.1524 0.998027 0.770513
-0.0198304 0.315194 1.19613 0.998027 0.728969
-0.0218637 0.347512 1.22654 0.998027 0.684547
-0.0244418 0.38849 1.24351 0.998027 0.637424
-0.0275467 0.437839 1.2471 0.998027 0.587785
-0.03115 0.495113 1.23757 0.998027 0.535827
-0.0352142 0.559711 1.21536 0.998027 0.481754
-0.0396925 0.63089 1.18108 0.998027 0.42578
-0.0445296 0.707774 1.13549 0.998027 0.368125
-0.0496627 0.789363 1.07952 0.998027 0.309017
-0.0550226 0.874554 1.01422 0.998027 0.24869
-0.060534 0.962155 0.940773 0.998027 0.187382
-0.0661175 1.0509 0.860437 0.998027 0.125334
-0.0716904 1.13948 0.774561 0.998027 0.0627908
-0.0771679 1.22654 0.684547 0.998027 3.26795e-07
-0.0824649 1.31073 0.591833 0.998027 -0.0627902
-0.0874965 1.39071 0.497863 0.998027 -0.125333
-0.0921804 1.46516 0.404071 0.998027 -0.187381
-0.0964373 1.53282 0.311858 0.998027 -0.24869
-0.100193 1.59251 0.222566 0.998027 -0.309017
-0.103378 1.64313 0.137463 0.998027 -0.368124
-0.105931 1.68371 0.0577171 0.998027 -0.425779
-0.107798 1.71339 -0.0156151 0.998027 -0.481753
-0.108935 1.73146 -0.0816081 0.998027 -0.535826
-0.109306 1.73736 -0.13948 0.998027 -0.587785
-0.108886 1.73068 -0.188604 0.998027 -0.637424
-0.107661 1.71121 -0.228517 0.998027 -0.684547
-0.105627 1.67889 -0.258925 0.998027 -0.728968
-0.102794 1.63385 -0.27971 0.998027 -0.770513
-0.0991794 1.5764 -0.290924 0.998027 -0.809017
-0.094814 1.50702 -0.292792 0.998027 -0.844328
-0.0897385 1.42635 -0.285706 0.998027 -0.876306
-0.0840037 1.33519 -0.270214 0.998027 -0.904827
-0.0776696 1.23452 -0.247015 0.998027 -0.929776
-0.0708049 1.12541 -0.216941 0.998027 -0.951056
-0.063486 1.00908 -0.180944 0.998027 -0.968583
-0.0557956 0.886841 -0.14008 0.998027 -0.982287
-0.0478218 0.760102 -0.0954911 0.998027 -0.992115
-0.0396568 0.630324 -0.0483814 0.998027 -0.998027
-0.0313955 0.499015 -5.0548e-07 0.998027 -1
-0.0231342 0.367706 0.0483804 0.998027 -0.998027
-0.0149692 0.237927 0.0954902 0.998027 -0.992115
-0.00699538 0.111188 0.14008 0.998027 -0.982287
--0.000695021 -0.011047 0.180943 0.998027 -0.968583
--0.00801393 -0.127377 0.21694 0.998027 -0.951057
--0.0148786 -0.236487 0.247015 0.998027 -0.929777
--0.0212127 -0.337165 0.270214 0.998027 -0.904827
--0.0269476 -0.428318 0.285705 0.998027 -0.876307
--0.0320231 -0.50899 0.292792 0.998027 -0.844328
--0.0363885 -0.578376 0.290924 0.998027 -0.809017
--0.040003 -0.635826 0.27971 0.998027 -0.770514
--0.0428365 -0.680863 0.258926 0.998027 -0.728969
--0.0448698 -0.713181 0.228517 0.998027 -0.684548
--0.0460949 -0.732653 0.188605 0.998027 -0.637425
--0.0465149 -0.739329 0.139481 0.998027 -0.587786
--0.0461441 -0.733435 0.0816093 0.998027 -0.535828
--0.0450074 -0.715368 0.0156165 0.998027 -0.481754
--0.04314 -0.685688 -0.0577155 0.998027 -0.42578
--0.0405869 -0.645108 -0.137461 0.998027 -0.368125
--0.0374019 -0.594482 -0.222565 0.998027 -0.309018
--0.0336465 -0.534793 -0.311856 0.998027 -0.248691
--0.0293896 -0.467133 -0.404069 0.998027 -0.187382
--0.0247058 -0.392685 -0.497861 0.998027 -0.125334
--0.0196741 -0.31271 -0.591831 0.998027 -0.0627915
--0.0143772 -0.228518 -0.684546 0.998027 -9.80385e-07
--0.00889967 -0.141456 -0.774559 0.998027 0.0627895
--0.00332679 -0.0528776 -0.860435 0.998027 0.125332
-0.00225673 0.0358695 -0.940772 0.998027 0.18738
-0.00776815 0.123471 -1.01422 0.998027 0.248689
-0.013128 0.208662 -1.07952 0.998027 0.309016
-0.0182612 0.290251 -1.13549 0.998027 0.368124
-0.0230983 0.367135 -1.18108 0.998027 0.425778
-0.0275765 0.438314 -1.21536 0.998027 0.481753
-0.0316407 0.502913 -1.23757 0.998027 0.535826
-0.0352441 0.560186 -1.2471 0.998027 0.587784
-0.0383489 0.609536 -1.24351 0.998027 0.637423
-0.0409271 0.650514 -1.22654 0.998027 0.684546
-0.0429604 0.682832 -1.19614 0.998027 0.728968
-0.0444408 0.706363 -1.1524 0.998027 0.770513
-0.0453705 0.72114 -1.09566 0.998027 0.809016
-0.0457617 0.727357 -1.02639 0.998027 0.844327
-0.0456363 0.725365 -0.945273 0.998027 0.876306
-0.0450256 0.715658 -0.853148 0.998027 0.904827
-0.0439695 0.698872 -0.751014 0.998027 0.929776
-0.0425159 0.675767 -0.640016 0.998027 0.951056
-0.0407196 0.647217 -0.521426 0.998027 0.968583
-0.0386417 0.61419 -0.396625 0.998027 0.982287
-0.0363481 0.577734 -0.267086 0.998027 0.992115
-0.0339086 0.538959 -0.13435 0.998027 0.998027
-1.63397e-07 0.5 0 1 1
-1.48945e-07 0.455776 0.133024 1 0.998027
-1.34892e-07 0.412774 0.264474 1 0.992115
-1.21632e-07 0.372195 0.392802 1 0.982287
-1.09541e-07 0.335199 0.516502 1 0.968583
-9.898e-08 0.302881 0.634135 1 0.951057
-9.02789e-08 0.276256 0.744351 1 0.929777
-8.37368e-08 0.256236 0.845906 1 0.904827
-7.96142e-08 0.243621 0.937681 1 0.876307
-7.81293e-08 0.239078 1.0187 1 0.844328
-7.94532e-08 0.243129 1.08813 1 0.809017
-8.37069e-08 0.256145 1.14531 1 0.770513
-9.0959e-08 0.278337 1.18976 1 0.728969
-1.01224e-07 0.309747 1.22117 1 0.684547
-1.14461e-07 0.350253 1.23942 1 0.637424
-1.30575e-07 0.399563 1.24456 1 0.587785
-1.49417e-07 0.457221 1.23684 1 0.535827
-1.70787e-07 0.522612 1.21667 1 0.481754
-1.94435e-07 0.594974 1.18464 1 0.42578
-2.20065e-07 0.673403 1.1415 1 0.368125
-2.47342e-07 0.756871 1.08813 1 0.309017
-2.75893e-07 0.84424 1.02554 1 0.24869
-3.05317e-07 0.934278 0.954886 1 0.187382
-3.35187e-07 1.02568 0.877382 1 0.125334
-3.65058e-07 1.11709 0.794336 1 0.0627908
-3.94476e-07 1.20711 0.707107 1 3.26795e-07
-4.22982e-07 1.29434 0.617088 1 -0.0627902
-4.50121e-07 1.37738 0.525681 1 -0.125333
-4.75449e-07 1.45488 0.434279 1 -0.187381
-4.9854e-07 1.52554 0.344241 1 -0.24869
-5.18991e-07 1.58813 0.256872 1 -0.309017
-5.36433e-07 1.6415 0.173404 1 -0.368124
-5.50533e-07 1.68464 0.0949745 1 -0.425779
-5.61e-07 1.71667 0.0226127 1 -0.481753
-5.6759e-07 1.73684 -0.0427791 1 -0.535826
-5.70113e-07 1.74456 -0.100437 1 -0.587785
-5.68433e-07 1.73942 -0.149747 1 -0.637424
-5.6247e-07 1.72117 -0.190253 1 -0.684547
-5.52205e-07 1.68976 -0.221664 1 -0.728968
-5.37679e-07 1.64531 -0.243855 1 -0.770513
-5.18991e-07 1.58813 -0.256872 1 -0.809017
-4.96302e-07 1.5187 -0.260923 1 -0.844328
-4.69827e-07 1.43768 -0.256379 1 -0.876306
-4.39836e-07 1.34591 -0.243764 1 -0.904827
-4.06648e-07 1.24435 -0.223745 1 -0.929776
-3.7063e-07 1.13414 -0.197119 1 -0.951056
-3.32188e-07 1.0165 -0.164801 1 -0.968583
-2.91764e-07 0.892803 -0.127805 1 -0.982287
-2.49827e-07 0.764476 -0.0872268 1 -0.992115
-2.06869e-07 0.633025 -0.0442248 1 -0.998027
-1.63398e-07 0.500001 -4.62158e-07 1 -1
-1.19926e-07 0.366978 0.0442239 1 -0.998027
-7.69691e-08 0.235527 0.0872259 1 -0.992115
-3.50322e-08 0.107199 0.127804 1 -0.982287
--5.39218e-09 -0.0165002 0.164801 1 -0.968583
--4.38342e-08 -0.134134 0.197119 1 -0.951057
--7.98523e-08 -0.24435 0.223744 1 -0.929777
--1.1304e-07 -0.345905 0.243764 1 -0.904827
--1.43032e-07 -0.43768 0.256379 1 -0.876307
--1.69507e-07 -0.518695 0.260923 1 -0.844328
--1.92196e-07 -0.588125 0.256872 1 -0.809017
--2.10883e-07 -0.645308 0.243856 1 -0.770514
--2.2541e-07 -0.689759 0.221664 1 -0.728969
--2.35675e-07 -0.72117 0.190253 1 -0.684548
--2.41638e-07 -0.739417 0.149748 1 -0.637425
--2.43318e-07 -0.74456 0.100438 1 -0.587786
--2.40795e-07 -0.73684 0.0427804 1 -0.535828
--2.34205e-07 -0.716673 -0.0226112 1 -0.481754
--2.23739e-07 -0.684645 -0.0949729 1 -0.42578
--2.09639e-07 -0.6415 -0.173402 1 -0.368125
--1.92197e-07 -0.588126 -0.25687 1 -0.309018
--1.71745e-07 -0.525544 -0.344239 1 -0.248691
--1.48655e-07 -0.454887 -0.434277 1 -0.187382
--1.23327e-07 -0.377383 -0.525679 1 -0.125334
--9.61878e-08 -0.294337 -0.617086 1 -0.0627915
--6.76819e-08 -0.207108 -0.707105 1 -9.80385e-07
--3.82641e-08 -0.117089 -0.794334 1 0.0627895
--8.39286e-09 -0.0256823 -0.87738 1 0.125332
-2.14769e-08 0.0657198 -0.954884 1 0.18738
-5.09009e-08 0.155758 -1.02554 1 0.248689
-7.94526e-08 0.243127 -1.08812 1 0.309016
-1.0673e-07 0.326595 -1.1415 1 0.368124
-1.3236e-07 0.405024 -1.18464 1 0.425778
-1.56007e-07 0.477386 -1.21667 1 0.481753
-1.77377e-07 0.542778 -1.23684 1 0.535826
-1.96219e-07 0.600436 -1.24456 1 0.587784
-2.12334e-07 0.649746 -1.23942 1 0.637423
-2.25571e-07 0.690252 -1.22117 1 0.684546
-2.35836e-07 0.721663 -1.18976 1 0.728968
-2.43088e-07 0.743855 -1.14531 1 0.770513
-2.47342e-07 0.756871 -1.08813 1 0.809016
-2.48666e-07 0.760922 -1.0187 1 0.844327
-2.47181e-07 0.756379 -0.937683 1 0.876306
-2.43058e-07 0.743764 -0.845908 1 0.904827
-2.36516e-07 0.723745 -0.744353 1 0.929776
-2.27815e-07 0.697119 -0.634137 1 0.951056
-2.17254e-07 0.664802 -0.516504 1 0.968583
-2.05164e-07 0.627805 -0.392805 1 0.982287
-1.91903e-07 0.587227 -0.264477 1 0.992115
-1.7785e-07 0.544225 -0.133026 1 0.998027
--0.0313951 0.499013 0 0.998027 1
--0.0283572 0.450728 0.131569 0.998027 0.998027
--0.0253992 0.403711 0.261604 0.998027 0.992115
--0.0225995 0.35921 0.388594 0.998027 0.982287
--0.0200336 0.318427 0.51107 0.998027 0.968583
--0.0177734 0.282501 0.62763 0.998027 0.951057
--0.015885 0.252486 0.736956 0.998027 0.929777
--0.0144283 0.229333 0.837832 0.998027 0.904827
--0.0134556 0.213872 0.929165 0.998027 0.876307
--0.0130106 0.206799 1.01 0.998027 0.844328
--0.013128 0.208664 1.07952 0.998027 0.809017
--0.0138321 0.219856 1.13708 0.998027 0.770513
--0.0151371 0.240599 1.18221 0.998027 0.728969
--0.0170465 0.270948 1.21459 0.998027 0.684547
--0.0195526 0.310782 1.2341 0.998027 0.637424
--0.0226371 0.359809 1.24079 0.998027 0.587785
--0.0262709 0.417566 1.23489 0.998027 0.535827
--0.0304146 0.483429 1.21678 0.998027 0.481754
--0.0350191 0.556616 1.18704 0.998027 0.42578
--0.0400264 0.636204 1.14638 0.998027 0.368125
--0.04537 0.72114 1.09566 0.998027 0.309017
--0.0509767 0.810255 1.03585 0.998027 0.24869
--0.0567667 0.902286 0.968055 0.998027 0.187382
--0.0626559 0.995893 0.893461 0.998027 0.125334
--0.0685563 1.08968 0.813327 0.998027 0.0627908
--0.0743779 1.18221 0.728969 0.998027 3.26795e-07
--0.0800298 1.27204 0.641734 0.998027 -0.0627902
--0.085422 1.35775 0.552981 0.998027 -0.125333
--0.0904664 1.43793 0.464058 0.998027 -0.187381
--0.0950784 1.51124 0.376284 0.998027 -0.24869
--0.0991783 1.5764 0.290924 0.998027 -0.309017
--0.102693 1.63226 0.209173 0.998027 -0.368124
--0.105555 1.67776 0.132138 0.998027 -0.425779
--0.107708 1.71198 0.0608181 0.998027 -0.481753
--0.109103 1.73414 -0.00390795 0.998027 -0.535826
--0.109701 1.74365 -0.0612948 0.998027 -0.587785
--0.109475 1.74007 -0.110742 0.998027 -0.637424
--0.10841 1.72314 -0.151801 0.998027 -0.684547
--0.106501 1.69279 -0.184183 0.998027 -0.728968
--0.103755 1.64914 -0.20776 0.998027 -0.770513
--0.100192 1.59251 -0.222566 0.998027 -0.809017
--0.0958423 1.52338 -0.228796 0.998027 -0.844328
--0.0907489 1.44242 -0.226799 0.998027 -0.876306
--0.0849643 1.35048 -0.217073 0.998027 -0.904827
--0.0785513 1.24854 -0.200254 0.998027 -0.929776
--0.0715817 1.13777 -0.177103 0.998027 -0.951056
--0.0641354 1.01941 -0.148496 0.998027 -0.968583
--0.0562992 0.894855 -0.115404 0.998027 -0.982287
--0.0481654 0.765571 -0.0788764 0.998027 -0.992115
--0.0398309 0.633097 -0.0400246 0.998027 -0.998027
--0.0313952 0.499015 -4.1838e-07 0.998027 -1
--0.0229595 0.364933 0.0400238 0.998027 -0.998027
--0.014625 0.232458 0.0788756 0.998027 -0.992115
--0.00649118 0.103175 0.115403 0.998027 -0.982287
-0.00134508 -0.0213796 0.148496 0.998027 -0.968583
-0.0087914 -0.139736 0.177103 0.998027 -0.951057
-0.015761 -0.250515 0.200253 0.998027 -0.929777
-0.022174 -0.352448 0.217073 0.998027 -0.904827
-0.0279586 -0.444392 0.226799 0.998027 -0.876307
-0.033052 -0.52535 0.228796 0.998027 -0.844328
-0.0374014 -0.594481 0.222566 0.998027 -0.809017
-0.0409645 -0.651115 0.20776 0.998027 -0.770514
-0.0437104 -0.694761 0.184184 0.998027 -0.728969
-0.0456198 -0.72511 0.151802 0.998027 -0.684548
-0.0466851 -0.742042 0.110743 0.998027 -0.637425
-0.0469106 -0.745626 0.0612959 0.998027 -0.587786
-0.0463123 -0.736118 0.00390922 0.998027 -0.535828
-0.0449177 -0.713951 -0.0608167 0.998027 -0.481754
-0.042765 -0.679733 -0.132137 0.998027 -0.42578
-0.0399025 -0.634236 -0.209172 0.998027 -0.368125
-0.0363882 -0.578377 -0.290922 0.998027 -0.309018
-0.0322883 -0.513211 -0.376282 0.998027 -0.248691
-0.0276763 -0.439905 -0.464057 0.998027 -0.187382
-0.022632 -0.359726 -0.552979 0.998027 -0.125334
-0.0172398 -0.27402 -0.641732 0.998027 -0.0627915
-0.0115878 -0.184184 -0.728967 0.998027 -9.80385e-07
-0.00576627 -0.0916527 -0.813325 0.998027 0.0627895
--0.000134134 0.002132 -0.893459 0.998027 0.125332
--0.00602332 0.0957384 -0.968054 0.998027 0.18738
--0.0118134 0.18777 -1.03585 0.998027 0.248689
--0.01742 0.276885 -1.09566 0.998027 0.309016
--0.0227637 0.361821 -1.14638 0.998027 0.368124
--0.0277709 0.441409 -1.18704 0.998027 0.425778
--0.0323755 0.514597 -1.21678 0.998027 0.481753
--0.0365192 0.580459 -1.23489 0.998027 0.535826
--0.040153 0.638217 -1.24079 0.998027 0.587784
--0.0432375 0.687244 -1.2341 0.998027 0.637423
--0.0457436 0.727078 -1.21459 0.998027 0.684546
--0.047653 0.757427 -1.18221 0.998027 0.728968
--0.0489581 0.778171 -1.13708 0.998027 0.770513
--0.0496622 0.789363 -1.07952 0.998027 0.809016
--0.0497795 0.791227 -1.01 0.998027 0.844327
--0.0493346 0.784155 -0.929167 0.998027 0.876306
--0.0483619 0.768694 -0.837834 0.998027 0.904827
--0.0469052 0.745541 -0.736958 0.998027 0.929776
--0.0450168 0.715526 -0.627633 0.998027 0.951056
--0.0427566 0.6796 -0.511073 0.998027 0.968583
--0.0401908 0.638818 -0.388596 0.998027 0.982287
--0.037391 0.594316 -0.261607 0.998027 0.992115
--0.034433 0.5473 -0.131572 0.998027 0.998027
--0.0626664 0.496057 0 0.992115 1
--0.0560878 0.443982 0.129984 0.992115 0.998027
--0.0496744 0.393214 0.258475 0.992115 0.992115
--0.0435887 0.345041 0.384002 0.992115 0.982287
--0.0379875 0.300703 0.505134 0.992115 0.968583
--0.0330193 0.261375 0.620506 0.992115 0.951057
--0.0288214 0.228146 0.728833 0.992115 0.929777
--0.0255181 0.201997 0.828931 0.992115 0.904827
--0.0232179 0.183789 0.919733 0.992115 0.876307
--0.022012 0.174243 1.0003 0.992115 0.844328
--0.0219723 0.173929 1.06985 0.992115 0.809017
--0.0231504 0.183255 1.12774 0.992115 0.770513
--0.0255765 0.202459 1.17349 0.992115 0.728969
--0.0292583 0.231604 1.20681 0.992115 0.684547
--0.0341814 0.270575 1.22757 0.992115 0.637424
--0.0403089 0.319079 1.2358 0.992115 0.587785
--0.0475818 0.37665 1.23171 0.992115 0.535827
--0.0559201 0.442654 1.21569 0.992115 0.481754
--0.0652235 0.516299 1.18827 0.992115 0.42578
--0.0753734 0.596644 1.15013 0.992115 0.368125
--0.0862341 0.682615 1.10211 0.992115 0.309017
--0.0976552 0.773023 1.04513 0.992115 0.24869
--0.109474 0.866576 0.98027 0.992115 0.187382
--0.121517 0.961907 0.908658 0.992115 0.125334
--0.133604 1.05759 0.831516 0.992115 0.0627908
--0.145551 1.15215 0.750111 0.992115 3.26795e-07
--0.15717 1.24413 0.665747 0.992115 -0.0627902
--0.168277 1.33205 0.579735 0.992115 -0.125333
--0.178691 1.41449 0.49338 0.992115 -0.187381
--0.188238 1.49006 0.407956 0.992115 -0.24869
--0.196754 1.55747 0.324689 0.992115 -0.309017
--0.204087 1.61552 0.244737 0.992115 -0.368124
--0.210101 1.66312 0.169172 0.992115 -0.425779
--0.214677 1.69935 0.0989635 0.992115 -0.481753
--0.217714 1.72339 0.0349671 0.992115 -0.535826
--0.219133 1.73462 -0.0220922 0.992115 -0.587785
--0.218878 1.7326 -0.0716276 0.992115 -0.637424
--0.216914 1.71706 -0.113199 0.992115 -0.684547
--0.213233 1.68791 -0.146521 0.992115 -0.728968
--0.207847 1.64528 -0.171459 0.992115 -0.770513
--0.200797 1.58947 -0.188041 0.992115 -0.809017
--0.192144 1.52098 -0.196443 0.992115 -0.844328
--0.181975 1.44048 -0.196996 0.992115 -0.876306
--0.170396 1.34882 -0.190168 0.992115 -0.904827
--0.157535 1.24702 -0.176565 0.992115 -0.929776
--0.143539 1.13623 -0.156913 0.992115 -0.951056
--0.12857 1.01774 -0.132045 0.992115 -0.968583
--0.112806 0.892956 -0.102889 0.992115 -0.982287
--0.096435 0.763364 -0.0704481 0.992115 -0.992115
--0.079654 0.630528 -0.0357849 0.992115 -0.998027
--0.0626666 0.496059 -3.74189e-07 0.992115 -1
--0.0456793 0.36159 0.0357841 0.992115 -0.998027
--0.0288983 0.228754 0.0704474 0.992115 -0.992115
--0.012527 0.0991615 0.102888 0.992115 -0.982287
-0.00323721 -0.0256253 0.132044 0.992115 -0.968583
-0.0182058 -0.144114 0.156912 0.992115 -0.951057
-0.0322018 -0.254904 0.176565 0.992115 -0.929777
-0.0450625 -0.356707 0.190168 0.992115 -0.904827
-0.0566414 -0.448364 0.196995 0.992115 -0.876307
-0.066811 -0.528865 0.196443 0.992115 -0.844328
-0.0754638 -0.597359 0.188041 0.992115 -0.809017
-0.0825141 -0.653169 0.17146 0.992115 -0.770514
-0.0878997 -0.695799 0.146521 0.992115 -0.728969
-0.0915815 -0.724944 0.1132 0.992115 -0.684548
-0.0935452 -0.740489 0.0716285 0.992115 -0.637425
-0.0938005 -0.742509 0.0220933 0.992115 -0.587786
-0.092381 -0.731273 -0.0349658 0.992115 -0.535828
-0.0893438 -0.707231 -0.0989621 0.992115 -0.481754
-0.0847681 -0.671011 -0.16917 0.992115 -0.42578
-0.0787541 -0.623405 -0.244735 0.992115 -0.368125
-0.071421 -0.565357 -0.324687 0.992115 -0.309018
-0.0629053 -0.497948 -0.407954 0.992115 -0.248691
-0.0533584 -0.422377 -0.493378 0.992115 -0.187382
-0.0429445 -0.339942 -0.579733 0.992115 -0.125334
-0.0318373 -0.252019 -0.665745 0.992115 -0.0627915
-0.0202179 -0.160041 -0.75011 0.992115 -9.80385e-07
-0.00827131 -0.0654744 -0.831514 0.992115 0.0627895
--0.0038159 0.030206 -0.908657 0.992115 0.125332
--0.0158589 0.125537 -0.980268 0.992115 0.18738
--0.0276775 0.21909 -1.04513 0.992115 0.248689
--0.0390985 0.309498 -1.10211 0.992115 0.309016
--0.0499593 0.395469 -1.15013 0.992115 0.368124
--0.0601092 0.475814 -1.18827 0.992115 0.425778
--0.0694126 0.549459 -1.21569 0.992115 0.481753
--0.0777509 0.615464 -1.23171 0.992115 0.535826
--0.0850239 0.673035 -1.2358 0.992115 0.587784
--0.0911513 0.721539 -1.22757 0.992115 0.637423
--0.0960745 0.76051 -1.20681 0.992115 0.684546
--0.0997563 0.789655 -1.17349 0.992115 0.728968
--0.102182 0.808859 -1.12774 0.992115 0.770513
--0.103361 0.818186 -1.06985 0.992115 0.809016
--0.103321 0.817872 -1.0003 0.992115 0.844327
--0.102115 0.808326 -0.919735 0.992115 0.876306
--0.0998148 0.790118 -0.828933 0.992115 0.904827
--0.0965115 0.76397 -0.728836 0.992115 0.929776
--0.0923137 0.73074 -0.620509 0.992115 0.951056
--0.0873455 0.691413 -0.505137 0.992115 0.968583
--0.0817443 0.647075 -0.384004 0.992115 0.982287
--0.0756587 0.598902 -0.258478 0.992115 0.992115
--0.0692453 0.548134 -0.129987 0.992115 0.998027
--0.0936905 0.491144 0 0.982287 1
--0.0830947 0.435599 0.128271 0.982287 0.998027
--0.0727547 0.381394 0.255092 0.982287 0.992115
--0.0629219 0.329849 0.379031 0.982287 0.982287
--0.0538389 0.282234 0.4987 0.982287 0.968583
--0.0457357 0.239755 0.61277 0.982287 0.951057
--0.0388251 0.203529 0.719992 0.982287 0.929777
--0.0332997 0.174564 0.819212 0.982287 0.904827
--0.0293281 0.153743 0.909392 0.982287 0.876307
--0.0270518 0.141811 0.98962 0.982287 0.844328
--0.0265832 0.139354 1.05912 0.982287 0.809017
--0.028003 0.146797 1.11728 0.982287 0.770513
--0.031359 0.16439 1.16362 0.982287 0.728969
--0.0366647 0.192204 1.19785 0.982287 0.684547
--0.0438993 0.230129 1.21982 0.982287 0.637424
--0.0530073 0.277875 1.22958 0.982287 0.587785
--0.0638995 0.334973 1.22732 0.982287 0.535827
--0.0764539 0.400786 1.2134 0.982287 0.481754
--0.0905177 0.474511 1.18832 0.982287 0.42578
--0.105909 0.555198 1.15275 0.982287 0.368125
--0.122422 0.641758 1.10747 0.982287 0.309017
--0.139824 0.732983 1.05339 0.982287 0.24869
--0.157866 0.827566 0.991517 0.982287 0.187382
--0.176284 0.924115 0.922959 0.982287 0.125334
--0.1948 1.02118 0.848884 0.982287 0.0627908
--0.213132 1.11728 0.770514 0.982287 3.26795e-07
--0.230991 1.2109 0.689103 0.982287 -0.0627902
--0.248095 1.30056 0.605917 0.982287 -0.125333
--0.264166 1.38481 0.522214 0.982287 -0.187381
--0.278934 1.46223 0.439225 0.982287 -0.24869
--0.29215 1.53151 0.358134 0.982287 -0.309017
--0.303579 1.59142 0.280059 0.982287 -0.368124
--0.31301 1.64086 0.206038 0.982287 -0.425779
--0.320261 1.67887 0.137011 0.982287 -0.481753
--0.325176 1.70464 0.0738076 0.982287 -0.535826
--0.327633 1.71752 0.0171322 0.982287 -0.587785
--0.327544 1.71705 -0.0324427 0.982287 -0.637424
--0.324854 1.70295 -0.0744861 0.982287 -0.684547
--0.319548 1.67513 -0.108714 0.982287 -0.728968
--0.311647 1.63372 -0.13499 0.982287 -0.770513
--0.301209 1.579 -0.15333 0.982287 -0.809017
--0.288329 1.51148 -0.163897 0.982287 -0.844328
--0.273135 1.43183 -0.166997 0.982287 -0.876306
--0.255793 1.34091 -0.163075 0.982287 -0.904827
--0.236494 1.23975 -0.152702 0.982287 -0.929776
--0.215464 1.1295 -0.136567 0.982287 -0.951056
--0.19295 1.01148 -0.115463 0.982287 -0.968583
--0.169221 0.887091 -0.090272 0.982287 -0.982287
--0.144566 0.757845 -0.0619503 0.982287 -0.992115
--0.119286 0.625321 -0.0315098 0.982287 -0.998027
--0.0936907 0.491145 -3.29628e-07 0.982287 -1
--0.0680954 0.356969 0.0315092 0.982287 -0.998027
--0.0428151 0.224445 0.0619497 0.982287 -0.992115
--0.0181601 0.0951986 0.0902714 0.982287 -0.982287
-0.00556841 -0.0291907 0.115462 0.982287 -0.968583
-0.0280827 -0.147215 0.136567 0.982287 -0.951057
-0.0491131 -0.25746 0.152702 0.982287 -0.929777
-0.0684112 -0.358625 0.163075 0.982287 -0.904827
-0.0857542 -0.44954 0.166997 0.982287 -0.876307
-0.100948 -0.529187 0.163897 0.982287 -0.844328
-0.113828 -0.596709 0.15333 0.982287 -0.809017
-0.124266 -0.651427 0.13499 0.982287 -0.770514
-0.132167 -0.692846 0.108714 0.982287 -0.728969
-0.137473 -0.72066 0.0744869 0.982287 -0.684548
-0.140163 -0.73476 0.0324436 0.982287 -0.637425
-0.140253 -0.735231 -0.0171311 0.982287 -0.587786
-0.137796 -0.722351 -0.0738063 0.982287 -0.535828
-0.13288 -0.696584 -0.13701 0.982287 -0.481754
-0.12563 -0.658574 -0.206036 0.982287 -0.42578
-0.116198 -0.609131 -0.280057 0.982287 -0.368125
-0.104769 -0.54922 -0.358132 0.982287 -0.309018
-0.0915538 -0.479943 -0.439223 0.982287 -0.248691
-0.0767849 -0.402521 -0.522212 0.982287 -0.187382
-0.0607148 -0.318279 -0.605915 0.982287 -0.125334
-0.0436108 -0.228616 -0.689101 0.982287 -0.0627915
-0.0257509 -0.134991 -0.770512 0.982287 -9.80385e-07
-0.00741972 -0.0388956 -0.848882 0.982287 0.0627895
--0.0110966 0.0581705 -0.922957 0.982287 0.125332
--0.0295143 0.15472 -0.991516 0.982287 0.18738
--0.0475569 0.249302 -1.05339 0.982287 0.248689
--0.0649591 0.340528 -1.10747 0.982287 0.309016
--0.0814712 0.427088 -1.15275 0.982287 0.368124
--0.096863 0.507774 -1.18832 0.982287 0.425778
--0.110927 0.5815 -1.2134 0.982287 0.481753
--0.123481 0.647313 -1.22732 0.982287 0.535826
--0.134373 0.704412 -1.22958 0.982287 0.587784
--0.143481 0.752158 -1.21982 0.982287 0.637423
--0.150716 0.790083 -1.19785 0.982287 0.684546
--0.156022 0.817897 -1.16362 0.982287 0.728968
--0.159378 0.83549 -1.11728 0.982287 0.770513
--0.160798 0.842933 -1.05912 0.982287 0.809016
--0.160329 0.840477 -0.989622 0.982287 0.844327
--0.158053 0.828544 -0.909394 0.982287 0.876306
--0.154081 0.807724 -0.819214 0.982287 0.904827
--0.148556 0.778759 -0.719994 0.982287 0.929776
--0.141645 0.742533 -0.612772 0.982287 0.951056
--0.133542 0.700054 -0.498703 0.982287 0.968583
--0.124459 0.65244 -0.379034 0.982287 0.982287
--0.114626 0.600894 -0.255094 0.982287 0.992115
--0.104286 0.54669 -0.128274 0.982287 0.998027
--0.124345 0.484292 0 0.968583 1
--0.109287 0.425646 0.126432 0.968583 0.998027
--0.0945801 0.368366 0.251456 0.968583 0.992115
--0.0805684 0.313794 0.373686 0.968583 0.982287
--0.0675848 0.263226 0.491774 0.968583 0.968583
--0.0559445 0.21789 0.604429 0.968583 0.951057
--0.0459399 0.178924 0.710439 0.968583 0.929777
--0.0378352 0.147359 0.808685 0.968583 0.904827
--0.0318622 0.124095 0.898155 0.968583 0.876307
--0.028216 0.109894 0.977961 0.968583 0.844328
--0.0270514 0.105358 1.04735 0.968583 0.809017
--0.0284806 0.110925 1.10571 0.968583 0.770513
--0.0325704 0.126854 1.1526 0.968583 0.728969
--0.0393413 0.153224 1.1877 0.968583 0.684547
--0.0487665 0.189933 1.21088 0.968583 0.637424
--0.0607723 0.236693 1.22216 0.968583 0.587785
--0.0752388 0.293036 1.22172 0.968583 0.535827
--0.0920013 0.358322 1.20991 0.968583 0.481754
--0.110853 0.431746 1.18721 0.968583 0.42578
--0.131549 0.51235 1.15423 0.968583 0.368125
--0.153806 0.599037 1.11174 0.968583 0.309017
--0.177313 0.690591 1.0606 0.968583 0.24869
--0.201731 0.785691 1.00179 0.968583 0.187382
--0.226698 0.882932 0.936348 0.968583 0.125334
--0.251839 0.98085 0.865414 0.968583 0.0627908
--0.276768 1.07794 0.790155 0.968583 3.26795e-07
--0.301096 1.17269 0.711778 0.968583 -0.0627902
--0.324435 1.26359 0.631501 0.968583 -0.125333
--0.346406 1.34916 0.550533 0.968583 -0.187381
--0.366646 1.42799 0.470061 0.968583 -0.24869
--0.38481 1.49874 0.391225 0.968583 -0.309017
--0.40058 1.56016 0.315104 0.968583 -0.368124
--0.41367 1.61114 0.242701 0.968583 -0.425779
--0.423828 1.6507 0.174924 0.968583 -0.481753
--0.430842 1.67802 0.112575 0.968583 -0.535826
--0.434544 1.69244 0.0563397 0.968583 -0.587785
--0.434812 1.69348 0.00677422 0.968583 -0.637424
--0.431572 1.68087 -0.0356993 0.968583 -0.684547
--0.424801 1.6545 -0.0707993 0.968583 -0.728968
--0.414526 1.61447 -0.0983871 0.968583 -0.770513
--0.400823 1.5611 -0.118468 0.968583 -0.809017
--0.383819 1.49488 -0.131189 0.968583 -0.844328
--0.363689 1.41648 -0.136835 0.968583 -0.876306
--0.340652 1.32675 -0.135822 0.968583 -0.904827
--0.314972 1.22674 -0.128689 0.968583 -0.929776
--0.286948 1.11759 -0.116087 0.968583 -0.951056
--0.256917 1.00063 -0.098767 0.968583 -0.968583
--0.225244 0.877269 -0.0775662 0.968583 -0.982287
--0.192317 0.749027 -0.0533914 0.968583 -0.992115
--0.158544 0.61749 -0.0272037 0.968583 -0.998027
--0.124345 0.484293 -2.84743e-07 0.968583 -1
--0.090146 0.351096 0.0272031 0.968583 -0.998027
--0.056373 0.219559 0.0533909 0.968583 -0.992115
--0.0234461 0.0913167 0.0775657 0.968583 -0.982287
-0.00822726 -0.0320431 0.0987665 0.968583 -0.968583
-0.0382581 -0.149006 0.116086 0.968583 -0.951057
-0.0662815 -0.25815 0.128688 0.968583 -0.929777
-0.0919621 -0.358169 0.135821 0.968583 -0.904827
-0.114999 -0.447891 0.136835 0.968583 -0.876307
-0.135129 -0.526294 0.131189 0.968583 -0.844328
-0.152133 -0.59252 0.118468 0.968583 -0.809017
-0.165836 -0.64589 0.0983875 0.968583 -0.770514
-0.176112 -0.685911 0.0707999 0.968583 -0.728969
-0.182883 -0.712282 0.0357001 0.968583 -0.684548
-0.186122 -0.724899 -0.00677327 0.968583 -0.637425
-0.185854 -0.723856 -0.0563386 0.968583 -0.587786
-0.182152 -0.709437 -0.112574 0.968583 -0.535828
-0.175138 -0.68212 -0.174922 0.968583 -0.481754
-0.164981 -0.642559 -0.242699 0.968583 -0.42578
-0.151891 -0.591578 -0.315103 0.968583 -0.368125
-0.136121 -0.530156 -0.391223 0.968583 -0.309018
-0.117957 -0.459411 -0.470059 0.968583 -0.248691
-0.097717 -0.380583 -0.550532 0.968583 -0.187382
-0.0757456 -0.29501 -0.631499 0.968583 -0.125334
-0.0524068 -0.204111 -0.711777 0.968583 -0.0627915
-0.0280792 -0.109362 -0.790154 0.968583 -9.80385e-07
-0.00315008 -0.0122688 -0.865412 0.968583 0.0627895
--0.021991 0.0856496 -0.936347 0.968583 0.125332
--0.0469583 0.182891 -1.00178 0.968583 0.18738
--0.0713756 0.27799 -1.0606 0.968583 0.248689
--0.0948826 0.369544 -1.11174 0.968583 0.309016
--0.11714 0.456232 -1.15423 0.968583 0.368124
--0.137836 0.536836 -1.18721 0.968583 0.425778
--0.156688 0.61026 -1.20991 0.968583 0.481753
--0.17345 0.675546 -1.22172 0.968583 0.535826
--0.187917 0.731889 -1.22216 0.968583 0.587784
--0.199923 0.778649 -1.21088 0.968583 0.637423
--0.209348 0.815358 -1.1877 0.968583 0.684546
--0.216119 0.841729 -1.1526 0.968583 0.728968
--0.220209 0.857658 -1.10572 0.968583 0.770513
--0.221638 0.863225 -1.04735 0.968583 0.809016
--0.220474 0.858689 -0.977963 0.968583 0.844327
--0.216827 0.844488 -0.898156 0.968583 0.876306
--0.210854 0.821225 -0.808687 0.968583 0.904827
--0.20275 0.78966 -0.710441 0.968583 0.929776
--0.192745 0.750694 -0.604431 0.968583 0.951056
--0.181105 0.705358 -0.491776 0.968583 0.968583
--0.168121 0.654791 -0.373689 0.968583 0.982287
--0.15411 0.600219 -0.251459 0.968583 0.992115
--0.139403 0.542939 -0.126434 0.968583 0.998027
--0.154508 0.475528 0 0.951057 1
--0.13458 0.414195 0.124468 0.951057 0.998027
--0.115101 0.354245 0.247573 0.951057 0.992115
--0.0965124 0.297035 0.367973 0.951057 0.982287
--0.079241 0.243879 0.484362 0.951057 0.968583
--0.0636907 0.19602 0.595491 0.951057 0.951057
--0.0502363 0.154611 0.700186 0.951057 0.929777
--0.0392169 0.120697 0.797359 0.951057 0.904827
--0.0309302 0.0951934 0.88603 0.951057 0.876307
--0.025627 0.0788719 0.965337 0.951057 0.844328
--0.0235071 0.0723477 1.03455 0.951057 0.809017
--0.0247156 0.076067 1.09306 0.951057 0.770513
--0.02934 0.0902993 1.14044 0.951057 0.728969
--0.0374085 0.115132 1.17637 0.951057 0.684547
--0.0488893 0.150466 1.20073 0.951057 0.637424
--0.0636906 0.19602 1.21353 0.951057 0.587785
--0.0816617 0.251329 1.21492 0.951057 0.535827
--0.102595 0.315755 1.20523 0.951057 0.481754
--0.126229 0.388493 1.18492 0.951057 0.42578
--0.152252 0.468584 1.15457 0.951057 0.368125
--0.180308 0.554931 1.11491 0.951057 0.309017
--0.209999 0.646311 1.06677 0.951057 0.24869
--0.240895 0.741401 1.01107 0.951057 0.187382
--0.272539 0.83879 0.948814 0.951057 0.125334
--0.304452 0.937008 0.88109 0.951057 0.0627908
--0.336144 1.03455 0.809017 0.951057 3.26795e-07
--0.367118 1.12988 0.733752 0.951057 -0.0627902
--0.396884 1.22148 0.656462 0.951057 -0.125333
--0.424957 1.30789 0.578309 0.951057 -0.187381
--0.450875 1.38765 0.500433 0.951057 -0.24869
--0.4742 1.45944 0.42393 0.951057 -0.309017
--0.494525 1.52199 0.349839 0.951057 -0.368124
--0.511485 1.57419 0.279124 0.951057 -0.425779
--0.524758 1.61504 0.212664 0.951057 -0.481753
--0.534075 1.64371 0.151232 0.951057 -0.535826
--0.539218 1.65955 0.0954916 0.951057 -0.587785
--0.540032 1.66205 0.0459845 0.951057 -0.637424
--0.536421 1.65094 0.00312268 0.951057 -0.684547
--0.528353 1.6261 -0.0328151 0.951057 -0.728968
--0.515859 1.58765 -0.0616871 0.951057 -0.770513
--0.499035 1.53587 -0.0834888 0.951057 -0.809017
--0.47804 1.47126 -0.0983511 0.951057 -0.844328
--0.453094 1.39448 -0.106537 0.951057 -0.876306
--0.424473 1.3064 -0.108434 0.951057 -0.904827
--0.39251 1.20802 -0.104548 0.951057 -0.929776
--0.357583 1.10053 -0.0954917 0.951057 -0.951056
--0.320118 0.985223 -0.0819736 0.951057 -0.968583
--0.280575 0.863522 -0.0647838 0.951057 -0.982287
--0.239446 0.73694 -0.0447798 0.951057 -0.992115
--0.197247 0.607065 -0.0228707 0.951057 -0.998027
--0.154509 0.47553 -2.39576e-07 0.951057 -1
--0.111771 0.343995 0.0228702 0.951057 -0.998027
--0.0695714 0.214119 0.0447794 0.951057 -0.992115
--0.0284427 0.0875376 0.0647834 0.951057 -0.982287
-0.0111004 -0.0341636 0.0819733 0.951057 -0.968583
-0.0485658 -0.14947 0.0954915 0.951057 -0.951057
-0.0834923 -0.256963 0.104548 0.951057 -0.929777
-0.115456 -0.355337 0.108434 0.951057 -0.904827
-0.144077 -0.443423 0.106537 0.951057 -0.876307
-0.169023 -0.5202 0.0983514 0.951057 -0.844328
-0.190018 -0.584816 0.0834892 0.951057 -0.809017
-0.206842 -0.636594 0.0616877 0.951057 -0.770514
-0.219336 -0.675047 0.0328158 0.951057 -0.728969
-0.227405 -0.69988 -0.00312186 0.951057 -0.684548
-0.231016 -0.710994 -0.0459835 0.951057 -0.637425
-0.230202 -0.708489 -0.0954905 0.951057 -0.587786
-0.225058 -0.692659 -0.151231 0.951057 -0.535828
-0.215742 -0.663986 -0.212662 0.951057 -0.481754
-0.202469 -0.623135 -0.279123 0.951057 -0.42578
-0.185509 -0.570938 -0.349837 0.951057 -0.368125
-0.165184 -0.508384 -0.423928 0.951057 -0.309018
-0.141859 -0.436599 -0.500431 0.951057 -0.248691
-0.115941 -0.356831 -0.578308 0.951057 -0.187382
-0.0878677 -0.270429 -0.65646 0.951057 -0.125334
-0.0581025 -0.178821 -0.73375 0.951057 -0.0627915
-0.0271276 -0.0834904 -0.809016 0.951057 -9.80385e-07
--0.00456403 0.0140466 -0.881088 0.951057 0.0627895
--0.036477 0.112265 -0.948813 0.951057 0.125332
--0.0681206 0.209654 -1.01106 0.951057 0.18738
--0.099017 0.304743 -1.06677 0.951057 0.248689
--0.128708 0.396124 -1.11491 0.951057 0.309016
--0.156764 0.482471 -1.15457 0.951057 0.368124
--0.182787 0.562562 -1.18492 0.951057 0.425778
--0.206421 0.6353 -1.20523 0.951057 0.481753
--0.227355 0.699726 -1.21492 0.951057 0.535826
--0.245326 0.755036 -1.21353 0.951057 0.587784
--0.260127 0.80059 -1.20073 0.951057 0.637423
--0.271608 0.835924 -1.17637 0.951057 0.684546
--0.279677 0.860757 -1.14044 0.951057 0.728968
--0.284301 0.874989 -1.09306 0.951057 0.770513
--0.285509 0.878709 -1.03455 0.951057 0.809016
--0.28339 0.872185 -0.965338 0.951057 0.844327
--0.278087 0.855864 -0.886032 0.951057 0.876306
--0.2698 0.83036 -0.797361 0.951057 0.904827
--0.258781 0.796446 -0.700188 0.951057 0.929776
--0.245326 0.755038 -0.595494 0.951057 0.951056
--0.229776 0.707179 -0.484364 0.951057 0.968583
--0.212505 0.654023 -0.367975 0.951057 0.982287
--0.193916 0.596813 -0.247575 0.951057 0.992115
--0.174437 0.536863 -0.12447 0.951057 0.998027
--0.184062 0.464888 0 0.929777 1
--0.158894 0.401322 0.122381 0.929777 0.998027
--0.134277 0.339146 0.243445 0.929777 0.992115
--0.110752 0.279728 0.361896 0.929777 0.982287
--0.0888414 0.224388 0.476472 0.929777 0.968583
--0.0690409 0.174377 0.585966 0.929777 0.951057
--0.0518103 0.130858 0.689241 0.929777 0.929777
--0.037566 0.094881 0.785246 0.929777 0.904827
--0.0266738 0.0673704 0.873032 0.929777 0.876307
--0.0194424 0.0491059 0.95176 0.929777 0.844328
--0.016118 0.0407095 1.02072 0.929777 0.809017
--0.0168803 0.0426348 1.07933 0.929777 0.770513
--0.0218387 0.0551583 1.12715 0.929777 0.728969
--0.0310302 0.0783735 1.16389 0.929777 0.684547
--0.0444186 0.112189 1.1894 0.929777 0.637424
--0.0618945 0.156328 1.2037 0.929777 0.587785
--0.0832763 0.210332 1.20692 0.929777 0.535827
--0.108313 0.273568 1.19936 0.929777 0.481754
--0.136689 0.345237 1.18146 0.929777 0.42578
--0.168025 0.424384 1.15377 0.929777 0.368125
--0.201889 0.509915 1.11698 0.929777 0.309017
--0.237799 0.600613 1.07188 0.929777 0.24869
--0.275231 0.695155 1.01935 0.929777 0.187382
--0.313629 0.792136 0.960343 0.929777 0.125334
--0.35241 0.890087 0.895896 0.929777 0.0627908
--0.390978 0.9875 0.827081 0.929777 3.26795e-07
--0.42873 1.08285 0.755001 0.929777 -0.0627902
--0.465065 1.17462 0.680775 0.929777 -0.125333
--0.499396 1.26133 0.605514 0.929777 -0.187381
--0.531157 1.34155 0.530311 0.929777 -0.24869
--0.559813 1.41393 0.456216 0.929777 -0.309017
--0.584871 1.47722 0.384228 0.929777 -0.368124
--0.605883 1.53029 0.315272 0.929777 -0.425779
--0.622455 1.57214 0.250194 0.929777 -0.481753
--0.634259 1.60196 0.189739 0.929777 -0.535826
--0.641028 1.61905 0.134549 0.929777 -0.587785
--0.642569 1.62295 0.0851493 0.929777 -0.637424
--0.638765 1.61334 0.0419416 0.929777 -0.684547
--0.629574 1.59012 0.0052014 0.929777 -0.728968
--0.615031 1.55339 -0.0249264 0.929777 -0.770513
--0.595251 1.50344 -0.0484274 0.929777 -0.809017
--0.570425 1.44073 -0.0654164 0.929777 -0.844328
--0.540816 1.36595 -0.0761337 0.929777 -0.876306
--0.50676 1.27993 -0.0809391 0.929777 -0.904827
--0.468656 1.18369 -0.0803041 0.929777 -0.929776
--0.426965 1.07839 -0.0748026 0.929777 -0.951056
--0.382199 0.965326 -0.0650994 0.929777 -0.968583
--0.334917 0.845905 -0.0519375 0.929777 -0.982287
--0.285714 0.721633 -0.036124 0.929777 -0.992115
--0.235215 0.594086 -0.0185151 0.929777 -0.998027
--0.184063 0.46489 -1.94173e-07 0.929777 -1
--0.13291 0.335693 0.0185147 0.929777 -0.998027
--0.0824109 0.208146 0.0361236 0.929777 -0.992115
--0.0332081 0.0838741 0.0519372 0.929777 -0.982287
-0.0140742 -0.0355473 0.0650991 0.929777 -0.968583
-0.0588401 -0.148613 0.0748024 0.929777 -0.951057
-0.100531 -0.253914 0.080304 0.929777 -0.929777
-0.138635 -0.350153 0.0809391 0.929777 -0.904827
-0.172691 -0.436169 0.0761339 0.929777 -0.876307
-0.2023 -0.510953 0.0654167 0.929777 -0.844328
-0.227127 -0.573657 0.0484278 0.929777 -0.809017
-0.246907 -0.623616 0.0249269 0.929777 -0.770514
-0.261449 -0.660347 -0.0052007 0.929777 -0.728969
-0.270641 -0.683562 -0.0419408 0.929777 -0.684548
-0.274445 -0.69317 -0.0851483 0.929777 -0.637425
-0.272904 -0.689276 -0.134548 0.929777 -0.587786
-0.266135 -0.67218 -0.189738 0.929777 -0.535828
-0.254332 -0.642369 -0.250192 0.929777 -0.481754
-0.237759 -0.600511 -0.315271 0.929777 -0.42578
-0.216747 -0.547442 -0.384226 0.929777 -0.368125
-0.19169 -0.484153 -0.456215 0.929777 -0.309018
-0.163033 -0.411775 -0.530309 0.929777 -0.248691
-0.131272 -0.331556 -0.605513 0.929777 -0.187382
-0.0969416 -0.244847 -0.680773 0.929777 -0.125334
-0.0606067 -0.153075 -0.755 0.929777 -0.0627915
-0.0228551 -0.0577253 -0.827079 0.929777 -9.80385e-07
--0.0157132 0.0396871 -0.895895 0.929777 0.0627895
--0.0544947 0.137638 -0.960342 0.929777 0.125332
--0.0928923 0.234619 -1.01935 0.929777 0.18738
--0.130324 0.329162 -1.07188 0.929777 0.248689
--0.166234 0.41986 -1.11698 0.929777 0.309016
--0.200098 0.505391 -1.15377 0.929777 0.368124
--0.231435 0.584538 -1.18146 0.929777 0.425778
--0.25981 0.656207 -1.19936 0.929777 0.481753
--0.284847 0.719443 -1.20692 0.929777 0.535826
--0.306229 0.773448 -1.2037 0.929777 0.587784
--0.323705 0.817587 -1.1894 0.929777 0.637423
--0.337094 0.851403 -1.16389 0.929777 0.684546
--0.346285 0.874618 -1.12715 0.929777 0.728968
--0.351244 0.887142 -1.07933 0.929777 0.770513
--0.352006 0.889067 -1.02072 0.929777 0.809016
--0.348682 0.880671 -0.951762 0.929777 0.844327
--0.341451 0.862407 -0.873033 0.929777 0.876306
--0.330558 0.834896 -0.785248 0.929777 0.904827
--0.316314 0.79892 -0.689243 0.929777 0.929776
--0.299084 0.7554 -0.585968 0.929777 0.951056
--0.279283 0.70539 -0.476475 0.929777 0.968583
--0.257373 0.65005 -0.361899 0.929777 0.982287
--0.233847 0.590631 -0.243448 0.929777 0.992115
--0.20923 0.528456 -0.122383 0.929777 0.998027
--0.212889 0.452414 0 0.904827 1
--0.182158 0.387105 0.120173 0.904827 0.998027
--0.15208 0.323187 0.239077 0.904827 0.992115
--0.1233 0.262025 0.355462 0.904827 0.982287
--0.0964375 0.20494 0.468112 0.904827 0.968583
--0.0720828 0.153184 0.575863 0.904827 0.951057
--0.0507822 0.107918 0.677616 0.904827 0.929777
--0.0330312 0.070195 0.772359 0.904827 0.904827
--0.0192653 0.0409408 0.859172 0.904827 0.876307
--0.00985245 0.0209376 0.937244 0.904827 0.844328
--0.00508709 0.0108106 1.00589 0.904827 0.809017
--0.0051845 0.0110176 1.06453 0.904827 0.770513
--0.010277 0.0218398 1.11275 0.904827 0.728969
--0.0204115 0.0433767 1.15026 0.904827 0.684547
--0.0355479 0.0755433 1.1769 0.904827 0.637424
--0.0555597 0.11807 1.19268 0.904827 0.587785
--0.080235 0.170508 1.19772 0.904827 0.535827
--0.10928 0.232232 1.1923 0.904827 0.481754
--0.142323 0.302452 1.17683 0.904827 0.42578
--0.178919 0.380224 1.15184 0.904827 0.368125
--0.21856 0.464464 1.11795 0.904827 0.309017
--0.260677 0.553966 1.07594 0.904827 0.24869
--0.304652 0.64742 1.02662 0.904827 0.187382
--0.349831 0.743429 0.970925 0.904827 0.125334
--0.395526 0.840536 0.909819 0.904827 0.0627908
--0.441033 0.937244 0.844328 0.904827 3.26795e-07
--0.48564 1.03204 0.775505 0.904827 -0.0627902
--0.528637 1.12341 0.704416 0.904827 -0.125333
--0.569332 1.20989 0.632122 0.904827 -0.187381
--0.607054 1.29006 0.559666 0.904827 -0.24869
--0.641174 1.36257 0.488053 0.904827 -0.309017
--0.671105 1.42617 0.418238 0.904827 -0.368124
--0.696317 1.47975 0.351109 0.904827 -0.425779
--0.716347 1.52232 0.287477 0.904827 -0.481753
--0.7308 1.55303 0.228059 0.904827 -0.535826
--0.739364 1.57123 0.173474 0.904827 -0.587785
--0.741807 1.57642 0.12423 0.904827 -0.637424
--0.737987 1.5683 0.0807192 0.904827 -0.684547
--0.727852 1.54677 0.0432128 0.904827 -0.728968
--0.711443 1.5119 0.011859 0.904827 -0.770513
--0.688891 1.46397 -0.0133181 0.904827 -0.809017
--0.660418 1.40346 -0.0324171 0.904827 -0.844328
--0.626332 1.33103 -0.0456556 0.904827 -0.876306
--0.587026 1.24749 -0.0533644 0.904827 -0.904827
--0.542968 1.15387 -0.055981 0.904827 -0.929776
--0.494697 1.05129 -0.0540396 0.904827 -0.951056
--0.442816 0.941033 -0.0481609 0.904827 -0.968583
--0.38798 0.824499 -0.0390399 0.904827 -0.982287
--0.330887 0.703172 -0.0274325 0.904827 -0.992115
--0.272272 0.578609 -0.0141413 0.904827 -0.998027
--0.21289 0.452415 -1.48578e-07 0.904827 -1
--0.153508 0.326221 0.014141 0.904827 -0.998027
--0.0948928 0.201658 0.0274323 0.904827 -0.992115
--0.0378005 0.0803303 0.0390397 0.904827 -0.982287
-0.017036 -0.0362034 0.0481607 0.904827 -0.968583
-0.0689173 -0.146457 0.0540395 0.904827 -0.951057
-0.117188 -0.249037 0.055981 0.904827 -0.929777
-0.161246 -0.342666 0.0533645 0.904827 -0.904827
-0.200553 -0.426196 0.0456558 0.904827 -0.876307
-0.234638 -0.498632 0.0324175 0.904827 -0.844328
-0.263112 -0.559142 0.0133186 0.904827 -0.809017
-0.285664 -0.607067 -0.0118584 0.904827 -0.770514
-0.302073 -0.641939 -0.0432121 0.904827 -0.728969
-0.312208 -0.663476 -0.0807183 0.904827 -0.684548
-0.316028 -0.671594 -0.124229 0.904827 -0.637425
-0.313585 -0.666402 -0.173473 0.904827 -0.587786
-0.305021 -0.648204 -0.228058 0.904827 -0.535828
-0.290568 -0.617489 -0.287476 0.904827 -0.481754
-0.270539 -0.574925 -0.351108 0.904827 -0.42578
-0.245326 -0.521346 -0.418236 0.904827 -0.368125
-0.215396 -0.45774 -0.488051 0.904827 -0.309018
-0.181276 -0.385232 -0.559664 0.904827 -0.248691
-0.143554 -0.305067 -0.63212 0.904827 -0.187382
-0.102859 -0.218587 -0.704414 0.904827 -0.125334
-0.0598618 -0.127213 -0.775504 0.904827 -0.0627915
-0.0152551 -0.0324187 -0.844327 0.904827 -9.80385e-07
--0.030252 0.0642889 -0.909818 0.904827 0.0627895
--0.0759471 0.161396 -0.970924 0.904827 0.125332
--0.121126 0.257405 -1.02662 0.904827 0.18738
--0.165101 0.350859 -1.07594 0.904827 0.248689
--0.207218 0.440361 -1.11795 0.904827 0.309016
--0.246859 0.524602 -1.15183 0.904827 0.368124
--0.283455 0.602374 -1.17683 0.904827 0.425778
--0.316498 0.672594 -1.1923 0.904827 0.481753
--0.345543 0.734318 -1.19772 0.904827 0.535826
--0.370219 0.786756 -1.19268 0.904827 0.587784
--0.390231 0.829283 -1.1769 0.904827 0.637423
--0.405367 0.86145 -1.15026 0.904827 0.684546
--0.415502 0.882987 -1.11275 0.904827 0.728968
--0.420594 0.893809 -1.06453 0.904827 0.770513
--0.420692 0.894017 -1.00589 0.904827 0.809016
--0.415927 0.88389 -0.937246 0.904827 0.844327
--0.406514 0.863887 -0.859173 0.904827 0.876306
--0.392748 0.834633 -0.772361 0.904827 0.904827
--0.374997 0.79691 -0.677619 0.904827 0.929776
--0.353697 0.751644 -0.575865 0.904827 0.951056
--0.329342 0.699888 -0.468115 0.904827 0.968583
--0.30248 0.642803 -0.355465 0.904827 0.982287
--0.273699 0.581641 -0.239079 0.904827 0.992115
--0.243622 0.517723 -0.120175 0.904827 0.998027
--0.240877 0.438153 0 0.876307 1
--0.204304 0.371627 0.117846 0.876307 0.998027
--0.168489 0.306481 0.234473 0.876307 0.992115
--0.13418 0.244073 0.348678 0.876307 0.982287
--0.102097 0.185714 0.45929 0.876307 0.968583
--0.0729236 0.132648 0.565191 0.876307 0.951057
--0.0472949 0.0860291 0.665323 0.876307 0.929777
--0.0257865 0.0469055 0.758709 0.876307 0.904827
--0.00890486 0.0161979 0.844463 0.876307 0.876307
-0.00292155 -0.00531428 0.921803 0.876307 0.844328
-0.00934941 -0.0170065 0.990059 0.876307 0.809017
-0.0101267 -0.0184204 1.04868 0.876307 0.770513
-0.0050972 -0.00927179 1.09726 0.876307 0.728969
--0.00579638 0.0105436 1.13549 0.876307 0.684547
--0.0225111 0.0409475 1.16324 0.876307 0.637424
--0.0449037 0.0816796 1.18048 0.876307 0.587785
--0.0727328 0.132301 1.18734 0.876307 0.535827
--0.105662 0.192199 1.18407 0.876307 0.481754
--0.143264 0.260597 1.17105 0.876307 0.42578
--0.18503 0.336569 1.14876 0.876307 0.368125
--0.230372 0.419046 1.11782 0.876307 0.309017
--0.278638 0.506841 1.07893 0.876307 0.24869
--0.329117 0.598662 1.03289 0.876307 0.187382
--0.381052 0.693132 0.980548 0.876307 0.125334
--0.433654 0.788814 0.922844 0.876307 0.0627908
--0.486109 0.88423 0.860742 0.876307 3.26795e-07
--0.537596 0.977885 0.795244 0.876307 -0.0627902
--0.587298 1.06829 0.727362 0.876307 -0.125333
--0.634414 1.154 0.658106 0.876307 -0.187381
--0.678171 1.23359 0.588468 0.876307 -0.24869
--0.71784 1.30575 0.519407 0.876307 -0.309017
--0.752746 1.36924 0.451835 0.876307 -0.368124
--0.782275 1.42295 0.3866 0.876307 -0.425779
--0.805889 1.46591 0.324476 0.876307 -0.481753
--0.823134 1.49728 0.266154 0.876307 -0.535826
--0.833644 1.51639 0.212228 0.876307 -0.587785
--0.837152 1.52278 0.163188 0.876307 -0.637424
--0.83349 1.51612 0.119417 0.876307 -0.684547
--0.822597 1.4963 0.0811815 0.876307 -0.728968
--0.804514 1.46341 0.0486327 0.876307 -0.770513
--0.779391 1.41771 0.0218043 0.876307 -0.809017
--0.747479 1.35966 0.000614128 0.876307 -0.844328
--0.709132 1.28991 -0.0151323 0.876307 -0.876306
--0.664797 1.20926 -0.0257371 0.876307 -0.904827
--0.615011 1.1187 -0.0316027 0.876307 -0.929776
--0.560392 1.01935 -0.0332233 0.876307 -0.951056
--0.501631 0.912464 -0.0311749 0.876307 -0.968583
--0.439478 0.799408 -0.0261038 0.876307 -0.982287
--0.374736 0.681643 -0.018714 0.876307 -0.992115
--0.308247 0.5607 -0.00975349 0.876307 -0.998027
--0.240877 0.438155 -1.02837e-07 0.876307 -1
--0.173508 0.31561 0.0097533 0.876307 -0.998027
--0.107019 0.194666 0.0187138 0.876307 -0.992115
--0.0422769 0.0769015 0.0261037 0.876307 -0.982287
-0.019876 -0.0361544 0.0311748 0.876307 -0.968583
-0.0786378 -0.143042 0.0332233 0.876307 -0.951057
-0.133257 -0.242393 0.0316028 0.876307 -0.929777
-0.183043 -0.332954 0.0257373 0.876307 -0.904827
-0.227378 -0.413599 0.0151326 0.876307 -0.876307
-0.265725 -0.483353 -0.000613745 0.876307 -0.844328
-0.297637 -0.5414 -0.0218038 0.876307 -0.809017
-0.322761 -0.5871 -0.0486321 0.876307 -0.770514
-0.340843 -0.619992 -0.0811808 0.876307 -0.728969
-0.351737 -0.639808 -0.119416 0.876307 -0.684548
-0.355399 -0.646468 -0.163187 0.876307 -0.637425
-0.351891 -0.640088 -0.212227 0.876307 -0.587786
-0.341381 -0.620969 -0.266153 0.876307 -0.535828
-0.324136 -0.589602 -0.324475 0.876307 -0.481754
-0.300522 -0.546648 -0.386598 0.876307 -0.42578
-0.270993 -0.492935 -0.451834 0.876307 -0.368125
-0.236088 -0.429443 -0.519406 0.876307 -0.309018
-0.196419 -0.357284 -0.588466 0.876307 -0.248691
-0.152661 -0.27769 -0.658104 0.876307 -0.187382
-0.105546 -0.191987 -0.72736 0.876307 -0.125334
-0.055844 -0.10158 -0.795243 0.876307 -0.0627915
-0.00435663 -0.0079247 -0.860741 0.876307 -9.80385e-07
--0.0480986 0.0874911 -0.922842 0.876307 0.0627895
--0.1007 0.183173 -0.980547 0.876307 0.125332
--0.152636 0.277643 -1.03289 0.876307 0.18738
--0.203114 0.369464 -1.07893 0.876307 0.248689
--0.25138 0.457259 -1.11782 0.876307 0.309016
--0.296722 0.539737 -1.14876 0.876307 0.368124
--0.338488 0.615708 -1.17105 0.876307 0.425778
--0.376091 0.684107 -1.18407 0.876307 0.481753
--0.40902 0.744005 -1.18734 0.876307 0.535826
--0.436849 0.794626 -1.18048 0.876307 0.587784
--0.459242 0.835359 -1.16324 0.876307 0.637423
--0.475957 0.865763 -1.13549 0.876307 0.684546
--0.48685 0.885578 -1.09726 0.876307 0.728968
--0.49188 0.894727 -1.04868 0.876307 0.770513
--0.491103 0.893314 -0.99006 0.876307 0.809016
--0.484675 0.881622 -0.921805 0.876307 0.844327
--0.472849 0.86011 -0.844465 0.876307 0.876306
--0.455967 0.829402 -0.758711 0.876307 0.904827
--0.434459 0.790279 -0.665325 0.876307 0.929776
--0.40883 0.74366 -0.565193 0.876307 0.951056
--0.379657 0.690594 -0.459293 0.876307 0.968583
--0.347574 0.632235 -0.34868 0.876307 0.982287
--0.313265 0.569827 -0.234475 0.876307 0.992115
--0.27745 0.504681 -0.117849 0.876307 0.998027
--0.267913 0.422164 0 0.844328 1
--0.225272 0.354972 0.115403 0.844328 0.998027
--0.183494 0.289141 0.229638 0.844328 0.992115
--0.143431 0.226011 0.341549 0.844328 0.982287
--0.105903 0.166876 0.450015 0.844328 0.968583
--0.0716883 0.112963 0.553961 0.844328 0.951057
--0.0415117 0.0654121 0.652373 0.844328 0.929777
--0.0160293 0.0252581 0.744311 0.844328 0.904827
-0.00418125 -0.0065886 0.828922 0.844328 0.876307
-0.0186303 -0.0293566 0.905452 0.844328 0.844328
-0.0269249 -0.0424268 0.973255 0.844328 0.809017
-0.0287757 -0.0453432 1.0318 0.844328 0.770513
-0.0240019 -0.037821 1.08068 0.844328 0.728969
-0.0125351 -0.0197522 1.1196 0.844328 0.684547
--0.00557948 0.00879186 1.14843 0.844328 0.637424
--0.030183 0.0475609 1.16712 0.844328 0.587785
--0.061005 0.0961286 1.17579 0.844328 0.535827
--0.0976671 0.153899 1.17467 0.844328 0.481754
--0.139689 0.220114 1.1641 0.844328 0.42578
--0.186494 0.293868 1.14455 0.844328 0.368125
--0.237422 0.374117 1.11659 0.844328 0.309017
--0.291733 0.459698 1.08086 0.844328 0.24869
--0.348625 0.549345 1.03813 0.844328 0.187382
--0.407242 0.641711 0.989204 0.844328 0.125334
--0.46669 0.735386 0.934957 0.844328 0.0627908
--0.526049 0.828922 0.876307 0.844328 3.26795e-07
--0.58439 0.920852 0.814198 0.844328 -0.0627902
--0.640786 1.00972 0.74959 0.844328 -0.125333
--0.694329 1.09409 0.68344 0.844328 -0.187381
--0.744146 1.17259 0.616689 0.844328 -0.24869
--0.789409 1.24391 0.55025 0.844328 -0.309017
--0.82935 1.30685 0.484986 0.844328 -0.368124
--0.863275 1.36031 0.421709 0.844328 -0.425779
--0.890572 1.40332 0.361155 0.844328 -0.481753
--0.910725 1.43507 0.303987 0.844328 -0.535826
--0.923317 1.45492 0.250772 0.844328 -0.587785
--0.928042 1.46236 0.201985 0.844328 -0.637424
--0.924708 1.45711 0.157997 0.844328 -0.684547
--0.913242 1.43904 0.11907 0.844328 -0.728968
--0.893687 1.40823 0.0853584 0.844328 -0.770513
--0.866209 1.36493 0.0569051 0.844328 -0.809017
--0.83109 1.30959 0.0336448 0.844328 -0.844328
--0.788724 1.24283 0.0154058 0.844328 -0.876306
--0.739616 1.16545 0.00191556 0.844328 -0.904827
--0.684368 1.07839 -0.00719319 0.844328 -0.929776
--0.623676 0.982757 -0.0123742 0.844328 -0.951056
--0.558316 0.879767 -0.0141581 0.844328 -0.968583
--0.489136 0.770756 -0.013142 0.844328 -0.982287
--0.417039 0.657149 -0.00997702 0.844328 -0.992115
--0.342972 0.540439 -0.00535608 0.844328 -0.998027
--0.267914 0.422165 -5.69938e-08 0.844328 -1
--0.192855 0.303892 0.00535597 0.844328 -0.998027
--0.118789 0.187182 0.00997694 0.844328 -0.992115
--0.0466918 0.0735746 0.0131419 0.844328 -0.982287
-0.0224885 -0.0354363 0.0141581 0.844328 -0.968583
-0.0878481 -0.138427 0.0123742 0.844328 -0.951057
-0.14854 -0.234062 0.00719333 0.844328 -0.929777
-0.203788 -0.32112 -0.00191532 0.844328 -0.904827
-0.252897 -0.398502 -0.0154055 0.844328 -0.876307
-0.295263 -0.46526 -0.0336444 0.844328 -0.844328
-0.330382 -0.520599 -0.0569046 0.844328 -0.809017
-0.35786 -0.563898 -0.0853578 0.844328 -0.770514
-0.377415 -0.594711 -0.119069 0.844328 -0.728969
-0.388882 -0.61278 -0.157996 0.844328 -0.684548
-0.392216 -0.618033 -0.201985 0.844328 -0.637425
-0.387491 -0.610588 -0.250771 0.844328 -0.587786
-0.374899 -0.590746 -0.303985 0.844328 -0.535828
-0.354746 -0.558992 -0.361154 0.844328 -0.481754
-0.327449 -0.515978 -0.421707 0.844328 -0.42578
-0.293524 -0.462521 -0.484985 0.844328 -0.368125
-0.253583 -0.399584 -0.550248 0.844328 -0.309018
-0.208321 -0.328261 -0.616688 0.844328 -0.248691
-0.158504 -0.249762 -0.683438 0.844328 -0.187382
-0.10496 -0.165391 -0.749588 0.844328 -0.125334
-0.0485647 -0.0765259 -0.814197 0.844328 -0.0627915
--0.00977584 0.0154043 -0.876306 0.844328 -9.80385e-07
--0.0691352 0.10894 -0.934956 0.844328 0.0627895
--0.128583 0.202615 -0.989203 0.844328 0.125332
--0.1872 0.294981 -1.03813 0.844328 0.18738
--0.244092 0.384628 -1.08086 0.844328 0.248689
--0.298403 0.470209 -1.11658 0.844328 0.309016
--0.349331 0.550458 -1.14455 0.844328 0.368124
--0.396137 0.624212 -1.1641 0.844328 0.425778
--0.438159 0.690428 -1.17467 0.844328 0.481753
--0.474821 0.748198 -1.17579 0.844328 0.535826
--0.505643 0.796766 -1.16712 0.844328 0.587784
--0.530246 0.835536 -1.14843 0.844328 0.637423
--0.548361 0.86408 -1.1196 0.844328 0.684546
--0.559828 0.882149 -1.08068 0.844328 0.728968
--0.564602 0.889671 -1.0318 0.844328 0.770513
--0.562751 0.886755 -0.973256 0.844328 0.809016
--0.554457 0.873685 -0.905454 0.844328 0.844327
--0.540008 0.850917 -0.828924 0.844328 0.876306
--0.519798 0.819071 -0.744313 0.844328 0.904827
--0.494315 0.778917 -0.652375 0.844328 0.929776
--0.464139 0.731366 -0.553963 0.844328 0.951056
--0.429925 0.677453 -0.450017 0.844328 0.968583
--0.392396 0.618318 -0.341551 0.844328 0.982287
--0.352333 0.555188 -0.22964 0.844328 0.992115
--0.310556 0.489358 -0.115406 0.844328 0.998027
--0.293892 0.404509 0 0.809017 1
--0.245008 0.337226 0.112847 0.809017 0.998027
--0.197094 0.271276 0.224576 0.809017 0.992115
--0.151101 0.207973 0.334083 0.809017 0.982287
--0.107951 0.148582 0.440296 0.809017 0.968583
--0.0685184 0.0943075 0.542185 0.809017 0.951057
--0.033615 0.0462672 0.638779 0.809017 0.929777
--0.00397793 0.00547515 0.729178 0.809017 0.904827
-0.0197436 -0.0271748 0.812563 0.809017 0.876307
-0.0369989 -0.0509246 0.888208 0.809017 0.844328
-0.0473451 -0.065165 0.955491 0.809017 0.809017
-0.0504553 -0.0694458 1.0139 0.809017 0.770513
-0.0461236 -0.0634838 1.06303 0.809017 0.728969
-0.0342698 -0.0471684 1.10261 0.809017 0.684547
-0.0149406 -0.020564 1.13248 0.809017 0.637424
--0.0116902 0.0160902 1.15261 0.809017 0.587785
--0.0453242 0.0623834 1.16308 0.809017 0.535827
--0.0855422 0.117739 1.16411 0.809017 0.481754
--0.131811 0.181423 1.15601 0.809017 0.42578
--0.183491 0.252554 1.13921 0.809017 0.368125
--0.239846 0.330119 1.11425 0.809017 0.309017
--0.300053 0.412988 1.08173 0.809017 0.24869
--0.36322 0.49993 1.04235 0.809017 0.187382
--0.428393 0.589633 0.996884 0.809017 0.125334
--0.494575 0.680725 0.946149 0.809017 0.0627908
--0.560741 0.771794 0.891007 0.809017 3.26795e-07
--0.625854 0.861415 0.832348 0.809017 -0.0627902
--0.688881 0.948164 0.771078 0.809017 -0.125333
--0.748809 1.03065 0.708099 0.809017 -0.187381
--0.804662 1.10752 0.644303 0.809017 -0.24869
--0.855515 1.17752 0.580549 0.809017 -0.309017
--0.900513 1.23945 0.517659 0.809017 -0.368124
--0.938878 1.29226 0.456401 0.809017 -0.425779
--0.969925 1.33499 0.397478 0.809017 -0.481753
--0.993076 1.36685 0.341519 0.809017 -0.535826
--1.00787 1.38721 0.289069 0.809017 -0.587785
--1.01395 1.39558 0.240583 0.809017 -0.637424
--1.0111 1.39167 0.196421 0.809017 -0.684547
--0.99925 1.37535 0.156841 0.809017 -0.728968
--0.978432 1.3467 0.122 0.809017 -0.770513
--0.94883 1.30595 0.0919498 0.809017 -0.809017
--0.910754 1.25355 0.0666422 0.809017 -0.844328
--0.86464 1.19008 0.0459287 0.809017 -0.876306
--0.811045 1.11631 0.0295664 0.809017 -0.904827
--0.750638 1.03317 0.0172234 0.809017 -0.929776
--0.684189 0.941706 0.00848715 0.809017 -0.951056
--0.61256 0.843117 0.00287264 0.809017 -0.968583
--0.53669 0.738691 -0.000167151 0.809017 -0.982287
--0.457582 0.629808 -0.00123018 0.809017 -0.992115
--0.376288 0.517917 -0.000953374 0.809017 -0.998027
--0.293893 0.40451 -1.10947e-08 0.809017 -1
--0.211498 0.291103 0.000953359 0.809017 -0.998027
--0.130204 0.179211 0.00123018 0.809017 -0.992115
--0.0510966 0.0703285 0.000167192 0.809017 -0.982287
-0.0247734 -0.0340977 -0.00287255 0.809017 -0.968583
-0.0964026 -0.132687 -0.008487 0.809017 -0.951057
-0.162852 -0.224146 -0.0172232 0.809017 -0.929777
-0.223259 -0.30729 -0.0295661 0.809017 -0.904827
-0.276854 -0.381057 -0.0459284 0.809017 -0.876307
-0.322968 -0.444528 -0.0666418 0.809017 -0.844328
-0.361044 -0.496935 -0.0919493 0.809017 -0.809017
-0.390647 -0.53768 -0.121999 0.809017 -0.770514
-0.411465 -0.566333 -0.156841 0.809017 -0.728969
-0.423319 -0.582649 -0.19642 0.809017 -0.684548
-0.426162 -0.586562 -0.240582 0.809017 -0.637425
-0.42008 -0.578192 -0.289068 0.809017 -0.587786
-0.405292 -0.557837 -0.341518 0.809017 -0.535828
-0.382141 -0.525972 -0.397477 0.809017 -0.481754
-0.351093 -0.483239 -0.4564 0.809017 -0.42578
-0.312729 -0.430435 -0.517658 0.809017 -0.368125
-0.267732 -0.368501 -0.580547 0.809017 -0.309018
-0.216878 -0.298507 -0.644301 0.809017 -0.248691
-0.161025 -0.221632 -0.708098 0.809017 -0.187382
-0.101097 -0.139148 -0.771077 0.809017 -0.125334
-0.0380704 -0.0523994 -0.832347 0.809017 -0.0627915
--0.0270425 0.0372209 -0.891006 0.809017 -9.80385e-07
--0.0932086 0.128291 -0.946148 0.809017 0.0627895
--0.159391 0.219383 -0.996883 0.809017 0.125332
--0.224563 0.309085 -1.04235 0.809017 0.18738
--0.28773 0.396027 -1.08172 0.809017 0.248689
--0.347938 0.478896 -1.11425 0.809017 0.309016
--0.404293 0.556462 -1.13921 0.809017 0.368124
--0.455973 0.627593 -1.15601 0.809017 0.425778
--0.502242 0.691277 -1.16411 0.809017 0.481753
--0.54246 0.746633 -1.16308 0.809017 0.535826
--0.576094 0.792926 -1.15261 0.809017 0.587784
--0.602725 0.829581 -1.13248 0.809017 0.637423
--0.622054 0.856185 -1.10261 0.809017 0.684546
--0.633908 0.872501 -1.06303 0.809017 0.728968
--0.63824 0.878463 -1.0139 0.809017 0.770513
--0.63513 0.874183 -0.955492 0.809017 0.809016
--0.624784 0.859942 -0.88821 0.809017 0.844327
--0.607529 0.836193 -0.812564 0.809017 0.876306
--0.583808 0.803543 -0.72918 0.809017 0.904827
--0.554171 0.762751 -0.638781 0.809017 0.929776
--0.519267 0.714711 -0.542187 0.809017 0.951056
--0.479835 0.660436 -0.440298 0.809017 0.968583
--0.436685 0.601046 -0.334085 0.809017 0.982287
--0.390692 0.537742 -0.224578 0.809017 0.992115
--0.342777 0.471793 -0.112849 0.809017 0.998027
--0.318712 0.385257 0 0.770514 1
--0.263466 0.318476 0.110179 0.770514 0.998027
--0.209294 0.252993 0.219292 0.770514 0.992115
--0.157249 0.190081 0.326287 0.770514 0.982287
--0.108351 0.130975 0.430142 0.770514 0.968583
--0.0635698 0.0768427 0.529874 0.770514 0.951057
--0.0238035 0.0287735 0.624555 0.770514 0.929777
-0.0101306 -0.0122458 0.713325 0.770514 0.904827
-0.0375122 -0.0453445 0.795401 0.770514 0.876307
-0.05773 -0.0697837 0.870087 0.770514 0.844328
-0.0702917 -0.0849681 0.936784 0.770514 0.809017
-0.0748322 -0.0904567 0.994996 0.770514 0.770513
-0.0711208 -0.0859703 1.04434 0.770514 0.728969
-0.0590647 -0.0713971 1.08453 0.770514 0.684547
-0.0387116 -0.0467943 1.11542 0.770514 0.637424
-0.0102491 -0.012389 1.13696 0.770514 0.587785
--0.0259976 0.0314257 1.14923 0.770514 0.535827
--0.06957 0.0840958 1.1524 0.770514 0.481754
--0.119884 0.144915 1.14678 0.770514 0.42578
--0.176237 0.213034 1.13275 0.770514 0.368125
--0.23782 0.287476 1.11081 0.770514 0.309017
--0.303732 0.367149 1.08152 0.770514 0.24869
--0.372987 0.450865 1.04554 0.770514 0.187382
--0.444539 0.537356 1.00358 0.770514 0.125334
--0.517291 0.625298 0.956406 0.770514 0.0627908
--0.590113 0.713325 0.904827 0.770514 3.26795e-07
--0.661865 0.800058 0.849677 0.770514 -0.0627902
--0.731407 0.88412 0.791805 0.770514 -0.125333
--0.797625 0.964164 0.73206 0.770514 -0.187381
--0.859442 1.03889 0.67128 0.770514 -0.24869
--0.91584 1.10706 0.610275 0.770514 -0.309017
--0.965873 1.16754 0.549821 0.770514 -0.368124
--1.00868 1.21929 0.490644 0.770514 -0.425779
--1.04352 1.2614 0.433409 0.770514 -0.481753
--1.06973 1.29308 0.378714 0.770514 -0.535826
--1.08681 1.31373 0.32708 0.770514 -0.587785
--1.09437 1.32287 0.278944 0.770514 -0.637424
--1.09218 1.32021 0.234651 0.770514 -0.684547
--1.08012 1.30564 0.194458 0.770514 -0.728968
--1.05825 1.27921 0.158521 0.770514 -0.770513
--1.02677 1.24115 0.126904 0.770514 -0.809017
--0.986003 1.19187 0.0995739 0.770514 -0.844328
--0.936434 1.13196 0.0764064 0.770514 -0.876306
--0.878669 1.06213 0.057188 0.770514 -0.904827
--0.81344 0.983281 0.041623 0.770514 -0.929776
--0.74159 0.896429 0.0293401 0.770514 -0.951056
--0.664063 0.802715 0.0199006 0.770514 -0.968583
--0.581887 0.703381 0.0128078 0.770514 -0.982287
--0.496162 0.599758 0.00751788 0.770514 -0.992115
--0.408041 0.493237 0.00345027 0.770514 -0.998027
--0.318713 0.385258 3.48154e-08 0.770514 -1
--0.229384 0.277278 -0.00345019 0.770514 -0.998027
--0.141263 0.170758 -0.00751778 0.770514 -0.992115
--0.0555383 0.0671343 -0.0128077 0.770514 -0.982287
-0.0266375 -0.0321993 -0.0199004 0.770514 -0.968583
-0.104165 -0.125914 -0.0293399 0.770514 -0.951057
-0.176015 -0.212766 -0.0416227 0.770514 -0.929777
-0.241245 -0.291615 -0.0571876 0.770514 -0.904827
-0.299009 -0.361441 -0.0764059 0.770514 -0.876307
-0.348578 -0.421359 -0.0995734 0.770514 -0.844328
-0.389343 -0.470636 -0.126903 0.770514 -0.809017
-0.420828 -0.508694 -0.15852 0.770514 -0.770514
-0.442695 -0.535127 -0.194457 0.770514 -0.728969
-0.454752 -0.549701 -0.234651 0.770514 -0.684548
-0.456949 -0.552357 -0.278943 0.770514 -0.637425
-0.449387 -0.543216 -0.327079 0.770514 -0.587786
-0.432307 -0.52257 -0.378713 0.770514 -0.535828
-0.406093 -0.490882 -0.433408 0.770514 -0.481754
-0.37126 -0.448777 -0.490642 0.770514 -0.42578
-0.32845 -0.397028 -0.54982 0.770514 -0.368125
-0.278417 -0.336549 -0.610274 0.770514 -0.309018
-0.22202 -0.268376 -0.671278 0.770514 -0.248691
-0.160203 -0.193652 -0.732059 0.770514 -0.187382
-0.093985 -0.113608 -0.791804 0.770514 -0.125334
-0.0244426 -0.0295461 -0.849676 0.770514 -0.0627915
--0.0473088 0.0571865 -0.904826 0.770514 -9.80385e-07
--0.120131 0.145214 -0.956405 0.770514 0.0627895
--0.192883 0.233155 -1.00358 0.770514 0.125332
--0.264435 0.319647 -1.04554 0.770514 0.18738
--0.333691 0.403363 -1.08152 0.770514 0.248689
--0.399602 0.483036 -1.11081 0.770514 0.309016
--0.461186 0.557478 -1.13275 0.770514 0.368124
--0.517539 0.625598 -1.14678 0.770514 0.425778
--0.567853 0.686417 -1.1524 0.770514 0.481753
--0.611425 0.739087 -1.14923 0.770514 0.535826
--0.647672 0.782902 -1.13696 0.770514 0.587784
--0.676135 0.817307 -1.11542 0.770514 0.637423
--0.696488 0.84191 -1.08453 0.770514 0.684546
--0.708544 0.856484 -1.04434 0.770514 0.728968
--0.712256 0.86097 -0.994997 0.770514 0.770513
--0.707715 0.855482 -0.936785 0.770514 0.809016
--0.695154 0.840298 -0.870089 0.770514 0.844327
--0.674936 0.815859 -0.795403 0.770514 0.876306
--0.647555 0.78276 -0.713327 0.770514 0.904827
--0.613621 0.741741 -0.624557 0.770514 0.929776
--0.573855 0.693672 -0.529876 0.770514 0.951056
--0.529073 0.63954 -0.430144 0.770514 0.968583
--0.480176 0.580434 -0.32629 0.770514 0.982287
--0.428131 0.517522 -0.219294 0.770514 0.992115
--0.373958 0.452039 -0.110181 0.770514 0.998027
--0.342273 0.364484 0 0.728969 1
--0.280604 0.298813 0.107402 0.728969 0.998027
--0.220109 0.234392 0.213792 0.728969 0.992115
--0.161943 0.172452 0.31817 0.728969 0.982287
--0.107224 0.114182 0.419564 0.728969 0.968583
--0.0570111 0.0607107 0.517039 0.728969 0.951057
--0.0122902 0.0130878 0.609714 0.728969 0.929777
-0.0260432 -0.0277333 0.696769 0.728969 0.904827
-0.0571995 -0.0609113 0.777455 0.728969 0.876307
-0.0805071 -0.0857315 0.851108 0.728969 0.844328
-0.0954249 -0.101617 0.917153 0.728969 0.809017
-0.10155 -0.10814 0.975112 0.728969 0.770513
-0.0986274 -0.105028 1.02461 0.728969 0.728969
-0.0865507 -0.0921673 1.06538 0.728969 0.684547
-0.0653679 -0.0696098 1.09726 0.728969 0.637424
-0.0352795 -0.0375689 1.12019 0.728969 0.587785
--0.0033638 0.00358209 1.13424 0.728969 0.535827
--0.050066 0.053315 1.13956 0.728969 0.481754
--0.104194 0.110955 1.13642 0.728969 0.42578
--0.164984 0.175691 1.12517 0.728969 0.368125
--0.23156 0.246586 1.10627 0.728969 0.309017
--0.302939 0.322597 1.08025 0.728969 0.24869
--0.378051 0.402584 1.0477 0.728969 0.187382
--0.455757 0.485333 1.00928 0.728969 0.125334
--0.534863 0.569572 0.96572 0.728969 0.0627908
--0.614139 0.653993 0.917755 0.728969 3.26795e-07
--0.692343 0.737271 0.866168 0.728969 -0.0627902
--0.768234 0.818087 0.811751 0.728969 -0.125333
--0.840597 0.895145 0.755299 0.728969 -0.187381
--0.908258 0.967197 0.697594 0.728969 -0.24869
--0.970107 1.03306 0.639399 0.728969 -0.309017
--1.02511 1.09163 0.58144 0.728969 -0.368124
--1.07234 1.14192 0.524402 0.728969 -0.425779
--1.11096 1.18305 0.468912 0.728969 -0.481753
--1.14027 1.21427 0.415536 0.728969 -0.535826
--1.15972 1.23497 0.364769 0.728969 -0.587785
--1.16887 1.24472 0.317029 0.728969 -0.637424
--1.16746 1.24322 0.27265 0.728969 -0.684547
--1.15539 1.23036 0.231882 0.728969 -0.728968
--1.13269 1.20619 0.194886 0.728969 -0.770513
--1.09957 1.17092 0.161733 0.728969 -0.809017
--1.0564 1.12495 0.132407 0.728969 -0.844328
--1.00369 1.06882 0.106809 0.728969 -0.876306
--0.942101 1.00324 0.0847532 0.728969 -0.904827
--0.872419 0.929032 0.0659815 0.728969 -0.929776
--0.795559 0.847185 0.0501641 0.728969 -0.951056
--0.712544 0.758783 0.0369088 0.728969 -0.968583
--0.62449 0.665015 0.0257702 0.728969 -0.982287
--0.532587 0.567148 0.0162585 0.728969 -0.992115
--0.438085 0.466514 0.00785051 0.728969 -0.998027
--0.342274 0.364486 8.06911e-08 0.728969 -1
--0.246464 0.262457 -0.00785034 0.728969 -0.998027
--0.151962 0.161823 -0.0162583 0.728969 -0.992115
--0.0600589 0.0639563 -0.02577 0.728969 -0.982287
-0.0279959 -0.0298126 -0.0369086 0.728969 -0.968583
-0.111011 -0.118215 -0.0501638 0.728969 -0.951057
-0.18787 -0.200062 -0.0659812 0.728969 -0.929777
-0.257553 -0.274266 -0.0847528 0.728969 -0.904827
-0.319144 -0.339854 -0.106808 0.728969 -0.876307
-0.371853 -0.395984 -0.132407 0.728969 -0.844328
-0.415023 -0.441955 -0.161732 0.728969 -0.809017
-0.448138 -0.477219 -0.194885 0.728969 -0.770514
-0.470838 -0.501392 -0.231881 0.728969 -0.728969
-0.482915 -0.514253 -0.272649 0.728969 -0.684548
-0.484321 -0.51575 -0.317028 0.728969 -0.637425
-0.475169 -0.506004 -0.364768 0.728969 -0.587786
-0.455725 -0.485299 -0.415535 0.728969 -0.535828
-0.426411 -0.454082 -0.46891 0.728969 -0.481754
-0.387791 -0.412956 -0.5244 0.728969 -0.42578
-0.340566 -0.362667 -0.581439 0.728969 -0.368125
-0.285562 -0.304092 -0.639398 0.728969 -0.309018
-0.223713 -0.23823 -0.697593 0.728969 -0.248691
-0.156051 -0.166178 -0.755298 0.728969 -0.187382
-0.0836889 -0.0891197 -0.81175 0.728969 -0.125334
-0.00779789 -0.00830391 -0.866167 0.728969 -0.0627915
--0.0704057 0.0749745 -0.917754 0.728969 -9.80385e-07
--0.149682 0.159396 -0.965719 0.728969 0.0627895
--0.228788 0.243635 -1.00928 0.728969 0.125332
--0.306494 0.326383 -1.0477 0.728969 0.18738
--0.381607 0.40637 -1.08025 0.728969 0.248689
--0.452986 0.482381 -1.10627 0.728969 0.309016
--0.519561 0.553277 -1.12517 0.728969 0.368124
--0.580352 0.618013 -1.13642 0.728969 0.425778
--0.63448 0.675653 -1.13956 0.728969 0.481753
--0.681182 0.725386 -1.13424 0.728969 0.535826
--0.719826 0.766537 -1.12019 0.728969 0.587784
--0.749914 0.798578 -1.09726 0.728969 0.637423
--0.771097 0.821136 -1.06538 0.728969 0.684546
--0.783174 0.833996 -1.02461 0.728969 0.728968
--0.786097 0.837109 -0.975113 0.728969 0.770513
--0.779972 0.830586 -0.917154 0.728969 0.809016
--0.765054 0.814701 -0.851109 0.728969 0.844327
--0.741747 0.789881 -0.777456 0.728969 0.876306
--0.710591 0.756703 -0.69677 0.728969 0.904827
--0.672257 0.715882 -0.609716 0.728969 0.929776
--0.627537 0.668259 -0.517041 0.728969 0.951056
--0.577324 0.614788 -0.419566 0.728969 0.968583
--0.522605 0.556518 -0.318172 0.728969 0.982287
--0.464439 0.494578 -0.213794 0.728969 0.992115
--0.403944 0.430157 -0.107404 0.728969 0.998027
--0.364484 0.342274 0 0.684547 1
--0.296386 0.278325 0.104519 0.684547 0.998027
--0.229561 0.215572 0.208081 0.684547 0.992115
--0.165262 0.155191 0.309738 0.684547 0.982287
--0.104699 0.0983187 0.408571 0.684547 0.968583
--0.0490217 0.0460345 0.503695 0.684547 0.951057
-0.000699729 -0.00065709 0.594272 0.684547 0.929777
-0.0434939 -0.0408436 0.679524 0.684547 0.904827
-0.0785031 -0.0737194 0.758741 0.684547 0.876307
-0.104997 -0.0985992 0.831288 0.684547 0.844328
-0.122388 -0.11493 0.896616 0.684547 0.809017
-0.130235 -0.122298 0.954266 0.684547 0.770513
-0.128257 -0.120441 1.00387 0.684547 0.728969
-0.116336 -0.109247 1.04518 0.684547 0.684547
-0.0945199 -0.0887602 1.07801 0.684547 0.637424
-0.0630199 -0.0591797 1.10231 0.684547 0.587785
-0.0222109 -0.0208575 1.11813 0.684547 0.535827
--0.0273755 0.0257073 1.12559 0.684547 0.481754
--0.0850589 0.0798757 1.12493 0.684547 0.42578
--0.15002 0.140878 1.11648 0.684547 0.368125
--0.221313 0.207827 1.10065 0.684547 0.309017
--0.297883 0.279731 1.07791 0.684547 0.24869
--0.378575 0.355506 1.04882 0.684547 0.187382
--0.462163 0.434 1.01399 0.684547 0.125334
--0.547357 0.514003 0.97408 0.684547 0.0627908
--0.632835 0.594272 0.929777 0.684547 3.26795e-07
--0.717254 0.673547 0.881804 0.684547 -0.0627902
--0.799275 0.75057 0.830896 0.684547 -0.125333
--0.877588 0.824111 0.777792 0.684547 -0.187381
--0.950926 0.89298 0.723221 0.684547 -0.24869
--1.01809 0.95605 0.667892 0.684547 -0.309017
--1.07796 1.01227 0.612486 0.684547 -0.368124
--1.12953 1.0607 0.557642 0.684547 -0.425779
--1.17191 1.1005 0.503952 0.684547 -0.481753
--1.20433 1.13094 0.451947 0.684547 -0.535826
--1.22619 1.15147 0.402098 0.684547 -0.587785
--1.23702 1.16164 0.354801 0.684547 -0.637424
--1.23654 1.16119 0.31038 0.684547 -0.684547
--1.22462 1.15 0.269078 0.684547 -0.728968
--1.20131 1.12811 0.231058 0.684547 -0.770513
--1.16682 1.09572 0.196402 0.684547 -0.809017
--1.12155 1.0532 0.16511 0.684547 -0.844328
--1.06603 1.00107 0.137105 0.684547 -0.876306
--1.00098 0.939983 0.112235 0.684547 -0.904827
--0.927242 0.870739 0.090275 0.684547 -0.929776
--0.845798 0.794258 0.0709386 0.684547 -0.951056
--0.757743 0.711569 0.0538807 0.684547 -0.968583
--0.664276 0.623797 0.0387071 0.684547 -0.982287
--0.566675 0.532144 0.0249831 0.684547 -0.992115
--0.466283 0.437869 0.012243 0.684547 -0.998027
--0.364485 0.342275 1.26487e-07 0.684547 -1
--0.262687 0.24668 -0.0122427 0.684547 -0.998027
--0.162295 0.152406 -0.0249828 0.684547 -0.992115
--0.0646946 0.0607524 -0.0387068 0.684547 -0.982287
-0.0287729 -0.0270196 -0.0538803 0.684547 -0.968583
-0.116828 -0.109709 -0.0709382 0.684547 -0.951057
-0.198272 -0.18619 -0.0902745 0.684547 -0.929777
-0.27201 -0.255435 -0.112234 0.684547 -0.904827
-0.337061 -0.316521 -0.137105 0.684547 -0.876307
-0.392576 -0.368654 -0.165109 0.684547 -0.844328
-0.437853 -0.411172 -0.196401 0.684547 -0.809017
-0.472341 -0.443558 -0.231057 0.684547 -0.770514
-0.495655 -0.465451 -0.269077 0.684547 -0.728969
-0.507576 -0.476646 -0.310379 0.684547 -0.684548
-0.508056 -0.477097 -0.3548 0.684547 -0.637425
-0.497222 -0.466923 -0.402097 0.684547 -0.587786
-0.475364 -0.446397 -0.451946 0.684547 -0.535828
-0.442941 -0.41595 -0.50395 0.684547 -0.481754
-0.400565 -0.376156 -0.557641 0.684547 -0.42578
-0.348994 -0.327728 -0.612485 0.684547 -0.368125
-0.289122 -0.271504 -0.667891 0.684547 -0.309018
-0.221959 -0.208434 -0.723219 0.684547 -0.248691
-0.148622 -0.139565 -0.777791 0.684547 -0.187382
-0.0703088 -0.0660244 -0.830895 0.684547 -0.125334
--0.011713 0.0109993 -0.881803 0.684547 -0.0627915
--0.0961315 0.0902736 -0.929776 0.684547 -9.80385e-07
--0.181609 0.170542 -0.974079 0.684547 0.0627895
--0.266804 0.250546 -1.01399 0.684547 0.125332
--0.350391 0.32904 -1.04882 0.684547 0.18738
--0.431084 0.404815 -1.07791 0.684547 0.248689
--0.507653 0.476719 -1.10065 0.684547 0.309016
--0.578947 0.543668 -1.11648 0.684547 0.368124
--0.643908 0.604671 -1.12493 0.684547 0.425778
--0.701592 0.658839 -1.12559 0.684547 0.481753
--0.751178 0.705404 -1.11813 0.684547 0.535826
--0.791987 0.743726 -1.10231 0.684547 0.587784
--0.823488 0.773307 -1.07801 0.684547 0.637423
--0.845304 0.793794 -1.04518 0.684547 0.684546
--0.857225 0.804989 -1.00387 0.684547 0.728968
--0.859203 0.806846 -0.954267 0.684547 0.770513
--0.851356 0.799477 -0.896617 0.684547 0.809016
--0.833966 0.783147 -0.83129 0.684547 0.844327
--0.807472 0.758267 -0.758743 0.684547 0.876306
--0.772463 0.725392 -0.679526 0.684547 0.904827
--0.729669 0.685205 -0.594274 0.684547 0.929776
--0.679948 0.638514 -0.503697 0.684547 0.951056
--0.624271 0.58623 -0.408573 0.684547 0.968583
--0.563708 0.529358 -0.309741 0.684547 0.982287
--0.499409 0.468976 -0.208083 0.684547 0.992115
--0.432584 0.406224 -0.104522 0.684547 0.998027
--0.385256 0.318712 0 0.637424 1
--0.310783 0.257103 0.101534 0.637424 0.998027
--0.237678 0.196625 0.202164 0.637424 0.992115
--0.167288 0.138392 0.301001 0.637424 0.982287
--0.100913 0.0834823 0.397176 0.637424 0.968583
--0.0397894 0.0329167 0.489853 0.637424 0.951057
-0.0149319 -0.0123528 0.578243 0.637424 0.929777
-0.062206 -0.0514613 0.66161 0.637424 0.904827
-0.101109 -0.083645 0.739279 0.637424 0.876307
-0.130856 -0.108253 0.810648 0.637424 0.844328
-0.150809 -0.12476 0.875195 0.637424 0.809017
-0.160494 -0.132772 0.932478 0.637424 0.770513
-0.159605 -0.132037 0.982147 0.637424 0.728969
-0.148011 -0.122446 1.02394 0.637424 0.684547
-0.125758 -0.104036 1.0577 0.637424 0.637424
-0.0930671 -0.0769919 1.08335 0.637424 0.587785
-0.0503364 -0.0416419 1.10091 0.637424 0.535827
--0.00186959 0.00154666 1.11051 0.637424 0.481754
--0.0628262 0.0519744 1.11234 0.637424 0.42578
--0.13166 0.108919 1.10669 0.637424 0.368125
--0.207363 0.171546 1.09394 0.637424 0.309017
--0.288806 0.238921 1.07451 0.637424 0.24869
--0.374759 0.310028 1.04891 0.637424 0.187382
--0.46391 0.38378 1.0177 0.637424 0.125334
--0.554881 0.459038 0.981479 0.637424 0.0627908
--0.646258 0.534632 0.940881 0.637424 3.26795e-07
--0.736605 0.609373 0.896569 0.637424 -0.0627902
--0.82449 0.682079 0.849221 0.637424 -0.125333
--0.908511 0.751586 0.799518 0.637424 -0.187381
--0.987311 0.816775 0.748133 0.637424 -0.24869
--1.05961 0.876582 0.695726 0.637424 -0.309017
--1.1242 0.93002 0.642927 0.637424 -0.368124
--1.18001 0.97619 0.590332 0.637424 -0.425779
--1.22608 1.0143 0.538494 0.637424 -0.481753
--1.26159 1.04368 0.487913 0.637424 -0.535826
--1.28589 1.06378 0.43903 0.637424 -0.587785
--1.29848 1.0742 0.392223 0.637424 -0.637424
--1.29905 1.07467 0.347803 0.637424 -0.684547
--1.28746 1.06508 0.306008 0.637424 -0.728968
--1.26375 1.04546 0.267002 0.637424 -0.770513
--1.22815 1.01601 0.230877 0.637424 -0.809017
--1.18107 0.97707 0.19765 0.637424 -0.844328
--1.1231 0.92911 0.167267 0.637424 -0.876306
--1.05498 0.872755 0.139606 0.637424 -0.904827
--0.977608 0.808749 0.114479 0.637424 -0.929776
--0.892033 0.737954 0.091643 0.637424 -0.951056
--0.799418 0.661337 0.0707993 0.637424 -0.968583
--0.70104 0.579951 0.0516058 0.637424 -0.982287
--0.59826 0.494924 0.033683 0.637424 -0.992115
--0.492508 0.407438 0.0166234 0.637424 -0.998027
--0.385258 0.318713 1.72158e-07 0.637424 -1
--0.278007 0.229988 -0.0166231 0.637424 -0.998027
--0.172255 0.142502 -0.0336827 0.637424 -0.992115
--0.0694748 0.0574746 -0.0516054 0.637424 -0.982287
-0.0289035 -0.0239111 -0.0707989 0.637424 -0.968583
-0.121518 -0.100528 -0.0916426 0.637424 -0.951057
-0.207094 -0.171323 -0.114479 0.637424 -0.929777
-0.284464 -0.235329 -0.139605 0.637424 -0.904827
-0.352586 -0.291685 -0.167266 0.637424 -0.876307
-0.410559 -0.339644 -0.197649 0.637424 -0.844328
-0.457635 -0.378589 -0.230876 0.637424 -0.809017
-0.493232 -0.408037 -0.267001 0.637424 -0.770514
-0.516942 -0.427652 -0.306007 0.637424 -0.728969
-0.528536 -0.437243 -0.347802 0.637424 -0.684548
-0.527969 -0.436774 -0.392222 0.637424 -0.637425
-0.515378 -0.426358 -0.439029 0.637424 -0.587786
-0.491079 -0.406257 -0.487912 0.637424 -0.535828
-0.455567 -0.376878 -0.538493 0.637424 -0.481754
-0.409498 -0.338766 -0.590331 0.637424 -0.42578
-0.353688 -0.292596 -0.642926 0.637424 -0.368125
-0.289094 -0.239159 -0.695725 0.637424 -0.309018
-0.216799 -0.179352 -0.748132 0.637424 -0.248691
-0.138 -0.114163 -0.799517 0.637424 -0.187382
-0.0539793 -0.0446556 -0.84922 0.637424 -0.125334
--0.0339063 0.0280498 -0.896568 0.637424 -0.0627915
--0.124253 0.102791 -0.94088 0.637424 -9.80385e-07
--0.21563 0.178384 -0.981479 0.637424 0.0627895
--0.306601 0.253643 -1.0177 0.637424 0.125332
--0.395752 0.327395 -1.04891 0.637424 0.18738
--0.481705 0.398502 -1.07451 0.637424 0.248689
--0.563149 0.465878 -1.09394 0.637424 0.309016
--0.638851 0.528504 -1.10669 0.637424 0.368124
--0.707685 0.585449 -1.11234 0.637424 0.425778
--0.768642 0.635877 -1.11051 0.637424 0.481753
--0.820848 0.679065 -1.10091 0.637424 0.535826
--0.863579 0.714416 -1.08335 0.637424 0.587784
--0.89627 0.74146 -1.0577 0.637424 0.637423
--0.918524 0.75987 -1.02394 0.637424 0.684546
--0.930118 0.769462 -0.982148 0.637424 0.728968
--0.931007 0.770197 -0.932479 0.637424 0.770513
--0.921322 0.762185 -0.875196 0.637424 0.809016
--0.901369 0.745678 -0.81065 0.637424 0.844327
--0.871623 0.72107 -0.73928 0.637424 0.876306
--0.83272 0.688886 -0.661611 0.637424 0.904827
--0.785446 0.649778 -0.578245 0.637424 0.929776
--0.730725 0.604509 -0.489855 0.637424 0.951056
--0.669602 0.553943 -0.397178 0.637424 0.968583
--0.603227 0.499033 -0.301003 0.637424 0.982287
--0.532836 0.440801 -0.202166 0.637424 0.992115
--0.459731 0.380323 -0.101536 0.637424 0.998027
--0.404508 0.293893 0 0.587786 1
--0.323772 0.235234 0.0984474 0.587786 0.998027
--0.244495 0.177636 0.196048 0.587786 0.992115
--0.168111 0.12214 0.291967 0.587786 0.982287
--0.0960097 0.0697552 0.385388 0.587786 0.968583
--0.0295087 0.0214393 0.475528 0.587786 0.951057
-0.030165 -0.0219162 0.561644 0.587786 0.929777
-0.0818954 -0.0595006 0.643042 0.587786 0.904827
-0.124696 -0.0905973 0.719087 0.587786 0.876307
-0.157727 -0.114596 0.789209 0.587786 0.844328
-0.180308 -0.131001 0.85291 0.587786 0.809017
-0.191928 -0.139444 0.90977 0.587786 0.770513
-0.192257 -0.139683 0.95945 0.587786 0.728969
-0.181152 -0.131615 1.0017 0.587786 0.684547
-0.158655 -0.11527 1.03635 0.587786 0.637424
-0.125 -0.0908178 1.06331 0.587786 0.587785
-0.0806023 -0.058561 1.08261 0.587786 0.535827
-0.0260583 -0.0189325 1.09433 0.587786 0.481754
--0.0378662 0.0275115 1.09864 0.587786 0.42578
--0.110248 0.0800997 1.09581 0.587786 0.368125
--0.190018 0.138056 1.08614 0.587786 0.309017
--0.275983 0.200513 1.07005 0.587786 0.24869
--0.366837 0.266523 1.04797 0.587786 0.187382
--0.46119 0.335074 1.02041 0.587786 0.125334
--0.557581 0.405107 0.98791 0.587786 0.0627908
--0.654508 0.475528 0.951057 0.587786 3.26795e-07
--0.750449 0.545233 0.91045 0.587786 -0.0627902
--0.843884 0.613118 0.866708 0.587786 -0.125333
--0.933322 0.678099 0.820454 0.587786 -0.187381
--1.01732 0.739131 0.772307 0.587786 -0.24869
--1.09453 0.795221 0.722873 0.587786 -0.309017
--1.16366 0.845447 0.672733 0.587786 -0.368124
--1.22356 0.888972 0.62244 0.587786 -0.425779
--1.27323 0.925055 0.572506 0.587786 -0.481753
--1.31178 0.953067 0.523397 0.587786 -0.535826
--1.33852 0.972496 0.475528 0.587786 -0.587785
--1.35293 0.982961 0.429258 0.587786 -0.637424
--1.35465 0.984214 0.384883 0.587786 -0.684547
--1.34355 0.976146 0.342636 0.587786 -0.728968
--1.31966 0.958788 0.302683 0.587786 -0.770513
--1.28322 0.932313 0.265124 0.587786 -0.809017
--1.23466 0.897033 0.229995 0.587786 -0.844328
--1.17459 0.853391 0.197263 0.587786 -0.876306
--1.1038 0.80196 0.166839 0.587786 -0.904827
--1.02324 0.743432 0.138571 0.587786 -0.929776
--0.934018 0.678604 0.112257 0.587786 -0.951056
--0.837353 0.608373 0.0876482 0.587786 -0.968583
--0.734597 0.533717 0.0644536 0.587786 -0.982287
--0.62719 0.455681 0.0423497 0.587786 -0.992115
--0.516641 0.375362 0.0209874 0.587786 -0.998027
--0.40451 0.293894 2.1766e-07 0.587786 -1
--0.292378 0.212425 -0.020987 0.587786 -0.998027
--0.181829 0.132107 -0.0423493 0.587786 -0.992115
--0.0744216 0.0540705 -0.0644531 0.587786 -0.982287
-0.0283342 -0.020586 -0.0876477 0.587786 -0.968583
-0.124999 -0.0908171 -0.112257 0.587786 -0.951057
-0.214226 -0.155645 -0.13857 0.587786 -0.929777
-0.294784 -0.214174 -0.166838 0.587786 -0.904827
-0.365573 -0.265604 -0.197263 0.587786 -0.876307
-0.42564 -0.309246 -0.229994 0.587786 -0.844328
-0.4742 -0.344527 -0.265124 0.587786 -0.809017
-0.510639 -0.371002 -0.302682 0.587786 -0.770514
-0.534531 -0.38836 -0.342635 0.587786 -0.728969
-0.545636 -0.396428 -0.384882 0.587786 -0.684548
-0.543912 -0.395176 -0.429257 0.587786 -0.637425
-0.529509 -0.384711 -0.475527 0.587786 -0.587786
-0.502767 -0.365282 -0.523396 0.587786 -0.535828
-0.464212 -0.33727 -0.572505 0.587786 -0.481754
-0.414548 -0.301187 -0.622439 0.587786 -0.42578
-0.354641 -0.257662 -0.672732 0.587786 -0.368125
-0.285511 -0.207436 -0.722872 0.587786 -0.309018
-0.20831 -0.151346 -0.772306 0.587786 -0.248691
-0.124307 -0.0903148 -0.820453 0.587786 -0.187382
-0.0348689 -0.0253338 -0.866707 0.587786 -0.125334
--0.0585661 0.0425508 -0.910449 0.587786 -0.0627915
--0.154507 0.112256 -0.951056 0.587786 -9.80385e-07
--0.251434 0.182678 -0.987909 0.587786 0.0627895
--0.347825 0.25271 -1.02041 0.587786 0.125332
--0.442178 0.321261 -1.04797 0.587786 0.18738
--0.533032 0.387271 -1.07005 0.587786 0.248689
--0.618997 0.449728 -1.08614 0.587786 0.309016
--0.698767 0.507685 -1.09581 0.587786 0.368124
--0.771149 0.560273 -1.09864 0.587786 0.425778
--0.835074 0.606717 -1.09433 0.587786 0.481753
--0.889618 0.646346 -1.08261 0.587786 0.535826
--0.934016 0.678603 -1.06331 0.587786 0.587784
--0.967671 0.703055 -1.03635 0.587786 0.637423
--0.990168 0.7194 -1.0017 0.587786 0.684546
--1.00127 0.727469 -0.959451 0.587786 0.728968
--1.00094 0.727229 -0.909771 0.587786 0.770513
--0.989325 0.718787 -0.852911 0.587786 0.809016
--0.966745 0.702382 -0.78921 0.587786 0.844327
--0.933714 0.678384 -0.719088 0.587786 0.876306
--0.890913 0.647287 -0.643044 0.587786 0.904827
--0.839183 0.609703 -0.561646 0.587786 0.929776
--0.779509 0.566347 -0.47553 0.587786 0.951056
--0.713008 0.518031 -0.38539 0.587786 0.968583
--0.640907 0.465647 -0.291969 0.587786 0.982287
--0.564524 0.410151 -0.19605 0.587786 0.992115
--0.485246 0.352552 -0.0984495 0.587786 0.998027
--0.422164 0.267914 0 0.535827 1
--0.335334 0.21281 0.0952642 0.535827 0.998027
--0.250049 0.158686 0.189739 0.535827 0.992115
--0.167827 0.106506 0.282645 0.535827 0.982287
--0.0901382 0.0572035 0.37322 0.535827 0.968583
--0.0183783 0.0116632 0.460734 0.535827 0.951057
-0.0461531 -0.0292897 0.54449 0.535827 0.929777
-0.102273 -0.0649048 0.62384 0.535827 0.904827
-0.148937 -0.0945186 0.698185 0.535827 0.876307
-0.185253 -0.117565 0.76699 0.535827 0.844328
-0.210496 -0.133585 0.829783 0.535827 0.809017
-0.224125 -0.142234 0.886164 0.535827 0.770513
-0.225787 -0.143289 0.935807 0.535827 0.728969
-0.215323 -0.136648 0.978465 0.535827 0.684547
-0.192775 -0.122339 1.01397 0.535827 0.637424
-0.158383 -0.100513 1.04223 0.535827 0.587785
-0.112582 -0.071447 1.06324 0.535827 0.535827
-0.0559966 -0.0355366 1.07707 0.535827 0.481754
--0.0105707 0.00670838 1.08387 0.535827 0.42578
--0.0861493 0.0546721 1.08384 0.535827 0.368125
--0.169617 0.107642 1.07728 0.535827 0.309017
--0.259716 0.164821 1.06453 0.535827 0.24869
--0.355075 0.225338 1.04599 0.535827 0.187382
--0.454228 0.288262 1.0221 0.535827 0.125334
--0.555638 0.352619 0.993366 0.535827 0.0627908
--0.657723 0.417404 0.960294 0.535827 3.26795e-07
--0.758879 0.4816 0.923432 0.535827 -0.0627902
--0.857504 0.544189 0.883339 0.535827 -0.125333
--0.952027 0.604176 0.840581 0.535827 -0.187381
--1.04093 0.660595 0.795719 0.535827 -0.24869
--1.12277 0.712534 0.749307 0.535827 -0.309017
--1.19621 0.759141 0.701876 0.535827 -0.368124
--1.26004 0.799646 0.653933 0.535827 -0.425779
--1.31317 0.833364 0.605952 0.535827 -0.481753
--1.35469 0.859713 0.558364 0.535827 -0.535826
--1.38385 0.878222 0.511558 0.535827 -0.587785
--1.40011 0.888536 0.46587 0.535827 -0.637424
--1.40308 0.890424 0.421583 0.535827 -0.684547
--1.39262 0.883784 0.378926 0.535827 -0.728968
--1.36876 0.86864 0.338065 0.535827 -0.770513
--1.33174 0.84515 0.29911 0.535827 -0.809017
--1.28202 0.813595 0.262112 0.535827 -0.844328
--1.22023 0.774382 0.227065 0.535827 -0.876306
--1.1472 0.728033 0.193907 0.535827 -0.904827
--1.06391 0.67518 0.162525 0.535827 -0.929776
--0.971535 0.616555 0.13276 0.535827 -0.951056
--0.871353 0.552978 0.10441 0.535827 -0.968583
--0.764781 0.485345 0.0772378 0.535827 -0.982287
--0.653327 0.414614 0.0509746 0.535827 -0.992115
--0.538576 0.341791 0.0253307 0.535827 -0.998027
--0.422165 0.267914 2.62946e-07 0.535827 -1
--0.305754 0.194037 -0.0253302 0.535827 -0.998027
--0.191003 0.121214 -0.0509741 0.535827 -0.992115
--0.0795492 0.0504835 -0.0772372 0.535827 -0.982287
-0.0270235 -0.0171496 -0.10441 0.535827 -0.968583
-0.127205 -0.0807268 -0.13276 0.535827 -0.951057
-0.219583 -0.139352 -0.162525 0.535827 -0.929777
-0.302866 -0.192205 -0.193906 0.535827 -0.904827
-0.3759 -0.238554 -0.227064 0.535827 -0.876307
-0.437691 -0.277767 -0.262112 0.535827 -0.844328
-0.487413 -0.309322 -0.299109 0.535827 -0.809017
-0.524428 -0.332813 -0.338064 0.535827 -0.770514
-0.54829 -0.347956 -0.378925 0.535827 -0.728969
-0.558755 -0.354597 -0.421583 0.535827 -0.684548
-0.555779 -0.352709 -0.465869 0.535827 -0.637425
-0.539528 -0.342395 -0.511557 0.535827 -0.587786
-0.510363 -0.323886 -0.558363 0.535827 -0.535828
-0.468843 -0.297537 -0.605951 0.535827 -0.481754
-0.415712 -0.263819 -0.653932 0.535827 -0.42578
-0.351888 -0.223315 -0.701875 0.535827 -0.368125
-0.278446 -0.176707 -0.749306 0.535827 -0.309018
-0.196604 -0.124769 -0.795718 0.535827 -0.248691
-0.107702 -0.0683496 -0.84058 0.535827 -0.187382
-0.0131787 -0.00836345 -0.883338 0.535827 -0.125334
--0.0854465 0.0542261 -0.923431 0.535827 -0.0627915
--0.186602 0.118421 -0.960293 0.535827 -9.80385e-07
--0.288687 0.183207 -0.993365 0.535827 0.0627895
--0.390098 0.247564 -1.0221 0.535827 0.125332
--0.489251 0.310488 -1.04599 0.535827 0.18738
--0.58461 0.371005 -1.06453 0.535827 0.248689
--0.674709 0.428184 -1.07728 0.535827 0.309016
--0.758177 0.481154 -1.08384 0.535827 0.368124
--0.833755 0.529118 -1.08387 0.535827 0.425778
--0.900323 0.571363 -1.07707 0.535827 0.481753
--0.956909 0.607274 -1.06324 0.535827 0.535826
--1.00271 0.63634 -1.04223 0.535827 0.587784
--1.0371 0.658166 -1.01397 0.535827 0.637423
--1.05965 0.672475 -0.978465 0.535827 0.684546
--1.07011 0.679116 -0.935808 0.535827 0.728968
--1.06845 0.678062 -0.886165 0.535827 0.770513
--1.05482 0.669413 -0.829784 0.535827 0.809016
--1.02958 0.653393 -0.766991 0.535827 0.844327
--0.993266 0.630346 -0.698187 0.535827 0.876306
--0.946602 0.600733 -0.623841 0.535827 0.904827
--0.890482 0.565118 -0.544492 0.535827 0.929776
--0.825951 0.524165 -0.460736 0.535827 0.951056
--0.754191 0.478625 -0.373222 0.535827 0.968583
--0.676502 0.429322 -0.282647 0.535827 0.982287
--0.59428 0.377142 -0.189741 0.535827 0.992115
--0.508995 0.323019 -0.0952662 0.535827 0.998027
--0.438153 0.240877 0 0.481754 1
--0.345457 0.189917 0.091987 0.481754 0.998027
--0.254385 0.13985 0.183242 0.481754 0.992115
--0.166534 0.0915529 0.273043 0.481754 0.982287
--0.0834492 0.0458766 0.360684 0.481754 0.968583
--0.00659921 0.00362795 0.445485 0.481754 0.951057
-0.0626486 -0.0344414 0.526799 0.481754 0.929777
-0.12305 -0.0676474 0.604022 0.481754 0.904827
-0.173504 -0.0953846 0.676594 0.481754 0.876307
-0.21307 -0.117136 0.744014 0.481754 0.844328
-0.240985 -0.132483 0.805837 0.481754 0.809017
-0.256675 -0.141109 0.861683 0.481754 0.770513
-0.259765 -0.142807 0.91124 0.481754 0.728969
-0.250084 -0.137485 0.954266 0.481754 0.684547
-0.227671 -0.125164 0.990591 0.481754 0.637424
-0.192772 -0.105978 1.02012 0.481754 0.587785
-0.145839 -0.0801756 1.04282 0.481754 0.535827
-0.0875195 -0.0481143 1.05875 0.481754 0.481754
-0.018652 -0.0102541 1.06802 0.481754 0.42578
--0.0597511 0.0328485 1.07081 0.481754 0.368125
--0.146518 0.0805489 1.06735 0.481754 0.309017
--0.240334 0.132125 1.05796 0.481754 0.24869
--0.339766 0.186788 1.04298 0.481754 0.187382
--0.443281 0.243696 1.02279 0.481754 0.125334
--0.549272 0.301965 0.997841 0.481754 0.0627908
--0.656081 0.360684 0.968583 0.481754 3.26795e-07
--0.762031 0.418931 0.935503 0.481754 -0.0627902
--0.865445 0.475783 0.899099 0.481754 -0.125333
--0.964676 0.530336 0.859878 0.481754 -0.187381
--1.05814 0.581716 0.818346 0.481754 -0.24869
--1.14431 0.629092 0.775001 0.481754 -0.309017
--1.2218 0.671694 0.730326 0.481754 -0.368124
--1.28933 0.708818 0.684781 0.481754 -0.425779
--1.34577 0.739844 0.6388 0.481754 -0.481753
--1.39015 0.764243 0.592781 0.481754 -0.535826
--1.42169 0.781584 0.547082 0.481754 -0.587785
--1.43981 0.791544 0.502021 0.481754 -0.637424
--1.44412 0.793911 0.457868 0.481754 -0.684547
--1.43444 0.788589 0.414842 0.481754 -0.728968
--1.41081 0.775599 0.373113 0.481754 -0.770513
--1.37348 0.755079 0.332801 0.481754 -0.809017
--1.32292 0.727283 0.293972 0.481754 -0.844328
--1.25979 0.692575 0.256643 0.481754 -0.876306
--1.18494 0.651425 0.220784 0.481754 -0.904827
--1.09941 0.604404 0.186319 0.481754 -0.929776
--1.0044 0.552172 0.153133 0.481754 -0.951056
--0.901252 0.495468 0.12107 0.481754 -0.968583
--0.791445 0.435101 0.0899457 0.481754 -0.982287
--0.67655 0.371937 0.0595492 0.481754 -0.992115
--0.558218 0.306883 0.029649 0.481754 -0.998027
--0.438154 0.240878 3.07973e-07 0.481754 -1
--0.318091 0.174872 -0.0296484 0.481754 -0.998027
--0.199759 0.109819 -0.0595486 0.481754 -0.992115
--0.0848635 0.0466542 -0.0899451 0.481754 -0.982287
-0.024943 -0.0137126 -0.121069 0.481754 -0.968583
-0.128087 -0.0704166 -0.153132 0.481754 -0.951057
-0.223098 -0.122649 -0.186319 0.481754 -0.929777
-0.308628 -0.16967 -0.220783 0.481754 -0.904827
-0.383479 -0.21082 -0.256642 0.481754 -0.876307
-0.446613 -0.245528 -0.293971 0.481754 -0.844328
-0.497175 -0.273325 -0.3328 0.481754 -0.809017
-0.534501 -0.293845 -0.373112 0.481754 -0.770514
-0.55813 -0.306835 -0.414841 0.481754 -0.728969
-0.567811 -0.312157 -0.457867 0.481754 -0.684548
-0.563505 -0.30979 -0.50202 0.481754 -0.637425
-0.545389 -0.29983 -0.547081 0.481754 -0.587786
-0.513846 -0.282489 -0.59278 0.481754 -0.535828
-0.469465 -0.258091 -0.638799 0.481754 -0.481754
-0.413028 -0.227065 -0.68478 0.481754 -0.42578
-0.3455 -0.18994 -0.730325 0.481754 -0.368125
-0.268008 -0.147339 -0.775 0.481754 -0.309018
-0.181831 -0.0999626 -0.818345 0.481754 -0.248691
-0.088372 -0.048583 -0.859877 0.481754 -0.187382
--0.0108594 0.00597002 -0.899098 0.481754 -0.125334
--0.114273 0.0628222 -0.935502 0.481754 -0.0627915
--0.220223 0.121069 -0.968583 0.481754 -9.80385e-07
--0.327033 0.179788 -0.997841 0.481754 0.0627895
--0.433023 0.238057 -1.02279 0.481754 0.125332
--0.536538 0.294965 -1.04298 0.481754 0.18738
--0.63597 0.349628 -1.05796 0.481754 0.248689
--0.729787 0.401204 -1.06735 0.481754 0.309016
--0.816554 0.448905 -1.07081 0.481754 0.368124
--0.894957 0.492007 -1.06802 0.481754 0.425778
--0.963825 0.529868 -1.05875 0.481754 0.481753
--1.02214 0.561929 -1.04282 0.481754 0.535826
--1.06908 0.587731 -1.02012 0.481754 0.587784
--1.10398 0.606917 -0.990592 0.481754 0.637423
--1.12639 0.619239 -0.954267 0.481754 0.684546
--1.13607 0.624561 -0.911241 0.481754 0.728968
--1.13298 0.622863 -0.861684 0.481754 0.770513
--1.11729 0.614237 -0.805838 0.481754 0.809016
--1.08938 0.598891 -0.744016 0.481754 0.844327
--1.04981 0.577139 -0.676596 0.481754 0.876306
--0.999358 0.549402 -0.604023 0.481754 0.904827
--0.938956 0.516196 -0.526801 0.481754 0.929776
--0.869709 0.478127 -0.445487 0.481754 0.951056
--0.792859 0.435878 -0.360686 0.481754 0.968583
--0.709774 0.390202 -0.273045 0.481754 0.982287
--0.621923 0.341906 -0.183244 0.481754 0.992115
--0.530851 0.291838 -0.0919889 0.481754 0.998027
--0.452413 0.21289 0 0.42578 1
--0.354133 0.166643 0.0886189 0.42578 0.998027
--0.25755 0.121194 0.176565 0.42578 0.992115
--0.164332 0.0773289 0.263172 0.42578 0.982287
--0.0760948 0.0358075 0.347792 0.42578 0.968583
-0.00562739 -0.00264805 0.429796 0.42578 0.951057
-0.0794048 -0.0373651 0.508588 0.42578 0.929777
-0.143936 -0.0677312 0.583607 0.42578 0.904827
-0.198069 -0.0932041 0.654336 0.42578 0.876307
-0.240818 -0.113321 0.720304 0.42578 0.844328
-0.271385 -0.127704 0.781096 0.42578 0.809017
-0.289165 -0.136071 0.836352 0.42578 0.770513
-0.293762 -0.138234 0.885774 0.42578 0.728969
-0.284994 -0.134108 0.929126 0.42578 0.684547
-0.262896 -0.12371 0.966236 0.42578 0.637424
-0.227718 -0.107156 0.997 0.42578 0.587785
-0.179926 -0.0846669 1.02138 0.42578 0.535827
-0.120191 -0.0565578 1.03939 0.42578 0.481754
-0.0493808 -0.0232369 1.05112 0.42578 0.42578
--0.0314548 0.0148015 1.05671 0.42578 0.368125
--0.121099 0.0569851 1.05637 0.42578 0.309017
--0.218188 0.102672 1.05035 0.42578 0.24869
--0.321232 0.15116 1.03893 0.42578 0.187382
--0.428637 0.201701 1.02247 0.42578 0.125334
--0.538732 0.253508 1.00133 0.42578 0.0627908
--0.649795 0.305771 0.975917 0.42578 3.26795e-07
--0.760079 0.357667 0.94665 0.42578 -0.0627902
--0.867841 0.408375 0.913971 0.42578 -0.125333
--0.971366 0.457091 0.878327 0.42578 -0.187381
--1.069 0.503034 0.840165 0.42578 -0.24869
--1.15917 0.545465 0.799931 0.42578 -0.309017
--1.24041 0.583695 0.758055 0.42578 -0.368124
--1.3114 0.617099 0.714954 0.42578 -0.425779
--1.37095 0.645122 0.671018 0.42578 -0.481753
--1.41806 0.667291 0.626612 0.42578 -0.535826
--1.45192 0.683221 0.582067 0.42578 -0.587785
--1.47189 0.692621 0.537677 0.42578 -0.637424
--1.47759 0.695303 0.4937 0.42578 -0.684547
--1.46882 0.691177 0.450348 0.42578 -0.728968
--1.44562 0.68026 0.407793 0.42578 -0.770513
--1.40825 0.662673 0.366163 0.42578 -0.809017
--1.35717 0.638637 0.325541 0.42578 -0.844328
--1.29308 0.608476 0.285967 0.42578 -0.876306
--1.21685 0.572605 0.247443 0.42578 -0.904827
--1.12955 0.531529 0.20993 0.42578 -0.929776
--1.03244 0.485832 0.173354 0.42578 -0.951056
--0.926907 0.43617 0.13761 0.42578 -0.968583
--0.814467 0.38326 0.102565 0.42578 -0.982287
--0.696755 0.327869 0.0680651 0.42578 -0.992115
--0.575482 0.270802 0.033938 0.42578 -0.998027
--0.452415 0.212891 3.52696e-07 0.42578 -1
--0.329347 0.154979 -0.0339373 0.42578 -0.998027
--0.208074 0.0979124 -0.0680643 0.42578 -0.992115
--0.0903619 0.0425211 -0.102564 0.42578 -0.982287
-0.0220779 -0.0103891 -0.137609 0.42578 -0.968583
-0.127615 -0.0600512 -0.173353 0.42578 -0.951057
-0.224726 -0.105748 -0.209929 0.42578 -0.929777
-0.312017 -0.146824 -0.247442 0.42578 -0.904827
-0.388247 -0.182695 -0.285966 0.42578 -0.876307
-0.452343 -0.212857 -0.32554 0.42578 -0.844328
-0.503421 -0.236892 -0.366162 0.42578 -0.809017
-0.540797 -0.25448 -0.407793 0.42578 -0.770514
-0.563997 -0.265397 -0.450347 0.42578 -0.728969
-0.572765 -0.269523 -0.493699 0.42578 -0.684548
-0.567067 -0.266842 -0.537677 0.42578 -0.637425
-0.547089 -0.257441 -0.582066 0.42578 -0.587786
-0.513237 -0.241511 -0.626611 0.42578 -0.535828
-0.466126 -0.219343 -0.671017 0.42578 -0.481754
-0.406575 -0.19132 -0.714953 0.42578 -0.42578
-0.335588 -0.157916 -0.758054 0.42578 -0.368125
-0.254345 -0.119686 -0.79993 0.42578 -0.309018
-0.164175 -0.0772548 -0.840164 0.42578 -0.248691
-0.0665411 -0.0313119 -0.878326 0.42578 -0.187382
--0.0369841 0.0174034 -0.913971 0.42578 -0.125334
--0.144745 0.0681121 -0.94665 0.42578 -0.0627915
--0.25503 0.120008 -0.975916 0.42578 -9.80385e-07
--0.366093 0.17227 -1.00133 0.42578 0.0627895
--0.476188 0.224077 -1.02247 0.42578 0.125332
--0.583593 0.274618 -1.03893 0.42578 0.18738
--0.686636 0.323107 -1.05035 0.42578 0.248689
--0.783726 0.368794 -1.05637 0.42578 0.309016
--0.87337 0.410977 -1.05671 0.42578 0.368124
--0.954206 0.449016 -1.05112 0.42578 0.425778
--1.02502 0.482337 -1.03939 0.42578 0.481753
--1.08475 0.510446 -1.02138 0.42578 0.535826
--1.13254 0.532936 -0.997 0.42578 0.587784
--1.16772 0.549489 -0.966237 0.42578 0.637423
--1.18982 0.559888 -0.929126 0.42578 0.684546
--1.19859 0.564014 -0.885775 0.42578 0.728968
--1.19399 0.561851 -0.836353 0.42578 0.770513
--1.17621 0.553484 -0.781097 0.42578 0.809016
--1.14565 0.539101 -0.720306 0.42578 0.844327
--1.1029 0.518984 -0.654337 0.42578 0.876306
--1.04876 0.493512 -0.583609 0.42578 0.904827
--0.984233 0.463146 -0.50859 0.42578 0.929776
--0.910456 0.428429 -0.429798 0.42578 0.951056
--0.828734 0.389973 -0.347794 0.42578 0.968583
--0.740497 0.348452 -0.263174 0.42578 0.982287
--0.647279 0.304587 -0.176567 0.42578 0.992115
--0.550695 0.259138 -0.0886208 0.42578 0.998027
--0.464888 0.184063 0 0.368125 1
--0.36136 0.143073 0.0851634 0.368125 0.998027
--0.259594 0.102781 0.169713 0.368125 0.992115
--0.161323 0.0638726 0.253042 0.368125 0.982287
--0.0682265 0.0270128 0.334557 0.368125 0.968583
-0.0181025 -0.0071673 0.413683 0.368125 0.951057
-0.0961779 -0.0380796 0.489875 0.368125 0.929777
-0.164647 -0.0651883 0.562617 0.368125 0.904827
-0.22231 -0.0880189 0.631432 0.368125 0.876307
-0.268144 -0.106166 0.695884 0.368125 0.844328
-0.301313 -0.119298 0.755584 0.368125 0.809017
-0.321188 -0.127168 0.810196 0.368125 0.770513
-0.327353 -0.129609 0.859434 0.368125 0.728969
-0.319614 -0.126544 0.903068 0.368125 0.684547
-0.298001 -0.117987 0.940928 0.368125 0.637424
-0.26277 -0.104038 0.972897 0.368125 0.587785
-0.214396 -0.0848855 0.99892 0.368125 0.535827
-0.15357 -0.0608029 1.019 0.368125 0.481754
-0.0811859 -0.0321438 1.03318 0.368125 0.42578
--0.00167432 0.000662909 1.04158 0.368125 0.368125
--0.093755 0.0371203 1.04435 0.368125 0.309017
--0.193648 0.0766708 1.0417 0.368125 0.24869
--0.299814 0.118705 1.03387 0.368125 0.187382
--0.410606 0.162571 1.02114 0.368125 0.125334
--0.524299 0.207585 1.00383 0.368125 0.0627908
--0.639111 0.253042 0.982287 0.368125 3.26795e-07
--0.753234 0.298227 0.956864 0.368125 -0.0627902
--0.864867 0.342426 0.927942 0.368125 -0.125333
--0.972235 0.384936 0.895909 0.368125 -0.187381
--1.07363 0.425079 0.861155 0.368125 -0.24869
--1.16741 0.462212 0.824071 0.368125 -0.309017
--1.25208 0.495734 0.785036 0.368125 -0.368124
--1.32624 0.525098 0.74442 0.368125 -0.425779
--1.38869 0.549823 0.702574 0.368125 -0.481753
--1.43837 0.569494 0.659825 0.368125 -0.535826
--1.47444 0.583775 0.616477 0.368125 -0.587785
--1.49626 0.592412 0.572803 0.368125 -0.637424
--1.5034 0.595238 0.529045 0.368125 -0.684547
--1.49566 0.592174 0.48541 0.368125 -0.728968
--1.47307 0.583232 0.442071 0.368125 -0.770513
--1.4359 0.568514 0.399164 0.368125 -0.809017
--1.38463 0.548214 0.356788 0.368125 -0.844328
--1.31995 0.522607 0.315009 0.368125 -0.876306
--1.24278 0.492054 0.273858 0.368125 -0.904827
--1.15423 0.456991 0.233333 0.368125 -0.929776
--1.05556 0.417925 0.193404 0.368125 -0.951056
--0.948206 0.375422 0.154013 0.368125 -0.968583
--0.833746 0.330104 0.115083 0.368125 -0.982287
--0.713856 0.282636 0.0765137 0.368125 -0.992115
--0.590297 0.233715 0.0381936 0.368125 -0.998027
--0.464889 0.184063 3.97071e-07 0.368125 -1
--0.339482 0.134411 -0.0381928 0.368125 -0.998027
--0.215923 0.0854902 -0.0765129 0.368125 -0.992115
--0.0960325 0.038022 -0.115082 0.368125 -0.982287
-0.0184273 -0.00729588 -0.154013 0.368125 -0.968583
-0.125777 -0.0497988 -0.193403 0.368125 -0.951057
-0.224448 -0.0888656 -0.233332 0.368125 -0.929777
-0.313007 -0.123928 -0.273857 0.368125 -0.904827
-0.390174 -0.154481 -0.315008 0.368125 -0.876307
-0.45485 -0.180088 -0.356787 0.368125 -0.844328
-0.506124 -0.200389 -0.399163 0.368125 -0.809017
-0.543296 -0.215106 -0.44207 0.368125 -0.770514
-0.565881 -0.224048 -0.485409 0.368125 -0.728969
-0.57362 -0.227113 -0.529044 0.368125 -0.684548
-0.566483 -0.224287 -0.572802 0.368125 -0.637425
-0.544668 -0.21565 -0.616476 0.368125 -0.587786
-0.508599 -0.201369 -0.659824 0.368125 -0.535828
-0.458916 -0.181698 -0.702573 0.368125 -0.481754
-0.39647 -0.156974 -0.744419 0.368125 -0.42578
-0.322303 -0.127609 -0.785035 0.368125 -0.368125
-0.237638 -0.0940876 -0.82407 0.368125 -0.309018
-0.143852 -0.0569551 -0.861155 0.368125 -0.248691
-0.0424613 -0.0168116 -0.895908 0.368125 -0.187382
--0.064907 0.0256985 -0.927941 0.368125 -0.125334
--0.176539 0.069897 -0.956863 0.368125 -0.0627915
--0.290663 0.115082 -0.982287 0.368125 -9.80385e-07
--0.405475 0.160539 -1.00383 0.368125 0.0627895
--0.519167 0.205553 -1.02114 0.368125 0.125332
--0.62996 0.249419 -1.03387 0.368125 0.18738
--0.736126 0.291453 -1.0417 0.368125 0.248689
--0.836019 0.331004 -1.04435 0.368125 0.309016
--0.9281 0.367461 -1.04158 0.368125 0.368124
--1.01096 0.400268 -1.03318 0.368125 0.425778
--1.08335 0.428927 -1.019 0.368125 0.481753
--1.14417 0.45301 -0.998921 0.368125 0.535826
--1.19254 0.472163 -0.972898 0.368125 0.587784
--1.22778 0.486112 -0.940928 0.368125 0.637423
--1.24939 0.494669 -0.903069 0.368125 0.684546
--1.25713 0.497734 -0.859435 0.368125 0.728968
--1.25096 0.495293 -0.810197 0.368125 0.770513
--1.23109 0.487424 -0.755585 0.368125 0.809016
--1.19792 0.474291 -0.695885 0.368125 0.844327
--1.15209 0.456144 -0.631433 0.368125 0.876306
--1.09442 0.433314 -0.562619 0.368125 0.904827
--1.02596 0.406205 -0.489877 0.368125 0.929776
--0.94788 0.375293 -0.413685 0.368125 0.951056
--0.861552 0.341113 -0.334558 0.368125 0.968583
--0.768455 0.304253 -0.253044 0.368125 0.982287
--0.670185 0.265345 -0.169715 0.368125 0.992115
--0.568418 0.225053 -0.0851652 0.368125 0.998027
--0.475528 0.154509 0 0.309018 1
--0.367139 0.119291 0.0816239 0.309018 0.998027
--0.260569 0.0846641 0.162694 0.309018 0.992115
--0.15761 0.0512106 0.242662 0.309018 0.982287
--0.0599939 0.0194932 0.320991 0.309018 0.968583
-0.0306312 -0.00995269 0.397162 0.309018 0.951057
-0.11273 -0.0366283 0.470679 0.309018 0.929777
-0.184904 -0.0600792 0.541072 0.309018 0.904827
-0.245914 -0.0799026 0.607905 0.309018 0.876307
-0.294699 -0.0957537 0.670776 0.309018 0.844328
-0.330394 -0.107352 0.729327 0.309018 0.809017
-0.352346 -0.114484 0.78324 0.309018 0.770513
-0.36012 -0.11701 0.832245 0.309018 0.728969
-0.353511 -0.114863 0.87612 0.309018 0.684547
-0.332545 -0.108051 0.914691 0.309018 0.637424
-0.29748 -0.0966573 0.947835 0.309018 0.587785
-0.248801 -0.0808406 0.975479 0.309018 0.535827
-0.187214 -0.0608296 0.9976 0.309018 0.481754
-0.113633 -0.0369217 1.01422 0.309018 0.42578
-0.0291691 -0.00947762 1.02542 0.309018 0.368125
--0.0648899 0.021084 1.0313 0.309018 0.309017
--0.167098 0.0542935 1.03202 0.309018 0.24869
--0.275874 0.089637 1.02778 0.309018 0.187382
--0.389527 0.126565 1.0188 0.309018 0.125334
--0.506281 0.164501 1.00535 0.309018 0.0627908
--0.624306 0.20285 0.987688 0.309018 3.26795e-07
--0.741744 0.241008 0.966133 0.309018 -0.0627902
--0.856739 0.278372 0.940996 0.309018 -0.125333
--0.967467 0.31435 0.912606 0.309018 -0.187381
--1.07217 0.348368 0.881295 0.309018 -0.24869
--1.16916 0.379883 0.847398 0.309018 -0.309017
--1.25689 0.408388 0.811243 0.309018 -0.368124
--1.33393 0.43342 0.773152 0.309018 -0.425779
--1.39902 0.45457 0.733436 0.309018 -0.481753
--1.45109 0.471489 0.692387 0.309018 -0.535826
--1.48926 0.483892 0.650279 0.309018 -0.587785
--1.51287 0.491563 0.607363 0.309018 -0.637424
--1.52148 0.494359 0.563868 0.309018 -0.684547
--1.51487 0.492211 0.519993 0.309018 -0.728968
--1.49307 0.485129 0.475913 0.309018 -0.770513
--1.45635 0.473198 0.431771 0.309018 -0.809017
--1.40519 0.456576 0.387684 0.309018 -0.844328
--1.34032 0.435497 0.343741 0.309018 -0.876306
--1.26266 0.410262 0.300003 0.309018 -0.904827
--1.17333 0.381237 0.256506 0.309018 -0.929776
--1.07364 0.348847 0.213263 0.309018 -0.951056
--0.965063 0.313569 0.170265 0.309018 -0.968583
--0.849204 0.275924 0.127487 0.309018 -0.982287
--0.727782 0.236471 0.0848869 0.309018 -0.992115
--0.602603 0.195798 0.0424114 0.309018 -0.998027
--0.475529 0.154509 4.41055e-07 0.309018 -1
--0.348456 0.113221 -0.0424105 0.309018 -0.998027
--0.223276 0.0725471 -0.084886 0.309018 -0.992115
--0.101854 0.0330946 -0.127486 0.309018 -0.982287
-0.0140042 -0.00455025 -0.170265 0.309018 -0.968583
-0.12258 -0.0398288 -0.213262 0.309018 -0.951057
-0.222267 -0.0722191 -0.256505 0.309018 -0.929777
-0.311597 -0.101244 -0.300002 0.309018 -0.904827
-0.389263 -0.126479 -0.34374 0.309018 -0.876307
-0.454137 -0.147558 -0.387683 0.309018 -0.844328
-0.505293 -0.16418 -0.43177 0.309018 -0.809017
-0.542015 -0.176112 -0.475912 0.309018 -0.770514
-0.563811 -0.183194 -0.519993 0.309018 -0.728969
-0.57042 -0.185341 -0.563867 0.309018 -0.684548
-0.561816 -0.182546 -0.607362 0.309018 -0.637425
-0.538209 -0.174875 -0.650278 0.309018 -0.587786
-0.500037 -0.162472 -0.692386 0.309018 -0.535828
-0.447965 -0.145553 -0.733435 0.309018 -0.481754
-0.382871 -0.124403 -0.773151 0.309018 -0.42578
-0.305831 -0.0993707 -0.811242 0.309018 -0.368125
-0.218104 -0.0708665 -0.847397 0.309018 -0.309018
-0.121111 -0.0393516 -0.881295 0.309018 -0.248691
-0.0164132 -0.00533299 -0.912606 0.309018 -0.187382
--0.0943152 0.0306449 -0.940996 0.309018 -0.125334
--0.20931 0.0680092 -0.966132 0.309018 -0.0627915
--0.326748 0.106167 -0.987688 0.309018 -9.80385e-07
--0.444773 0.144516 -1.00535 0.309018 0.0627895
--0.561527 0.182452 -1.0188 0.309018 0.125332
--0.67518 0.21938 -1.02778 0.309018 0.18738
--0.783956 0.254723 -1.03202 0.309018 0.248689
--0.886164 0.287933 -1.0313 0.309018 0.309016
--0.980224 0.318495 -1.02542 0.309018 0.368124
--1.06469 0.345939 -1.01422 0.309018 0.425778
--1.13827 0.369847 -0.9976 0.309018 0.481753
--1.19986 0.389858 -0.97548 0.309018 0.535826
--1.24854 0.405675 -0.947835 0.309018 0.587784
--1.2836 0.417068 -0.914691 0.309018 0.637423
--1.30457 0.42388 -0.876121 0.309018 0.684546
--1.31118 0.426028 -0.832246 0.309018 0.728968
--1.3034 0.423502 -0.783241 0.309018 0.770513
--1.28145 0.41637 -0.729328 0.309018 0.809016
--1.24576 0.404772 -0.670777 0.309018 0.844327
--1.19697 0.388921 -0.607906 0.309018 0.876306
--1.13596 0.369097 -0.541074 0.309018 0.904827
--1.06379 0.345646 -0.470681 0.309018 0.929776
--0.981689 0.318971 -0.397164 0.309018 0.951056
--0.891064 0.289525 -0.320993 0.309018 0.968583
--0.793449 0.257808 -0.242663 0.309018 0.982287
--0.69049 0.224354 -0.162696 0.309018 0.992115
--0.58392 0.189727 -0.0816256 0.309018 0.998027
--0.484292 0.124345 0 0.24869 1
--0.371476 0.095379 0.0780038 0.24869 0.998027
--0.260529 0.0668927 0.155514 0.24869 0.992115
--0.153291 0.0393586 0.232042 0.24869 0.982287
--0.0515425 0.0132339 0.307109 0.24869 0.968583
-0.0430245 -0.0110469 0.380249 0.24869 0.951057
-0.128832 -0.0330785 0.451018 0.24869 0.929777
-0.204442 -0.0524918 0.518993 0.24869 0.904827
-0.268579 -0.0689594 0.583777 0.24869 0.876307
-0.320151 -0.0822009 0.645007 0.24869 0.844328
-0.358267 -0.0919876 0.70235 0.24869 0.809017
-0.382252 -0.0981459 0.755511 0.24869 0.770513
-0.391656 -0.100561 0.804235 0.24869 0.728969
-0.386264 -0.099176 0.848307 0.24869 0.684547
-0.366096 -0.0939977 0.887551 0.24869 0.637424
-0.331411 -0.085092 0.921837 0.24869 0.587785
-0.2827 -0.0725852 0.951075 0.24869 0.535827
-0.220682 -0.0566616 0.975219 0.24869 0.481754
-0.146288 -0.0375604 0.994263 0.24869 0.42578
-0.0606502 -0.0155724 1.00824 0.24869 0.368125
--0.0349159 0.00896491 1.01723 0.24869 0.309017
--0.138934 0.0356723 1.02133 0.24869 0.24869
--0.249789 0.0641351 1.02068 0.24869 0.187382
--0.365752 0.0939094 1.01546 0.24869 0.125334
--0.485009 0.124529 1.00587 0.24869 0.0627908
--0.605687 0.155514 0.992115 0.24869 3.26795e-07
--0.725886 0.186376 0.974449 0.24869 -0.0627902
--0.843707 0.216628 0.953122 0.24869 -0.125333
--0.957284 0.245789 0.928403 0.24869 -0.187381
--1.06481 0.273398 0.900566 0.24869 -0.24869
--1.16457 0.299013 0.869888 0.24869 -0.309017
--1.25497 0.322223 0.836648 0.24869 -0.368124
--1.33455 0.342656 0.801121 0.24869 -0.425779
--1.40202 0.35998 0.763574 0.24869 -0.481753
--1.45628 0.37391 0.724265 0.24869 -0.535826
--1.49642 0.384215 0.683439 0.24869 -0.587785
--1.52175 0.390721 0.641324 0.24869 -0.637424
--1.53183 0.393309 0.598135 0.24869 -0.684547
--1.52644 0.391925 0.554063 0.24869 -0.728968
--1.5056 0.386573 0.509285 0.24869 -0.770513
--1.46956 0.37732 0.463951 0.24869 -0.809017
--1.41883 0.364294 0.418197 0.24869 -0.844328
--1.35413 0.347682 0.372133 0.24869 -0.876306
--1.2764 0.327725 0.325851 0.24869 -0.904827
--1.18679 0.304718 0.279425 0.24869 -0.929776
--1.08664 0.279001 0.232912 0.24869 -0.951056
--0.977422 0.25096 0.186349 0.24869 -0.968583
--0.860788 0.221013 0.139766 0.24869 -0.982287
--0.738485 0.189611 0.0931762 0.24869 -0.992115
--0.612354 0.157226 0.0465874 0.24869 -0.998027
--0.484293 0.124346 4.84603e-07 0.24869 -1
--0.356232 0.091465 -0.0465864 0.24869 -0.998027
--0.230101 0.0590799 -0.0931753 0.24869 -0.992115
--0.107798 0.0276779 -0.139765 0.24869 -0.982287
-0.00883614 -0.00226874 -0.186348 0.24869 -0.968583
-0.11805 -0.0303102 -0.232911 0.24869 -0.951057
-0.218209 -0.0560266 -0.279425 0.24869 -0.929777
-0.307817 -0.0790341 -0.32585 0.24869 -0.904827
-0.385544 -0.098991 -0.372132 0.24869 -0.876307
-0.450244 -0.115603 -0.418196 0.24869 -0.844328
-0.500976 -0.128629 -0.463951 0.24869 -0.809017
-0.537013 -0.137882 -0.509284 0.24869 -0.770514
-0.557859 -0.143234 -0.554062 0.24869 -0.728969
-0.563252 -0.144619 -0.598134 0.24869 -0.684548
-0.55317 -0.14203 -0.641323 0.24869 -0.637425
-0.527834 -0.135525 -0.683438 0.24869 -0.587786
-0.487697 -0.125219 -0.724264 0.24869 -0.535828
-0.433442 -0.111289 -0.763574 0.24869 -0.481754
-0.365973 -0.0939661 -0.801121 0.24869 -0.42578
-0.286393 -0.0735335 -0.836648 0.24869 -0.368125
-0.195994 -0.0503228 -0.869887 0.24869 -0.309018
-0.0962311 -0.024708 -0.900565 0.24869 -0.248691
--0.0112966 0.00290047 -0.928403 0.24869 -0.187382
--0.124874 0.0320622 -0.953122 0.24869 -0.125334
--0.242695 0.0623136 -0.974448 0.24869 -0.0627915
--0.362894 0.0931755 -0.992114 0.24869 -9.80385e-07
--0.483572 0.12416 -1.00587 0.24869 0.0627895
--0.602828 0.15478 -1.01546 0.24869 0.125332
--0.718792 0.184555 -1.02068 0.24869 0.18738
--0.829647 0.213018 -1.02133 0.24869 0.248689
--0.933665 0.239725 -1.01723 0.24869 0.309016
--1.02923 0.264262 -1.00824 0.24869 0.368124
--1.11487 0.28625 -0.994264 0.24869 0.425778
--1.18926 0.305352 -0.97522 0.24869 0.481753
--1.25128 0.321275 -0.951076 0.24869 0.535826
--1.29999 0.333782 -0.921837 0.24869 0.587784
--1.33468 0.342688 -0.887552 0.24869 0.637423
--1.35485 0.347866 -0.848307 0.24869 0.684546
--1.36024 0.349251 -0.804236 0.24869 0.728968
--1.35084 0.346836 -0.755512 0.24869 0.770513
--1.32685 0.340678 -0.702351 0.24869 0.809016
--1.28873 0.330892 -0.645008 0.24869 0.844327
--1.23716 0.31765 -0.583779 0.24869 0.876306
--1.17303 0.301183 -0.518994 0.24869 0.904827
--1.09742 0.281769 -0.45102 0.24869 0.929776
--1.01161 0.259738 -0.380251 0.24869 0.951056
--0.917043 0.235457 -0.30711 0.24869 0.968583
--0.815294 0.209332 -0.232044 0.24869 0.982287
--0.708056 0.181798 -0.155516 0.24869 0.992115
--0.59711 0.153312 -0.0780055 0.24869 0.998027
--0.491144 0.093691 0 0.187382 1
--0.374381 0.0714173 0.0743068 0.187382 0.998027
--0.259529 0.049508 0.148181 0.187382 0.992115
--0.148466 0.0283216 0.221193 0.187382 0.982287
--0.0430127 0.00820514 0.292923 0.187382 0.968583
-0.0551018 -0.0105113 0.362961 0.187382 0.951057
-0.144264 -0.0275199 0.430912 0.187382 0.929777
-0.223003 -0.0425402 0.496401 0.187382 0.904827
-0.290014 -0.0553233 0.559074 0.187382 0.876307
-0.344179 -0.0656559 0.618601 0.187382 0.844328
-0.384585 -0.0733638 0.674679 0.187382 0.809017
-0.410538 -0.0783145 0.727037 0.187382 0.770513
-0.421574 -0.0804198 0.775432 0.187382 0.728969
-0.417467 -0.0796364 0.819656 0.187382 0.684547
-0.398235 -0.0759676 0.859535 0.187382 0.637424
-0.364134 -0.0694625 0.894929 0.187382 0.587785
-0.315661 -0.0602157 0.925733 0.187382 0.535827
-0.253541 -0.0483657 0.951876 0.187382 0.481754
-0.178719 -0.0340926 0.973323 0.187382 0.42578
-0.0923443 -0.0176157 0.990072 0.187382 0.368125
--0.00424895 0.000810532 1.00215 0.187382 0.309017
--0.10956 0.0208998 1.00962 0.187382 0.24869
--0.221948 0.042339 1.01257 0.187382 0.187382
--0.339655 0.0647929 1.01112 0.187382 0.125334
--0.460835 0.0879093 1.00539 0.187382 0.0627908
--0.583585 0.111325 0.995562 0.187382 3.26795e-07
--0.705969 0.134671 0.981803 0.187382 -0.0627902
--0.826056 0.157579 0.964308 0.187382 -0.125333
--0.941946 0.179686 0.943284 0.187382 -0.187381
--1.0518 0.200642 0.918948 0.187382 -0.24869
--1.15387 0.220114 0.89152 0.187382 -0.309017
--1.24653 0.237789 0.861228 0.187382 -0.368124
--1.32829 0.253386 0.8283 0.187382 -0.425779
--1.39784 0.266654 0.792959 0.187382 -0.481753
--1.45405 0.277376 0.755429 0.187382 -0.535826
--1.49599 0.285377 0.715924 0.187382 -0.587785
--1.52298 0.290524 0.674652 0.187382 -0.637424
--1.53453 0.292728 0.631811 0.187382 -0.684547
--1.53042 0.291945 0.587586 0.187382 -0.728968
--1.51067 0.288177 0.542154 0.187382 -0.770513
--1.47554 0.281476 0.495674 0.187382 -0.809017
--1.42553 0.271936 0.448297 0.187382 -0.844328
--1.36137 0.259696 0.400158 0.187382 -0.876306
--1.28401 0.244939 0.351378 0.187382 -0.904827
--1.19461 0.227885 0.302069 0.187382 -0.929776
--1.09452 0.208792 0.25233 0.187382 -0.951056
--0.985254 0.187948 0.202249 0.187382 -0.968583
--0.868466 0.165669 0.151907 0.187382 -0.982287
--0.745932 0.142295 0.101374 0.187382 -0.992115
--0.619516 0.118179 0.0507174 0.187382 -0.998027
--0.491145 0.0936912 5.27672e-07 0.187382 -1
--0.362774 0.069203 -0.0507164 0.187382 -0.998027
--0.236358 0.0450879 -0.101373 0.187382 -0.992115
--0.113824 0.0217131 -0.151905 0.187382 -0.982287
-0.00296473 -0.000565554 -0.202248 0.187382 -0.968583
-0.112233 -0.0214096 -0.252329 0.187382 -0.951057
-0.212323 -0.0405029 -0.302068 0.187382 -0.929777
-0.301721 -0.0575566 -0.351377 0.187382 -0.904827
-0.379081 -0.0723139 -0.400157 0.187382 -0.876307
-0.443244 -0.0845536 -0.448296 0.187382 -0.844328
-0.493256 -0.094094 -0.495673 0.187382 -0.809017
-0.528387 -0.100795 -0.542153 0.187382 -0.770514
-0.548135 -0.104563 -0.587586 0.187382 -0.728969
-0.552242 -0.105346 -0.63181 0.187382 -0.684548
-0.54069 -0.103143 -0.674651 0.187382 -0.637425
-0.513708 -0.0979954 -0.715923 0.187382 -0.587786
-0.471764 -0.089994 -0.755428 0.187382 -0.535828
-0.415556 -0.0792719 -0.792959 0.187382 -0.481754
-0.346007 -0.0660047 -0.828299 0.187382 -0.42578
-0.264245 -0.0504077 -0.861228 0.187382 -0.368125
-0.171587 -0.032732 -0.89152 0.187382 -0.309018
-0.0695157 -0.0132609 -0.918947 0.187382 -0.248691
--0.0403384 0.00769499 -0.943284 0.187382 -0.187382
--0.156228 0.0298022 -0.964307 0.187382 -0.125334
--0.276316 0.0527102 -0.981802 0.187382 -0.0627915
--0.3987 0.0760563 -0.995562 0.187382 -9.80385e-07
--0.521449 0.0994721 -1.00539 0.187382 0.0627895
--0.64263 0.122589 -1.01112 0.187382 0.125332
--0.760337 0.145042 -1.01257 0.187382 0.18738
--0.872725 0.166482 -1.00962 0.187382 0.248689
--0.978036 0.186571 -1.00215 0.187382 0.309016
--1.07463 0.204997 -0.990072 0.187382 0.368124
--1.161 0.221474 -0.973324 0.187382 0.425778
--1.23583 0.235747 -0.951877 0.187382 0.481753
--1.29795 0.247597 -0.925733 0.187382 0.535826
--1.34642 0.256844 -0.89493 0.187382 0.587784
--1.38052 0.263349 -0.859536 0.187382 0.637423
--1.39975 0.267018 -0.819657 0.187382 0.684546
--1.40386 0.267802 -0.775433 0.187382 0.728968
--1.39283 0.265697 -0.727038 0.187382 0.770513
--1.36687 0.260746 -0.67468 0.187382 0.809016
--1.32647 0.253038 -0.618602 0.187382 0.844327
--1.2723 0.242705 -0.559075 0.187382 0.876306
--1.20529 0.229922 -0.496403 0.187382 0.904827
--1.12655 0.214902 -0.430914 0.187382 0.929776
--1.03739 0.197894 -0.362963 0.187382 0.951056
--0.939277 0.179177 -0.292925 0.187382 0.968583
--0.833823 0.159061 -0.221195 0.187382 0.982287
--0.722761 0.137874 -0.148182 0.187382 0.992115
--0.607908 0.115965 -0.0743083 0.187382 0.998027
--0.496057 0.0626669 0 0.125334 1
--0.375869 0.0474836 0.0705364 0.125334 0.998027
--0.257623 0.0325455 0.140701 0.125334 0.992115
--0.143229 0.0180942 0.210126 0.125334 0.982287
--0.034538 0.00436318 0.278449 0.125334 0.968583
-0.0666918 -0.00842517 0.345315 0.125334 0.951057
-0.158819 -0.0200636 0.410381 0.125334 0.929777
-0.240347 -0.0303631 0.47332 0.125334 0.904827
-0.309949 -0.0391558 0.533819 0.125334 0.876307
-0.366484 -0.0462979 0.591584 0.125334 0.844328
-0.409021 -0.0516717 0.646343 0.125334 0.809017
-0.436852 -0.0551876 0.697845 0.125334 0.770513
-0.449501 -0.0567855 0.745863 0.125334 0.728969
-0.446734 -0.0564359 0.790197 0.125334 0.684547
-0.428562 -0.0541402 0.830671 0.125334 0.637424
-0.39524 -0.0499306 0.867138 0.125334 0.587785
-0.347266 -0.0438701 0.899477 0.125334 0.535827
-0.28537 -0.0360508 0.927593 0.125334 0.481754
-0.210505 -0.0265931 0.951423 0.125334 0.42578
-0.123831 -0.0156436 0.970925 0.125334 0.368125
-0.026696 -0.00337251 0.986087 0.125334 0.309017
--0.0793837 0.0100285 0.996922 0.125334 0.24869
--0.192748 0.0243499 1.00346 0.125334 0.187382
--0.311619 0.0393669 1.00577 0.125334 0.125334
--0.43413 0.0548436 1.00393 0.125334 0.0627908
--0.558352 0.0705367 0.998027 0.125334 3.26795e-07
--0.682329 0.0861986 0.988188 0.125334 -0.0627902
--0.804103 0.101582 0.974542 0.125334 -0.125333
--0.92175 0.116445 0.957234 0.125334 -0.187381
--1.03341 0.13055 0.936422 0.125334 -0.24869
--1.1373 0.143676 0.912272 0.125334 -0.309017
--1.23179 0.155612 0.884959 0.125334 -0.368124
--1.31535 0.166169 0.854661 0.125334 -0.425779
--1.38666 0.175177 0.821562 0.125334 -0.481753
--1.44458 0.182493 0.785847 0.125334 -0.535826
--1.48815 0.187998 0.747703 0.125334 -0.587785
--1.51668 0.191602 0.707314 0.125334 -0.637424
--1.52967 0.193243 0.664864 0.125334 -0.684547
--1.5269 0.192894 0.62053 0.125334 -0.728968
--1.50838 0.190554 0.574488 0.125334 -0.770513
--1.47437 0.186257 0.526908 0.125334 -0.809017
--1.42536 0.180066 0.477955 0.125334 -0.844328
--1.36209 0.172072 0.427787 0.125334 -0.876306
--1.28551 0.162399 0.376558 0.125334 -0.904827
--1.1968 0.151192 0.324415 0.125334 -0.929776
--1.09731 0.138623 0.2715 0.125334 -0.951056
--0.988562 0.124885 0.21795 0.125334 -0.968583
--0.872233 0.110189 0.163897 0.125334 -0.982287
--0.750108 0.0947612 0.109471 0.125334 -0.992115
--0.62407 0.0788387 0.0547974 0.125334 -0.998027
--0.496059 0.0626671 5.70221e-07 0.125334 -1
--0.368048 0.0464954 -0.0547963 0.125334 -0.998027
--0.242009 0.030573 -0.10947 0.125334 -0.992115
--0.119885 0.015145 -0.163896 0.125334 -0.982287
--0.00355455 0.000449046 -0.217949 0.125334 -0.968583
-0.105192 -0.0132888 -0.271499 0.125334 -0.951057
-0.204683 -0.0258576 -0.324414 0.125334 -0.929777
-0.293395 -0.0370646 -0.376557 0.125334 -0.904827
-0.36997 -0.0467383 -0.427786 0.125334 -0.876307
-0.433242 -0.0547315 -0.477954 0.125334 -0.844328
-0.482254 -0.0609231 -0.526907 0.125334 -0.809017
-0.51627 -0.0652203 -0.574487 0.125334 -0.770514
-0.53479 -0.06756 -0.620529 0.125334 -0.728969
-0.537557 -0.0679096 -0.664863 0.125334 -0.684548
-0.524561 -0.0662678 -0.707314 0.125334 -0.637425
-0.496037 -0.0626643 -0.747702 0.125334 -0.587786
-0.452462 -0.0571595 -0.785846 0.125334 -0.535828
-0.394551 -0.0498436 -0.821561 0.125334 -0.481754
-0.32324 -0.0408349 -0.85466 0.125334 -0.42578
-0.239674 -0.030278 -0.884958 0.125334 -0.368125
-0.14519 -0.0183419 -0.912272 0.125334 -0.309018
-0.0412946 -0.00521674 -0.936422 0.125334 -0.248691
--0.0703623 0.00888886 -0.957234 0.125334 -0.187382
--0.188009 0.0237512 -0.974541 0.125334 -0.125334
--0.309783 0.0391349 -0.988187 0.125334 -0.0627915
--0.43376 0.0547969 -0.998027 0.125334 -9.80385e-07
--0.557982 0.0704899 -1.00393 0.125334 0.0627895
--0.680493 0.0859667 -1.00577 0.125334 0.125332
--0.799364 0.100984 -1.00346 0.125334 0.18738
--0.912729 0.115305 -0.996922 0.125334 0.248689
--1.01881 0.128706 -0.986088 0.125334 0.309016
--1.11594 0.140977 -0.970925 0.125334 0.368124
--1.20262 0.151927 -0.951423 0.125334 0.425778
--1.27748 0.161384 -0.927594 0.125334 0.481753
--1.33938 0.169204 -0.899477 0.125334 0.535826
--1.38735 0.175264 -0.867139 0.125334 0.587784
--1.42068 0.179474 -0.830672 0.125334 0.637423
--1.43885 0.18177 -0.790198 0.125334 0.684546
--1.44162 0.182119 -0.745864 0.125334 0.728968
--1.42897 0.180521 -0.697846 0.125334 0.770513
--1.40114 0.177006 -0.646344 0.125334 0.809016
--1.3586 0.171632 -0.591585 0.125334 0.844327
--1.30206 0.16449 -0.53382 0.125334 0.876306
--1.23246 0.155697 -0.473321 0.125334 0.904827
--1.15094 0.145398 -0.410383 0.125334 0.929776
--1.05881 0.133759 -0.345316 0.125334 0.951056
--0.957579 0.120971 -0.27845 0.125334 0.968583
--0.848888 0.10724 -0.210128 0.125334 0.982287
--0.734494 0.0927886 -0.140703 0.125334 0.992115
--0.616248 0.0778506 -0.0705378 0.125334 0.998027
--0.499013 0.0313956 0 0.0627912 1
--0.375958 0.0236535 0.0666964 0.0627912 0.998027
--0.254866 0.016035 0.133083 0.0627912 0.992115
--0.137671 0.0086616 0.198852 0.0627912 0.982287
--0.0262439 0.00165114 0.2637 0.0627912 0.968583
-0.077635 -0.00488443 0.327327 0.0627912 0.951057
-0.172305 -0.0108406 0.389445 0.0627912 0.929777
-0.256252 -0.0161222 0.449772 0.0627912 0.904827
-0.32813 -0.0206444 0.508037 0.0627912 0.876307
-0.386785 -0.0243347 0.563984 0.0627912 0.844328
-0.431271 -0.0271336 0.617369 0.0627912 0.809017
-0.460869 -0.0289957 0.667964 0.0627912 0.770513
-0.475093 -0.0298906 0.715558 0.0627912 0.728969
-0.4737 -0.029803 0.759958 0.0627912 0.684547
-0.456697 -0.0287332 0.800988 0.0627912 0.637424
-0.424336 -0.0266972 0.838491 0.0627912 0.587785
-0.377114 -0.0237262 0.872333 0.0627912 0.535827
-0.315761 -0.0198662 0.902395 0.0627912 0.481754
-0.241235 -0.0151774 0.928583 0.0627912 0.42578
-0.154699 -0.00973291 0.95082 0.0627912 0.368125
-0.0575082 -0.00361815 0.96905 0.0627912 0.309017
--0.0488113 0.00307098 0.983238 0.0627912 0.24869
--0.16259 0.0102294 0.993366 0.0627912 0.187382
--0.282038 0.0177445 0.999437 0.0627912 0.125334
--0.405276 0.0254981 1.00147 0.0627912 0.0627908
--0.530362 0.0333679 0.999507 0.0627912 3.26795e-07
--0.655324 0.0412299 0.993597 0.0627912 -0.0627902
--0.778191 0.0489601 0.983814 0.0627912 -0.125333
--0.897023 0.0564365 0.970239 0.0627912 -0.187381
--1.00994 0.0635409 0.952973 0.0627912 -0.24869
--1.11516 0.0701608 0.932124 0.0627912 -0.309017
--1.21102 0.0761917 0.907815 0.0627912 -0.368124
--1.29599 0.0815377 0.880178 0.0627912 -0.425779
--1.36873 0.0861141 0.849353 0.0627912 -0.481753
--1.42808 0.089848 0.81549 0.0627912 -0.535826
--1.47309 0.0926797 0.778744 0.0627912 -0.587785
--1.50303 0.0945638 0.739279 0.0627912 -0.637424
--1.51743 0.0954697 0.69726 0.0627912 -0.684547
--1.51604 0.0953821 0.652861 0.0627912 -0.728968
--1.49886 0.0943013 0.606255 0.0627912 -0.770513
--1.46615 0.0922434 0.557622 0.0627912 -0.809017
--1.41841 0.0892395 0.507141 0.0627912 -0.844328
--1.35636 0.085336 0.454995 0.0627912 -0.876306
--1.28098 0.080593 0.401367 0.0627912 -0.904827
--1.19341 0.075084 0.346441 0.0627912 -0.929776
--1.09504 0.0688946 0.290402 0.0627912 -0.951056
--0.987376 0.0621211 0.233435 0.0627912 -0.968583
--0.872106 0.0548688 0.175726 0.0627912 -0.982287
--0.75102 0.0472507 0.11746 0.0627912 -0.992115
--0.626007 0.0393854 0.0588233 0.0627912 -0.998027
--0.499015 0.0313957 6.12207e-07 0.0627912 -1
--0.372022 0.0234059 -0.0588221 0.0627912 -0.998027
--0.247009 0.0155406 -0.117459 0.0627912 -0.992115
--0.125924 0.00792252 -0.175725 0.0627912 -0.982287
--0.0106526 0.000670213 -0.233434 0.0627912 -0.968583
-0.0970088 -0.00610334 -0.290401 0.0627912 -0.951057
-0.195385 -0.0122927 -0.34644 0.0627912 -0.929777
-0.282947 -0.0178017 -0.401366 0.0627912 -0.904827
-0.358334 -0.0225447 -0.454994 0.0627912 -0.876307
-0.42038 -0.0264483 -0.50714 0.0627912 -0.844328
-0.468124 -0.0294522 -0.557621 0.0627912 -0.809017
-0.500834 -0.0315101 -0.606254 0.0627912 -0.770514
-0.518012 -0.0325909 -0.65286 0.0627912 -0.728969
-0.519405 -0.0326785 -0.697259 0.0627912 -0.684548
-0.505007 -0.0317727 -0.739278 0.0627912 -0.637425
-0.475061 -0.0298886 -0.778744 0.0627912 -0.587786
-0.430052 -0.0270569 -0.815489 0.0627912 -0.535828
-0.370705 -0.023323 -0.849353 0.0627912 -0.481754
-0.297967 -0.0187467 -0.880177 0.0627912 -0.42578
-0.212995 -0.0134006 -0.907815 0.0627912 -0.368125
-0.117139 -0.00736982 -0.932124 0.0627912 -0.309018
-0.0119182 -0.00074984 -0.952973 0.0627912 -0.248691
--0.101001 0.00635451 -0.970239 0.0627912 -0.187382
--0.219833 0.0138309 -0.983813 0.0627912 -0.125334
--0.3427 0.0215611 -0.993597 0.0627912 -0.0627915
--0.467662 0.0294231 -0.999506 0.0627912 -9.80385e-07
--0.592748 0.0372929 -1.00147 0.0627912 0.0627895
--0.715986 0.0450465 -0.999437 0.0627912 0.125332
--0.835434 0.0525616 -0.993366 0.0627912 0.18738
--0.949213 0.05972 -0.983238 0.0627912 0.248689
--1.05553 0.0664092 -0.96905 0.0627912 0.309016
--1.15272 0.0725239 -0.95082 0.0627912 0.368124
--1.23926 0.0779684 -0.928584 0.0627912 0.425778
--1.31379 0.0826573 -0.902396 0.0627912 0.481753
--1.37514 0.0865173 -0.872333 0.0627912 0.535826
--1.42236 0.0894884 -0.838492 0.0627912 0.587784
--1.45472 0.0915244 -0.800988 0.0627912 0.637423
--1.47173 0.0925941 -0.759959 0.0627912 0.684546
--1.47312 0.0926818 -0.715559 0.0627912 0.728968
--1.4589 0.0917869 -0.667965 0.0627912 0.770513
--1.4293 0.0899248 -0.61737 0.0627912 0.809016
--1.38481 0.0871259 -0.563985 0.0627912 0.844327
--1.32616 0.0834356 -0.508038 0.0627912 0.876306
--1.25428 0.0789134 -0.449773 0.0627912 0.904827
--1.17033 0.0736319 -0.389446 0.0627912 0.929776
--1.07566 0.0676757 -0.327329 0.0627912 0.951056
--0.971785 0.0611402 -0.263701 0.0627912 0.968583
--0.860358 0.0541297 -0.198853 0.0627912 0.982287
--0.743163 0.0467564 -0.133084 0.0627912 0.992115
--0.622072 0.0391378 -0.0666978 0.0627912 0.998027
--0.5 3.26795e-07 0 6.5359e-07 1
--0.374667 2.44878e-07 0.0627905 6.5359e-07 0.998027
--0.25131 1.64254e-07 0.125333 6.5359e-07 0.992115
--0.131876 8.61925e-08 0.187381 6.5359e-07 0.982287
--0.0182465 1.19257e-08 0.24869 6.5359e-07 0.968583
-0.087785 -5.73754e-08 0.309017 6.5359e-07 0.951057
-0.184547 -1.20618e-07 0.368125 6.5359e-07 0.929777
-0.270513 -1.76805e-07 0.425779 6.5359e-07 0.904827
-0.344328 -2.25049e-07 0.481754 6.5359e-07 0.876307
-0.404827 -2.64591e-07 0.535827 6.5359e-07 0.844328
-0.451056 -2.94806e-07 0.587785 6.5359e-07 0.809017
-0.482287 -3.15218e-07 0.637424 6.5359e-07 0.770513
-0.498026 -3.25505e-07 0.684547 6.5359e-07 0.728969
-0.498027 -3.25505e-07 0.728969 6.5359e-07 0.684547
-0.482287 -3.15218e-07 0.770513 6.5359e-07 0.637424
-0.451056 -2.94806e-07 0.809017 6.5359e-07 0.587785
-0.404827 -2.64591e-07 0.844328 6.5359e-07 0.535827
-0.344328 -2.25049e-07 0.876307 6.5359e-07 0.481754
-0.270513 -1.76805e-07 0.904827 6.5359e-07 0.42578
-0.184547 -1.20618e-07 0.929777 6.5359e-07 0.368125
-0.0877854 -5.73756e-08 0.951057 6.5359e-07 0.309017
--0.0182462 1.19255e-08 0.968583 6.5359e-07 0.24869
--0.131875 8.61923e-08 0.982287 6.5359e-07 0.187382
--0.25131 1.64254e-07 0.992115 6.5359e-07 0.125334
--0.374666 2.44878e-07 0.998027 6.5359e-07 0.0627908
--0.5 3.26795e-07 1 6.5359e-07 3.26795e-07
--0.625333 4.08711e-07 0.998027 6.5359e-07 -0.0627902
--0.74869 4.89336e-07 0.992115 6.5359e-07 -0.125333
--0.868124 5.67397e-07 0.982287 6.5359e-07 -0.187381
--0.981753 6.41664e-07 0.968583 6.5359e-07 -0.24869
--1.08778 7.10965e-07 0.951056 6.5359e-07 -0.309017
--1.18455 7.74208e-07 0.929776 6.5359e-07 -0.368124
--1.27051 8.30394e-07 0.904827 6.5359e-07 -0.425779
--1.34433 8.78639e-07 0.876307 6.5359e-07 -0.481753
--1.40483 9.18181e-07 0.844328 6.5359e-07 -0.535826
--1.45106 9.48396e-07 0.809017 6.5359e-07 -0.587785
--1.48229 9.68808e-07 0.770513 6.5359e-07 -0.637424
--1.49803 9.79095e-07 0.728969 6.5359e-07 -0.684547
--1.49803 9.79095e-07 0.684547 6.5359e-07 -0.728968
--1.48229 9.68808e-07 0.637424 6.5359e-07 -0.770513
--1.45106 9.48396e-07 0.587785 6.5359e-07 -0.809017
--1.40483 9.18181e-07 0.535827 6.5359e-07 -0.844328
--1.34433 8.7864e-07 0.481754 6.5359e-07 -0.876306
--1.27051 8.30395e-07 0.42578 6.5359e-07 -0.904827
--1.18455 7.74209e-07 0.368125 6.5359e-07 -0.929776
--1.08779 7.10966e-07 0.309017 6.5359e-07 -0.951056
--0.981755 6.41665e-07 0.24869 6.5359e-07 -0.968583
--0.868126 5.67398e-07 0.187382 6.5359e-07 -0.982287
--0.748691 4.89337e-07 0.125334 6.5359e-07 -0.992115
--0.625335 4.08712e-07 0.0627911 6.5359e-07 -0.998027
--0.500001 3.26796e-07 6.53589e-07 6.5359e-07 -1
--0.374668 2.44879e-07 -0.0627898 6.5359e-07 -0.998027
--0.251311 1.64255e-07 -0.125332 6.5359e-07 -0.992115
--0.131877 8.61932e-08 -0.187381 6.5359e-07 -0.982287
--0.0182475 1.19264e-08 -0.248689 6.5359e-07 -0.968583
-0.0877842 -5.73749e-08 -0.309016 6.5359e-07 -0.951057
-0.184546 -1.20617e-07 -0.368124 6.5359e-07 -0.929777
-0.270512 -1.76804e-07 -0.425778 6.5359e-07 -0.904827
-0.344327 -2.25049e-07 -0.481753 6.5359e-07 -0.876307
-0.404827 -2.64591e-07 -0.535826 6.5359e-07 -0.844328
-0.451056 -2.94806e-07 -0.587784 6.5359e-07 -0.809017
-0.482287 -3.15218e-07 -0.637423 6.5359e-07 -0.770514
-0.498027 -3.25505e-07 -0.684546 6.5359e-07 -0.728969
-0.498027 -3.25505e-07 -0.728968 6.5359e-07 -0.684548
-0.482288 -3.15218e-07 -0.770512 6.5359e-07 -0.637425
-0.451057 -2.94806e-07 -0.809016 6.5359e-07 -0.587786
-0.404828 -2.64591e-07 -0.844327 6.5359e-07 -0.535828
-0.344329 -2.2505e-07 -0.876306 6.5359e-07 -0.481754
-0.270515 -1.76806e-07 -0.904826 6.5359e-07 -0.42578
-0.184549 -1.20619e-07 -0.929776 6.5359e-07 -0.368125
-0.087787 -5.73767e-08 -0.951056 6.5359e-07 -0.309018
--0.0182444 1.19243e-08 -0.968583 6.5359e-07 -0.248691
--0.131873 8.61911e-08 -0.982287 6.5359e-07 -0.187382
--0.251308 1.64252e-07 -0.992115 6.5359e-07 -0.125334
--0.374665 2.44877e-07 -0.998027 6.5359e-07 -0.0627915
--0.499998 3.26793e-07 -1 6.5359e-07 -9.80385e-07
--0.625331 4.0871e-07 -0.998027 6.5359e-07 0.0627895
--0.748688 4.89335e-07 -0.992115 6.5359e-07 0.125332
--0.868122 5.67396e-07 -0.982288 6.5359e-07 0.18738
--0.981752 6.41663e-07 -0.968584 6.5359e-07 0.248689
--1.08778 7.10964e-07 -0.951057 6.5359e-07 0.309016
--1.18455 7.74207e-07 -0.929777 6.5359e-07 0.368124
--1.27051 8.30393e-07 -0.904828 6.5359e-07 0.425778
--1.34433 8.78638e-07 -0.876307 6.5359e-07 0.481753
--1.40483 9.1818e-07 -0.844329 6.5359e-07 0.535826
--1.45106 9.48395e-07 -0.809018 6.5359e-07 0.587784
--1.48229 9.68807e-07 -0.770514 6.5359e-07 0.637423
--1.49803 9.79095e-07 -0.72897 6.5359e-07 0.684546
--1.49803 9.79095e-07 -0.684548 6.5359e-07 0.728968
--1.48229 9.68808e-07 -0.637425 6.5359e-07 0.770513
--1.45106 9.48396e-07 -0.587787 6.5359e-07 0.809016
--1.40483 9.18181e-07 -0.535828 6.5359e-07 0.844327
--1.34433 8.7864e-07 -0.481755 6.5359e-07 0.876306
--1.27051 8.30395e-07 -0.425781 6.5359e-07 0.904827
--1.18455 7.74209e-07 -0.368126 6.5359e-07 0.929776
--1.08779 7.10967e-07 -0.309018 6.5359e-07 0.951056
--0.981756 6.41666e-07 -0.248691 6.5359e-07 0.968583
--0.868127 5.67399e-07 -0.187383 6.5359e-07 0.982287
--0.748692 4.89338e-07 -0.125335 6.5359e-07 0.992115
--0.625336 4.08713e-07 -0.0627919 6.5359e-07 0.998027
--0.499013 -0.0313949 0 -0.0627899 1
--0.372021 -0.0234053 0.0588228 -0.0627899 0.998027
--0.247008 -0.0155402 0.11746 -0.0627899 0.992115
--0.125922 -0.00792229 0.175726 -0.0627899 0.982287
--0.0106516 -0.000670136 0.233435 -0.0627899 0.968583
-0.0970097 0.00610327 0.290402 -0.0627899 0.951057
-0.195386 0.0122925 0.346441 -0.0627899 0.929777
-0.282947 0.0178014 0.401367 -0.0627899 0.904827
-0.358335 0.0225443 0.454995 -0.0627899 0.876307
-0.42038 0.0264478 0.507141 -0.0627899 0.844328
-0.468124 0.0294516 0.557622 -0.0627899 0.809017
-0.500834 0.0315095 0.606255 -0.0627899 0.770513
-0.518012 0.0325902 0.652861 -0.0627899 0.728969
-0.519405 0.0326778 0.69726 -0.0627899 0.684547
-0.505006 0.031772 0.739279 -0.0627899 0.637424
-0.47506 0.0298879 0.778745 -0.0627899 0.587785
-0.430051 0.0270562 0.81549 -0.0627899 0.535827
-0.370704 0.0233225 0.849353 -0.0627899 0.481754
-0.297965 0.0187462 0.880178 -0.0627899 0.42578
-0.212993 0.0134003 0.907816 -0.0627899 0.368125
-0.117137 0.00736957 0.932125 -0.0627899 0.309017
-0.0119165 0.000749714 0.952973 -0.0627899 0.24869
--0.101003 -0.00635449 0.97024 -0.0627899 0.187382
--0.219835 -0.0138307 0.983814 -0.0627899 0.125334
--0.342702 -0.0215608 0.993597 -0.0627899 0.0627908
--0.467664 -0.0294226 0.999507 -0.0627899 3.26795e-07
--0.59275 -0.0372923 1.00147 -0.0627899 -0.0627902
--0.715988 -0.0450457 0.999437 -0.0627899 -0.125333
--0.835436 -0.0525606 0.993366 -0.0627899 -0.187381
--0.949215 -0.0597189 0.983237 -0.0627899 -0.24869
--1.05553 -0.0664079 0.96905 -0.0627899 -0.309017
--1.15272 -0.0725225 0.95082 -0.0627899 -0.368124
--1.23926 -0.0779669 0.928583 -0.0627899 -0.425779
--1.31379 -0.0826557 0.902395 -0.0627899 -0.481753
--1.37514 -0.0865156 0.872333 -0.0627899 -0.535826
--1.42236 -0.0894866 0.838491 -0.0627899 -0.587785
--1.45472 -0.0915225 0.800987 -0.0627899 -0.637424
--1.47173 -0.0925922 0.759958 -0.0627899 -0.684547
--1.47312 -0.0926799 0.715558 -0.0627899 -0.728968
--1.4589 -0.091785 0.667964 -0.0627899 -0.770513
--1.4293 -0.0899229 0.617369 -0.0627899 -0.809017
--1.38481 -0.0871241 0.563984 -0.0627899 -0.844328
--1.32616 -0.0834339 0.508037 -0.0627899 -0.876306
--1.25428 -0.0789118 0.449772 -0.0627899 -0.904827
--1.17033 -0.0736303 0.389445 -0.0627899 -0.929776
--1.07566 -0.0676743 0.327328 -0.0627899 -0.951056
--0.971784 -0.0611388 0.2637 -0.0627899 -0.968583
--0.860357 -0.0541285 0.198852 -0.0627899 -0.982287
--0.743162 -0.0467553 0.133084 -0.0627899 -0.992115
--0.62207 -0.0391369 0.066697 -0.0627899 -0.998027
--0.499015 -0.031395 6.94326e-07 -0.0627899 -1
--0.375959 -0.0236531 -0.0666956 -0.0627899 -0.998027
--0.254867 -0.0160347 -0.133082 -0.0627899 -0.992115
--0.137672 -0.00866149 -0.198851 -0.0627899 -0.982287
--0.0262448 -0.00165117 -0.263699 -0.0627899 -0.968583
-0.0776342 0.00488428 -0.327326 -0.0627899 -0.951057
-0.172305 0.0108404 -0.389444 -0.0627899 -0.929777
-0.256252 0.0161218 -0.449771 -0.0627899 -0.904827
-0.32813 0.0206439 -0.508036 -0.0627899 -0.876307
-0.386785 0.0243342 -0.563983 -0.0627899 -0.844328
-0.431272 0.027133 -0.617368 -0.0627899 -0.809017
-0.460869 0.0289951 -0.667963 -0.0627899 -0.770514
-0.475093 0.02989 -0.715557 -0.0627899 -0.728969
-0.473701 0.0298024 -0.759957 -0.0627899 -0.684548
-0.456698 0.0287327 -0.800987 -0.0627899 -0.637425
-0.424337 0.0266968 -0.83849 -0.0627899 -0.587786
-0.377115 0.0237258 -0.872332 -0.0627899 -0.535828
-0.315763 0.0198659 -0.902395 -0.0627899 -0.481754
-0.241236 0.0151771 -0.928582 -0.0627899 -0.42578
-0.1547 0.0097328 -0.950819 -0.0627899 -0.368125
-0.0575099 0.00361818 -0.96905 -0.0627899 -0.309018
--0.0488095 -0.0030708 -0.983237 -0.0627899 -0.248691
--0.162588 -0.0102291 -0.993365 -0.0627899 -0.187382
--0.282036 -0.017744 -0.999437 -0.0627899 -0.125334
--0.405274 -0.0254974 -1.00147 -0.0627899 -0.0627915
--0.53036 -0.0333671 -0.999507 -0.0627899 -9.80385e-07
--0.655322 -0.0412289 -0.993598 -0.0627899 0.0627895
--0.778189 -0.048959 -0.983814 -0.0627899 0.125332
--0.897022 -0.0564352 -0.97024 -0.0627899 0.18738
--1.00994 -0.0635394 -0.952973 -0.0627899 0.248689
--1.11516 -0.0701593 -0.932125 -0.0627899 0.309016
--1.21102 -0.07619 -0.907816 -0.0627899 0.368124
--1.29599 -0.0815359 -0.880179 -0.0627899 0.425778
--1.36873 -0.0861122 -0.849354 -0.0627899 0.481753
--1.42808 -0.089846 -0.815491 -0.0627899 0.535826
--1.47309 -0.0926777 -0.778745 -0.0627899 0.587784
--1.50303 -0.0945618 -0.73928 -0.0627899 0.637423
--1.51743 -0.0954677 -0.697261 -0.0627899 0.684546
--1.51604 -0.0953801 -0.652862 -0.0627899 0.728968
--1.49886 -0.0942994 -0.606256 -0.0627899 0.770513
--1.46615 -0.0922415 -0.557623 -0.0627899 0.809016
--1.41841 -0.0892377 -0.507142 -0.0627899 0.844327
--1.35636 -0.0853342 -0.454996 -0.0627899 0.876306
--1.28098 -0.0805913 -0.401368 -0.0627899 0.904827
--1.19341 -0.0750825 -0.346442 -0.0627899 0.929776
--1.09504 -0.0688933 -0.290403 -0.0627899 0.951056
--0.987377 -0.0621199 -0.233436 -0.0627899 0.968583
--0.872107 -0.0548677 -0.175727 -0.0627899 0.982287
--0.751022 -0.0472498 -0.117461 -0.0627899 0.992115
--0.626009 -0.0393847 -0.058824 -0.0627899 0.998027
--0.496057 -0.0626663 0 -0.125333 1
--0.368046 -0.0464948 0.0547969 -0.125333 0.998027
--0.242008 -0.0305725 0.109471 -0.125333 0.992115
--0.119883 -0.0151447 0.163897 -0.125333 0.982287
--0.00355352 -0.000448911 0.21795 -0.125333 0.968583
-0.105192 0.0132888 0.2715 -0.125333 0.951057
-0.204684 0.0258575 0.324415 -0.125333 0.929777
-0.293396 0.0370643 0.376558 -0.125333 0.904827
-0.369971 0.0467379 0.427787 -0.125333 0.876307
-0.433243 0.054731 0.477955 -0.125333 0.844328
-0.482254 0.0609225 0.526908 -0.125333 0.809017
-0.51627 0.0652197 0.574488 -0.125333 0.770513
-0.53479 0.0675593 0.62053 -0.125333 0.728969
-0.537557 0.0679089 0.664864 -0.125333 0.684547
-0.524561 0.066267 0.707315 -0.125333 0.637424
-0.496036 0.0626636 0.747703 -0.125333 0.587785
-0.452461 0.0571588 0.785847 -0.125333 0.535827
-0.39455 0.0498429 0.821562 -0.125333 0.481754
-0.323238 0.0408343 0.854661 -0.125333 0.42578
-0.239673 0.0302775 0.884959 -0.125333 0.368125
-0.145189 0.0183415 0.912273 -0.125333 0.309017
-0.0412928 0.00521647 0.936422 -0.125333 0.24869
--0.0703641 -0.008889 0.957234 -0.125333 0.187382
--0.188011 -0.0237512 0.974542 -0.125333 0.125334
--0.309785 -0.0391347 0.988188 -0.125333 0.0627908
--0.433762 -0.0547965 0.998027 -0.125333 3.26795e-07
--0.557984 -0.0704894 1.00393 -0.125333 -0.0627902
--0.680495 -0.085966 1.00577 -0.125333 -0.125333
--0.799366 -0.100983 1.00346 -0.125333 -0.187381
--0.912731 -0.115304 0.996921 -0.125333 -0.24869
--1.01881 -0.128705 0.986087 -0.125333 -0.309017
--1.11595 -0.140976 0.970925 -0.125333 -0.368124
--1.20262 -0.151925 0.951422 -0.125333 -0.425779
--1.27748 -0.161383 0.927593 -0.125333 -0.481753
--1.33938 -0.169202 0.899476 -0.125333 -0.535826
--1.38735 -0.175263 0.867138 -0.125333 -0.587785
--1.42068 -0.179472 0.830671 -0.125333 -0.637424
--1.43885 -0.181768 0.790197 -0.125333 -0.684547
--1.44162 -0.182118 0.745863 -0.125333 -0.728968
--1.42897 -0.18052 0.697845 -0.125333 -0.770513
--1.40114 -0.177004 0.646343 -0.125333 -0.809017
--1.3586 -0.17163 0.591584 -0.125333 -0.844328
--1.30206 -0.164488 0.533819 -0.125333 -0.876306
--1.23246 -0.155695 0.47332 -0.125333 -0.904827
--1.15094 -0.145396 0.410382 -0.125333 -0.929776
--1.05881 -0.133758 0.345315 -0.125333 -0.951056
--0.957578 -0.12097 0.278449 -0.125333 -0.968583
--0.848887 -0.107239 0.210127 -0.125333 -0.982287
--0.734493 -0.0927875 0.140702 -0.125333 -0.992115
--0.616247 -0.0778496 0.070537 -0.125333 -0.998027
--0.496059 -0.0626664 7.34378e-07 -0.125333 -1
--0.375871 -0.0474832 -0.0705356 -0.125333 -0.998027
--0.257624 -0.0325453 -0.1407 -0.125333 -0.992115
--0.14323 -0.0180941 -0.210125 -0.125333 -0.982287
--0.0345389 -0.00436326 -0.278448 -0.125333 -0.968583
-0.066691 0.00842499 -0.345314 -0.125333 -0.951057
-0.158818 0.0200633 -0.41038 -0.125333 -0.929777
-0.240347 0.0303627 -0.473319 -0.125333 -0.904827
-0.309948 0.0391554 -0.533818 -0.125333 -0.876307
-0.366484 0.0462974 -0.591583 -0.125333 -0.844328
-0.409021 0.0516711 -0.646342 -0.125333 -0.809017
-0.436853 0.055187 -0.697844 -0.125333 -0.770514
-0.449502 0.056785 -0.745862 -0.125333 -0.728969
-0.446735 0.0564354 -0.790196 -0.125333 -0.684548
-0.428562 0.0541397 -0.83067 -0.125333 -0.637425
-0.395241 0.0499302 -0.867137 -0.125333 -0.587786
-0.347267 0.0438698 -0.899476 -0.125333 -0.535828
-0.285371 0.0360506 -0.927593 -0.125333 -0.481754
-0.210507 0.026593 -0.951422 -0.125333 -0.42578
-0.123833 0.0156436 -0.970924 -0.125333 -0.368125
-0.0266977 0.00337269 -0.986087 -0.125333 -0.309018
--0.0793819 -0.0100282 -0.996921 -0.125333 -0.248691
--0.192746 -0.0243494 -1.00346 -0.125333 -0.187382
--0.311617 -0.0393662 -1.00577 -0.125333 -0.125334
--0.434128 -0.0548428 -1.00393 -0.125333 -0.0627915
--0.558351 -0.0705357 -0.998027 -0.125333 -9.80385e-07
--0.682327 -0.0861975 -0.988188 -0.125333 0.0627895
--0.804101 -0.101581 -0.974542 -0.125333 0.125332
--0.921748 -0.116443 -0.957235 -0.125333 0.18738
--1.03341 -0.130549 -0.936423 -0.125333 0.248689
--1.1373 -0.143674 -0.912273 -0.125333 0.309016
--1.23179 -0.15561 -0.884959 -0.125333 0.368124
--1.31535 -0.166167 -0.854661 -0.125333 0.425778
--1.38666 -0.175175 -0.821563 -0.125333 0.481753
--1.44457 -0.182491 -0.785848 -0.125333 0.535826
--1.48815 -0.187996 -0.747704 -0.125333 0.587784
--1.51667 -0.1916 -0.707316 -0.125333 0.637423
--1.52967 -0.193241 -0.664865 -0.125333 0.684546
--1.5269 -0.192892 -0.620531 -0.125333 0.728968
--1.50838 -0.190552 -0.574489 -0.125333 0.770513
--1.47437 -0.186255 -0.526909 -0.125333 0.809016
--1.42536 -0.180064 -0.477956 -0.125333 0.844327
--1.36209 -0.172071 -0.427789 -0.125333 0.876306
--1.28551 -0.162397 -0.376559 -0.125333 0.904827
--1.1968 -0.15119 -0.324416 -0.125333 0.929776
--1.09731 -0.138622 -0.271501 -0.125333 0.951056
--0.988564 -0.124884 -0.217951 -0.125333 0.968583
--0.872234 -0.110188 -0.163898 -0.125333 0.982287
--0.75011 -0.0947604 -0.109472 -0.125333 0.992115
--0.624071 -0.0788381 -0.054798 -0.125333 0.998027
--0.491144 -0.0936903 0 -0.187381 1
--0.362772 -0.0692023 0.050717 -0.187381 0.998027
--0.236357 -0.0450873 0.101373 -0.187381 0.992115
--0.113823 -0.0217128 0.151906 -0.187381 0.982287
-0.00296578 0.00056575 0.202249 -0.187381 0.968583
-0.112234 0.0214096 0.25233 -0.187381 0.951057
-0.212324 0.0405028 0.302069 -0.187381 0.929777
-0.301722 0.0575564 0.351378 -0.187381 0.904827
-0.379082 0.0723135 0.400158 -0.187381 0.876307
-0.443244 0.0845531 0.448297 -0.187381 0.844328
-0.493257 0.0940934 0.495675 -0.187381 0.809017
-0.528387 0.100795 0.542154 -0.187381 0.770513
-0.548135 0.104562 0.587587 -0.187381 0.728969
-0.552241 0.105345 0.631811 -0.187381 0.684547
-0.54069 0.103142 0.674653 -0.187381 0.637424
-0.513708 0.0979946 0.715924 -0.187381 0.587785
-0.471763 0.0899932 0.755429 -0.187381 0.535827
-0.415555 0.0792711 0.79296 -0.187381 0.481754
-0.346006 0.066004 0.8283 -0.187381 0.42578
-0.264244 0.050407 0.861229 -0.187381 0.368125
-0.171585 0.0327315 0.89152 -0.187381 0.309017
-0.069514 0.0132605 0.918948 -0.187381 0.24869
--0.0403402 -0.00769527 0.943284 -0.187381 0.187382
--0.15623 -0.0298024 0.964308 -0.187381 0.125334
--0.276318 -0.0527102 0.981803 -0.187381 0.0627908
--0.398702 -0.0760562 0.995562 -0.187381 3.26795e-07
--0.521451 -0.0994718 1.00539 -0.187381 -0.0627902
--0.642632 -0.122588 1.01112 -0.187381 -0.125333
--0.760339 -0.145042 1.01257 -0.187381 -0.187381
--0.872727 -0.166481 1.00962 -0.187381 -0.24869
--0.978038 -0.18657 1.00215 -0.187381 -0.309017
--1.07463 -0.204996 0.990072 -0.187381 -0.368124
--1.16101 -0.221473 0.973323 -0.187381 -0.425779
--1.23583 -0.235746 0.951876 -0.187381 -0.481753
--1.29795 -0.247596 0.925732 -0.187381 -0.535826
--1.34642 -0.256843 0.894929 -0.187381 -0.587785
--1.38052 -0.263348 0.859535 -0.187381 -0.637424
--1.39976 -0.267017 0.819656 -0.187381 -0.684547
--1.40386 -0.2678 0.775432 -0.187381 -0.728968
--1.39283 -0.265695 0.727037 -0.187381 -0.770513
--1.36687 -0.260744 0.674679 -0.187381 -0.809017
--1.32647 -0.253036 0.618601 -0.187381 -0.844328
--1.2723 -0.242704 0.559074 -0.187381 -0.876306
--1.20529 -0.229921 0.496402 -0.187381 -0.904827
--1.12655 -0.214901 0.430913 -0.187381 -0.929776
--1.03739 -0.197892 0.362961 -0.187381 -0.951056
--0.939276 -0.179176 0.292924 -0.187381 -0.968583
--0.833822 -0.15906 0.221194 -0.187381 -0.982287
--0.72276 -0.137873 0.148181 -0.187381 -0.992115
--0.607907 -0.115964 0.0743075 -0.187381 -0.998027
--0.491145 -0.0936905 7.73705e-07 -0.187381 -1
--0.374382 -0.071417 -0.0743059 -0.187381 -0.998027
--0.25953 -0.0495078 -0.14818 -0.187381 -0.992115
--0.148467 -0.0283215 -0.221192 -0.187381 -0.982287
--0.0430136 -0.00820525 -0.292922 -0.187381 -0.968583
-0.055101 0.010511 -0.36296 -0.187381 -0.951057
-0.144263 0.0275196 -0.430911 -0.187381 -0.929777
-0.223002 0.0425398 -0.4964 -0.187381 -0.904827
-0.290014 0.0553229 -0.559073 -0.187381 -0.876307
-0.344179 0.0656554 -0.6186 -0.187381 -0.844328
-0.384585 0.0733633 -0.674678 -0.187381 -0.809017
-0.410538 0.078314 -0.727036 -0.187381 -0.770514
-0.421574 0.0804193 -0.775431 -0.187381 -0.728969
-0.417468 0.079636 -0.819655 -0.187381 -0.684548
-0.398236 0.0759673 -0.859534 -0.187381 -0.637425
-0.364135 0.0694623 -0.894928 -0.187381 -0.587786
-0.315662 0.0602156 -0.925732 -0.187381 -0.535828
-0.253542 0.0483656 -0.951875 -0.187381 -0.481754
-0.178721 0.0340927 -0.973323 -0.187381 -0.42578
-0.0923459 0.0176158 -0.990071 -0.187381 -0.368125
--0.00424725 -0.000810203 -1.00215 -0.187381 -0.309018
--0.109559 -0.0208993 -1.00962 -0.187381 -0.248691
--0.221946 -0.0423384 -1.01257 -0.187381 -0.187382
--0.339653 -0.0647921 -1.01112 -0.187381 -0.125334
--0.460834 -0.0879084 -1.00539 -0.187381 -0.0627915
--0.583583 -0.111324 -0.995562 -0.187381 -9.80385e-07
--0.705967 -0.13467 -0.981803 -0.187381 0.0627895
--0.826055 -0.157578 -0.964308 -0.187381 0.125332
--0.941945 -0.179685 -0.943285 -0.187381 0.18738
--1.0518 -0.200641 -0.918948 -0.187381 0.248689
--1.15387 -0.220112 -0.891521 -0.187381 0.309016
--1.24653 -0.237787 -0.861229 -0.187381 0.368124
--1.32829 -0.253384 -0.828301 -0.187381 0.425778
--1.39784 -0.266651 -0.79296 -0.187381 0.481753
--1.45405 -0.277374 -0.75543 -0.187381 0.535826
--1.49599 -0.285375 -0.715925 -0.187381 0.587784
--1.52298 -0.290522 -0.674653 -0.187381 0.637423
--1.53453 -0.292726 -0.631812 -0.187381 0.684546
--1.53042 -0.291943 -0.587588 -0.187381 0.728968
--1.51067 -0.288175 -0.542155 -0.187381 0.770513
--1.47554 -0.281474 -0.495676 -0.187381 0.809016
--1.42553 -0.271934 -0.448298 -0.187381 0.844327
--1.36137 -0.259694 -0.400159 -0.187381 0.876306
--1.28401 -0.244937 -0.351379 -0.187381 0.904827
--1.19461 -0.227884 -0.30207 -0.187381 0.929776
--1.09452 -0.208791 -0.252331 -0.187381 0.951056
--0.985256 -0.187947 -0.20225 -0.187381 0.968583
--0.868467 -0.165668 -0.151907 -0.187381 0.982287
--0.745933 -0.142294 -0.101374 -0.187381 0.992115
--0.619518 -0.118179 -0.050718 -0.187381 0.998027
--0.484292 -0.124345 0 -0.248689 1
--0.356231 -0.0914642 0.046587 -0.248689 0.998027
--0.230099 -0.0590793 0.0931759 -0.248689 0.992115
--0.107797 -0.0276774 0.139766 -0.248689 0.982287
-0.00883721 0.002269 0.186349 -0.248689 0.968583
-0.118051 0.0303103 0.232911 -0.248689 0.951057
-0.218209 0.0560265 0.279425 -0.248689 0.929777
-0.307817 0.0790338 0.325851 -0.248689 0.904827
-0.385544 0.0989906 0.372133 -0.248689 0.876307
-0.450245 0.115603 0.418197 -0.248689 0.844328
-0.500976 0.128629 0.463952 -0.248689 0.809017
-0.537013 0.137881 0.509285 -0.248689 0.770513
-0.557859 0.143233 0.554064 -0.248689 0.728969
-0.563251 0.144618 0.598135 -0.248689 0.684547
-0.55317 0.142029 0.641325 -0.248689 0.637424
-0.527833 0.135524 0.683439 -0.248689 0.587785
-0.487696 0.125219 0.724265 -0.248689 0.535827
-0.433441 0.111289 0.763575 -0.248689 0.481754
-0.365972 0.0939653 0.801121 -0.248689 0.42578
-0.286392 0.0735327 0.836649 -0.248689 0.368125
-0.195992 0.0503221 0.869888 -0.248689 0.309017
-0.0962294 0.0247074 0.900566 -0.248689 0.24869
--0.0112983 -0.00290091 0.928403 -0.248689 0.187382
--0.124876 -0.0320625 0.953122 -0.248689 0.125334
--0.242697 -0.0623138 0.974449 -0.248689 0.0627908
--0.362896 -0.0931755 0.992115 -0.248689 3.26795e-07
--0.483574 -0.12416 1.00587 -0.248689 -0.0627902
--0.60283 -0.15478 1.01546 -0.248689 -0.125333
--0.718794 -0.184554 1.02068 -0.248689 -0.187381
--0.829649 -0.213017 1.02133 -0.248689 -0.24869
--0.933667 -0.239724 1.01723 -0.248689 -0.309017
--1.02923 -0.264261 1.00824 -0.248689 -0.368124
--1.11487 -0.286249 0.994263 -0.248689 -0.425779
--1.18927 -0.30535 0.975219 -0.248689 -0.481753
--1.25128 -0.321274 0.951075 -0.248689 -0.535826
--1.29999 -0.333781 0.921837 -0.248689 -0.587785
--1.33468 -0.342686 0.887551 -0.248689 -0.637424
--1.35485 -0.347865 0.848306 -0.248689 -0.684547
--1.36024 -0.349249 0.804235 -0.248689 -0.728968
--1.35084 -0.346835 0.755511 -0.248689 -0.770513
--1.32685 -0.340677 0.70235 -0.248689 -0.809017
--1.28873 -0.33089 0.645007 -0.248689 -0.844328
--1.23716 -0.317649 0.583778 -0.248689 -0.876306
--1.17303 -0.301181 0.518993 -0.248689 -0.904827
--1.09742 -0.281768 0.451019 -0.248689 -0.929776
--1.01161 -0.259736 0.38025 -0.248689 -0.951056
--0.917042 -0.235456 0.307109 -0.248689 -0.968583
--0.815293 -0.209331 0.232043 -0.248689 -0.982287
--0.708055 -0.181797 0.155515 -0.248689 -0.992115
--0.597109 -0.153311 0.0780046 -0.248689 -0.998027
--0.484293 -0.124345 8.12269e-07 -0.248689 -1
--0.371477 -0.0953788 -0.0780029 -0.248689 -0.998027
--0.26053 -0.0668926 -0.155513 -0.248689 -0.992115
--0.153292 -0.0393587 -0.232041 -0.248689 -0.982287
--0.0515434 -0.0132341 -0.307108 -0.248689 -0.968583
-0.0430238 0.0110466 -0.380248 -0.248689 -0.951057
-0.128831 0.0330782 -0.451017 -0.248689 -0.929777
-0.204441 0.0524915 -0.518992 -0.248689 -0.904827
-0.268578 0.068959 -0.583776 -0.248689 -0.876307
-0.320151 0.0822005 -0.645006 -0.248689 -0.844328
-0.358267 0.0919871 -0.702348 -0.248689 -0.809017
-0.382253 0.0981455 -0.75551 -0.248689 -0.770514
-0.391657 0.10056 -0.804234 -0.248689 -0.728969
-0.386265 0.0991756 -0.848306 -0.248689 -0.684548
-0.366097 0.0939974 -0.88755 -0.248689 -0.637425
-0.331412 0.0850918 -0.921836 -0.248689 -0.587786
-0.282701 0.0725852 -0.951074 -0.248689 -0.535828
-0.220683 0.0566616 -0.975219 -0.248689 -0.481754
-0.146289 0.0375606 -0.994263 -0.248689 -0.42578
-0.0606518 0.0155727 -1.00824 -0.248689 -0.368125
--0.0349143 -0.00896443 -1.01723 -0.248689 -0.309018
--0.138932 -0.0356717 -1.02133 -0.248689 -0.248691
--0.249787 -0.0641343 -1.02068 -0.248689 -0.187382
--0.36575 -0.0939085 -1.01546 -0.248689 -0.125334
--0.485007 -0.124528 -1.00587 -0.248689 -0.0627915
--0.605685 -0.155513 -0.992115 -0.248689 -9.80385e-07
--0.725884 -0.186375 -0.974449 -0.248689 0.0627895
--0.843705 -0.216626 -0.953123 -0.248689 0.125332
--0.957283 -0.245788 -0.928404 -0.248689 0.18738
--1.06481 -0.273396 -0.900567 -0.248689 0.248689
--1.16457 -0.299011 -0.869889 -0.248689 0.309016
--1.25497 -0.322221 -0.836649 -0.248689 0.368124
--1.33455 -0.342654 -0.801122 -0.248689 0.425778
--1.40202 -0.359977 -0.763575 -0.248689 0.481753
--1.45628 -0.373908 -0.724266 -0.248689 0.535826
--1.49642 -0.384213 -0.68344 -0.248689 0.587784
--1.52175 -0.390719 -0.641325 -0.248689 0.637423
--1.53183 -0.393307 -0.598136 -0.248689 0.684546
--1.52644 -0.391923 -0.554065 -0.248689 0.728968
--1.5056 -0.386571 -0.509286 -0.248689 0.770513
--1.46956 -0.377318 -0.463953 -0.248689 0.809016
--1.41883 -0.364292 -0.418198 -0.248689 0.844327
--1.35413 -0.34768 -0.372134 -0.248689 0.876306
--1.2764 -0.327723 -0.325852 -0.248689 0.904827
--1.18679 -0.304716 -0.279426 -0.248689 0.929776
--1.08664 -0.279 -0.232912 -0.248689 0.951056
--0.977423 -0.250959 -0.18635 -0.248689 0.968583
--0.860789 -0.221012 -0.139767 -0.248689 0.982287
--0.738487 -0.189611 -0.0931769 -0.248689 0.992115
--0.612355 -0.157226 -0.046588 -0.248689 0.998027
--0.475528 -0.154508 0 -0.309016 1
--0.348455 -0.11322 0.0424111 -0.309016 0.998027
--0.223275 -0.0725464 0.0848866 -0.309016 0.992115
--0.101853 -0.0330941 0.127487 -0.309016 0.982287
-0.0140053 0.00455057 0.170265 -0.309016 0.968583
-0.122581 0.0398289 0.213263 -0.309016 0.951057
-0.222268 0.0722191 0.256506 -0.309016 0.929777
-0.311598 0.101244 0.300003 -0.309016 0.904827
-0.389263 0.126479 0.343741 -0.309016 0.876307
-0.454138 0.147558 0.387684 -0.309016 0.844328
-0.505294 0.164179 0.431771 -0.309016 0.809017
-0.542015 0.176111 0.475913 -0.309016 0.770513
-0.563811 0.183193 0.519994 -0.309016 0.728969
-0.57042 0.18534 0.563868 -0.309016 0.684547
-0.561816 0.182545 0.607364 -0.309016 0.637424
-0.538208 0.174874 0.650279 -0.309016 0.587785
-0.500036 0.162471 0.692387 -0.309016 0.535827
-0.447964 0.145552 0.733436 -0.309016 0.481754
-0.38287 0.124402 0.773152 -0.309016 0.42578
-0.30583 0.0993699 0.811243 -0.309016 0.368125
-0.218103 0.0708657 0.847398 -0.309016 0.309017
-0.12111 0.0393509 0.881295 -0.309016 0.24869
-0.0164115 0.00533242 0.912606 -0.309016 0.187382
--0.094317 -0.0306454 0.940996 -0.309016 0.125334
--0.209312 -0.0680095 0.966133 -0.309016 0.0627908
--0.32675 -0.106167 0.987688 -0.309016 3.26795e-07
--0.444775 -0.144516 1.00535 -0.309016 -0.0627902
--0.561529 -0.182452 1.0188 -0.309016 -0.125333
--0.675182 -0.219379 1.02778 -0.309016 -0.187381
--0.783958 -0.254723 1.03202 -0.309016 -0.24869
--0.886166 -0.287932 1.0313 -0.309016 -0.309017
--0.980226 -0.318494 1.02542 -0.309016 -0.368124
--1.06469 -0.345938 1.01422 -0.309016 -0.425779
--1.13827 -0.369846 0.9976 -0.309016 -0.481753
--1.19986 -0.389857 0.975479 -0.309016 -0.535826
--1.24854 -0.405673 0.947835 -0.309016 -0.587785
--1.2836 -0.417067 0.91469 -0.309016 -0.637424
--1.30457 -0.423879 0.87612 -0.309016 -0.684547
--1.31118 -0.426026 0.832245 -0.309016 -0.728968
--1.3034 -0.4235 0.78324 -0.309016 -0.770513
--1.28145 -0.416368 0.729327 -0.309016 -0.809017
--1.24576 -0.40477 0.670776 -0.309016 -0.844328
--1.19697 -0.388919 0.607905 -0.309016 -0.876306
--1.13596 -0.369096 0.541072 -0.309016 -0.904827
--1.06379 -0.345645 0.47068 -0.309016 -0.929776
--0.981689 -0.318969 0.397163 -0.309016 -0.951056
--0.891064 -0.289524 0.320992 -0.309016 -0.968583
--0.793448 -0.257806 0.242662 -0.309016 -0.982287
--0.690489 -0.224353 0.162695 -0.309016 -0.992115
--0.583919 -0.189726 0.0816247 -0.309016 -0.998027
--0.475529 -0.154509 8.50031e-07 -0.309016 -1
--0.36714 -0.119291 -0.081623 -0.309016 -0.998027
--0.26057 -0.0846641 -0.162693 -0.309016 -0.992115
--0.157611 -0.0512107 -0.242661 -0.309016 -0.982287
--0.0599947 -0.0194934 -0.32099 -0.309016 -0.968583
-0.0306305 0.00995244 -0.397161 -0.309016 -0.951057
-0.11273 0.036628 -0.470678 -0.309016 -0.929777
-0.184904 0.0600789 -0.541071 -0.309016 -0.904827
-0.245914 0.0799022 -0.607903 -0.309016 -0.876307
-0.294699 0.0957534 -0.670775 -0.309016 -0.844328
-0.330395 0.107351 -0.729326 -0.309016 -0.809017
-0.352346 0.114484 -0.783239 -0.309016 -0.770514
-0.36012 0.11701 -0.832244 -0.309016 -0.728969
-0.353512 0.114863 -0.876119 -0.309016 -0.684548
-0.332546 0.108051 -0.91469 -0.309016 -0.637425
-0.297481 0.0966573 -0.947834 -0.309016 -0.587786
-0.248802 0.0808406 -0.975478 -0.309016 -0.535828
-0.187215 0.0608297 -0.997599 -0.309016 -0.481754
-0.113634 0.036922 -1.01422 -0.309016 -0.42578
-0.0291706 0.00947809 -1.02542 -0.309016 -0.368125
--0.0648882 -0.0210834 -1.0313 -0.309016 -0.309018
--0.167096 -0.0542927 -1.03202 -0.309016 -0.248691
--0.275872 -0.0896361 -1.02778 -0.309016 -0.187382
--0.389525 -0.126564 -1.0188 -0.309016 -0.125334
--0.506279 -0.1645 -1.00535 -0.309016 -0.0627915
--0.624304 -0.202848 -0.987689 -0.309016 -9.80385e-07
--0.741742 -0.241006 -0.966133 -0.309016 0.0627895
--0.856737 -0.27837 -0.940997 -0.309016 0.125332
--0.967466 -0.314348 -0.912607 -0.309016 0.18738
--1.07216 -0.348367 -0.881296 -0.309016 0.248689
--1.16916 -0.379881 -0.847398 -0.309016 0.309016
--1.25688 -0.408386 -0.811244 -0.309016 0.368124
--1.33393 -0.433417 -0.773153 -0.309016 0.425778
--1.39902 -0.454568 -0.733437 -0.309016 0.481753
--1.45109 -0.471487 -0.692388 -0.309016 0.535826
--1.48926 -0.48389 -0.65028 -0.309016 0.587784
--1.51287 -0.491561 -0.607365 -0.309016 0.637423
--1.52148 -0.494357 -0.563869 -0.309016 0.684546
--1.51487 -0.492209 -0.519995 -0.309016 0.728968
--1.49307 -0.485128 -0.475914 -0.309016 0.770513
--1.45635 -0.473196 -0.431772 -0.309016 0.809016
--1.4052 -0.456575 -0.387685 -0.309016 0.844327
--1.34032 -0.435496 -0.343742 -0.309016 0.876306
--1.26266 -0.410261 -0.300004 -0.309016 0.904827
--1.17333 -0.381236 -0.256507 -0.309016 0.929776
--1.07364 -0.348846 -0.213264 -0.309016 0.951056
--0.965064 -0.313568 -0.170266 -0.309016 0.968583
--0.849206 -0.275923 -0.127488 -0.309016 0.982287
--0.727784 -0.236471 -0.0848875 -0.309016 0.992115
--0.602604 -0.195798 -0.0424119 -0.309016 0.998027
--0.464888 -0.184062 0 -0.368124 1
--0.339481 -0.13441 0.0381933 -0.368124 0.998027
--0.215922 -0.0854894 0.0765135 -0.368124 0.992115
--0.0960313 -0.0380214 0.115083 -0.368124 0.982287
-0.0184283 0.00729628 0.154013 -0.368124 0.968583
-0.125778 0.049799 0.193404 -0.368124 0.951057
-0.224449 0.0888656 0.233333 -0.368124 0.929777
-0.313008 0.123928 0.273858 -0.368124 0.904827
-0.390175 0.154481 0.315009 -0.368124 0.876307
-0.45485 0.180088 0.356788 -0.368124 0.844328
-0.506124 0.200388 0.399164 -0.368124 0.809017
-0.543296 0.215106 0.442071 -0.368124 0.770513
-0.565881 0.224048 0.485411 -0.368124 0.728969
-0.57362 0.227112 0.529045 -0.368124 0.684547
-0.566483 0.224286 0.572803 -0.368124 0.637424
-0.544668 0.215649 0.616477 -0.368124 0.587785
-0.508598 0.201368 0.659825 -0.368124 0.535827
-0.458916 0.181697 0.702574 -0.368124 0.481754
-0.396469 0.156973 0.74442 -0.368124 0.42578
-0.322302 0.127608 0.785036 -0.368124 0.368125
-0.237636 0.0940867 0.824071 -0.368124 0.309017
-0.14385 0.0569543 0.861155 -0.368124 0.24869
-0.0424597 0.0168109 0.895909 -0.368124 0.187382
--0.0649087 -0.0256991 0.927942 -0.368124 0.125334
--0.176541 -0.0698975 0.956864 -0.368124 0.0627908
--0.290665 -0.115082 0.982287 -0.368124 3.26795e-07
--0.405477 -0.160539 1.00383 -0.368124 -0.0627902
--0.51917 -0.205553 1.02114 -0.368124 -0.125333
--0.629962 -0.249419 1.03387 -0.368124 -0.187381
--0.736128 -0.291453 1.0417 -0.368124 -0.24869
--0.836021 -0.331004 1.04435 -0.368124 -0.309017
--0.928102 -0.367461 1.04158 -0.368124 -0.368124
--1.01096 -0.400268 1.03318 -0.368124 -0.425779
--1.08335 -0.428927 1.019 -0.368124 -0.481753
--1.14417 -0.453009 0.99892 -0.368124 -0.535826
--1.19255 -0.472162 0.972897 -0.368124 -0.587785
--1.22778 -0.486111 0.940928 -0.368124 -0.637424
--1.24939 -0.494668 0.903068 -0.368124 -0.684547
--1.25713 -0.497732 0.859434 -0.368124 -0.728968
--1.25097 -0.495291 0.810196 -0.368124 -0.770513
--1.23109 -0.487422 0.755584 -0.368124 -0.809017
--1.19792 -0.47429 0.695884 -0.368124 -0.844328
--1.15209 -0.456143 0.631432 -0.368124 -0.876306
--1.09442 -0.433312 0.562618 -0.368124 -0.904827
--1.02596 -0.406204 0.489876 -0.368124 -0.929776
--0.94788 -0.375292 0.413684 -0.368124 -0.951056
--0.861551 -0.341112 0.334557 -0.368124 -0.968583
--0.768454 -0.304252 0.253043 -0.368124 -0.982287
--0.670184 -0.265344 0.169714 -0.368124 -0.992115
--0.568418 -0.225052 0.0851643 -0.368124 -0.998027
--0.464889 -0.184062 8.86954e-07 -0.368124 -1
--0.361361 -0.143073 -0.0851625 -0.368124 -0.998027
--0.259595 -0.102781 -0.169712 -0.368124 -0.992115
--0.161324 -0.0638727 -0.253041 -0.368124 -0.982287
--0.0682273 -0.027013 -0.334555 -0.368124 -0.968583
-0.0181019 0.00716704 -0.413682 -0.368124 -0.951057
-0.0961775 0.0380793 -0.489874 -0.368124 -0.929777
-0.164646 0.065188 -0.562616 -0.368124 -0.904827
-0.22231 0.0880186 -0.631431 -0.368124 -0.876307
-0.268144 0.106165 -0.695882 -0.368124 -0.844328
-0.301313 0.119298 -0.755583 -0.368124 -0.809017
-0.321189 0.127167 -0.810195 -0.368124 -0.770514
-0.327354 0.129608 -0.859433 -0.368124 -0.728969
-0.319615 0.126544 -0.903067 -0.368124 -0.684548
-0.298002 0.117987 -0.940927 -0.368124 -0.637425
-0.262771 0.104038 -0.972897 -0.368124 -0.587786
-0.214397 0.0848857 -0.99892 -0.368124 -0.535828
-0.153572 0.0608032 -1.019 -0.368124 -0.481754
-0.0811874 0.0321443 -1.03318 -0.368124 -0.42578
--0.00167277 -0.000662295 -1.04158 -0.368124 -0.368125
--0.0937535 -0.0371195 -1.04435 -0.368124 -0.309018
--0.193646 -0.0766698 -1.0417 -0.368124 -0.248691
--0.299812 -0.118704 -1.03387 -0.368124 -0.187382
--0.410605 -0.16257 -1.02114 -0.368124 -0.125334
--0.524297 -0.207584 -1.00383 -0.368124 -0.0627915
--0.639109 -0.253041 -0.982288 -0.368124 -9.80385e-07
--0.753233 -0.298225 -0.956864 -0.368124 0.0627895
--0.864866 -0.342424 -0.927942 -0.368124 0.125332
--0.972234 -0.384934 -0.895909 -0.368124 0.18738
--1.07363 -0.425077 -0.861156 -0.368124 0.248689
--1.16741 -0.46221 -0.824072 -0.368124 0.309016
--1.25208 -0.495731 -0.785037 -0.368124 0.368124
--1.32624 -0.525096 -0.744421 -0.368124 0.425778
--1.38869 -0.549821 -0.702575 -0.368124 0.481753
--1.43837 -0.569491 -0.659826 -0.368124 0.535826
--1.47444 -0.583773 -0.616478 -0.368124 0.587784
--1.49626 -0.59241 -0.572804 -0.368124 0.637423
--1.5034 -0.595236 -0.529046 -0.368124 0.684546
--1.49566 -0.592172 -0.485412 -0.368124 0.728968
--1.47307 -0.58323 -0.442072 -0.368124 0.770513
--1.4359 -0.568513 -0.399165 -0.368124 0.809016
--1.38463 -0.548212 -0.356789 -0.368124 0.844327
--1.31995 -0.522605 -0.31501 -0.368124 0.876306
--1.24279 -0.492053 -0.273859 -0.368124 0.904827
--1.15423 -0.45699 -0.233334 -0.368124 0.929776
--1.05556 -0.417924 -0.193404 -0.368124 0.951056
--0.948207 -0.375421 -0.154014 -0.368124 0.968583
--0.833748 -0.330103 -0.115084 -0.368124 0.982287
--0.713857 -0.282635 -0.0765143 -0.368124 0.992115
--0.590298 -0.233715 -0.0381941 -0.368124 0.998027
--0.452414 -0.212889 0 -0.425779 1
--0.329346 -0.154978 0.0339378 -0.425779 0.998027
--0.208073 -0.0979116 0.0680649 -0.425779 0.992115
--0.0903608 -0.0425205 0.102565 -0.425779 0.982287
-0.022079 0.0103896 0.137609 -0.425779 0.968583
-0.127616 0.0600515 0.173354 -0.425779 0.951057
-0.224727 0.105748 0.20993 -0.425779 0.929777
-0.312018 0.146824 0.247443 -0.425779 0.904827
-0.388248 0.182695 0.285967 -0.425779 0.876307
-0.452344 0.212856 0.325541 -0.425779 0.844328
-0.503422 0.236892 0.366163 -0.425779 0.809017
-0.540797 0.254479 0.407794 -0.425779 0.770513
-0.563997 0.265396 0.450349 -0.425779 0.728969
-0.572765 0.269522 0.4937 -0.425779 0.684547
-0.567067 0.266841 0.537678 -0.425779 0.637424
-0.547089 0.25744 0.582067 -0.425779 0.587785
-0.513236 0.24151 0.626612 -0.425779 0.535827
-0.466126 0.219342 0.671018 -0.425779 0.481754
-0.406574 0.191319 0.714954 -0.425779 0.42578
-0.335587 0.157915 0.758055 -0.425779 0.368125
-0.254343 0.119685 0.799931 -0.425779 0.309017
-0.164173 0.0772539 0.840165 -0.425779 0.24869
-0.0665396 0.0313111 0.878327 -0.425779 0.187382
--0.0369858 -0.0174041 0.913971 -0.425779 0.125334
--0.144747 -0.0681127 0.94665 -0.425779 0.0627908
--0.255031 -0.120008 0.975917 -0.425779 3.26795e-07
--0.366095 -0.172271 1.00133 -0.425779 -0.0627902
--0.47619 -0.224078 1.02247 -0.425779 -0.125333
--0.583595 -0.274618 1.03893 -0.425779 -0.187381
--0.686639 -0.323107 1.05035 -0.425779 -0.24869
--0.783728 -0.368794 1.05637 -0.425779 -0.309017
--0.873372 -0.410977 1.05671 -0.425779 -0.368124
--0.954208 -0.449015 1.05112 -0.425779 -0.425779
--1.02502 -0.482336 1.03939 -0.425779 -0.481753
--1.08475 -0.510445 1.02138 -0.425779 -0.535826
--1.13255 -0.532935 0.997 -0.425779 -0.587785
--1.16772 -0.549488 0.966236 -0.425779 -0.637424
--1.18982 -0.559887 0.929125 -0.425779 -0.684547
--1.19859 -0.564013 0.885774 -0.425779 -0.728968
--1.19399 -0.561849 0.836352 -0.425779 -0.770513
--1.17621 -0.553483 0.781096 -0.425779 -0.809017
--1.14565 -0.539099 0.720305 -0.425779 -0.844328
--1.1029 -0.518983 0.654336 -0.425779 -0.876306
--1.04876 -0.49351 0.583608 -0.425779 -0.904827
--0.984233 -0.463144 0.508589 -0.425779 -0.929776
--0.910456 -0.428427 0.429797 -0.425779 -0.951056
--0.828734 -0.389972 0.347793 -0.425779 -0.968583
--0.740496 -0.34845 0.263173 -0.425779 -0.982287
--0.647278 -0.304585 0.176566 -0.425779 -0.992115
--0.550695 -0.259137 0.0886198 -0.425779 -0.998027
--0.452415 -0.21289 9.23001e-07 -0.425779 -1
--0.354135 -0.166643 -0.0886179 -0.425779 -0.998027
--0.257551 -0.121194 -0.176564 -0.425779 -0.992115
--0.164333 -0.0773291 -0.263171 -0.425779 -0.982287
--0.0760955 -0.0358078 -0.347791 -0.425779 -0.968583
-0.00562684 0.00264778 -0.429795 -0.425779 -0.951057
-0.0794044 0.0373648 -0.508587 -0.425779 -0.929777
-0.143936 0.0677309 -0.583606 -0.425779 -0.904827
-0.198069 0.0932038 -0.654335 -0.425779 -0.876307
-0.240819 0.11332 -0.720303 -0.425779 -0.844328
-0.271385 0.127704 -0.781095 -0.425779 -0.809017
-0.289166 0.136071 -0.836351 -0.425779 -0.770514
-0.293763 0.138234 -0.885773 -0.425779 -0.728969
-0.284995 0.134108 -0.929125 -0.425779 -0.684548
-0.262897 0.12371 -0.966235 -0.425779 -0.637425
-0.227719 0.107156 -0.996999 -0.425779 -0.587786
-0.179927 0.0846672 -1.02138 -0.425779 -0.535828
-0.120193 0.0565582 -1.03939 -0.425779 -0.481754
-0.0493823 0.0232375 -1.05112 -0.425779 -0.42578
--0.0314533 -0.0148008 -1.05671 -0.425779 -0.368125
--0.121098 -0.0569842 -1.05637 -0.425779 -0.309018
--0.218187 -0.102671 -1.05035 -0.425779 -0.248691
--0.32123 -0.151159 -1.03893 -0.425779 -0.187382
--0.428635 -0.2017 -1.02247 -0.425779 -0.125334
--0.53873 -0.253507 -1.00133 -0.425779 -0.0627915
--0.649794 -0.305769 -0.975917 -0.425779 -9.80385e-07
--0.760078 -0.357665 -0.946651 -0.425779 0.0627895
--0.867839 -0.408373 -0.913972 -0.425779 0.125332
--0.971365 -0.457089 -0.878328 -0.425779 0.18738
--1.069 -0.503032 -0.840166 -0.425779 0.248689
--1.15917 -0.545462 -0.799932 -0.425779 0.309016
--1.24041 -0.583693 -0.758056 -0.425779 0.368124
--1.3114 -0.617097 -0.714955 -0.425779 0.425778
--1.37095 -0.64512 -0.671019 -0.425779 0.481753
--1.41806 -0.667288 -0.626613 -0.425779 0.535826
--1.45192 -0.683218 -0.582068 -0.425779 0.587784
--1.47189 -0.692619 -0.537679 -0.425779 0.637423
--1.47759 -0.695301 -0.493701 -0.425779 0.684546
--1.46882 -0.691175 -0.450349 -0.425779 0.728968
--1.44563 -0.680258 -0.407795 -0.425779 0.770513
--1.40825 -0.662671 -0.366164 -0.425779 0.809016
--1.35717 -0.638636 -0.325542 -0.425779 0.844327
--1.29308 -0.608474 -0.285968 -0.425779 0.876306
--1.21685 -0.572604 -0.247444 -0.425779 0.904827
--1.12956 -0.531528 -0.209931 -0.425779 0.929776
--1.03245 -0.485831 -0.173354 -0.425779 0.951056
--0.926909 -0.436169 -0.13761 -0.425779 0.968583
--0.814469 -0.383259 -0.102566 -0.425779 0.982287
--0.696757 -0.327868 -0.0680656 -0.425779 0.992115
--0.575484 -0.270802 -0.0339385 -0.425779 0.998027
--0.438154 -0.240877 0 -0.481753 1
--0.31809 -0.174871 0.0296488 -0.481753 0.998027
--0.199758 -0.109818 0.0595491 -0.481753 0.992115
--0.0848625 -0.0466535 0.0899457 -0.481753 0.982287
-0.0249441 0.0137131 0.12107 -0.481753 0.968583
-0.128088 0.0704169 0.153133 -0.481753 0.951057
-0.223099 0.122649 0.18632 -0.481753 0.929777
-0.308629 0.16967 0.220784 -0.481753 0.904827
-0.38348 0.210819 0.256643 -0.481753 0.876307
-0.446614 0.245528 0.293972 -0.481753 0.844328
-0.497176 0.273324 0.332801 -0.481753 0.809017
-0.534501 0.293844 0.373114 -0.481753 0.770513
-0.55813 0.306834 0.414842 -0.481753 0.728969
-0.567811 0.312156 0.457868 -0.481753 0.684547
-0.563505 0.309789 0.502022 -0.481753 0.637424
-0.545389 0.299829 0.547082 -0.481753 0.587785
-0.513845 0.282488 0.592781 -0.481753 0.535827
-0.469464 0.25809 0.6388 -0.481753 0.481754
-0.413028 0.227063 0.684782 -0.481753 0.42578
-0.345499 0.189939 0.730326 -0.481753 0.368125
-0.268007 0.147338 0.775001 -0.481753 0.309017
-0.18183 0.0999616 0.818346 -0.481753 0.24869
-0.0883706 0.0485821 0.859878 -0.481753 0.187382
--0.010861 -0.00597087 0.899099 -0.481753 0.125334
--0.114275 -0.062823 0.935503 -0.481753 0.0627908
--0.220225 -0.121069 0.968583 -0.481753 3.26795e-07
--0.327034 -0.179788 0.997841 -0.481753 -0.0627902
--0.433025 -0.238057 1.02279 -0.481753 -0.125333
--0.53654 -0.294965 1.04298 -0.481753 -0.187381
--0.635972 -0.349628 1.05796 -0.481753 -0.24869
--0.729789 -0.401204 1.06735 -0.481753 -0.309017
--0.816556 -0.448904 1.07081 -0.481753 -0.368124
--0.894959 -0.492007 1.06802 -0.481753 -0.425779
--0.963827 -0.529867 1.05875 -0.481753 -0.481753
--1.02215 -0.561928 1.04282 -0.481753 -0.535826
--1.06908 -0.58773 1.02012 -0.481753 -0.587785
--1.10398 -0.606916 0.990591 -0.481753 -0.637424
--1.12639 -0.619238 0.954266 -0.481753 -0.684547
--1.13607 -0.62456 0.91124 -0.481753 -0.728968
--1.13298 -0.622862 0.861683 -0.481753 -0.770513
--1.11729 -0.614236 0.805837 -0.481753 -0.809017
--1.08938 -0.598889 0.744014 -0.481753 -0.844328
--1.04981 -0.577138 0.676595 -0.481753 -0.876306
--0.999358 -0.549401 0.604022 -0.481753 -0.904827
--0.938957 -0.516195 0.5268 -0.481753 -0.929776
--0.869709 -0.478126 0.445485 -0.481753 -0.951056
--0.792859 -0.435877 0.360685 -0.481753 -0.968583
--0.709774 -0.390201 0.273044 -0.481753 -0.982287
--0.621923 -0.341904 0.183243 -0.481753 -0.992115
--0.530851 -0.291837 0.0919878 -0.481753 -0.998027
--0.438154 -0.240877 9.58138e-07 -0.481753 -1
--0.345458 -0.189917 -0.0919859 -0.481753 -0.998027
--0.254386 -0.13985 -0.183241 -0.481753 -0.992115
--0.166535 -0.0915531 -0.273042 -0.481753 -0.982287
--0.0834499 -0.0458769 -0.360683 -0.481753 -0.968583
--0.00659972 -0.00362822 -0.445484 -0.481753 -0.951057
-0.0626483 0.0344411 -0.526798 -0.481753 -0.929777
-0.12305 0.0676471 -0.60402 -0.481753 -0.904827
-0.173504 0.0953843 -0.676593 -0.481753 -0.876307
-0.21307 0.117136 -0.744013 -0.481753 -0.844328
-0.240985 0.132483 -0.805836 -0.481753 -0.809017
-0.256676 0.141108 -0.861682 -0.481753 -0.770514
-0.259766 0.142807 -0.911239 -0.481753 -0.728969
-0.250085 0.137485 -0.954265 -0.481753 -0.684548
-0.227672 0.125164 -0.99059 -0.481753 -0.637425
-0.192774 0.105978 -1.02012 -0.481753 -0.587786
-0.14584 0.0801761 -1.04282 -0.481753 -0.535828
-0.0875208 0.0481149 -1.05875 -0.481753 -0.481754
-0.0186534 0.0102548 -1.06802 -0.481753 -0.42578
--0.0597496 -0.0328476 -1.07081 -0.481753 -0.368125
--0.146516 -0.0805478 -1.06735 -0.481753 -0.309018
--0.240333 -0.132124 -1.05796 -0.481753 -0.248691
--0.339765 -0.186787 -1.04298 -0.481753 -0.187382
--0.44328 -0.243695 -1.02279 -0.481753 -0.125334
--0.54927 -0.301963 -0.997841 -0.481753 -0.0627915
--0.65608 -0.360683 -0.968584 -0.481753 -9.80385e-07
--0.76203 -0.418929 -0.935503 -0.481753 0.0627895
--0.865444 -0.475781 -0.8991 -0.481753 0.125332
--0.964676 -0.530334 -0.859879 -0.481753 0.18738
--1.05813 -0.581714 -0.818347 -0.481753 0.248689
--1.14431 -0.62909 -0.775002 -0.481753 0.309016
--1.2218 -0.671691 -0.730327 -0.481753 0.368124
--1.28933 -0.708816 -0.684783 -0.481753 0.425778
--1.34577 -0.739842 -0.638801 -0.481753 0.481753
--1.39015 -0.764241 -0.592782 -0.481753 0.535826
--1.4217 -0.781582 -0.547083 -0.481753 0.587784
--1.43981 -0.791542 -0.502022 -0.481753 0.637423
--1.44412 -0.793909 -0.457869 -0.481753 0.684546
--1.43444 -0.788587 -0.414843 -0.481753 0.728968
--1.41081 -0.775597 -0.373114 -0.481753 0.770513
--1.37348 -0.755078 -0.332802 -0.481753 0.809016
--1.32292 -0.727281 -0.293973 -0.481753 0.844327
--1.25979 -0.692573 -0.256644 -0.481753 0.876306
--1.18494 -0.651424 -0.220785 -0.481753 0.904827
--1.09941 -0.604403 -0.18632 -0.481753 0.929776
--1.0044 -0.552171 -0.153133 -0.481753 0.951056
--0.901253 -0.495467 -0.12107 -0.481753 0.968583
--0.791447 -0.435101 -0.0899463 -0.481753 0.982287
--0.676552 -0.371937 -0.0595497 -0.481753 0.992115
--0.55822 -0.306883 -0.0296494 -0.481753 0.998027
--0.422164 -0.267913 0 -0.535826 1
--0.305753 -0.194036 0.0253305 -0.535826 0.998027
--0.191002 -0.121213 0.0509745 -0.535826 0.992115
--0.0795481 -0.0504827 0.0772378 -0.535826 0.982287
-0.0270245 0.0171503 0.104411 -0.535826 0.968583
-0.127206 0.0807272 0.13276 -0.535826 0.951057
-0.219584 0.139352 0.162525 -0.535826 0.929777
-0.302867 0.192205 0.193907 -0.535826 0.904827
-0.375901 0.238554 0.227065 -0.535826 0.876307
-0.437692 0.277767 0.262113 -0.535826 0.844328
-0.487414 0.309322 0.29911 -0.535826 0.809017
-0.524429 0.332812 0.338065 -0.535826 0.770513
-0.548291 0.347955 0.378926 -0.535826 0.728969
-0.558755 0.354596 0.421584 -0.535826 0.684547
-0.55578 0.352708 0.46587 -0.535826 0.637424
-0.539527 0.342394 0.511558 -0.535826 0.587785
-0.510362 0.323885 0.558364 -0.535826 0.535827
-0.468842 0.297536 0.605952 -0.535826 0.481754
-0.415712 0.263818 0.653934 -0.535826 0.42578
-0.351887 0.223314 0.701876 -0.535826 0.368125
-0.278445 0.176706 0.749307 -0.535826 0.309017
-0.196603 0.124768 0.795719 -0.535826 0.24869
-0.1077 0.0683485 0.840581 -0.535826 0.187382
-0.0131772 0.00836249 0.883339 -0.535826 0.125334
--0.0854481 -0.0542269 0.923432 -0.535826 0.0627908
--0.186604 -0.118422 0.960294 -0.535826 3.26795e-07
--0.288689 -0.183207 0.993366 -0.535826 -0.0627902
--0.3901 -0.247564 1.0221 -0.535826 -0.125333
--0.489253 -0.310489 1.04599 -0.535826 -0.187381
--0.584612 -0.371005 1.06453 -0.535826 -0.24869
--0.674711 -0.428184 1.07728 -0.535826 -0.309017
--0.758179 -0.481154 1.08384 -0.535826 -0.368124
--0.833757 -0.529118 1.08387 -0.535826 -0.425779
--0.900325 -0.571363 1.07707 -0.535826 -0.481753
--0.956911 -0.607273 1.06324 -0.535826 -0.535826
--1.00271 -0.636339 1.04223 -0.535826 -0.587785
--1.0371 -0.658165 1.01397 -0.535826 -0.637424
--1.05965 -0.672474 0.978465 -0.535826 -0.684547
--1.07012 -0.679115 0.935807 -0.535826 -0.728968
--1.06845 -0.678061 0.886164 -0.535826 -0.770513
--1.05483 -0.669411 0.829783 -0.535826 -0.809017
--1.02958 -0.653391 0.76699 -0.535826 -0.844328
--0.993267 -0.630345 0.698185 -0.535826 -0.876306
--0.946603 -0.600731 0.62384 -0.535826 -0.904827
--0.890482 -0.565116 0.544491 -0.535826 -0.929776
--0.825951 -0.524164 0.460735 -0.535826 -0.951056
--0.754191 -0.478623 0.373221 -0.535826 -0.968583
--0.676502 -0.429321 0.282645 -0.535826 -0.982287
--0.59428 -0.377141 0.18974 -0.535826 -0.992115
--0.508995 -0.323017 0.0952651 -0.535826 -0.998027
--0.422165 -0.267914 9.92329e-07 -0.535826 -1
--0.335335 -0.21281 -0.0952631 -0.535826 -0.998027
--0.25005 -0.158686 -0.189738 -0.535826 -0.992115
--0.167828 -0.106507 -0.282643 -0.535826 -0.982287
--0.0901389 -0.0572038 -0.373219 -0.535826 -0.968583
--0.0183787 -0.0116635 -0.460733 -0.535826 -0.951057
-0.0461528 0.0292894 -0.544489 -0.535826 -0.929777
-0.102273 0.0649046 -0.623838 -0.535826 -0.904827
-0.148937 0.0945184 -0.698184 -0.535826 -0.876307
-0.185253 0.117565 -0.766989 -0.535826 -0.844328
-0.210497 0.133585 -0.829782 -0.535826 -0.809017
-0.224126 0.142234 -0.886163 -0.535826 -0.770514
-0.225787 0.143289 -0.935806 -0.535826 -0.728969
-0.215324 0.136648 -0.978464 -0.535826 -0.684548
-0.192776 0.122339 -1.01397 -0.535826 -0.637425
-0.158384 0.100514 -1.04223 -0.535826 -0.587786
-0.112584 0.0714476 -1.06324 -0.535826 -0.535828
-0.0559979 0.0355373 -1.07707 -0.535826 -0.481754
--0.0105694 -0.00670752 -1.08387 -0.535826 -0.42578
--0.0861479 -0.0546711 -1.08384 -0.535826 -0.368125
--0.169615 -0.107641 -1.07728 -0.535826 -0.309018
--0.259715 -0.16482 -1.06453 -0.535826 -0.248691
--0.355073 -0.225336 -1.04599 -0.535826 -0.187382
--0.454226 -0.28826 -1.0221 -0.535826 -0.125334
--0.555637 -0.352617 -0.993366 -0.535826 -0.0627915
--0.657722 -0.417403 -0.960294 -0.535826 -9.80385e-07
--0.758878 -0.481598 -0.923433 -0.535826 0.0627895
--0.857504 -0.544187 -0.88334 -0.535826 0.125332
--0.952027 -0.604173 -0.840582 -0.535826 0.18738
--1.04093 -0.660593 -0.79572 -0.535826 0.248689
--1.12277 -0.712531 -0.749308 -0.535826 0.309016
--1.19621 -0.759139 -0.701877 -0.535826 0.368124
--1.26004 -0.799644 -0.653935 -0.535826 0.425778
--1.31317 -0.833361 -0.605953 -0.535826 0.481753
--1.35469 -0.859711 -0.558365 -0.535826 0.535826
--1.38386 -0.87822 -0.511559 -0.535826 0.587784
--1.40011 -0.888534 -0.465871 -0.535826 0.637423
--1.40308 -0.890422 -0.421585 -0.535826 0.684546
--1.39262 -0.883782 -0.378927 -0.535826 0.728968
--1.36876 -0.868639 -0.338066 -0.535826 0.770513
--1.33174 -0.845149 -0.299111 -0.535826 0.809016
--1.28202 -0.813594 -0.262113 -0.535826 0.844327
--1.22023 -0.774381 -0.227066 -0.535826 0.876306
--1.1472 -0.728032 -0.193908 -0.535826 0.904827
--1.06391 -0.675179 -0.162526 -0.535826 0.929776
--0.971536 -0.616555 -0.132761 -0.535826 0.951056
--0.871355 -0.552978 -0.104411 -0.535826 0.968583
--0.764782 -0.485345 -0.0772383 -0.535826 0.982287
--0.653329 -0.414614 -0.0509751 -0.535826 0.992115
--0.538578 -0.341791 -0.0253311 -0.535826 0.998027
--0.404509 -0.293892 0 -0.587785 1
--0.292377 -0.212424 0.0209873 -0.587785 0.998027
--0.181828 -0.132106 0.0423497 -0.587785 0.992115
--0.0744206 -0.0540696 0.0644536 -0.587785 0.982287
-0.0283352 0.0205867 0.0876483 -0.587785 0.968583
-0.125 0.0908176 0.112257 -0.587785 0.951057
-0.214227 0.155645 0.138571 -0.587785 0.929777
-0.294785 0.214174 0.166839 -0.587785 0.904827
-0.365573 0.265604 0.197264 -0.587785 0.876307
-0.425641 0.309246 0.229995 -0.587785 0.844328
-0.474201 0.344526 0.265125 -0.587785 0.809017
-0.51064 0.371001 0.302683 -0.587785 0.770513
-0.534531 0.388359 0.342636 -0.587785 0.728969
-0.545636 0.396427 0.384883 -0.587785 0.684547
-0.543912 0.395175 0.429259 -0.587785 0.637424
-0.529509 0.38471 0.475529 -0.587785 0.587785
-0.502767 0.365281 0.523397 -0.587785 0.535827
-0.464212 0.337269 0.572506 -0.587785 0.481754
-0.414547 0.301186 0.62244 -0.587785 0.42578
-0.354641 0.257661 0.672733 -0.587785 0.368125
-0.28551 0.207435 0.722873 -0.587785 0.309017
-0.208309 0.151345 0.772307 -0.587785 0.24869
-0.124306 0.0903136 0.820454 -0.587785 0.187382
-0.0348676 0.0253327 0.866708 -0.587785 0.125334
--0.0585677 -0.0425518 0.91045 -0.587785 0.0627908
--0.154508 -0.112257 0.951056 -0.587785 3.26795e-07
--0.251436 -0.182678 0.98791 -0.587785 -0.0627902
--0.347827 -0.252711 1.02041 -0.587785 -0.125333
--0.442179 -0.321262 1.04797 -0.587785 -0.187381
--0.533034 -0.387271 1.07005 -0.587785 -0.24869
--0.618999 -0.449728 1.08614 -0.587785 -0.309017
--0.698769 -0.507685 1.09581 -0.587785 -0.368124
--0.771151 -0.560273 1.09864 -0.587785 -0.425779
--0.835076 -0.606717 1.09433 -0.587785 -0.481753
--0.88962 -0.646346 1.08261 -0.587785 -0.535826
--0.934018 -0.678602 1.06331 -0.587785 -0.587785
--0.967673 -0.703055 1.03635 -0.587785 -0.637424
--0.99017 -0.719399 1.0017 -0.587785 -0.684547
--1.00128 -0.727468 0.95945 -0.587785 -0.728968
--1.00095 -0.727228 0.90977 -0.587785 -0.770513
--0.989326 -0.718786 0.85291 -0.587785 -0.809017
--0.966746 -0.702381 0.789209 -0.587785 -0.844328
--0.933715 -0.678382 0.719087 -0.587785 -0.876306
--0.890914 -0.647286 0.643042 -0.587785 -0.904827
--0.839183 -0.609701 0.561645 -0.587785 -0.929776
--0.77951 -0.566346 0.475529 -0.587785 -0.951056
--0.713009 -0.51803 0.385389 -0.587785 -0.968583
--0.640907 -0.465645 0.291968 -0.587785 -0.982287
--0.564524 -0.41015 0.196049 -0.587785 -0.992115
--0.485246 -0.352551 0.0984484 -0.587785 -0.998027
--0.40451 -0.293893 1.02554e-06 -0.587785 -1
--0.323773 -0.235235 -0.0984464 -0.587785 -0.998027
--0.244496 -0.177636 -0.196047 -0.587785 -0.992115
--0.168112 -0.12214 -0.291966 -0.587785 -0.982287
--0.0960103 -0.0697555 -0.385387 -0.587785 -0.968583
--0.0295091 -0.0214396 -0.475527 -0.587785 -0.951057
-0.0301647 0.0219159 -0.561643 -0.587785 -0.929777
-0.0818953 0.0595004 -0.643041 -0.587785 -0.904827
-0.124696 0.0905971 -0.719086 -0.587785 -0.876307
-0.157728 0.114596 -0.789207 -0.587785 -0.844328
-0.180308 0.131001 -0.852909 -0.587785 -0.809017
-0.191928 0.139444 -0.909769 -0.587785 -0.770514
-0.192258 0.139683 -0.959449 -0.587785 -0.728969
-0.181153 0.131615 -1.0017 -0.587785 -0.684548
-0.158656 0.11527 -1.03634 -0.587785 -0.637425
-0.125001 0.0908183 -1.06331 -0.587785 -0.587786
-0.0806034 0.0585617 -1.08261 -0.587785 -0.535828
-0.0260596 0.0189333 -1.09433 -0.587785 -0.481754
--0.037865 -0.0275105 -1.09864 -0.587785 -0.42578
--0.110246 -0.0800986 -1.09581 -0.587785 -0.368125
--0.190017 -0.138055 -1.08614 -0.587785 -0.309018
--0.275981 -0.200512 -1.07005 -0.587785 -0.248691
--0.366836 -0.266522 -1.04797 -0.587785 -0.187382
--0.461188 -0.335072 -1.02041 -0.587785 -0.125334
--0.55758 -0.405105 -0.987911 -0.587785 -0.0627915
--0.654507 -0.475526 -0.951057 -0.587785 -9.80385e-07
--0.750448 -0.545231 -0.910451 -0.587785 0.0627895
--0.843883 -0.613116 -0.866709 -0.587785 0.125332
--0.933322 -0.678097 -0.820455 -0.587785 0.18738
--1.01732 -0.739128 -0.772308 -0.587785 0.248689
--1.09453 -0.795218 -0.722874 -0.587785 0.309016
--1.16366 -0.845445 -0.672735 -0.587785 0.368124
--1.22356 -0.88897 -0.622441 -0.587785 0.425778
--1.27323 -0.925053 -0.572507 -0.587785 0.481753
--1.31178 -0.953065 -0.523398 -0.587785 0.535826
--1.33853 -0.972494 -0.47553 -0.587785 0.587784
--1.35293 -0.982959 -0.429259 -0.587785 0.637423
--1.35465 -0.984212 -0.384884 -0.587785 0.684546
--1.34355 -0.976144 -0.342637 -0.587785 0.728968
--1.31966 -0.958786 -0.302684 -0.587785 0.770513
--1.28322 -0.932312 -0.265125 -0.587785 0.809016
--1.23466 -0.897031 -0.229996 -0.587785 0.844327
--1.17459 -0.85339 -0.197264 -0.587785 0.876306
--1.1038 -0.801959 -0.166839 -0.587785 0.904827
--1.02325 -0.743431 -0.138571 -0.587785 0.929776
--0.934019 -0.678604 -0.112258 -0.587785 0.951056
--0.837355 -0.608373 -0.0876488 -0.587785 0.968583
--0.734599 -0.533717 -0.0644541 -0.587785 0.982287
--0.627192 -0.455681 -0.0423501 -0.587785 0.992115
--0.516643 -0.375362 -0.0209877 -0.587785 0.998027
--0.385257 -0.318712 0 -0.637423 1
--0.278007 -0.229987 0.0166233 -0.637423 0.998027
--0.172254 -0.142501 0.033683 -0.637423 0.992115
--0.0694739 -0.0574737 0.0516059 -0.637423 0.982287
-0.0289045 0.0239119 0.0707995 -0.637423 0.968583
-0.121519 0.100529 0.0916432 -0.637423 0.951057
-0.207095 0.171323 0.11448 -0.637423 0.929777
-0.284465 0.235329 0.139606 -0.637423 0.904827
-0.352587 0.291685 0.167267 -0.637423 0.876307
-0.41056 0.339644 0.19765 -0.637423 0.844328
-0.457636 0.378589 0.230877 -0.637423 0.809017
-0.493233 0.408037 0.267002 -0.637423 0.770513
-0.516942 0.427651 0.306008 -0.637423 0.728969
-0.528536 0.437243 0.347803 -0.637423 0.684547
-0.527969 0.436773 0.392223 -0.637423 0.637424
-0.515378 0.426357 0.43903 -0.637423 0.587785
-0.491079 0.406256 0.487913 -0.637423 0.535827
-0.455566 0.376877 0.538494 -0.637423 0.481754
-0.409497 0.338765 0.590333 -0.637423 0.42578
-0.353687 0.292595 0.642927 -0.637423 0.368125
-0.289093 0.239158 0.695726 -0.637423 0.309017
-0.216798 0.179351 0.748133 -0.637423 0.24869
-0.137999 0.114162 0.799517 -0.637423 0.187382
-0.053978 0.0446544 0.849221 -0.637423 0.125334
--0.0339077 -0.0280509 0.896569 -0.637423 0.0627908
--0.124254 -0.102792 0.940881 -0.637423 3.26795e-07
--0.215631 -0.178385 0.981479 -0.637423 -0.0627902
--0.306603 -0.253644 1.0177 -0.637423 -0.125333
--0.395754 -0.327395 1.04891 -0.637423 -0.187381
--0.481707 -0.398502 1.07451 -0.637423 -0.24869
--0.563151 -0.465878 1.09394 -0.637423 -0.309017
--0.638853 -0.528505 1.10669 -0.637423 -0.368124
--0.707687 -0.585449 1.11234 -0.637423 -0.425779
--0.768644 -0.635877 1.11051 -0.637423 -0.481753
--0.82085 -0.679065 1.10091 -0.637423 -0.535826
--0.863581 -0.714415 1.08335 -0.637423 -0.587785
--0.896272 -0.741459 1.0577 -0.637423 -0.637424
--0.918526 -0.759869 1.02394 -0.637423 -0.684547
--0.93012 -0.769461 0.982147 -0.637423 -0.728968
--0.931009 -0.770196 0.932478 -0.637423 -0.770513
--0.921323 -0.762184 0.875195 -0.637423 -0.809017
--0.90137 -0.745677 0.810649 -0.637423 -0.844328
--0.871624 -0.721069 0.739279 -0.637423 -0.876306
--0.832721 -0.688885 0.66161 -0.637423 -0.904827
--0.785447 -0.649777 0.578244 -0.637423 -0.929776
--0.730725 -0.604507 0.489854 -0.637423 -0.951056
--0.669602 -0.553942 0.397177 -0.637423 -0.968583
--0.603227 -0.499032 0.301002 -0.637423 -0.982287
--0.532836 -0.4408 0.202165 -0.637423 -0.992115
--0.459731 -0.380322 0.101535 -0.637423 -0.998027
--0.385258 -0.318712 1.05774e-06 -0.637423 -1
--0.310784 -0.257103 -0.101532 -0.637423 -0.998027
--0.237679 -0.196625 -0.202163 -0.637423 -0.992115
--0.167288 -0.138393 -0.301 -0.637423 -0.982287
--0.100913 -0.0834825 -0.397175 -0.637423 -0.968583
--0.0397898 -0.0329169 -0.489852 -0.637423 -0.951057
-0.0149317 0.0123526 -0.578242 -0.637423 -0.929777
-0.062206 0.0514612 -0.661608 -0.637423 -0.904827
-0.101109 0.0836449 -0.739278 -0.637423 -0.876307
-0.130856 0.108253 -0.810647 -0.637423 -0.844328
-0.150809 0.12476 -0.875194 -0.637423 -0.809017
-0.160495 0.132773 -0.932477 -0.637423 -0.770514
-0.159606 0.132038 -0.982146 -0.637423 -0.728969
-0.148012 0.122446 -1.02394 -0.637423 -0.684548
-0.125759 0.104036 -1.0577 -0.637423 -0.637425
-0.0930682 0.0769926 -1.08335 -0.637423 -0.587786
-0.0503375 0.0416427 -1.10091 -0.637423 -0.535828
--0.00186844 -0.0015457 -1.11051 -0.637423 -0.481754
--0.062825 -0.0519733 -1.11234 -0.637423 -0.42578
--0.131659 -0.108918 -1.10669 -0.637423 -0.368125
--0.207362 -0.171544 -1.09394 -0.637423 -0.309018
--0.288805 -0.23892 -1.07451 -0.637423 -0.248691
--0.374758 -0.310026 -1.04891 -0.637423 -0.187382
--0.463909 -0.383778 -1.0177 -0.637423 -0.125334
--0.554881 -0.459036 -0.98148 -0.637423 -0.0627915
--0.646257 -0.53463 -0.940882 -0.637423 -9.80385e-07
--0.736604 -0.609371 -0.89657 -0.637423 0.0627895
--0.82449 -0.682076 -0.849222 -0.637423 0.125332
--0.908511 -0.751584 -0.799519 -0.637423 0.18738
--0.987311 -0.816773 -0.748134 -0.637423 0.248689
--1.05961 -0.87658 -0.695727 -0.637423 0.309016
--1.1242 -0.930017 -0.642928 -0.637423 0.368124
--1.18001 -0.976188 -0.590334 -0.637423 0.425778
--1.22608 -1.0143 -0.538496 -0.637423 0.481753
--1.26159 -1.04368 -0.487914 -0.637423 0.535826
--1.28589 -1.06378 -0.439031 -0.637423 0.587784
--1.29848 -1.0742 -0.392224 -0.637423 0.637423
--1.29905 -1.07467 -0.347804 -0.637423 0.684546
--1.28746 -1.06507 -0.306009 -0.637423 0.728968
--1.26375 -1.04546 -0.267003 -0.637423 0.770513
--1.22815 -1.01601 -0.230878 -0.637423 0.809016
--1.18107 -0.977068 -0.197651 -0.637423 0.844327
--1.1231 -0.929109 -0.167268 -0.637423 0.876306
--1.05498 -0.872754 -0.139606 -0.637423 0.904827
--0.97761 -0.808748 -0.11448 -0.637423 0.929776
--0.892034 -0.737954 -0.0916437 -0.637423 0.951056
--0.79942 -0.661337 -0.0707999 -0.637423 0.968583
--0.701042 -0.579951 -0.0516063 -0.637423 0.982287
--0.598262 -0.494924 -0.0336834 -0.637423 0.992115
--0.492509 -0.407438 -0.0166237 -0.637423 0.998027
--0.364485 -0.342273 0 -0.684547 1
--0.262687 -0.246679 0.012243 -0.684547 0.998027
--0.162295 -0.152405 0.0249831 -0.684547 0.992115
--0.0646937 -0.0607514 0.0387072 -0.684547 0.982287
-0.0287738 0.0270204 0.0538809 -0.684547 0.968583
-0.116829 0.109709 0.0709388 -0.684547 0.951057
-0.198273 0.186191 0.0902752 -0.684547 0.929777
-0.272011 0.255435 0.112235 -0.684547 0.904827
-0.337062 0.316522 0.137106 -0.684547 0.876307
-0.392577 0.368654 0.16511 -0.684547 0.844328
-0.437854 0.411171 0.196402 -0.684547 0.809017
-0.472342 0.443558 0.231058 -0.684547 0.770513
-0.495655 0.465451 0.269078 -0.684547 0.728969
-0.507576 0.476645 0.31038 -0.684547 0.684547
-0.508057 0.477096 0.354801 -0.684547 0.637424
-0.497222 0.466922 0.402098 -0.684547 0.587785
-0.475364 0.446396 0.451947 -0.684547 0.535827
-0.442941 0.415948 0.503952 -0.684547 0.481754
-0.400564 0.376154 0.557642 -0.684547 0.42578
-0.348994 0.327726 0.612486 -0.684547 0.368125
-0.289121 0.271502 0.667892 -0.684547 0.309017
-0.221958 0.208433 0.723221 -0.684547 0.24869
-0.148621 0.139564 0.777792 -0.684547 0.187382
-0.0703076 0.0660231 0.830896 -0.684547 0.125334
--0.0117144 -0.0110005 0.881803 -0.684547 0.0627908
--0.096133 -0.0902747 0.929776 -0.684547 3.26795e-07
--0.181611 -0.170543 0.97408 -0.684547 -0.0627902
--0.266806 -0.250547 1.01399 -0.684547 -0.125333
--0.350393 -0.32904 1.04882 -0.684547 -0.187381
--0.431086 -0.404816 1.07791 -0.684547 -0.24869
--0.507655 -0.476719 1.10065 -0.684547 -0.309017
--0.578949 -0.543668 1.11648 -0.684547 -0.368124
--0.64391 -0.604671 1.12493 -0.684547 -0.425779
--0.701594 -0.658839 1.12559 -0.684547 -0.481753
--0.75118 -0.705404 1.11813 -0.684547 -0.535826
--0.791989 -0.743726 1.10231 -0.684547 -0.587785
--0.823489 -0.773307 1.07801 -0.684547 -0.637424
--0.845306 -0.793794 1.04518 -0.684547 -0.684547
--0.857227 -0.804988 1.00387 -0.684547 -0.728968
--0.859204 -0.806845 0.954266 -0.684547 -0.770513
--0.851358 -0.799477 0.896616 -0.684547 -0.809017
--0.833967 -0.783146 0.831289 -0.684547 -0.844328
--0.807473 -0.758266 0.758741 -0.684547 -0.876306
--0.772464 -0.725391 0.679525 -0.684547 -0.904827
--0.72967 -0.685204 0.594273 -0.684547 -0.929776
--0.679948 -0.638513 0.503696 -0.684547 -0.951056
--0.624271 -0.586229 0.408572 -0.684547 -0.968583
--0.563708 -0.529356 0.309739 -0.684547 -0.982287
--0.499409 -0.468975 0.208082 -0.684547 -0.992115
--0.432584 -0.406222 0.10452 -0.684547 -0.998027
--0.364485 -0.342274 1.0889e-06 -0.684547 -1
--0.296387 -0.278326 -0.104518 -0.684547 -0.998027
--0.229562 -0.215573 -0.20808 -0.684547 -0.992115
--0.165262 -0.155191 -0.309737 -0.684547 -0.982287
--0.104699 -0.0983189 -0.40857 -0.684547 -0.968583
--0.0490221 -0.0460347 -0.503694 -0.684547 -0.951057
-0.00069953 0.000656901 -0.594271 -0.684547 -0.929777
-0.0434939 0.0408434 -0.679523 -0.684547 -0.904827
-0.0785032 0.0737193 -0.75874 -0.684547 -0.876307
-0.104998 0.0985993 -0.831287 -0.684547 -0.844328
-0.122388 0.11493 -0.896615 -0.684547 -0.809017
-0.130235 0.122299 -0.954265 -0.684547 -0.770514
-0.128258 0.120442 -1.00387 -0.684547 -0.728969
-0.116337 0.109248 -1.04518 -0.684547 -0.684548
-0.0945208 0.0887608 -1.07801 -0.684547 -0.637425
-0.0630209 0.0591805 -1.10231 -0.684547 -0.587786
-0.022212 0.0208584 -1.11812 -0.684547 -0.535828
--0.0273744 -0.0257063 -1.12559 -0.684547 -0.481754
--0.0850578 -0.0798745 -1.12493 -0.684547 -0.42578
--0.150019 -0.140877 -1.11648 -0.684547 -0.368125
--0.221312 -0.207826 -1.10065 -0.684547 -0.309018
--0.297882 -0.279729 -1.07791 -0.684547 -0.248691
--0.378574 -0.355504 -1.04882 -0.684547 -0.187382
--0.462162 -0.433998 -1.01399 -0.684547 -0.125334
--0.547357 -0.514001 -0.974081 -0.684547 -0.0627915
--0.632834 -0.59427 -0.929777 -0.684547 -9.80385e-07
--0.717253 -0.673544 -0.881805 -0.684547 0.0627895
--0.799275 -0.750568 -0.830897 -0.684547 0.125332
--0.877588 -0.824109 -0.777793 -0.684547 0.18738
--0.950926 -0.892978 -0.723222 -0.684547 0.248689
--1.01809 -0.956048 -0.667893 -0.684547 0.309016
--1.07796 -1.01227 -0.612487 -0.684547 0.368124
--1.12953 -1.0607 -0.557643 -0.684547 0.425778
--1.17191 -1.10049 -0.503953 -0.684547 0.481753
--1.20433 -1.13094 -0.451949 -0.684547 0.535826
--1.22619 -1.15147 -0.402099 -0.684547 0.587784
--1.23703 -1.16164 -0.354802 -0.684547 0.637423
--1.23655 -1.16119 -0.310381 -0.684547 0.684546
--1.22463 -1.15 -0.269079 -0.684547 0.728968
--1.20131 -1.12811 -0.231059 -0.684547 0.770513
--1.16682 -1.09572 -0.196403 -0.684547 0.809016
--1.12155 -1.0532 -0.165111 -0.684547 0.844327
--1.06603 -1.00107 -0.137106 -0.684547 0.876306
--1.00098 -0.939983 -0.112236 -0.684547 0.904827
--0.927244 -0.870739 -0.0902757 -0.684547 0.929776
--0.8458 -0.794257 -0.0709392 -0.684547 0.951056
--0.757745 -0.711569 -0.0538812 -0.684547 0.968583
--0.664277 -0.623797 -0.0387075 -0.684547 0.982287
--0.566677 -0.532144 -0.0249834 -0.684547 0.992115
--0.466285 -0.43787 -0.0122432 -0.684547 0.998027
--0.342274 -0.364484 0 -0.728968 1
--0.246463 -0.262456 0.00785052 -0.728968 0.998027
--0.151961 -0.161822 0.0162586 -0.728968 0.992115
--0.0600581 -0.0639553 0.0257703 -0.728968 0.982287
-0.0279968 0.0298135 0.0369091 -0.728968 0.968583
-0.111012 0.118215 0.0501644 -0.728968 0.951057
-0.187871 0.200062 0.0659819 -0.728968 0.929777
-0.257554 0.274266 0.0847535 -0.728968 0.904827
-0.319145 0.339854 0.106809 -0.728968 0.876307
-0.371854 0.395984 0.132408 -0.728968 0.844328
-0.415023 0.441954 0.161733 -0.728968 0.809017
-0.448139 0.477219 0.194886 -0.728968 0.770513
-0.470839 0.501391 0.231882 -0.728968 0.728969
-0.482915 0.514252 0.272651 -0.728968 0.684547
-0.484322 0.515749 0.317029 -0.728968 0.637424
-0.475169 0.506003 0.364769 -0.728968 0.587785
-0.455725 0.485298 0.415536 -0.728968 0.535827
-0.426411 0.454081 0.468912 -0.728968 0.481754
-0.387791 0.412955 0.524402 -0.728968 0.42578
-0.340566 0.362665 0.58144 -0.728968 0.368125
-0.285561 0.304091 0.639399 -0.728968 0.309017
-0.223712 0.238229 0.697594 -0.728968 0.24869
-0.156051 0.166177 0.755299 -0.728968 0.187382
-0.0836878 0.0891183 0.811751 -0.728968 0.125334
-0.00779671 0.00830263 0.866168 -0.728968 0.0627908
--0.070407 -0.0749757 0.917755 -0.728968 3.26795e-07
--0.149684 -0.159397 0.965719 -0.728968 -0.0627902
--0.228789 -0.243636 1.00928 -0.728968 -0.125333
--0.306496 -0.326384 1.0477 -0.728968 -0.187381
--0.381608 -0.406371 1.08025 -0.728968 -0.24869
--0.452987 -0.482382 1.10627 -0.728968 -0.309017
--0.519563 -0.553278 1.12517 -0.728968 -0.368124
--0.580354 -0.618013 1.13642 -0.728968 -0.425779
--0.634482 -0.675653 1.13956 -0.728968 -0.481753
--0.681184 -0.725386 1.13424 -0.728968 -0.535826
--0.719827 -0.766537 1.12019 -0.728968 -0.587785
--0.749916 -0.798578 1.09726 -0.728968 -0.637424
--0.771099 -0.821136 1.06538 -0.728968 -0.684547
--0.783176 -0.833996 1.02461 -0.728968 -0.728968
--0.786099 -0.837109 0.975112 -0.728968 -0.770513
--0.779973 -0.830586 0.917153 -0.728968 -0.809017
--0.765056 -0.8147 0.851108 -0.728968 -0.844328
--0.741748 -0.78988 0.777455 -0.728968 -0.876306
--0.710592 -0.756702 0.696769 -0.728968 -0.904827
--0.672258 -0.715881 0.609715 -0.728968 -0.929776
--0.627537 -0.668258 0.51704 -0.728968 -0.951056
--0.577324 -0.614787 0.419565 -0.728968 -0.968583
--0.522605 -0.556517 0.318171 -0.728968 -0.982287
--0.464439 -0.494577 0.213793 -0.728968 -0.992115
--0.403944 -0.430156 0.107403 -0.728968 -0.998027
--0.342274 -0.364485 1.11898e-06 -0.728968 -1
--0.280605 -0.298813 -0.107401 -0.728968 -0.998027
--0.22011 -0.234393 -0.213791 -0.728968 -0.992115
--0.161944 -0.172453 -0.318169 -0.728968 -0.982287
--0.107225 -0.114182 -0.419562 -0.728968 -0.968583
--0.0570115 -0.0607109 -0.517038 -0.728968 -0.951057
--0.0122904 -0.0130879 -0.609713 -0.728968 -0.929777
-0.0260432 0.0277332 -0.696767 -0.728968 -0.904827
-0.0571996 0.0609113 -0.777454 -0.728968 -0.876307
-0.0805074 0.0857316 -0.851107 -0.728968 -0.844328
-0.0954253 0.101617 -0.917152 -0.728968 -0.809017
-0.101551 0.108141 -0.975111 -0.728968 -0.770514
-0.0986281 0.105028 -1.02461 -0.728968 -0.728969
-0.0865515 0.0921678 -1.06538 -0.728968 -0.684548
-0.0653688 0.0696106 -1.09725 -0.728968 -0.637425
-0.0352804 0.0375697 -1.12019 -0.728968 -0.587786
--0.00336285 -0.00358107 -1.13424 -0.728968 -0.535828
--0.0500651 -0.0533138 -1.13956 -0.728968 -0.481754
--0.104193 -0.110954 -1.13642 -0.728968 -0.42578
--0.164983 -0.175689 -1.12517 -0.728968 -0.368125
--0.231559 -0.246585 -1.10627 -0.728968 -0.309018
--0.302938 -0.322595 -1.08025 -0.728968 -0.248691
--0.378051 -0.402582 -1.0477 -0.728968 -0.187382
--0.455757 -0.485331 -1.00929 -0.728968 -0.125334
--0.534862 -0.56957 -0.96572 -0.728968 -0.0627915
--0.614139 -0.653991 -0.917756 -0.728968 -9.80385e-07
--0.692343 -0.737269 -0.866169 -0.728968 0.0627895
--0.768234 -0.818085 -0.811752 -0.728968 0.125332
--0.840597 -0.895143 -0.7553 -0.728968 0.18738
--0.908258 -0.967195 -0.697596 -0.728968 0.248689
--0.970107 -1.03306 -0.6394 -0.728968 0.309016
--1.02511 -1.09163 -0.581442 -0.728968 0.368124
--1.07234 -1.14192 -0.524403 -0.728968 0.425778
--1.11096 -1.18305 -0.468913 -0.728968 0.481753
--1.14027 -1.21427 -0.415537 -0.728968 0.535826
--1.15972 -1.23497 -0.36477 -0.728968 0.587784
--1.16887 -1.24472 -0.31703 -0.728968 0.637423
--1.16746 -1.24322 -0.272651 -0.728968 0.684546
--1.15539 -1.23036 -0.231883 -0.728968 0.728968
--1.13269 -1.20619 -0.194887 -0.728968 0.770513
--1.09957 -1.17092 -0.161734 -0.728968 0.809016
--1.0564 -1.12495 -0.132408 -0.728968 0.844327
--1.00369 -1.06882 -0.106809 -0.728968 0.876306
--0.942103 -1.00324 -0.084754 -0.728968 0.904827
--0.872421 -0.929032 -0.0659822 -0.728968 0.929776
--0.795561 -0.847185 -0.0501647 -0.728968 0.951056
--0.712546 -0.758783 -0.0369093 -0.728968 0.968583
--0.624491 -0.665015 -0.0257706 -0.728968 0.982287
--0.532588 -0.567148 -0.0162588 -0.728968 0.992115
--0.438087 -0.466514 -0.00785068 -0.728968 0.998027
--0.318712 -0.385256 0 -0.770513 1
--0.229384 -0.277277 0.00345032 -0.770513 0.998027
--0.141262 -0.170757 0.00751801 -0.770513 0.992115
--0.0555375 -0.0671332 0.012808 -0.770513 0.982287
-0.0266384 0.0322002 0.0199008 -0.770513 0.968583
-0.104166 0.125915 0.0293404 -0.770513 0.951057
-0.176016 0.212767 0.0416234 -0.770513 0.929777
-0.241246 0.291615 0.0571884 -0.770513 0.904827
-0.29901 0.361441 0.0764068 -0.770513 0.876307
-0.348579 0.421359 0.0995743 -0.770513 0.844328
-0.389344 0.470636 0.126904 -0.770513 0.809017
-0.420829 0.508694 0.158521 -0.770513 0.770513
-0.442696 0.535127 0.194458 -0.770513 0.728969
-0.454752 0.5497 0.234652 -0.770513 0.684547
-0.45695 0.552356 0.278944 -0.770513 0.637424
-0.449387 0.543215 0.327081 -0.770513 0.587785
-0.432307 0.522569 0.378714 -0.770513 0.535827
-0.406093 0.490881 0.433409 -0.770513 0.481754
-0.37126 0.448776 0.490644 -0.770513 0.42578
-0.32845 0.397027 0.549821 -0.770513 0.368125
-0.278417 0.336548 0.610275 -0.770513 0.309017
-0.222019 0.268375 0.67128 -0.770513 0.24869
-0.160202 0.19365 0.73206 -0.770513 0.187382
-0.0939841 0.113607 0.791805 -0.770513 0.125334
-0.0244415 0.0295447 0.849677 -0.770513 0.0627908
--0.04731 -0.0571878 0.904827 -0.770513 3.26795e-07
--0.120133 -0.145215 0.956406 -0.770513 -0.0627902
--0.192884 -0.233157 1.00358 -0.770513 -0.125333
--0.264436 -0.319648 1.04554 -0.770513 -0.187381
--0.333692 -0.403364 1.08152 -0.770513 -0.24869
--0.399604 -0.483037 1.11081 -0.770513 -0.309017
--0.461188 -0.557479 1.13275 -0.770513 -0.368124
--0.517541 -0.625598 1.14678 -0.770513 -0.425779
--0.567855 -0.686417 1.1524 -0.770513 -0.481753
--0.611427 -0.739087 1.14923 -0.770513 -0.535826
--0.647674 -0.782902 1.13696 -0.770513 -0.587785
--0.676136 -0.817307 1.11542 -0.770513 -0.637424
--0.69649 -0.84191 1.08453 -0.770513 -0.684547
--0.708546 -0.856483 1.04434 -0.770513 -0.728968
--0.712257 -0.86097 0.994996 -0.770513 -0.770513
--0.707717 -0.855481 0.936784 -0.770513 -0.809017
--0.695155 -0.840297 0.870088 -0.770513 -0.844328
--0.674938 -0.815858 0.795402 -0.770513 -0.876306
--0.647556 -0.782759 0.713326 -0.770513 -0.904827
--0.613622 -0.74174 0.624556 -0.770513 -0.929776
--0.573855 -0.693671 0.529874 -0.770513 -0.951056
--0.529074 -0.639539 0.430143 -0.770513 -0.968583
--0.480176 -0.580433 0.326288 -0.770513 -0.982287
--0.428131 -0.517521 0.219293 -0.770513 -0.992115
--0.373958 -0.452037 0.11018 -0.770513 -0.998027
--0.318713 -0.385257 1.14796e-06 -0.770513 -1
--0.263467 -0.318477 -0.110178 -0.770513 -0.998027
--0.209294 -0.252993 -0.219291 -0.770513 -0.992115
--0.157249 -0.190081 -0.326286 -0.770513 -0.982287
--0.108352 -0.130975 -0.430141 -0.770513 -0.968583
--0.0635701 -0.0768429 -0.529872 -0.770513 -0.951057
--0.0238037 -0.0287736 -0.624554 -0.770513 -0.929777
-0.0101306 0.0122457 -0.713324 -0.770513 -0.904827
-0.0375124 0.0453446 -0.7954 -0.770513 -0.876307
-0.0577303 0.0697839 -0.870086 -0.770513 -0.844328
-0.0702921 0.0849684 -0.936783 -0.770513 -0.809017
-0.0748327 0.0904571 -0.994995 -0.770513 -0.770514
-0.0711214 0.0859709 -1.04434 -0.770513 -0.728969
-0.0590654 0.0713977 -1.08453 -0.770513 -0.684548
-0.0387124 0.0467951 -1.11542 -0.770513 -0.637425
-0.0102499 0.01239 -1.13696 -0.770513 -0.587786
--0.0259967 -0.0314246 -1.14923 -0.770513 -0.535828
--0.0695691 -0.0840945 -1.1524 -0.770513 -0.481754
--0.119883 -0.144913 -1.14678 -0.770513 -0.42578
--0.176236 -0.213032 -1.13275 -0.770513 -0.368125
--0.237819 -0.287474 -1.11081 -0.770513 -0.309018
--0.303731 -0.367147 -1.08152 -0.770513 -0.248691
--0.372987 -0.450863 -1.04554 -0.770513 -0.187382
--0.444539 -0.537354 -1.00358 -0.770513 -0.125334
--0.517291 -0.625296 -0.956407 -0.770513 -0.0627915
--0.590113 -0.713323 -0.904828 -0.770513 -9.80385e-07
--0.661865 -0.800056 -0.849678 -0.770513 0.0627895
--0.731407 -0.884118 -0.791806 -0.770513 0.125332
--0.797625 -0.964162 -0.732062 -0.770513 0.18738
--0.859443 -1.03889 -0.671281 -0.770513 0.248689
--0.915841 -1.10706 -0.610276 -0.770513 0.309016
--0.965874 -1.16754 -0.549822 -0.770513 0.368124
--1.00868 -1.21929 -0.490645 -0.770513 0.425778
--1.04352 -1.26139 -0.43341 -0.770513 0.481753
--1.06973 -1.29308 -0.378716 -0.770513 0.535826
--1.08681 -1.31373 -0.327082 -0.770513 0.587784
--1.09437 -1.32287 -0.278945 -0.770513 0.637423
--1.09218 -1.32021 -0.234653 -0.770513 0.684546
--1.08012 -1.30564 -0.194459 -0.770513 0.728968
--1.05825 -1.27921 -0.158522 -0.770513 0.770513
--1.02677 -1.24115 -0.126905 -0.770513 0.809016
--0.986005 -1.19187 -0.0995749 -0.770513 0.844327
--0.936436 -1.13195 -0.0764072 -0.770513 0.876306
--0.878671 -1.06213 -0.0571887 -0.770513 0.904827
--0.813442 -0.983281 -0.0416237 -0.770513 0.929776
--0.741592 -0.896429 -0.0293406 -0.770513 0.951056
--0.664065 -0.802715 -0.019901 -0.770513 0.968583
--0.581889 -0.703382 -0.0128082 -0.770513 0.982287
--0.496164 -0.599758 -0.00751811 -0.770513 0.992115
--0.408043 -0.493238 -0.0034504 -0.770513 0.998027
--0.293893 -0.404508 0 -0.809016 1
--0.211498 -0.291101 -0.000953275 -0.809016 0.998027
--0.130204 -0.17921 -0.00123 -0.809016 0.992115
--0.0510959 -0.0703273 -0.000166902 -0.809016 0.982287
-0.0247742 0.0340988 0.00287295 -0.809016 0.968583
-0.0964034 0.132688 0.00848751 -0.809016 0.951057
-0.162852 0.224147 0.0172238 -0.809016 0.929777
-0.22326 0.30729 0.0295668 -0.809016 0.904827
-0.276855 0.381057 0.0459292 -0.809016 0.876307
-0.322969 0.444528 0.0666427 -0.809016 0.844328
-0.361045 0.496935 0.0919503 -0.809016 0.809017
-0.390648 0.537679 0.122 -0.809016 0.770513
-0.411465 0.566333 0.156842 -0.809016 0.728969
-0.423319 0.582648 0.196422 -0.809016 0.684547
-0.426162 0.586561 0.240584 -0.809016 0.637424
-0.420081 0.578191 0.289069 -0.809016 0.587785
-0.405292 0.557836 0.341519 -0.809016 0.535827
-0.382141 0.525971 0.397478 -0.809016 0.481754
-0.351093 0.483238 0.456401 -0.809016 0.42578
-0.312729 0.430434 0.517659 -0.809016 0.368125
-0.267731 0.3685 0.580549 -0.809016 0.309017
-0.216877 0.298506 0.644302 -0.809016 0.24869
-0.161024 0.221631 0.708099 -0.809016 0.187382
-0.101096 0.139147 0.771078 -0.809016 0.125334
-0.0380695 0.052398 0.832348 -0.809016 0.0627908
--0.0270436 -0.0372223 0.891006 -0.809016 3.26795e-07
--0.0932098 -0.128292 0.946148 -0.809016 -0.0627902
--0.159392 -0.219384 0.996883 -0.809016 -0.125333
--0.224565 -0.309086 1.04235 -0.809016 -0.187381
--0.287732 -0.396028 1.08173 -0.809016 -0.24869
--0.34794 -0.478897 1.11425 -0.809016 -0.309017
--0.404295 -0.556463 1.13921 -0.809016 -0.368124
--0.455975 -0.627594 1.15601 -0.809016 -0.425779
--0.502244 -0.691278 1.16411 -0.809016 -0.481753
--0.542462 -0.746633 1.16308 -0.809016 -0.535826
--0.576096 -0.792926 1.15261 -0.809016 -0.587785
--0.602727 -0.829581 1.13248 -0.809016 -0.637424
--0.622056 -0.856185 1.10261 -0.809016 -0.684547
--0.63391 -0.872501 1.06303 -0.809016 -0.728968
--0.638242 -0.878463 1.0139 -0.809016 -0.770513
--0.635132 -0.874182 0.955491 -0.809016 -0.809017
--0.624785 -0.859942 0.888208 -0.809016 -0.844328
--0.60753 -0.836192 0.812563 -0.809016 -0.876306
--0.583809 -0.803542 0.729178 -0.809016 -0.904827
--0.554171 -0.76275 0.63878 -0.809016 -0.929776
--0.519268 -0.71471 0.542186 -0.809016 -0.951056
--0.479835 -0.660436 0.440297 -0.809016 -0.968583
--0.436686 -0.601045 0.334084 -0.809016 -0.982287
--0.390693 -0.537741 0.224577 -0.809016 -0.992115
--0.342778 -0.471792 0.112848 -0.809016 -0.998027
--0.293893 -0.404509 1.1758e-06 -0.809016 -1
--0.245009 -0.337226 -0.112846 -0.809016 -0.998027
--0.197094 -0.271277 -0.224574 -0.809016 -0.992115
--0.151101 -0.207973 -0.334082 -0.809016 -0.982287
--0.107951 -0.148582 -0.440295 -0.809016 -0.968583
--0.0685187 -0.0943077 -0.542184 -0.809016 -0.951057
--0.0336152 -0.0462672 -0.638778 -0.809016 -0.929777
--0.00397793 -0.00547515 -0.729177 -0.809016 -0.904827
-0.0197437 0.0271749 -0.812561 -0.809016 -0.876307
-0.0369991 0.0509249 -0.888207 -0.809016 -0.844328
-0.0473455 0.0651654 -0.95549 -0.809016 -0.809017
-0.0504558 0.0694463 -1.0139 -0.809016 -0.770514
-0.0461242 0.0634844 -1.06303 -0.809016 -0.728969
-0.0342705 0.0471691 -1.10261 -0.809016 -0.684548
-0.0149413 0.0205649 -1.13248 -0.809016 -0.637425
--0.0116895 -0.0160891 -1.15261 -0.809016 -0.587786
--0.0453234 -0.0623822 -1.16308 -0.809016 -0.535828
--0.0855415 -0.117738 -1.16411 -0.809016 -0.481754
--0.13181 -0.181421 -1.15601 -0.809016 -0.42578
--0.18349 -0.252552 -1.13922 -0.809016 -0.368125
--0.239845 -0.330118 -1.11425 -0.809016 -0.309018
--0.300053 -0.412987 -1.08173 -0.809016 -0.248691
--0.36322 -0.499928 -1.04235 -0.809016 -0.187382
--0.428393 -0.589631 -0.996884 -0.809016 -0.125334
--0.494575 -0.680722 -0.946149 -0.809016 -0.0627915
--0.560741 -0.771792 -0.891008 -0.809016 -9.80385e-07
--0.625854 -0.861413 -0.832349 -0.809016 0.0627895
--0.688881 -0.948162 -0.771079 -0.809016 0.125332
--0.748809 -1.03065 -0.708101 -0.809016 0.18738
--0.804662 -1.10752 -0.644304 -0.809016 0.248689
--0.855516 -1.17752 -0.58055 -0.809016 0.309016
--0.900514 -1.23945 -0.517661 -0.809016 0.368124
--0.938879 -1.29225 -0.456403 -0.809016 0.425778
--0.969927 -1.33499 -0.39748 -0.809016 0.481753
--0.993078 -1.36685 -0.34152 -0.809016 0.535826
--1.00787 -1.38721 -0.28907 -0.809016 0.587784
--1.01395 -1.39558 -0.240585 -0.809016 0.637423
--1.01111 -1.39166 -0.196422 -0.809016 0.684546
--0.999252 -1.37535 -0.156842 -0.809016 0.728968
--0.978434 -1.3467 -0.122001 -0.809016 0.770513
--0.948832 -1.30595 -0.0919509 -0.809016 0.809016
--0.910756 -1.25355 -0.0666432 -0.809016 0.844327
--0.864642 -1.19008 -0.0459296 -0.809016 0.876306
--0.811047 -1.11631 -0.0295671 -0.809016 0.904827
--0.75064 -1.03317 -0.017224 -0.809016 0.929776
--0.684191 -0.941706 -0.00848766 -0.809016 0.951056
--0.612562 -0.843117 -0.00287304 -0.809016 0.968583
--0.536692 -0.738691 0.000166861 -0.809016 0.982287
--0.457584 -0.629809 0.00122999 -0.809016 0.992115
--0.37629 -0.517918 0.00095329 -0.809016 0.998027
--0.267914 -0.422164 0 -0.844327 1
--0.192855 -0.30389 -0.00535593 -0.844327 0.998027
--0.118789 -0.18718 -0.0099768 -0.844327 0.992115
--0.0466912 -0.0735734 -0.0131417 -0.844327 0.982287
-0.0224893 0.0354374 -0.0141578 -0.844327 0.968583
-0.087849 0.138428 -0.0123738 -0.844327 0.951057
-0.148541 0.234063 -0.00719275 -0.844327 0.929777
-0.203789 0.32112 0.00191602 -0.844327 0.904827
-0.252898 0.398503 0.0154063 -0.844327 0.876307
-0.295264 0.46526 0.0336453 -0.844327 0.844328
-0.330383 0.520599 0.0569056 -0.844327 0.809017
-0.357861 0.563898 0.0853588 -0.844327 0.770513
-0.377416 0.594711 0.119071 -0.844327 0.728969
-0.388883 0.61278 0.157997 -0.844327 0.684547
-0.392216 0.618033 0.201986 -0.844327 0.637424
-0.387491 0.610587 0.250772 -0.844327 0.587785
-0.374899 0.590746 0.303987 -0.844327 0.535827
-0.354747 0.558991 0.361156 -0.844327 0.481754
-0.327449 0.515977 0.421709 -0.844327 0.42578
-0.293524 0.46252 0.484986 -0.844327 0.368125
-0.253583 0.399582 0.55025 -0.844327 0.309017
-0.20832 0.32826 0.616689 -0.844327 0.24869
-0.158503 0.249761 0.68344 -0.844327 0.187382
-0.10496 0.16539 0.749589 -0.844327 0.125334
-0.048564 0.0765244 0.814198 -0.844327 0.0627908
--0.00977678 -0.0154057 0.876307 -0.844327 3.26795e-07
--0.0691363 -0.108941 0.934957 -0.844327 -0.0627902
--0.128584 -0.202616 0.989204 -0.844327 -0.125333
--0.187202 -0.294982 1.03813 -0.844327 -0.187381
--0.244094 -0.384629 1.08086 -0.844327 -0.24869
--0.298405 -0.47021 1.11658 -0.844327 -0.309017
--0.349333 -0.550459 1.14455 -0.844327 -0.368124
--0.396138 -0.624213 1.1641 -0.844327 -0.425779
--0.43816 -0.690429 1.17467 -0.844327 -0.481753
--0.474822 -0.748199 1.17579 -0.844327 -0.535826
--0.505645 -0.796767 1.16712 -0.844327 -0.587785
--0.530248 -0.835536 1.14843 -0.844327 -0.637424
--0.548363 -0.86408 1.1196 -0.844327 -0.684547
--0.55983 -0.882149 1.08068 -0.844327 -0.728968
--0.564604 -0.889671 1.0318 -0.844327 -0.770513
--0.562753 -0.886755 0.973255 -0.844327 -0.809017
--0.554458 -0.873685 0.905453 -0.844327 -0.844328
--0.540009 -0.850917 0.828923 -0.844327 -0.876306
--0.519799 -0.81907 0.744311 -0.844327 -0.904827
--0.494316 -0.778916 0.652374 -0.844327 -0.929776
--0.46414 -0.731366 0.553962 -0.844327 -0.951056
--0.429925 -0.677453 0.450016 -0.844327 -0.968583
--0.392397 -0.618317 0.34155 -0.844327 -0.982287
--0.352333 -0.555187 0.229639 -0.844327 -0.992115
--0.310556 -0.489357 0.115405 -0.844327 -0.998027
--0.267914 -0.422164 1.20248e-06 -0.844327 -1
--0.225273 -0.354972 -0.115402 -0.844327 -0.998027
--0.183495 -0.289142 -0.229636 -0.844327 -0.992115
--0.143432 -0.226012 -0.341548 -0.844327 -0.982287
--0.105903 -0.166876 -0.450014 -0.844327 -0.968583
--0.0716886 -0.112963 -0.55396 -0.844327 -0.951057
--0.0415119 -0.0654121 -0.652372 -0.844327 -0.929777
--0.0160293 -0.0252581 -0.74431 -0.844327 -0.904827
-0.00418136 0.00658876 -0.828921 -0.844327 -0.876307
-0.0186305 0.0293569 -0.905451 -0.844327 -0.844328
-0.0269252 0.0424273 -0.973254 -0.844327 -0.809017
-0.0287761 0.0453438 -1.0318 -0.844327 -0.770514
-0.0240024 0.0378217 -1.08068 -0.844327 -0.728969
-0.0125357 0.0197531 -1.1196 -0.844327 -0.684548
--0.00557886 -0.00879087 -1.14843 -0.844327 -0.637425
--0.0301824 -0.0475597 -1.16712 -0.844327 -0.587786
--0.0610043 -0.0961273 -1.17579 -0.844327 -0.535828
--0.0976665 -0.153897 -1.17467 -0.844327 -0.481754
--0.139688 -0.220113 -1.1641 -0.844327 -0.42578
--0.186494 -0.293867 -1.14455 -0.844327 -0.368125
--0.237421 -0.374116 -1.11659 -0.844327 -0.309018
--0.291733 -0.459696 -1.08086 -0.844327 -0.248691
--0.348625 -0.549343 -1.03813 -0.844327 -0.187382
--0.407242 -0.641709 -0.989205 -0.844327 -0.125334
--0.46669 -0.735384 -0.934958 -0.844327 -0.0627915
--0.52605 -0.82892 -0.876308 -0.844327 -9.80385e-07
--0.58439 -0.92085 -0.814199 -0.844327 0.0627895
--0.640786 -1.00972 -0.749591 -0.844327 0.125332
--0.69433 -1.09409 -0.683441 -0.844327 0.18738
--0.744147 -1.17259 -0.616691 -0.844327 0.248689
--0.78941 -1.24391 -0.550251 -0.844327 0.309016
--0.829351 -1.30685 -0.484988 -0.844327 0.368124
--0.863276 -1.3603 -0.42171 -0.844327 0.425778
--0.890574 -1.40332 -0.361157 -0.844327 0.481753
--0.910726 -1.43507 -0.303988 -0.844327 0.535826
--0.923319 -1.45491 -0.250773 -0.844327 0.587784
--0.928044 -1.46236 -0.201987 -0.844327 0.637423
--0.92471 -1.45711 -0.157998 -0.844327 0.684546
--0.913244 -1.43904 -0.119071 -0.844327 0.728968
--0.893689 -1.40823 -0.0853595 -0.844327 0.770513
--0.866211 -1.36493 -0.0569061 -0.844327 0.809016
--0.831092 -1.30959 -0.0336457 -0.844327 0.844327
--0.788727 -1.24283 -0.0154066 -0.844327 0.876306
--0.739618 -1.16545 -0.00191625 -0.844327 0.904827
--0.68437 -1.07839 0.00719261 -0.844327 0.929776
--0.623678 -0.982757 0.0123737 -0.844327 0.951056
--0.558318 -0.879767 0.0141578 -0.844327 0.968583
--0.489138 -0.770756 0.0131417 -0.844327 0.982287
--0.417041 -0.657149 0.00997688 -0.844327 0.992115
--0.342974 -0.540439 0.00535604 -0.844327 0.998027
--0.240877 -0.438153 0 -0.876306 1
--0.173507 -0.315608 -0.0097533 -0.876306 0.998027
--0.107018 -0.194665 -0.0187137 -0.876306 0.992115
--0.0422763 -0.0769002 -0.0261035 -0.876306 0.982287
-0.0198767 0.0361555 -0.0311745 -0.876306 0.968583
-0.0786386 0.143043 -0.0332228 -0.876306 0.951057
-0.133258 0.242394 -0.0316022 -0.876306 0.929777
-0.183044 0.332955 -0.0257366 -0.876306 0.904827
-0.227379 0.4136 -0.0151318 -0.876306 0.876307
-0.265726 0.483354 0.000614624 -0.876306 0.844328
-0.297638 0.541401 0.0218048 -0.876306 0.809017
-0.322762 0.5871 0.0486332 -0.876306 0.770513
-0.340844 0.619992 0.081182 -0.876306 0.728969
-0.351738 0.639808 0.119417 -0.876306 0.684547
-0.355399 0.646468 0.163189 -0.876306 0.637424
-0.351891 0.640087 0.212228 -0.876306 0.587785
-0.341381 0.620969 0.266154 -0.876306 0.535827
-0.324136 0.589601 0.324476 -0.876306 0.481754
-0.300522 0.546647 0.3866 -0.876306 0.42578
-0.270993 0.492934 0.451835 -0.876306 0.368125
-0.236088 0.429442 0.519407 -0.876306 0.309017
-0.196418 0.357283 0.588468 -0.876306 0.24869
-0.152661 0.277689 0.658105 -0.876306 0.187382
-0.105545 0.191986 0.727361 -0.876306 0.125334
-0.0558434 0.101579 0.795244 -0.876306 0.0627908
-0.00435583 0.00792321 0.860742 -0.876306 3.26795e-07
--0.0480995 -0.0874926 0.922843 -0.876306 -0.0627902
--0.100701 -0.183174 0.980548 -0.876306 -0.125333
--0.152637 -0.277645 1.03289 -0.876306 -0.187381
--0.203116 -0.369465 1.07893 -0.876306 -0.24869
--0.251381 -0.45726 1.11782 -0.876306 -0.309017
--0.296724 -0.539738 1.14876 -0.876306 -0.368124
--0.33849 -0.615709 1.17105 -0.876306 -0.425779
--0.376092 -0.684108 1.18407 -0.876306 -0.481753
--0.409021 -0.744006 1.18734 -0.876306 -0.535826
--0.436851 -0.794627 1.18048 -0.876306 -0.587785
--0.459243 -0.835359 1.16324 -0.876306 -0.637424
--0.475958 -0.865763 1.13549 -0.876306 -0.684547
--0.486852 -0.885579 1.09726 -0.876306 -0.728968
--0.491881 -0.894727 1.04868 -0.876306 -0.770513
--0.491104 -0.893313 0.990059 -0.876306 -0.809017
--0.484676 -0.881621 0.921803 -0.876306 -0.844328
--0.47285 -0.860109 0.844464 -0.876306 -0.876306
--0.455968 -0.829402 0.75871 -0.876306 -0.904827
--0.43446 -0.790278 0.665324 -0.876306 -0.929776
--0.408831 -0.74366 0.565192 -0.876306 -0.951056
--0.379658 -0.690593 0.459291 -0.876306 -0.968583
--0.347574 -0.632234 0.348679 -0.876306 -0.982287
--0.313265 -0.569826 0.234474 -0.876306 -0.992115
--0.277451 -0.50468 0.117847 -0.876306 -0.998027
--0.240878 -0.438154 1.22798e-06 -0.876306 -1
--0.204304 -0.371628 -0.117845 -0.876306 -0.998027
--0.16849 -0.306482 -0.234472 -0.876306 -0.992115
--0.134181 -0.244073 -0.348676 -0.876306 -0.982287
--0.102097 -0.185714 -0.459289 -0.876306 -0.968583
--0.0729238 -0.132648 -0.56519 -0.876306 -0.951057
--0.047295 -0.0860291 -0.665322 -0.876306 -0.929777
--0.0257865 -0.0469054 -0.758708 -0.876306 -0.904827
--0.00890477 -0.0161977 -0.844462 -0.876306 -0.876307
-0.00292175 0.00531463 -0.921802 -0.876306 -0.844328
-0.00934971 0.017007 -0.990058 -0.876306 -0.809017
-0.0101271 0.018421 -1.04868 -0.876306 -0.770514
-0.00509764 0.00927256 -1.09725 -0.876306 -0.728969
--0.00579589 -0.0105427 -1.13549 -0.876306 -0.684548
--0.0225105 -0.0409464 -1.16324 -0.876306 -0.637425
--0.0449032 -0.0816784 -1.18048 -0.876306 -0.587786
--0.0727323 -0.132299 -1.18734 -0.876306 -0.535828
--0.105661 -0.192197 -1.18407 -0.876306 -0.481754
--0.143264 -0.260596 -1.17105 -0.876306 -0.42578
--0.18503 -0.336567 -1.14876 -0.876306 -0.368125
--0.230372 -0.419044 -1.11782 -0.876306 -0.309018
--0.278638 -0.506839 -1.07893 -0.876306 -0.248691
--0.329117 -0.59866 -1.03289 -0.876306 -0.187382
--0.381052 -0.69313 -0.980549 -0.876306 -0.125334
--0.433654 -0.788812 -0.922844 -0.876306 -0.0627915
--0.486109 -0.884227 -0.860743 -0.876306 -9.80385e-07
--0.537597 -0.977883 -0.795245 -0.876306 0.0627895
--0.587299 -1.06829 -0.727363 -0.876306 0.125332
--0.634414 -1.15399 -0.658107 -0.876306 0.18738
--0.678172 -1.23359 -0.588469 -0.876306 0.248689
--0.717842 -1.30575 -0.519409 -0.876306 0.309016
--0.752747 -1.36924 -0.451836 -0.876306 0.368124
--0.782276 -1.42295 -0.386601 -0.876306 0.425778
--0.80589 -1.46591 -0.324478 -0.876306 0.481753
--0.823135 -1.49727 -0.266156 -0.876306 0.535826
--0.833646 -1.51639 -0.212229 -0.876306 0.587784
--0.837154 -1.52277 -0.16319 -0.876306 0.637423
--0.833493 -1.51611 -0.119418 -0.876306 0.684546
--0.822599 -1.4963 -0.0811827 -0.876306 0.728968
--0.804516 -1.46341 -0.0486338 -0.876306 0.770513
--0.779393 -1.41771 -0.0218053 -0.876306 0.809016
--0.747482 -1.35966 -0.000615007 -0.876306 0.844327
--0.709134 -1.28991 0.0151316 -0.876306 0.876306
--0.664799 -1.20926 0.0257365 -0.876306 0.904827
--0.615013 -1.1187 0.0316021 -0.876306 0.929776
--0.560394 -1.01935 0.0332228 -0.876306 0.951056
--0.501632 -0.912464 0.0311746 -0.876306 0.968583
--0.439479 -0.799408 0.0261036 -0.876306 0.982287
--0.374738 -0.681644 0.0187139 -0.876306 0.992115
--0.308248 -0.560701 0.0097535 -0.876306 0.998027
--0.21289 -0.452413 0 -0.904827 1
--0.153508 -0.32622 -0.0141411 -0.904827 0.998027
--0.0948925 -0.201656 -0.0274322 -0.904827 0.992115
--0.0378 -0.080329 -0.0390395 -0.904827 0.982287
-0.0170366 0.0362046 -0.0481605 -0.904827 0.968583
-0.068918 0.146458 -0.0540391 -0.904827 0.951057
-0.117189 0.249038 -0.0559805 -0.904827 0.929777
-0.161247 0.342667 -0.0533639 -0.904827 0.904827
-0.200554 0.426197 -0.045655 -0.904827 0.876307
-0.234639 0.498633 -0.0324166 -0.904827 0.844328
-0.263113 0.559142 -0.0133176 -0.904827 0.809017
-0.285665 0.607067 0.0118595 -0.904827 0.770513
-0.302074 0.641939 0.0432132 -0.904827 0.728969
-0.312209 0.663476 0.0807195 -0.904827 0.684547
-0.316029 0.671593 0.12423 -0.904827 0.637424
-0.313586 0.666402 0.173474 -0.904827 0.587785
-0.305022 0.648204 0.228059 -0.904827 0.535827
-0.290569 0.617488 0.287477 -0.904827 0.481754
-0.270539 0.574924 0.351109 -0.904827 0.42578
-0.245327 0.521344 0.418238 -0.904827 0.368125
-0.215396 0.457738 0.488053 -0.904827 0.309017
-0.181276 0.385231 0.559665 -0.904827 0.24869
-0.143553 0.305066 0.632122 -0.904827 0.187382
-0.102859 0.218586 0.704415 -0.904827 0.125334
-0.0598613 0.127211 0.775505 -0.904827 0.0627908
-0.0152544 0.0324172 0.844328 -0.904827 3.26795e-07
--0.0302528 -0.0642904 0.909819 -0.904827 -0.0627902
--0.0759481 -0.161398 0.970925 -0.904827 -0.125333
--0.121127 -0.257407 1.02662 -0.904827 -0.187381
--0.165103 -0.35086 1.07594 -0.904827 -0.24869
--0.207219 -0.440363 1.11795 -0.904827 -0.309017
--0.24686 -0.524603 1.15183 -0.904827 -0.368124
--0.283457 -0.602375 1.17683 -0.904827 -0.425779
--0.3165 -0.672595 1.1923 -0.904827 -0.481753
--0.345545 -0.734319 1.19772 -0.904827 -0.535826
--0.37022 -0.786757 1.19268 -0.904827 -0.587785
--0.390232 -0.829284 1.1769 -0.904827 -0.637424
--0.405369 -0.86145 1.15026 -0.904827 -0.684547
--0.415503 -0.882987 1.11275 -0.904827 -0.728968
--0.420596 -0.89381 1.06453 -0.904827 -0.770513
--0.420693 -0.894017 1.00589 -0.904827 -0.809017
--0.415928 -0.88389 0.937245 -0.904827 -0.844328
--0.406515 -0.863887 0.859172 -0.904827 -0.876306
--0.392749 -0.834633 0.77236 -0.904827 -0.904827
--0.374998 -0.79691 0.677617 -0.904827 -0.929776
--0.353698 -0.751644 0.575864 -0.904827 -0.951056
--0.329343 -0.699887 0.468113 -0.904827 -0.968583
--0.30248 -0.642802 0.355463 -0.904827 -0.982287
--0.2737 -0.58164 0.239078 -0.904827 -0.992115
--0.243622 -0.517722 0.120174 -0.904827 -0.998027
--0.21289 -0.452414 1.25227e-06 -0.904827 -1
--0.182159 -0.387106 -0.120171 -0.904827 -0.998027
--0.152081 -0.323188 -0.239076 -0.904827 -0.992115
--0.1233 -0.262026 -0.355461 -0.904827 -0.982287
--0.096438 -0.204941 -0.468111 -0.904827 -0.968583
--0.0720831 -0.153184 -0.575861 -0.904827 -0.951057
--0.0507824 -0.107918 -0.677615 -0.904827 -0.929777
--0.0330313 -0.0701948 -0.772358 -0.904827 -0.904827
--0.0192652 -0.0409405 -0.85917 -0.904827 -0.876307
--0.00985229 -0.0209371 -0.937243 -0.904827 -0.844328
--0.00508685 -0.0108101 -1.00588 -0.904827 -0.809017
--0.00518419 -0.0110169 -1.06453 -0.904827 -0.770514
--0.0102767 -0.021839 -1.11275 -0.904827 -0.728969
--0.0204111 -0.0433757 -1.15026 -0.904827 -0.684548
--0.0355475 -0.0755422 -1.1769 -0.904827 -0.637425
--0.0555593 -0.118069 -1.19268 -0.904827 -0.587786
--0.0802346 -0.170507 -1.19772 -0.904827 -0.535828
--0.10928 -0.23223 -1.1923 -0.904827 -0.481754
--0.142323 -0.30245 -1.17683 -0.904827 -0.42578
--0.178919 -0.380222 -1.15184 -0.904827 -0.368125
--0.21856 -0.464462 -1.11796 -0.904827 -0.309018
--0.260677 -0.553965 -1.07594 -0.904827 -0.248691
--0.304652 -0.647418 -1.02662 -0.904827 -0.187382
--0.349831 -0.743427 -0.970926 -0.904827 -0.125334
--0.395526 -0.840534 -0.90982 -0.904827 -0.0627915
--0.441034 -0.937242 -0.844329 -0.904827 -9.80385e-07
--0.48564 -1.03204 -0.775506 -0.904827 0.0627895
--0.528638 -1.12341 -0.704417 -0.904827 0.125332
--0.569333 -1.20989 -0.632123 -0.904827 0.18738
--0.607056 -1.29006 -0.559667 -0.904827 0.248689
--0.641175 -1.36256 -0.488054 -0.904827 0.309016
--0.671106 -1.42617 -0.418239 -0.904827 0.368124
--0.696319 -1.47975 -0.351111 -0.904827 0.425778
--0.716348 -1.52231 -0.287478 -0.904827 0.481753
--0.730802 -1.55303 -0.228061 -0.904827 0.535826
--0.739366 -1.57123 -0.173476 -0.904827 0.587784
--0.741809 -1.57642 -0.124231 -0.904827 0.637423
--0.737989 -1.5683 -0.0807204 -0.904827 0.684546
--0.727854 -1.54677 -0.0432139 -0.904827 0.728968
--0.711445 -1.5119 -0.0118601 -0.904827 0.770513
--0.688893 -1.46397 0.0133172 -0.904827 0.809016
--0.66042 -1.40346 0.0324163 -0.904827 0.844327
--0.626334 -1.33103 0.0456548 -0.904827 0.876306
--0.587028 -1.2475 0.0533638 -0.904827 0.904827
--0.54297 -1.15387 0.0559805 -0.904827 0.929776
--0.494699 -1.05129 0.0540392 -0.904827 0.951056
--0.442818 -0.941034 0.0481606 -0.904827 0.968583
--0.387981 -0.8245 0.0390398 -0.904827 0.982287
--0.330889 -0.703173 0.0274325 -0.904827 0.992115
--0.272274 -0.57861 0.0141413 -0.904827 0.998027
--0.184063 -0.464888 0 -0.929776 1
--0.13291 -0.335692 -0.0185148 -0.929776 0.998027
--0.0824107 -0.208145 -0.0361236 -0.929776 0.992115
--0.0332077 -0.0838728 -0.0519371 -0.929776 0.982287
-0.0140747 0.0355486 -0.0650989 -0.929776 0.968583
-0.0588408 0.148614 -0.0748021 -0.929776 0.951057
-0.100532 0.253915 -0.0803035 -0.929776 0.929777
-0.138636 0.350154 -0.0809385 -0.929776 0.904827
-0.172692 0.43617 -0.0761332 -0.929776 0.876307
-0.202301 0.510953 -0.0654159 -0.929776 0.844328
-0.227128 0.573658 -0.0484268 -0.929776 0.809017
-0.246908 0.623616 -0.0249259 -0.929776 0.770513
-0.26145 0.660347 0.00520184 -0.929776 0.728969
-0.270642 0.683562 0.041942 -0.929776 0.684547
-0.274446 0.69317 0.0851496 -0.929776 0.637424
-0.272904 0.689276 0.13455 -0.929776 0.587785
-0.266135 0.672179 0.189739 -0.929776 0.535827
-0.254332 0.642368 0.250194 -0.929776 0.481754
-0.237759 0.60051 0.315272 -0.929776 0.42578
-0.216748 0.547441 0.384228 -0.929776 0.368125
-0.19169 0.484152 0.456216 -0.929776 0.309017
-0.163033 0.411773 0.530311 -0.929776 0.24869
-0.131272 0.331555 0.605514 -0.929776 0.187382
-0.0969414 0.244845 0.680774 -0.929776 0.125334
-0.0606064 0.153074 0.755001 -0.929776 0.0627908
-0.0228545 0.0577238 0.82708 -0.929776 3.26795e-07
--0.0157139 -0.0396887 0.895896 -0.929776 -0.0627902
--0.0544955 -0.13764 0.960343 -0.929776 -0.125333
--0.0928932 -0.234621 1.01935 -0.929776 -0.187381
--0.130325 -0.329164 1.07188 -0.929776 -0.24869
--0.166235 -0.419861 1.11698 -0.929776 -0.309017
--0.2001 -0.505393 1.15377 -0.929776 -0.368124
--0.231436 -0.584539 1.18146 -0.929776 -0.425779
--0.259812 -0.656208 1.19936 -0.929776 -0.481753
--0.284849 -0.719444 1.20692 -0.929776 -0.535826
--0.306231 -0.773449 1.2037 -0.929776 -0.587785
--0.323707 -0.817588 1.1894 -0.929776 -0.637424
--0.337095 -0.851403 1.16389 -0.929776 -0.684547
--0.346287 -0.874618 1.12715 -0.929776 -0.728968
--0.351245 -0.887142 1.07933 -0.929776 -0.770513
--0.352008 -0.889067 1.02072 -0.929776 -0.809017
--0.348683 -0.880671 0.951761 -0.929776 -0.844328
--0.341452 -0.862407 0.873032 -0.929776 -0.876306
--0.33056 -0.834896 0.785247 -0.929776 -0.904827
--0.316315 -0.798919 0.689242 -0.929776 -0.929776
--0.299085 -0.7554 0.585967 -0.929776 -0.951056
--0.279284 -0.705389 0.476473 -0.929776 -0.968583
--0.257373 -0.650049 0.361897 -0.929776 -0.982287
--0.233848 -0.590631 0.243446 -0.929776 -0.992115
--0.209231 -0.528455 0.122382 -0.929776 -0.998027
--0.184063 -0.464889 1.27532e-06 -0.929776 -1
--0.158895 -0.401323 -0.122379 -0.929776 -0.998027
--0.134278 -0.339147 -0.243444 -0.929776 -0.992115
--0.110753 -0.279729 -0.361895 -0.929776 -0.982287
--0.0888418 -0.224388 -0.476471 -0.929776 -0.968583
--0.0690411 -0.174378 -0.585965 -0.929776 -0.951057
--0.0518104 -0.130858 -0.68924 -0.929776 -0.929777
--0.0375661 -0.0948808 -0.785245 -0.929776 -0.904827
--0.0266738 -0.0673701 -0.873031 -0.929776 -0.876307
--0.0194422 -0.0491054 -0.951759 -0.929776 -0.844328
--0.0161178 -0.0407089 -1.02072 -0.929776 -0.809017
--0.0168801 -0.0426341 -1.07933 -0.929776 -0.770514
--0.0218384 -0.0551574 -1.12715 -0.929776 -0.728969
--0.0310299 -0.0783724 -1.16389 -0.929776 -0.684548
--0.0444183 -0.112188 -1.1894 -0.929776 -0.637425
--0.0618942 -0.156326 -1.2037 -0.929776 -0.587786
--0.083276 -0.210331 -1.20692 -0.929776 -0.535828
--0.108313 -0.273567 -1.19936 -0.929776 -0.481754
--0.136689 -0.345235 -1.18146 -0.929776 -0.42578
--0.168025 -0.424382 -1.15377 -0.929776 -0.368125
--0.201889 -0.509913 -1.11699 -0.929776 -0.309018
--0.237799 -0.600611 -1.07188 -0.929776 -0.248691
--0.275231 -0.695153 -1.01935 -0.929776 -0.187382
--0.313629 -0.792134 -0.960344 -0.929776 -0.125334
--0.352411 -0.890085 -0.895897 -0.929776 -0.0627915
--0.390979 -0.987498 -0.827082 -0.929776 -9.80385e-07
--0.428731 -1.08285 -0.755002 -0.929776 0.0627895
--0.465066 -1.17462 -0.680776 -0.929776 0.125332
--0.499397 -1.26133 -0.605516 -0.929776 0.18738
--0.531158 -1.34155 -0.530312 -0.929776 0.248689
--0.559815 -1.41393 -0.456218 -0.929776 0.309016
--0.584873 -1.47722 -0.384229 -0.929776 0.368124
--0.605884 -1.53028 -0.315274 -0.929776 0.425778
--0.622457 -1.57214 -0.250195 -0.929776 0.481753
--0.634261 -1.60196 -0.189741 -0.929776 0.535826
--0.64103 -1.61905 -0.134551 -0.929776 0.587784
--0.642571 -1.62295 -0.0851506 -0.929776 0.637423
--0.638767 -1.61334 -0.0419428 -0.929776 0.684546
--0.629576 -1.59012 -0.00520254 -0.929776 0.728968
--0.615033 -1.55339 0.0249253 -0.929776 0.770513
--0.595254 -1.50343 0.0484264 -0.929776 0.809016
--0.570427 -1.44073 0.0654156 -0.929776 0.844327
--0.540818 -1.36595 0.076133 -0.929776 0.876306
--0.506762 -1.27993 0.0809385 -0.929776 0.904827
--0.468658 -1.18369 0.0803036 -0.929776 0.929776
--0.426967 -1.07839 0.0748022 -0.929776 0.951056
--0.382201 -0.965327 0.0650991 -0.929776 0.968583
--0.334919 -0.845906 0.0519374 -0.929776 0.982287
--0.285716 -0.721634 0.036124 -0.929776 0.992115
--0.235216 -0.594087 0.0185152 -0.929776 0.998027
--0.154509 -0.475528 0 -0.951056 1
--0.111771 -0.343993 -0.0228704 -0.951056 0.998027
--0.0695713 -0.214118 -0.0447794 -0.951056 0.992115
--0.0284423 -0.0875362 -0.0647833 -0.951056 0.982287
-0.0111009 0.0341649 -0.0819731 -0.951056 0.968583
-0.0485664 0.149472 -0.0954912 -0.951056 0.951057
-0.083493 0.256964 -0.104547 -0.951056 0.929777
-0.115457 0.355338 -0.108433 -0.951056 0.904827
-0.144077 0.443424 -0.106536 -0.951056 0.876307
-0.169024 0.520201 -0.0983506 -0.951056 0.844328
-0.190019 0.584816 -0.0834883 -0.951056 0.809017
-0.206843 0.636595 -0.0616866 -0.951056 0.770513
-0.219337 0.675048 -0.0328147 -0.951056 0.728969
-0.227405 0.69988 0.00312307 -0.951056 0.684547
-0.231017 0.710994 0.0459848 -0.951056 0.637424
-0.230203 0.708489 0.0954919 -0.951056 0.587785
-0.225059 0.692658 0.151232 -0.951056 0.535827
-0.215743 0.663985 0.212664 -0.951056 0.481754
-0.202469 0.623134 0.279124 -0.951056 0.42578
-0.185509 0.570937 0.349839 -0.951056 0.368125
-0.165184 0.508383 0.42393 -0.951056 0.309017
-0.14186 0.436598 0.500433 -0.951056 0.24869
-0.115941 0.35683 0.578309 -0.951056 0.187382
-0.0878676 0.270428 0.656461 -0.951056 0.125334
-0.0581022 0.17882 0.733751 -0.951056 0.0627908
-0.0271273 0.0834889 0.809017 -0.951056 3.26795e-07
--0.00456455 -0.0140482 0.881089 -0.951056 -0.0627902
--0.0364776 -0.112266 0.948814 -0.951056 -0.125333
--0.0681214 -0.209656 1.01107 -0.951056 -0.187381
--0.0990179 -0.304745 1.06677 -0.951056 -0.24869
--0.128709 -0.396126 1.11491 -0.951056 -0.309017
--0.156765 -0.482472 1.15457 -0.951056 -0.368124
--0.182788 -0.562563 1.18492 -0.951056 -0.425779
--0.206423 -0.635301 1.20523 -0.951056 -0.481753
--0.227356 -0.699727 1.21492 -0.951056 -0.535826
--0.245327 -0.755037 1.21353 -0.951056 -0.587785
--0.260128 -0.800591 1.20073 -0.951056 -0.637424
--0.271609 -0.835925 1.17637 -0.951056 -0.684547
--0.279678 -0.860757 1.14044 -0.951056 -0.728968
--0.284302 -0.87499 1.09306 -0.951056 -0.770513
--0.285511 -0.878709 1.03455 -0.951056 -0.809017
--0.283391 -0.872185 0.965337 -0.951056 -0.844328
--0.278088 -0.855864 0.886031 -0.951056 -0.876306
--0.269801 -0.83036 0.79736 -0.951056 -0.904827
--0.258782 -0.796446 0.700186 -0.951056 -0.929776
--0.245327 -0.755037 0.595492 -0.951056 -0.951056
--0.229777 -0.707178 0.484363 -0.951056 -0.968583
--0.212505 -0.654022 0.367974 -0.951056 -0.982287
--0.193917 -0.596813 0.247574 -0.951056 -0.992115
--0.174438 -0.536862 0.124469 -0.951056 -0.998027
--0.154509 -0.475529 1.29711e-06 -0.951056 -1
--0.134581 -0.414196 -0.124466 -0.951056 -0.998027
--0.115102 -0.354245 -0.247572 -0.951056 -0.992115
--0.0965129 -0.297035 -0.367971 -0.951056 -0.982287
--0.0792414 -0.243879 -0.484361 -0.951056 -0.968583
--0.0636909 -0.19602 -0.59549 -0.951056 -0.951057
--0.0502364 -0.154611 -0.700184 -0.951056 -0.929777
--0.039217 -0.120697 -0.797358 -0.951056 -0.904827
--0.0309302 -0.095193 -0.886029 -0.951056 -0.876307
--0.025627 -0.0788714 -0.965336 -0.951056 -0.844328
--0.023507 -0.072347 -1.03454 -0.951056 -0.809017
--0.0247155 -0.0760662 -1.09306 -0.951056 -0.770514
--0.0293398 -0.0902983 -1.14043 -0.951056 -0.728969
--0.0374083 -0.115131 -1.17637 -0.951056 -0.684548
--0.0488891 -0.150465 -1.20073 -0.951056 -0.637425
--0.0636905 -0.196018 -1.21353 -0.951056 -0.587786
--0.0816616 -0.251328 -1.21492 -0.951056 -0.535828
--0.102595 -0.315753 -1.20523 -0.951056 -0.481754
--0.126229 -0.388491 -1.18492 -0.951056 -0.42578
--0.152252 -0.468582 -1.15457 -0.951056 -0.368125
--0.180308 -0.554929 -1.11491 -0.951056 -0.309018
--0.209999 -0.646309 -1.06677 -0.951056 -0.248691
--0.240896 -0.741399 -1.01107 -0.951056 -0.187382
--0.27254 -0.838788 -0.948815 -0.951056 -0.125334
--0.304453 -0.937006 -0.881091 -0.951056 -0.0627915
--0.336144 -1.03454 -0.809018 -0.951056 -9.80385e-07
--0.367119 -1.12987 -0.733753 -0.951056 0.0627895
--0.396885 -1.22148 -0.656463 -0.951056 0.125332
--0.424959 -1.30788 -0.578311 -0.951056 0.18738
--0.450877 -1.38765 -0.500434 -0.951056 0.248689
--0.474201 -1.45944 -0.423931 -0.951056 0.309016
--0.494527 -1.52199 -0.34984 -0.951056 0.368124
--0.511487 -1.57419 -0.279126 -0.951056 0.425778
--0.52476 -1.61504 -0.212665 -0.951056 0.481753
--0.534077 -1.64371 -0.151233 -0.951056 0.535826
--0.53922 -1.65954 -0.095493 -0.951056 0.587784
--0.540035 -1.66205 -0.0459857 -0.951056 0.637423
--0.536423 -1.65094 -0.00312389 -0.951056 0.684546
--0.528355 -1.6261 0.032814 -0.951056 0.728968
--0.515861 -1.58765 0.0616861 -0.951056 0.770513
--0.499037 -1.53587 0.0834879 -0.951056 0.809016
--0.478042 -1.47126 0.0983503 -0.951056 0.844327
--0.453096 -1.39448 0.106536 -0.951056 0.876306
--0.424475 -1.3064 0.108433 -0.951056 0.904827
--0.392512 -1.20802 0.104547 -0.951056 0.929776
--0.357585 -1.10053 0.0954914 -0.951056 0.951056
--0.32012 -0.985224 0.0819734 -0.951056 0.968583
--0.280576 -0.863523 0.0647837 -0.951056 0.982287
--0.239447 -0.736941 0.0447798 -0.951056 0.992115
--0.197248 -0.607066 0.0228708 -0.951056 0.998027
--0.124345 -0.484291 0 -0.968583 1
--0.0901461 -0.351094 -0.0272033 -0.968583 0.998027
--0.0563729 -0.219557 -0.053391 -0.968583 0.992115
--0.0234459 -0.0913153 -0.0775656 -0.968583 0.982287
-0.00822764 0.0320444 -0.0987664 -0.968583 0.968583
-0.0382586 0.149007 -0.116086 -0.968583 0.951057
-0.0662822 0.258151 -0.128688 -0.968583 0.929777
-0.0919629 0.35817 -0.135821 -0.968583 0.904827
-0.115 0.447892 -0.136834 -0.968583 0.876307
-0.13513 0.526295 -0.131188 -0.968583 0.844328
-0.152134 0.592521 -0.118467 -0.968583 0.809017
-0.165837 0.645891 -0.0983865 -0.968583 0.770513
-0.176113 0.685911 -0.0707988 -0.968583 0.728969
-0.182884 0.712282 -0.0356989 -0.968583 0.684547
-0.186123 0.724899 0.00677456 -0.968583 0.637424
-0.185855 0.723855 0.05634 -0.968583 0.587785
-0.182153 0.709437 0.112575 -0.968583 0.535827
-0.175139 0.682119 0.174924 -0.968583 0.481754
-0.164981 0.642558 0.242701 -0.968583 0.42578
-0.151892 0.591577 0.315104 -0.968583 0.368125
-0.136121 0.530155 0.391225 -0.968583 0.309017
-0.117957 0.45941 0.470061 -0.968583 0.24869
-0.0977172 0.380582 0.550533 -0.968583 0.187382
-0.0757457 0.295009 0.631501 -0.968583 0.125334
-0.0524067 0.20411 0.711778 -0.968583 0.0627908
-0.028079 0.10936 0.790155 -0.968583 3.26795e-07
-0.00314969 0.0122672 0.865413 -0.968583 -0.0627902
--0.0219916 -0.0856511 0.936348 -0.968583 -0.125333
--0.0469589 -0.182892 1.00179 -0.968583 -0.187381
--0.0713764 -0.277992 1.0606 -0.968583 -0.24869
--0.0948835 -0.369546 1.11174 -0.968583 -0.309017
--0.117141 -0.456233 1.15423 -0.968583 -0.368124
--0.137837 -0.536837 1.18721 -0.968583 -0.425779
--0.156689 -0.610261 1.20991 -0.968583 -0.481753
--0.173452 -0.675547 1.22172 -0.968583 -0.535826
--0.187918 -0.73189 1.22216 -0.968583 -0.587785
--0.199924 -0.77865 1.21088 -0.968583 -0.637424
--0.209349 -0.815359 1.1877 -0.968583 -0.684547
--0.21612 -0.84173 1.1526 -0.968583 -0.728968
--0.22021 -0.857659 1.10571 -0.968583 -0.770513
--0.221639 -0.863225 1.04735 -0.968583 -0.809017
--0.220475 -0.85869 0.977962 -0.968583 -0.844328
--0.216829 -0.844488 0.898155 -0.968583 -0.876306
--0.210856 -0.821225 0.808685 -0.968583 -0.904827
--0.202751 -0.789659 0.71044 -0.968583 -0.929776
--0.192746 -0.750694 0.60443 -0.968583 -0.951056
--0.181106 -0.705358 0.491775 -0.968583 -0.968583
--0.168122 -0.65479 0.373688 -0.968583 -0.982287
--0.15411 -0.600218 0.251458 -0.968583 -0.992115
--0.139403 -0.542938 0.126433 -0.968583 -0.998027
--0.124346 -0.484292 1.31762e-06 -0.968583 -1
--0.109288 -0.425646 -0.126431 -0.968583 -0.998027
--0.0945807 -0.368366 -0.251455 -0.968583 -0.992115
--0.0805689 -0.313794 -0.373685 -0.968583 -0.982287
--0.0675852 -0.263226 -0.491772 -0.968583 -0.968583
--0.0559448 -0.21789 -0.604428 -0.968583 -0.951057
--0.0459401 -0.178924 -0.710438 -0.968583 -0.929777
--0.0378354 -0.147358 -0.808683 -0.968583 -0.904827
--0.0318623 -0.124095 -0.898153 -0.968583 -0.876307
--0.028216 -0.109894 -0.97796 -0.968583 -0.844328
--0.0270514 -0.105358 -1.04735 -0.968583 -0.809017
--0.0284805 -0.110924 -1.10571 -0.968583 -0.770514
--0.0325703 -0.126853 -1.1526 -0.968583 -0.728969
--0.0393412 -0.153223 -1.1877 -0.968583 -0.684548
--0.0487664 -0.189932 -1.21088 -0.968583 -0.637425
--0.0607723 -0.236692 -1.22216 -0.968583 -0.587786
--0.0752388 -0.293035 -1.22172 -0.968583 -0.535828
--0.0920014 -0.358321 -1.20991 -0.968583 -0.481754
--0.110853 -0.431744 -1.18721 -0.968583 -0.42578
--0.131549 -0.512348 -1.15423 -0.968583 -0.368125
--0.153807 -0.599036 -1.11174 -0.968583 -0.309018
--0.177314 -0.690589 -1.0606 -0.968583 -0.248691
--0.201731 -0.785689 -1.00179 -0.968583 -0.187382
--0.226699 -0.88293 -0.936349 -0.968583 -0.125334
--0.25184 -0.980848 -0.865415 -0.968583 -0.0627915
--0.276769 -1.07794 -0.790156 -0.968583 -9.80385e-07
--0.301097 -1.17269 -0.71178 -0.968583 0.0627895
--0.324436 -1.26359 -0.631502 -0.968583 0.125332
--0.346408 -1.34916 -0.550535 -0.968583 0.18738
--0.366647 -1.42799 -0.470062 -0.968583 0.248689
--0.384812 -1.49874 -0.391226 -0.968583 0.309016
--0.400582 -1.56016 -0.315106 -0.968583 0.368124
--0.413672 -1.61114 -0.242702 -0.968583 0.425778
--0.42383 -1.6507 -0.174925 -0.968583 0.481753
--0.430844 -1.67802 -0.112577 -0.968583 0.535826
--0.434546 -1.69244 -0.0563411 -0.968583 0.587784
--0.434814 -1.69348 -0.00677552 -0.968583 0.637423
--0.431575 -1.68087 0.0356981 -0.968583 0.684546
--0.424804 -1.65449 0.0707982 -0.968583 0.728968
--0.414528 -1.61447 0.098386 -0.968583 0.770513
--0.400825 -1.5611 0.118467 -0.968583 0.809016
--0.383821 -1.49488 0.131188 -0.968583 0.844327
--0.363691 -1.41648 0.136834 -0.968583 0.876306
--0.340654 -1.32676 0.135821 -0.968583 0.904827
--0.314974 -1.22674 0.128688 -0.968583 0.929776
--0.28695 -1.11759 0.116086 -0.968583 0.951056
--0.256919 -1.00063 0.0987668 -0.968583 0.968583
--0.225246 -0.87727 0.0775661 -0.968583 0.982287
--0.192319 -0.749028 0.0533915 -0.968583 0.992115
--0.158545 -0.617491 0.0272039 -0.968583 0.998027
--0.0936911 -0.491144 0 -0.982287 1
--0.0680956 -0.356968 -0.0315094 -0.982287 0.998027
--0.0428151 -0.224444 -0.0619498 -0.982287 0.992115
--0.0181599 -0.0951972 -0.0902714 -0.982287 0.982287
-0.00556871 0.029192 -0.115462 -0.982287 0.968583
-0.0280832 0.147216 -0.136566 -0.982287 0.951057
-0.0491136 0.257461 -0.152702 -0.982287 0.929777
-0.0684119 0.358626 -0.163075 -0.982287 0.904827
-0.0857549 0.449541 -0.166997 -0.982287 0.876307
-0.100948 0.529188 -0.163896 -0.982287 0.844328
-0.113829 0.59671 -0.153329 -0.982287 0.809017
-0.124267 0.651428 -0.134989 -0.982287 0.770513
-0.132168 0.692846 -0.108713 -0.982287 0.728969
-0.137474 0.72066 -0.0744857 -0.982287 0.684547
-0.140164 0.73476 -0.0324423 -0.982287 0.637424
-0.140253 0.735231 0.0171325 -0.982287 0.587785
-0.137796 0.72235 0.0738078 -0.982287 0.535827
-0.132881 0.696584 0.137011 -0.982287 0.481754
-0.12563 0.658574 0.206038 -0.982287 0.42578
-0.116198 0.60913 0.280059 -0.982287 0.368125
-0.10477 0.549219 0.358133 -0.982287 0.309017
-0.0915542 0.479941 0.439225 -0.982287 0.24869
-0.0767852 0.40252 0.522214 -0.982287 0.187382
-0.060715 0.318277 0.605917 -0.982287 0.125334
-0.0436108 0.228615 0.689102 -0.982287 0.0627908
-0.0257508 0.13499 0.770513 -0.982287 3.26795e-07
-0.00741947 0.038894 0.848883 -0.982287 -0.0627902
--0.011097 -0.058172 0.922958 -0.982287 -0.125333
--0.0295148 -0.154721 0.991517 -0.982287 -0.187381
--0.0475575 -0.249304 1.05339 -0.982287 -0.24869
--0.0649598 -0.340529 1.10747 -0.982287 -0.309017
--0.0814721 -0.427089 1.15275 -0.982287 -0.368124
--0.0968639 -0.507776 1.18832 -0.982287 -0.425779
--0.110928 -0.581501 1.2134 -0.982287 -0.481753
--0.123482 -0.647314 1.22732 -0.982287 -0.535826
--0.134375 -0.704413 1.22958 -0.982287 -0.587785
--0.143483 -0.752159 1.21982 -0.982287 -0.637424
--0.150717 -0.790084 1.19785 -0.982287 -0.684547
--0.156023 -0.817898 1.16362 -0.982287 -0.728968
--0.159379 -0.835491 1.11728 -0.982287 -0.770513
--0.160799 -0.842934 1.05912 -0.982287 -0.809017
--0.16033 -0.840477 0.989621 -0.982287 -0.844328
--0.158054 -0.828544 0.909393 -0.982287 -0.876306
--0.154082 -0.807724 0.819213 -0.982287 -0.904827
--0.148557 -0.778759 0.719992 -0.982287 -0.929776
--0.141646 -0.742533 0.612771 -0.982287 -0.951056
--0.133543 -0.700054 0.498701 -0.982287 -0.968583
--0.12446 -0.652439 0.379032 -0.982287 -0.982287
--0.114627 -0.600894 0.255093 -0.982287 -0.992115
--0.104287 -0.546689 0.128273 -0.982287 -0.998027
--0.0936912 -0.491144 1.33683e-06 -0.982287 -1
--0.0830954 -0.435599 -0.12827 -0.982287 -0.998027
--0.0727553 -0.381395 -0.25509 -0.982287 -0.992115
--0.0629224 -0.329849 -0.37903 -0.982287 -0.982287
--0.0538393 -0.282234 -0.498699 -0.982287 -0.968583
--0.045736 -0.239755 -0.612769 -0.982287 -0.951057
--0.0388254 -0.203529 -0.71999 -0.982287 -0.929777
--0.0332999 -0.174563 -0.819211 -0.982287 -0.904827
--0.0293282 -0.153743 -0.909391 -0.982287 -0.876307
--0.0270519 -0.14181 -0.989619 -0.982287 -0.844328
--0.0265832 -0.139353 -1.05912 -0.982287 -0.809017
--0.028003 -0.146796 -1.11728 -0.982287 -0.770514
--0.031359 -0.164389 -1.16362 -0.982287 -0.728969
--0.0366648 -0.192202 -1.19785 -0.982287 -0.684548
--0.0438994 -0.230127 -1.21982 -0.982287 -0.637425
--0.0530074 -0.277873 -1.22958 -0.982287 -0.587786
--0.0638996 -0.334972 -1.22732 -0.982287 -0.535828
--0.0764541 -0.400784 -1.2134 -0.982287 -0.481754
--0.090518 -0.47451 -1.18833 -0.982287 -0.42578
--0.10591 -0.555196 -1.15275 -0.982287 -0.368125
--0.122422 -0.641756 -1.10747 -0.982287 -0.309018
--0.139824 -0.732981 -1.05339 -0.982287 -0.248691
--0.157867 -0.827564 -0.991518 -0.982287 -0.187382
--0.176285 -0.924113 -0.92296 -0.982287 -0.125334
--0.194801 -1.02118 -0.848885 -0.982287 -0.0627915
--0.213133 -1.11728 -0.770515 -0.982287 -9.80385e-07
--0.230993 -1.2109 -0.689104 -0.982287 0.0627895
--0.248097 -1.30056 -0.605918 -0.982287 0.125332
--0.264167 -1.38481 -0.522216 -0.982287 0.18738
--0.278936 -1.46223 -0.439227 -0.982287 0.248689
--0.292152 -1.5315 -0.358135 -0.982287 0.309016
--0.30358 -1.59142 -0.28006 -0.982287 0.368124
--0.313012 -1.64086 -0.206039 -0.982287 0.425778
--0.320263 -1.67887 -0.137013 -0.982287 0.481753
--0.325179 -1.70464 -0.073809 -0.982287 0.535826
--0.327636 -1.71752 -0.0171336 -0.982287 0.587784
--0.327546 -1.71705 0.0324414 -0.982287 0.637423
--0.324856 -1.70295 0.0744849 -0.982287 0.684546
--0.31955 -1.67513 0.108712 -0.982287 0.728968
--0.31165 -1.63372 0.134989 -0.982287 0.770513
--0.301212 -1.579 0.153329 -0.982287 0.809016
--0.288331 -1.51148 0.163896 -0.982287 0.844327
--0.273138 -1.43183 0.166997 -0.982287 0.876306
--0.255794 -1.34091 0.163075 -0.982287 0.904827
--0.236496 -1.23975 0.152702 -0.982287 0.929776
--0.215466 -1.12951 0.136567 -0.982287 0.951056
--0.192951 -1.01148 0.115463 -0.982287 0.968583
--0.169223 -0.887092 0.090272 -0.982287 0.982287
--0.144568 -0.757846 0.0619505 -0.982287 0.992115
--0.119287 -0.625322 0.0315101 -0.982287 0.998027
--0.0626671 -0.496057 0 -0.992115 1
--0.0456796 -0.361588 -0.0357844 -0.992115 0.998027
--0.0288984 -0.228752 -0.0704476 -0.992115 0.992115
--0.0125269 -0.0991601 -0.102888 -0.992115 0.982287
-0.00323742 0.0256266 -0.132044 -0.992115 0.968583
-0.0182061 0.144115 -0.156912 -0.992115 0.951057
-0.0322023 0.254905 -0.176564 -0.992115 0.929777
-0.0450631 0.356708 -0.190167 -0.992115 0.904827
-0.0566422 0.448365 -0.196995 -0.992115 0.876307
-0.0668118 0.528866 -0.196443 -0.992115 0.844328
-0.0754646 0.597359 -0.18804 -0.992115 0.809017
-0.0825151 0.653169 -0.171459 -0.992115 0.770513
-0.0879006 0.6958 -0.14652 -0.992115 0.728969
-0.0915825 0.724945 -0.113199 -0.992115 0.684547
-0.0935462 0.740489 -0.0716272 -0.992115 0.637424
-0.0938014 0.742509 -0.0220919 -0.992115 0.587785
-0.0923819 0.731273 0.0349672 -0.992115 0.535827
-0.0893447 0.707231 0.0989636 -0.992115 0.481754
-0.084769 0.67101 0.169172 -0.992115 0.42578
-0.0787548 0.623404 0.244737 -0.992115 0.368125
-0.0714216 0.565356 0.324689 -0.992115 0.309017
-0.0629058 0.497947 0.407956 -0.992115 0.24869
-0.0533589 0.422376 0.493379 -0.992115 0.187382
-0.0429448 0.339941 0.579735 -0.992115 0.125334
-0.0318375 0.252018 0.665746 -0.992115 0.0627908
-0.0202179 0.16004 0.750111 -0.992115 3.26795e-07
-0.0082712 0.0654728 0.831515 -0.992115 -0.0627902
--0.00381614 -0.0302076 0.908658 -0.992115 -0.125333
--0.0158593 -0.125538 0.980269 -0.992115 -0.187381
--0.0276779 -0.219092 1.04513 -0.992115 -0.24869
--0.0390992 -0.309499 1.10211 -0.992115 -0.309017
--0.04996 -0.395471 1.15013 -0.992115 -0.368124
--0.06011 -0.475816 1.18827 -0.992115 -0.425779
--0.0694136 -0.549461 1.21569 -0.992115 -0.481753
--0.0777519 -0.615465 1.23171 -0.992115 -0.535826
--0.0850249 -0.673036 1.2358 -0.992115 -0.587785
--0.0911524 -0.72154 1.22757 -0.992115 -0.637424
--0.0960756 -0.760511 1.20681 -0.992115 -0.684547
--0.0997575 -0.789656 1.17349 -0.992115 -0.728968
--0.102184 -0.80886 1.12774 -0.992115 -0.770513
--0.103362 -0.818186 1.06985 -0.992115 -0.809017
--0.103322 -0.817872 1.0003 -0.992115 -0.844328
--0.102116 -0.808326 0.919733 -0.992115 -0.876306
--0.0998159 -0.790118 0.828932 -0.992115 -0.904827
--0.0965126 -0.76397 0.728834 -0.992115 -0.929776
--0.0923147 -0.73074 0.620507 -0.992115 -0.951056
--0.0873464 -0.691412 0.505135 -0.992115 -0.968583
--0.0817451 -0.647074 0.384003 -0.992115 -0.982287
--0.0756594 -0.598901 0.258477 -0.992115 -0.992115
--0.0692459 -0.548134 0.129986 -0.992115 -0.998027
--0.0626672 -0.496058 1.35472e-06 -0.992115 -1
--0.0560884 -0.443982 -0.129983 -0.992115 -0.998027
--0.0496749 -0.393214 -0.258474 -0.992115 -0.992115
--0.0435892 -0.345041 -0.384 -0.992115 -0.982287
--0.0379879 -0.300703 -0.505133 -0.992115 -0.968583
--0.0330196 -0.261375 -0.620505 -0.992115 -0.951057
--0.0288217 -0.228145 -0.728832 -0.992115 -0.929777
--0.0255183 -0.201997 -0.82893 -0.992115 -0.904827
--0.0232181 -0.183789 -0.919732 -0.992115 -0.876307
--0.0220121 -0.174243 -1.0003 -0.992115 -0.844328
--0.0219724 -0.173928 -1.06985 -0.992115 -0.809017
--0.0231506 -0.183254 -1.12774 -0.992115 -0.770514
--0.0255766 -0.202458 -1.17349 -0.992115 -0.728969
--0.0292585 -0.231603 -1.20681 -0.992115 -0.684548
--0.0341816 -0.270573 -1.22757 -0.992115 -0.637425
--0.0403091 -0.319077 -1.2358 -0.992115 -0.587786
--0.0475821 -0.376648 -1.23171 -0.992115 -0.535828
--0.0559204 -0.442652 -1.21569 -0.992115 -0.481754
--0.065224 -0.516297 -1.18827 -0.992115 -0.42578
--0.075374 -0.596642 -1.15014 -0.992115 -0.368125
--0.0862348 -0.682613 -1.10211 -0.992115 -0.309018
--0.097656 -0.773021 -1.04514 -0.992115 -0.248691
--0.109475 -0.866574 -0.980271 -0.992115 -0.187382
--0.121518 -0.961905 -0.908659 -0.992115 -0.125334
--0.133605 -1.05759 -0.831517 -0.992115 -0.0627915
--0.145552 -1.15215 -0.750113 -0.992115 -9.80385e-07
--0.157171 -1.24413 -0.665748 -0.992115 0.0627895
--0.168279 -1.33205 -0.579736 -0.992115 0.125332
--0.178693 -1.41449 -0.493381 -0.992115 0.18738
--0.18824 -1.49006 -0.407957 -0.992115 0.248689
--0.196756 -1.55747 -0.324691 -0.992115 0.309016
--0.204089 -1.61552 -0.244738 -0.992115 0.368124
--0.210103 -1.66312 -0.169173 -0.992115 0.425778
--0.214679 -1.69934 -0.098965 -0.992115 0.481753
--0.217716 -1.72339 -0.0349685 -0.992115 0.535826
--0.219136 -1.73462 0.0220908 -0.992115 0.587784
--0.21888 -1.7326 0.0716263 -0.992115 0.637423
--0.216917 -1.71706 0.113198 -0.992115 0.684546
--0.213235 -1.68792 0.146519 -0.992115 0.728968
--0.207849 -1.64528 0.171458 -0.992115 0.770513
--0.200799 -1.58948 0.18804 -0.992115 0.809016
--0.192146 -1.52098 0.196443 -0.992115 0.844327
--0.181977 -1.44048 0.196995 -0.992115 0.876306
--0.170398 -1.34882 0.190168 -0.992115 0.904827
--0.157537 -1.24702 0.176565 -0.992115 0.929776
--0.143541 -1.13623 0.156912 -0.992115 0.951056
--0.128572 -1.01774 0.132045 -0.992115 0.968583
--0.112808 -0.892957 0.102889 -0.992115 0.982287
--0.0964361 -0.763365 0.0704483 -0.992115 0.992115
--0.079655 -0.630529 0.0357852 -0.992115 0.998027
--0.0313957 -0.499013 0 -0.998027 1
--0.0229599 -0.364931 -0.0400241 -0.998027 0.998027
--0.0146252 -0.232457 -0.0788758 -0.998027 0.992115
--0.00649122 -0.103173 -0.115403 -0.998027 0.982287
-0.0013452 0.021381 -0.148496 -0.998027 0.968583
-0.00879167 0.139737 -0.177103 -0.998027 0.951057
-0.0157614 0.250517 -0.200253 -0.998027 0.929777
-0.0221746 0.352449 -0.217072 -0.998027 0.904827
-0.0279593 0.444393 -0.226798 -0.998027 0.876307
-0.0330528 0.52535 -0.228795 -0.998027 0.844328
-0.0374022 0.594482 -0.222565 -0.998027 0.809017
-0.0409654 0.651116 -0.207759 -0.998027 0.770513
-0.0437113 0.694761 -0.184182 -0.998027 0.728969
-0.0456207 0.72511 -0.151801 -0.998027 0.684547
-0.046686 0.742042 -0.110741 -0.998027 0.637424
-0.0469116 0.745626 -0.0612945 -0.998027 0.587785
-0.0463133 0.736117 -0.00390778 -0.998027 0.535827
-0.0449186 0.71395 0.0608182 -0.998027 0.481754
-0.0427658 0.679733 0.132138 -0.998027 0.42578
-0.0399033 0.634235 0.209173 -0.998027 0.368125
-0.0363889 0.578377 0.290924 -0.998027 0.309017
-0.0322889 0.51321 0.376284 -0.998027 0.24869
-0.0276768 0.439903 0.464058 -0.998027 0.187382
-0.0226323 0.359725 0.552981 -0.998027 0.125334
-0.0172401 0.274019 0.641734 -0.998027 0.0627908
-0.011588 0.184183 0.728969 -0.998027 3.26795e-07
-0.00576629 0.0916512 0.813327 -0.998027 -0.0627902
--0.000134234 -0.00213356 0.89346 -0.998027 -0.125333
--0.00602354 -0.09574 0.968055 -0.998027 -0.187381
--0.0118137 -0.187771 1.03585 -0.998027 -0.24869
--0.0174205 -0.276887 1.09566 -0.998027 -0.309017
--0.0227643 -0.361822 1.14638 -0.998027 -0.368124
--0.0277716 -0.441411 1.18704 -0.998027 -0.425779
--0.0323763 -0.514598 1.21678 -0.998027 -0.481753
--0.0365201 -0.580461 1.23489 -0.998027 -0.535826
--0.0401539 -0.638218 1.24079 -0.998027 -0.587785
--0.0432385 -0.687245 1.2341 -0.998027 -0.637424
--0.0457447 -0.72708 1.21459 -0.998027 -0.684547
--0.0476541 -0.757428 1.18221 -0.998027 -0.728968
--0.0489592 -0.778172 1.13708 -0.998027 -0.770513
--0.0496633 -0.789363 1.07952 -0.998027 -0.809017
--0.0497806 -0.791228 1.01 -0.998027 -0.844328
--0.0493356 -0.784156 0.929166 -0.998027 -0.876306
--0.0483629 -0.768695 0.837833 -0.998027 -0.904827
--0.0469062 -0.745541 0.736957 -0.998027 -0.929776
--0.0450178 -0.715526 0.627631 -0.998027 -0.951056
--0.0427575 -0.6796 0.511071 -0.998027 -0.968583
--0.0401916 -0.638817 0.388595 -0.998027 -0.982287
--0.0373918 -0.594316 0.261605 -0.998027 -0.992115
--0.0344337 -0.547299 0.13157 -0.998027 -0.998027
--0.0313958 -0.499014 1.37127e-06 -0.998027 -1
--0.0283579 -0.450728 -0.131567 -0.998027 -0.998027
--0.0253998 -0.403712 -0.261602 -0.998027 -0.992115
--0.0225999 -0.35921 -0.388592 -0.998027 -0.982287
--0.0200341 -0.318427 -0.511069 -0.998027 -0.968583
--0.0177737 -0.282501 -0.627629 -0.998027 -0.951057
--0.0158853 -0.252486 -0.736955 -0.998027 -0.929777
--0.0144286 -0.229332 -0.837831 -0.998027 -0.904827
--0.0134559 -0.213871 -0.929164 -0.998027 -0.876307
--0.0130109 -0.206799 -1.01 -0.998027 -0.844328
--0.0131282 -0.208663 -1.07952 -0.998027 -0.809017
--0.0138323 -0.219855 -1.13708 -0.998027 -0.770514
--0.0151374 -0.240598 -1.18221 -0.998027 -0.728969
--0.0170468 -0.270946 -1.21459 -0.998027 -0.684548
--0.0195529 -0.31078 -1.2341 -0.998027 -0.637425
--0.0226375 -0.359807 -1.24079 -0.998027 -0.587786
--0.0262713 -0.417565 -1.23489 -0.998027 -0.535828
--0.0304151 -0.483427 -1.21678 -0.998027 -0.481754
--0.0350198 -0.556615 -1.18704 -0.998027 -0.42578
--0.0400271 -0.636203 -1.14638 -0.998027 -0.368125
--0.0453709 -0.721138 -1.09566 -0.998027 -0.309018
--0.0509776 -0.810254 -1.03585 -0.998027 -0.248691
--0.0567678 -0.902285 -0.968056 -0.998027 -0.187382
--0.0626571 -0.995891 -0.893462 -0.998027 -0.125334
--0.0685577 -1.08968 -0.813328 -0.998027 -0.0627915
--0.0743794 -1.18221 -0.72897 -0.998027 -9.80385e-07
--0.0800314 -1.27204 -0.641735 -0.998027 0.0627895
--0.0854237 -1.35775 -0.552982 -0.998027 0.125332
--0.0904682 -1.43793 -0.46406 -0.998027 0.18738
--0.0950803 -1.51123 -0.376286 -0.998027 0.248689
--0.0991803 -1.5764 -0.290926 -0.998027 0.309016
--0.102695 -1.63226 -0.209175 -0.998027 0.368124
--0.105557 -1.67776 -0.13214 -0.998027 0.425778
--0.10771 -1.71198 -0.0608196 -0.998027 0.481753
--0.109105 -1.73414 0.0039065 -0.998027 0.535826
--0.109703 -1.74365 0.0612934 -0.998027 0.587784
--0.109478 -1.74007 0.110741 -0.998027 0.637423
--0.108412 -1.72314 0.1518 -0.998027 0.684546
--0.106503 -1.69279 0.184182 -0.998027 0.728968
--0.103757 -1.64914 0.207759 -0.998027 0.770513
--0.100194 -1.59251 0.222565 -0.998027 0.809016
--0.0958443 -1.52338 0.228795 -0.998027 0.844327
--0.0907509 -1.44242 0.226799 -0.998027 0.876306
--0.0849662 -1.35048 0.217073 -0.998027 0.904827
--0.078553 -1.24855 0.200254 -0.998027 0.929776
--0.0715833 -1.13777 0.177103 -0.998027 0.951056
--0.0641368 -1.01941 0.148496 -0.998027 0.968583
--0.0563004 -0.894856 0.115404 -0.998027 0.982287
--0.0481665 -0.765573 0.0788766 -0.998027 0.992115
--0.0398318 -0.633098 0.0400249 -0.998027 0.998027
--4.90192e-07 -0.5 0 -1 1
--3.59778e-07 -0.366976 -0.0442243 -1 0.998027
--2.30906e-07 -0.235526 -0.0872262 -1 0.992115
--1.05095e-07 -0.107198 -0.127805 -1 0.982287
-1.61779e-08 0.0165016 -0.164801 -1 0.968583
-1.31504e-07 0.134135 -0.197119 -1 0.951057
-2.39558e-07 0.244351 -0.223744 -1 0.929777
-3.39121e-07 0.345907 -0.243763 -1 0.904827
-4.29096e-07 0.437681 -0.256378 -1 0.876307
-5.08522e-07 0.518696 -0.260922 -1 0.844328
-5.76589e-07 0.588125 -0.256871 -1 0.809017
-6.32651e-07 0.645309 -0.243855 -1 0.770513
-6.7623e-07 0.689759 -0.221663 -1 0.728969
-7.07024e-07 0.72117 -0.190252 -1 0.684547
-7.24913e-07 0.739417 -0.149746 -1 0.637424
-7.29955e-07 0.74456 -0.100437 -1 0.587785
-7.22386e-07 0.736839 -0.0427789 -1 0.535827
-7.02615e-07 0.716672 0.0226127 -1 0.481754
-6.71215e-07 0.684645 0.0949745 -1 0.42578
-6.28916e-07 0.641499 0.173404 -1 0.368125
-5.76589e-07 0.588126 0.256872 -1 0.309017
-5.15234e-07 0.525543 0.344241 -1 0.24869
-4.45963e-07 0.454885 0.434279 -1 0.187382
-3.69979e-07 0.377381 0.525681 -1 0.125334
-2.88562e-07 0.294336 0.617087 -1 0.0627908
-2.03044e-07 0.207107 0.707107 -1 3.26795e-07
-1.14791e-07 0.117088 0.794335 -1 -0.0627902
-2.51771e-08 0.0256808 0.877381 -1 -0.125333
--6.44322e-08 -0.0657213 0.954885 -1 -0.187381
--1.52704e-07 -0.15576 1.02554 -1 -0.24869
--2.38359e-07 -0.243128 1.08813 -1 -0.309017
--3.2019e-07 -0.326597 1.1415 -1 -0.368124
--3.97081e-07 -0.405026 1.18464 -1 -0.425779
--4.68024e-07 -0.477388 1.21667 -1 -0.481753
--5.32133e-07 -0.54278 1.23684 -1 -0.535826
--5.8866e-07 -0.600437 1.24456 -1 -0.587785
--6.37002e-07 -0.649747 1.23942 -1 -0.637424
--6.76714e-07 -0.690253 1.22117 -1 -0.684547
--7.07508e-07 -0.721664 1.18976 -1 -0.728968
--7.29265e-07 -0.743856 1.14531 -1 -0.770513
--7.42026e-07 -0.756872 1.08813 -1 -0.809017
--7.45997e-07 -0.760923 1.0187 -1 -0.844328
--7.41543e-07 -0.756379 0.937682 -1 -0.876306
--7.29175e-07 -0.743764 0.845907 -1 -0.904827
--7.09549e-07 -0.723745 0.744352 -1 -0.929776
--6.83445e-07 -0.69712 0.634136 -1 -0.951056
--6.51761e-07 -0.664802 0.516503 -1 -0.968583
--6.15491e-07 -0.627805 0.392803 -1 -0.982287
--5.75708e-07 -0.587227 0.264476 -1 -0.992115
--5.3355e-07 -0.544225 0.133025 -1 -0.998027
--4.90193e-07 -0.5 1.38647e-06 -1 -1
--4.46836e-07 -0.455776 -0.133022 -1 -0.998027
--4.04677e-07 -0.412774 -0.264473 -1 -0.992115
--3.64895e-07 -0.372195 -0.392801 -1 -0.982287
--3.28624e-07 -0.335199 -0.5165 -1 -0.968583
--2.9694e-07 -0.302881 -0.634134 -1 -0.951057
--2.70837e-07 -0.276255 -0.74435 -1 -0.929777
--2.5121e-07 -0.256236 -0.845905 -1 -0.904827
--2.38842e-07 -0.243621 -0.93768 -1 -0.876307
--2.34387e-07 -0.239077 -1.0187 -1 -0.844328
--2.38359e-07 -0.243128 -1.08812 -1 -0.809017
--2.5112e-07 -0.256144 -1.14531 -1 -0.770514
--2.72876e-07 -0.278336 -1.18976 -1 -0.728969
--3.0367e-07 -0.309746 -1.22117 -1 -0.684548
--3.43382e-07 -0.350252 -1.23942 -1 -0.637425
--3.91724e-07 -0.399562 -1.24456 -1 -0.587786
--4.48251e-07 -0.457219 -1.23684 -1 -0.535828
--5.1236e-07 -0.522611 -1.21667 -1 -0.481754
--5.83302e-07 -0.594973 -1.18465 -1 -0.42578
--6.60193e-07 -0.673402 -1.1415 -1 -0.368125
--7.42024e-07 -0.75687 -1.08813 -1 -0.309018
--8.27679e-07 -0.844239 -1.02554 -1 -0.248691
--9.15951e-07 -0.934277 -0.954887 -1 -0.187382
--1.00556e-06 -1.02568 -0.877383 -1 -0.125334
--1.09517e-06 -1.11709 -0.794337 -1 -0.0627915
--1.18343e-06 -1.20711 -0.707109 -1 -9.80385e-07
--1.26895e-06 -1.29433 -0.617089 -1 0.0627895
--1.35036e-06 -1.37738 -0.525683 -1 0.125332
--1.42635e-06 -1.45488 -0.434281 -1 0.18738
--1.49562e-06 -1.52554 -0.344242 -1 0.248689
--1.55697e-06 -1.58812 -0.256874 -1 0.309016
--1.6093e-06 -1.6415 -0.173405 -1 0.368124
--1.6516e-06 -1.68464 -0.0949761 -1 0.425778
--1.683e-06 -1.71667 -0.0226142 -1 0.481753
--1.70277e-06 -1.73684 0.0427777 -1 0.535826
--1.71034e-06 -1.74456 0.100436 -1 0.587784
--1.7053e-06 -1.73942 0.149745 -1 0.637423
--1.68741e-06 -1.72117 0.190252 -1 0.684546
--1.65662e-06 -1.68976 0.221662 -1 0.728968
--1.61304e-06 -1.64531 0.243854 -1 0.770513
--1.55698e-06 -1.58813 0.256871 -1 0.809016
--1.48891e-06 -1.5187 0.260922 -1 0.844327
--1.40948e-06 -1.43768 0.256378 -1 0.876306
--1.31951e-06 -1.34591 0.243764 -1 0.904827
--1.21995e-06 -1.24435 0.223745 -1 0.929776
--1.11189e-06 -1.13414 0.197119 -1 0.951056
--9.96565e-07 -1.0165 0.164801 -1 0.968583
--8.75292e-07 -0.892805 0.127805 -1 0.982287
--7.49482e-07 -0.764477 0.0872271 -1 0.992115
--6.20609e-07 -0.633026 0.0442252 -1 0.998027
-0.0313948 -0.499013 0 -0.998027 1
-0.0231336 -0.367704 -0.0483809 -0.998027 0.998027
-0.0149688 -0.237926 -0.0954905 -0.998027 0.992115
-0.00699515 -0.111186 -0.14008 -0.998027 0.982287
--0.000695093 0.0110484 -0.180943 -0.998027 0.968583
--0.00801385 0.127379 -0.21694 -0.998027 0.951057
--0.0148784 0.236488 -0.247014 -0.998027 0.929777
--0.0212123 0.337166 -0.270214 -0.998027 0.904827
--0.0269471 0.428319 -0.285705 -0.998027 0.876307
--0.0320225 0.508991 -0.292791 -0.998027 0.844328
--0.0363878 0.578376 -0.290923 -0.998027 0.809017
--0.0400022 0.635827 -0.279709 -0.998027 0.770513
--0.0428356 0.680864 -0.258925 -0.998027 0.728969
--0.0448689 0.713182 -0.228516 -0.998027 0.684547
--0.0460939 0.732653 -0.188603 -0.998027 0.637424
--0.0465139 0.739329 -0.13948 -0.998027 0.587785
--0.0461431 0.733435 -0.0816079 -0.998027 0.535827
--0.0450064 0.715368 -0.015615 -0.998027 0.481754
--0.0431391 0.685688 0.0577171 -0.998027 0.42578
--0.0405861 0.645107 0.137463 -0.998027 0.368125
--0.037401 0.594482 0.222566 -0.998027 0.309017
--0.0336458 0.534793 0.311858 -0.998027 0.24869
--0.029389 0.467132 0.404071 -0.998027 0.187382
--0.0247052 0.392684 0.497862 -0.998027 0.125334
--0.0196736 0.312709 0.591832 -0.998027 0.0627908
--0.0143768 0.228517 0.684547 -0.998027 3.26795e-07
--0.0088994 0.141454 0.77456 -0.998027 -0.0627902
--0.00332663 0.0528761 0.860436 -0.998027 -0.125333
-0.00225678 -0.035871 0.940773 -0.998027 -0.187381
-0.00776809 -0.123472 1.01422 -0.998027 -0.24869
-0.0131278 -0.208664 1.07952 -0.998027 -0.309017
-0.0182609 -0.290253 1.13549 -0.998027 -0.368124
-0.0230979 -0.367136 1.18108 -0.998027 -0.425779
-0.027576 -0.438316 1.21536 -0.998027 -0.481753
-0.0316402 -0.502914 1.23757 -0.998027 -0.535826
-0.0352435 -0.560188 1.2471 -0.998027 -0.587785
-0.0383482 -0.609537 1.24351 -0.998027 -0.637424
-0.0409263 -0.650515 1.22654 -0.998027 -0.684547
-0.0429595 -0.682833 1.19614 -0.998027 -0.728968
-0.0444399 -0.706364 1.1524 -0.998027 -0.770513
-0.0453696 -0.721141 1.09566 -0.998027 -0.809017
-0.0457608 -0.727358 1.02639 -0.998027 -0.844328
-0.0456354 -0.725365 0.945272 -0.998027 -0.876306
-0.0450247 -0.715658 0.853147 -0.998027 -0.904827
-0.0439686 -0.698872 0.751013 -0.998027 -0.929776
-0.042515 -0.675767 0.640015 -0.998027 -0.951056
-0.0407188 -0.647217 0.521424 -0.998027 -0.968583
-0.0386409 -0.61419 0.396624 -0.998027 -0.982287
-0.0363474 -0.577734 0.267085 -0.998027 -0.992115
-0.0339079 -0.538959 0.134348 -0.998027 -0.998027
-0.0313948 -0.499014 1.40031e-06 -0.998027 -1
-0.0288817 -0.459069 -0.134346 -0.998027 -0.998027
-0.0264422 -0.420293 -0.267082 -0.998027 -0.992115
-0.0241486 -0.383838 -0.396621 -0.998027 -0.982287
-0.0220708 -0.350811 -0.521422 -0.998027 -0.968583
-0.0202745 -0.32226 -0.640012 -0.998027 -0.951057
-0.0188209 -0.299155 -0.751011 -0.998027 -0.929777
-0.0177648 -0.282369 -0.853145 -0.998027 -0.904827
-0.0171541 -0.272662 -0.94527 -0.998027 -0.876307
-0.0170287 -0.270669 -1.02639 -0.998027 -0.844328
-0.0174199 -0.276886 -1.09566 -0.998027 -0.809017
-0.0183496 -0.291663 -1.1524 -0.998027 -0.770514
-0.0198299 -0.315193 -1.19613 -0.998027 -0.728969
-0.0218632 -0.347511 -1.22654 -0.998027 -0.684548
-0.0244413 -0.388489 -1.24351 -0.998027 -0.637425
-0.027546 -0.437838 -1.2471 -0.998027 -0.587786
-0.0311493 -0.495111 -1.23757 -0.998027 -0.535828
-0.0352134 -0.55971 -1.21536 -0.998027 -0.481754
-0.0396915 -0.630889 -1.18108 -0.998027 -0.42578
-0.0445285 -0.707772 -1.13549 -0.998027 -0.368125
-0.0496616 -0.789361 -1.07952 -0.998027 -0.309018
-0.0550213 -0.874553 -1.01423 -0.998027 -0.248691
-0.0605326 -0.962154 -0.940775 -0.998027 -0.187382
-0.066116 -1.0509 -0.860438 -0.998027 -0.125334
-0.0716888 -1.13948 -0.774562 -0.998027 -0.0627915
-0.0771663 -1.22654 -0.684549 -0.998027 -9.80385e-07
-0.0824631 -1.31073 -0.591834 -0.998027 0.0627895
-0.0874946 -1.39071 -0.497864 -0.998027 0.125332
-0.0921784 -1.46516 -0.404073 -0.998027 0.18738
-0.0964352 -1.53282 -0.311859 -0.998027 0.248689
-0.10019 -1.59251 -0.222568 -0.998027 0.309016
-0.103376 -1.64313 -0.137464 -0.998027 0.368124
-0.105929 -1.68371 -0.0577187 -0.998027 0.425778
-0.107796 -1.71339 0.0156136 -0.998027 0.481753
-0.108933 -1.73146 0.0816066 -0.998027 0.535826
-0.109303 -1.73736 0.139479 -0.998027 0.587784
-0.108883 -1.73068 0.188603 -0.998027 0.637423
-0.107658 -1.71121 0.228516 -0.998027 0.684546
-0.105625 -1.67889 0.258924 -0.998027 0.728968
-0.102792 -1.63385 0.279709 -0.998027 0.770513
-0.0991774 -1.5764 0.290923 -0.998027 0.809016
-0.0948121 -1.50702 0.292791 -0.998027 0.844327
-0.0897367 -1.42635 0.285705 -0.998027 0.876306
-0.084002 -1.33519 0.270214 -0.998027 0.904827
-0.077668 -1.23452 0.247015 -0.998027 0.929776
-0.0708035 -1.12541 0.216941 -0.998027 0.951056
-0.0634848 -1.00908 0.180944 -0.998027 0.968583
-0.0557945 -0.886843 0.140081 -0.998027 0.982287
-0.0478209 -0.760104 0.0954914 -0.998027 0.992115
-0.0396561 -0.630325 0.0483818 -0.998027 0.998027
-0.0626661 -0.496057 0 -0.992115 1
-0.0463749 -0.367098 -0.0524897 -0.992115 0.998027
-0.0302708 -0.23962 -0.103661 -0.992115 0.992115
-0.0145383 -0.115083 -0.152217 -0.992115 0.982287
--0.000643513 0.00509397 -0.196907 -0.992115 0.968583
--0.0151033 0.119556 -0.236547 -0.992115 0.951057
--0.0286802 0.227029 -0.270041 -0.992115 0.929777
--0.0412257 0.326338 -0.296397 -0.992115 0.904827
--0.0526061 0.416423 -0.31475 -0.992115 0.876307
--0.062704 0.496358 -0.324372 -0.992115 0.844328
--0.0714205 0.565356 -0.324688 -0.992115 0.809017
--0.0786757 0.622787 -0.315288 -0.992115 0.770513
--0.0844104 0.668183 -0.295931 -0.992115 0.728969
--0.0885866 0.701241 -0.266555 -0.992115 0.684547
--0.0911878 0.721832 -0.227275 -0.992115 0.637424
--0.0922192 0.729996 -0.178385 -0.992115 0.587785
--0.0917072 0.725943 -0.120356 -0.992115 0.535827
--0.0896992 0.710048 -0.0538274 -0.992115 0.481754
--0.0862625 0.682843 0.0204027 -0.992115 0.42578
--0.0814829 0.645008 0.101386 -0.992115 0.368125
--0.0754635 0.59736 0.188041 -0.992115 0.309017
--0.0683229 0.540836 0.279167 -0.992115 0.24869
--0.0601933 0.476483 0.373464 -0.992115 0.187382
--0.051218 0.405436 0.469552 -0.992115 0.125334
--0.0415496 0.328901 0.565993 -0.992115 0.0627908
--0.031347 0.248139 0.661312 -0.992115 3.26795e-07
--0.0207734 0.16444 0.754021 -0.992115 -0.0627902
--0.00999333 0.079106 0.842642 -0.992115 -0.125333
-0.000829769 -0.00656835 0.925732 -0.992115 -0.187381
-0.0115361 -0.0913187 1.0019 -0.992115 -0.24869
-0.0219722 -0.173929 1.06985 -0.992115 -0.309017
-0.0319928 -0.253251 1.12836 -0.992115 -0.368124
-0.0414635 -0.32822 1.17634 -0.992115 -0.425779
-0.0502628 -0.397875 1.21285 -0.992115 -0.481753
-0.0582837 -0.461366 1.23708 -0.992115 -0.535826
-0.065435 -0.517976 1.24841 -0.992115 -0.587785
-0.0716434 -0.567121 1.24637 -0.992115 -0.637424
-0.0768537 -0.608365 1.23071 -0.992115 -0.684547
-0.0810299 -0.641423 1.20133 -0.992115 -0.728968
-0.0841556 -0.666165 1.15836 -0.992115 -0.770513
-0.0862337 -0.682616 1.10211 -0.992115 -0.809017
-0.0872869 -0.690952 1.03307 -0.992115 -0.844328
-0.087356 -0.6915 0.95193 -0.992115 -0.876306
-0.0865003 -0.684726 0.859544 -0.992115 -0.904827
-0.0847954 -0.671231 0.756932 -0.992115 -0.929776
-0.0823324 -0.651733 0.645262 -0.992115 -0.951056
-0.0792156 -0.627061 0.525831 -0.992115 -0.968583
-0.0755614 -0.598135 0.400053 -0.992115 -0.982287
-0.0714955 -0.56595 0.269431 -0.992115 -0.992115
-0.0671511 -0.53156 0.135539 -0.992115 -0.998027
-0.0626662 -0.496058 1.41276e-06 -0.992115 -1
-0.0581812 -0.460555 -0.135537 -0.992115 -0.998027
-0.0538368 -0.426165 -0.269428 -0.992115 -0.992115
-0.0497709 -0.393981 -0.40005 -0.992115 -0.982287
-0.0461167 -0.365054 -0.525829 -0.992115 -0.968583
-0.0429999 -0.340382 -0.645259 -0.992115 -0.951057
-0.0405368 -0.320885 -0.75693 -0.992115 -0.929777
-0.0388319 -0.307389 -0.859542 -0.992115 -0.904827
-0.0379762 -0.300615 -0.951928 -0.992115 -0.876307
-0.0380454 -0.301163 -1.03307 -0.992115 -0.844328
-0.0390985 -0.309499 -1.10211 -0.992115 -0.809017
-0.0411766 -0.325949 -1.15836 -0.992115 -0.770514
-0.0443022 -0.350691 -1.20133 -0.992115 -0.728969
-0.0484784 -0.383749 -1.23071 -0.992115 -0.684548
-0.0536887 -0.424993 -1.24637 -0.992115 -0.637425
-0.0598971 -0.474138 -1.24841 -0.992115 -0.587786
-0.0670484 -0.530747 -1.23709 -0.992115 -0.535828
-0.0750692 -0.594239 -1.21285 -0.992115 -0.481754
-0.0838685 -0.663893 -1.17634 -0.992115 -0.42578
-0.0933393 -0.738862 -1.12836 -0.992115 -0.368125
-0.10336 -0.818184 -1.06985 -0.992115 -0.309018
-0.113796 -0.900794 -1.00191 -0.992115 -0.248691
-0.124502 -0.985545 -0.925734 -0.992115 -0.187382
-0.135325 -1.07122 -0.842644 -0.992115 -0.125334
-0.146105 -1.15655 -0.754022 -0.992115 -0.0627915
-0.156679 -1.24025 -0.661314 -0.992115 -9.80385e-07
-0.166882 -1.32101 -0.565995 -0.992115 0.0627895
-0.17655 -1.39755 -0.469554 -0.992115 0.125332
-0.185525 -1.4686 -0.373466 -0.992115 0.18738
-0.193655 -1.53295 -0.279169 -0.992115 0.248689
-0.200796 -1.58947 -0.188043 -0.992115 0.309016
-0.206815 -1.63712 -0.101388 -0.992115 0.368124
-0.211595 -1.67496 -0.0204043 -0.992115 0.425778
-0.215031 -1.70216 0.0538259 -0.992115 0.481753
-0.217039 -1.71806 0.120355 -0.992115 0.535826
-0.217551 -1.72211 0.178384 -0.992115 0.587784
-0.21652 -1.71395 0.227274 -0.992115 0.637423
-0.213919 -1.69336 0.266554 -0.992115 0.684546
-0.209743 -1.6603 0.295931 -0.992115 0.728968
-0.204008 -1.6149 0.315288 -0.992115 0.770513
-0.196753 -1.55747 0.324688 -0.992115 0.809016
-0.188036 -1.48847 0.324372 -0.992115 0.844327
-0.177939 -1.40854 0.31475 -0.992115 0.876306
-0.166558 -1.31845 0.296398 -0.992115 0.904827
-0.154013 -1.21915 0.270041 -0.992115 0.929776
-0.140436 -1.11167 0.236548 -0.992115 0.951056
-0.125976 -0.997211 0.196908 -0.992115 0.968583
-0.110794 -0.877034 0.152218 -0.992115 0.982287
-0.0950618 -0.752497 0.103662 -0.992115 0.992115
-0.0789577 -0.625019 0.0524907 -0.992115 0.998027
-0.0936902 -0.491144 0 -0.982287 1
-0.0696546 -0.365144 -0.0565467 -0.982287 0.998027
-0.045891 -0.24057 -0.111728 -0.982287 0.992115
-0.0226672 -0.118826 -0.164203 -0.982287 0.982287
-0.000243555 -0.00127677 -0.212676 -0.982287 0.968583
--0.0211309 0.110773 -0.255921 -0.982287 0.951057
--0.0412221 0.216095 -0.292801 -0.982287 0.929777
--0.0598141 0.313558 -0.322288 -0.982287 0.904827
--0.0767121 0.402141 -0.343484 -0.982287 0.876307
--0.0917452 0.480948 -0.355632 -0.982287 0.844328
--0.104769 0.549219 -0.358133 -0.982287 0.809017
--0.115666 0.606344 -0.350555 -0.982287 0.770513
--0.124349 0.651864 -0.332646 -0.982287 0.728969
--0.130763 0.685486 -0.30433 -0.982287 0.684547
--0.134881 0.707074 -0.265721 -0.982287 0.637424
--0.13671 0.716662 -0.217114 -0.982287 0.587785
--0.136286 0.714442 -0.158986 -0.982287 0.535827
--0.133677 0.700765 -0.0919866 -0.982287 0.481754
--0.128979 0.676133 -0.0169319 -0.982287 0.42578
--0.122313 0.64119 0.0652095 -0.982287 0.368125
--0.113828 0.59671 0.15333 -0.982287 0.309017
--0.103694 0.543586 0.246201 -0.982287 0.24869
--0.0921006 0.482811 0.342489 -0.982287 0.187382
--0.0792541 0.415467 0.440779 -0.982287 0.125334
--0.0653739 0.342704 0.539595 -0.982287 0.0627908
--0.0506889 0.265722 0.637424 -0.982287 3.26795e-07
--0.0354341 0.185753 0.732737 -0.982287 -0.0627902
--0.0198467 0.104041 0.824016 -0.982287 -0.125333
--0.00416245 0.0218205 0.909778 -0.982287 -0.187381
-0.0113881 -0.0596987 0.988596 -0.982287 -0.24869
-0.026583 -0.139354 1.05912 -0.982287 -0.309017
-0.0412128 -0.216046 1.12011 -0.982287 -0.368124
-0.0550828 -0.288756 1.17045 -0.982287 -0.425779
-0.068017 -0.35656 1.20914 -0.982287 -0.481753
-0.0798601 -0.418644 1.23538 -0.982287 -0.535826
-0.09048 -0.474315 1.24849 -0.982287 -0.587785
-0.0997694 -0.523012 1.24801 -0.982287 -0.637424
-0.107647 -0.564311 1.23366 -0.982287 -0.684547
-0.114061 -0.597932 1.20534 -0.982287 -0.728968
-0.118985 -0.623743 1.16318 -0.982287 -0.770513
-0.122421 -0.641758 1.10747 -0.982287 -0.809017
-0.124401 -0.652138 1.03873 -0.982287 -0.844328
-0.124982 -0.655184 0.957648 -0.982287 -0.876306
-0.124247 -0.651331 0.865093 -0.982287 -0.904827
-0.122304 -0.641141 0.762105 -0.982287 -0.929776
-0.11928 -0.625292 0.649872 -0.982287 -0.951056
-0.115326 -0.604562 0.52972 -0.982287 -0.968583
-0.110605 -0.579817 0.403087 -0.982287 -0.982287
-0.105298 -0.551997 0.271511 -0.982287 -0.992115
-0.0995945 -0.522095 0.136596 -0.982287 -0.998027
-0.0936902 -0.491144 1.42381e-06 -0.982287 -1
-0.0877859 -0.460193 -0.136594 -0.982287 -0.998027
-0.082082 -0.430291 -0.271508 -0.982287 -0.992115
-0.076775 -0.402471 -0.403085 -0.982287 -0.982287
-0.0720548 -0.377726 -0.529717 -0.982287 -0.968583
-0.0681002 -0.356996 -0.64987 -0.982287 -0.951057
-0.0650768 -0.341146 -0.762103 -0.982287 -0.929777
-0.063133 -0.330957 -0.865091 -0.982287 -0.904827
-0.0623981 -0.327104 -0.957646 -0.982287 -0.876307
-0.062979 -0.330149 -1.03873 -0.982287 -0.844328
-0.064959 -0.340529 -1.10747 -0.982287 -0.809017
-0.0683956 -0.358544 -1.16317 -0.982287 -0.770514
-0.0733192 -0.384355 -1.20534 -0.982287 -0.728969
-0.0797327 -0.417976 -1.23365 -0.982287 -0.684548
-0.0876108 -0.459274 -1.24801 -0.982287 -0.637425
-0.0969001 -0.507971 -1.24849 -0.982287 -0.587786
-0.10752 -0.563642 -1.23538 -0.982287 -0.535828
-0.119363 -0.625726 -1.20915 -0.982287 -0.481754
-0.132297 -0.69353 -1.17045 -0.982287 -0.42578
-0.146167 -0.76624 -1.12012 -0.982287 -0.368125
-0.160797 -0.842932 -1.05912 -0.982287 -0.309018
-0.175992 -0.922587 -0.988597 -0.982287 -0.248691
-0.191542 -1.00411 -0.90978 -0.982287 -0.187382
-0.207227 -1.08633 -0.824018 -0.982287 -0.125334
-0.222814 -1.16804 -0.732739 -0.982287 -0.0627915
-0.238069 -1.24801 -0.637426 -0.982287 -9.80385e-07
-0.252754 -1.32499 -0.539597 -0.982287 0.0627895
-0.266634 -1.39775 -0.440781 -0.982287 0.125332
-0.279481 -1.4651 -0.342491 -0.982287 0.18738
-0.291074 -1.52587 -0.246203 -0.982287 0.248689
-0.301208 -1.579 -0.153332 -0.982287 0.309016
-0.309693 -1.62348 -0.0652113 -0.982287 0.368124
-0.316359 -1.65842 0.0169302 -0.982287 0.425778
-0.321058 -1.68305 0.0919851 -0.982287 0.481753
-0.323667 -1.69673 0.158985 -0.982287 0.535826
-0.32409 -1.69895 0.217113 -0.982287 0.587784
-0.322261 -1.68936 0.26572 -0.982287 0.637423
-0.318143 -1.66777 0.30433 -0.982287 0.684546
-0.31173 -1.63415 0.332645 -0.982287 0.728968
-0.303046 -1.58863 0.350555 -0.982287 0.770513
-0.292149 -1.53151 0.358133 -0.982287 0.809016
-0.279126 -1.46324 0.355632 -0.982287 0.844327
-0.264093 -1.38443 0.343484 -0.982287 0.876306
-0.247195 -1.29585 0.322289 -0.982287 0.904827
-0.228603 -1.19838 0.292801 -0.982287 0.929776
-0.208512 -1.09306 0.255922 -0.982287 0.951056
-0.187137 -0.981013 0.212677 -0.982287 0.968583
-0.164714 -0.863464 0.164204 -0.982287 0.982287
-0.14149 -0.74172 0.111729 -0.982287 0.992115
-0.117726 -0.617146 0.0565478 -0.982287 0.998027
-0.124344 -0.484292 0 -0.968583 1
-0.0929022 -0.361832 -0.0605479 -0.968583 0.998027
-0.06181 -0.240735 -0.119686 -0.968583 0.992115
-0.0314128 -0.122345 -0.176028 -0.968583 0.982287
-0.00204576 -0.00796775 -0.228236 -0.968583 0.968583
--0.0259704 0.101148 -0.275042 -0.968583 0.951057
--0.0523339 0.203828 -0.315272 -0.968583 0.929777
--0.0767665 0.298987 -0.347861 -0.968583 0.904827
--0.0990166 0.385646 -0.371879 -0.968583 0.876307
--0.118864 0.462945 -0.386541 -0.968583 0.844328
--0.13612 0.530155 -0.391224 -0.968583 0.809017
--0.150634 0.586685 -0.385477 -0.968583 0.770513
--0.162293 0.632094 -0.369032 -0.968583 0.728969
--0.171022 0.666091 -0.341805 -0.968583 0.684547
--0.176787 0.688543 -0.303906 -0.968583 0.637424
--0.179593 0.69947 -0.255629 -0.968583 0.587785
--0.179485 0.699051 -0.197459 -0.968583 0.535827
--0.176547 0.68761 -0.130055 -0.968583 0.481754
--0.170901 0.665617 -0.0542497 -0.968583 0.42578
--0.1627 0.633678 0.0289685 -0.968583 0.368125
--0.152133 0.592521 0.118468 -0.968583 0.309017
--0.139415 0.542989 0.212991 -0.968583 0.24869
--0.124788 0.486021 0.311175 -0.968583 0.187382
--0.108515 0.42264 0.411571 -0.968583 0.125334
--0.0908743 0.353934 0.512665 -0.968583 0.0627908
--0.0721583 0.281039 0.612907 -0.968583 3.26795e-07
--0.0526669 0.205125 0.71073 -0.968583 -0.0627902
--0.0327028 0.127369 0.804577 -0.968583 -0.125333
--0.012567 0.0489455 0.892926 -0.968583 -0.187381
-0.0074456 -0.0289988 0.974311 -0.968583 -0.24869
-0.0270513 -0.105358 1.04735 -0.968583 -0.309017
-0.0459817 -0.179087 1.11076 -0.968583 -0.368124
-0.0639875 -0.249216 1.1634 -0.968583 -0.425779
-0.0808429 -0.314864 1.20424 -0.968583 -0.481753
-0.0963483 -0.375254 1.23245 -0.968583 -0.535826
-0.110333 -0.429722 1.24733 -0.968583 -0.587785
-0.12266 -0.477731 1.24841 -0.968583 -0.637424
-0.133223 -0.51887 1.23539 -0.968583 -0.684547
-0.141952 -0.552867 1.20816 -0.968583 -0.728968
-0.148812 -0.579588 1.16684 -0.968583 -0.770513
-0.153806 -0.599038 1.11174 -0.968583 -0.809017
-0.15697 -0.611359 1.04337 -0.968583 -0.844328
-0.158374 -0.616828 0.962421 -0.968583 -0.876306
-0.158122 -0.615846 0.869789 -0.968583 -0.904827
-0.156348 -0.608938 0.766525 -0.968583 -0.929776
-0.153214 -0.596732 0.653841 -0.968583 -0.951056
-0.148907 -0.579956 0.533085 -0.968583 -0.968583
-0.143634 -0.559421 0.405724 -0.968583 -0.982287
-0.137622 -0.536006 0.273322 -0.968583 -0.992115
-0.13111 -0.510641 0.137519 -0.968583 -0.998027
-0.124345 -0.484292 1.43346e-06 -0.968583 -1
-0.117579 -0.457943 -0.137516 -0.968583 -0.998027
-0.111067 -0.432578 -0.27332 -0.968583 -0.992115
-0.105055 -0.409163 -0.405721 -0.968583 -0.982287
-0.0997823 -0.388628 -0.533082 -0.968583 -0.968583
-0.095475 -0.371852 -0.653839 -0.968583 -0.951057
-0.092341 -0.359646 -0.766523 -0.968583 -0.929777
-0.0905671 -0.352737 -0.869787 -0.968583 -0.904827
-0.0903151 -0.351756 -0.962419 -0.968583 -0.876307
-0.0917191 -0.357224 -1.04336 -0.968583 -0.844328
-0.0948826 -0.369545 -1.11174 -0.968583 -0.809017
-0.0998765 -0.388995 -1.16684 -0.968583 -0.770514
-0.106737 -0.415716 -1.20816 -0.968583 -0.728969
-0.115466 -0.449713 -1.23539 -0.968583 -0.684548
-0.126029 -0.490852 -1.24841 -0.968583 -0.637425
-0.138355 -0.53886 -1.24733 -0.968583 -0.587786
-0.15234 -0.593329 -1.23245 -0.968583 -0.535828
-0.167846 -0.653718 -1.20425 -0.968583 -0.481754
-0.184701 -0.719366 -1.1634 -0.968583 -0.42578
-0.202707 -0.789494 -1.11077 -0.968583 -0.368125
-0.221637 -0.863224 -1.04735 -0.968583 -0.309018
-0.241243 -0.939583 -0.974313 -0.968583 -0.248691
-0.261255 -1.01753 -0.892928 -0.968583 -0.187382
-0.281391 -1.09595 -0.804579 -0.968583 -0.125334
-0.301355 -1.17371 -0.710732 -0.968583 -0.0627915
-0.320847 -1.24962 -0.612909 -0.968583 -9.80385e-07
-0.339563 -1.32252 -0.512667 -0.968583 0.0627895
-0.357204 -1.39122 -0.411573 -0.968583 0.125332
-0.373477 -1.4546 -0.311177 -0.968583 0.18738
-0.388104 -1.51157 -0.212994 -0.968583 0.248689
-0.400822 -1.5611 -0.11847 -0.968583 0.309016
-0.411389 -1.60226 -0.0289703 -0.968583 0.368124
-0.419589 -1.6342 0.054248 -0.968583 0.425778
-0.425236 -1.65619 0.130054 -0.968583 0.481753
-0.428174 -1.66763 0.197457 -0.968583 0.535826
-0.428282 -1.66805 0.255628 -0.968583 0.587784
-0.425476 -1.65713 0.303905 -0.968583 0.637423
-0.419711 -1.63467 0.341805 -0.968583 0.684546
-0.410982 -1.60068 0.369031 -0.968583 0.728968
-0.399324 -1.55527 0.385477 -0.968583 0.770513
-0.384809 -1.49874 0.391224 -0.968583 0.809016
-0.367553 -1.43153 0.386541 -0.968583 0.844327
-0.347706 -1.35423 0.37188 -0.968583 0.876306
-0.325456 -1.26757 0.347862 -0.968583 0.904827
-0.301023 -1.17241 0.315273 -0.968583 0.929776
-0.27466 -1.06973 0.275043 -0.968583 0.951056
-0.246644 -0.960618 0.228237 -0.968583 0.968583
-0.217277 -0.846241 0.176029 -0.968583 0.982287
-0.18688 -0.727851 0.119687 -0.968583 0.992115
-0.155787 -0.606754 0.0605491 -0.968583 0.998027
-0.154508 -0.475528 0 -0.951057 1
-0.116046 -0.357153 -0.0644893 -0.951057 0.998027
-0.078004 -0.240072 -0.127525 -0.951057 0.992115
-0.0407985 -0.125565 -0.187679 -0.951057 0.982287
-0.00483237 -0.0148725 -0.24357 -0.951057 0.968583
--0.0295084 0.0908179 -0.293892 -0.951057 0.951057
--0.0618606 0.190388 -0.337432 -0.951057 0.929777
--0.0918887 0.282805 -0.373091 -0.951057 0.904827
--0.11929 0.367137 -0.399907 -0.951057 0.876307
--0.143797 0.442562 -0.417069 -0.951057 0.844328
--0.165183 0.508383 -0.423929 -0.951057 0.809017
--0.183265 0.564035 -0.420018 -0.951057 0.770513
--0.197905 0.609091 -0.405053 -0.951057 0.728969
--0.20901 0.64327 -0.378943 -0.951057 0.684547
--0.216538 0.666436 -0.34179 -0.951057 0.637424
--0.220491 0.678603 -0.293892 -0.951057 0.587785
--0.220922 0.679929 -0.235737 -0.951057 0.535827
--0.217928 0.670714 -0.167995 -0.951057 0.481754
--0.21165 0.651395 -0.091514 -0.951057 0.42578
--0.202273 0.622535 -0.00730108 -0.951057 0.368125
--0.190018 0.584817 0.0834889 -0.951057 0.309017
--0.17514 0.539029 0.179572 -0.951057 0.24869
--0.157927 0.486052 0.279555 -0.951057 0.187382
--0.138691 0.426848 0.381956 -0.951057 0.125334
--0.117763 0.362438 0.485229 -0.951057 0.0627908
--0.0954912 0.293893 0.587785 -0.951057 3.26795e-07
--0.072233 0.222311 0.688022 -0.951057 -0.0627902
--0.0483491 0.148804 0.784345 -0.951057 -0.125333
--0.0241987 0.0744762 0.875193 -0.951057 -0.187381
--0.000133649 0.00041133 0.959066 -0.951057 -0.24869
-0.0235071 -0.0723475 1.03455 -0.951057 -0.309017
-0.0464024 -0.142812 1.10032 -0.951057 -0.368124
-0.0682542 -0.210066 1.1552 -0.951057 -0.425779
-0.0887916 -0.273274 1.19816 -0.951057 -0.481753
-0.107775 -0.331699 1.2283 -0.951057 -0.535826
-0.125 -0.384711 1.24495 -0.951057 -0.587785
-0.140298 -0.431795 1.24758 -0.951057 -0.637424
-0.153543 -0.472559 1.2359 -0.951057 -0.684547
-0.164649 -0.506738 1.20979 -0.951057 -0.728968
-0.17357 -0.534197 1.16936 -0.951057 -0.770513
-0.180307 -0.554931 1.11491 -0.951057 -0.809017
-0.1849 -0.569066 1.04697 -0.951057 -0.844328
-0.18743 -0.576851 0.966244 -0.951057 -0.876306
-0.188016 -0.578655 0.873626 -0.951057 -0.904827
-0.186815 -0.57496 0.770189 -0.951057 -0.929776
-0.184017 -0.566347 0.657165 -0.951057 -0.951056
-0.179839 -0.55349 0.535924 -0.951057 -0.968583
-0.174527 -0.537142 0.40796 -0.951057 -0.982287
-0.168346 -0.518117 0.274865 -0.951057 -0.992115
-0.161575 -0.49728 0.138305 -0.951057 -0.998027
-0.154508 -0.475529 1.4417e-06 -0.951057 -1
-0.147441 -0.453778 -0.138303 -0.951057 -0.998027
-0.14067 -0.432941 -0.274862 -0.951057 -0.992115
-0.134489 -0.413916 -0.407958 -0.951057 -0.982287
-0.129177 -0.397567 -0.535922 -0.951057 -0.968583
-0.125 -0.38471 -0.657162 -0.951057 -0.951057
-0.122201 -0.376097 -0.770187 -0.951057 -0.929777
-0.121 -0.372401 -0.873624 -0.951057 -0.904827
-0.121586 -0.374206 -0.966242 -0.951057 -0.876307
-0.124116 -0.38199 -1.04697 -0.951057 -0.844328
-0.128708 -0.396125 -1.11491 -0.951057 -0.809017
-0.135445 -0.41686 -1.16935 -0.951057 -0.770514
-0.144367 -0.444318 -1.20979 -0.951057 -0.728969
-0.155473 -0.478497 -1.2359 -0.951057 -0.684548
-0.168718 -0.519261 -1.24758 -0.951057 -0.637425
-0.184016 -0.566345 -1.24495 -0.951057 -0.587786
-0.201241 -0.619357 -1.2283 -0.951057 -0.535828
-0.220224 -0.677782 -1.19816 -0.951057 -0.481754
-0.240761 -0.74099 -1.1552 -0.951057 -0.42578
-0.262613 -0.808243 -1.10032 -0.951057 -0.368125
-0.285508 -0.878708 -1.03455 -0.951057 -0.309018
-0.309149 -0.951467 -0.959067 -0.951057 -0.248691
-0.333214 -1.02553 -0.875195 -0.951057 -0.187382
-0.357365 -1.09986 -0.784347 -0.951057 -0.125334
-0.381248 -1.17337 -0.688024 -0.951057 -0.0627915
-0.404507 -1.24495 -0.587787 -0.951057 -9.80385e-07
-0.426778 -1.31349 -0.485231 -0.951057 0.0627895
-0.447706 -1.3779 -0.381958 -0.951057 0.125332
-0.466943 -1.43711 -0.279557 -0.951057 0.18738
-0.484156 -1.49008 -0.179574 -0.951057 0.248689
-0.499034 -1.53587 -0.0834909 -0.951057 0.309016
-0.511289 -1.57359 0.00729925 -0.951057 0.368124
-0.520666 -1.60245 0.0915123 -0.951057 0.425778
-0.526943 -1.62177 0.167994 -0.951057 0.481753
-0.529938 -1.63099 0.235735 -0.951057 0.535826
-0.529507 -1.62966 0.293891 -0.951057 0.587784
-0.525554 -1.61749 0.341789 -0.951057 0.637423
-0.518026 -1.59433 0.378942 -0.951057 0.684546
-0.506921 -1.56015 0.405053 -0.951057 0.728968
-0.492282 -1.51509 0.420018 -0.951057 0.770513
-0.474199 -1.45944 0.423929 -0.951057 0.809016
-0.452813 -1.39362 0.417069 -0.951057 0.844327
-0.428306 -1.3182 0.399908 -0.951057 0.876306
-0.400905 -1.23386 0.373092 -0.951057 0.904827
-0.370877 -1.14145 0.337432 -0.951057 0.929776
-0.338525 -1.04188 0.293893 -0.951057 0.951056
-0.304184 -0.936187 0.243571 -0.951057 0.968583
-0.268218 -0.825494 0.18768 -0.951057 0.982287
-0.231013 -0.710987 0.127526 -0.951057 0.992115
-0.192971 -0.593907 0.0644906 -0.951057 0.998027
-0.184062 -0.464888 0 -0.929777 1
-0.139011 -0.351102 -0.0683671 -0.929777 0.998027
-0.0944439 -0.238539 -0.135239 -0.929777 0.992115
-0.0508393 -0.128406 -0.199145 -0.929777 0.982287
-0.00866108 -0.0218755 -0.258664 -0.929777 0.968583
--0.0316462 0.0799295 -0.312452 -0.929777 0.951057
--0.0696642 0.175952 -0.359259 -0.929777 0.929777
--0.105006 0.265216 -0.397953 -0.929777 0.904827
--0.137322 0.346836 -0.427541 -0.929777 0.876307
--0.166304 0.420036 -0.447185 -0.929777 0.844328
--0.191689 0.484152 -0.456216 -0.929777 0.809017
--0.213264 0.538646 -0.454145 -0.929777 0.770513
--0.230869 0.58311 -0.440675 -0.929777 0.728969
--0.244394 0.61727 -0.415707 -0.929777 0.684547
--0.253786 0.640992 -0.379338 -0.929777 0.637424
--0.259047 0.65428 -0.331865 -0.929777 0.587785
--0.260232 0.657274 -0.273782 -0.929777 0.535827
--0.257451 0.650248 -0.205769 -0.929777 0.481754
--0.250861 0.633604 -0.128688 -0.929777 0.42578
--0.240669 0.607863 -0.0435634 -0.929777 0.368125
--0.227127 0.573658 0.0484275 -0.929777 0.309017
--0.210523 0.531723 0.145976 -0.929777 0.24869
--0.191184 0.482877 0.247659 -0.929777 0.187382
--0.169463 0.428017 0.351965 -0.929777 0.125334
--0.145739 0.368095 0.457314 -0.929777 0.0627908
--0.120406 0.304112 0.562083 -0.929777 3.26795e-07
--0.0938718 0.237094 0.664635 -0.929777 -0.0627902
--0.0665473 0.16808 0.763338 -0.929777 -0.125333
--0.0388422 0.0981045 0.856596 -0.929777 -0.187381
--0.011158 0.028182 0.942873 -0.929777 -0.24869
-0.0161179 -0.0407094 1.02072 -0.929777 -0.309017
-0.0426186 -0.107643 1.08879 -0.929777 -0.368124
-0.0680027 -0.171756 1.14586 -0.929777 -0.425779
-0.0919597 -0.232264 1.19088 -0.929777 -0.481753
-0.114214 -0.288474 1.22295 -0.929777 -0.535826
-0.134531 -0.339788 1.24134 -0.929777 -0.587785
-0.152716 -0.385719 1.24552 -0.929777 -0.637424
-0.168622 -0.425892 1.23519 -0.929777 -0.684547
-0.182147 -0.460053 1.21022 -0.929777 -0.728968
-0.193238 -0.488065 1.17072 -0.929777 -0.770513
-0.201889 -0.509915 1.11699 -0.929777 -0.809017
-0.208143 -0.525711 1.04954 -0.929777 -0.844328
-0.212089 -0.535676 0.969114 -0.929777 -0.876306
-0.213857 -0.540144 0.876601 -0.929777 -0.904827
-0.213624 -0.539554 0.773093 -0.929777 -0.929776
-0.211598 -0.534438 0.65984 -0.929777 -0.951056
-0.208026 -0.525416 0.538235 -0.929777 -0.968583
-0.203181 -0.513179 0.409794 -0.929777 -0.982287
-0.19736 -0.498476 0.276136 -0.929777 -0.992115
-0.190878 -0.482103 0.138956 -0.929777 -0.998027
-0.184062 -0.464889 1.44851e-06 -0.929777 -1
-0.177246 -0.447674 -0.138953 -0.929777 -0.998027
-0.170764 -0.431301 -0.276133 -0.929777 -0.992115
-0.164942 -0.416598 -0.409791 -0.929777 -0.982287
-0.160097 -0.404361 -0.538232 -0.929777 -0.968583
-0.156525 -0.395339 -0.659838 -0.929777 -0.951057
-0.1545 -0.390223 -0.773091 -0.929777 -0.929777
-0.154266 -0.389633 -0.876599 -0.929777 -0.904827
-0.156035 -0.394101 -0.969112 -0.929777 -0.876307
-0.15998 -0.404065 -1.04954 -0.929777 -0.844328
-0.166234 -0.419861 -1.11698 -0.929777 -0.809017
-0.174885 -0.441712 -1.17072 -0.929777 -0.770514
-0.185976 -0.469724 -1.21022 -0.929777 -0.728969
-0.199501 -0.503884 -1.23519 -0.929777 -0.684548
-0.215407 -0.544057 -1.24552 -0.929777 -0.637425
-0.233592 -0.589988 -1.24134 -0.929777 -0.587786
-0.253909 -0.641302 -1.22295 -0.929777 -0.535828
-0.276163 -0.697511 -1.19089 -0.929777 -0.481754
-0.30012 -0.75802 -1.14587 -0.929777 -0.42578
-0.325504 -0.822133 -1.08879 -0.929777 -0.368125
-0.352005 -0.889066 -1.02072 -0.929777 -0.309018
-0.379281 -0.957957 -0.942875 -0.929777 -0.248691
-0.406965 -1.02788 -0.856598 -0.929777 -0.187382
-0.43467 -1.09786 -0.76334 -0.929777 -0.125334
-0.461995 -1.16687 -0.664637 -0.929777 -0.0627915
-0.488529 -1.23389 -0.562085 -0.929777 -9.80385e-07
-0.513862 -1.29787 -0.457316 -0.929777 0.0627895
-0.537586 -1.35779 -0.351967 -0.929777 0.125332
-0.559307 -1.41265 -0.247661 -0.929777 0.18738
-0.578647 -1.4615 -0.145978 -0.929777 0.248689
-0.59525 -1.50343 -0.0484295 -0.929777 0.309016
-0.608792 -1.53764 0.0435616 -0.929777 0.368124
-0.618984 -1.56338 0.128686 -0.929777 0.425778
-0.625574 -1.58002 0.205768 -0.929777 0.481753
-0.628356 -1.58705 0.27378 -0.929777 0.535826
-0.627171 -1.58406 0.331864 -0.929777 0.587784
-0.62191 -1.57077 0.379337 -0.929777 0.637423
-0.612517 -1.54705 0.415706 -0.929777 0.684546
-0.598993 -1.51289 0.440675 -0.929777 0.728968
-0.581388 -1.46842 0.454145 -0.929777 0.770513
-0.559813 -1.41393 0.456216 -0.929777 0.809016
-0.534428 -1.34981 0.447185 -0.929777 0.844327
-0.505446 -1.27661 0.427542 -0.929777 0.876306
-0.47313 -1.19499 0.397953 -0.929777 0.904827
-0.437789 -1.10573 0.359259 -0.929777 0.929776
-0.399771 -1.00971 0.312453 -0.929777 0.951056
-0.359463 -0.907904 0.258666 -0.929777 0.968583
-0.317285 -0.801373 0.199146 -0.929777 0.982287
-0.273681 -0.69124 0.13524 -0.929777 0.992115
-0.229114 -0.578677 0.0683685 -0.929777 0.998027
-0.212889 -0.452414 0 -0.904828 1
-0.161722 -0.343678 -0.0721774 -0.904828 0.998027
-0.111095 -0.23609 -0.142819 -0.904828 0.992115
-0.061541 -0.130782 -0.210414 -0.904828 0.982287
-0.013577 -0.0288528 -0.273503 -0.904828 0.968583
--0.0323008 0.0686428 -0.330704 -0.904828 0.951057
--0.0756253 0.160712 -0.380731 -0.904828 0.929777
--0.115965 0.246438 -0.422421 -0.904828 0.904827
--0.152928 0.324988 -0.454753 -0.904828 0.876307
--0.186169 0.395631 -0.47686 -0.904828 0.844328
--0.215395 0.457739 -0.488052 -0.904828 0.809017
--0.240365 0.510803 -0.487823 -0.904828 0.770513
--0.260896 0.554435 -0.475863 -0.904828 0.728969
--0.276866 0.588371 -0.45206 -0.904828 0.684547
--0.28821 0.612479 -0.41651 -0.904828 0.637424
--0.294927 0.626754 -0.36951 -0.904828 0.587785
--0.297074 0.631317 -0.311557 -0.904828 0.535827
--0.294768 0.626416 -0.243341 -0.904828 0.481754
--0.288181 0.612417 -0.165735 -0.904828 0.42578
--0.277537 0.589798 -0.0797828 -0.904828 0.368125
--0.263112 0.559143 0.0133183 -0.904828 0.309017
--0.245222 0.521125 0.112235 -0.904828 0.24869
--0.224225 0.476504 0.215518 -0.904828 0.187382
--0.20051 0.426106 0.321626 -0.904828 0.125334
--0.174492 0.370815 0.428947 -0.904828 0.0627908
--0.146607 0.311557 0.535827 -0.904828 3.26795e-07
--0.117304 0.249284 0.640592 -0.904828 -0.0627902
--0.0870357 0.184961 0.741577 -0.904828 -0.125333
--0.0562545 0.119547 0.837153 -0.904828 -0.187381
--0.0254042 0.0539867 0.925751 -0.904828 -0.24869
-0.00508703 -0.0108105 1.00588 -0.904828 -0.309017
-0.0348127 -0.073981 1.07618 -0.904828 -0.368124
-0.0633946 -0.134721 1.1354 -0.904828 -0.425779
-0.0904879 -0.192297 1.18244 -0.904828 -0.481753
-0.115787 -0.24606 1.21638 -0.904828 -0.535826
-0.139028 -0.29545 1.2365 -0.904828 -0.587785
-0.159995 -0.340007 1.24223 -0.904828 -0.637424
-0.178521 -0.379377 1.23326 -0.904828 -0.684547
-0.19449 -0.413314 1.20946 -0.904828 -0.728968
-0.20784 -0.441684 1.17092 -0.904828 -0.770513
-0.21856 -0.464465 1.11796 -0.904828 -0.809017
-0.226692 -0.481746 1.05108 -0.904828 -0.844328
-0.232328 -0.493724 0.971027 -0.904828 -0.876306
-0.235611 -0.5007 0.878711 -0.904828 -0.904827
-0.236725 -0.503067 0.775234 -0.904828 -0.929776
-0.235898 -0.50131 0.661864 -0.904828 -0.951056
-0.233395 -0.495991 0.540014 -0.904828 -0.968583
-0.229512 -0.487738 0.411223 -0.904828 -0.982287
-0.224569 -0.477236 0.277134 -0.904828 -0.992115
-0.21891 -0.465209 0.139469 -0.904828 -0.998027
-0.212889 -0.452414 1.4539e-06 -0.904828 -1
-0.206868 -0.439619 -0.139466 -0.904828 -0.998027
-0.201209 -0.427592 -0.277131 -0.904828 -0.992115
-0.196267 -0.417089 -0.41122 -0.904828 -0.982287
-0.192383 -0.408836 -0.540011 -0.904828 -0.968583
-0.18988 -0.403517 -0.661862 -0.904828 -0.951057
-0.189054 -0.40176 -0.775232 -0.904828 -0.929777
-0.190168 -0.404128 -0.878709 -0.904828 -0.904827
-0.19345 -0.411103 -0.971025 -0.904828 -0.876307
-0.199086 -0.423081 -1.05108 -0.904828 -0.844328
-0.207218 -0.440362 -1.11795 -0.904828 -0.809017
-0.217938 -0.463143 -1.17092 -0.904828 -0.770514
-0.231288 -0.491513 -1.20946 -0.904828 -0.728969
-0.247257 -0.52545 -1.23326 -0.904828 -0.684548
-0.265783 -0.564819 -1.24223 -0.904828 -0.637425
-0.28675 -0.609377 -1.2365 -0.904828 -0.587786
-0.309991 -0.658767 -1.21638 -0.904828 -0.535828
-0.33529 -0.712529 -1.18244 -0.904828 -0.481754
-0.362383 -0.770106 -1.1354 -0.904828 -0.42578
-0.390965 -0.830845 -1.07618 -0.904828 -0.368125
-0.420691 -0.894016 -1.00589 -0.904828 -0.309018
-0.451182 -0.958813 -0.925752 -0.904828 -0.248691
-0.482032 -1.02437 -0.837155 -0.904828 -0.187382
-0.512813 -1.08979 -0.741579 -0.904828 -0.125334
-0.543082 -1.15411 -0.640594 -0.904828 -0.0627915
-0.572385 -1.21638 -0.535829 -0.904828 -9.80385e-07
-0.60027 -1.27564 -0.428949 -0.904828 0.0627895
-0.626287 -1.33093 -0.321628 -0.904828 0.125332
-0.650003 -1.38133 -0.21552 -0.904828 0.18738
-0.671 -1.42595 -0.112237 -0.904828 0.248689
-0.68889 -1.46397 -0.0133203 -0.904828 0.309016
-0.703315 -1.49463 0.079781 -0.904828 0.368124
-0.713959 -1.51724 0.165733 -0.904828 0.425778
-0.720546 -1.53124 0.243339 -0.904828 0.481753
-0.722853 -1.53614 0.311555 -0.904828 0.535826
-0.720705 -1.53158 0.369509 -0.904828 0.587784
-0.713989 -1.51731 0.41651 -0.904828 0.637423
-0.702644 -1.4932 0.45206 -0.904828 0.684546
-0.686675 -1.45926 0.475862 -0.904828 0.728968
-0.666144 -1.41563 0.487823 -0.904828 0.770513
-0.641174 -1.36257 0.488052 -0.904828 0.809016
-0.611948 -1.30046 0.47686 -0.904828 0.844327
-0.578707 -1.22982 0.454753 -0.904828 0.876306
-0.541744 -1.15127 0.422422 -0.904828 0.904827
-0.501404 -1.06554 0.380732 -0.904828 0.929776
-0.45808 -0.973472 0.330705 -0.904828 0.951056
-0.412202 -0.875977 0.273504 -0.904828 0.968583
-0.364238 -0.774048 0.210415 -0.904828 0.982287
-0.314684 -0.668739 0.14282 -0.904828 0.992115
-0.264057 -0.561152 0.0721789 -0.904828 0.998027
-0.240876 -0.438154 0 -0.876307 1
-0.184104 -0.334884 -0.0759165 -0.876307 0.998027
-0.127918 -0.232683 -0.150258 -0.876307 0.992115
-0.0728999 -0.132605 -0.221475 -0.876307 0.982287
-0.0196119 -0.035674 -0.288072 -0.876307 0.968583
--0.031406 0.0571274 -0.348629 -0.876307 0.951057
--0.0796449 0.144874 -0.401827 -0.876307 0.929777
--0.124634 0.226709 -0.446473 -0.876307 0.904827
--0.165946 0.301856 -0.481515 -0.876307 0.876307
--0.203205 0.369629 -0.506064 -0.876307 0.844328
--0.236087 0.429442 -0.519407 -0.876307 0.809017
--0.264329 0.480815 -0.52102 -0.876307 0.770513
--0.287729 0.523379 -0.51058 -0.876307 0.728969
--0.30615 0.556885 -0.487968 -0.876307 0.684547
--0.319517 0.5812 -0.453272 -0.876307 0.637424
--0.327824 0.596312 -0.406791 -0.876307 0.587785
--0.331129 0.602324 -0.349024 -0.876307 0.535827
--0.329554 0.599457 -0.280672 -0.876307 0.481754
--0.323278 0.588042 -0.202618 -0.876307 0.42578
--0.312542 0.568514 -0.115923 -0.876307 0.368125
--0.297637 0.541401 -0.0218041 -0.876307 0.309017
--0.278903 0.507323 0.0783834 -0.876307 0.24869
--0.25672 0.466972 0.183165 -0.876307 0.187382
--0.231505 0.421108 0.29097 -0.876307 0.125334
--0.203706 0.370541 0.400157 -0.876307 0.0627908
--0.173788 0.316121 0.509041 -0.876307 3.26795e-07
--0.142234 0.258724 0.615916 -0.876307 -0.0627902
--0.109532 0.199238 0.719085 -0.876307 -0.125333
--0.0761676 0.138549 0.816885 -0.876307 -0.187381
--0.0426195 0.0775248 0.907714 -0.876307 -0.24869
--0.00934946 0.0170066 0.990058 -0.876307 -0.309017
-0.0232038 -0.0422076 1.06251 -0.876307 -0.368124
-0.0546311 -0.0993738 1.12381 -0.876307 -0.425779
-0.0845592 -0.153813 1.17282 -0.876307 -0.481753
-0.112656 -0.204921 1.20862 -0.876307 -0.535826
-0.138635 -0.252177 1.23044 -0.876307 -0.587785
-0.16226 -0.295151 1.23772 -0.876307 -0.637424
-0.183347 -0.333508 1.23012 -0.876307 -0.684547
-0.201767 -0.367014 1.20751 -0.876307 -0.728968
-0.217448 -0.395537 1.16997 -0.876307 -0.770513
-0.230372 -0.419047 1.11782 -0.876307 -0.809017
-0.240581 -0.437616 1.05158 -0.876307 -0.844328
-0.248167 -0.451414 0.971982 -0.876307 -0.876306
-0.253275 -0.460707 0.879953 -0.876307 -0.904827
-0.256101 -0.465847 0.77661 -0.876307 -0.929776
-0.256882 -0.467268 0.663235 -0.876307 -0.951056
-0.255895 -0.465473 0.54126 -0.876307 -0.968583
-0.253452 -0.461029 0.412246 -0.876307 -0.982287
-0.249892 -0.454553 0.277859 -0.876307 -0.992115
-0.245575 -0.446701 0.139844 -0.876307 -0.998027
-0.240876 -0.438154 1.45785e-06 -0.876307 -1
-0.236178 -0.429607 -0.139841 -0.876307 -0.998027
-0.231861 -0.421754 -0.277856 -0.876307 -0.992115
-0.228301 -0.415279 -0.412244 -0.876307 -0.982287
-0.225858 -0.410835 -0.541258 -0.876307 -0.968583
-0.224871 -0.40904 -0.663233 -0.876307 -0.951057
-0.225652 -0.41046 -0.776608 -0.876307 -0.929777
-0.228477 -0.4156 -0.879951 -0.876307 -0.904827
-0.233586 -0.424893 -0.97198 -0.876307 -0.876307
-0.241172 -0.438691 -1.05158 -0.876307 -0.844328
-0.25138 -0.45726 -1.11782 -0.876307 -0.809017
-0.264305 -0.48077 -1.16997 -0.876307 -0.770514
-0.279985 -0.509293 -1.20751 -0.876307 -0.728969
-0.298405 -0.542799 -1.23012 -0.876307 -0.684548
-0.319492 -0.581155 -1.23772 -0.876307 -0.637425
-0.343117 -0.624129 -1.23044 -0.876307 -0.587786
-0.369096 -0.671385 -1.20862 -0.876307 -0.535828
-0.397193 -0.722493 -1.17283 -0.876307 -0.481754
-0.427121 -0.776932 -1.12381 -0.876307 -0.42578
-0.458548 -0.834098 -1.06251 -0.876307 -0.368125
-0.491101 -0.893313 -0.99006 -0.876307 -0.309018
-0.524372 -0.953831 -0.907716 -0.876307 -0.248691
-0.55792 -1.01485 -0.816887 -0.876307 -0.187382
-0.591284 -1.07554 -0.719087 -0.876307 -0.125334
-0.623987 -1.13503 -0.615919 -0.876307 -0.0627915
-0.655541 -1.19243 -0.509044 -0.876307 -9.80385e-07
-0.685458 -1.24685 -0.40016 -0.876307 0.0627895
-0.713258 -1.29741 -0.290972 -0.876307 0.125332
-0.738472 -1.34328 -0.183167 -0.876307 0.18738
-0.760655 -1.38363 -0.0783856 -0.876307 0.248689
-0.77939 -1.41771 0.0218021 -0.876307 0.309016
-0.794295 -1.44482 0.115922 -0.876307 0.368124
-0.805031 -1.46435 0.202617 -0.876307 0.425778
-0.811306 -1.47576 0.28067 -0.876307 0.481753
-0.812882 -1.47863 0.349023 -0.876307 0.535826
-0.809577 -1.47262 0.40679 -0.876307 0.587784
-0.80127 -1.45751 0.453271 -0.876307 0.637423
-0.787903 -1.43319 0.487967 -0.876307 0.684546
-0.769483 -1.39969 0.51058 -0.876307 0.728968
-0.746083 -1.35712 0.52102 -0.876307 0.770513
-0.717841 -1.30575 0.519407 -0.876307 0.809016
-0.684958 -1.24594 0.506065 -0.876307 0.844327
-0.6477 -1.17816 0.481516 -0.876307 0.876306
-0.606388 -1.10302 0.446474 -0.876307 0.904827
-0.561399 -1.02118 0.401828 -0.876307 0.929776
-0.51316 -0.933436 0.34863 -0.876307 0.951056
-0.462142 -0.840635 0.288073 -0.876307 0.968583
-0.408854 -0.743704 0.221477 -0.876307 0.982287
-0.353836 -0.643626 0.150259 -0.876307 0.992115
-0.29765 -0.541425 0.0759181 -0.876307 0.998027
-0.267913 -0.422164 0 -0.844329 1
-0.206077 -0.324726 -0.0795807 -0.844329 0.998027
-0.144867 -0.228275 -0.157549 -0.844329 0.992115
-0.0849022 -0.133785 -0.232318 -0.844329 0.982287
-0.0267831 -0.0422035 -0.302356 -0.844329 0.968583
--0.0289139 0.0455612 -0.36621 -0.844329 0.951057
--0.0816455 0.128653 -0.422527 -0.844329 0.929777
--0.130908 0.206279 -0.470085 -0.844329 0.904827
--0.176245 0.277718 -0.507803 -0.844329 0.876307
--0.217252 0.342335 -0.534769 -0.844329 0.844328
--0.253582 0.399583 -0.550249 -0.844329 0.809017
--0.284952 0.449014 -0.553703 -0.844329 0.770513
--0.311141 0.490282 -0.544794 -0.844329 0.728969
--0.331999 0.523149 -0.523394 -0.844329 0.684547
--0.347444 0.547485 -0.489587 -0.844329 0.637424
--0.357461 0.56327 -0.44367 -0.844329 0.587785
--0.362108 0.570592 -0.386147 -0.844329 0.535827
--0.361507 0.569645 -0.317726 -0.844329 0.481754
--0.355844 0.560722 -0.239302 -0.844329 0.42578
--0.345368 0.544214 -0.15195 -0.844329 0.368125
--0.330382 0.5206 -0.056905 -0.844329 0.309017
--0.311241 0.490439 0.0444547 -0.844329 0.24869
--0.288344 0.454359 0.150631 -0.844329 0.187382
--0.262128 0.413049 0.260026 -0.844329 0.125334
--0.233061 0.367247 0.370973 -0.844329 0.0627908
--0.201635 0.317727 0.481754 -0.844329 3.26795e-07
--0.168355 0.265286 0.590633 -0.844329 -0.0627902
--0.133736 0.210735 0.695883 -0.844329 -0.125333
--0.0982916 0.154883 0.79581 -0.844329 -0.187381
--0.0625251 0.098524 0.888782 -0.844329 -0.24869
--0.0269249 0.042427 0.973255 -0.844329 -0.309017
-0.00804483 -0.0126767 1.0478 -0.844329 -0.368124
-0.0419508 -0.066104 1.11111 -0.844329 -0.425779
-0.0743967 -0.117231 1.16205 -0.844329 -0.481753
-0.105029 -0.1655 1.19966 -0.844329 -0.535826
-0.133543 -0.210431 1.22316 -0.844329 -0.587785
-0.159684 -0.251622 1.23198 -0.844329 -0.637424
-0.183254 -0.288763 1.22576 -0.844329 -0.684547
-0.204112 -0.32163 1.20436 -0.844329 -0.728968
-0.222176 -0.350094 1.16787 -0.844329 -0.770513
-0.237422 -0.374118 1.11659 -0.844329 -0.809017
-0.249885 -0.393757 1.05104 -0.844329 -0.844328
-0.259658 -0.409157 0.971978 -0.844329 -0.876306
-0.266887 -0.420547 0.880328 -0.844329 -0.904827
-0.271767 -0.428238 0.77722 -0.844329 -0.929776
-0.274543 -0.432612 0.663951 -0.844329 -0.951056
-0.275499 -0.434119 0.541972 -0.844329 -0.968583
-0.274955 -0.433261 0.412863 -0.844329 -0.982287
-0.273259 -0.430588 0.27831 -0.844329 -0.992115
-0.270783 -0.426687 0.140081 -0.844329 -0.998027
-0.267913 -0.422164 1.46036e-06 -0.844329 -1
-0.265043 -0.417642 -0.140078 -0.844329 -0.998027
-0.262567 -0.41374 -0.278307 -0.844329 -0.992115
-0.260871 -0.411068 -0.41286 -0.844329 -0.982287
-0.260327 -0.41021 -0.54197 -0.844329 -0.968583
-0.261282 -0.411716 -0.663949 -0.844329 -0.951057
-0.264058 -0.416091 -0.777217 -0.844329 -0.929777
-0.268939 -0.423781 -0.880325 -0.844329 -0.904827
-0.276167 -0.435171 -0.971976 -0.844329 -0.876307
-0.28594 -0.450571 -1.05104 -0.844329 -0.844328
-0.298404 -0.47021 -1.11658 -0.844329 -0.809017
-0.31365 -0.494234 -1.16787 -0.844329 -0.770514
-0.331713 -0.522698 -1.20436 -0.844329 -0.728969
-0.352571 -0.555565 -1.22576 -0.844329 -0.684548
-0.376141 -0.592705 -1.23198 -0.844329 -0.637425
-0.402282 -0.633897 -1.22316 -0.844329 -0.587786
-0.430796 -0.678827 -1.19966 -0.844329 -0.535828
-0.461429 -0.727097 -1.16205 -0.844329 -0.481754
-0.493874 -0.778223 -1.11111 -0.844329 -0.42578
-0.52778 -0.831651 -1.0478 -0.844329 -0.368125
-0.56275 -0.886754 -0.973257 -0.844329 -0.309018
-0.59835 -0.942851 -0.888784 -0.844329 -0.248691
-0.634117 -0.999211 -0.795812 -0.844329 -0.187382
-0.669562 -1.05506 -0.695885 -0.844329 -0.125334
-0.70418 -1.10961 -0.590635 -0.844329 -0.0627915
-0.73746 -1.16205 -0.481756 -0.844329 -9.80385e-07
-0.768887 -1.21157 -0.370975 -0.844329 0.0627895
-0.797954 -1.25738 -0.260029 -0.844329 0.125332
-0.82417 -1.29869 -0.150633 -0.844329 0.18738
-0.847067 -1.33477 -0.0444568 -0.844329 0.248689
-0.866208 -1.36493 0.0569029 -0.844329 0.309016
-0.881194 -1.38854 0.151948 -0.844329 0.368124
-0.89167 -1.40505 0.2393 -0.844329 0.425778
-0.897332 -1.41397 0.317724 -0.844329 0.481753
-0.897934 -1.41492 0.386146 -0.844329 0.535826
-0.893287 -1.4076 0.443669 -0.844329 0.587784
-0.88327 -1.39181 0.489586 -0.844329 0.637423
-0.867826 -1.36748 0.523393 -0.844329 0.684546
-0.846968 -1.33461 0.544794 -0.844329 0.728968
-0.820778 -1.29334 0.553703 -0.844329 0.770513
-0.789409 -1.24391 0.550249 -0.844329 0.809016
-0.753079 -1.18666 0.534769 -0.844329 0.844327
-0.712072 -1.12205 0.507804 -0.844329 0.876306
-0.666735 -1.05061 0.470086 -0.844329 0.904827
-0.617472 -0.972983 0.422529 -0.844329 0.929776
-0.564741 -0.889891 0.366211 -0.844329 0.951056
-0.509044 -0.802127 0.302358 -0.844329 0.968583
-0.450925 -0.710546 0.23232 -0.844329 0.982287
-0.39096 -0.616056 0.15755 -0.844329 0.992115
-0.32975 -0.519605 0.0795824 -0.844329 0.998027
-0.293892 -0.404509 0 -0.809018 1
-0.227563 -0.313214 -0.0831663 -0.809018 0.998027
-0.16189 -0.222823 -0.164684 -0.809018 0.992115
-0.0975234 -0.13423 -0.242932 -0.809018 0.982287
-0.0350931 -0.0483016 -0.316343 -0.809018 0.968583
--0.0247958 0.0341286 -0.383429 -0.809018 0.951057
--0.0815724 0.112275 -0.44281 -0.809018 0.929777
--0.134707 0.185409 -0.493232 -0.809018 0.904827
--0.183719 0.252869 -0.53359 -0.809018 0.876307
--0.228183 0.314067 -0.562946 -0.809018 0.844328
--0.267731 0.368501 -0.580548 -0.809018 0.809017
--0.302061 0.415753 -0.585839 -0.809018 0.770513
--0.330941 0.455502 -0.57847 -0.809018 0.728969
--0.354205 0.487523 -0.558303 -0.809018 0.684547
--0.371763 0.511689 -0.525418 -0.809018 0.637424
--0.383594 0.527973 -0.480111 -0.809018 0.587785
--0.389751 0.536447 -0.42289 -0.809018 0.535827
--0.390355 0.537278 -0.354466 -0.809018 0.481754
--0.385594 0.530726 -0.275749 -0.809018 0.42578
--0.375721 0.517136 -0.187826 -0.809018 0.368125
--0.361045 0.496936 -0.0919497 -0.809018 0.309017
--0.341929 0.470626 0.010482 -0.809018 0.24869
--0.318785 0.43877 0.117948 -0.809018 0.187382
--0.29206 0.401988 0.228826 -0.809018 0.125334
--0.262239 0.360942 0.341422 -0.809018 0.0627908
--0.229828 0.316331 0.45399 -0.809018 3.26795e-07
--0.195349 0.268876 0.564767 -0.809018 -0.0627902
--0.159335 0.219307 0.671995 -0.809018 -0.125333
--0.122317 0.168356 0.77395 -0.809018 -0.187381
--0.0848186 0.116743 0.868973 -0.809018 -0.24869
--0.0473452 0.0651652 0.955491 -0.809018 -0.309017
--0.0103796 0.0142863 1.03205 -0.809018 -0.368124
-0.0256269 -0.0352724 1.09732 -0.809018 -0.425779
-0.0602609 -0.0829422 1.15014 -0.809018 -0.481753
-0.0931529 -0.128214 1.18952 -0.809018 -0.535826
-0.123982 -0.170647 1.21468 -0.809018 -0.587785
-0.152481 -0.209873 1.22503 -0.809018 -0.637424
-0.178439 -0.245601 1.22019 -0.809018 -0.684547
-0.201704 -0.277622 1.20003 -0.809018 -0.728968
-0.222183 -0.305809 1.16461 -0.809018 -0.770513
-0.239846 -0.33012 1.11425 -0.809018 -0.809017
-0.254721 -0.350594 1.04947 -0.809018 -0.844328
-0.266896 -0.367352 0.971014 -0.809018 -0.876306
-0.276514 -0.380589 0.879833 -0.809018 -0.904827
-0.283769 -0.390575 0.777062 -0.809018 -0.929776
-0.288904 -0.397643 0.664012 -0.809018 -0.951056
-0.292204 -0.402185 0.54215 -0.809018 -0.968583
-0.293991 -0.404644 0.413072 -0.809018 -0.982287
-0.294615 -0.405504 0.278486 -0.809018 -0.992115
-0.294453 -0.40528 0.14018 -0.809018 -0.998027
-0.293892 -0.404509 1.46143e-06 -0.809018 -1
-0.293332 -0.403738 -0.140178 -0.809018 -0.998027
-0.293169 -0.403514 -0.278483 -0.809018 -0.992115
-0.293794 -0.404373 -0.413069 -0.809018 -0.982287
-0.295581 -0.406833 -0.542147 -0.809018 -0.968583
-0.298881 -0.411375 -0.66401 -0.809018 -0.951057
-0.304016 -0.418442 -0.77706 -0.809018 -0.929777
-0.31127 -0.428428 -0.879831 -0.809018 -0.904827
-0.320888 -0.441665 -0.971012 -0.809018 -0.876307
-0.333063 -0.458423 -1.04947 -0.809018 -0.844328
-0.347938 -0.478897 -1.11425 -0.809018 -0.809017
-0.365601 -0.503208 -1.16461 -0.809018 -0.770514
-0.38608 -0.531395 -1.20003 -0.809018 -0.728969
-0.409345 -0.563416 -1.22019 -0.809018 -0.684548
-0.435302 -0.599144 -1.22503 -0.809018 -0.637425
-0.463801 -0.638369 -1.21468 -0.809018 -0.587786
-0.494631 -0.680802 -1.18952 -0.809018 -0.535828
-0.527523 -0.726074 -1.15014 -0.809018 -0.481754
-0.562157 -0.773744 -1.09732 -0.809018 -0.42578
-0.598163 -0.823303 -1.03205 -0.809018 -0.368125
-0.635129 -0.874182 -0.955493 -0.809018 -0.309018
-0.672602 -0.92576 -0.868975 -0.809018 -0.248691
-0.710101 -0.977373 -0.773952 -0.809018 -0.187382
-0.747119 -1.02832 -0.671997 -0.809018 -0.125334
-0.783133 -1.07789 -0.56477 -0.809018 -0.0627915
-0.817611 -1.12535 -0.453993 -0.809018 -9.80385e-07
-0.850023 -1.16996 -0.341424 -0.809018 0.0627895
-0.879844 -1.211 -0.228829 -0.809018 0.125332
-0.906568 -1.24779 -0.11795 -0.809018 0.18738
-0.929713 -1.27964 -0.0104842 -0.809018 0.248689
-0.948829 -1.30595 0.0919476 -0.809018 0.309016
-0.963505 -1.32615 0.187824 -0.809018 0.368124
-0.973378 -1.33974 0.275747 -0.809018 0.425778
-0.978139 -1.3463 0.354465 -0.809018 0.481753
-0.977535 -1.34547 0.422888 -0.809018 0.535826
-0.971379 -1.33699 0.48011 -0.809018 0.587784
-0.959547 -1.32071 0.525417 -0.809018 0.637423
-0.94199 -1.29654 0.558302 -0.809018 0.684546
-0.918726 -1.26452 0.57847 -0.809018 0.728968
-0.889846 -1.22477 0.585839 -0.809018 0.770513
-0.855516 -1.17752 0.580548 -0.809018 0.809016
-0.815968 -1.12309 0.562946 -0.809018 0.844327
-0.771505 -1.06189 0.53359 -0.809018 0.876306
-0.722493 -0.994428 0.493233 -0.809018 0.904827
-0.669358 -0.921294 0.442812 -0.809018 0.929776
-0.612581 -0.843148 0.383431 -0.809018 0.951056
-0.552693 -0.760718 0.316344 -0.809018 0.968583
-0.490262 -0.67479 0.242933 -0.809018 0.982287
-0.425896 -0.586196 0.164686 -0.809018 0.992115
-0.360223 -0.495806 0.0831681 -0.809018 0.998027
-0.318712 -0.385257 0 -0.770514 1
-0.248481 -0.300363 -0.0866699 -0.770514 0.998027
-0.17893 -0.216289 -0.171657 -0.770514 0.992115
-0.110728 -0.133848 -0.253306 -0.770514 0.982287
-0.044529 -0.0538264 -0.330016 -0.770514 0.968583
--0.0190423 0.0230182 -0.400271 -0.770514 0.951057
--0.0793944 0.0959715 -0.462657 -0.770514 0.929777
--0.135979 0.16437 -0.515893 -0.770514 0.904827
--0.188296 0.227611 -0.55885 -0.770514 0.876307
--0.235902 0.285158 -0.590568 -0.770514 0.844328
--0.278416 0.336548 -0.610274 -0.770514 0.809017
--0.315522 0.381402 -0.617398 -0.770514 0.770513
--0.346972 0.419419 -0.611575 -0.770514 0.728969
--0.372593 0.450388 -0.592661 -0.770514 0.684547
--0.392282 0.474189 -0.560731 -0.770514 0.637424
--0.406014 0.490787 -0.516079 -0.770514 0.587785
--0.413833 0.500239 -0.459214 -0.770514 0.535827
--0.415857 0.502686 -0.390857 -0.770514 0.481754
--0.412273 0.498354 -0.311924 -0.770514 0.42578
--0.403331 0.487545 -0.223517 -0.770514 0.368125
--0.389344 0.470637 -0.126904 -0.770514 0.309017
--0.370675 0.44807 -0.023501 -0.770514 0.24869
--0.34774 0.420346 0.0851486 -0.770514 0.187382
--0.320993 0.388015 0.197401 -0.770514 0.125334
--0.290924 0.351667 0.311534 -0.770514 0.0627908
--0.258046 0.311925 0.425779 -0.770514 3.26795e-07
--0.222892 0.269431 0.538344 -0.770514 -0.0627902
--0.186003 0.22484 0.647443 -0.770514 -0.125333
--0.147921 0.178806 0.751326 -0.770514 -0.187381
--0.109177 0.131973 0.848306 -0.770514 -0.24869
--0.0702917 0.0849682 0.936784 -0.770514 -0.309017
--0.0317569 0.0383876 1.01528 -0.770514 -0.368124
-0.00596425 -0.00720955 1.08244 -0.770514 -0.425779
-0.042447 -0.0513098 1.13708 -0.770514 -0.481753
-0.0773106 -0.0934527 1.17821 -0.770514 -0.535826
-0.110223 -0.133237 1.205 -0.770514 -0.587785
-0.140907 -0.170327 1.21687 -0.770514 -0.637424
-0.16914 -0.204455 1.21342 -0.770514 -0.684547
-0.19476 -0.235425 1.19451 -0.770514 -0.728968
-0.217667 -0.263115 1.1602 -0.770514 -0.770513
-0.23782 -0.287476 1.11081 -0.770514 -0.809017
-0.255241 -0.308534 1.04686 -0.770514 -0.844328
-0.270009 -0.326385 0.969092 -0.770514 -0.876306
-0.282259 -0.341193 0.87847 -0.770514 -0.904827
-0.29218 -0.353186 0.776138 -0.770514 -0.929776
-0.30001 -0.36265 0.663418 -0.770514 -0.951056
-0.306027 -0.369923 0.541792 -0.770514 -0.968583
-0.310548 -0.375388 0.412873 -0.770514 -0.982287
-0.31392 -0.379464 0.278387 -0.770514 -0.992115
-0.316512 -0.382599 0.140141 -0.770514 -0.998027
-0.318712 -0.385257 1.46106e-06 -0.770514 -1
-0.320911 -0.387915 -0.140138 -0.770514 -0.998027
-0.323504 -0.391049 -0.278384 -0.770514 -0.992115
-0.326875 -0.395125 -0.412871 -0.770514 -0.982287
-0.331396 -0.40059 -0.541789 -0.770514 -0.968583
-0.337413 -0.407864 -0.663416 -0.770514 -0.951057
-0.345243 -0.417328 -0.776135 -0.770514 -0.929777
-0.355164 -0.429321 -0.878468 -0.770514 -0.904827
-0.367414 -0.444129 -0.969091 -0.770514 -0.876307
-0.382182 -0.461979 -1.04686 -0.770514 -0.844328
-0.399602 -0.483037 -1.11081 -0.770514 -0.809017
-0.419756 -0.507399 -1.1602 -0.770514 -0.770514
-0.442663 -0.535088 -1.19451 -0.770514 -0.728969
-0.468283 -0.566058 -1.21342 -0.770514 -0.684548
-0.496516 -0.600186 -1.21687 -0.770514 -0.637425
-0.527199 -0.637276 -1.205 -0.770514 -0.587786
-0.560112 -0.67706 -1.17821 -0.770514 -0.535828
-0.594975 -0.719203 -1.13708 -0.770514 -0.481754
-0.631458 -0.763303 -1.08244 -0.770514 -0.42578
-0.669179 -0.808901 -1.01528 -0.770514 -0.368125
-0.707714 -0.855481 -0.936786 -0.770514 -0.309018
-0.7466 -0.902486 -0.848308 -0.770514 -0.248691
-0.785343 -0.949319 -0.751329 -0.770514 -0.187382
-0.823426 -0.995353 -0.647445 -0.770514 -0.125334
-0.860315 -1.03994 -0.538346 -0.770514 -0.0627915
-0.895469 -1.08244 -0.425782 -0.770514 -9.80385e-07
-0.928346 -1.12218 -0.311537 -0.770514 0.0627895
-0.958416 -1.15853 -0.197403 -0.770514 0.125332
-0.985162 -1.19086 -0.0851509 -0.770514 0.18738
-1.0081 -1.21858 0.0234987 -0.770514 0.248689
-1.02677 -1.24115 0.126902 -0.770514 0.309016
-1.04075 -1.25806 0.223515 -0.770514 0.368124
-1.0497 -1.26887 0.311923 -0.770514 0.425778
-1.05328 -1.2732 0.390856 -0.770514 0.481753
-1.05126 -1.27075 0.459213 -0.770514 0.535826
-1.04344 -1.2613 0.516077 -0.770514 0.587784
-1.02971 -1.2447 0.56073 -0.770514 0.637423
-1.01002 -1.2209 0.592661 -0.770514 0.684546
-0.984396 -1.18993 0.611575 -0.770514 0.728968
-0.952946 -1.15192 0.617398 -0.770514 0.770513
-0.91584 -1.10706 0.610275 -0.770514 0.809016
-0.873326 -1.05567 0.590568 -0.770514 0.844327
-0.82572 -0.998126 0.55885 -0.770514 0.876306
-0.773403 -0.934886 0.515894 -0.770514 0.904827
-0.716819 -0.866487 0.462658 -0.770514 0.929776
-0.656467 -0.793534 0.400272 -0.770514 0.951056
-0.592895 -0.716689 0.330018 -0.770514 0.968583
-0.526696 -0.636668 0.253307 -0.770514 0.982287
-0.458495 -0.554226 0.171659 -0.770514 0.992115
-0.388944 -0.470153 0.0866717 -0.770514 0.998027
-0.342273 -0.364485 0 -0.728969 1
-0.268751 -0.286192 -0.090088 -0.728969 0.998027
-0.195923 -0.208637 -0.17846 -0.728969 0.992115
-0.124471 -0.132548 -0.26343 -0.728969 0.982287
-0.0550623 -0.0586355 -0.343365 -0.728969 0.968583
--0.0116644 0.0124213 -0.416717 -0.728969 0.951057
--0.0751047 0.0799786 -0.482046 -0.728969 0.929777
--0.134697 0.143438 -0.538044 -0.728969 0.904827
--0.189931 0.202256 -0.583558 -0.728969 0.876307
--0.24035 0.255947 -0.617606 -0.728969 0.844328
--0.285561 0.304092 -0.639398 -0.728969 0.809017
--0.325236 0.346342 -0.648347 -0.728969 0.770513
--0.35912 0.382425 -0.644077 -0.728969 0.728969
--0.387028 0.412144 -0.626435 -0.728969 0.684547
--0.408849 0.435381 -0.59549 -0.728969 0.637424
--0.424548 0.452099 -0.551537 -0.728969 0.587785
--0.434164 0.462339 -0.495086 -0.728969 0.535827
--0.437807 0.466218 -0.426862 -0.728969 0.481754
--0.435657 0.463929 -0.347792 -0.728969 0.42578
--0.42796 0.455732 -0.258987 -0.728969 0.368125
--0.415023 0.441955 -0.161732 -0.728969 0.309017
--0.397207 0.422984 -0.0574608 -0.728969 0.24869
--0.374925 0.399256 0.0522654 -0.728969 0.187382
--0.348629 0.371253 0.16578 -0.728969 0.125334
--0.318807 0.339495 0.281339 -0.728969 0.0627908
--0.285972 0.30453 0.397148 -0.728969 3.26795e-07
--0.250659 0.266925 0.511389 -0.728969 -0.0627902
--0.213408 0.227257 0.622252 -0.728969 -0.125333
--0.174764 0.186105 0.727961 -0.728969 -0.187381
--0.135262 0.14404 0.826802 -0.728969 -0.24869
--0.0954249 0.101617 0.917153 -0.728969 -0.309017
--0.0557495 0.0593673 0.997505 -0.728969 -0.368124
--0.0167038 0.0177878 1.06649 -0.728969 -0.425779
-0.0212817 -0.0226628 1.12291 -0.728969 -0.481753
-0.0578199 -0.0615721 1.16573 -0.728969 -0.535826
-0.0925721 -0.0985795 1.19414 -0.728969 -0.587785
-0.125252 -0.133381 1.20751 -0.728969 -0.637424
-0.155632 -0.165731 1.20545 -0.728969 -0.684547
-0.183539 -0.19545 1.18781 -0.728969 -0.728968
-0.208865 -0.222419 1.15465 -0.728969 -0.770513
-0.23156 -0.246587 1.10627 -0.728969 -0.809017
-0.251634 -0.267964 1.04321 -0.728969 -0.844328
-0.269158 -0.286625 0.966214 -0.728969 -0.876306
-0.284256 -0.302702 0.87624 -0.728969 -0.904827
-0.297106 -0.316386 0.774447 -0.728969 -0.929776
-0.307934 -0.327917 0.662169 -0.728969 -0.951056
-0.317007 -0.337579 0.5409 -0.728969 -0.968583
-0.324632 -0.345699 0.412267 -0.728969 -0.982287
-0.331143 -0.352633 0.278013 -0.728969 -0.992115
-0.336899 -0.358762 0.139964 -0.728969 -0.998027
-0.342273 -0.364485 1.45924e-06 -0.728969 -1
-0.347647 -0.370207 -0.139961 -0.728969 -0.998027
-0.353403 -0.376336 -0.278011 -0.728969 -0.992115
-0.359914 -0.38327 -0.412265 -0.728969 -0.982287
-0.367539 -0.39139 -0.540897 -0.728969 -0.968583
-0.376612 -0.401052 -0.662167 -0.728969 -0.951057
-0.38744 -0.412583 -0.774445 -0.728969 -0.929777
-0.40029 -0.426267 -0.876238 -0.728969 -0.904827
-0.415388 -0.442344 -0.966212 -0.728969 -0.876307
-0.432911 -0.461005 -1.04321 -0.728969 -0.844328
-0.452986 -0.482382 -1.10627 -0.728969 -0.809017
-0.475681 -0.506549 -1.15465 -0.728969 -0.770514
-0.501006 -0.533519 -1.18781 -0.728969 -0.728969
-0.528914 -0.563237 -1.20545 -0.728969 -0.684548
-0.559293 -0.595588 -1.20751 -0.728969 -0.637425
-0.591973 -0.630389 -1.19414 -0.728969 -0.587786
-0.626726 -0.667397 -1.16573 -0.728969 -0.535828
-0.663264 -0.706306 -1.12291 -0.728969 -0.481754
-0.701249 -0.746756 -1.06649 -0.728969 -0.42578
-0.740295 -0.788336 -0.997506 -0.728969 -0.368125
-0.77997 -0.830586 -0.917154 -0.728969 -0.309018
-0.819808 -0.873009 -0.826804 -0.728969 -0.248691
-0.859309 -0.915073 -0.727963 -0.728969 -0.187382
-0.897954 -0.956226 -0.622255 -0.728969 -0.125334
-0.935204 -0.995894 -0.511392 -0.728969 -0.0627915
-0.970518 -1.0335 -0.39715 -0.728969 -9.80385e-07
-1.00335 -1.06846 -0.281341 -0.728969 0.0627895
-1.03317 -1.10022 -0.165782 -0.728969 0.125332
-1.05947 -1.12822 -0.0522677 -0.728969 0.18738
-1.08175 -1.15195 0.0574585 -0.728969 0.248689
-1.09957 -1.17092 0.16173 -0.728969 0.309016
-1.11251 -1.1847 0.258985 -0.728969 0.368124
-1.1202 -1.1929 0.34779 -0.728969 0.425778
-1.12235 -1.19519 0.426861 -0.728969 0.481753
-1.11871 -1.19131 0.495084 -0.728969 0.535826
-1.10909 -1.18107 0.551536 -0.728969 0.587784
-1.0934 -1.16435 0.59549 -0.728969 0.637423
-1.07157 -1.14111 0.626434 -0.728969 0.684546
-1.04367 -1.1114 0.644076 -0.728969 0.728968
-1.00978 -1.07531 0.648347 -0.728969 0.770513
-0.970108 -1.03306 0.639399 -0.728969 0.809016
-0.924897 -0.984917 0.617607 -0.728969 0.844327
-0.874478 -0.931227 0.583559 -0.728969 0.876306
-0.819245 -0.872409 0.538045 -0.728969 0.904827
-0.759652 -0.808949 0.482047 -0.728969 0.929776
-0.696212 -0.741392 0.416718 -0.728969 0.951056
-0.629485 -0.670335 0.343366 -0.728969 0.968583
-0.560077 -0.596422 0.263431 -0.728969 0.982287
-0.488625 -0.520334 0.178462 -0.728969 0.992115
-0.415796 -0.442779 0.0900898 -0.728969 0.998027
-0.364484 -0.342274 0 -0.684548 1
-0.288293 -0.270725 -0.0934171 -0.684548 0.998027
-0.2128 -0.199833 -0.185088 -0.684548 0.992115
-0.138694 -0.130243 -0.273294 -0.684548 0.982287
-0.0666484 -0.0625872 -0.356374 -0.684548 0.968583
--0.00269359 0.00252945 -0.432752 -0.684548 0.951057
--0.0687215 0.0645339 -0.50096 -0.684548 0.929777
--0.130868 0.122893 -0.559665 -0.684548 0.904827
--0.188614 0.177121 -0.60769 -0.684548 0.876307
--0.241499 0.226783 -0.644035 -0.684548 0.844328
--0.289121 0.271503 -0.667891 -0.684548 0.809017
--0.331145 0.310967 -0.678656 -0.684548 0.770513
--0.367308 0.344926 -0.675943 -0.684548 0.728969
--0.397416 0.373199 -0.65959 -0.684548 0.684547
--0.42135 0.395675 -0.629662 -0.684548 0.637424
--0.439066 0.412312 -0.58645 -0.684548 0.587785
--0.450594 0.423137 -0.530469 -0.684548 0.535827
--0.456033 0.428245 -0.462446 -0.684548 0.481754
--0.455555 0.427796 -0.383316 -0.684548 0.42578
--0.449396 0.422012 -0.294202 -0.684548 0.368125
--0.437853 0.411173 -0.196401 -0.684548 0.309017
--0.421279 0.395608 -0.0913638 -0.684548 0.24869
--0.400075 0.375696 0.0193306 -0.684548 0.187382
--0.374685 0.351853 0.133996 -0.684548 0.125334
--0.345589 0.324531 0.250866 -0.684548 0.0627908
--0.313293 0.294203 0.368124 -0.684548 3.26795e-07
--0.278322 0.261363 0.48393 -0.684548 -0.0627902
--0.241213 0.226514 0.596448 -0.684548 -0.125333
--0.202501 0.190162 0.703877 -0.684548 -0.187381
--0.16272 0.152805 0.804482 -0.684548 -0.24869
--0.122388 0.11493 0.896616 -0.684548 -0.309017
--0.0819983 0.0770017 0.978749 -0.684548 -0.368124
--0.042019 0.0394586 1.04949 -0.684548 -0.425779
--0.00288032 0.00270481 1.10763 -0.684548 -0.481753
-0.0350292 -0.0328947 1.1521 -0.684548 -0.535826
-0.0713678 -0.067019 1.18209 -0.684548 -0.587785
-0.105846 -0.0993959 1.19695 -0.684548 -0.637424
-0.138227 -0.129804 1.19629 -0.684548 -0.684547
-0.168335 -0.158078 1.17994 -0.684548 -0.728968
-0.19605 -0.184104 1.14796 -0.684548 -0.770513
-0.221314 -0.207828 1.10065 -0.684548 -0.809017
-0.244124 -0.229248 1.03854 -0.684548 -0.844328
-0.264539 -0.248419 0.962382 -0.684548 -0.876306
-0.282669 -0.265444 0.873146 -0.684548 -0.904827
-0.298677 -0.280477 0.771993 -0.684548 -0.929776
-0.312772 -0.293713 0.660267 -0.684548 -0.951056
-0.325207 -0.30539 0.539473 -0.684548 -0.968583
-0.336268 -0.315777 0.411255 -0.684548 -0.982287
-0.346272 -0.325172 0.277366 -0.684548 -0.992115
-0.355559 -0.333893 0.139648 -0.684548 -0.998027
-0.364484 -0.342274 1.45599e-06 -0.684548 -1
-0.373408 -0.350655 -0.139645 -0.684548 -0.998027
-0.382696 -0.359376 -0.277363 -0.684548 -0.992115
-0.3927 -0.368771 -0.411252 -0.684548 -0.982287
-0.403761 -0.379158 -0.539471 -0.684548 -0.968583
-0.416195 -0.390834 -0.660264 -0.684548 -0.951057
-0.430291 -0.404071 -0.77199 -0.684548 -0.929777
-0.446299 -0.419103 -0.873144 -0.684548 -0.904827
-0.464429 -0.436129 -0.962381 -0.684548 -0.876307
-0.484843 -0.455299 -1.03854 -0.684548 -0.844328
-0.507654 -0.47672 -1.10065 -0.684548 -0.809017
-0.532917 -0.500443 -1.14796 -0.684548 -0.770514
-0.560632 -0.52647 -1.17994 -0.684548 -0.728969
-0.59074 -0.554743 -1.19629 -0.684548 -0.684548
-0.623122 -0.585151 -1.19695 -0.684548 -0.637425
-0.657599 -0.617528 -1.18209 -0.684548 -0.587786
-0.693938 -0.651653 -1.15211 -0.684548 -0.535828
-0.731847 -0.687252 -1.10763 -0.684548 -0.481754
-0.770986 -0.724006 -1.0495 -0.684548 -0.42578
-0.810965 -0.761549 -0.978751 -0.684548 -0.368125
-0.851355 -0.799477 -0.896618 -0.684548 -0.309018
-0.891687 -0.837352 -0.804484 -0.684548 -0.248691
-0.931468 -0.874709 -0.70388 -0.684548 -0.187382
-0.97018 -0.911061 -0.59645 -0.684548 -0.125334
-1.00729 -0.94591 -0.483932 -0.684548 -0.0627915
-1.04226 -0.97875 -0.368127 -0.684548 -9.80385e-07
-1.07456 -1.00908 -0.250869 -0.684548 0.0627895
-1.10365 -1.0364 -0.133998 -0.684548 0.125332
-1.12904 -1.06024 -0.0193329 -0.684548 0.18738
-1.15025 -1.08016 0.0913616 -0.684548 0.248689
-1.16682 -1.09572 0.196399 -0.684548 0.309016
-1.17836 -1.10656 0.2942 -0.684548 0.368124
-1.18452 -1.11234 0.383314 -0.684548 0.425778
-1.185 -1.11279 0.462444 -0.684548 0.481753
-1.17956 -1.10768 0.530467 -0.684548 0.535826
-1.16803 -1.09686 0.586449 -0.684548 0.587784
-1.15032 -1.08022 0.629661 -0.684548 0.637423
-1.12638 -1.05775 0.65959 -0.684548 0.684546
-1.09628 -1.02947 0.675942 -0.684548 0.728968
-1.06011 -0.995516 0.678656 -0.684548 0.770513
-1.01809 -0.956052 0.667892 -0.684548 0.809016
-0.970468 -0.911332 0.644036 -0.684548 0.844327
-0.917583 -0.86167 0.607691 -0.684548 0.876306
-0.859837 -0.807442 0.559666 -0.684548 0.904827
-0.797691 -0.749083 0.500961 -0.684548 0.929776
-0.731663 -0.687079 0.432753 -0.684548 0.951056
-0.662321 -0.621962 0.356376 -0.684548 0.968583
-0.590275 -0.554306 0.273295 -0.684548 0.982287
-0.51617 -0.484717 0.185089 -0.684548 0.992115
-0.440677 -0.413824 0.093419 -0.684548 0.998027
-0.385256 -0.318712 0 -0.637425 1
-0.307023 -0.253992 -0.096654 -0.637425 0.998027
-0.229486 -0.189848 -0.191532 -0.637425 0.992115
-0.153331 -0.126847 -0.282888 -0.637425 0.982287
-0.0792272 -0.0655426 -0.369032 -0.637425 0.968583
-0.00781803 -0.00646765 -0.44836 -0.637425 0.951057
--0.0602876 0.0498744 -0.519379 -0.637425 0.929777
--0.124522 0.103014 -0.580733 -0.637425 0.904827
--0.184367 0.152522 -0.631223 -0.637425 0.876307
--0.239359 0.198015 -0.669829 -0.637425 0.844328
--0.289092 0.239159 -0.695725 -0.637425 0.809017
--0.33323 0.275672 -0.708295 -0.637425 0.770513
--0.3715 0.307332 -0.707142 -0.637425 0.728969
--0.403704 0.333974 -0.692094 -0.637425 0.684547
--0.429714 0.355491 -0.663213 -0.637425 0.637424
--0.449477 0.37184 -0.620786 -0.637425 0.587785
--0.46301 0.383036 -0.565328 -0.637425 0.535827
--0.470403 0.389152 -0.497573 -0.637425 0.481754
--0.471813 0.390319 -0.418462 -0.637425 0.42578
--0.467463 0.38672 -0.329126 -0.637425 0.368125
--0.457635 0.37859 -0.230877 -0.637425 0.309017
--0.442667 0.366207 -0.125177 -0.637425 0.24869
--0.422944 0.349891 -0.0136233 -0.637425 0.187382
--0.398896 0.329996 0.102079 -0.637425 0.125334
--0.370986 0.306907 0.220146 -0.637425 0.0627908
--0.339704 0.281028 0.338738 -0.637425 3.26795e-07
--0.305561 0.252783 0.455993 -0.637425 -0.0627902
--0.269079 0.222602 0.570054 -0.637425 -0.125333
--0.230782 0.19092 0.679099 -0.637425 -0.187381
--0.191189 0.158166 0.781368 -0.637425 -0.24869
--0.150809 0.12476 0.875195 -0.637425 -0.309017
--0.110127 0.0911049 0.959028 -0.637425 -0.368124
--0.069602 0.0575799 1.03146 -0.637425 -0.425779
--0.0296601 0.024537 1.09125 -0.637425 -0.481753
-0.00931367 -0.00770496 1.13734 -0.637425 -0.535826
-0.0469787 -0.0388642 1.16888 -0.637425 -0.587785
-0.0830437 -0.0686999 1.18522 -0.637425 -0.637424
-0.11727 -0.0970143 1.18595 -0.637425 -0.684547
-0.149474 -0.123656 1.17091 -0.637425 -0.728968
-0.179528 -0.148519 1.14014 -0.637425 -0.770513
-0.207363 -0.171546 1.09394 -0.637425 -0.809017
-0.232965 -0.192726 1.03284 -0.637425 -0.844328
-0.256375 -0.212093 0.957601 -0.637425 -0.876306
-0.277689 -0.229725 0.86919 -0.637425 -0.904827
-0.297049 -0.245741 0.768776 -0.637425 -0.929776
-0.314644 -0.260297 0.657713 -0.637425 -0.951056
-0.330705 -0.273583 0.537515 -0.637425 -0.968583
-0.345493 -0.285818 0.409836 -0.637425 -0.982287
-0.359303 -0.297242 0.276444 -0.637425 -0.992115
-0.372448 -0.308116 0.139195 -0.637425 -0.998027
-0.385256 -0.318712 1.4513e-06 -0.637425 -1
-0.398064 -0.329308 -0.139192 -0.637425 -0.998027
-0.411209 -0.340183 -0.276441 -0.637425 -0.992115
-0.425019 -0.351607 -0.409833 -0.637425 -0.982287
-0.439808 -0.363841 -0.537512 -0.637425 -0.968583
-0.455868 -0.377128 -0.65771 -0.637425 -0.951057
-0.473463 -0.391684 -0.768774 -0.637425 -0.929777
-0.492823 -0.4077 -0.869188 -0.637425 -0.904827
-0.514137 -0.425332 -0.957599 -0.637425 -0.876307
-0.537547 -0.444699 -1.03284 -0.637425 -0.844328
-0.563149 -0.465878 -1.09394 -0.637425 -0.809017
-0.590984 -0.488905 -1.14013 -0.637425 -0.770514
-0.621038 -0.513769 -1.17091 -0.637425 -0.728969
-0.653242 -0.54041 -1.18595 -0.637425 -0.684548
-0.687468 -0.568724 -1.18522 -0.637425 -0.637425
-0.723533 -0.59856 -1.16888 -0.637425 -0.587786
-0.761198 -0.629719 -1.13734 -0.637425 -0.535828
-0.800172 -0.661961 -1.09125 -0.637425 -0.481754
-0.840114 -0.695004 -1.03146 -0.637425 -0.42578
-0.880638 -0.728529 -0.959029 -0.637425 -0.368125
-0.921321 -0.762184 -0.875196 -0.637425 -0.309018
-0.961701 -0.79559 -0.781371 -0.637425 -0.248691
-1.00129 -0.828344 -0.679101 -0.637425 -0.187382
-1.03959 -0.860026 -0.570057 -0.637425 -0.125334
-1.07607 -0.890207 -0.455995 -0.637425 -0.0627915
-1.11022 -0.918453 -0.33874 -0.637425 -9.80385e-07
-1.1415 -0.944331 -0.220148 -0.637425 0.0627895
-1.16941 -0.967421 -0.102082 -0.637425 0.125332
-1.19346 -0.987315 0.0136209 -0.637425 0.18738
-1.21318 -1.00363 0.125175 -0.637425 0.248689
-1.22815 -1.01601 0.230875 -0.637425 0.309016
-1.23798 -1.02414 0.329124 -0.637425 0.368124
-1.24233 -1.02774 0.41846 -0.637425 0.425778
-1.24092 -1.02658 0.497572 -0.637425 0.481753
-1.23352 -1.02046 0.565327 -0.637425 0.535826
-1.21999 -1.00927 0.620785 -0.637425 0.587784
-1.20023 -0.992917 0.663212 -0.637425 0.637423
-1.17422 -0.971399 0.692094 -0.637425 0.684546
-1.14201 -0.944758 0.707141 -0.637425 0.728968
-1.10374 -0.913098 0.708295 -0.637425 0.770513
-1.05961 -0.876584 0.695725 -0.637425 0.809016
-1.00987 -0.835441 0.66983 -0.637425 0.844327
-0.954881 -0.789948 0.631224 -0.637425 0.876306
-0.895036 -0.74044 0.580734 -0.637425 0.904827
-0.830802 -0.6873 0.51938 -0.637425 0.929776
-0.762696 -0.630958 0.448361 -0.637425 0.951056
-0.691287 -0.571884 0.369033 -0.637425 0.968583
-0.617183 -0.510579 0.28289 -0.637425 0.982287
-0.541028 -0.447578 0.191534 -0.637425 0.992115
-0.463491 -0.383434 0.096656 -0.637425 0.998027
-0.404508 -0.293893 0 -0.587786 1
-0.324863 -0.236027 -0.0997956 -0.587786 0.998027
-0.245902 -0.178659 -0.197788 -0.587786 0.992115
-0.168302 -0.122279 -0.292203 -0.587786 0.982287
-0.0927227 -0.0673671 -0.381325 -0.587786 0.968583
-0.0197979 -0.014384 -0.463525 -0.587786 0.951057
--0.0498711 0.0362336 -0.537286 -0.587786 0.929777
--0.115723 0.0840782 -0.601228 -0.587786 0.904827
--0.177245 0.128776 -0.654133 -0.587786 0.876307
--0.233975 0.169993 -0.694962 -0.587786 0.844328
--0.28551 0.207436 -0.722872 -0.587786 0.809017
--0.331511 0.240857 -0.737235 -0.587786 0.770513
--0.371703 0.270059 -0.737643 -0.587786 0.728969
--0.405882 0.294891 -0.723916 -0.587786 0.684547
--0.433912 0.315256 -0.696108 -0.587786 0.637424
--0.45573 0.331108 -0.654508 -0.587786 0.587785
--0.471342 0.342451 -0.59963 -0.587786 0.535827
--0.480822 0.349338 -0.53221 -0.587786 0.481754
--0.484312 0.351874 -0.453194 -0.587786 0.42578
--0.482018 0.350207 -0.363726 -0.587786 0.368125
--0.4742 0.344528 -0.265124 -0.587786 0.309017
--0.461178 0.335066 -0.158866 -0.587786 0.24869
--0.443315 0.322088 -0.0465637 -0.587786 0.187382
--0.421017 0.305888 0.0700622 -0.587786 0.125334
--0.394727 0.286787 0.189208 -0.587786 0.0627908
--0.364912 0.265125 0.309017 -0.587786 3.26795e-07
--0.332061 0.241257 0.427606 -0.587786 -0.0627902
--0.296672 0.215546 0.543098 -0.587786 -0.125333
--0.259252 0.188358 0.653651 -0.587786 -0.187381
--0.220301 0.160058 0.757483 -0.587786 -0.24869
--0.180308 0.131001 0.852909 -0.587786 -0.309017
--0.139744 0.10153 0.93836 -0.587786 -0.368124
--0.0990557 0.0719684 1.01241 -0.587786 -0.425779
--0.0586579 0.0426176 1.0738 -0.587786 -0.481753
--0.018928 0.013752 1.12145 -0.587786 -0.535826
-0.0197983 -0.0143843 1.15451 -0.587786 -0.587785
-0.0572316 -0.0415813 1.17231 -0.587786 -0.637424
-0.0931317 -0.0676643 1.17444 -0.587786 -0.684547
-0.127311 -0.0924967 1.16072 -0.587786 -0.728968
-0.159633 -0.115981 1.13119 -0.587786 -0.770513
-0.190018 -0.138057 1.08614 -0.587786 -0.809017
-0.218439 -0.158706 1.02612 -0.587786 -0.844328
-0.244919 -0.177945 0.951874 -0.587786 -0.876306
-0.269533 -0.195828 0.864376 -0.587786 -0.904827
-0.292402 -0.212443 0.764801 -0.587786 -0.929776
-0.313691 -0.22791 0.65451 -0.587786 -0.951056
-0.3336 -0.242375 0.535026 -0.587786 -0.968583
-0.352364 -0.256008 0.408013 -0.587786 -0.982287
-0.370247 -0.269001 0.27525 -0.587786 -0.992115
-0.387529 -0.281557 0.138604 -0.587786 -0.998027
-0.404508 -0.293893 1.44517e-06 -0.587786 -1
-0.421487 -0.306229 -0.138601 -0.587786 -0.998027
-0.438769 -0.318785 -0.275247 -0.587786 -0.992115
-0.456652 -0.331778 -0.40801 -0.587786 -0.982287
-0.475416 -0.345411 -0.535023 -0.587786 -0.968583
-0.495325 -0.359876 -0.654507 -0.587786 -0.951057
-0.516613 -0.375343 -0.764799 -0.587786 -0.929777
-0.539483 -0.391958 -0.864374 -0.587786 -0.904827
-0.564097 -0.409841 -0.951873 -0.587786 -0.876307
-0.590577 -0.42908 -1.02612 -0.587786 -0.844328
-0.618997 -0.449729 -1.08614 -0.587786 -0.809017
-0.649383 -0.471805 -1.13119 -0.587786 -0.770514
-0.681705 -0.495289 -1.16072 -0.587786 -0.728969
-0.715884 -0.520121 -1.17444 -0.587786 -0.684548
-0.751784 -0.546204 -1.17231 -0.587786 -0.637425
-0.789217 -0.573401 -1.15451 -0.587786 -0.587786
-0.827943 -0.601538 -1.12145 -0.587786 -0.535828
-0.867673 -0.630403 -1.0738 -0.587786 -0.481754
-0.908071 -0.659754 -1.01241 -0.587786 -0.42578
-0.948759 -0.689316 -0.938361 -0.587786 -0.368125
-0.989323 -0.718787 -0.852911 -0.587786 -0.309018
-1.02932 -0.747844 -0.757486 -0.587786 -0.248691
-1.06827 -0.776144 -0.653653 -0.587786 -0.187382
-1.10569 -0.803331 -0.543101 -0.587786 -0.125334
-1.14108 -0.829042 -0.427609 -0.587786 -0.0627915
-1.17393 -0.852911 -0.309019 -0.587786 -9.80385e-07
-1.20374 -0.874573 -0.189211 -0.587786 0.0627895
-1.23003 -0.893674 -0.0700647 -0.587786 0.125332
-1.25233 -0.909874 0.0465613 -0.587786 0.18738
-1.27019 -0.922852 0.158864 -0.587786 0.248689
-1.28322 -0.932314 0.265122 -0.587786 0.309016
-1.29103 -0.937993 0.363724 -0.587786 0.368124
-1.29333 -0.939661 0.453193 -0.587786 0.425778
-1.28984 -0.937125 0.532208 -0.587786 0.481753
-1.28036 -0.930237 0.599628 -0.587786 0.535826
-1.26475 -0.918895 0.654507 -0.587786 0.587784
-1.24293 -0.903043 0.696108 -0.587786 0.637423
-1.2149 -0.882678 0.723915 -0.587786 0.684546
-1.18072 -0.857845 0.737642 -0.587786 0.728968
-1.14053 -0.828644 0.737235 -0.587786 0.770513
-1.09453 -0.795223 0.722873 -0.587786 0.809016
-1.04299 -0.75778 0.694962 -0.587786 0.844327
-0.986262 -0.716563 0.654134 -0.587786 0.876306
-0.924741 -0.671865 0.601229 -0.587786 0.904827
-0.858889 -0.624021 0.537287 -0.587786 0.929776
-0.78922 -0.573403 0.463527 -0.587786 0.951056
-0.716295 -0.52042 0.381327 -0.587786 0.968583
-0.640716 -0.465508 0.292205 -0.587786 0.982287
-0.563116 -0.409129 0.19779 -0.587786 0.992115
-0.484155 -0.35176 0.0997976 -0.587786 0.998027
-0.422164 -0.267914 0 -0.535828 1
-0.341729 -0.216869 -0.102839 -0.535828 0.998027
-0.261962 -0.166246 -0.203848 -0.535828 0.992115
-0.183519 -0.116465 -0.30123 -0.535828 0.982287
-0.107043 -0.067932 -0.393242 -0.535828 0.968583
-0.0331533 -0.0210397 -0.478233 -0.535828 0.951057
--0.0375645 0.0238392 -0.554662 -0.535828 0.929777
--0.104561 0.0663568 -0.62113 -0.535828 0.904827
--0.167333 0.106193 -0.676397 -0.535828 0.876307
--0.225427 0.143061 -0.719408 -0.535828 0.844328
--0.278445 0.176707 -0.749306 -0.535828 0.809017
--0.326049 0.206917 -0.765448 -0.535828 0.770513
--0.367964 0.233518 -0.767416 -0.535828 0.728969
--0.403981 0.256375 -0.755022 -0.535828 0.684547
--0.433958 0.275399 -0.728317 -0.535828 0.637424
--0.45782 0.290542 -0.687585 -0.535828 0.587785
--0.47556 0.301801 -0.633339 -0.535828 0.535827
--0.487238 0.309211 -0.566321 -0.535828 0.481754
--0.492974 0.312852 -0.48748 -0.535828 0.42578
--0.492953 0.312838 -0.397967 -0.535828 0.368125
--0.487414 0.309323 -0.29911 -0.535828 0.309017
--0.476648 0.302491 -0.192399 -0.535828 0.24869
--0.460992 0.292555 -0.0794582 -0.535828 0.187382
--0.440827 0.279758 0.0379759 -0.535828 0.125334
--0.416562 0.264359 0.158084 -0.535828 0.0627908
--0.388639 0.246638 0.278991 -0.535828 3.26795e-07
--0.357515 0.226887 0.398797 -0.535828 -0.0627902
--0.323664 0.205404 0.515606 -0.535828 -0.125333
--0.287562 0.182493 0.627557 -0.535828 -0.187381
--0.249684 0.158455 0.732851 -0.535828 -0.24869
--0.210496 0.133585 0.829783 -0.535828 -0.309017
--0.170449 0.108171 0.916766 -0.535828 -0.368124
--0.12997 0.0824816 0.992358 -0.535828 -0.425779
--0.0894577 0.0567718 1.05528 -0.535828 -0.481753
--0.0492781 0.0312729 1.10446 -0.535828 -0.535826
--0.00975811 0.0061927 1.139 -0.535828 -0.587785
-0.0288175 -0.0182882 1.15825 -0.535828 -0.637424
-0.0662096 -0.042018 1.16177 -0.535828 -0.684547
-0.102227 -0.0648752 1.14938 -0.535828 -0.728968
-0.136727 -0.0867696 1.12112 -0.535828 -0.770513
-0.169617 -0.107643 1.07728 -0.535828 -0.809017
-0.200855 -0.127467 1.01839 -0.535828 -0.844328
-0.230447 -0.146246 0.945209 -0.535828 -0.876306
-0.258443 -0.164013 0.858709 -0.535828 -0.904827
-0.284939 -0.180829 0.760071 -0.535828 -0.929776
-0.310071 -0.196777 0.650661 -0.535828 -0.951056
-0.334007 -0.211968 0.532009 -0.535828 -0.968583
-0.35695 -0.226528 0.405787 -0.535828 -0.982287
-0.379124 -0.2406 0.273784 -0.535828 -0.992115
-0.400776 -0.254341 0.137876 -0.535828 -0.998027
-0.422163 -0.267914 1.43762e-06 -0.535828 -1
-0.443551 -0.281486 -0.137873 -0.535828 -0.998027
-0.465202 -0.295227 -0.273781 -0.535828 -0.992115
-0.487377 -0.3093 -0.405784 -0.535828 -0.982287
-0.51032 -0.32386 -0.532006 -0.535828 -0.968583
-0.534256 -0.33905 -0.650658 -0.535828 -0.951057
-0.559387 -0.354999 -0.760069 -0.535828 -0.929777
-0.585884 -0.371814 -0.858707 -0.535828 -0.904827
-0.61388 -0.389581 -0.945207 -0.535828 -0.876307
-0.643471 -0.40836 -1.01839 -0.535828 -0.844328
-0.67471 -0.428185 -1.07728 -0.535828 -0.809017
-0.7076 -0.449058 -1.12112 -0.535828 -0.770514
-0.7421 -0.470952 -1.14938 -0.535828 -0.728969
-0.778117 -0.493809 -1.16177 -0.535828 -0.684548
-0.815509 -0.517539 -1.15825 -0.535828 -0.637425
-0.854085 -0.54202 -1.139 -0.535828 -0.587786
-0.893605 -0.5671 -1.10446 -0.535828 -0.535828
-0.933784 -0.592599 -1.05529 -0.535828 -0.481754
-0.974296 -0.618309 -0.992359 -0.535828 -0.42578
-1.01478 -0.643998 -0.916767 -0.535828 -0.368125
-1.05482 -0.669413 -0.829785 -0.535828 -0.309018
-1.09401 -0.694282 -0.732853 -0.535828 -0.248691
-1.13189 -0.71832 -0.627559 -0.535828 -0.187382
-1.16799 -0.741231 -0.515609 -0.535828 -0.125334
-1.20184 -0.762714 -0.3988 -0.535828 -0.0627915
-1.23297 -0.782466 -0.278994 -0.535828 -9.80385e-07
-1.26089 -0.800187 -0.158086 -0.535828 0.0627895
-1.28515 -0.815585 -0.0379784 -0.535828 0.125332
-1.30532 -0.828383 0.0794558 -0.535828 0.18738
-1.32097 -0.838318 0.192396 -0.535828 0.248689
-1.33174 -0.845151 0.299108 -0.535828 0.309016
-1.33728 -0.848666 0.397965 -0.535828 0.368124
-1.3373 -0.84868 0.487478 -0.535828 0.425778
-1.33157 -0.845039 0.566319 -0.535828 0.481753
-1.31989 -0.837629 0.633338 -0.535828 0.535826
-1.30215 -0.82637 0.687584 -0.535828 0.587784
-1.27829 -0.811227 0.728317 -0.535828 0.637423
-1.24831 -0.792203 0.755022 -0.535828 0.684546
-1.21229 -0.769346 0.767416 -0.535828 0.728968
-1.17038 -0.742746 0.765448 -0.535828 0.770513
-1.12277 -0.712535 0.749307 -0.535828 0.809016
-1.06976 -0.678889 0.719409 -0.535828 0.844327
-1.01166 -0.642022 0.676398 -0.535828 0.876306
-0.94889 -0.602185 0.621131 -0.535828 0.904827
-0.881893 -0.559668 0.554664 -0.535828 0.929776
-0.811176 -0.514789 0.478235 -0.535828 0.951056
-0.737285 -0.467897 0.393244 -0.535828 0.968583
-0.66081 -0.419364 0.301232 -0.535828 0.982287
-0.582367 -0.369582 0.20385 -0.535828 0.992115
-0.5026 -0.31896 0.102841 -0.535828 0.998027
-0.438153 -0.240877 0 -0.481755 1
-0.357544 -0.196562 -0.10578 -0.481755 0.998027
-0.277577 -0.152599 -0.209708 -0.481755 0.992115
-0.198883 -0.109337 -0.309959 -0.481755 0.982287
-0.122083 -0.067116 -0.404772 -0.481755 0.968583
-0.0477717 -0.0262628 -0.492469 -0.481755 0.951057
--0.0234845 0.0129108 -0.571492 -0.481755 0.929777
--0.0911549 0.050113 -0.640419 -0.481755 0.904827
--0.154751 0.0850753 -0.697994 -0.481755 0.876307
--0.213831 0.117555 -0.743145 -0.481755 0.844328
--0.268007 0.147339 -0.775001 -0.481755 0.809017
--0.316945 0.174243 -0.792905 -0.481755 0.770513
--0.360372 0.198117 -0.796431 -0.481755 0.728969
--0.398076 0.218845 -0.785384 -0.481755 0.684547
--0.429908 0.236345 -0.759808 -0.481755 0.637424
--0.455783 0.25057 -0.719983 -0.481755 0.587785
--0.47568 0.261508 -0.666424 -0.481755 0.535827
--0.489638 0.269181 -0.599873 -0.481755 0.481754
--0.497759 0.273646 -0.521284 -0.481755 0.42578
--0.500201 0.274989 -0.431815 -0.481755 0.368125
--0.497176 0.273325 -0.332801 -0.481755 0.309017
--0.488944 0.2688 -0.225742 -0.481755 0.24869
--0.475813 0.261581 -0.112274 -0.481755 0.187382
--0.458126 0.251858 0.0058521 -0.481755 0.125334
--0.436261 0.239837 0.126803 -0.481755 0.0627908
--0.410622 0.225742 0.24869 -0.481755 3.26795e-07
--0.381634 0.209806 0.369595 -0.481755 -0.0627902
--0.349733 0.192268 0.487606 -0.481755 -0.125333
--0.315363 0.173373 0.600844 -0.481755 -0.187381
--0.278968 0.153365 0.707495 -0.481755 -0.24869
--0.240985 0.132483 0.805837 -0.481755 -0.309017
--0.201836 0.11096 0.894267 -0.481755 -0.368124
--0.161925 0.0890192 0.971327 -0.481755 -0.425779
--0.121631 0.0668674 1.03573 -0.481755 -0.481753
--0.0813038 0.0446973 1.08638 -0.481755 -0.535826
--0.041258 0.0226819 1.12237 -0.481755 -0.587785
--0.00177092 0.000973575 1.14305 -0.481755 -0.637424
-0.0369212 -0.0202977 1.14796 -0.481755 -0.684547
-0.0746251 -0.0410256 1.13691 -0.481755 -0.728968
-0.111192 -0.0611285 1.10995 -0.481755 -0.770513
-0.146518 -0.0805492 1.06735 -0.481755 -0.809017
-0.180544 -0.0992554 1.00966 -0.481755 -0.844328
-0.213256 -0.117239 0.93761 -0.481755 -0.876306
-0.244679 -0.134514 0.852194 -0.481755 -0.904827
-0.27488 -0.151117 0.754591 -0.481755 -0.929776
-0.303962 -0.167105 0.646169 -0.481755 -0.951056
-0.332059 -0.182552 0.528466 -0.481755 -0.968583
-0.359333 -0.197546 0.40316 -0.481755 -0.982287
-0.38597 -0.212189 0.272047 -0.481755 -0.992115
-0.412171 -0.226594 0.137012 -0.481755 -0.998027
-0.438153 -0.240877 1.42865e-06 -0.481755 -1
-0.464134 -0.255161 -0.13701 -0.481755 -0.998027
-0.490336 -0.269565 -0.272045 -0.481755 -0.992115
-0.516972 -0.284209 -0.403158 -0.481755 -0.982287
-0.544246 -0.299203 -0.528464 -0.481755 -0.968583
-0.572343 -0.314649 -0.646167 -0.481755 -0.951057
-0.601425 -0.330637 -0.754589 -0.481755 -0.929777
-0.631626 -0.347241 -0.852192 -0.481755 -0.904827
-0.66305 -0.364516 -0.937608 -0.481755 -0.876307
-0.695761 -0.382499 -1.00965 -0.481755 -0.844328
-0.729787 -0.401205 -1.06735 -0.481755 -0.809017
-0.765113 -0.420626 -1.10995 -0.481755 -0.770514
-0.80168 -0.440729 -1.13691 -0.481755 -0.728969
-0.839384 -0.461457 -1.14796 -0.481755 -0.684548
-0.878076 -0.482728 -1.14305 -0.481755 -0.637425
-0.917563 -0.504436 -1.12237 -0.481755 -0.587786
-0.957609 -0.526452 -1.08638 -0.481755 -0.535828
-0.997936 -0.548622 -1.03573 -0.481755 -0.481754
-1.03823 -0.570773 -0.971329 -0.481755 -0.42578
-1.07814 -0.592715 -0.894268 -0.481755 -0.368125
-1.11729 -0.614237 -0.805839 -0.481755 -0.309018
-1.15527 -0.635119 -0.707497 -0.481755 -0.248691
-1.19167 -0.655127 -0.600846 -0.481755 -0.187382
-1.22604 -0.674022 -0.487608 -0.481755 -0.125334
-1.25794 -0.69156 -0.369597 -0.481755 -0.0627915
-1.28693 -0.707497 -0.248692 -0.481755 -9.80385e-07
-1.31257 -0.721592 -0.126806 -0.481755 0.0627895
-1.33443 -0.733612 -0.00585459 -0.481755 0.125332
-1.35212 -0.743336 0.112272 -0.481755 0.18738
-1.36525 -0.750555 0.225739 -0.481755 0.248689
-1.37348 -0.75508 0.332798 -0.481755 0.309016
-1.37651 -0.756743 0.431813 -0.481755 0.368124
-1.37407 -0.755401 0.521283 -0.481755 0.425778
-1.36594 -0.750936 0.599871 -0.481755 0.481753
-1.35199 -0.743263 0.666423 -0.481755 0.535826
-1.33209 -0.732325 0.719982 -0.481755 0.587784
-1.30621 -0.7181 0.759807 -0.481755 0.637423
-1.27438 -0.7006 0.785384 -0.481755 0.684546
-1.23668 -0.679872 0.796431 -0.481755 0.728968
-1.19325 -0.655998 0.792906 -0.481755 0.770513
-1.14431 -0.629094 0.775001 -0.481755 0.809016
-1.09014 -0.599311 0.743146 -0.481755 0.844327
-1.03106 -0.566831 0.697995 -0.481755 0.876306
-0.967462 -0.531868 0.64042 -0.481755 0.904827
-0.899792 -0.494666 0.571493 -0.481755 0.929776
-0.828536 -0.455493 0.492471 -0.481755 0.951056
-0.754224 -0.41464 0.404773 -0.481755 0.968583
-0.677424 -0.372418 0.309961 -0.481755 0.982287
-0.598731 -0.329156 0.20971 -0.481755 0.992115
-0.518763 -0.285193 0.105782 -0.481755 0.998027
-0.452413 -0.21289 0 -0.42578 1
-0.372228 -0.175158 -0.108617 -0.42578 0.998027
-0.292653 -0.137712 -0.21536 -0.42578 0.992115
-0.214288 -0.100836 -0.318383 -0.42578 0.982287
-0.137722 -0.0648071 -0.415901 -0.42578 0.968583
-0.063522 -0.0298913 -0.506219 -0.42578 0.951057
--0.00777111 0.00365682 -0.587757 -0.42578 0.929777
--0.0756505 0.0355985 -0.659075 -0.42578 0.904827
--0.139648 0.0657133 -0.718902 -0.42578 0.876307
--0.199337 0.0938014 -0.766148 -0.42578 0.844328
--0.254343 0.119685 -0.79993 -0.42578 0.809017
--0.304341 0.143212 -0.81958 -0.42578 0.770513
--0.349059 0.164255 -0.824661 -0.42578 0.728969
--0.388284 0.182713 -0.814971 -0.42578 0.684547
--0.421863 0.198514 -0.790548 -0.42578 0.637424
--0.449699 0.211613 -0.75167 -0.42578 0.587785
--0.471755 0.221992 -0.698851 -0.42578 0.535827
--0.488052 0.22966 -0.632833 -0.42578 0.481754
--0.498667 0.234655 -0.554575 -0.42578 0.42578
--0.50373 0.237038 -0.465236 -0.42578 0.368125
--0.503422 0.236893 -0.366163 -0.42578 0.309017
--0.49797 0.234327 -0.258861 -0.42578 0.24869
--0.487642 0.229468 -0.144979 -0.42578 0.187382
--0.472746 0.222458 -0.0262775 -0.42578 0.125334
--0.453618 0.213457 0.095398 -0.42578 0.0627908
--0.430622 0.202636 0.218143 -0.42578 3.26795e-07
--0.404141 0.190175 0.340028 -0.42578 -0.0627902
--0.374572 0.176261 0.459124 -0.42578 -0.125333
--0.34232 0.161084 0.573538 -0.42578 -0.187381
--0.30779 0.144836 0.681441 -0.42578 -0.24869
--0.271385 0.127704 0.781096 -0.42578 -0.309017
--0.233495 0.109875 0.870885 -0.42578 -0.368124
--0.194495 0.0915229 0.949339 -0.42578 -0.425779
--0.154741 0.072816 1.01515 -0.42578 -0.481753
--0.114561 0.0539087 1.06722 -0.42578 -0.535826
--0.0742558 0.0349422 1.10463 -0.42578 -0.587785
--0.0340912 0.0160422 1.12671 -0.42578 -0.637424
-0.0057008 -0.0026826 1.13301 -0.42578 -0.684547
-0.0449266 -0.0211409 1.12332 -0.42578 -0.728968
-0.0834312 -0.0392599 1.09768 -0.42578 -0.770513
-0.1211 -0.0569853 1.05637 -0.42578 -0.809017
-0.157856 -0.0742816 0.999924 -0.42578 -0.844328
-0.193663 -0.0911311 0.929086 -0.42578 -0.876306
-0.228521 -0.107534 0.844839 -0.42578 -0.904827
-0.262464 -0.123506 0.748366 -0.42578 -0.929776
-0.295558 -0.13908 0.641041 -0.42578 -0.951056
-0.327901 -0.154299 0.524403 -0.42578 -0.968583
-0.35961 -0.16922 0.400136 -0.42578 -0.982287
-0.390826 -0.183909 0.270043 -0.42578 -0.992115
-0.421705 -0.19844 0.136014 -0.42578 -0.998027
-0.452413 -0.21289 1.41827e-06 -0.42578 -1
-0.483121 -0.22734 -0.136011 -0.42578 -0.998027
-0.514 -0.241871 -0.27004 -0.42578 -0.992115
-0.545216 -0.25656 -0.400134 -0.42578 -0.982287
-0.576925 -0.271481 -0.5244 -0.42578 -0.968583
-0.609267 -0.2867 -0.641038 -0.42578 -0.951057
-0.642362 -0.302274 -0.748364 -0.42578 -0.929777
-0.676305 -0.318246 -0.844837 -0.42578 -0.904827
-0.711163 -0.334649 -0.929084 -0.42578 -0.876307
-0.74697 -0.351498 -0.999922 -0.42578 -0.844328
-0.783726 -0.368795 -1.05637 -0.42578 -0.809017
-0.821394 -0.38652 -1.09768 -0.42578 -0.770514
-0.859899 -0.404639 -1.12332 -0.42578 -0.728969
-0.899125 -0.423097 -1.13301 -0.42578 -0.684548
-0.938917 -0.441822 -1.12671 -0.42578 -0.637425
-0.979082 -0.460722 -1.10463 -0.42578 -0.587786
-1.01939 -0.479689 -1.06722 -0.42578 -0.535828
-1.05957 -0.498596 -1.01516 -0.42578 -0.481754
-1.09932 -0.517303 -0.94934 -0.42578 -0.42578
-1.13832 -0.535655 -0.870887 -0.42578 -0.368125
-1.17621 -0.553485 -0.781098 -0.42578 -0.309018
-1.21262 -0.570616 -0.681443 -0.42578 -0.248691
-1.24715 -0.586864 -0.57354 -0.42578 -0.187382
-1.2794 -0.602041 -0.459126 -0.42578 -0.125334
-1.30897 -0.615955 -0.34003 -0.42578 -0.0627915
-1.33545 -0.628416 -0.218146 -0.42578 -9.80385e-07
-1.35844 -0.639237 -0.0954005 -0.42578 0.0627895
-1.37757 -0.648238 0.026275 -0.42578 0.125332
-1.39247 -0.655248 0.144977 -0.42578 0.18738
-1.4028 -0.660108 0.258859 -0.42578 0.248689
-1.40825 -0.662673 0.366161 -0.42578 0.309016
-1.40856 -0.662818 0.465234 -0.42578 0.368124
-1.40349 -0.660436 0.554573 -0.42578 0.425778
-1.39288 -0.655441 0.632832 -0.42578 0.481753
-1.37658 -0.647772 0.69885 -0.42578 0.535826
-1.35453 -0.637394 0.751669 -0.42578 0.587784
-1.32669 -0.624295 0.790547 -0.42578 0.637423
-1.29311 -0.608494 0.814971 -0.42578 0.684546
-1.25389 -0.590036 0.824661 -0.42578 0.728968
-1.20917 -0.568993 0.819581 -0.42578 0.770513
-1.15917 -0.545466 0.799931 -0.42578 0.809016
-1.10417 -0.519582 0.766149 -0.42578 0.844327
-1.04448 -0.491494 0.718903 -0.42578 0.876306
-0.980478 -0.46138 0.659077 -0.42578 0.904827
-0.912599 -0.429438 0.587758 -0.42578 0.929776
-0.841306 -0.39589 0.506221 -0.42578 0.951056
-0.767106 -0.360974 0.415903 -0.42578 0.968583
-0.69054 -0.324945 0.318385 -0.42578 0.982287
-0.612176 -0.288069 0.215362 -0.42578 0.992115
-0.5326 -0.250623 0.10862 -0.42578 0.998027
-0.464888 -0.184063 0 -0.368126 1
-0.385705 -0.152712 -0.111347 -0.368126 0.998027
-0.307093 -0.121587 -0.2208 -0.368126 0.992115
-0.229616 -0.0909116 -0.326492 -0.368126 0.982287
-0.153825 -0.0609039 -0.42662 -0.368126 0.968583
-0.0802549 -0.0317753 -0.51947 -0.368126 0.951057
-0.00941336 -0.00372703 -0.603442 -0.368126 0.929777
--0.0582204 0.0230512 -0.677082 -0.368126 0.904827
--0.122202 0.0483835 -0.7391 -0.368126 0.876307
--0.182128 0.0721099 -0.788396 -0.368126 0.844328
--0.237636 0.0940872 -0.82407 -0.368126 0.809017
--0.288413 0.114191 -0.845446 -0.368126 0.770513
--0.334193 0.132317 -0.852077 -0.368126 0.728969
--0.374763 0.14838 -0.843753 -0.368126 0.684547
--0.409964 0.162317 -0.820508 -0.368126 0.637424
--0.439689 0.174086 -0.782616 -0.368126 0.587785
--0.463884 0.183665 -0.730588 -0.368126 0.535827
--0.482551 0.191056 -0.665169 -0.368126 0.481754
--0.495738 0.196277 -0.587317 -0.368126 0.42578
--0.503547 0.199369 -0.498199 -0.368126 0.368125
--0.506124 0.20039 -0.399164 -0.368126 0.309017
--0.503658 0.199413 -0.291726 -0.368126 0.24869
--0.496378 0.196531 -0.177542 -0.368126 0.187382
--0.484545 0.191846 -0.0583811 -0.368126 0.125334
--0.468453 0.185474 0.0638983 -0.368126 0.0627908
--0.448419 0.177542 0.187381 -0.368126 3.26795e-07
--0.424781 0.168183 0.310125 -0.368126 -0.0627902
--0.39789 0.157536 0.430189 -0.368126 -0.125333
--0.368106 0.145744 0.545666 -0.368126 -0.187381
--0.335793 0.13295 0.654715 -0.368126 -0.24869
--0.301313 0.119299 0.755584 -0.368126 -0.309017
--0.26502 0.104929 0.846645 -0.368126 -0.368124
--0.227256 0.0899773 0.926413 -0.368126 -0.425779
--0.188348 0.0745724 0.993576 -0.368126 -0.481753
--0.148601 0.0588355 1.04701 -0.368126 -0.535826
--0.108297 0.042878 1.08581 -0.368126 -0.587785
--0.0676902 0.0268005 1.10927 -0.368126 -0.637424
--0.027005 0.0106921 1.11694 -0.368126 -0.684547
-0.0135654 -0.00537095 1.10862 -0.368126 -0.728968
-0.0538611 -0.0213252 1.08433 -0.368126 -0.770513
-0.0937554 -0.0371205 1.04435 -0.368126 -0.809017
-0.133155 -0.0527201 0.989205 -0.368126 -0.844328
-0.172 -0.0680999 0.919645 -0.368126 -0.876306
-0.210262 -0.0832488 0.836649 -0.368126 -0.904827
-0.247941 -0.0981671 0.741403 -0.368126 -0.929776
-0.285066 -0.112866 0.635279 -0.368126 -0.951056
-0.32169 -0.127367 0.519822 -0.368126 -0.968583
-0.357887 -0.141698 0.396717 -0.368126 -0.982287
-0.393747 -0.155896 0.267771 -0.368126 -0.992115
-0.429377 -0.170003 0.13488 -0.368126 -0.998027
-0.464888 -0.184063 1.4065e-06 -0.368126 -1
-0.500399 -0.198123 -0.134878 -0.368126 -0.998027
-0.536028 -0.212229 -0.267769 -0.368126 -0.992115
-0.571888 -0.226427 -0.396714 -0.368126 -0.982287
-0.608085 -0.240759 -0.519819 -0.368126 -0.968583
-0.644709 -0.255259 -0.635277 -0.368126 -0.951057
-0.681834 -0.269958 -0.741401 -0.368126 -0.929777
-0.719513 -0.284877 -0.836648 -0.368126 -0.904827
-0.757775 -0.300025 -0.919643 -0.368126 -0.876307
-0.79662 -0.315405 -0.989203 -0.368126 -0.844328
-0.83602 -0.331005 -1.04435 -0.368126 -0.809017
-0.875914 -0.3468 -1.08433 -0.368126 -0.770514
-0.91621 -0.362754 -1.10862 -0.368126 -0.728969
-0.95678 -0.378817 -1.11694 -0.368126 -0.684548
-0.997465 -0.394926 -1.10927 -0.368126 -0.637425
-1.03807 -0.411003 -1.08581 -0.368126 -0.587786
-1.07838 -0.426961 -1.04701 -0.368126 -0.535828
-1.11812 -0.442698 -0.993577 -0.368126 -0.481754
-1.15703 -0.458103 -0.926415 -0.368126 -0.42578
-1.19479 -0.473054 -0.846646 -0.368126 -0.368125
-1.23109 -0.487424 -0.755586 -0.368126 -0.309018
-1.26557 -0.501076 -0.654717 -0.368126 -0.248691
-1.29788 -0.51387 -0.545669 -0.368126 -0.187382
-1.32767 -0.525662 -0.430191 -0.368126 -0.125334
-1.35456 -0.536309 -0.310127 -0.368126 -0.0627915
-1.37819 -0.545668 -0.187384 -0.368126 -9.80385e-07
-1.39823 -0.5536 -0.0639009 -0.368126 0.0627895
-1.41432 -0.559971 0.0583786 -0.368126 0.125332
-1.42615 -0.564656 0.177539 -0.368126 0.18738
-1.43343 -0.567539 0.291724 -0.368126 0.248689
-1.4359 -0.568515 0.399161 -0.368126 0.309016
-1.43332 -0.567495 0.498197 -0.368126 0.368124
-1.42551 -0.564403 0.587316 -0.368126 0.425778
-1.41233 -0.559182 0.665167 -0.368126 0.481753
-1.39366 -0.551791 0.730587 -0.368126 0.535826
-1.36947 -0.542212 0.782615 -0.368126 0.587784
-1.33974 -0.530443 0.820507 -0.368126 0.637423
-1.30454 -0.516506 0.843753 -0.368126 0.684546
-1.26397 -0.500443 0.852077 -0.368126 0.728968
-1.21819 -0.482317 0.845447 -0.368126 0.770513
-1.16741 -0.462213 0.824071 -0.368126 0.809016
-1.11191 -0.440236 0.788397 -0.368126 0.844327
-1.05198 -0.41651 0.739102 -0.368126 0.876306
-0.987998 -0.391177 0.677083 -0.368126 0.904827
-0.920364 -0.364399 0.603443 -0.368126 0.929776
-0.849523 -0.336351 0.519471 -0.368126 0.951056
-0.775952 -0.307222 0.426622 -0.368126 0.968583
-0.700162 -0.277215 0.326494 -0.368126 0.982287
-0.622685 -0.246539 0.220802 -0.368126 0.992115
-0.544073 -0.215414 0.11135 -0.368126 0.998027
-0.475528 -0.154509 0 -0.309018 1
-0.397899 -0.129286 -0.113967 -0.309018 0.998027
-0.320797 -0.104234 -0.226022 -0.309018 0.992115
-0.244743 -0.0795222 -0.334279 -0.309018 0.982287
-0.170247 -0.055317 -0.436919 -0.309018 0.968583
-0.0978041 -0.0317786 -0.532207 -0.309018 0.951057
-0.0278856 -0.0090606 -0.618531 -0.309018 0.929777
--0.0390622 0.0126921 -0.69442 -0.309018 0.904827
--0.102624 0.0333446 -0.758569 -0.309018 0.876307
--0.162418 0.052773 -0.809865 -0.309018 0.844328
--0.218103 0.0708662 -0.847397 -0.309018 0.809017
--0.269377 0.0875264 -0.870478 -0.309018 0.770513
--0.315984 0.10267 -0.878652 -0.309018 0.728969
--0.357711 0.116228 -0.871703 -0.309018 0.684547
--0.394394 0.128147 -0.849658 -0.309018 0.637424
--0.425916 0.138389 -0.812789 -0.309018 0.587785
--0.452208 0.146932 -0.761605 -0.309018 0.535827
--0.473246 0.153768 -0.696848 -0.309018 0.481754
--0.489054 0.158904 -0.61948 -0.309018 0.42578
--0.499701 0.162363 -0.53067 -0.309018 0.368125
--0.505294 0.164181 -0.43177 -0.309018 0.309017
--0.505982 0.164404 -0.324303 -0.309018 0.24869
--0.50195 0.163094 -0.209929 -0.309018 0.187382
--0.493412 0.16032 -0.0904271 -0.309018 0.125334
--0.480612 0.156161 0.0323356 -0.309018 0.0627908
--0.463819 0.150705 0.156434 -0.309018 3.26795e-07
--0.443319 0.144044 0.279916 -0.309018 -0.0627902
--0.419412 0.136276 0.400829 -0.309018 -0.125333
--0.392412 0.127503 0.517256 -0.309018 -0.187381
--0.362633 0.117827 0.627342 -0.309018 -0.24869
--0.330394 0.107352 0.729327 -0.309018 -0.309017
--0.296009 0.0961795 0.821568 -0.309018 -0.368124
--0.259783 0.0844089 0.902573 -0.309018 -0.425779
--0.22201 0.0721358 0.971017 -0.309018 -0.481753
--0.18297 0.0594509 1.02577 -0.309018 -0.535826
--0.142923 0.0464387 1.06591 -0.309018 -0.587785
--0.102108 0.0331771 1.09073 -0.309018 -0.637424
--0.0607418 0.0197363 1.09978 -0.309018 -0.684547
--0.0190145 0.00617823 1.09283 -0.309018 -0.728968
-0.0229087 -0.00744352 1.06991 -0.309018 -0.770513
-0.0648902 -0.0210842 1.0313 -0.309018 -0.809017
-0.106819 -0.0347078 0.97751 -0.309018 -0.844328
-0.148612 -0.0482871 0.909297 -0.309018 -0.876306
-0.190209 -0.0618029 0.827634 -0.309018 -0.904827
-0.231577 -0.0752442 0.733708 -0.309018 -0.929776
-0.272703 -0.0886071 0.628891 -0.309018 -0.951056
-0.313596 -0.101894 0.514727 -0.309018 -0.968583
-0.354281 -0.115113 0.392907 -0.309018 -0.982287
-0.394796 -0.128278 0.265236 -0.309018 -0.992115
-0.435192 -0.141403 0.133614 -0.309018 -0.998027
-0.475528 -0.154509 1.39333e-06 -0.309018 -1
-0.515863 -0.167615 -0.133611 -0.309018 -0.998027
-0.556259 -0.18074 -0.265233 -0.309018 -0.992115
-0.596775 -0.193905 -0.392904 -0.309018 -0.982287
-0.637459 -0.207124 -0.514725 -0.309018 -0.968583
-0.678352 -0.220411 -0.628888 -0.309018 -0.951057
-0.719478 -0.233774 -0.733706 -0.309018 -0.929777
-0.760846 -0.247215 -0.827633 -0.309018 -0.904827
-0.802444 -0.260731 -0.909295 -0.309018 -0.876307
-0.844236 -0.27431 -0.977508 -0.309018 -0.844328
-0.886165 -0.287934 -1.0313 -0.309018 -0.809017
-0.928147 -0.301574 -1.06991 -0.309018 -0.770514
-0.97007 -0.315196 -1.09283 -0.309018 -0.728969
-1.0118 -0.328754 -1.09978 -0.309018 -0.684548
-1.05316 -0.342195 -1.09073 -0.309018 -0.637425
-1.09398 -0.355457 -1.06591 -0.309018 -0.587786
-1.13403 -0.368469 -1.02577 -0.309018 -0.535828
-1.17307 -0.381154 -0.971019 -0.309018 -0.481754
-1.21084 -0.393427 -0.902575 -0.309018 -0.42578
-1.24706 -0.405197 -0.82157 -0.309018 -0.368125
-1.28145 -0.41637 -0.729329 -0.309018 -0.309018
-1.31369 -0.426845 -0.627344 -0.309018 -0.248691
-1.34347 -0.436521 -0.517258 -0.309018 -0.187382
-1.37047 -0.445294 -0.400831 -0.309018 -0.125334
-1.39437 -0.453062 -0.279918 -0.309018 -0.0627915
-1.41487 -0.459723 -0.156437 -0.309018 -9.80385e-07
-1.43167 -0.465179 -0.0323382 -0.309018 0.0627895
-1.44447 -0.469338 0.0904246 -0.309018 0.125332
-1.45301 -0.472112 0.209926 -0.309018 0.18738
-1.45704 -0.473422 0.3243 -0.309018 0.248689
-1.45635 -0.473199 0.431768 -0.309018 0.309016
-1.45076 -0.471381 0.530668 -0.309018 0.368124
-1.44011 -0.467922 0.619479 -0.309018 0.425778
-1.4243 -0.462786 0.696846 -0.309018 0.481753
-1.40326 -0.45595 0.761604 -0.309018 0.535826
-1.37697 -0.447408 0.812788 -0.309018 0.587784
-1.34545 -0.437165 0.849658 -0.309018 0.637423
-1.30877 -0.425246 0.871703 -0.309018 0.684546
-1.26704 -0.411688 0.878652 -0.309018 0.728968
-1.22043 -0.396545 0.870478 -0.309018 0.770513
-1.16916 -0.379885 0.847398 -0.309018 0.809016
-1.11348 -0.361792 0.809866 -0.309018 0.844327
-1.05368 -0.342363 0.758571 -0.309018 0.876306
-0.99012 -0.321711 0.694421 -0.309018 0.904827
-0.923172 -0.299958 0.618533 -0.309018 0.929776
-0.853253 -0.27724 0.532209 -0.309018 0.951056
-0.78081 -0.253702 0.436921 -0.309018 0.968583
-0.706315 -0.229497 0.334281 -0.309018 0.982287
-0.630261 -0.204785 0.226024 -0.309018 0.992115
-0.553159 -0.179733 0.11397 -0.309018 0.998027
-0.484291 -0.124346 0 -0.248691 1
-0.408738 -0.104947 -0.116475 -0.248691 0.998027
-0.333663 -0.0856706 -0.23102 -0.248691 0.992115
-0.259539 -0.0666387 -0.341736 -0.248691 0.982287
-0.186831 -0.0479703 -0.446786 -0.248691 0.968583
-0.115988 -0.0297809 -0.54442 -0.248691 0.951057
-0.0474426 -0.0121812 -0.633011 -0.248691 0.929777
--0.0183964 0.00472343 -0.711073 -0.248691 0.904827
--0.0811456 0.0208348 -0.77729 -0.248691 0.876307
--0.140451 0.0360619 -0.830535 -0.248691 0.844328
--0.195993 0.0503226 -0.869888 -0.248691 0.809017
--0.247484 0.0635434 -0.894651 -0.248691 0.770513
--0.294677 0.0756607 -0.90436 -0.248691 0.728969
--0.337364 0.0866208 -0.898792 -0.248691 0.684547
--0.375375 0.0963805 -0.87797 -0.248691 0.637424
--0.408584 0.104907 -0.84216 -0.248691 0.587785
--0.436904 0.112178 -0.791869 -0.248691 0.535827
--0.460289 0.118183 -0.727839 -0.248691 0.481754
--0.478735 0.122919 -0.651032 -0.248691 0.42578
--0.492274 0.126395 -0.562617 -0.248691 0.368125
--0.500977 0.12863 -0.463951 -0.248691 0.309017
--0.504947 0.129649 -0.356559 -0.248691 0.24869
--0.504322 0.129488 -0.242108 -0.248691 0.187382
--0.499266 0.128191 -0.122384 -0.248691 0.125334
--0.489973 0.125804 0.000740985 -0.248691 0.0627908
--0.476654 0.122385 0.125333 -0.248691 3.26795e-07
--0.459543 0.117991 0.249431 -0.248691 -0.0627902
--0.438887 0.112688 0.371074 -0.248691 -0.125333
--0.414944 0.10654 0.488335 -0.248691 -0.187381
--0.387981 0.0996171 0.59935 -0.248691 -0.24869
--0.358267 0.0919878 0.702349 -0.248691 -0.309017
--0.326072 0.0837214 0.795681 -0.248691 -0.368124
--0.291661 0.0748861 0.877842 -0.248691 -0.425779
--0.255293 0.0655485 0.947501 -0.248691 -0.481753
--0.217219 0.0557727 1.00351 -0.248691 -0.535826
--0.177675 0.0456195 1.04495 -0.248691 -0.587785
--0.136884 0.035146 1.07111 -0.248691 -0.637424
--0.0950511 0.0244051 1.08152 -0.248691 -0.684547
--0.0523645 0.013445 1.07595 -0.248691 -0.728968
--0.0089925 0.00230889 1.05443 -0.248691 -0.770513
-0.0349163 -0.00896503 1.01723 -0.248691 -0.809017
-0.0792334 -0.0203438 0.96485 -0.248691 -0.844328
-0.12385 -0.0317995 0.898051 -0.248691 -0.876306
-0.168678 -0.0433093 0.817803 -0.248691 -0.904827
-0.213645 -0.054855 0.725289 -0.248691 -0.929776
-0.258698 -0.0664226 0.621882 -0.248691 -0.951056
-0.303797 -0.0780021 0.509125 -0.248691 -0.968583
-0.348917 -0.0895871 0.388708 -0.248691 -0.982287
-0.394043 -0.101173 0.262439 -0.248691 -0.992115
-0.439168 -0.11276 0.132216 -0.248691 -0.998027
-0.484291 -0.124345 1.37879e-06 -0.248691 -1
-0.529414 -0.135931 -0.132213 -0.248691 -0.998027
-0.574539 -0.147517 -0.262436 -0.248691 -0.992115
-0.619665 -0.159104 -0.388706 -0.248691 -0.982287
-0.664785 -0.170689 -0.509123 -0.248691 -0.968583
-0.709884 -0.182268 -0.621879 -0.248691 -0.951057
-0.754937 -0.193836 -0.725287 -0.248691 -0.929777
-0.799904 -0.205382 -0.817801 -0.248691 -0.904827
-0.844732 -0.216891 -0.898049 -0.248691 -0.876307
-0.889348 -0.228347 -0.964849 -0.248691 -0.844328
-0.933666 -0.239726 -1.01723 -0.248691 -0.809017
-0.977574 -0.251 -1.05443 -0.248691 -0.770514
-1.02095 -0.262136 -1.07595 -0.248691 -0.728969
-1.06363 -0.273096 -1.08152 -0.248691 -0.684548
-1.10547 -0.283837 -1.07111 -0.248691 -0.637425
-1.14626 -0.29431 -1.04495 -0.248691 -0.587786
-1.1858 -0.304464 -1.00352 -0.248691 -0.535828
-1.22388 -0.314239 -0.947502 -0.248691 -0.481754
-1.26024 -0.323577 -0.877844 -0.248691 -0.42578
-1.29465 -0.332412 -0.795683 -0.248691 -0.368125
-1.32685 -0.340679 -0.702351 -0.248691 -0.309018
-1.35656 -0.348308 -0.599353 -0.248691 -0.248691
-1.38353 -0.355231 -0.488337 -0.248691 -0.187382
-1.40747 -0.361378 -0.371076 -0.248691 -0.125334
-1.42813 -0.366682 -0.249433 -0.248691 -0.0627915
-1.44524 -0.371076 -0.125336 -0.248691 -9.80385e-07
-1.45856 -0.374495 -0.000743568 -0.248691 0.0627895
-1.46785 -0.376882 0.122381 -0.248691 0.125332
-1.4729 -0.37818 0.242106 -0.248691 0.18738
-1.47353 -0.37834 0.356557 -0.248691 0.248689
-1.46956 -0.377321 0.463949 -0.248691 0.309016
-1.46086 -0.375086 0.562615 -0.248691 0.368124
-1.44732 -0.37161 0.651031 -0.248691 0.425778
-1.42887 -0.366874 0.727838 -0.248691 0.481753
-1.40549 -0.36087 0.791868 -0.248691 0.535826
-1.37717 -0.353598 0.842159 -0.248691 0.587784
-1.34396 -0.345072 0.87797 -0.248691 0.637423
-1.30595 -0.335312 0.898792 -0.248691 0.684546
-1.26326 -0.324352 0.90436 -0.248691 0.728968
-1.21607 -0.312235 0.894651 -0.248691 0.770513
-1.16458 -0.299014 0.869888 -0.248691 0.809016
-1.10904 -0.284753 0.830536 -0.248691 0.844327
-1.04973 -0.269526 0.777291 -0.248691 0.876306
-0.986981 -0.253415 0.711074 -0.248691 0.904827
-0.921142 -0.23651 0.633012 -0.248691 0.929776
-0.852596 -0.218911 0.544422 -0.248691 0.951056
-0.781753 -0.200721 0.446788 -0.248691 0.968583
-0.709045 -0.182053 0.341739 -0.248691 0.982287
-0.634921 -0.163021 0.231023 -0.248691 0.992115
-0.559846 -0.143745 0.116478 -0.248691 0.998027
-0.491144 -0.0936913 0 -0.187383 1
-0.418153 -0.0797675 -0.118868 -0.187383 0.998027
-0.345587 -0.0659248 -0.235791 -0.187383 0.992115
-0.273868 -0.0522435 -0.348856 -0.187383 0.982287
-0.203409 -0.0388025 -0.456212 -0.187383 0.968583
-0.134611 -0.0256787 -0.556095 -0.187383 0.951057
-0.0678636 -0.0129458 -0.646865 -0.187383 0.929777
-0.00353453 -0.000674252 -0.727024 -0.187383 0.904827
--0.0580279 0.0110695 -0.795243 -0.187383 0.876307
--0.1165 0.0222238 -0.850385 -0.187383 0.844328
--0.171585 0.0327319 -0.89152 -0.187383 0.809017
--0.223015 0.0425428 -0.91794 -0.187383 0.770513
--0.270553 0.0516112 -0.929175 -0.187383 0.728969
--0.313994 0.0598981 -0.924995 -0.187383 0.684547
--0.353167 0.0673707 -0.905416 -0.187383 0.637424
--0.387934 0.0740029 -0.8707 -0.187383 0.587785
--0.418192 0.0797749 -0.821353 -0.187383 0.535827
--0.443872 0.0846737 -0.758113 -0.187383 0.481754
--0.464939 0.0886926 -0.681942 -0.187383 0.42578
--0.481391 0.0918309 -0.594009 -0.187383 0.368125
--0.493257 0.0940944 -0.495674 -0.187383 0.309017
--0.500595 0.0954942 -0.388464 -0.187383 0.24869
--0.503492 0.096047 -0.274049 -0.187383 0.187382
--0.502062 0.0957741 -0.15422 -0.187383 0.125334
--0.49644 0.0947017 -0.0308544 -0.187383 0.0627908
--0.486784 0.0928597 0.0941083 -0.187383 3.26795e-07
--0.473268 0.0902814 0.2187 -0.187383 -0.0627902
--0.456083 0.0870032 0.340952 -0.187383 -0.125333
--0.435432 0.0830637 0.458932 -0.187383 -0.187381
--0.411527 0.0785034 0.570767 -0.187383 -0.24869
--0.384585 0.073364 0.674679 -0.187383 -0.309017
--0.35483 0.0676879 0.769009 -0.187383 -0.368124
--0.322484 0.0615176 0.852245 -0.187383 -0.425779
--0.28777 0.0548954 0.923049 -0.187383 -0.481753
--0.250904 0.0478629 0.98027 -0.187383 -0.535826
--0.212099 0.0404604 1.02297 -0.187383 -0.587785
--0.171558 0.0327267 1.05044 -0.187383 -0.637424
--0.129476 0.024699 1.0622 -0.187383 -0.684547
--0.0860347 0.0164121 1.05802 -0.187383 -0.728968
--0.0414067 0.00789881 1.03792 -0.187383 -0.770513
-0.0042493 -0.000810604 1.00215 -0.187383 -0.809017
-0.0507873 -0.00968827 0.951238 -0.187383 -0.844328
-0.0980743 -0.0187088 0.885919 -0.187383 -0.876306
-0.14599 -0.0278492 0.807164 -0.187383 -0.904827
-0.194425 -0.0370888 0.716154 -0.187383 -0.929776
-0.243283 -0.046409 0.614259 -0.187383 -0.951056
-0.292477 -0.0557933 0.503021 -0.187383 -0.968583
-0.341928 -0.0652267 0.384126 -0.187383 -0.982287
-0.391566 -0.0746956 0.259382 -0.187383 -0.992115
-0.441324 -0.0841877 0.130687 -0.187383 -0.998027
-0.491143 -0.0936912 1.36289e-06 -0.187383 -1
-0.540962 -0.103195 -0.130685 -0.187383 -0.998027
-0.59072 -0.112687 -0.25938 -0.187383 -0.992115
-0.640358 -0.122156 -0.384124 -0.187383 -0.982287
-0.689809 -0.131589 -0.503018 -0.187383 -0.968583
-0.739003 -0.140973 -0.614257 -0.187383 -0.951057
-0.787861 -0.150294 -0.716152 -0.187383 -0.929777
-0.836296 -0.159533 -0.807162 -0.187383 -0.904827
-0.884212 -0.168674 -0.885917 -0.187383 -0.876307
-0.931499 -0.177694 -0.951237 -0.187383 -0.844328
-0.978037 -0.186572 -1.00215 -0.187383 -0.809017
-1.02369 -0.195281 -1.03791 -0.187383 -0.770514
-1.06832 -0.203794 -1.05802 -0.187383 -0.728969
-1.11176 -0.212081 -1.0622 -0.187383 -0.684548
-1.15384 -0.220109 -1.05044 -0.187383 -0.637425
-1.19439 -0.227843 -1.02297 -0.187383 -0.587786
-1.23319 -0.235245 -0.980271 -0.187383 -0.535828
-1.27006 -0.242278 -0.92305 -0.187383 -0.481754
-1.30477 -0.2489 -0.852247 -0.187383 -0.42578
-1.33712 -0.25507 -0.769011 -0.187383 -0.368125
-1.36687 -0.260746 -0.674681 -0.187383 -0.309018
-1.39381 -0.265886 -0.57077 -0.187383 -0.248691
-1.41772 -0.270446 -0.458935 -0.187383 -0.187382
-1.43837 -0.274386 -0.340955 -0.187383 -0.125334
-1.45556 -0.277664 -0.218702 -0.187383 -0.0627915
-1.46907 -0.280242 -0.0941109 -0.187383 -9.80385e-07
-1.47873 -0.282084 0.0308518 -0.187383 0.0627895
-1.48435 -0.283157 0.154217 -0.187383 0.125332
-1.48578 -0.28343 0.274047 -0.187383 0.18738
-1.48288 -0.282877 0.388461 -0.187383 0.248689
-1.47554 -0.281477 0.495672 -0.187383 0.309016
-1.46368 -0.279214 0.594007 -0.187383 0.368124
-1.44723 -0.276075 0.68194 -0.187383 0.425778
-1.42616 -0.272056 0.758111 -0.187383 0.481753
-1.40048 -0.267158 0.821352 -0.187383 0.535826
-1.37022 -0.261386 0.870699 -0.187383 0.587784
-1.33545 -0.254753 0.905415 -0.187383 0.637423
-1.29628 -0.247281 0.924995 -0.187383 0.684546
-1.25284 -0.238994 0.929175 -0.187383 0.728968
-1.2053 -0.229926 0.917941 -0.187383 0.770513
-1.15387 -0.220115 0.89152 -0.187383 0.809016
-1.09879 -0.209607 0.850386 -0.187383 0.844327
-1.04032 -0.198452 0.795245 -0.187383 0.876306
-0.978754 -0.186709 0.727025 -0.187383 0.904827
-0.914425 -0.174437 0.646867 -0.187383 0.929776
-0.847677 -0.161704 0.556097 -0.187383 0.951056
-0.77888 -0.14858 0.456214 -0.187383 0.968583
-0.70842 -0.135139 0.348859 -0.187383 0.982287
-0.636701 -0.121458 0.235794 -0.187383 0.992115
-0.564136 -0.107615 0.11887 -0.187383 0.998027
-0.496057 -0.0626673 0 -0.125335 1
-0.426077 -0.0538266 -0.121143 -0.125335 0.998027
-0.356465 -0.0450325 -0.240329 -0.125335 0.992115
-0.287588 -0.0363312 -0.355632 -0.125335 0.982287
-0.219804 -0.027768 -0.465187 -0.125335 0.968583
-0.153465 -0.0193874 -0.567222 -0.125335 0.951057
-0.0889118 -0.0112323 -0.660081 -0.125335 0.929777
-0.0264692 -0.00334387 -0.742257 -0.125335 0.904827
--0.0335526 0.00423872 -0.812412 -0.125335 0.876307
--0.0908623 0.0114787 -0.869396 -0.125335 0.844328
--0.145189 0.0183419 -0.912272 -0.125335 0.809017
--0.196285 0.0247968 -0.940324 -0.125335 0.770513
--0.243925 0.0308152 -0.953074 -0.125335 0.728969
--0.287909 0.0363717 -0.950285 -0.125335 0.684547
--0.328064 0.0414446 -0.931968 -0.125335 0.637424
--0.364243 0.0460151 -0.898381 -0.125335 0.587785
--0.396327 0.0500682 -0.850025 -0.125335 0.535827
--0.424222 0.0535922 -0.787638 -0.125335 0.481754
--0.447863 0.0565789 -0.712178 -0.125335 0.42578
--0.467212 0.0590232 -0.624815 -0.125335 0.368125
--0.482254 0.0609235 -0.526908 -0.125335 0.309017
--0.493003 0.0622814 -0.419985 -0.125335 0.24869
--0.499494 0.0631014 -0.30572 -0.125335 0.187382
--0.501784 0.0633907 -0.185904 -0.125335 0.125334
--0.499953 0.0631595 -0.0624193 -0.125335 0.0627908
--0.4941 0.0624199 0.0627905 -0.125335 3.26795e-07
--0.484338 0.0611867 0.187752 -0.125335 -0.0627902
--0.4708 0.0594764 0.310494 -0.125335 -0.125333
--0.453629 0.0573072 0.429076 -0.125335 -0.187381
--0.432981 0.0546987 0.541621 -0.125335 -0.24869
--0.409021 0.0516719 0.646343 -0.125335 -0.309017
--0.381923 0.0482486 0.741577 -0.125335 -0.368124
--0.351864 0.0444512 0.825807 -0.125335 -0.425779
--0.319026 0.0403027 0.897686 -0.125335 -0.481753
--0.283593 0.0358265 0.956058 -0.125335 -0.535826
--0.24575 0.0310457 0.999979 -0.125335 -0.587785
--0.205679 0.0259836 1.02873 -0.125335 -0.637424
--0.163563 0.0206631 1.04183 -0.125335 -0.684547
--0.119579 0.0151065 1.03904 -0.125335 -0.728968
--0.0739002 0.00933586 1.02037 -0.125335 -0.770513
--0.0266956 0.00337248 0.986088 -0.125335 -0.809017
-0.0218714 -0.00276303 0.936687 -0.125335 -0.844328
-0.0716434 -0.00905076 0.872912 -0.125335 -0.876306
-0.122468 -0.0154715 0.795729 -0.125335 -0.904827
-0.1742 -0.0220068 0.706312 -0.125335 -0.929776
-0.226698 -0.0286389 0.60603 -0.125335 -0.951056
-0.279826 -0.0353506 0.49642 -0.125335 -0.968583
-0.333453 -0.0421253 0.379165 -0.125335 -0.982287
-0.38745 -0.0489468 0.25607 -0.125335 -0.992115
-0.441692 -0.0557993 0.12903 -0.125335 -0.998027
-0.496057 -0.0626672 1.34564e-06 -0.125335 -1
-0.550421 -0.0695351 -0.129027 -0.125335 -0.998027
-0.604664 -0.0763876 -0.256068 -0.125335 -0.992115
-0.658661 -0.0832091 -0.379163 -0.125335 -0.982287
-0.712287 -0.0899837 -0.496417 -0.125335 -0.968583
-0.765415 -0.0966954 -0.606028 -0.125335 -0.951057
-0.817913 -0.103328 -0.70631 -0.125335 -0.929777
-0.869645 -0.109863 -0.795727 -0.125335 -0.904827
-0.92047 -0.116284 -0.872911 -0.125335 -0.876307
-0.970242 -0.122571 -0.936686 -0.125335 -0.844328
-1.01881 -0.128707 -0.986087 -0.125335 -0.809017
-1.06601 -0.13467 -1.02037 -0.125335 -0.770514
-1.11169 -0.140441 -1.03904 -0.125335 -0.728969
-1.15568 -0.145997 -1.04183 -0.125335 -0.684548
-1.19779 -0.151318 -1.02873 -0.125335 -0.637425
-1.23786 -0.15638 -0.999979 -0.125335 -0.587786
-1.27571 -0.161161 -0.956059 -0.125335 -0.535828
-1.31114 -0.165637 -0.897687 -0.125335 -0.481754
-1.34398 -0.169786 -0.825809 -0.125335 -0.42578
-1.37404 -0.173583 -0.741579 -0.125335 -0.368125
-1.40114 -0.177006 -0.646345 -0.125335 -0.309018
-1.42509 -0.180033 -0.541623 -0.125335 -0.248691
-1.44574 -0.182642 -0.429079 -0.125335 -0.187382
-1.46291 -0.184811 -0.310497 -0.125335 -0.125334
-1.47645 -0.186521 -0.187755 -0.125335 -0.0627915
-1.48621 -0.187754 -0.0627931 -0.125335 -9.80385e-07
-1.49207 -0.188494 0.0624167 -0.125335 0.0627895
-1.4939 -0.188725 0.185901 -0.125335 0.125332
-1.49161 -0.188436 0.305717 -0.125335 0.18738
-1.48512 -0.187616 0.419983 -0.125335 0.248689
-1.47437 -0.186258 0.526906 -0.125335 0.309016
-1.45933 -0.184358 0.624813 -0.125335 0.368124
-1.43998 -0.181913 0.712176 -0.125335 0.425778
-1.41634 -0.178927 0.787636 -0.125335 0.481753
-1.38844 -0.175403 0.850024 -0.125335 0.535826
-1.35636 -0.17135 0.89838 -0.125335 0.587784
-1.32018 -0.166779 0.931967 -0.125335 0.637423
-1.28002 -0.161706 0.950284 -0.125335 0.684546
-1.23604 -0.15615 0.953074 -0.125335 0.728968
-1.1884 -0.150131 0.940325 -0.125335 0.770513
-1.1373 -0.143676 0.912273 -0.125335 0.809016
-1.08298 -0.136813 0.869397 -0.125335 0.844327
-1.02567 -0.129573 0.812413 -0.125335 0.876306
-0.965647 -0.121991 0.742259 -0.125335 0.904827
-0.903204 -0.114102 0.660083 -0.125335 0.929776
-0.838651 -0.105947 0.567224 -0.125335 0.951056
-0.772312 -0.0975667 0.46519 -0.125335 0.968583
-0.704528 -0.0890035 0.355635 -0.125335 0.982287
-0.635651 -0.0803022 0.240332 -0.125335 0.992115
-0.566039 -0.0715081 0.121146 -0.125335 0.998027
-0.499013 -0.0313959 0 -0.0627918 1
-0.432449 -0.0272079 -0.123299 -0.0627918 0.998027
-0.366193 -0.0230394 -0.24463 -0.0627918 0.992115
-0.300554 -0.0189096 -0.362057 -0.0627918 0.982287
-0.235834 -0.0148377 -0.473704 -0.0627918 0.968583
-0.172332 -0.0108424 -0.577788 -0.0627918 0.951057
-0.110336 -0.00694192 -0.672646 -0.0627918 0.929777
-0.0501289 -0.00315391 -0.756759 -0.0627918 0.904827
--0.00802152 0.000504682 -0.828779 -0.0627918 0.876307
--0.0638579 0.00401768 -0.887549 -0.0627918 0.844328
--0.117138 0.00736982 -0.932124 -0.0627918 0.809017
--0.167633 0.0105468 -0.96178 -0.0627918 0.770513
--0.215133 0.0135353 -0.976032 -0.0627918 0.728969
--0.259445 0.0163232 -0.974636 -0.0627918 0.684547
--0.300394 0.0188996 -0.9576 -0.0627918 0.637424
--0.337824 0.0212545 -0.925175 -0.0627918 0.587785
--0.371598 0.0233795 -0.877859 -0.0627918 0.535827
--0.401602 0.0252672 -0.816386 -0.0627918 0.481754
--0.427738 0.0269115 -0.741711 -0.0627918 0.42578
--0.449931 0.0283078 -0.655004 -0.0627918 0.368125
--0.468125 0.0294525 -0.557622 -0.0627918 0.309017
--0.482284 0.0303434 -0.451092 -0.0627918 0.24869
--0.492392 0.0309793 -0.337088 -0.0627918 0.187382
--0.498451 0.0313605 -0.217404 -0.0627918 0.125334
--0.500482 0.0314883 -0.0939226 -0.0627918 0.0627908
--0.498521 0.0313649 0.0314108 -0.0627918 3.26795e-07
--0.492623 0.0309939 0.15662 -0.0627918 -0.0627902
--0.482859 0.0303795 0.27973 -0.0627918 -0.125333
--0.469311 0.0295272 0.398797 -0.0627918 -0.187381
--0.452079 0.028443 0.51194 -0.0627918 -0.24869
--0.431271 0.0271339 0.617369 -0.0627918 -0.309017
--0.40701 0.0256075 0.713414 -0.0627918 -0.368124
--0.379428 0.0238721 0.798554 -0.0627918 -0.425779
--0.348664 0.0219365 0.871437 -0.0627918 -0.481753
--0.314867 0.0198102 0.930902 -0.0627918 -0.535826
--0.278194 0.0175028 0.975999 -0.0627918 -0.587785
--0.238806 0.0150247 1.00601 -0.0627918 -0.637424
--0.196871 0.0123863 1.02043 -0.0627918 -0.684547
--0.152559 0.00959837 1.01904 -0.0627918 -0.728968
--0.106045 0.00667193 1.00183 -0.0627918 -0.770513
--0.0575079 0.00361816 0.969051 -0.0627918 -0.809017
--0.00712684 0.000448392 0.921212 -0.0627918 -0.844328
-0.0449163 -0.00282595 0.859044 -0.0627918 -0.876306
-0.0984386 -0.00619336 0.783508 -0.0627918 -0.904827
-0.153256 -0.00964226 0.695773 -0.0627918 -0.929776
-0.209185 -0.013161 0.597203 -0.0627918 -0.951056
-0.266039 -0.0167381 0.489329 -0.0627918 -0.968583
-0.323634 -0.0203617 0.37383 -0.0627918 -0.982287
-0.381785 -0.0240204 0.252505 -0.0627918 -0.992115
-0.440306 -0.0277023 0.127245 -0.0627918 -0.998027
-0.499013 -0.0313959 1.32706e-06 -0.0627918 -1
-0.557719 -0.0350894 -0.127242 -0.0627918 -0.998027
-0.616241 -0.0387714 -0.252503 -0.0627918 -0.992115
-0.674391 -0.04243 -0.373827 -0.0627918 -0.982287
-0.731987 -0.0460536 -0.489326 -0.0627918 -0.968583
-0.788841 -0.0496307 -0.597201 -0.0627918 -0.951057
-0.844769 -0.0531495 -0.695772 -0.0627918 -0.929777
-0.899587 -0.0565984 -0.783506 -0.0627918 -0.904827
-0.953109 -0.0599658 -0.859043 -0.0627918 -0.876307
-1.00515 -0.0632401 -0.921211 -0.0627918 -0.844328
-1.05553 -0.0664099 -0.96905 -0.0627918 -0.809017
-1.10407 -0.0694637 -1.00182 -0.0627918 -0.770514
-1.15058 -0.0723901 -1.01904 -0.0627918 -0.728969
-1.1949 -0.0751781 -1.02043 -0.0627918 -0.684548
-1.23683 -0.0778165 -1.00601 -0.0627918 -0.637425
-1.27622 -0.0802946 -0.976 -0.0627918 -0.587786
-1.31289 -0.0826019 -0.930903 -0.0627918 -0.535828
-1.34669 -0.0847283 -0.871438 -0.0627918 -0.481754
-1.37745 -0.0866638 -0.798556 -0.0627918 -0.42578
-1.40504 -0.0883992 -0.713416 -0.0627918 -0.368125
-1.4293 -0.0899256 -0.617371 -0.0627918 -0.309018
-1.45011 -0.0912348 -0.511942 -0.0627918 -0.248691
-1.46734 -0.092319 -0.3988 -0.0627918 -0.187382
-1.48089 -0.0931713 -0.279733 -0.0627918 -0.125334
-1.49065 -0.0937857 -0.156623 -0.0627918 -0.0627915
-1.49655 -0.0941567 -0.0314134 -0.0627918 -9.80385e-07
-1.49851 -0.0942801 0.09392 -0.0627918 0.0627895
-1.49648 -0.0941524 0.217401 -0.0627918 0.125332
-1.49042 -0.0937712 0.337086 -0.0627918 0.18738
-1.48031 -0.0931352 0.45109 -0.0627918 0.248689
-1.46615 -0.0922444 0.557619 -0.0627918 0.309016
-1.44796 -0.0910997 0.655002 -0.0627918 0.368124
-1.42576 -0.0897034 0.74171 -0.0627918 0.425778
-1.39963 -0.088059 0.816384 -0.0627918 0.481753
-1.36963 -0.0861713 0.877858 -0.0627918 0.535826
-1.33585 -0.0840464 0.925174 -0.0627918 0.587784
-1.29842 -0.0816914 0.957599 -0.0627918 0.637423
-1.25747 -0.0791151 0.974636 -0.0627918 0.684546
-1.21316 -0.0763272 0.976032 -0.0627918 0.728968
-1.16566 -0.0733387 0.961781 -0.0627918 0.770513
-1.11517 -0.0701617 0.932125 -0.0627918 0.809016
-1.06189 -0.0668096 0.88755 -0.0627918 0.844327
-1.00605 -0.0632966 0.82878 -0.0627918 0.876306
-0.947899 -0.059638 0.75676 -0.0627918 0.904827
-0.887691 -0.05585 0.672648 -0.0627918 0.929776
-0.825696 -0.0519495 0.577791 -0.0627918 0.951056
-0.762194 -0.0479542 0.473706 -0.0627918 0.968583
-0.697474 -0.0438823 0.362059 -0.0627918 0.982287
-0.631835 -0.0397525 0.244633 -0.0627918 0.992115
-0.56558 -0.035584 0.123302 -0.0627918 0.998027
diff --git a/data/points/README b/data/points/README
deleted file mode 100644
index 943bb2ec..00000000
--- a/data/points/README
+++ /dev/null
@@ -1,2 +0,0 @@
-The bunny pointset comes from the Stanford Computer Graphics Laboratory.
-http://graphics.stanford.edu/data/3Dscanrep/
diff --git a/data/points/SO3.COPYRIGHT b/data/points/SO3.COPYRIGHT
index 36618c9c..26bbb0ad 100644
--- a/data/points/SO3.COPYRIGHT
+++ b/data/points/SO3.COPYRIGHT
@@ -1,6 +1,6 @@
The SO3 points clouds have been generated from the ISOI software available
at this webpage :
-http://www.mitchell-lab.org/rots.php
+https://mitchell-lab.biochem.wisc.edu/soi/index.php
This software is an implementation of the two following papers:
diff --git a/data/points/SO3_10000.off b/data/points/SO3_10000.off
index fbf9b273..3f2a3cda 100644
--- a/data/points/SO3_10000.off
+++ b/data/points/SO3_10000.off
@@ -1,5 +1,5 @@
-OFF
-10000 1 0
+nOFF
+9 10000 1 0
2.08167e-17 0 -1 -0.500001 0.866026 0 0.866026 0.500001 -2.08167e-17
0 0 -1 0.500001 -0.866026 0 -0.866026 -0.500001 0
0 0 -1 -1 0 0 0 1 0
diff --git a/data/points/SO3_50000.off b/data/points/SO3_50000.off
index 635e8988..9b23a78f 100644
--- a/data/points/SO3_50000.off
+++ b/data/points/SO3_50000.off
@@ -1,5 +1,5 @@
-OFF
-50000 1 0
+nOFF
+9 50000 1 0
2.08167e-17 0 -1 -0.500001 0.866026 0 0.866026 0.500001 -2.08167e-17
0 0 -1 0.500001 -0.866026 0 -0.866026 -0.500001 0
0 0 -1 -1 0 0 0 1 0
diff --git a/data/points/bunny.COPYRIGHT b/data/points/bunny.COPYRIGHT
new file mode 100644
index 00000000..310ca5b5
--- /dev/null
+++ b/data/points/bunny.COPYRIGHT
@@ -0,0 +1,6 @@
+The bunny pointset comes from the Stanford Computer Graphics Laboratory.
+http://graphics.stanford.edu/data/3Dscanrep/
+
+Please acknowledge...
+
+Please be sure to acknowledge the source of the bunny data set. You are welcome to use the bunny data and models for research purposes. You are also welcome to mirror or redistribute them for free. Finally, you may publish images made using these models, or the images on this web site, in a scholarly article or book - as long as credit is given to the Stanford Computer Graphics Laboratory. However, such models or images are not to be used for commercial purposes, nor should they appear in a product for sale (with the exception of scholarly journals or books), without our permission.
diff --git a/data/points/bunny_10 b/data/points/bunny_10
deleted file mode 100644
index c7d9654d..00000000
--- a/data/points/bunny_10
+++ /dev/null
@@ -1,11 +0,0 @@
-10
--0.0164722 0.0382453 0.0209318
--0.0641407 0.171114 -0.0471776
-0.023086 0.119339 0.0317977
-0.00506037 0.0347021 0.0393176
--0.066143 0.143958 0.0413147
--0.0445017 0.163753 0.00542301
--0.0689729 0.181022 -0.0546459
--0.0931085 0.131006 0.0192314
-0.000506827 0.0489752 0.0512269
--0.0615935 0.160001 -0.0315914
diff --git a/data/points/bunny_10.st b/data/points/bunny_10.st
deleted file mode 100644
index 9b5df4fe..00000000
--- a/data/points/bunny_10.st
+++ /dev/null
@@ -1,100 +0,0 @@
-0 0 0.00247782
-0 1 0.00247782
-1 1 0 0.00247782
-0 2 0.00247782
-1 2 0 0.00247782
-1 2 1 0.00247782
-2 2 1 0 0.00247782
-0 3 0.00247782
-1 3 0 0.00247782
-1 3 1 0.00247782
-2 3 1 0 0.00247782
-1 3 2 0.00247782
-2 3 2 0 0.00247782
-2 3 2 1 0.00247782
-3 3 2 1 0 0.00247782
-0 4 0.00261317
-0 5 0.00261317
-1 5 4 0.00261317
-0 6 0.00261317
-1 6 4 0.00261317
-1 6 5 0.00261317
-2 6 5 4 0.00261317
-0 7 0.00261317
-1 7 4 0.00261317
-1 7 5 0.00261317
-2 7 5 4 0.00261317
-1 7 6 0.00261317
-2 7 6 4 0.00261317
-2 7 6 5 0.00261317
-3 7 6 5 4 0.00261317
-0 8 0.0036179
-1 8 0 0.0036179
-1 8 2 0.0036179
-2 8 2 0 0.0036179
-1 8 3 0.0036179
-2 8 3 0 0.0036179
-2 8 3 2 0.0036179
-3 8 3 2 0 0.0036179
-1 4 2 0.00425181
-1 4 3 0.00425181
-2 4 3 2 0.00425181
-1 8 4 0.00425181
-2 8 4 2 0.00425181
-2 8 4 3 0.00425181
-3 8 4 3 2 0.00425181
-0 9 0.0043696
-1 9 2 0.0043696
-1 9 4 0.0043696
-2 9 4 2 0.0043696
-1 9 8 0.0043696
-2 9 8 2 0.0043696
-2 9 8 4 0.0043696
-3 9 8 4 2 0.0043696
-1 6 2 0.00496515
-2 6 4 2 0.00496515
-1 9 6 0.00496515
-2 9 6 2 0.00496515
-2 9 6 4 0.00496515
-3 9 6 4 2 0.00496515
-1 9 5 0.00514768
-2 9 6 5 0.00514768
-1 9 7 0.00514768
-2 9 7 5 0.00514768
-2 9 7 6 0.00514768
-3 9 7 6 5 0.00514768
-1 6 3 0.00534763
-2 6 3 2 0.00534763
-2 6 4 3 0.00534763
-3 6 4 3 2 0.00534763
-1 9 0 0.00624121
-2 9 2 0 0.00624121
-2 9 8 0 0.00624121
-3 9 8 2 0 0.00624121
-2 9 7 4 0.00696546
-3 9 7 6 4 0.00696546
-1 5 3 0.00980522
-2 5 4 3 0.00980522
-2 6 5 3 0.00980522
-3 6 5 4 3 0.00980522
-1 8 7 0.0164489
-2 8 7 4 0.0164489
-2 9 8 7 0.0164489
-3 9 8 7 4 0.0164489
-1 5 2 0.0239742
-2 5 3 2 0.0239742
-2 6 5 2 0.0239742
-3 6 5 3 2 0.0239742
-1 7 3 0.0280892
-2 7 4 3 0.0280892
-2 7 5 3 0.0280892
-3 7 5 4 3 0.0280892
-2 9 5 2 0.0515804
-3 9 6 5 2 0.0515804
-1 7 2 0.261657
-2 7 5 2 0.261657
-2 9 7 2 0.261657
-3 9 7 5 2 0.261657
-2 7 3 2 1.03191
-3 7 5 3 2 1.03191
-
diff --git a/data/points/bunny_1000 b/data/points/bunny_1000
deleted file mode 100644
index ff22c361..00000000
--- a/data/points/bunny_1000
+++ /dev/null
@@ -1,1001 +0,0 @@
-1000
--0.0164722 0.0382453 0.0209318
--0.0641407 0.171114 -0.0471776
-0.023086 0.119339 0.0317977
-0.00506037 0.0347021 0.0393176
--0.066143 0.143958 0.0413147
--0.0445017 0.163753 0.00542301
--0.0689729 0.181022 -0.0546459
--0.0931085 0.131006 0.0192314
-0.000506827 0.0489752 0.0512269
--0.0615935 0.160001 -0.0315914
--0.0245032 0.0960169 0.0442753
--0.0258992 0.0891655 0.049535
--0.000499367 0.0456802 0.0470389
--0.0171808 0.0654583 0.0528522
-0.00116916 0.131228 0.00582139
--0.0356565 0.122935 -0.00798984
--0.0701892 0.156285 0.021569
--0.0173569 0.038443 0.0259817
--0.0716413 0.0763478 -0.0132577
-0.0528545 0.0568172 0.0288563
--0.0325067 0.0732308 0.0407775
--0.0760686 0.150008 -0.00987485
--0.030561 0.0774145 0.0410957
--0.0833901 0.0762729 0.00451303
--0.000492618 0.0925258 0.0556594
--0.0358778 0.159506 0.00240863
-0.0115111 0.114076 0.0384616
--0.0877889 0.0887187 0.00347532
--0.0261028 0.115949 -0.0147279
--0.0682913 0.165205 -0.0539869
--0.0225512 0.0933694 -0.0331106
--0.0538783 0.0999149 -0.0214389
-0.0435587 0.0959151 0.0211557
--0.0167991 0.0388632 -0.0107644
--0.0569142 0.0548839 0.00364185
-0.00749229 0.091015 0.0542708
--0.065316 0.0625169 -0.002419
--0.00749647 0.119689 0.0375376
--0.0772165 0.0934484 -0.0125951
--0.029008 0.0478606 -0.0250513
-0.00934189 0.0553527 -0.0303034
--0.0578677 0.104042 -0.0186102
-0.0405495 0.0999198 -0.00379356
--0.0894314 0.137929 0.0371779
-0.00710731 0.126603 -0.00643182
-0.058913 0.070492 0.0108657
--0.0922485 0.120133 0.0292903
-0.0395325 0.105566 0.0221621
--0.0376065 0.0365426 0.0444186
--0.0550158 0.128128 -0.00563226
--0.0561672 0.0336533 0.0186553
-0.0123436 0.0351165 0.0296251
--0.0899184 0.131005 0.0413145
-0.0065365 0.100373 0.0469448
--0.0502879 0.133796 0.0278403
--0.0716838 0.0351362 0.00880221
-0.0579126 0.0523842 0.0101848
--0.0639212 0.154791 0.00385831
--0.0654795 0.0384216 -0.00684663
--0.0615513 0.0624603 0.0259481
--0.0368013 0.0842007 -0.0223672
-0.0522757 0.0574291 -0.0035048
--0.0764972 0.123179 0.0527664
-0.0302998 0.0694384 -0.019812
--0.0334269 0.0486094 0.0413091
--0.00450651 0.0689184 0.0565193
-0.0425976 0.0887597 -0.00680771
--0.0707351 0.156208 0.0228366
-0.0548799 0.0492406 0.0202107
--0.00962948 0.168316 -0.023669
--0.0313363 0.11605 -0.0148117
--0.0225249 0.125571 0.0012278
-0.0122871 0.124953 0.0313975
--0.0343047 0.125361 0.0205265
--0.038499 0.0747376 0.0420783
-0.0292349 0.0759579 -0.0220376
--0.0255784 0.0477093 -0.0263526
--0.0750958 0.151313 -0.0258791
-0.0057743 0.0347896 0.0375885
--0.0926124 0.120126 0.0272917
--0.0366664 0.175138 -0.00407486
--0.00549337 0.088417 0.0570387
--0.0711473 0.17507 -0.0540267
--0.0776118 0.0739521 0.0284675
-0.0376746 0.104662 0.0282621
--0.0634881 0.121359 0.0469409
-0.0233296 0.0564006 -0.0254415
--0.0399361 0.123254 0.0259269
--0.000577398 0.0341134 -0.0181551
--0.000496894 0.0520342 0.0541515
--0.0701023 0.177167 -0.0478719
--0.0641167 0.143926 0.0389732
--0.0679369 0.165269 -0.0197719
--0.0681029 0.138305 0.0455026
--0.00280426 0.0384802 0.0198949
--0.0628273 0.0924874 -0.0189476
-0.0084946 0.0869435 0.0558386
-0.00910286 0.0348066 0.0183719
--0.0195983 0.126231 0.0213862
--0.0584949 0.143878 0.0330085
--0.0218343 0.0553077 0.0451067
--0.0645685 0.147457 -0.0230581
-0.0426227 0.0691122 -0.00279622
--0.035813 0.0842739 -0.0225525
--0.0819685 0.0791215 0.0284136
-0.0328852 0.113087 -0.00384394
--0.0677123 0.168615 -0.0283035
--0.0556635 0.140996 0.0299986
--0.0764958 0.131682 0.0526442
-0.0421796 0.0832522 0.0293553
--0.0848653 0.0855483 0.0264341
--0.0329445 0.121338 0.0269922
--0.0320197 0.058187 -0.0133973
--0.0322785 0.0421631 -0.0296986
-0.0401757 0.067497 -0.00878165
--0.0904989 0.148452 0.0245146
--0.00947974 0.0561444 0.0530127
--0.0310333 0.0383692 -0.000250742
--0.0780713 0.150403 0.0367551
--0.0872126 0.146051 0.00824907
--0.0735722 0.148626 -0.0268487
--0.00548676 0.116904 0.0394711
--0.0599006 0.132533 0.037981
--0.093479 0.129659 0.0212406
--0.0639063 0.120904 -0.00875525
--0.028606 0.0356961 0.0524615
--0.0652024 0.153998 -0.041972
--0.0262134 0.0765572 0.0473962
--0.0774721 0.155387 0.0234212
--0.0628707 0.0345025 0.0358026
-0.0434964 0.0555926 0.0322399
--0.0618022 0.142496 0.0370478
--0.0638273 0.0910291 -0.0188305
--0.0636286 0.0672101 0.0337087
--0.0842132 0.092522 0.0298256
-0.0185123 0.115397 0.0365584
--0.0666269 0.131204 0.0458398
--0.0653475 0.165775 -0.0260007
--0.0182573 0.181629 -0.0177335
--0.0142757 0.185348 -0.0257883
-0.0485082 0.0624718 0.0300814
--0.0254927 0.0974122 0.0441083
--0.0446561 0.0349999 0.0427486
--0.0616719 0.0410515 0.0160296
--0.0179307 0.0931593 -0.0348763
--0.00828798 0.130102 0.00662088
--0.0525878 0.149334 0.020403
--0.0102534 0.128943 0.0232512
-0.0445378 0.0959706 0.0101622
--0.0465291 0.0335268 -0.00814027
-0.00437534 0.131145 0.0198749
--0.0394369 0.03436 0.0321562
--0.0107155 0.127812 0.0260097
--0.0273383 0.17123 -0.0098418
--0.0037118 0.0655569 -0.0347446
--0.0630689 0.150547 -0.0265942
--0.0776846 0.16386 -0.0329461
--0.0728796 0.151218 -0.0388899
-0.038172 0.0967289 0.0325586
--0.058907 0.0983413 -0.0195805
--0.00549542 0.0965711 0.0536823
-0.00650609 0.0503877 0.0517539
--0.0847722 0.113367 0.0459387
-0.0309512 0.0822193 0.0430727
--0.0159859 0.0984773 0.0464357
-0.0361586 0.0781359 0.0382445
-0.0417308 0.0422749 0.000248643
--0.0631435 0.175042 -0.061564
--0.0251041 0.0945178 -0.0276305
-0.018776 0.122594 -0.0061273
-0.0173125 0.0726566 0.0514253
--0.0377229 0.0724783 -0.0174913
-0.0173872 0.0432828 -0.0228623
-0.0416262 0.0912615 0.0286616
--0.050567 0.0474222 -0.00850865
--0.0150865 0.162585 -0.00969001
-0.0143357 0.0566765 -0.0290221
--0.0309078 0.065095 -0.0224325
-0.045522 0.0805737 0.00219452
--0.0725374 0.138625 0.0483183
--0.0476365 0.150675 0.00992423
--0.0799103 0.125126 -0.00560703
--0.051025 0.159915 -0.00453945
-0.00139766 0.0419298 -0.0244976
--0.0664219 0.0352675 0.015055
--0.00832508 0.130422 0.0138058
--0.00366678 0.0481589 -0.0301707
--0.0738566 0.161044 -0.0339379
-0.0319703 0.0475137 0.0318758
-0.0188215 0.126955 0.00377584
--0.0309617 0.044825 -0.0281993
-0.0456484 0.0875951 0.00518134
--0.0521074 0.0583062 0.0285239
--0.0171825 0.0382402 0.011747
--0.0692976 0.0615474 0.00912978
--0.0232044 0.175652 -0.0207635
--0.0406662 0.0592305 -0.0118049
-0.0572429 0.0508905 0.0121849
--0.0488285 0.0416917 0.0446681
-0.0455301 0.0677752 0.0254231
--0.0846369 0.110251 0.00429821
--0.0754652 0.163196 -0.0162299
--0.0247271 0.0564997 0.0408849
--0.0639975 0.0601011 0.00610183
--0.0741599 0.155538 0.00126713
--0.0728899 0.122329 -0.00823917
-0.010861 0.0360066 0.0447493
-0.0150176 0.0355797 0.04239
--0.0437155 0.0710509 -0.0175901
-0.0271589 0.093209 -0.0206672
--0.00592646 0.12418 0.0336126
--0.0810295 0.0895599 -0.00769505
--0.0920663 0.121362 0.00826874
--0.0862277 0.0832671 0.00749085
--0.085371 0.127983 -0.0026626
--0.081815 0.108922 0.02836
--0.0491537 0.135503 0.0034228
-0.00885847 0.0887054 -0.0320419
--0.0673146 0.0446682 0.00602001
-0.0152697 0.128852 0.0195703
-0.0231834 0.0422122 0.040252
--0.0286261 0.0463451 -0.0269667
-0.0449154 0.0763231 0.00019353
--0.0387296 0.0739178 -0.0177449
-0.0212191 0.0819428 -0.0266321
--0.00126307 0.039726 0.0470556
--0.0261021 0.0379463 0.0228342
--0.0448562 0.101383 -0.0214692
--0.0014827 0.0390261 -0.00225591
--0.0648948 0.103911 -0.0165942
--0.0624902 0.155293 -0.0145941
-0.000436968 0.130385 0.0227651
--0.0219738 0.059501 0.0451263
--0.0502789 0.129408 -0.00267456
--0.0216757 0.065257 0.0474751
--0.0621482 0.16155 -0.0395978
-0.0427418 0.0916392 0.0261768
-0.00967962 0.127274 0.0289934
--0.0728707 0.168003 -0.0450202
--0.0305611 0.179398 -0.00755573
-0.0341402 0.0902832 0.0407178
--0.0491119 0.0361611 0.0459929
-0.0392087 0.0739776 0.0338431
--0.0897017 0.151503 0.0171224
-0.0407967 0.105643 0.0101649
--0.023633 0.0478399 -0.0272396
--0.0504958 0.0862332 0.0455716
--0.0451092 0.153606 0.00834539
--0.0616087 0.146812 0.0373554
-0.0280342 0.0346822 0.009507
-0.0565861 0.0685555 0.00335277
--0.027568 0.0674298 0.0392602
--0.0926576 0.117463 0.0373027
--0.0334278 0.124984 0.0208436
--0.0602518 0.034678 0.0430709
--0.0574989 0.107052 0.0398301
--0.091226 0.128161 0.00727002
-0.0400022 0.0913669 0.0315547
--0.0656743 0.138242 0.0419702
--0.0852141 0.0805923 0.0204766
--0.0444957 0.111173 0.0370595
--0.044489 0.0803636 0.042222
--0.00648998 0.122405 0.0354776
-0.00602348 0.111527 -0.0200414
--0.0860119 0.132159 0.00027761
-0.0521231 0.0734583 0.0172399
--0.0155403 0.0446621 0.0510487
--0.0397503 0.0768521 -0.0186787
--0.0682155 0.0787029 0.0404793
--0.0813927 0.0758934 0.0225084
--0.010188 0.0386565 4.14997e-05
--0.00149609 0.0912323 -0.0347548
--0.0294974 0.111128 0.0367729
--0.0503924 0.0501648 0.0186468
--0.0104698 0.070299 0.0557764
-0.0327323 0.0809002 0.0421262
--0.0328911 0.122131 -0.00712262
--0.0861948 0.1005 0.0258994
--0.0319282 0.178722 -0.00808101
--0.050675 0.140101 0.0024044
--0.0346788 0.0636729 -0.0139354
--0.00820144 0.0344928 -0.0181278
--0.0830162 0.0939316 0.0314035
-0.0438286 0.0611702 -0.00330591
--0.0162799 0.127645 0.0211086
--0.0615233 0.0354132 0.043881
--0.0755937 0.0809959 -0.0116148
--0.0632393 0.166259 -0.0385929
--0.0156738 0.0511142 -0.0317767
-0.000751147 0.0339678 -0.0215355
--0.0534027 0.0336932 0.022744
-0.0102837 0.0348658 -0.0091814
--0.0285082 0.0874866 -0.0336017
--0.0849712 0.111906 0.0292041
--0.0732162 0.169408 -0.0460252
--0.00746424 0.110009 0.0430329
--0.0587154 0.0723411 -0.016523
--0.00333145 0.0968513 -0.0305901
-0.0385608 0.0713011 0.0346329
--0.0463734 0.133247 0.0130756
--0.0474986 0.104275 0.0408376
--0.0714849 0.147284 -0.0260827
--0.0404433 0.0461446 -0.0193164
-0.000709469 0.125628 -0.00726116
-0.028516 0.117882 -0.00302906
--0.00249354 0.0746702 0.0587588
-0.0463101 0.0806468 0.00818141
--0.0245515 0.114015 0.0358596
--0.0396488 0.0563195 -0.0111963
--0.0236961 0.0607746 0.0425604
--0.0336359 0.0548461 -0.0105101
--0.0585033 0.0337545 0.0163089
-0.0212208 0.126407 0.0160623
--0.0729862 0.15207 0.0354642
--0.085378 0.128494 0.0496125
-0.00429457 0.122356 -0.0118056
-0.0203517 0.0672611 0.0487139
--0.0452845 0.0395903 -0.0182935
--0.0211124 0.182965 -0.0210132
--0.0295465 0.0819132 0.0441437
--0.0777488 0.07493 0.029356
-0.00824435 0.0966482 -0.0263491
--0.0588066 0.0854157 -0.0208208
--0.0718999 0.113582 -0.00821597
--0.0893735 0.0901981 0.0104595
-0.032603 0.0835706 0.0419526
--0.0230608 0.0594124 0.0433799
-0.0284544 0.121423 0.0116324
--0.0832785 0.12444 0.0504652
--0.0396241 0.0520021 -0.0108773
-0.00721225 0.0837864 -0.0330068
--0.046713 0.131987 0.00556897
--0.0663702 0.157999 -0.00906779
--0.067736 0.0779793 -0.0166569
--0.0508692 0.102779 -0.0209206
--0.0828958 0.151378 0.00422572
--0.0346622 0.118788 -0.0116368
--0.0726425 0.0716156 -0.00744076
--0.059725 0.0469427 0.0326718
--0.0468444 0.033579 -0.0045851
--0.0384976 0.100064 0.0415702
--0.050989 0.121022 -0.0119137
--0.0624226 0.152205 -0.0125757
--0.085741 0.151793 0.0266482
--0.0826468 0.144713 0.0407672
--0.0685649 0.0705046 -0.00966184
--0.0734033 0.167233 -0.0217479
--0.0455099 0.155064 0.0077969
-0.022652 0.0862116 0.0486888
-0.043364 0.0547822 -0.00644446
--0.054457 0.14621 0.0274041
--0.0639777 0.155958 0.0237716
--0.0882347 0.0861347 0.011472
-0.00545294 0.1216 -0.0129959
--0.0334673 0.174268 -0.00177832
--0.00402179 0.129762 0.0240423
--0.0185051 0.0711438 0.0540217
--0.0872329 0.150111 0.00920897
--0.090033 0.147105 0.0269347
--0.0141936 0.0419832 0.0511586
--0.0335873 0.154463 -0.00838872
-0.0441357 0.083266 -0.000805736
--0.0528842 0.102762 -0.0205636
--0.0125091 0.0815143 0.0575917
-0.0197435 0.125962 0.0226458
--0.067993 0.0619274 0.01978
--0.0216083 0.039391 -0.0287125
--0.0767116 0.165247 -0.022942
--0.0861936 0.111308 0.0401352
--0.0238165 0.0854111 -0.0376407
--0.0442161 0.123225 0.0243959
--0.0175443 0.0460366 0.0510389
--0.0272334 0.0902723 -0.0326005
--0.0459359 0.168402 -0.00594095
-0.0355423 0.0512597 0.0315836
-0.0451079 0.0636949 -0.00183531
--0.0368834 0.125578 -0.00482073
-0.0196258 0.0457587 -0.0217227
--0.00773224 0.109619 -0.0221011
--0.0514957 0.0876341 0.0455102
--0.00269376 0.0613003 -0.0344696
--0.0512049 0.147808 0.0143958
-0.0266901 0.106496 -0.0148024
-0.0383861 0.0476151 -0.00591592
--0.0136895 0.0952904 -0.0330103
-0.0368491 0.0767795 0.0374896
--0.029592 0.0522946 -0.0203629
-0.0482309 0.0500295 -0.00369862
-0.0381363 0.0794306 0.0358549
--0.0677271 0.155796 -0.00229118
-0.026043 0.0392404 0.0305576
-0.0208388 0.126564 0.0173475
-0.0159735 0.0448127 0.0438765
--0.0681757 0.118633 0.0523539
--0.065068 0.136793 0.0410949
--0.0454458 0.168254 0.00168996
--0.0715222 0.142818 0.0455702
--0.0604912 0.112522 0.03629
--0.00074702 0.0712329 -0.0350931
--0.0894331 0.150114 0.0121902
--0.0185746 0.0381525 0.0151621
-0.0291213 0.0348096 0.00960912
-0.0404448 0.0985503 0.0271661
-0.0134712 0.0936014 0.0511282
--0.021496 0.103017 0.0435858
-0.00918856 0.0342345 -0.00132638
--0.0508332 0.0956285 -0.0221275
--0.0613646 0.0394268 0.0439671
-0.0264379 0.0968548 0.0436578
--0.0646669 0.0405364 0.0387423
-0.0125029 0.0475354 0.045933
-0.0412949 0.104257 0.00416372
--0.00222052 0.117102 -0.0161156
--0.00995662 0.169734 -0.0198047
-0.0200755 0.0399795 -0.0157069
--0.0839165 0.110514 0.0395089
--0.0546435 0.116042 -0.0146857
-0.0268767 0.0854059 -0.022529
--0.0543926 0.0337363 0.0224962
--0.049781 0.0841032 -0.0216622
-0.0431463 0.100109 0.00616795
-0.0393814 0.0780345 0.0341058
--0.0162612 0.17862 -0.0260128
--0.0335093 0.0676035 0.0406399
--0.0176483 0.0352702 -0.0188352
--0.031463 0.0519033 0.0373773
--0.0803572 0.0803552 0.0319871
--0.0320868 0.159267 -0.0129293
-0.0132853 0.0589897 0.0507165
--0.0103631 0.180289 -0.0277342
--0.0144925 0.0559441 0.0511232
--0.0246444 0.0381166 0.0247786
-0.0170669 0.0871276 -0.028336
-0.00372554 0.105196 -0.0213905
--0.0777857 0.156925 -0.0179137
-0.0578227 0.0710073 0.0178627
--0.0582482 0.0336534 0.0128901
--0.0520861 0.0545712 0.0266312
-0.0269849 0.113053 -0.00983991
-0.0429421 0.0467386 0.030224
-0.00548112 0.11414 0.0405028
-0.0607975 0.0637336 0.0101416
--0.0895137 0.135181 0.0391853
--0.0822803 0.139383 0.0462108
-0.00350363 0.0883757 0.0563643
--0.0599112 0.109712 -0.0163845
--0.0699244 0.107994 -0.0118147
--0.073438 0.145781 -0.0138542
--0.0702694 0.156361 0.0186365
-0.0365208 0.0713424 0.036933
--0.0764811 0.141399 0.0471717
--0.0338378 0.0943788 -0.02372
--0.0185768 0.055451 0.0489119
--0.0294962 0.107041 0.0398129
-0.0351663 0.0783387 -0.0157415
--0.0823976 0.095314 0.0321564
-0.0458052 0.08902 0.00916777
-0.00466954 0.0341296 0.0180802
-0.012258 0.0751733 -0.0308354
--0.0176564 0.0480544 -0.0295902
--0.0487658 0.0811872 -0.020682
--0.0375125 0.045091 0.0407522
-0.00960807 0.0375632 0.0322947
-0.0522688 0.0462249 0.00921199
--0.0452834 0.0395877 -0.019291
--0.0396931 0.126183 0.0200311
--0.0903381 0.144712 0.0141544
--0.0430213 0.0450576 -0.0153284
--0.0539191 0.129665 -0.00510771
--0.0384876 0.108386 0.0375357
--0.0496388 0.0605583 -0.0113235
--0.034501 0.115223 0.0328885
--0.0540284 0.131061 -0.00500164
--0.0147028 0.0389017 0.0333119
--0.0207376 0.0641563 -0.0358205
-0.00590682 0.131658 0.0132863
--0.0819436 0.154696 0.0145801
-0.0526661 0.0660937 -0.000184776
--0.0526201 0.14007 0.0244025
--0.0752504 0.177839 -0.0529463
--0.0574955 0.0946379 0.0447737
-0.0456129 0.0904097 0.00518194
--0.0282629 0.122524 0.022734
--0.0680338 0.142566 0.0438693
--0.0643033 0.0426016 0.0312522
--0.0314971 0.102929 0.041974
--0.00589664 0.0980966 0.0519993
--0.0542782 0.132533 0.0338047
--0.0911122 0.11473 0.0343167
--0.0493972 0.140141 0.00739907
--0.0577664 0.0485104 0.00767417
--0.0629684 0.139576 0.0370615
--0.0122087 0.128137 0.0240139
-0.00116984 0.129366 -0.00128907
--0.039496 0.0634667 0.0415276
--0.0427066 0.0696149 -0.0170299
--0.0721201 0.149786 -0.0402916
--0.0637423 0.168365 -0.0426884
--0.0228169 0.0383283 0.0285633
--0.0894925 0.143336 0.0131803
--0.0408822 0.128708 0.0107294
--0.043783 0.147719 0.00491206
-0.00912223 0.0833108 0.0554277
--0.0543042 0.0335497 0.00301212
--0.0544171 0.0333785 -0.00775516
-0.0295237 0.0727272 0.042682
--0.0504982 0.112495 0.0358796
--0.0240218 0.119915 -0.0108978
--0.0535232 0.0556038 0.0117195
--0.0480175 0.133707 0.00490199
-0.00583381 0.129313 0.0261699
--0.0405566 0.149165 -0.00293165
--0.0286765 0.0690744 -0.0314836
-0.0453693 0.0693828 0.00245115
-0.0581659 0.056561 0.00517446
-0.0192888 0.0651078 -0.0282476
--0.0228892 0.0739252 0.0512281
--0.0217183 0.113234 -0.017904
-0.0365187 0.0526805 0.0315096
-0.0490482 0.0539975 0.0303486
-0.0175085 0.114012 0.0373101
--0.0328107 0.126843 0.0122027
--0.0687814 0.0336983 0.00353162
-0.0220892 0.0906332 -0.0239505
--0.0460528 0.122513 0.026245
-0.0381409 0.109688 0.00657231
-0.0368421 0.0742334 -0.0127504
--0.0657975 0.0340784 0.0127357
--0.0706216 0.146831 -0.0255714
--0.0468292 0.091298 -0.0217206
--0.0914681 0.144718 0.0171554
--0.0624908 0.0343254 0.0238098
-0.0543739 0.0477987 0.0161989
--0.0195403 0.1757 -0.0161256
-0.0224671 0.0343921 0.00678503
--0.0654707 0.155271 0.00728456
--0.0897135 0.12265 0.00431103
--0.0501651 0.0361307 0.0461721
--0.0901888 0.139114 0.0151891
--0.0726107 0.156829 -0.0349095
--0.0334964 0.0718545 0.0411869
-0.0106165 0.0644536 0.0539383
-0.0274263 0.0491525 0.0376576
--0.0157908 0.169796 -0.0160148
--0.0608326 0.17151 -0.0610901
-0.0136156 0.126814 -0.00267762
-0.0293325 0.0535401 0.0386956
--0.0652579 0.153012 -0.0402459
-0.0264019 0.036087 0.0225582
-0.0101281 0.105858 -0.0202342
--0.0674046 0.0833115 0.0429955
--0.0312435 0.0538841 -0.0143722
-0.0424267 0.0441756 -0.00158684
--0.0305089 0.0760274 0.0408429
--0.0849899 0.127963 -0.0030064
--0.0223249 0.0386602 -0.0135496
-0.0216012 0.112963 -0.0137495
--0.0224297 0.0552774 0.0442986
--0.093152 0.121537 0.0362834
--0.0384463 0.166779 0.00239389
-0.0317419 0.0667553 -0.0187125
--0.0127135 0.100022 -0.0239701
-0.0204112 0.0371925 -0.00568428
-0.0383001 0.0969495 -0.00880451
--0.0500528 0.150184 -0.0037815
--0.0578783 0.106898 -0.0179862
-0.0485378 0.0682762 0.00156381
--0.0708965 0.0341323 0.00629169
--0.0871174 0.110466 0.0103621
--0.0235739 0.0944939 0.0470656
--0.0164815 0.0515035 0.0485835
-0.0325428 0.0380502 1.57112e-05
-0.0385774 0.0888011 0.0348199
--0.0628692 0.0445185 0.0382675
--0.0572856 0.125533 0.0399888
--0.0780066 0.0940671 0.0362827
--0.0361012 0.160724 -0.0132118
-0.0200495 0.124902 -0.000599563
-0.0101263 0.107276 -0.0197522
-0.0224877 0.0961643 0.0466342
--0.077715 0.0852782 -0.0115916
--0.0164955 0.105778 0.0423459
--0.0725318 0.101313 0.038599
--0.0663565 0.0783826 0.0411592
--0.0644378 0.17995 -0.0588828
--0.0645973 0.171184 -0.0458828
-0.0111199 0.129735 0.0223368
--0.018333 0.172741 -0.0161594
--0.0864925 0.10492 0.00639597
--0.0144943 0.0500942 0.0487331
--0.0855601 0.095177 0.0282718
-1.67787e-05 0.0386604 0.0239291
-0.0109499 0.0344084 0.00259617
--0.0270041 0.168274 -0.00938266
--0.0378811 0.107099 -0.0200653
-0.060304 0.0664655 0.0101406
--0.0478845 0.108472 -0.0188663
-0.0181085 0.0591163 0.0489014
--0.0260899 0.0522789 0.0395517
-0.0049437 0.0984176 -0.0242128
--0.0623314 0.0357831 0.0433788
-0.0110403 0.0725847 0.0546235
--0.0864956 0.084691 0.0204775
--0.00849993 0.0787667 0.0579153
--0.0260008 0.0382709 0.000860974
--0.06937 0.145758 -0.0234859
--0.0314168 0.117929 -0.0127586
--0.0261669 0.0378674 0.0174813
--0.0832309 0.120353 0.049216
--0.0617814 0.16156 -0.0355923
--0.0779669 0.165862 -0.0278956
--0.0698398 0.0922797 -0.0162924
-0.0483255 0.0503286 -0.00380134
-0.0451716 0.0889782 0.0181643
-0.0329815 0.112282 -0.00498623
-0.0279206 0.0916217 -0.0209795
-0.0155 0.11402 0.0377783
--0.0105379 0.0431327 0.0497176
-0.0606167 0.0609422 0.00915424
--0.0181983 0.18599 -0.0174024
-0.0189716 0.115037 -0.0139804
--0.0590849 0.0644137 0.0318252
--0.0819254 0.12582 0.0519232
--0.0588398 0.0954803 -0.0203334
--0.0674426 0.148384 -0.0326115
-0.0387628 0.10462 0.0262683
-0.00841723 0.129272 0.0256623
--0.0196119 0.0364667 -0.0278852
--0.0376923 0.162356 -0.000243841
-1.88808e-05 0.115368 -0.0182789
-0.0393962 0.0505525 -0.00668347
--0.0116788 0.0555838 -0.0339192
-0.0363865 0.0713868 -0.0138007
--0.0821651 0.110069 0.034903
-0.022728 0.117081 -0.0101857
--0.0515389 0.0417461 -0.0105815
-0.0219588 0.123501 -0.00109075
-0.00735928 0.0960033 -0.0276522
--0.00349428 0.119696 0.0379021
--0.0470844 0.151656 -0.00519447
--0.0242296 0.0941248 -0.0298734
-0.0152433 0.0658912 0.0518711
--0.021804 0.0376594 -0.0181241
--0.0133966 0.121962 -0.00916065
-0.0365536 0.108655 0.0265769
--0.0668098 0.0880715 -0.0180091
--0.0665181 0.171112 -0.0407548
-0.0493343 0.0532247 -0.0043679
-0.0423933 0.0901635 -0.00682346
--0.0624126 0.150651 -0.0115734
-0.0373944 0.0505276 -0.00658166
--0.0411461 0.162173 -0.0113613
--0.065916 0.0662086 0.0305519
--0.0289729 0.083488 0.0456837
--0.000642523 0.0347913 0.0398677
--0.0738147 0.065744 0.00631032
-0.00351431 0.0938625 0.0544725
--0.0467733 0.12389 0.0269319
-0.0246632 0.123785 0.00595837
--0.0715256 0.0958228 0.0413941
-0.00252922 0.0362636 0.0463395
-0.00948792 0.0963424 0.0500581
-0.0292035 0.0400739 0.0286474
--0.0309481 0.0706991 -0.0284733
--0.054091 0.152763 0.0215579
-0.0118527 0.105542 -0.0197545
--0.0404793 0.0832528 0.0431634
--0.0448438 0.0985036 -0.0215544
--0.032014 0.0567822 -0.0123897
-0.00040853 0.0356817 0.00488121
-0.0447245 0.0861403 0.0231669
--0.0426307 0.0338188 -0.00946517
--0.0710495 0.141325 -0.00813095
--0.0255896 0.182763 -0.0105092
--0.0838169 0.107636 0.0253505
--0.0796245 0.0859561 0.0353266
-0.0240034 0.0449703 0.0396985
-0.00450108 0.0716864 0.0560951
--0.0676894 0.0750921 -0.0153176
--0.0466572 0.0369109 -0.0172699
--0.016529 0.0558872 0.0508401
--0.087831 0.103641 0.0093887
-0.0272256 0.10745 0.0377741
--0.0670064 0.0337953 0.0073865
--0.0866888 0.0833263 0.0124872
-0.0152687 0.0779357 -0.0299953
--0.0851819 0.152725 0.0105454
-0.000352424 0.0511166 -0.0306262
-0.0518495 0.0464359 0.0201911
-0.0554005 0.0553511 0.0254886
--0.0886141 0.0928486 0.00844707
-0.0129712 0.130228 0.0115965
--0.085549 0.104961 0.0233427
-0.0515991 0.0496316 0.0251833
-0.0131946 0.0878791 -0.0305989
--0.0693376 0.131255 0.0489674
--0.0660205 0.167997 -0.0305503
--0.0666146 0.174697 -0.0480375
--0.0293346 0.0347045 0.0427947
--0.0553259 0.126836 -0.00601308
--0.058583 0.0460291 0.0113967
--0.0416277 0.0337441 -0.014735
--0.0446642 0.0621749 -0.0132201
-0.0295862 0.120365 0.0134787
--0.0697163 0.064282 0.022673
--0.0805487 0.0789662 0.0306236
--0.0787564 0.154933 0.00983696
--0.0662707 0.14708 -0.0258685
--0.0248167 0.0949702 -0.0267501
--0.0407693 0.0826515 -0.0208197
-0.000514101 0.0346343 0.00952105
--0.0533361 0.138123 0.0280776
--0.0689277 0.115103 -0.00892086
--0.0865224 0.0913375 0.0024428
-0.0232602 0.0790529 -0.0256674
-0.0296786 0.0679688 -0.0198342
--0.0331127 0.123309 0.0239558
-0.0276403 0.118218 0.0284429
-0.00238303 0.0449286 -0.0261957
--0.0928278 0.124236 0.0382657
--0.0868685 0.11045 0.00936714
--0.0254875 0.0959781 0.0438332
-0.0132252 0.0808221 -0.0308314
-0.035265 0.0591791 0.0368077
--0.00944135 0.168135 -0.0197365
-0.0011864 0.12951 0.0259323
--0.0139593 0.0967237 -0.0305143
--0.00848922 0.0385737 0.0258802
-0.0562981 0.0619429 0.0011209
-0.0322546 0.0987343 -0.0145759
--0.0268707 0.103016 -0.0234914
--0.00655639 0.0384205 0.0209905
--0.0296666 0.0774462 0.0418826
--0.0626586 0.0676213 -0.0103966
-0.0374569 0.0904362 -0.0137042
--0.0712181 0.161 -0.0439365
-0.0243668 0.0889213 0.0476805
--0.0336134 0.0408899 -0.0298935
--0.0404969 0.0916505 0.0425962
-0.0443454 0.0903358 0.0221636
--0.0435232 0.163746 0.00524284
--0.0649943 0.0623954 0.0235277
--0.0613093 0.0593276 0.0181457
--0.0717978 0.155398 -0.0409076
--0.00868753 0.0584178 -0.0339256
--0.0904383 0.119966 0.00529664
--0.0601615 0.0333995 -0.00165181
--0.0612252 0.0407891 0.0437895
--0.0537348 0.0738508 -0.0172852
--0.0709057 0.10512 -0.0125462
--0.00333997 0.039253 0.0353398
--0.0469903 0.145002 0.00194161
--0.0250386 0.0659034 -0.0335362
--0.023273 0.0382876 0.00502865
-0.0111228 0.0960826 -0.0257288
-0.0198113 0.0954368 -0.0230239
-0.038476 0.104075 -0.00282883
--0.0843581 0.0883713 0.0286614
--0.0930341 0.118841 0.0362969
--0.0646767 0.146003 -0.0179612
-0.0284626 0.102127 0.0395666
--0.0435018 0.113907 0.034675
--0.0604863 0.0790224 0.042794
--0.089042 0.112536 0.0205154
--0.0524675 0.0344946 0.0345461
--0.0848716 0.119101 -0.00207765
--0.0120923 0.11442 -0.0172013
--0.079929 0.151371 0.00121035
--0.0920085 0.116136 0.0393096
-0.0361533 0.112569 0.0130564
--0.0196629 0.125034 -0.00230889
-0.000499429 0.115573 0.0406664
--0.0560183 0.147198 -0.00168648
--0.0873616 0.110481 0.0113565
--0.0416844 0.0636674 -0.0137203
--0.0651889 0.153592 -0.00278678
-0.0471599 0.07398 0.0153485
-0.0404106 0.0873775 0.0321991
--0.019434 0.184905 -0.0153275
--0.0438294 0.0913555 -0.0224139
--0.0527613 0.0797578 -0.020501
--0.0314155 0.0651435 -0.021432
-0.00948509 0.0950229 0.0512669
-0.0346346 0.107297 -0.007625
--0.0870053 0.0954387 0.00242783
--0.0617312 0.142927 -0.00565867
--0.0538929 0.14622 0.0244012
-0.0339044 0.115273 0.00366751
-0.049575 0.0693171 0.00251779
--0.0861009 0.106274 0.00635995
--0.00751182 0.075985 0.0578234
--0.0761849 0.0933719 -0.0135017
-0.0266626 0.0672707 0.0437593
--0.0314925 0.0932138 0.0444288
-0.0112937 0.0680868 -0.0307505
--0.086045 0.141863 0.00720055
-0.000490707 0.111422 0.0424934
--0.0516022 0.0502173 -0.00741774
--0.0709386 0.131124 -0.00852217
--0.0291841 0.125368 0.0164845
--0.0012258 0.095852 -0.0315171
--0.000697567 0.0641196 -0.0342689
--0.0797379 0.0738711 0.0228323
--0.0705682 0.0382102 0.00943236
--0.0558807 0.102663 -0.0193944
-0.0262875 0.0835737 0.0468767
--0.0206175 0.0364922 -0.0281092
-0.0306136 0.0779431 -0.0207534
-0.037492 0.0983062 -0.0097724
--0.0861064 0.0806138 0.0174966
--0.0488748 0.105594 -0.0196597
--0.0499497 0.0724883 0.0409516
--0.060435 0.131107 0.0389542
--0.0197383 0.108898 -0.0213322
--0.0328414 0.0943934 -0.0238538
-0.0071329 0.104451 -0.0211019
--0.0904392 0.125398 0.00528343
-0.0579573 0.0676391 0.00414749
--0.0890486 0.0915916 0.0214249
-0.0544885 0.0716156 0.00618127
-0.037936 0.0901639 0.0356574
--0.0631289 0.155254 0.0269868
-0.0280038 0.120349 0.024295
-0.00325461 0.0697315 -0.0336623
-0.0198002 0.0768324 0.0515324
-0.0135718 0.0504901 0.0475195
--0.0220331 0.041681 0.0538782
--0.0322365 0.126297 0.00653811
--0.020497 0.0855906 0.0563403
-0.0100844 0.123139 0.0340691
--0.0917617 0.141982 0.0191718
--0.00665267 0.0526646 -0.0325345
-0.0325469 0.0922927 -0.0176842
--0.00490321 0.0383839 0.0141185
-0.0393963 0.049102 -0.00636122
--0.0468295 0.0927337 -0.0216687
-0.0393484 0.0561243 -0.00568756
-0.0381042 0.0392738 0.00134927
--0.02061 0.0653432 0.0492306
--0.0644858 0.152894 -0.00250698
-0.0316363 0.118365 0.0113851
--0.0625842 0.162383 -0.0563311
--0.0126137 0.180121 -0.0236267
--0.0562637 0.142432 0.0309288
-0.0389203 0.10838 0.0161659
-0.0468209 0.0708789 0.021127
-0.0153317 0.060873 -0.028643
--0.067208 0.0447917 0.00368814
--0.0638714 0.15469 -0.0385902
--0.0624126 0.161536 -0.0416011
--0.011049 0.124435 -0.00785173
-0.0143712 0.0493733 -0.0267066
--0.0374862 0.0931566 0.0438456
--0.0278525 0.0807805 0.0474761
-0.0573848 0.0670309 0.00292365
--0.0304938 0.0960556 0.0449536
-0.0182602 0.127523 0.0192457
-0.0182204 0.080645 -0.0282763
--0.00275795 0.0740872 -0.0359501
--0.072697 0.155649 0.00759319
--0.0857527 0.0792184 0.0135098
--0.0604443 0.0456013 0.0296807
--0.0528198 0.0927332 -0.0219739
--0.0457202 0.0709417 -0.0164642
--0.054497 0.0889964 0.0448823
--0.0541353 0.147754 0.0254132
-0.05074 0.0503045 -0.00171178
--0.0926993 0.124215 0.0352716
-0.00850767 0.0786 0.0556334
--0.0141847 0.0405865 0.0511605
--0.0500491 0.0345412 0.0367666
--0.0744234 0.156022 0.0128056
--0.0148381 0.0386367 -0.0157684
--0.0896535 0.0916031 0.0184402
--0.0279306 0.125506 0.00666413
--0.0249827 0.0918474 0.0485489
--0.0247746 0.0385687 -0.0102357
--0.0718755 0.10648 -0.0114758
-0.0303733 0.115414 -0.00438737
-0.0390771 0.099844 -0.00681802
--0.0601235 0.0447437 0.0425684
-0.0559507 0.0508031 0.00520531
--0.087948 0.102288 0.00840013
--0.0802939 0.0732789 0.00250413
--0.00347452 0.114725 -0.0175669
--0.0780015 0.155773 0.018849
--0.0868392 0.0873072 0.00147849
-0.0114304 0.0346172 0.0371012
--0.0154945 0.0925097 0.0555061
-0.0207547 0.10431 -0.0184628
--0.0805113 0.153427 0.0283513
--0.0133702 0.0343611 -0.0190243
-0.045363 0.0932019 0.00717004
--0.0517619 0.079747 -0.0203928
--0.011137 0.171308 -0.0197957
--0.0797359 0.0706327 0.0105539
--0.0435047 0.116629 0.0323741
-0.0461192 0.0786876 0.0190773
-0.0257679 0.0349257 0.0180133
--0.0377436 0.127354 0.000111554
-0.0455391 0.0875946 0.0141649
--0.0115776 0.0962625 -0.032007
--0.0304054 0.0580102 -0.0194062
--0.0519213 0.118323 0.0336042
--0.0615165 0.15114 0.0355512
--0.0268549 0.175688 -0.00910606
-0.0291872 0.0462618 0.034893
--0.0828817 0.143196 0.00216401
--0.0229243 0.0972075 0.044901
--0.0420606 0.0344689 0.0332688
-0.00840712 0.0404044 -0.0234014
--0.0584986 0.100161 0.0428821
-0.0267286 0.0521731 -0.0207566
--0.0343564 0.043282 -0.028737
-0.035312 0.0840703 -0.0177861
-0.0167493 0.0874098 0.0506847
--0.0706375 0.156126 0.0126907
-0.0395317 0.0596774 0.0306966
-0.0160357 0.0807986 0.0531419
--0.0719071 0.105086 -0.0120336
-0.057752 0.0523416 0.0181873
--0.0705862 0.166615 -0.0490027
--0.069998 0.157611 -0.0031485
--0.0629727 0.118457 0.044154
--0.0098895 0.107351 -0.0224128
--0.0668287 0.169972 -0.0351376
--0.0538607 0.152062 0.0231076
-0.0286155 0.0795328 0.044942
-0.00747725 0.131195 0.0181386
-0.0525355 0.0678367 0.0261828
--0.069983 0.033931 0.00665746
--0.00449526 0.10588 0.044033
--0.0647467 0.143415 -0.011401
--0.0242451 0.0337053 -0.0224295
-0.0405945 0.102819 0.0221712
--0.0253936 0.106122 -0.0223873
--0.031866 0.126076 0.00521848
--0.0903832 0.132413 0.0312232
-0.0270423 0.0648893 -0.0216756
--0.0416036 0.125525 0.0208631
--0.0642885 0.148287 -0.0250747
-0.043249 0.0705728 -0.00179391
-0.00750831 0.0772509 0.056126
--0.0360471 0.125746 -0.0036679
--0.0534999 0.0820142 0.0450601
--0.0268076 0.0782799 -0.0366273
--0.0630392 0.0336157 0.00836468
-0.00450283 0.0924607 0.0546761
--0.0794816 0.0846149 0.0352279
--0.0354976 0.116636 0.0319301
-0.0590094 0.0552651 0.0101755
-0.0177618 0.100614 -0.0224544
-0.0141872 0.0347155 0.0357788
--0.0626395 0.0644043 -0.00619313
--0.0472223 0.168222 -0.000777409
--0.0688709 0.156258 0.0147705
--0.00209707 0.130745 0.0203917
-0.0438165 0.0959355 0.0191615
-0.0272253 0.120021 -0.000250724
--0.0623918 0.152158 -0.026581
--0.0619803 0.153737 -0.02558
--0.0110119 0.122536 -0.00980812
--0.00845767 0.100229 0.0476033
--0.053626 0.1255 0.0365054
-0.029243 0.0872327 -0.0208644
--0.0561028 0.133503 -0.00512832
--0.0536146 0.150855 0.0243962
--0.0729449 0.0805494 0.0386997
--0.0113093 0.0384672 0.00547553
-0.013929 0.0392001 0.0444158
--0.0743245 0.179234 -0.0539852
--0.0670834 0.168031 -0.0569976
-0.0269196 0.0418157 0.0333163
--0.0261604 0.114813 -0.0155316
-0.054979 0.06227 -0.000302264
-0.0447631 0.0931576 0.00318223
--0.028552 0.159576 0.000695282
--0.0196334 0.0906851 0.0545345
--0.0681661 0.173216 -0.0428508
--0.0670035 0.166617 -0.0570134
--0.00170857 0.0641356 -0.0344906
--0.0302923 0.115032 -0.0157497
--0.017789 0.0998203 0.0439009
-0.0575984 0.0711737 0.0088801
--0.0559485 0.119826 0.0383628
--0.0508832 0.106998 -0.0191626
--0.0856518 0.096702 -0.000561949
-0.0433856 0.0475038 -0.0047769
--0.0141839 0.177168 -0.0206609
--0.0318261 0.0623615 -0.0184459
--0.0694684 0.158126 -0.0509379
--0.059088 0.0445923 -0.00517311
--0.0680469 0.0887699 0.043444
-0.0413366 0.0588699 -0.00449648
--0.0108613 0.16611 -0.0209706
--0.0810695 0.111472 -0.000645954
-0.0236683 0.0535376 0.0428398
--0.0525009 0.104252 0.0406803
-0.0178265 0.128119 0.0148069
--0.0833287 0.0817012 -0.000498118 \ No newline at end of file
diff --git a/data/points/bunny_1000.st b/data/points/bunny_1000.st
deleted file mode 100644
index d915504e..00000000
--- a/data/points/bunny_1000.st
+++ /dev/null
@@ -1,26914 +0,0 @@
-0 0 5.92866e-06
-0 1 5.92866e-06
-1 1 0 5.92866e-06
-0 2 5.92866e-06
-1 2 0 5.92866e-06
-1 2 1 5.92866e-06
-2 2 1 0 5.92866e-06
-0 3 5.92866e-06
-1 3 0 5.92866e-06
-1 3 1 5.92866e-06
-2 3 1 0 5.92866e-06
-1 3 2 5.92866e-06
-2 3 2 0 5.92866e-06
-2 3 2 1 5.92866e-06
-3 3 2 1 0 5.92866e-06
-0 4 7.94797e-06
-0 5 7.94797e-06
-1 5 4 7.94797e-06
-0 6 7.94797e-06
-1 6 4 7.94797e-06
-1 6 5 7.94797e-06
-2 6 5 4 7.94797e-06
-0 7 7.94797e-06
-1 7 4 7.94797e-06
-1 7 5 7.94797e-06
-2 7 5 4 7.94797e-06
-1 7 6 7.94797e-06
-2 7 6 4 7.94797e-06
-2 7 6 5 7.94797e-06
-3 7 6 5 4 7.94797e-06
-0 8 8.0524e-06
-0 9 8.0524e-06
-1 9 8 8.0524e-06
-0 10 8.0524e-06
-1 10 8 8.0524e-06
-1 10 9 8.0524e-06
-2 10 9 8 8.0524e-06
-0 11 8.0524e-06
-1 11 8 8.0524e-06
-1 11 9 8.0524e-06
-2 11 9 8 8.0524e-06
-1 11 10 8.0524e-06
-2 11 10 8 8.0524e-06
-2 11 10 9 8.0524e-06
-3 11 10 9 8 8.0524e-06
-0 12 8.56176e-06
-0 13 8.56176e-06
-1 13 12 8.56176e-06
-0 14 8.56176e-06
-1 14 12 8.56176e-06
-1 14 13 8.56176e-06
-2 14 13 12 8.56176e-06
-0 15 8.56176e-06
-1 15 12 8.56176e-06
-1 15 13 8.56176e-06
-2 15 13 12 8.56176e-06
-1 15 14 8.56176e-06
-2 15 14 12 8.56176e-06
-2 15 14 13 8.56176e-06
-3 15 14 13 12 8.56176e-06
-0 16 9.03587e-06
-0 17 9.03587e-06
-1 17 16 9.03587e-06
-0 18 9.03587e-06
-1 18 16 9.03587e-06
-1 18 17 9.03587e-06
-2 18 17 16 9.03587e-06
-0 19 9.03587e-06
-1 19 16 9.03587e-06
-1 19 17 9.03587e-06
-2 19 17 16 9.03587e-06
-1 19 18 9.03587e-06
-2 19 18 16 9.03587e-06
-2 19 18 17 9.03587e-06
-3 19 18 17 16 9.03587e-06
-0 20 9.12196e-06
-1 20 4 9.12196e-06
-1 20 5 9.12196e-06
-2 20 5 4 9.12196e-06
-1 20 7 9.12196e-06
-2 20 7 4 9.12196e-06
-2 20 7 5 9.12196e-06
-3 20 7 5 4 9.12196e-06
-0 21 9.47159e-06
-0 22 9.47159e-06
-1 22 21 9.47159e-06
-0 23 9.47159e-06
-1 23 21 9.47159e-06
-1 23 22 9.47159e-06
-2 23 22 21 9.47159e-06
-0 24 9.47159e-06
-1 24 21 9.47159e-06
-1 24 22 9.47159e-06
-2 24 22 21 9.47159e-06
-1 24 23 9.47159e-06
-2 24 23 21 9.47159e-06
-2 24 23 22 9.47159e-06
-3 24 23 22 21 9.47159e-06
-0 25 9.62921e-06
-0 26 9.62921e-06
-1 26 25 9.62921e-06
-0 27 9.62921e-06
-1 27 25 9.62921e-06
-1 27 26 9.62921e-06
-2 27 26 25 9.62921e-06
-0 28 9.62921e-06
-1 28 25 9.62921e-06
-1 28 26 9.62921e-06
-2 28 26 25 9.62921e-06
-1 28 27 9.62921e-06
-2 28 27 25 9.62921e-06
-2 28 27 26 9.62921e-06
-3 28 27 26 25 9.62921e-06
-0 29 9.7451e-06
-0 30 9.7451e-06
-1 30 29 9.7451e-06
-0 31 9.7451e-06
-1 31 29 9.7451e-06
-1 31 30 9.7451e-06
-2 31 30 29 9.7451e-06
-0 32 9.7451e-06
-1 32 29 9.7451e-06
-1 32 30 9.7451e-06
-2 32 30 29 9.7451e-06
-1 32 31 9.7451e-06
-2 32 31 29 9.7451e-06
-2 32 31 30 9.7451e-06
-3 32 31 30 29 9.7451e-06
-0 33 1.00131e-05
-1 33 13 1.00131e-05
-1 33 14 1.00131e-05
-2 33 14 13 1.00131e-05
-1 33 15 1.00131e-05
-2 33 15 13 1.00131e-05
-2 33 15 14 1.00131e-05
-3 33 15 14 13 1.00131e-05
-0 34 1.06074e-05
-0 35 1.06074e-05
-1 35 34 1.06074e-05
-0 36 1.06074e-05
-1 36 34 1.06074e-05
-1 36 35 1.06074e-05
-2 36 35 34 1.06074e-05
-0 37 1.06074e-05
-1 37 34 1.06074e-05
-1 37 35 1.06074e-05
-2 37 35 34 1.06074e-05
-1 37 36 1.06074e-05
-2 37 36 34 1.06074e-05
-2 37 36 35 1.06074e-05
-3 37 36 35 34 1.06074e-05
-0 38 1.23003e-05
-1 38 0 1.23003e-05
-1 38 2 1.23003e-05
-2 38 2 0 1.23003e-05
-1 38 3 1.23003e-05
-2 38 3 0 1.23003e-05
-2 38 3 2 1.23003e-05
-3 38 3 2 0 1.23003e-05
-0 39 1.36987e-05
-1 39 4 1.36987e-05
-1 39 7 1.36987e-05
-2 39 7 4 1.36987e-05
-1 39 20 1.36987e-05
-2 39 20 4 1.36987e-05
-2 39 20 7 1.36987e-05
-3 39 20 7 4 1.36987e-05
-0 40 1.47276e-05
-0 41 1.47276e-05
-1 41 40 1.47276e-05
-0 42 1.47276e-05
-1 42 40 1.47276e-05
-1 42 41 1.47276e-05
-2 42 41 40 1.47276e-05
-0 43 1.47276e-05
-1 43 40 1.47276e-05
-1 43 41 1.47276e-05
-2 43 41 40 1.47276e-05
-1 43 42 1.47276e-05
-2 43 42 40 1.47276e-05
-2 43 42 41 1.47276e-05
-3 43 42 41 40 1.47276e-05
-0 44 1.48505e-05
-0 45 1.48505e-05
-1 45 44 1.48505e-05
-0 46 1.48505e-05
-1 46 44 1.48505e-05
-1 46 45 1.48505e-05
-2 46 45 44 1.48505e-05
-0 47 1.48505e-05
-1 47 44 1.48505e-05
-1 47 45 1.48505e-05
-2 47 45 44 1.48505e-05
-1 47 46 1.48505e-05
-2 47 46 44 1.48505e-05
-2 47 46 45 1.48505e-05
-3 47 46 45 44 1.48505e-05
-0 48 1.50542e-05
-0 49 1.50542e-05
-1 49 48 1.50542e-05
-0 50 1.50542e-05
-1 50 48 1.50542e-05
-1 50 49 1.50542e-05
-2 50 49 48 1.50542e-05
-0 51 1.50542e-05
-1 51 48 1.50542e-05
-1 51 49 1.50542e-05
-2 51 49 48 1.50542e-05
-1 51 50 1.50542e-05
-2 51 50 48 1.50542e-05
-2 51 50 49 1.50542e-05
-3 51 50 49 48 1.50542e-05
-0 52 1.52987e-05
-1 52 40 1.52987e-05
-1 52 41 1.52987e-05
-2 52 41 40 1.52987e-05
-1 52 42 1.52987e-05
-2 52 42 40 1.52987e-05
-2 52 42 41 1.52987e-05
-3 52 42 41 40 1.52987e-05
-0 53 1.53092e-05
-0 54 1.53092e-05
-1 54 53 1.53092e-05
-0 55 1.53092e-05
-1 55 53 1.53092e-05
-1 55 54 1.53092e-05
-2 55 54 53 1.53092e-05
-0 56 1.53092e-05
-1 56 53 1.53092e-05
-1 56 54 1.53092e-05
-2 56 54 53 1.53092e-05
-1 56 55 1.53092e-05
-2 56 55 53 1.53092e-05
-2 56 55 54 1.53092e-05
-3 56 55 54 53 1.53092e-05
-0 57 1.54338e-05
-1 57 14 1.54338e-05
-1 57 33 1.54338e-05
-2 57 33 14 1.54338e-05
-0 58 1.54338e-05
-1 58 14 1.54338e-05
-1 58 33 1.54338e-05
-2 58 33 14 1.54338e-05
-1 58 57 1.54338e-05
-2 58 57 14 1.54338e-05
-2 58 57 33 1.54338e-05
-3 58 57 33 14 1.54338e-05
-0 59 1.54943e-05
-0 60 1.54943e-05
-1 60 59 1.54943e-05
-0 61 1.54943e-05
-1 61 59 1.54943e-05
-1 61 60 1.54943e-05
-2 61 60 59 1.54943e-05
-0 62 1.54943e-05
-1 62 59 1.54943e-05
-1 62 60 1.54943e-05
-2 62 60 59 1.54943e-05
-1 62 61 1.54943e-05
-2 62 61 59 1.54943e-05
-2 62 61 60 1.54943e-05
-3 62 61 60 59 1.54943e-05
-0 63 1.57295e-05
-1 63 1 1.57295e-05
-1 63 2 1.57295e-05
-2 63 2 1 1.57295e-05
-1 63 3 1.57295e-05
-2 63 3 1 1.57295e-05
-2 63 3 2 1.57295e-05
-3 63 3 2 1 1.57295e-05
-0 64 1.58544e-05
-0 65 1.58544e-05
-1 65 64 1.58544e-05
-0 66 1.58544e-05
-1 66 64 1.58544e-05
-1 66 65 1.58544e-05
-2 66 65 64 1.58544e-05
-0 67 1.58544e-05
-1 67 64 1.58544e-05
-1 67 65 1.58544e-05
-2 67 65 64 1.58544e-05
-1 67 66 1.58544e-05
-2 67 66 64 1.58544e-05
-2 67 66 65 1.58544e-05
-3 67 66 65 64 1.58544e-05
-0 68 1.59051e-05
-0 69 1.59051e-05
-1 69 68 1.59051e-05
-0 70 1.59051e-05
-1 70 68 1.59051e-05
-1 70 69 1.59051e-05
-2 70 69 68 1.59051e-05
-0 71 1.59051e-05
-1 71 68 1.59051e-05
-1 71 69 1.59051e-05
-2 71 69 68 1.59051e-05
-1 71 70 1.59051e-05
-2 71 70 68 1.59051e-05
-2 71 70 69 1.59051e-05
-3 71 70 69 68 1.59051e-05
-0 72 1.59282e-05
-0 73 1.59282e-05
-1 73 72 1.59282e-05
-0 74 1.59282e-05
-1 74 72 1.59282e-05
-1 74 73 1.59282e-05
-2 74 73 72 1.59282e-05
-0 75 1.59282e-05
-1 75 72 1.59282e-05
-1 75 73 1.59282e-05
-2 75 73 72 1.59282e-05
-1 75 74 1.59282e-05
-2 75 74 72 1.59282e-05
-2 75 74 73 1.59282e-05
-3 75 74 73 72 1.59282e-05
-1 63 38 1.59724e-05
-2 63 38 2 1.59724e-05
-2 63 38 3 1.59724e-05
-3 63 38 3 2 1.59724e-05
-0 76 1.60492e-05
-0 77 1.60492e-05
-1 77 76 1.60492e-05
-0 78 1.60492e-05
-1 78 76 1.60492e-05
-1 78 77 1.60492e-05
-2 78 77 76 1.60492e-05
-0 79 1.60492e-05
-1 79 76 1.60492e-05
-1 79 77 1.60492e-05
-2 79 77 76 1.60492e-05
-1 79 78 1.60492e-05
-2 79 78 76 1.60492e-05
-2 79 78 77 1.60492e-05
-3 79 78 77 76 1.60492e-05
-0 80 1.60584e-05
-0 81 1.60584e-05
-1 81 80 1.60584e-05
-0 82 1.60584e-05
-1 82 80 1.60584e-05
-1 82 81 1.60584e-05
-2 82 81 80 1.60584e-05
-0 83 1.60584e-05
-1 83 80 1.60584e-05
-1 83 81 1.60584e-05
-2 83 81 80 1.60584e-05
-1 83 82 1.60584e-05
-2 83 82 80 1.60584e-05
-2 83 82 81 1.60584e-05
-3 83 82 81 80 1.60584e-05
-1 58 15 1.64089e-05
-2 58 15 14 1.64089e-05
-2 58 33 15 1.64089e-05
-3 58 33 15 14 1.64089e-05
-0 84 1.64915e-05
-1 84 33 1.64915e-05
-1 84 57 1.64915e-05
-2 84 57 33 1.64915e-05
-1 84 58 1.64915e-05
-2 84 58 33 1.64915e-05
-2 84 58 57 1.64915e-05
-3 84 58 57 33 1.64915e-05
-0 85 1.64998e-05
-0 86 1.64998e-05
-1 86 85 1.64998e-05
-0 87 1.64998e-05
-1 87 85 1.64998e-05
-1 87 86 1.64998e-05
-2 87 86 85 1.64998e-05
-0 88 1.64998e-05
-1 88 85 1.64998e-05
-1 88 86 1.64998e-05
-2 88 86 85 1.64998e-05
-1 88 87 1.64998e-05
-2 88 87 85 1.64998e-05
-2 88 87 86 1.64998e-05
-3 88 87 86 85 1.64998e-05
-0 89 1.68606e-05
-0 90 1.68606e-05
-1 90 89 1.68606e-05
-0 91 1.68606e-05
-1 91 89 1.68606e-05
-1 91 90 1.68606e-05
-2 91 90 89 1.68606e-05
-0 92 1.68606e-05
-1 92 89 1.68606e-05
-1 92 90 1.68606e-05
-2 92 90 89 1.68606e-05
-1 92 91 1.68606e-05
-2 92 91 89 1.68606e-05
-2 92 91 90 1.68606e-05
-3 92 91 90 89 1.68606e-05
-0 93 1.71026e-05
-0 94 1.71026e-05
-1 94 93 1.71026e-05
-0 95 1.71026e-05
-1 95 93 1.71026e-05
-1 95 94 1.71026e-05
-2 95 94 93 1.71026e-05
-0 96 1.71026e-05
-1 96 93 1.71026e-05
-1 96 94 1.71026e-05
-2 96 94 93 1.71026e-05
-1 96 95 1.71026e-05
-2 96 95 93 1.71026e-05
-2 96 95 94 1.71026e-05
-3 96 95 94 93 1.71026e-05
-0 97 1.72134e-05
-1 97 22 1.72134e-05
-1 97 23 1.72134e-05
-2 97 23 22 1.72134e-05
-0 98 1.72134e-05
-1 98 22 1.72134e-05
-1 98 23 1.72134e-05
-2 98 23 22 1.72134e-05
-1 98 97 1.72134e-05
-2 98 97 22 1.72134e-05
-2 98 97 23 1.72134e-05
-3 98 97 23 22 1.72134e-05
-0 99 1.72672e-05
-0 100 1.72672e-05
-1 100 99 1.72672e-05
-0 101 1.72672e-05
-1 101 99 1.72672e-05
-1 101 100 1.72672e-05
-2 101 100 99 1.72672e-05
-0 102 1.72672e-05
-1 102 99 1.72672e-05
-1 102 100 1.72672e-05
-2 102 100 99 1.72672e-05
-1 102 101 1.72672e-05
-2 102 101 99 1.72672e-05
-2 102 101 100 1.72672e-05
-3 102 101 100 99 1.72672e-05
-0 103 1.75859e-05
-1 103 4 1.75859e-05
-1 103 7 1.75859e-05
-2 103 7 4 1.75859e-05
-1 103 39 1.75859e-05
-2 103 39 4 1.75859e-05
-2 103 39 7 1.75859e-05
-3 103 39 7 4 1.75859e-05
-0 104 1.76526e-05
-1 104 59 1.76526e-05
-1 104 61 1.76526e-05
-2 104 61 59 1.76526e-05
-1 104 62 1.76526e-05
-2 104 62 59 1.76526e-05
-2 104 62 61 1.76526e-05
-3 104 62 61 59 1.76526e-05
-0 105 1.77703e-05
-0 106 1.77703e-05
-1 106 105 1.77703e-05
-0 107 1.77703e-05
-1 107 105 1.77703e-05
-1 107 106 1.77703e-05
-2 107 106 105 1.77703e-05
-0 108 1.77703e-05
-1 108 105 1.77703e-05
-1 108 106 1.77703e-05
-2 108 106 105 1.77703e-05
-1 108 107 1.77703e-05
-2 108 107 105 1.77703e-05
-2 108 107 106 1.77703e-05
-3 108 107 106 105 1.77703e-05
-0 109 1.79211e-05
-0 110 1.79211e-05
-1 110 109 1.79211e-05
-0 111 1.79211e-05
-1 111 109 1.79211e-05
-1 111 110 1.79211e-05
-2 111 110 109 1.79211e-05
-0 112 1.79211e-05
-1 112 109 1.79211e-05
-1 112 110 1.79211e-05
-2 112 110 109 1.79211e-05
-1 112 111 1.79211e-05
-2 112 111 109 1.79211e-05
-2 112 111 110 1.79211e-05
-3 112 111 110 109 1.79211e-05
-0 113 1.8083e-05
-1 113 80 1.8083e-05
-1 113 82 1.8083e-05
-2 113 82 80 1.8083e-05
-1 113 83 1.8083e-05
-2 113 83 80 1.8083e-05
-2 113 83 82 1.8083e-05
-3 113 83 82 80 1.8083e-05
-0 114 1.84399e-05
-1 114 85 1.84399e-05
-1 114 88 1.84399e-05
-2 114 88 85 1.84399e-05
-0 115 1.84399e-05
-1 115 85 1.84399e-05
-1 115 88 1.84399e-05
-2 115 88 85 1.84399e-05
-1 115 114 1.84399e-05
-2 115 114 85 1.84399e-05
-2 115 114 88 1.84399e-05
-3 115 114 88 85 1.84399e-05
-1 97 21 1.90248e-05
-2 97 22 21 1.90248e-05
-0 116 1.90248e-05
-1 116 21 1.90248e-05
-1 116 22 1.90248e-05
-2 116 22 21 1.90248e-05
-1 116 97 1.90248e-05
-2 116 97 21 1.90248e-05
-2 116 97 22 1.90248e-05
-3 116 97 22 21 1.90248e-05
-0 117 1.95263e-05
-1 117 80 1.95263e-05
-1 117 83 1.95263e-05
-2 117 83 80 1.95263e-05
-1 117 113 1.95263e-05
-2 117 113 80 1.95263e-05
-2 117 113 83 1.95263e-05
-3 117 113 83 80 1.95263e-05
-0 118 1.98603e-05
-0 119 1.98603e-05
-1 119 118 1.98603e-05
-0 120 1.98603e-05
-1 120 118 1.98603e-05
-1 120 119 1.98603e-05
-2 120 119 118 1.98603e-05
-0 121 1.98603e-05
-1 121 118 1.98603e-05
-1 121 119 1.98603e-05
-2 121 119 118 1.98603e-05
-1 121 120 1.98603e-05
-2 121 120 118 1.98603e-05
-2 121 120 119 1.98603e-05
-3 121 120 119 118 1.98603e-05
-1 118 62 2.0004e-05
-1 119 62 2.0004e-05
-2 119 118 62 2.0004e-05
-0 122 2.0004e-05
-1 122 62 2.0004e-05
-1 122 118 2.0004e-05
-2 122 118 62 2.0004e-05
-1 122 119 2.0004e-05
-2 122 119 62 2.0004e-05
-2 122 119 118 2.0004e-05
-3 122 119 118 62 2.0004e-05
-0 123 2.01849e-05
-1 123 119 2.01849e-05
-1 123 120 2.01849e-05
-2 123 120 119 2.01849e-05
-1 123 121 2.01849e-05
-2 123 121 119 2.01849e-05
-2 123 121 120 2.01849e-05
-3 123 121 120 119 2.01849e-05
-0 124 2.03487e-05
-0 125 2.03487e-05
-1 125 124 2.03487e-05
-0 126 2.03487e-05
-1 126 124 2.03487e-05
-1 126 125 2.03487e-05
-2 126 125 124 2.03487e-05
-0 127 2.03487e-05
-1 127 124 2.03487e-05
-1 127 125 2.03487e-05
-2 127 125 124 2.03487e-05
-1 127 126 2.03487e-05
-2 127 126 124 2.03487e-05
-2 127 126 125 2.03487e-05
-3 127 126 125 124 2.03487e-05
-1 122 120 2.06576e-05
-2 122 120 118 2.06576e-05
-2 122 120 119 2.06576e-05
-3 122 120 119 118 2.06576e-05
-0 128 2.07438e-05
-0 129 2.07438e-05
-1 129 128 2.07438e-05
-0 130 2.07438e-05
-1 130 128 2.07438e-05
-1 130 129 2.07438e-05
-2 130 129 128 2.07438e-05
-0 131 2.07438e-05
-1 131 128 2.07438e-05
-1 131 129 2.07438e-05
-2 131 129 128 2.07438e-05
-1 131 130 2.07438e-05
-2 131 130 128 2.07438e-05
-2 131 130 129 2.07438e-05
-3 131 130 129 128 2.07438e-05
-1 123 122 2.07903e-05
-2 123 122 120 2.07903e-05
-0 132 2.07903e-05
-1 132 120 2.07903e-05
-1 132 122 2.07903e-05
-2 132 122 120 2.07903e-05
-1 132 123 2.07903e-05
-2 132 123 120 2.07903e-05
-2 132 123 122 2.07903e-05
-3 132 123 122 120 2.07903e-05
-0 133 2.08594e-05
-0 134 2.08594e-05
-1 134 133 2.08594e-05
-0 135 2.08594e-05
-1 135 133 2.08594e-05
-1 135 134 2.08594e-05
-2 135 134 133 2.08594e-05
-0 136 2.08594e-05
-1 136 133 2.08594e-05
-1 136 134 2.08594e-05
-2 136 134 133 2.08594e-05
-1 136 135 2.08594e-05
-2 136 135 133 2.08594e-05
-2 136 135 134 2.08594e-05
-3 136 135 134 133 2.08594e-05
-1 55 30 2.08644e-05
-1 56 30 2.08644e-05
-2 56 55 30 2.08644e-05
-0 137 2.08644e-05
-1 137 30 2.08644e-05
-1 137 55 2.08644e-05
-2 137 55 30 2.08644e-05
-1 137 56 2.08644e-05
-2 137 56 30 2.08644e-05
-2 137 56 55 2.08644e-05
-3 137 56 55 30 2.08644e-05
-0 138 2.09839e-05
-0 139 2.09839e-05
-1 139 138 2.09839e-05
-0 140 2.09839e-05
-1 140 138 2.09839e-05
-1 140 139 2.09839e-05
-2 140 139 138 2.09839e-05
-0 141 2.09839e-05
-1 141 138 2.09839e-05
-1 141 139 2.09839e-05
-2 141 139 138 2.09839e-05
-1 141 140 2.09839e-05
-2 141 140 138 2.09839e-05
-2 141 140 139 2.09839e-05
-3 141 140 139 138 2.09839e-05
-0 142 2.10427e-05
-0 143 2.10427e-05
-1 143 142 2.10427e-05
-0 144 2.10427e-05
-1 144 142 2.10427e-05
-1 144 143 2.10427e-05
-2 144 143 142 2.10427e-05
-0 145 2.10427e-05
-1 145 142 2.10427e-05
-1 145 143 2.10427e-05
-2 145 143 142 2.10427e-05
-1 145 144 2.10427e-05
-2 145 144 142 2.10427e-05
-2 145 144 143 2.10427e-05
-3 145 144 143 142 2.10427e-05
-0 146 2.12816e-05
-0 147 2.12816e-05
-1 147 146 2.12816e-05
-0 148 2.12816e-05
-1 148 146 2.12816e-05
-1 148 147 2.12816e-05
-2 148 147 146 2.12816e-05
-0 149 2.12816e-05
-1 149 146 2.12816e-05
-1 149 147 2.12816e-05
-2 149 147 146 2.12816e-05
-1 149 148 2.12816e-05
-2 149 148 146 2.12816e-05
-2 149 148 147 2.12816e-05
-3 149 148 147 146 2.12816e-05
-0 150 2.13479e-05
-0 151 2.13479e-05
-1 151 150 2.13479e-05
-0 152 2.13479e-05
-1 152 150 2.13479e-05
-1 152 151 2.13479e-05
-2 152 151 150 2.13479e-05
-0 153 2.13479e-05
-1 153 150 2.13479e-05
-1 153 151 2.13479e-05
-2 153 151 150 2.13479e-05
-1 153 152 2.13479e-05
-2 153 152 150 2.13479e-05
-2 153 152 151 2.13479e-05
-3 153 152 151 150 2.13479e-05
-0 154 2.16515e-05
-1 154 39 2.16515e-05
-1 154 103 2.16515e-05
-2 154 103 39 2.16515e-05
-0 155 2.16515e-05
-1 155 39 2.16515e-05
-1 155 103 2.16515e-05
-2 155 103 39 2.16515e-05
-1 155 154 2.16515e-05
-2 155 154 39 2.16515e-05
-2 155 154 103 2.16515e-05
-3 155 154 103 39 2.16515e-05
-0 156 2.17265e-05
-1 156 118 2.17265e-05
-1 156 120 2.17265e-05
-2 156 120 118 2.17265e-05
-1 156 121 2.17265e-05
-2 156 121 118 2.17265e-05
-2 156 121 120 2.17265e-05
-3 156 121 120 118 2.17265e-05
-2 123 122 119 2.17835e-05
-3 123 122 120 119 2.17835e-05
-1 55 32 2.18888e-05
-2 55 32 30 2.18888e-05
-1 56 32 2.18888e-05
-2 56 32 30 2.18888e-05
-2 56 55 32 2.18888e-05
-3 56 55 32 30 2.18888e-05
-0 157 2.19226e-05
-1 157 89 2.19226e-05
-1 157 92 2.19226e-05
-2 157 92 89 2.19226e-05
-0 158 2.19226e-05
-1 158 89 2.19226e-05
-1 158 92 2.19226e-05
-2 158 92 89 2.19226e-05
-1 158 157 2.19226e-05
-2 158 157 89 2.19226e-05
-2 158 157 92 2.19226e-05
-3 158 157 92 89 2.19226e-05
-0 159 2.21038e-05
-1 159 146 2.21038e-05
-1 159 147 2.21038e-05
-2 159 147 146 2.21038e-05
-1 159 148 2.21038e-05
-2 159 148 146 2.21038e-05
-2 159 148 147 2.21038e-05
-3 159 148 147 146 2.21038e-05
-0 160 2.21252e-05
-1 160 42 2.21252e-05
-1 160 52 2.21252e-05
-2 160 52 42 2.21252e-05
-0 161 2.21252e-05
-1 161 42 2.21252e-05
-1 161 52 2.21252e-05
-2 161 52 42 2.21252e-05
-1 161 160 2.21252e-05
-2 161 160 42 2.21252e-05
-2 161 160 52 2.21252e-05
-3 161 160 52 42 2.21252e-05
-0 162 2.21691e-05
-1 162 40 2.21691e-05
-1 162 41 2.21691e-05
-2 162 41 40 2.21691e-05
-0 163 2.21691e-05
-1 163 40 2.21691e-05
-1 163 41 2.21691e-05
-2 163 41 40 2.21691e-05
-1 163 162 2.21691e-05
-2 163 162 40 2.21691e-05
-2 163 162 41 2.21691e-05
-3 163 162 41 40 2.21691e-05
-0 164 2.23278e-05
-0 165 2.23278e-05
-1 165 164 2.23278e-05
-0 166 2.23278e-05
-1 166 164 2.23278e-05
-1 166 165 2.23278e-05
-2 166 165 164 2.23278e-05
-0 167 2.23278e-05
-1 167 164 2.23278e-05
-1 167 165 2.23278e-05
-2 167 165 164 2.23278e-05
-1 167 166 2.23278e-05
-2 167 166 164 2.23278e-05
-2 167 166 165 2.23278e-05
-3 167 166 165 164 2.23278e-05
-0 168 2.24832e-05
-0 169 2.24832e-05
-1 169 168 2.24832e-05
-0 170 2.24832e-05
-1 170 168 2.24832e-05
-1 170 169 2.24832e-05
-2 170 169 168 2.24832e-05
-0 171 2.24832e-05
-1 171 168 2.24832e-05
-1 171 169 2.24832e-05
-2 171 169 168 2.24832e-05
-1 171 170 2.24832e-05
-2 171 170 168 2.24832e-05
-2 171 170 169 2.24832e-05
-3 171 170 169 168 2.24832e-05
-0 172 2.25688e-05
-1 172 120 2.25688e-05
-1 172 121 2.25688e-05
-2 172 121 120 2.25688e-05
-1 172 156 2.25688e-05
-2 172 156 120 2.25688e-05
-2 172 156 121 2.25688e-05
-3 172 156 121 120 2.25688e-05
-1 163 43 2.26186e-05
-2 163 43 40 2.26186e-05
-2 163 43 41 2.26186e-05
-3 163 43 41 40 2.26186e-05
-0 173 2.27453e-05
-1 173 73 2.27453e-05
-0 174 2.27453e-05
-1 174 73 2.27453e-05
-1 174 173 2.27453e-05
-2 174 173 73 2.27453e-05
-0 175 2.27453e-05
-1 175 73 2.27453e-05
-1 175 173 2.27453e-05
-2 175 173 73 2.27453e-05
-1 175 174 2.27453e-05
-2 175 174 73 2.27453e-05
-2 175 174 173 2.27453e-05
-3 175 174 173 73 2.27453e-05
-0 176 2.27984e-05
-1 176 30 2.27984e-05
-1 176 137 2.27984e-05
-2 176 137 30 2.27984e-05
-0 177 2.27984e-05
-1 177 30 2.27984e-05
-1 177 137 2.27984e-05
-2 177 137 30 2.27984e-05
-1 177 176 2.27984e-05
-2 177 176 30 2.27984e-05
-2 177 176 137 2.27984e-05
-3 177 176 137 30 2.27984e-05
-0 178 2.28594e-05
-1 178 105 2.28594e-05
-1 178 107 2.28594e-05
-2 178 107 105 2.28594e-05
-1 178 108 2.28594e-05
-2 178 108 105 2.28594e-05
-2 178 108 107 2.28594e-05
-3 178 108 107 105 2.28594e-05
-0 179 2.28905e-05
-1 179 5 2.28905e-05
-1 179 6 2.28905e-05
-2 179 6 5 2.28905e-05
-1 179 7 2.28905e-05
-2 179 7 5 2.28905e-05
-2 179 7 6 2.28905e-05
-3 179 7 6 5 2.28905e-05
-1 122 61 2.29332e-05
-2 122 62 61 2.29332e-05
-1 122 104 2.29332e-05
-2 122 104 61 2.29332e-05
-2 122 104 62 2.29332e-05
-3 122 104 62 61 2.29332e-05
-1 53 32 2.2969e-05
-2 55 53 32 2.2969e-05
-2 56 53 32 2.2969e-05
-3 56 55 53 32 2.2969e-05
-0 180 2.2981e-05
-0 181 2.2981e-05
-1 181 180 2.2981e-05
-0 182 2.2981e-05
-1 182 180 2.2981e-05
-1 182 181 2.2981e-05
-2 182 181 180 2.2981e-05
-0 183 2.2981e-05
-1 183 180 2.2981e-05
-1 183 181 2.2981e-05
-2 183 181 180 2.2981e-05
-1 183 182 2.2981e-05
-2 183 182 180 2.2981e-05
-2 183 182 181 2.2981e-05
-3 183 182 181 180 2.2981e-05
-1 137 32 2.2981e-05
-2 137 32 30 2.2981e-05
-2 137 56 32 2.2981e-05
-3 137 56 32 30 2.2981e-05
-0 184 2.31851e-05
-0 185 2.31851e-05
-1 185 184 2.31851e-05
-0 186 2.31851e-05
-1 186 184 2.31851e-05
-1 186 185 2.31851e-05
-2 186 185 184 2.31851e-05
-0 187 2.31851e-05
-1 187 184 2.31851e-05
-1 187 185 2.31851e-05
-2 187 185 184 2.31851e-05
-1 187 186 2.31851e-05
-2 187 186 184 2.31851e-05
-2 187 186 185 2.31851e-05
-3 187 186 185 184 2.31851e-05
-0 188 2.32679e-05
-1 188 133 2.32679e-05
-1 188 134 2.32679e-05
-2 188 134 133 2.32679e-05
-1 188 135 2.32679e-05
-2 188 135 133 2.32679e-05
-2 188 135 134 2.32679e-05
-3 188 135 134 133 2.32679e-05
-0 189 2.32849e-05
-1 189 103 2.32849e-05
-1 189 154 2.32849e-05
-2 189 154 103 2.32849e-05
-1 189 155 2.32849e-05
-2 189 155 103 2.32849e-05
-2 189 155 154 2.32849e-05
-3 189 155 154 103 2.32849e-05
-0 190 2.34205e-05
-1 190 50 2.34205e-05
-0 191 2.34205e-05
-1 191 50 2.34205e-05
-1 191 190 2.34205e-05
-2 191 190 50 2.34205e-05
-0 192 2.34205e-05
-1 192 50 2.34205e-05
-1 192 190 2.34205e-05
-2 192 190 50 2.34205e-05
-1 192 191 2.34205e-05
-2 192 191 50 2.34205e-05
-2 192 191 190 2.34205e-05
-3 192 191 190 50 2.34205e-05
-1 36 26 2.34605e-05
-1 37 26 2.34605e-05
-2 37 36 26 2.34605e-05
-0 193 2.34605e-05
-1 193 26 2.34605e-05
-1 193 36 2.34605e-05
-2 193 36 26 2.34605e-05
-1 193 37 2.34605e-05
-2 193 37 26 2.34605e-05
-2 193 37 36 2.34605e-05
-3 193 37 36 26 2.34605e-05
-1 189 39 2.34996e-05
-2 189 103 39 2.34996e-05
-2 189 155 39 2.34996e-05
-3 189 155 103 39 2.34996e-05
-0 194 2.35666e-05
-0 195 2.35666e-05
-1 195 194 2.35666e-05
-0 196 2.35666e-05
-1 196 194 2.35666e-05
-1 196 195 2.35666e-05
-2 196 195 194 2.35666e-05
-0 197 2.35666e-05
-1 197 194 2.35666e-05
-1 197 195 2.35666e-05
-2 197 195 194 2.35666e-05
-1 197 196 2.35666e-05
-2 197 196 194 2.35666e-05
-2 197 196 195 2.35666e-05
-3 197 196 195 194 2.35666e-05
-0 198 2.36508e-05
-0 199 2.36508e-05
-1 199 198 2.36508e-05
-0 200 2.36508e-05
-1 200 198 2.36508e-05
-1 200 199 2.36508e-05
-2 200 199 198 2.36508e-05
-0 201 2.36508e-05
-1 201 198 2.36508e-05
-1 201 199 2.36508e-05
-2 201 199 198 2.36508e-05
-1 201 200 2.36508e-05
-2 201 200 198 2.36508e-05
-2 201 200 199 2.36508e-05
-3 201 200 199 198 2.36508e-05
-0 202 2.37284e-05
-0 203 2.37284e-05
-1 203 202 2.37284e-05
-0 204 2.37284e-05
-1 204 202 2.37284e-05
-1 204 203 2.37284e-05
-2 204 203 202 2.37284e-05
-0 205 2.37284e-05
-1 205 202 2.37284e-05
-1 205 203 2.37284e-05
-2 205 203 202 2.37284e-05
-1 205 204 2.37284e-05
-2 205 204 202 2.37284e-05
-2 205 204 203 2.37284e-05
-3 205 204 203 202 2.37284e-05
-1 172 123 2.38723e-05
-2 172 123 120 2.38723e-05
-2 172 123 121 2.38723e-05
-3 172 123 121 120 2.38723e-05
-1 179 20 2.38805e-05
-2 179 20 5 2.38805e-05
-2 179 20 7 2.38805e-05
-3 179 20 7 5 2.38805e-05
-1 53 30 2.40507e-05
-2 53 32 30 2.40507e-05
-2 55 53 30 2.40507e-05
-3 55 53 32 30 2.40507e-05
-1 53 29 2.40585e-05
-2 53 30 29 2.40585e-05
-2 53 32 29 2.40585e-05
-3 53 32 30 29 2.40585e-05
-0 206 2.41873e-05
-1 206 157 2.41873e-05
-1 206 158 2.41873e-05
-2 206 158 157 2.41873e-05
-0 207 2.41873e-05
-1 207 157 2.41873e-05
-1 207 158 2.41873e-05
-2 207 158 157 2.41873e-05
-1 207 206 2.41873e-05
-2 207 206 157 2.41873e-05
-2 207 206 158 2.41873e-05
-3 207 206 158 157 2.41873e-05
-0 208 2.43116e-05
-0 209 2.43116e-05
-1 209 208 2.43116e-05
-0 210 2.43116e-05
-1 210 208 2.43116e-05
-1 210 209 2.43116e-05
-2 210 209 208 2.43116e-05
-0 211 2.43116e-05
-1 211 208 2.43116e-05
-1 211 209 2.43116e-05
-2 211 209 208 2.43116e-05
-1 211 210 2.43116e-05
-2 211 210 208 2.43116e-05
-2 211 210 209 2.43116e-05
-3 211 210 209 208 2.43116e-05
-0 212 2.44023e-05
-1 212 21 2.44023e-05
-1 212 23 2.44023e-05
-2 212 23 21 2.44023e-05
-1 212 24 2.44023e-05
-2 212 24 21 2.44023e-05
-2 212 24 23 2.44023e-05
-3 212 24 23 21 2.44023e-05
-0 213 2.4576e-05
-1 213 80 2.4576e-05
-1 213 83 2.4576e-05
-2 213 83 80 2.4576e-05
-1 213 117 2.4576e-05
-2 213 117 80 2.4576e-05
-2 213 117 83 2.4576e-05
-3 213 117 83 80 2.4576e-05
-0 214 2.46645e-05
-1 214 137 2.46645e-05
-1 214 176 2.46645e-05
-2 214 176 137 2.46645e-05
-1 214 177 2.46645e-05
-2 214 177 137 2.46645e-05
-2 214 177 176 2.46645e-05
-3 214 177 176 137 2.46645e-05
-0 215 2.46937e-05
-0 216 2.46937e-05
-1 216 215 2.46937e-05
-0 217 2.46937e-05
-1 217 215 2.46937e-05
-1 217 216 2.46937e-05
-2 217 216 215 2.46937e-05
-0 218 2.46937e-05
-1 218 215 2.46937e-05
-1 218 216 2.46937e-05
-2 218 216 215 2.46937e-05
-1 218 217 2.46937e-05
-2 218 217 215 2.46937e-05
-2 218 217 216 2.46937e-05
-3 218 217 216 215 2.46937e-05
-0 219 2.48569e-05
-1 219 8 2.48569e-05
-1 219 11 2.48569e-05
-2 219 11 8 2.48569e-05
-0 220 2.48569e-05
-1 220 8 2.48569e-05
-1 220 11 2.48569e-05
-2 220 11 8 2.48569e-05
-1 220 219 2.48569e-05
-2 220 219 8 2.48569e-05
-2 220 219 11 2.48569e-05
-3 220 219 11 8 2.48569e-05
-0 221 2.48639e-05
-0 222 2.48639e-05
-1 222 221 2.48639e-05
-0 223 2.48639e-05
-1 223 221 2.48639e-05
-1 223 222 2.48639e-05
-2 223 222 221 2.48639e-05
-0 224 2.48639e-05
-1 224 221 2.48639e-05
-1 224 222 2.48639e-05
-2 224 222 221 2.48639e-05
-1 224 223 2.48639e-05
-2 224 223 221 2.48639e-05
-2 224 223 222 2.48639e-05
-3 224 223 222 221 2.48639e-05
-0 225 2.48654e-05
-0 226 2.48654e-05
-1 226 225 2.48654e-05
-0 227 2.48654e-05
-1 227 225 2.48654e-05
-1 227 226 2.48654e-05
-2 227 226 225 2.48654e-05
-0 228 2.48654e-05
-1 228 225 2.48654e-05
-1 228 226 2.48654e-05
-2 228 226 225 2.48654e-05
-1 228 227 2.48654e-05
-2 228 227 225 2.48654e-05
-2 228 227 226 2.48654e-05
-3 228 227 226 225 2.48654e-05
-1 219 9 2.49567e-05
-2 219 9 8 2.49567e-05
-2 219 11 9 2.49567e-05
-3 219 11 9 8 2.49567e-05
-1 208 159 2.4998e-05
-1 210 159 2.4998e-05
-2 210 208 159 2.4998e-05
-1 211 159 2.4998e-05
-2 211 208 159 2.4998e-05
-2 211 210 159 2.4998e-05
-3 211 210 208 159 2.4998e-05
-1 81 69 2.52919e-05
-1 82 69 2.52919e-05
-2 82 81 69 2.52919e-05
-1 83 69 2.52919e-05
-2 83 81 69 2.52919e-05
-2 83 82 69 2.52919e-05
-3 83 82 81 69 2.52919e-05
-0 229 2.55079e-05
-0 230 2.55079e-05
-1 230 229 2.55079e-05
-0 231 2.55079e-05
-1 231 229 2.55079e-05
-1 231 230 2.55079e-05
-2 231 230 229 2.55079e-05
-0 232 2.55079e-05
-1 232 229 2.55079e-05
-1 232 230 2.55079e-05
-2 232 230 229 2.55079e-05
-1 232 231 2.55079e-05
-2 232 231 229 2.55079e-05
-2 232 231 230 2.55079e-05
-3 232 231 230 229 2.55079e-05
-1 177 32 2.56312e-05
-2 177 32 30 2.56312e-05
-2 177 137 32 2.56312e-05
-3 177 137 32 30 2.56312e-05
-0 233 2.56398e-05
-1 233 106 2.56398e-05
-1 233 108 2.56398e-05
-2 233 108 106 2.56398e-05
-0 234 2.56398e-05
-1 234 106 2.56398e-05
-1 234 108 2.56398e-05
-2 234 108 106 2.56398e-05
-1 234 233 2.56398e-05
-2 234 233 106 2.56398e-05
-2 234 233 108 2.56398e-05
-3 234 233 108 106 2.56398e-05
-1 213 81 2.57807e-05
-2 213 81 80 2.57807e-05
-2 213 83 81 2.57807e-05
-3 213 83 81 80 2.57807e-05
-1 177 56 2.59457e-05
-2 177 56 32 2.59457e-05
-2 177 137 56 2.59457e-05
-3 177 137 56 32 2.59457e-05
-0 235 2.60059e-05
-1 235 106 2.60059e-05
-1 235 233 2.60059e-05
-2 235 233 106 2.60059e-05
-1 235 234 2.60059e-05
-2 235 234 106 2.60059e-05
-2 235 234 233 2.60059e-05
-3 235 234 233 106 2.60059e-05
-0 236 2.61165e-05
-0 237 2.61165e-05
-1 237 236 2.61165e-05
-0 238 2.61165e-05
-1 238 236 2.61165e-05
-1 238 237 2.61165e-05
-2 238 237 236 2.61165e-05
-0 239 2.61165e-05
-1 239 236 2.61165e-05
-1 239 237 2.61165e-05
-2 239 237 236 2.61165e-05
-1 239 238 2.61165e-05
-2 239 238 236 2.61165e-05
-2 239 238 237 2.61165e-05
-3 239 238 237 236 2.61165e-05
-1 172 132 2.61728e-05
-2 172 132 120 2.61728e-05
-2 172 132 123 2.61728e-05
-3 172 132 123 120 2.61728e-05
-0 240 2.63197e-05
-0 241 2.63197e-05
-1 241 240 2.63197e-05
-0 242 2.63197e-05
-1 242 240 2.63197e-05
-1 242 241 2.63197e-05
-2 242 241 240 2.63197e-05
-0 243 2.63197e-05
-1 243 240 2.63197e-05
-1 243 241 2.63197e-05
-2 243 241 240 2.63197e-05
-1 243 242 2.63197e-05
-2 243 242 240 2.63197e-05
-2 243 242 241 2.63197e-05
-3 243 242 241 240 2.63197e-05
-0 244 2.66137e-05
-1 244 168 2.66137e-05
-1 244 169 2.66137e-05
-2 244 169 168 2.66137e-05
-1 244 170 2.66137e-05
-2 244 170 168 2.66137e-05
-2 244 170 169 2.66137e-05
-3 244 170 169 168 2.66137e-05
-1 119 61 2.67718e-05
-2 119 62 61 2.67718e-05
-2 122 119 61 2.67718e-05
-3 122 119 62 61 2.67718e-05
-1 100 70 2.69342e-05
-1 100 71 2.69342e-05
-2 100 71 70 2.69342e-05
-0 245 2.69342e-05
-1 245 70 2.69342e-05
-1 245 71 2.69342e-05
-2 245 71 70 2.69342e-05
-1 245 100 2.69342e-05
-2 245 100 70 2.69342e-05
-2 245 100 71 2.69342e-05
-3 245 100 71 70 2.69342e-05
-0 246 2.70112e-05
-0 247 2.70112e-05
-1 247 246 2.70112e-05
-0 248 2.70112e-05
-1 248 246 2.70112e-05
-1 248 247 2.70112e-05
-2 248 247 246 2.70112e-05
-0 249 2.70112e-05
-1 249 246 2.70112e-05
-1 249 247 2.70112e-05
-2 249 247 246 2.70112e-05
-1 249 248 2.70112e-05
-2 249 248 246 2.70112e-05
-2 249 248 247 2.70112e-05
-3 249 248 247 246 2.70112e-05
-1 182 142 2.73122e-05
-0 250 2.73122e-05
-1 250 142 2.73122e-05
-1 250 182 2.73122e-05
-2 250 182 142 2.73122e-05
-0 251 2.73122e-05
-1 251 142 2.73122e-05
-1 251 182 2.73122e-05
-2 251 182 142 2.73122e-05
-1 251 250 2.73122e-05
-2 251 250 142 2.73122e-05
-2 251 250 182 2.73122e-05
-3 251 250 182 142 2.73122e-05
-0 252 2.73272e-05
-1 252 164 2.73272e-05
-1 252 165 2.73272e-05
-2 252 165 164 2.73272e-05
-1 252 166 2.73272e-05
-2 252 166 164 2.73272e-05
-2 252 166 165 2.73272e-05
-3 252 166 165 164 2.73272e-05
-0 253 2.73359e-05
-1 253 134 2.73359e-05
-0 254 2.73359e-05
-1 254 134 2.73359e-05
-1 254 253 2.73359e-05
-2 254 253 134 2.73359e-05
-0 255 2.73359e-05
-1 255 134 2.73359e-05
-1 255 253 2.73359e-05
-2 255 253 134 2.73359e-05
-1 255 254 2.73359e-05
-2 255 254 134 2.73359e-05
-2 255 254 253 2.73359e-05
-3 255 254 253 134 2.73359e-05
-0 256 2.74229e-05
-1 256 80 2.74229e-05
-1 256 213 2.74229e-05
-2 256 213 80 2.74229e-05
-0 257 2.74229e-05
-1 257 80 2.74229e-05
-1 257 213 2.74229e-05
-2 257 213 80 2.74229e-05
-1 257 256 2.74229e-05
-2 257 256 80 2.74229e-05
-2 257 256 213 2.74229e-05
-3 257 256 213 80 2.74229e-05
-1 52 34 2.75083e-05
-1 52 35 2.75083e-05
-2 52 35 34 2.75083e-05
-0 258 2.75083e-05
-1 258 34 2.75083e-05
-1 258 35 2.75083e-05
-2 258 35 34 2.75083e-05
-1 258 52 2.75083e-05
-2 258 52 34 2.75083e-05
-2 258 52 35 2.75083e-05
-3 258 52 35 34 2.75083e-05
-1 55 29 2.76092e-05
-2 55 30 29 2.76092e-05
-2 55 53 29 2.76092e-05
-3 55 53 30 29 2.76092e-05
-0 259 2.76587e-05
-1 259 164 2.76587e-05
-1 259 165 2.76587e-05
-2 259 165 164 2.76587e-05
-1 259 167 2.76587e-05
-2 259 167 164 2.76587e-05
-2 259 167 165 2.76587e-05
-3 259 167 165 164 2.76587e-05
-1 57 13 2.77863e-05
-2 57 14 13 2.77863e-05
-2 57 33 13 2.77863e-05
-3 57 33 14 13 2.77863e-05
-0 260 2.77874e-05
-0 261 2.77874e-05
-1 261 260 2.77874e-05
-0 262 2.77874e-05
-1 262 260 2.77874e-05
-1 262 261 2.77874e-05
-2 262 261 260 2.77874e-05
-0 263 2.77874e-05
-1 263 260 2.77874e-05
-1 263 261 2.77874e-05
-2 263 261 260 2.77874e-05
-1 263 262 2.77874e-05
-2 263 262 260 2.77874e-05
-2 263 262 261 2.77874e-05
-3 263 262 261 260 2.77874e-05
-1 123 61 2.77928e-05
-2 123 119 61 2.77928e-05
-2 123 122 61 2.77928e-05
-3 123 122 119 61 2.77928e-05
-1 160 125 2.78356e-05
-1 258 125 2.78356e-05
-1 258 160 2.78356e-05
-2 258 160 125 2.78356e-05
-0 264 2.78356e-05
-1 264 125 2.78356e-05
-1 264 160 2.78356e-05
-2 264 160 125 2.78356e-05
-1 264 258 2.78356e-05
-2 264 258 125 2.78356e-05
-2 264 258 160 2.78356e-05
-3 264 258 160 125 2.78356e-05
-1 137 38 2.8323e-05
-1 137 63 2.8323e-05
-2 137 63 38 2.8323e-05
-1 214 38 2.8323e-05
-1 214 63 2.8323e-05
-2 214 63 38 2.8323e-05
-2 214 137 38 2.8323e-05
-2 214 137 63 2.8323e-05
-3 214 137 63 38 2.8323e-05
-0 265 2.85393e-05
-1 265 7 2.85393e-05
-1 265 20 2.85393e-05
-2 265 20 7 2.85393e-05
-1 265 39 2.85393e-05
-2 265 39 7 2.85393e-05
-2 265 39 20 2.85393e-05
-3 265 39 20 7 2.85393e-05
-0 266 2.87591e-05
-1 266 61 2.87591e-05
-1 266 123 2.87591e-05
-2 266 123 61 2.87591e-05
-0 267 2.87591e-05
-1 267 61 2.87591e-05
-1 267 123 2.87591e-05
-2 267 123 61 2.87591e-05
-1 267 266 2.87591e-05
-2 267 266 61 2.87591e-05
-2 267 266 123 2.87591e-05
-3 267 266 123 61 2.87591e-05
-1 183 142 2.87664e-05
-2 183 182 142 2.87664e-05
-1 251 183 2.87664e-05
-2 251 183 142 2.87664e-05
-2 251 183 182 2.87664e-05
-3 251 183 182 142 2.87664e-05
-0 268 2.88813e-05
-1 268 215 2.88813e-05
-1 268 216 2.88813e-05
-2 268 216 215 2.88813e-05
-1 268 217 2.88813e-05
-2 268 217 215 2.88813e-05
-2 268 217 216 2.88813e-05
-3 268 217 216 215 2.88813e-05
-0 269 2.89134e-05
-1 269 164 2.89134e-05
-1 269 165 2.89134e-05
-2 269 165 164 2.89134e-05
-1 269 252 2.89134e-05
-2 269 252 164 2.89134e-05
-2 269 252 165 2.89134e-05
-3 269 252 165 164 2.89134e-05
-0 270 2.89142e-05
-0 271 2.89142e-05
-1 271 270 2.89142e-05
-0 272 2.89142e-05
-1 272 270 2.89142e-05
-1 272 271 2.89142e-05
-2 272 271 270 2.89142e-05
-0 273 2.89142e-05
-1 273 270 2.89142e-05
-1 273 271 2.89142e-05
-2 273 271 270 2.89142e-05
-1 273 272 2.89142e-05
-2 273 272 270 2.89142e-05
-2 273 272 271 2.89142e-05
-3 273 272 271 270 2.89142e-05
-0 274 2.90067e-05
-1 274 270 2.90067e-05
-1 274 271 2.90067e-05
-2 274 271 270 2.90067e-05
-0 275 2.90067e-05
-1 275 270 2.90067e-05
-1 275 271 2.90067e-05
-2 275 271 270 2.90067e-05
-1 275 274 2.90067e-05
-2 275 274 270 2.90067e-05
-2 275 274 271 2.90067e-05
-3 275 274 271 270 2.90067e-05
-1 232 106 2.9058e-05
-1 233 232 2.9058e-05
-2 233 232 106 2.9058e-05
-1 235 232 2.9058e-05
-2 235 232 106 2.9058e-05
-2 235 233 232 2.9058e-05
-3 235 233 232 106 2.9058e-05
-0 276 2.90699e-05
-1 276 93 2.90699e-05
-1 276 94 2.90699e-05
-2 276 94 93 2.90699e-05
-1 276 95 2.90699e-05
-2 276 95 93 2.90699e-05
-2 276 95 94 2.90699e-05
-3 276 95 94 93 2.90699e-05
-0 277 2.91538e-05
-0 278 2.91538e-05
-1 278 277 2.91538e-05
-0 279 2.91538e-05
-1 279 277 2.91538e-05
-1 279 278 2.91538e-05
-2 279 278 277 2.91538e-05
-0 280 2.91538e-05
-1 280 277 2.91538e-05
-1 280 278 2.91538e-05
-2 280 278 277 2.91538e-05
-1 280 279 2.91538e-05
-2 280 279 277 2.91538e-05
-2 280 279 278 2.91538e-05
-3 280 279 278 277 2.91538e-05
-0 281 2.92097e-05
-0 282 2.92097e-05
-1 282 281 2.92097e-05
-0 283 2.92097e-05
-1 283 281 2.92097e-05
-1 283 282 2.92097e-05
-2 283 282 281 2.92097e-05
-0 284 2.92097e-05
-1 284 281 2.92097e-05
-1 284 282 2.92097e-05
-2 284 282 281 2.92097e-05
-1 284 283 2.92097e-05
-2 284 283 281 2.92097e-05
-2 284 283 282 2.92097e-05
-3 284 283 282 281 2.92097e-05
-1 234 232 2.94069e-05
-2 234 232 106 2.94069e-05
-2 235 234 232 2.94069e-05
-3 235 234 232 106 2.94069e-05
-0 285 2.94723e-05
-1 285 266 2.94723e-05
-0 286 2.94723e-05
-1 286 266 2.94723e-05
-1 286 285 2.94723e-05
-2 286 285 266 2.94723e-05
-0 287 2.94723e-05
-1 287 266 2.94723e-05
-1 287 285 2.94723e-05
-2 287 285 266 2.94723e-05
-1 287 286 2.94723e-05
-2 287 286 266 2.94723e-05
-2 287 286 285 2.94723e-05
-3 287 286 285 266 2.94723e-05
-1 265 155 2.95371e-05
-2 265 155 39 2.95371e-05
-1 265 189 2.95371e-05
-2 265 189 39 2.95371e-05
-2 265 189 155 2.95371e-05
-3 265 189 155 39 2.95371e-05
-0 288 2.96316e-05
-1 288 149 2.96316e-05
-0 289 2.96316e-05
-1 289 149 2.96316e-05
-1 289 288 2.96316e-05
-2 289 288 149 2.96316e-05
-0 290 2.96316e-05
-1 290 149 2.96316e-05
-1 290 288 2.96316e-05
-2 290 288 149 2.96316e-05
-1 290 289 2.96316e-05
-2 290 289 149 2.96316e-05
-2 290 289 288 2.96316e-05
-3 290 289 288 149 2.96316e-05
-1 208 133 2.97657e-05
-0 291 2.97657e-05
-1 291 133 2.97657e-05
-1 291 208 2.97657e-05
-2 291 208 133 2.97657e-05
-0 292 2.97657e-05
-1 292 133 2.97657e-05
-1 292 208 2.97657e-05
-2 292 208 133 2.97657e-05
-1 292 291 2.97657e-05
-2 292 291 133 2.97657e-05
-2 292 291 208 2.97657e-05
-3 292 291 208 133 2.97657e-05
-0 293 2.98103e-05
-1 293 103 2.98103e-05
-1 293 154 2.98103e-05
-2 293 154 103 2.98103e-05
-1 293 189 2.98103e-05
-2 293 189 103 2.98103e-05
-2 293 189 154 2.98103e-05
-3 293 189 154 103 2.98103e-05
-1 256 121 2.98452e-05
-1 256 123 2.98452e-05
-2 256 123 121 2.98452e-05
-1 256 172 2.98452e-05
-2 256 172 121 2.98452e-05
-2 256 172 123 2.98452e-05
-3 256 172 123 121 2.98452e-05
-0 294 2.99663e-05
-0 295 2.99663e-05
-1 295 294 2.99663e-05
-0 296 2.99663e-05
-1 296 294 2.99663e-05
-1 296 295 2.99663e-05
-2 296 295 294 2.99663e-05
-0 297 2.99663e-05
-1 297 294 2.99663e-05
-1 297 295 2.99663e-05
-2 297 295 294 2.99663e-05
-1 297 296 2.99663e-05
-2 297 296 294 2.99663e-05
-2 297 296 295 2.99663e-05
-3 297 296 295 294 2.99663e-05
-0 298 3.00184e-05
-1 298 225 3.00184e-05
-1 298 226 3.00184e-05
-2 298 226 225 3.00184e-05
-1 298 227 3.00184e-05
-2 298 227 225 3.00184e-05
-2 298 227 226 3.00184e-05
-3 298 227 226 225 3.00184e-05
-0 299 3.01153e-05
-1 299 281 3.01153e-05
-1 299 282 3.01153e-05
-2 299 282 281 3.01153e-05
-1 299 284 3.01153e-05
-2 299 284 281 3.01153e-05
-2 299 284 282 3.01153e-05
-3 299 284 282 281 3.01153e-05
-0 300 3.02599e-05
-0 301 3.02599e-05
-1 301 300 3.02599e-05
-0 302 3.02599e-05
-1 302 300 3.02599e-05
-1 302 301 3.02599e-05
-2 302 301 300 3.02599e-05
-0 303 3.02599e-05
-1 303 300 3.02599e-05
-1 303 301 3.02599e-05
-2 303 301 300 3.02599e-05
-1 303 302 3.02599e-05
-2 303 302 300 3.02599e-05
-2 303 302 301 3.02599e-05
-3 303 302 301 300 3.02599e-05
-1 252 167 3.03683e-05
-2 252 167 164 3.03683e-05
-2 252 167 166 3.03683e-05
-3 252 167 166 164 3.03683e-05
-0 304 3.05166e-05
-1 304 185 3.05166e-05
-1 304 186 3.05166e-05
-2 304 186 185 3.05166e-05
-0 305 3.05166e-05
-1 305 185 3.05166e-05
-1 305 186 3.05166e-05
-2 305 186 185 3.05166e-05
-1 305 304 3.05166e-05
-2 305 304 185 3.05166e-05
-2 305 304 186 3.05166e-05
-3 305 304 186 185 3.05166e-05
-0 306 3.05552e-05
-1 306 172 3.05552e-05
-1 306 256 3.05552e-05
-2 306 256 172 3.05552e-05
-0 307 3.05552e-05
-1 307 172 3.05552e-05
-1 307 256 3.05552e-05
-2 307 256 172 3.05552e-05
-1 307 306 3.05552e-05
-2 307 306 172 3.05552e-05
-2 307 306 256 3.05552e-05
-3 307 306 256 172 3.05552e-05
-1 39 5 3.06012e-05
-2 39 5 4 3.06012e-05
-2 39 20 5 3.06012e-05
-3 39 20 5 4 3.06012e-05
-1 184 45 3.06892e-05
-1 184 47 3.06892e-05
-2 184 47 45 3.06892e-05
-1 185 45 3.06892e-05
-1 185 47 3.06892e-05
-2 185 47 45 3.06892e-05
-2 185 184 45 3.06892e-05
-2 185 184 47 3.06892e-05
-3 185 184 47 45 3.06892e-05
-1 119 60 3.08132e-05
-2 119 61 60 3.08132e-05
-2 119 62 60 3.08132e-05
-3 119 62 61 60 3.08132e-05
-1 176 31 3.10208e-05
-2 176 31 30 3.10208e-05
-0 308 3.10208e-05
-1 308 30 3.10208e-05
-1 308 31 3.10208e-05
-2 308 31 30 3.10208e-05
-1 308 176 3.10208e-05
-2 308 176 30 3.10208e-05
-2 308 176 31 3.10208e-05
-3 308 176 31 30 3.10208e-05
-1 245 68 3.12566e-05
-2 245 71 68 3.12566e-05
-0 309 3.12566e-05
-1 309 68 3.12566e-05
-1 309 71 3.12566e-05
-2 309 71 68 3.12566e-05
-1 309 245 3.12566e-05
-2 309 245 68 3.12566e-05
-2 309 245 71 3.12566e-05
-3 309 245 71 68 3.12566e-05
-1 174 74 3.14305e-05
-2 174 74 73 3.14305e-05
-0 310 3.14305e-05
-1 310 73 3.14305e-05
-1 310 74 3.14305e-05
-2 310 74 73 3.14305e-05
-1 310 174 3.14305e-05
-2 310 174 73 3.14305e-05
-2 310 174 74 3.14305e-05
-3 310 174 74 73 3.14305e-05
-0 311 3.17238e-05
-1 311 154 3.17238e-05
-1 311 189 3.17238e-05
-2 311 189 154 3.17238e-05
-1 311 293 3.17238e-05
-2 311 293 154 3.17238e-05
-2 311 293 189 3.17238e-05
-3 311 293 189 154 3.17238e-05
-1 213 69 3.17791e-05
-2 213 81 69 3.17791e-05
-2 213 83 69 3.17791e-05
-3 213 83 81 69 3.17791e-05
-1 256 113 3.18858e-05
-2 256 113 80 3.18858e-05
-0 312 3.18858e-05
-1 312 80 3.18858e-05
-1 312 113 3.18858e-05
-2 312 113 80 3.18858e-05
-1 312 256 3.18858e-05
-2 312 256 80 3.18858e-05
-2 312 256 113 3.18858e-05
-3 312 256 113 80 3.18858e-05
-0 313 3.19326e-05
-0 314 3.19326e-05
-1 314 313 3.19326e-05
-0 315 3.19326e-05
-1 315 313 3.19326e-05
-1 315 314 3.19326e-05
-2 315 314 313 3.19326e-05
-0 316 3.19326e-05
-1 316 313 3.19326e-05
-1 316 314 3.19326e-05
-2 316 314 313 3.19326e-05
-1 316 315 3.19326e-05
-2 316 315 313 3.19326e-05
-2 316 315 314 3.19326e-05
-3 316 315 314 313 3.19326e-05
-0 317 3.19386e-05
-1 317 12 3.19386e-05
-0 318 3.19386e-05
-1 318 12 3.19386e-05
-1 318 317 3.19386e-05
-2 318 317 12 3.19386e-05
-0 319 3.19386e-05
-1 319 12 3.19386e-05
-1 319 317 3.19386e-05
-2 319 317 12 3.19386e-05
-1 319 318 3.19386e-05
-2 319 318 12 3.19386e-05
-2 319 318 317 3.19386e-05
-3 319 318 317 12 3.19386e-05
-1 101 70 3.19825e-05
-1 101 71 3.19825e-05
-2 101 71 70 3.19825e-05
-2 101 100 70 3.19825e-05
-2 101 100 71 3.19825e-05
-3 101 100 71 70 3.19825e-05
-1 117 69 3.19837e-05
-2 117 83 69 3.19837e-05
-2 213 117 69 3.19837e-05
-3 213 117 83 69 3.19837e-05
-0 320 3.21271e-05
-1 320 58 3.21271e-05
-1 320 84 3.21271e-05
-2 320 84 58 3.21271e-05
-0 321 3.21271e-05
-1 321 58 3.21271e-05
-1 321 84 3.21271e-05
-2 321 84 58 3.21271e-05
-1 321 320 3.21271e-05
-2 321 320 58 3.21271e-05
-2 321 320 84 3.21271e-05
-3 321 320 84 58 3.21271e-05
-0 322 3.22145e-05
-0 323 3.22145e-05
-1 323 322 3.22145e-05
-0 324 3.22145e-05
-1 324 322 3.22145e-05
-1 324 323 3.22145e-05
-2 324 323 322 3.22145e-05
-0 325 3.22145e-05
-1 325 322 3.22145e-05
-1 325 323 3.22145e-05
-2 325 323 322 3.22145e-05
-1 325 324 3.22145e-05
-2 325 324 322 3.22145e-05
-2 325 324 323 3.22145e-05
-3 325 324 323 322 3.22145e-05
-0 326 3.22602e-05
-1 326 7 3.22602e-05
-1 326 179 3.22602e-05
-2 326 179 7 3.22602e-05
-0 327 3.22602e-05
-1 327 7 3.22602e-05
-1 327 179 3.22602e-05
-2 327 179 7 3.22602e-05
-1 327 326 3.22602e-05
-2 327 326 7 3.22602e-05
-2 327 326 179 3.22602e-05
-3 327 326 179 7 3.22602e-05
-0 328 3.23124e-05
-1 328 313 3.23124e-05
-1 328 315 3.23124e-05
-2 328 315 313 3.23124e-05
-0 329 3.23124e-05
-1 329 313 3.23124e-05
-1 329 315 3.23124e-05
-2 329 315 313 3.23124e-05
-1 329 328 3.23124e-05
-2 329 328 313 3.23124e-05
-2 329 328 315 3.23124e-05
-3 329 328 315 313 3.23124e-05
-1 266 132 3.25375e-05
-2 266 132 123 3.25375e-05
-1 267 132 3.25375e-05
-2 267 132 123 3.25375e-05
-2 267 266 132 3.25375e-05
-3 267 266 132 123 3.25375e-05
-0 330 3.25434e-05
-1 330 256 3.25434e-05
-1 330 306 3.25434e-05
-2 330 306 256 3.25434e-05
-1 330 307 3.25434e-05
-2 330 307 256 3.25434e-05
-2 330 307 306 3.25434e-05
-3 330 307 306 256 3.25434e-05
-0 331 3.27332e-05
-0 332 3.27332e-05
-1 332 331 3.27332e-05
-0 333 3.27332e-05
-1 333 331 3.27332e-05
-1 333 332 3.27332e-05
-2 333 332 331 3.27332e-05
-0 334 3.27332e-05
-1 334 331 3.27332e-05
-1 334 332 3.27332e-05
-2 334 332 331 3.27332e-05
-1 334 333 3.27332e-05
-2 334 333 331 3.27332e-05
-2 334 333 332 3.27332e-05
-3 334 333 332 331 3.27332e-05
-1 266 122 3.28391e-05
-2 266 123 122 3.28391e-05
-2 266 132 122 3.28391e-05
-3 266 132 123 122 3.28391e-05
-0 335 3.2898e-05
-1 335 261 3.2898e-05
-1 335 263 3.2898e-05
-2 335 263 261 3.2898e-05
-0 336 3.2898e-05
-1 336 261 3.2898e-05
-1 336 263 3.2898e-05
-2 336 263 261 3.2898e-05
-1 336 335 3.2898e-05
-2 336 335 261 3.2898e-05
-2 336 335 263 3.2898e-05
-3 336 335 263 261 3.2898e-05
-0 337 3.2901e-05
-1 337 50 3.2901e-05
-1 337 190 3.2901e-05
-2 337 190 50 3.2901e-05
-0 338 3.2901e-05
-1 338 50 3.2901e-05
-1 338 190 3.2901e-05
-2 338 190 50 3.2901e-05
-1 338 337 3.2901e-05
-2 338 337 50 3.2901e-05
-2 338 337 190 3.2901e-05
-3 338 337 190 50 3.2901e-05
-0 339 3.29095e-05
-1 339 261 3.29095e-05
-0 340 3.29095e-05
-1 340 261 3.29095e-05
-1 340 339 3.29095e-05
-2 340 339 261 3.29095e-05
-0 341 3.29095e-05
-1 341 261 3.29095e-05
-1 341 339 3.29095e-05
-2 341 339 261 3.29095e-05
-1 341 340 3.29095e-05
-2 341 340 261 3.29095e-05
-2 341 340 339 3.29095e-05
-3 341 340 339 261 3.29095e-05
-0 342 3.29158e-05
-1 342 337 3.29158e-05
-1 342 338 3.29158e-05
-2 342 338 337 3.29158e-05
-0 343 3.29158e-05
-1 343 337 3.29158e-05
-1 343 338 3.29158e-05
-2 343 338 337 3.29158e-05
-1 343 342 3.29158e-05
-2 343 342 337 3.29158e-05
-2 343 342 338 3.29158e-05
-3 343 342 338 337 3.29158e-05
-2 266 122 61 3.30717e-05
-3 266 123 122 61 3.30717e-05
-1 306 80 3.31699e-05
-1 306 113 3.31699e-05
-2 306 113 80 3.31699e-05
-2 306 256 80 3.31699e-05
-2 306 256 113 3.31699e-05
-3 306 256 113 80 3.31699e-05
-1 306 117 3.32098e-05
-2 306 117 80 3.32098e-05
-2 306 117 113 3.32098e-05
-3 306 117 113 80 3.32098e-05
-1 326 20 3.32219e-05
-2 326 20 7 3.32219e-05
-2 326 179 20 3.32219e-05
-3 326 179 20 7 3.32219e-05
-0 344 3.33414e-05
-1 344 294 3.33414e-05
-1 344 295 3.33414e-05
-2 344 295 294 3.33414e-05
-1 344 296 3.33414e-05
-2 344 296 294 3.33414e-05
-2 344 296 295 3.33414e-05
-3 344 296 295 294 3.33414e-05
-0 345 3.33852e-05
-1 345 313 3.33852e-05
-1 345 315 3.33852e-05
-2 345 315 313 3.33852e-05
-1 345 328 3.33852e-05
-2 345 328 313 3.33852e-05
-2 345 328 315 3.33852e-05
-3 345 328 315 313 3.33852e-05
-0 346 3.35643e-05
-1 346 207 3.35643e-05
-0 347 3.35643e-05
-1 347 207 3.35643e-05
-1 347 346 3.35643e-05
-2 347 346 207 3.35643e-05
-0 348 3.35643e-05
-1 348 207 3.35643e-05
-1 348 346 3.35643e-05
-2 348 346 207 3.35643e-05
-1 348 347 3.35643e-05
-2 348 347 207 3.35643e-05
-2 348 347 346 3.35643e-05
-3 348 347 346 207 3.35643e-05
-1 308 225 3.36884e-05
-1 308 226 3.36884e-05
-2 308 226 225 3.36884e-05
-1 308 228 3.36884e-05
-2 308 228 225 3.36884e-05
-2 308 228 226 3.36884e-05
-3 308 228 226 225 3.36884e-05
-1 330 80 3.3902e-05
-1 330 117 3.3902e-05
-2 330 117 80 3.3902e-05
-2 330 306 80 3.3902e-05
-2 330 306 117 3.3902e-05
-3 330 306 117 80 3.3902e-05
-2 330 256 80 3.39636e-05
-3 330 306 256 80 3.39636e-05
-0 349 3.42464e-05
-1 349 226 3.42464e-05
-1 349 227 3.42464e-05
-2 349 227 226 3.42464e-05
-1 349 298 3.42464e-05
-2 349 298 226 3.42464e-05
-2 349 298 227 3.42464e-05
-3 349 298 227 226 3.42464e-05
-1 191 51 3.44167e-05
-2 191 51 50 3.44167e-05
-1 192 51 3.44167e-05
-2 192 51 50 3.44167e-05
-2 192 191 51 3.44167e-05
-3 192 191 51 50 3.44167e-05
-1 256 156 3.4671e-05
-2 256 156 121 3.4671e-05
-2 256 172 156 3.4671e-05
-3 256 172 156 121 3.4671e-05
-0 350 3.49729e-05
-1 350 168 3.49729e-05
-1 350 244 3.49729e-05
-2 350 244 168 3.49729e-05
-0 351 3.49729e-05
-1 351 168 3.49729e-05
-1 351 244 3.49729e-05
-2 351 244 168 3.49729e-05
-1 351 350 3.49729e-05
-2 351 350 168 3.49729e-05
-2 351 350 244 3.49729e-05
-3 351 350 244 168 3.49729e-05
-1 189 7 3.50461e-05
-2 189 39 7 3.50461e-05
-2 189 103 7 3.50461e-05
-3 189 103 39 7 3.50461e-05
-1 351 170 3.50827e-05
-2 351 244 170 3.50827e-05
-0 352 3.50827e-05
-1 352 170 3.50827e-05
-1 352 244 3.50827e-05
-2 352 244 170 3.50827e-05
-1 352 351 3.50827e-05
-2 352 351 170 3.50827e-05
-2 352 351 244 3.50827e-05
-3 352 351 244 170 3.50827e-05
-1 350 169 3.5097e-05
-2 350 169 168 3.5097e-05
-2 350 244 169 3.5097e-05
-3 350 244 169 168 3.5097e-05
-1 102 68 3.51286e-05
-1 102 69 3.51286e-05
-2 102 69 68 3.51286e-05
-1 102 70 3.51286e-05
-2 102 70 68 3.51286e-05
-2 102 70 69 3.51286e-05
-3 102 70 69 68 3.51286e-05
-1 327 20 3.52899e-05
-2 327 179 20 3.52899e-05
-2 327 326 20 3.52899e-05
-3 327 326 179 20 3.52899e-05
-0 353 3.5415e-05
-1 353 202 3.5415e-05
-1 353 203 3.5415e-05
-2 353 203 202 3.5415e-05
-1 353 205 3.5415e-05
-2 353 205 202 3.5415e-05
-2 353 205 203 3.5415e-05
-3 353 205 203 202 3.5415e-05
-0 354 3.55955e-05
-1 354 317 3.55955e-05
-1 354 318 3.55955e-05
-2 354 318 317 3.55955e-05
-0 355 3.55955e-05
-1 355 317 3.55955e-05
-1 355 318 3.55955e-05
-2 355 318 317 3.55955e-05
-1 355 354 3.55955e-05
-2 355 354 317 3.55955e-05
-2 355 354 318 3.55955e-05
-3 355 354 318 317 3.55955e-05
-0 356 3.56429e-05
-0 357 3.56429e-05
-1 357 356 3.56429e-05
-0 358 3.56429e-05
-1 358 356 3.56429e-05
-1 358 357 3.56429e-05
-2 358 357 356 3.56429e-05
-0 359 3.56429e-05
-1 359 356 3.56429e-05
-1 359 357 3.56429e-05
-2 359 357 356 3.56429e-05
-1 359 358 3.56429e-05
-2 359 358 356 3.56429e-05
-2 359 358 357 3.56429e-05
-3 359 358 357 356 3.56429e-05
-1 173 72 3.57917e-05
-0 360 3.57917e-05
-1 360 72 3.57917e-05
-1 360 173 3.57917e-05
-2 360 173 72 3.57917e-05
-0 361 3.57917e-05
-1 361 72 3.57917e-05
-1 361 173 3.57917e-05
-2 361 173 72 3.57917e-05
-1 361 360 3.57917e-05
-2 361 360 72 3.57917e-05
-2 361 360 173 3.57917e-05
-3 361 360 173 72 3.57917e-05
-0 362 3.58691e-05
-1 362 358 3.58691e-05
-0 363 3.58691e-05
-1 363 358 3.58691e-05
-1 363 362 3.58691e-05
-2 363 362 358 3.58691e-05
-0 364 3.58691e-05
-1 364 358 3.58691e-05
-1 364 362 3.58691e-05
-2 364 362 358 3.58691e-05
-1 364 363 3.58691e-05
-2 364 363 358 3.58691e-05
-2 364 363 362 3.58691e-05
-3 364 363 362 358 3.58691e-05
-1 349 228 3.59225e-05
-2 349 228 226 3.59225e-05
-2 349 228 227 3.59225e-05
-3 349 228 227 226 3.59225e-05
-1 307 156 3.59657e-05
-2 307 172 156 3.59657e-05
-2 307 256 156 3.59657e-05
-3 307 256 172 156 3.59657e-05
-1 310 165 3.6038e-05
-1 310 167 3.6038e-05
-2 310 167 165 3.6038e-05
-1 310 259 3.6038e-05
-2 310 259 165 3.6038e-05
-2 310 259 167 3.6038e-05
-3 310 259 167 165 3.6038e-05
-1 257 197 3.6137e-05
-0 365 3.6137e-05
-1 365 197 3.6137e-05
-1 365 257 3.6137e-05
-2 365 257 197 3.6137e-05
-0 366 3.6137e-05
-1 366 197 3.6137e-05
-1 366 257 3.6137e-05
-2 366 257 197 3.6137e-05
-1 366 365 3.6137e-05
-2 366 365 197 3.6137e-05
-2 366 365 257 3.6137e-05
-3 366 365 257 197 3.6137e-05
-0 367 3.62091e-05
-1 367 313 3.62091e-05
-1 367 314 3.62091e-05
-2 367 314 313 3.62091e-05
-0 368 3.62091e-05
-1 368 313 3.62091e-05
-1 368 314 3.62091e-05
-2 368 314 313 3.62091e-05
-1 368 367 3.62091e-05
-2 368 367 313 3.62091e-05
-2 368 367 314 3.62091e-05
-3 368 367 314 313 3.62091e-05
-1 308 32 3.63655e-05
-2 308 32 30 3.63655e-05
-2 308 32 31 3.63655e-05
-3 308 32 31 30 3.63655e-05
-0 369 3.64272e-05
-0 370 3.64272e-05
-1 370 369 3.64272e-05
-0 371 3.64272e-05
-1 371 369 3.64272e-05
-1 371 370 3.64272e-05
-2 371 370 369 3.64272e-05
-0 372 3.64272e-05
-1 372 369 3.64272e-05
-1 372 370 3.64272e-05
-2 372 370 369 3.64272e-05
-1 372 371 3.64272e-05
-2 372 371 369 3.64272e-05
-2 372 371 370 3.64272e-05
-3 372 371 370 369 3.64272e-05
-0 373 3.68428e-05
-0 374 3.68428e-05
-1 374 373 3.68428e-05
-0 375 3.68428e-05
-1 375 373 3.68428e-05
-1 375 374 3.68428e-05
-2 375 374 373 3.68428e-05
-0 376 3.68428e-05
-1 376 373 3.68428e-05
-1 376 374 3.68428e-05
-2 376 374 373 3.68428e-05
-1 376 375 3.68428e-05
-2 376 375 373 3.68428e-05
-2 376 375 374 3.68428e-05
-3 376 375 374 373 3.68428e-05
-0 377 3.7062e-05
-1 377 271 3.7062e-05
-1 377 272 3.7062e-05
-2 377 272 271 3.7062e-05
-1 377 273 3.7062e-05
-2 377 273 271 3.7062e-05
-2 377 273 272 3.7062e-05
-3 377 273 272 271 3.7062e-05
-1 332 124 3.70643e-05
-1 334 124 3.70643e-05
-2 334 332 124 3.70643e-05
-0 378 3.70643e-05
-1 378 124 3.70643e-05
-1 378 332 3.70643e-05
-2 378 332 124 3.70643e-05
-1 378 334 3.70643e-05
-2 378 334 124 3.70643e-05
-2 378 334 332 3.70643e-05
-3 378 334 332 124 3.70643e-05
-1 159 149 3.7109e-05
-2 159 149 146 3.7109e-05
-2 159 149 148 3.7109e-05
-3 159 149 148 146 3.7109e-05
-0 379 3.71282e-05
-1 379 142 3.71282e-05
-1 379 182 3.71282e-05
-2 379 182 142 3.71282e-05
-1 379 250 3.71282e-05
-2 379 250 142 3.71282e-05
-2 379 250 182 3.71282e-05
-3 379 250 182 142 3.71282e-05
-0 380 3.71957e-05
-1 380 117 3.71957e-05
-1 380 213 3.71957e-05
-2 380 213 117 3.71957e-05
-0 381 3.71957e-05
-1 381 117 3.71957e-05
-1 381 213 3.71957e-05
-2 381 213 117 3.71957e-05
-1 381 380 3.71957e-05
-2 381 380 117 3.71957e-05
-2 381 380 213 3.71957e-05
-3 381 380 213 117 3.71957e-05
-0 382 3.72816e-05
-1 382 237 3.72816e-05
-0 383 3.72816e-05
-1 383 237 3.72816e-05
-1 383 382 3.72816e-05
-2 383 382 237 3.72816e-05
-0 384 3.72816e-05
-1 384 237 3.72816e-05
-1 384 382 3.72816e-05
-2 384 382 237 3.72816e-05
-1 384 383 3.72816e-05
-2 384 383 237 3.72816e-05
-2 384 383 382 3.72816e-05
-3 384 383 382 237 3.72816e-05
-1 326 265 3.72989e-05
-2 326 265 7 3.72989e-05
-2 326 265 20 3.72989e-05
-3 326 265 20 7 3.72989e-05
-1 206 92 3.73144e-05
-2 206 157 92 3.73144e-05
-2 206 158 92 3.73144e-05
-3 206 158 157 92 3.73144e-05
-1 306 123 3.74888e-05
-2 306 172 123 3.74888e-05
-2 306 256 123 3.74888e-05
-3 306 256 172 123 3.74888e-05
-0 385 3.7533e-05
-1 385 97 3.7533e-05
-1 385 116 3.7533e-05
-2 385 116 97 3.7533e-05
-0 386 3.7533e-05
-1 386 97 3.7533e-05
-1 386 116 3.7533e-05
-2 386 116 97 3.7533e-05
-1 386 385 3.7533e-05
-2 386 385 97 3.7533e-05
-2 386 385 116 3.7533e-05
-3 386 385 116 97 3.7533e-05
-1 290 148 3.7636e-05
-2 290 149 148 3.7636e-05
-1 290 159 3.7636e-05
-2 290 159 148 3.7636e-05
-2 290 159 149 3.7636e-05
-3 290 159 149 148 3.7636e-05
-1 290 146 3.78658e-05
-2 290 149 146 3.78658e-05
-2 290 159 146 3.78658e-05
-3 290 159 149 146 3.78658e-05
-0 387 3.79542e-05
-1 387 295 3.79542e-05
-0 388 3.79542e-05
-1 388 295 3.79542e-05
-1 388 387 3.79542e-05
-2 388 387 295 3.79542e-05
-0 389 3.79542e-05
-1 389 295 3.79542e-05
-1 389 387 3.79542e-05
-2 389 387 295 3.79542e-05
-1 389 388 3.79542e-05
-2 389 388 295 3.79542e-05
-2 389 388 387 3.79542e-05
-3 389 388 387 295 3.79542e-05
-1 225 176 3.80929e-05
-1 225 214 3.80929e-05
-2 225 214 176 3.80929e-05
-1 298 176 3.80929e-05
-1 298 214 3.80929e-05
-2 298 214 176 3.80929e-05
-2 298 225 176 3.80929e-05
-2 298 225 214 3.80929e-05
-3 298 225 214 176 3.80929e-05
-1 296 273 3.82063e-05
-1 344 273 3.82063e-05
-2 344 296 273 3.82063e-05
-1 377 296 3.82063e-05
-2 377 296 273 3.82063e-05
-1 377 344 3.82063e-05
-2 377 344 273 3.82063e-05
-2 377 344 296 3.82063e-05
-3 377 344 296 273 3.82063e-05
-1 310 166 3.83309e-05
-2 310 166 165 3.83309e-05
-2 310 167 166 3.83309e-05
-3 310 167 166 165 3.83309e-05
-1 386 98 3.83853e-05
-0 390 3.83853e-05
-1 390 98 3.83853e-05
-1 390 386 3.83853e-05
-2 390 386 98 3.83853e-05
-0 391 3.83853e-05
-1 391 98 3.83853e-05
-1 391 386 3.83853e-05
-2 391 386 98 3.83853e-05
-1 391 390 3.83853e-05
-2 391 390 98 3.83853e-05
-2 391 390 386 3.83853e-05
-3 391 390 386 98 3.83853e-05
-0 392 3.84504e-05
-1 392 354 3.84504e-05
-1 392 355 3.84504e-05
-2 392 355 354 3.84504e-05
-0 393 3.84504e-05
-1 393 354 3.84504e-05
-1 393 355 3.84504e-05
-2 393 355 354 3.84504e-05
-1 393 392 3.84504e-05
-2 393 392 354 3.84504e-05
-2 393 392 355 3.84504e-05
-3 393 392 355 354 3.84504e-05
-1 183 144 3.84872e-05
-2 183 144 142 3.84872e-05
-1 251 144 3.84872e-05
-2 251 144 142 3.84872e-05
-2 251 183 144 3.84872e-05
-3 251 183 144 142 3.84872e-05
-1 312 306 3.85061e-05
-2 312 306 113 3.85061e-05
-2 312 306 256 3.85061e-05
-3 312 306 256 113 3.85061e-05
-1 184 44 3.85386e-05
-2 184 45 44 3.85386e-05
-2 184 47 44 3.85386e-05
-3 184 47 45 44 3.85386e-05
-1 268 218 3.85466e-05
-2 268 218 216 3.85466e-05
-2 268 218 217 3.85466e-05
-3 268 218 217 216 3.85466e-05
-1 330 213 3.85849e-05
-2 330 213 117 3.85849e-05
-1 380 330 3.85849e-05
-2 380 330 117 3.85849e-05
-2 380 330 213 3.85849e-05
-3 380 330 213 117 3.85849e-05
-1 327 6 3.88249e-05
-2 327 7 6 3.88249e-05
-2 327 179 6 3.88249e-05
-3 327 179 7 6 3.88249e-05
-0 394 3.88268e-05
-0 395 3.88268e-05
-1 395 394 3.88268e-05
-0 396 3.88268e-05
-1 396 394 3.88268e-05
-1 396 395 3.88268e-05
-2 396 395 394 3.88268e-05
-0 397 3.88268e-05
-1 397 394 3.88268e-05
-1 397 395 3.88268e-05
-2 397 395 394 3.88268e-05
-1 397 396 3.88268e-05
-2 397 396 394 3.88268e-05
-2 397 396 395 3.88268e-05
-3 397 396 395 394 3.88268e-05
-1 369 64 3.88525e-05
-1 369 67 3.88525e-05
-2 369 67 64 3.88525e-05
-0 398 3.88525e-05
-1 398 64 3.88525e-05
-1 398 67 3.88525e-05
-2 398 67 64 3.88525e-05
-1 398 369 3.88525e-05
-2 398 369 64 3.88525e-05
-2 398 369 67 3.88525e-05
-3 398 369 67 64 3.88525e-05
-0 399 3.90843e-05
-1 399 61 3.90843e-05
-1 399 104 3.90843e-05
-2 399 104 61 3.90843e-05
-1 399 122 3.90843e-05
-2 399 122 61 3.90843e-05
-2 399 122 104 3.90843e-05
-3 399 122 104 61 3.90843e-05
-0 400 3.91061e-05
-1 400 57 3.91061e-05
-1 400 84 3.91061e-05
-2 400 84 57 3.91061e-05
-0 401 3.91061e-05
-1 401 57 3.91061e-05
-1 401 84 3.91061e-05
-2 401 84 57 3.91061e-05
-1 401 400 3.91061e-05
-2 401 400 57 3.91061e-05
-2 401 400 84 3.91061e-05
-3 401 400 84 57 3.91061e-05
-1 344 297 3.92631e-05
-2 344 297 294 3.92631e-05
-2 344 297 296 3.92631e-05
-3 344 297 296 294 3.92631e-05
-0 402 3.92687e-05
-1 402 194 3.92687e-05
-1 402 196 3.92687e-05
-2 402 196 194 3.92687e-05
-0 403 3.92687e-05
-1 403 194 3.92687e-05
-1 403 196 3.92687e-05
-2 403 196 194 3.92687e-05
-1 403 402 3.92687e-05
-2 403 402 194 3.92687e-05
-2 403 402 196 3.92687e-05
-3 403 402 196 194 3.92687e-05
-0 404 3.93029e-05
-1 404 69 3.93029e-05
-1 404 81 3.93029e-05
-2 404 81 69 3.93029e-05
-1 404 213 3.93029e-05
-2 404 213 69 3.93029e-05
-2 404 213 81 3.93029e-05
-3 404 213 81 69 3.93029e-05
-1 56 0 3.93155e-05
-1 56 38 3.93155e-05
-2 56 38 0 3.93155e-05
-1 137 0 3.93155e-05
-2 137 38 0 3.93155e-05
-2 137 56 0 3.93155e-05
-2 137 56 38 3.93155e-05
-3 137 56 38 0 3.93155e-05
-1 250 180 3.93471e-05
-1 379 180 3.93471e-05
-2 379 250 180 3.93471e-05
-0 405 3.93471e-05
-1 405 180 3.93471e-05
-1 405 250 3.93471e-05
-2 405 250 180 3.93471e-05
-1 405 379 3.93471e-05
-2 405 379 180 3.93471e-05
-2 405 379 250 3.93471e-05
-3 405 379 250 180 3.93471e-05
-2 330 213 80 3.95784e-05
-3 330 213 117 80 3.95784e-05
-1 225 177 3.97311e-05
-2 225 177 176 3.97311e-05
-1 298 177 3.97311e-05
-2 298 177 176 3.97311e-05
-2 298 225 177 3.97311e-05
-3 298 225 177 176 3.97311e-05
-1 173 75 3.97389e-05
-2 173 75 72 3.97389e-05
-1 361 75 3.97389e-05
-2 361 75 72 3.97389e-05
-2 361 173 75 3.97389e-05
-3 361 173 75 72 3.97389e-05
-1 380 257 3.97765e-05
-2 380 257 213 3.97765e-05
-1 381 257 3.97765e-05
-2 381 257 213 3.97765e-05
-2 381 380 257 3.97765e-05
-3 381 380 257 213 3.97765e-05
-1 354 319 3.97925e-05
-2 354 319 317 3.97925e-05
-2 354 319 318 3.97925e-05
-3 354 319 318 317 3.97925e-05
-0 406 3.99109e-05
-1 406 197 3.99109e-05
-1 406 257 3.99109e-05
-2 406 257 197 3.99109e-05
-0 407 3.99109e-05
-1 407 197 3.99109e-05
-1 407 257 3.99109e-05
-2 407 257 197 3.99109e-05
-1 407 406 3.99109e-05
-2 407 406 197 3.99109e-05
-2 407 406 257 3.99109e-05
-3 407 406 257 197 3.99109e-05
-0 408 4.00093e-05
-0 409 4.00093e-05
-1 409 408 4.00093e-05
-0 410 4.00093e-05
-1 410 408 4.00093e-05
-1 410 409 4.00093e-05
-2 410 409 408 4.00093e-05
-0 411 4.00093e-05
-1 411 408 4.00093e-05
-1 411 409 4.00093e-05
-2 411 409 408 4.00093e-05
-1 411 410 4.00093e-05
-2 411 410 408 4.00093e-05
-2 411 410 409 4.00093e-05
-3 411 410 409 408 4.00093e-05
-1 257 195 4.00473e-05
-2 257 197 195 4.00473e-05
-1 407 195 4.00473e-05
-2 407 197 195 4.00473e-05
-2 407 257 195 4.00473e-05
-3 407 257 197 195 4.00473e-05
-1 380 307 4.00928e-05
-1 406 307 4.00928e-05
-1 406 380 4.00928e-05
-2 406 380 307 4.00928e-05
-1 407 307 4.00928e-05
-1 407 380 4.00928e-05
-2 407 380 307 4.00928e-05
-2 407 406 307 4.00928e-05
-2 407 406 380 4.00928e-05
-3 407 406 380 307 4.00928e-05
-1 101 68 4.01106e-05
-2 101 70 68 4.01106e-05
-2 101 71 68 4.01106e-05
-3 101 71 70 68 4.01106e-05
-0 412 4.01881e-05
-1 412 295 4.01881e-05
-1 412 344 4.01881e-05
-2 412 344 295 4.01881e-05
-0 413 4.01881e-05
-1 413 295 4.01881e-05
-1 413 344 4.01881e-05
-2 413 344 295 4.01881e-05
-1 413 412 4.01881e-05
-2 413 412 295 4.01881e-05
-2 413 412 344 4.01881e-05
-3 413 412 344 295 4.01881e-05
-0 414 4.0203e-05
-0 415 4.0203e-05
-1 415 414 4.0203e-05
-0 416 4.0203e-05
-1 416 414 4.0203e-05
-1 416 415 4.0203e-05
-2 416 415 414 4.0203e-05
-0 417 4.0203e-05
-1 417 414 4.0203e-05
-1 417 415 4.0203e-05
-2 417 415 414 4.0203e-05
-1 417 416 4.0203e-05
-2 417 416 414 4.0203e-05
-2 417 416 415 4.0203e-05
-3 417 416 415 414 4.0203e-05
-1 220 9 4.02544e-05
-2 220 11 9 4.02544e-05
-2 220 219 9 4.02544e-05
-3 220 219 11 9 4.02544e-05
-1 158 91 4.02627e-05
-2 158 92 91 4.02627e-05
-1 206 91 4.02627e-05
-2 206 92 91 4.02627e-05
-2 206 158 91 4.02627e-05
-3 206 158 92 91 4.02627e-05
-1 55 0 4.03688e-05
-1 55 38 4.03688e-05
-2 55 38 0 4.03688e-05
-2 137 55 0 4.03688e-05
-2 137 55 38 4.03688e-05
-3 137 55 38 0 4.03688e-05
-2 102 101 68 4.04017e-05
-2 102 101 70 4.04017e-05
-3 102 101 70 68 4.04017e-05
-1 54 0 4.04041e-05
-1 54 38 4.04041e-05
-2 54 38 0 4.04041e-05
-2 55 54 0 4.04041e-05
-2 55 54 38 4.04041e-05
-3 55 54 38 0 4.04041e-05
-1 268 133 4.04879e-05
-1 268 208 4.04879e-05
-2 268 208 133 4.04879e-05
-1 291 268 4.04879e-05
-2 291 268 133 4.04879e-05
-2 291 268 208 4.04879e-05
-3 291 268 208 133 4.04879e-05
-1 404 68 4.0573e-05
-2 404 69 68 4.0573e-05
-1 404 102 4.0573e-05
-2 404 102 68 4.0573e-05
-2 404 102 69 4.0573e-05
-3 404 102 69 68 4.0573e-05
-1 346 157 4.05926e-05
-1 346 206 4.05926e-05
-2 346 206 157 4.05926e-05
-2 346 207 157 4.05926e-05
-2 346 207 206 4.05926e-05
-3 346 207 206 157 4.05926e-05
-1 286 267 4.06722e-05
-2 286 267 266 4.06722e-05
-1 287 267 4.06722e-05
-2 287 267 266 4.06722e-05
-2 287 286 267 4.06722e-05
-3 287 286 267 266 4.06722e-05
-0 418 4.07011e-05
-1 418 25 4.07011e-05
-1 418 26 4.07011e-05
-2 418 26 25 4.07011e-05
-1 418 28 4.07011e-05
-2 418 28 25 4.07011e-05
-2 418 28 26 4.07011e-05
-3 418 28 26 25 4.07011e-05
-1 157 91 4.08265e-05
-2 157 92 91 4.08265e-05
-1 346 91 4.08265e-05
-1 346 92 4.08265e-05
-2 346 92 91 4.08265e-05
-2 346 157 91 4.08265e-05
-2 346 157 92 4.08265e-05
-3 346 157 92 91 4.08265e-05
-0 419 4.09038e-05
-0 420 4.09038e-05
-1 420 419 4.09038e-05
-0 421 4.09038e-05
-1 421 419 4.09038e-05
-1 421 420 4.09038e-05
-2 421 420 419 4.09038e-05
-0 422 4.09038e-05
-1 422 419 4.09038e-05
-1 422 420 4.09038e-05
-2 422 420 419 4.09038e-05
-1 422 421 4.09038e-05
-2 422 421 419 4.09038e-05
-2 422 421 420 4.09038e-05
-3 422 421 420 419 4.09038e-05
-1 362 356 4.09333e-05
-2 362 358 356 4.09333e-05
-1 362 359 4.09333e-05
-2 362 359 356 4.09333e-05
-2 362 359 358 4.09333e-05
-3 362 359 358 356 4.09333e-05
-0 423 4.09886e-05
-1 423 42 4.09886e-05
-1 423 160 4.09886e-05
-2 423 160 42 4.09886e-05
-1 423 161 4.09886e-05
-2 423 161 42 4.09886e-05
-2 423 161 160 4.09886e-05
-3 423 161 160 42 4.09886e-05
-1 348 157 4.11259e-05
-2 348 207 157 4.11259e-05
-2 348 346 157 4.11259e-05
-3 348 346 207 157 4.11259e-05
-2 330 256 213 4.11394e-05
-3 330 256 213 80 4.11394e-05
-0 424 4.12648e-05
-0 425 4.12648e-05
-1 425 424 4.12648e-05
-0 426 4.12648e-05
-1 426 424 4.12648e-05
-1 426 425 4.12648e-05
-2 426 425 424 4.12648e-05
-0 427 4.12648e-05
-1 427 424 4.12648e-05
-1 427 425 4.12648e-05
-2 427 425 424 4.12648e-05
-1 427 426 4.12648e-05
-2 427 426 424 4.12648e-05
-2 427 426 425 4.12648e-05
-3 427 426 425 424 4.12648e-05
-0 428 4.13009e-05
-1 428 1 4.13009e-05
-1 428 3 4.13009e-05
-2 428 3 1 4.13009e-05
-1 428 63 4.13009e-05
-2 428 63 1 4.13009e-05
-2 428 63 3 4.13009e-05
-3 428 63 3 1 4.13009e-05
-1 308 177 4.13451e-05
-2 308 177 30 4.13451e-05
-2 308 177 176 4.13451e-05
-3 308 177 176 30 4.13451e-05
-2 308 177 32 4.14856e-05
-3 308 177 32 30 4.14856e-05
-0 429 4.15777e-05
-1 429 277 4.15777e-05
-1 429 279 4.15777e-05
-2 429 279 277 4.15777e-05
-0 430 4.15777e-05
-1 430 277 4.15777e-05
-1 430 279 4.15777e-05
-2 430 279 277 4.15777e-05
-1 430 429 4.15777e-05
-2 430 429 277 4.15777e-05
-2 430 429 279 4.15777e-05
-3 430 429 279 277 4.15777e-05
-1 406 365 4.16827e-05
-2 406 365 197 4.16827e-05
-2 406 365 257 4.16827e-05
-3 406 365 257 197 4.16827e-05
-2 351 170 168 4.17164e-05
-3 351 244 170 168 4.17164e-05
-2 56 55 0 4.18001e-05
-3 137 56 55 0 4.18001e-05
-2 407 380 257 4.18544e-05
-1 407 381 4.18544e-05
-2 407 381 257 4.18544e-05
-2 407 381 380 4.18544e-05
-3 407 381 380 257 4.18544e-05
-2 298 214 177 4.19971e-05
-3 298 214 177 176 4.19971e-05
-1 338 48 4.21116e-05
-1 338 49 4.21116e-05
-2 338 49 48 4.21116e-05
-2 338 50 48 4.21116e-05
-2 338 50 49 4.21116e-05
-3 338 50 49 48 4.21116e-05
-0 431 4.21206e-05
-1 431 168 4.21206e-05
-1 431 171 4.21206e-05
-2 431 171 168 4.21206e-05
-0 432 4.21206e-05
-1 432 168 4.21206e-05
-1 432 171 4.21206e-05
-2 432 171 168 4.21206e-05
-1 432 431 4.21206e-05
-2 432 431 168 4.21206e-05
-2 432 431 171 4.21206e-05
-3 432 431 171 168 4.21206e-05
-1 309 102 4.21327e-05
-2 309 102 68 4.21327e-05
-1 404 309 4.21327e-05
-2 404 309 68 4.21327e-05
-2 404 309 102 4.21327e-05
-3 404 309 102 68 4.21327e-05
-1 309 69 4.21671e-05
-1 309 213 4.21671e-05
-2 309 213 69 4.21671e-05
-2 404 309 69 4.21671e-05
-2 404 309 213 4.21671e-05
-3 404 309 213 69 4.21671e-05
-2 406 380 257 4.2351e-05
-3 407 406 380 257 4.2351e-05
-0 433 4.23636e-05
-1 433 109 4.23636e-05
-1 433 110 4.23636e-05
-2 433 110 109 4.23636e-05
-1 433 112 4.23636e-05
-2 433 112 109 4.23636e-05
-2 433 112 110 4.23636e-05
-3 433 112 110 109 4.23636e-05
-1 307 257 4.23756e-05
-2 380 307 257 4.23756e-05
-2 406 307 257 4.23756e-05
-3 406 380 307 257 4.23756e-05
-1 349 169 4.24149e-05
-1 349 244 4.24149e-05
-2 349 244 169 4.24149e-05
-1 350 349 4.24149e-05
-2 350 349 169 4.24149e-05
-2 350 349 244 4.24149e-05
-3 350 349 244 169 4.24149e-05
-1 362 357 4.24228e-05
-2 362 357 356 4.24228e-05
-2 362 359 357 4.24228e-05
-3 362 359 357 356 4.24228e-05
-1 330 257 4.2488e-05
-2 330 257 213 4.2488e-05
-2 380 330 257 4.2488e-05
-3 380 330 257 213 4.2488e-05
-2 56 54 0 4.25689e-05
-3 56 55 54 0 4.25689e-05
-0 434 4.26008e-05
-1 434 135 4.26008e-05
-1 434 136 4.26008e-05
-2 434 136 135 4.26008e-05
-0 435 4.26008e-05
-1 435 135 4.26008e-05
-1 435 136 4.26008e-05
-2 435 136 135 4.26008e-05
-1 435 434 4.26008e-05
-2 435 434 135 4.26008e-05
-2 435 434 136 4.26008e-05
-3 435 434 136 135 4.26008e-05
-0 436 4.26399e-05
-0 437 4.26399e-05
-1 437 436 4.26399e-05
-0 438 4.26399e-05
-1 438 436 4.26399e-05
-1 438 437 4.26399e-05
-2 438 437 436 4.26399e-05
-0 439 4.26399e-05
-1 439 436 4.26399e-05
-1 439 437 4.26399e-05
-2 439 437 436 4.26399e-05
-1 439 438 4.26399e-05
-2 439 438 436 4.26399e-05
-2 439 438 437 4.26399e-05
-3 439 438 437 436 4.26399e-05
-1 366 196 4.26808e-05
-2 366 197 196 4.26808e-05
-1 402 197 4.26808e-05
-2 402 197 196 4.26808e-05
-1 402 366 4.26808e-05
-2 402 366 196 4.26808e-05
-2 402 366 197 4.26808e-05
-3 402 366 197 196 4.26808e-05
-1 287 132 4.27257e-05
-2 287 266 132 4.27257e-05
-2 287 267 132 4.27257e-05
-3 287 267 266 132 4.27257e-05
-1 41 34 4.27981e-05
-1 42 34 4.27981e-05
-2 42 41 34 4.27981e-05
-2 52 41 34 4.27981e-05
-2 52 42 34 4.27981e-05
-3 52 42 41 34 4.27981e-05
-1 381 69 4.28225e-05
-2 381 117 69 4.28225e-05
-0 440 4.28225e-05
-1 440 69 4.28225e-05
-1 440 117 4.28225e-05
-2 440 117 69 4.28225e-05
-1 440 381 4.28225e-05
-2 440 381 69 4.28225e-05
-2 440 381 117 4.28225e-05
-3 440 381 117 69 4.28225e-05
-1 353 65 4.28552e-05
-1 353 66 4.28552e-05
-2 353 66 65 4.28552e-05
-0 441 4.28552e-05
-1 441 65 4.28552e-05
-1 441 66 4.28552e-05
-2 441 66 65 4.28552e-05
-1 441 353 4.28552e-05
-2 441 353 65 4.28552e-05
-2 441 353 66 4.28552e-05
-3 441 353 66 65 4.28552e-05
-2 206 157 91 4.28703e-05
-3 206 157 92 91 4.28703e-05
-0 442 4.28921e-05
-0 443 4.28921e-05
-1 443 442 4.28921e-05
-0 444 4.28921e-05
-1 444 442 4.28921e-05
-1 444 443 4.28921e-05
-2 444 443 442 4.28921e-05
-0 445 4.28921e-05
-1 445 442 4.28921e-05
-1 445 443 4.28921e-05
-2 445 443 442 4.28921e-05
-1 445 444 4.28921e-05
-2 445 444 442 4.28921e-05
-2 445 444 443 4.28921e-05
-3 445 444 443 442 4.28921e-05
-0 446 4.29366e-05
-0 447 4.29366e-05
-1 447 446 4.29366e-05
-0 448 4.29366e-05
-1 448 446 4.29366e-05
-1 448 447 4.29366e-05
-2 448 447 446 4.29366e-05
-0 449 4.29366e-05
-1 449 446 4.29366e-05
-1 449 447 4.29366e-05
-2 449 447 446 4.29366e-05
-1 449 448 4.29366e-05
-2 449 448 446 4.29366e-05
-2 449 448 447 4.29366e-05
-3 449 448 447 446 4.29366e-05
-1 353 64 4.29505e-05
-2 353 65 64 4.29505e-05
-2 353 66 64 4.29505e-05
-3 353 66 65 64 4.29505e-05
-0 450 4.30372e-05
-0 451 4.30372e-05
-1 451 450 4.30372e-05
-0 452 4.30372e-05
-1 452 450 4.30372e-05
-1 452 451 4.30372e-05
-2 452 451 450 4.30372e-05
-0 453 4.30372e-05
-1 453 450 4.30372e-05
-1 453 451 4.30372e-05
-2 453 451 450 4.30372e-05
-1 453 452 4.30372e-05
-2 453 452 450 4.30372e-05
-2 453 452 451 4.30372e-05
-3 453 452 451 450 4.30372e-05
-1 423 125 4.30994e-05
-2 423 160 125 4.30994e-05
-1 423 264 4.30994e-05
-2 423 264 125 4.30994e-05
-2 423 264 160 4.30994e-05
-3 423 264 160 125 4.30994e-05
-0 454 4.31896e-05
-1 454 15 4.31896e-05
-1 454 33 4.31896e-05
-2 454 33 15 4.31896e-05
-1 454 58 4.31896e-05
-2 454 58 15 4.31896e-05
-2 454 58 33 4.31896e-05
-3 454 58 33 15 4.31896e-05
-2 330 307 257 4.32463e-05
-2 380 330 307 4.32463e-05
-3 380 330 307 257 4.32463e-05
-1 388 294 4.33316e-05
-2 388 295 294 4.33316e-05
-1 389 294 4.33316e-05
-2 389 295 294 4.33316e-05
-2 389 388 294 4.33316e-05
-3 389 388 295 294 4.33316e-05
-0 455 4.33336e-05
-1 455 340 4.33336e-05
-0 456 4.33336e-05
-1 456 340 4.33336e-05
-1 456 455 4.33336e-05
-2 456 455 340 4.33336e-05
-0 457 4.33336e-05
-1 457 340 4.33336e-05
-1 457 455 4.33336e-05
-2 457 455 340 4.33336e-05
-1 457 456 4.33336e-05
-2 457 456 340 4.33336e-05
-2 457 456 455 4.33336e-05
-3 457 456 455 340 4.33336e-05
-2 308 225 176 4.33942e-05
-2 308 225 177 4.33942e-05
-3 308 225 177 176 4.33942e-05
-1 184 46 4.34147e-05
-2 184 46 44 4.34147e-05
-2 184 47 46 4.34147e-05
-3 184 47 46 44 4.34147e-05
-1 431 169 4.35199e-05
-2 431 169 168 4.35199e-05
-2 431 171 169 4.35199e-05
-3 431 171 169 168 4.35199e-05
-0 458 4.35343e-05
-1 458 73 4.35343e-05
-1 458 74 4.35343e-05
-2 458 74 73 4.35343e-05
-1 458 310 4.35343e-05
-2 458 310 73 4.35343e-05
-2 458 310 74 4.35343e-05
-3 458 310 74 73 4.35343e-05
-0 459 4.36013e-05
-1 459 40 4.36013e-05
-1 459 162 4.36013e-05
-2 459 162 40 4.36013e-05
-1 459 163 4.36013e-05
-2 459 163 40 4.36013e-05
-2 459 163 162 4.36013e-05
-3 459 163 162 40 4.36013e-05
-2 265 189 7 4.36391e-05
-3 265 189 39 7 4.36391e-05
-1 254 215 4.37493e-05
-1 254 218 4.37493e-05
-2 254 218 215 4.37493e-05
-0 460 4.37493e-05
-1 460 215 4.37493e-05
-1 460 218 4.37493e-05
-2 460 218 215 4.37493e-05
-1 460 254 4.37493e-05
-2 460 254 215 4.37493e-05
-2 460 254 218 4.37493e-05
-3 460 254 218 215 4.37493e-05
-2 330 257 256 4.3895e-05
-3 330 257 256 213 4.3895e-05
-0 461 4.39115e-05
-1 461 167 4.39115e-05
-1 461 259 4.39115e-05
-2 461 259 167 4.39115e-05
-1 461 310 4.39115e-05
-2 461 310 167 4.39115e-05
-2 461 310 259 4.39115e-05
-3 461 310 259 167 4.39115e-05
-0 462 4.40091e-05
-0 463 4.40091e-05
-1 463 462 4.40091e-05
-0 464 4.40091e-05
-1 464 462 4.40091e-05
-1 464 463 4.40091e-05
-2 464 463 462 4.40091e-05
-0 465 4.40091e-05
-1 465 462 4.40091e-05
-1 465 463 4.40091e-05
-2 465 463 462 4.40091e-05
-1 465 464 4.40091e-05
-2 465 464 462 4.40091e-05
-2 465 464 463 4.40091e-05
-3 465 464 463 462 4.40091e-05
-1 390 23 4.40116e-05
-1 390 97 4.40116e-05
-2 390 97 23 4.40116e-05
-2 390 98 23 4.40116e-05
-2 390 98 97 4.40116e-05
-3 390 98 97 23 4.40116e-05
-0 466 4.40486e-05
-1 466 348 4.40486e-05
-0 467 4.40486e-05
-1 467 348 4.40486e-05
-1 467 466 4.40486e-05
-2 467 466 348 4.40486e-05
-0 468 4.40486e-05
-1 468 348 4.40486e-05
-1 468 466 4.40486e-05
-2 468 466 348 4.40486e-05
-1 468 467 4.40486e-05
-2 468 467 348 4.40486e-05
-2 468 467 466 4.40486e-05
-3 468 467 466 348 4.40486e-05
-1 327 265 4.40733e-05
-2 327 265 20 4.40733e-05
-2 327 326 265 4.40733e-05
-3 327 326 265 20 4.40733e-05
-0 469 4.41168e-05
-1 469 367 4.41168e-05
-1 469 368 4.41168e-05
-2 469 368 367 4.41168e-05
-0 470 4.41168e-05
-1 470 367 4.41168e-05
-1 470 368 4.41168e-05
-2 470 368 367 4.41168e-05
-1 470 469 4.41168e-05
-2 470 469 367 4.41168e-05
-2 470 469 368 4.41168e-05
-3 470 469 368 367 4.41168e-05
-1 162 25 4.41285e-05
-1 163 25 4.41285e-05
-2 163 162 25 4.41285e-05
-1 459 25 4.41285e-05
-2 459 162 25 4.41285e-05
-2 459 163 25 4.41285e-05
-3 459 163 162 25 4.41285e-05
-1 383 239 4.42147e-05
-2 383 239 237 4.42147e-05
-1 384 239 4.42147e-05
-2 384 239 237 4.42147e-05
-2 384 383 239 4.42147e-05
-3 384 383 239 237 4.42147e-05
-1 323 114 4.42253e-05
-0 471 4.42253e-05
-1 471 114 4.42253e-05
-1 471 323 4.42253e-05
-2 471 323 114 4.42253e-05
-0 472 4.42253e-05
-1 472 114 4.42253e-05
-1 472 323 4.42253e-05
-2 472 323 114 4.42253e-05
-1 472 471 4.42253e-05
-2 472 471 114 4.42253e-05
-2 472 471 323 4.42253e-05
-3 472 471 323 114 4.42253e-05
-1 387 344 4.43099e-05
-2 387 344 295 4.43099e-05
-1 413 387 4.43099e-05
-2 413 387 295 4.43099e-05
-2 413 387 344 4.43099e-05
-3 413 387 344 295 4.43099e-05
-1 404 245 4.43145e-05
-2 404 245 68 4.43145e-05
-2 404 309 245 4.43145e-05
-3 404 309 245 68 4.43145e-05
-1 211 146 4.44368e-05
-1 211 147 4.44368e-05
-2 211 147 146 4.44368e-05
-1 288 146 4.44368e-05
-1 288 147 4.44368e-05
-2 288 147 146 4.44368e-05
-1 288 211 4.44368e-05
-2 288 211 146 4.44368e-05
-2 288 211 147 4.44368e-05
-3 288 211 147 146 4.44368e-05
-0 473 4.44746e-05
-1 473 25 4.44746e-05
-1 473 163 4.44746e-05
-2 473 163 25 4.44746e-05
-1 473 459 4.44746e-05
-2 473 459 25 4.44746e-05
-2 473 459 163 4.44746e-05
-3 473 459 163 25 4.44746e-05
-0 474 4.4501e-05
-1 474 138 4.4501e-05
-1 474 139 4.4501e-05
-2 474 139 138 4.4501e-05
-1 474 141 4.4501e-05
-2 474 141 138 4.4501e-05
-2 474 141 139 4.4501e-05
-3 474 141 139 138 4.4501e-05
-1 382 191 4.45628e-05
-1 382 192 4.45628e-05
-2 382 192 191 4.45628e-05
-0 475 4.45628e-05
-1 475 191 4.45628e-05
-1 475 192 4.45628e-05
-2 475 192 191 4.45628e-05
-1 475 382 4.45628e-05
-2 475 382 191 4.45628e-05
-2 475 382 192 4.45628e-05
-3 475 382 192 191 4.45628e-05
-1 351 349 4.46338e-05
-2 351 349 244 4.46338e-05
-2 351 350 349 4.46338e-05
-3 351 350 349 244 4.46338e-05
-0 476 4.47294e-05
-1 476 283 4.47294e-05
-1 476 284 4.47294e-05
-2 476 284 283 4.47294e-05
-0 477 4.47294e-05
-1 477 283 4.47294e-05
-1 477 284 4.47294e-05
-2 477 284 283 4.47294e-05
-1 477 476 4.47294e-05
-2 477 476 283 4.47294e-05
-2 477 476 284 4.47294e-05
-3 477 476 284 283 4.47294e-05
-0 478 4.48147e-05
-1 478 219 4.48147e-05
-1 478 220 4.48147e-05
-2 478 220 219 4.48147e-05
-0 479 4.48147e-05
-1 479 219 4.48147e-05
-1 479 220 4.48147e-05
-2 479 220 219 4.48147e-05
-1 479 478 4.48147e-05
-2 479 478 219 4.48147e-05
-2 479 478 220 4.48147e-05
-3 479 478 220 219 4.48147e-05
-2 307 257 256 4.49515e-05
-3 330 307 257 256 4.49515e-05
-1 312 123 4.49587e-05
-2 312 256 123 4.49587e-05
-2 312 306 123 4.49587e-05
-3 312 306 256 123 4.49587e-05
-0 480 4.50668e-05
-0 481 4.50668e-05
-1 481 480 4.50668e-05
-0 482 4.50668e-05
-1 482 480 4.50668e-05
-1 482 481 4.50668e-05
-2 482 481 480 4.50668e-05
-0 483 4.50668e-05
-1 483 480 4.50668e-05
-1 483 481 4.50668e-05
-2 483 481 480 4.50668e-05
-1 483 482 4.50668e-05
-2 483 482 480 4.50668e-05
-2 483 482 481 4.50668e-05
-3 483 482 481 480 4.50668e-05
-1 398 65 4.51265e-05
-2 398 65 64 4.51265e-05
-0 484 4.51265e-05
-1 484 64 4.51265e-05
-1 484 65 4.51265e-05
-2 484 65 64 4.51265e-05
-1 484 398 4.51265e-05
-2 484 398 64 4.51265e-05
-2 484 398 65 4.51265e-05
-3 484 398 65 64 4.51265e-05
-1 406 156 4.52256e-05
-1 406 256 4.52256e-05
-2 406 256 156 4.52256e-05
-2 406 307 156 4.52256e-05
-2 406 307 256 4.52256e-05
-3 406 307 256 156 4.52256e-05
-0 485 4.52952e-05
-1 485 271 4.52952e-05
-1 485 272 4.52952e-05
-2 485 272 271 4.52952e-05
-1 485 377 4.52952e-05
-2 485 377 271 4.52952e-05
-2 485 377 272 4.52952e-05
-3 485 377 272 271 4.52952e-05
-0 486 4.53026e-05
-0 487 4.53026e-05
-1 487 486 4.53026e-05
-0 488 4.53026e-05
-1 488 486 4.53026e-05
-1 488 487 4.53026e-05
-2 488 487 486 4.53026e-05
-0 489 4.53026e-05
-1 489 486 4.53026e-05
-1 489 487 4.53026e-05
-2 489 487 486 4.53026e-05
-1 489 488 4.53026e-05
-2 489 488 486 4.53026e-05
-2 489 488 487 4.53026e-05
-3 489 488 487 486 4.53026e-05
-0 490 4.5402e-05
-1 490 136 4.5402e-05
-1 490 434 4.5402e-05
-2 490 434 136 4.5402e-05
-1 490 435 4.5402e-05
-2 490 435 136 4.5402e-05
-2 490 435 434 4.5402e-05
-3 490 435 434 136 4.5402e-05
-0 491 4.54103e-05
-1 491 72 4.54103e-05
-1 491 173 4.54103e-05
-2 491 173 72 4.54103e-05
-1 491 360 4.54103e-05
-2 491 360 72 4.54103e-05
-2 491 360 173 4.54103e-05
-3 491 360 173 72 4.54103e-05
-1 326 189 4.5442e-05
-2 326 189 7 4.5442e-05
-2 326 265 189 4.5442e-05
-3 326 265 189 7 4.5442e-05
-1 309 101 4.54611e-05
-2 309 101 68 4.54611e-05
-2 309 102 101 4.54611e-05
-3 309 102 101 68 4.54611e-05
-0 492 4.54947e-05
-1 492 236 4.54947e-05
-1 492 237 4.54947e-05
-2 492 237 236 4.54947e-05
-1 492 238 4.54947e-05
-2 492 238 236 4.54947e-05
-2 492 238 237 4.54947e-05
-3 492 238 237 236 4.54947e-05
-1 381 195 4.5496e-05
-2 381 257 195 4.5496e-05
-2 407 381 195 4.5496e-05
-3 407 381 257 195 4.5496e-05
-1 292 268 4.55131e-05
-2 292 268 133 4.55131e-05
-2 292 291 268 4.55131e-05
-3 292 291 268 133 4.55131e-05
-1 377 297 4.56145e-05
-1 485 297 4.56145e-05
-2 485 377 297 4.56145e-05
-0 493 4.56145e-05
-1 493 297 4.56145e-05
-1 493 377 4.56145e-05
-2 493 377 297 4.56145e-05
-1 493 485 4.56145e-05
-2 493 485 297 4.56145e-05
-2 493 485 377 4.56145e-05
-3 493 485 377 297 4.56145e-05
-0 494 4.56262e-05
-1 494 168 4.56262e-05
-1 494 432 4.56262e-05
-2 494 432 168 4.56262e-05
-0 495 4.56262e-05
-1 495 168 4.56262e-05
-1 495 432 4.56262e-05
-2 495 432 168 4.56262e-05
-1 495 494 4.56262e-05
-2 495 494 168 4.56262e-05
-2 495 494 432 4.56262e-05
-3 495 494 432 168 4.56262e-05
-2 309 101 71 4.56909e-05
-3 309 101 71 68 4.56909e-05
-0 496 4.57083e-05
-1 496 107 4.57083e-05
-1 496 108 4.57083e-05
-2 496 108 107 4.57083e-05
-1 496 178 4.57083e-05
-2 496 178 107 4.57083e-05
-2 496 178 108 4.57083e-05
-3 496 178 108 107 4.57083e-05
-0 497 4.58081e-05
-1 497 429 4.58081e-05
-0 498 4.58081e-05
-1 498 429 4.58081e-05
-1 498 497 4.58081e-05
-2 498 497 429 4.58081e-05
-0 499 4.58081e-05
-1 499 429 4.58081e-05
-1 499 497 4.58081e-05
-2 499 497 429 4.58081e-05
-1 499 498 4.58081e-05
-2 499 498 429 4.58081e-05
-2 499 498 497 4.58081e-05
-3 499 498 497 429 4.58081e-05
-0 500 4.58936e-05
-0 501 4.58936e-05
-1 501 500 4.58936e-05
-0 502 4.58936e-05
-1 502 500 4.58936e-05
-1 502 501 4.58936e-05
-2 502 501 500 4.58936e-05
-0 503 4.58936e-05
-1 503 500 4.58936e-05
-1 503 501 4.58936e-05
-2 503 501 500 4.58936e-05
-1 503 502 4.58936e-05
-2 503 502 500 4.58936e-05
-2 503 502 501 4.58936e-05
-3 503 502 501 500 4.58936e-05
-1 34 27 4.59747e-05
-1 36 27 4.59747e-05
-2 36 34 27 4.59747e-05
-1 162 27 4.59747e-05
-1 162 34 4.59747e-05
-2 162 34 27 4.59747e-05
-1 162 36 4.59747e-05
-2 162 36 27 4.59747e-05
-2 162 36 34 4.59747e-05
-3 162 36 34 27 4.59747e-05
-2 250 182 180 4.6106e-05
-2 379 182 180 4.6106e-05
-3 379 250 182 180 4.6106e-05
-1 183 145 4.61121e-05
-2 183 145 142 4.61121e-05
-2 183 145 144 4.61121e-05
-3 183 145 144 142 4.61121e-05
-0 504 4.61529e-05
-1 504 186 4.61529e-05
-1 504 304 4.61529e-05
-2 504 304 186 4.61529e-05
-1 504 305 4.61529e-05
-2 504 305 186 4.61529e-05
-2 504 305 304 4.61529e-05
-3 504 305 304 186 4.61529e-05
-0 505 4.61746e-05
-1 505 315 4.61746e-05
-1 505 328 4.61746e-05
-2 505 328 315 4.61746e-05
-1 505 345 4.61746e-05
-2 505 345 315 4.61746e-05
-2 505 345 328 4.61746e-05
-3 505 345 328 315 4.61746e-05
-1 505 316 4.61913e-05
-2 505 316 315 4.61913e-05
-0 506 4.61913e-05
-1 506 315 4.61913e-05
-1 506 316 4.61913e-05
-2 506 316 315 4.61913e-05
-1 506 505 4.61913e-05
-2 506 505 315 4.61913e-05
-2 506 505 316 4.61913e-05
-3 506 505 316 315 4.61913e-05
-0 507 4.62143e-05
-1 507 173 4.62143e-05
-1 507 360 4.62143e-05
-2 507 360 173 4.62143e-05
-1 507 491 4.62143e-05
-2 507 491 173 4.62143e-05
-2 507 491 360 4.62143e-05
-3 507 491 360 173 4.62143e-05
-0 508 4.62498e-05
-1 508 124 4.62498e-05
-1 508 125 4.62498e-05
-2 508 125 124 4.62498e-05
-0 509 4.62498e-05
-1 509 124 4.62498e-05
-1 509 125 4.62498e-05
-2 509 125 124 4.62498e-05
-1 509 508 4.62498e-05
-2 509 508 124 4.62498e-05
-2 509 508 125 4.62498e-05
-3 509 508 125 124 4.62498e-05
-1 406 121 4.6277e-05
-2 406 156 121 4.6277e-05
-2 406 256 121 4.6277e-05
-3 406 256 156 121 4.6277e-05
-1 402 195 4.63352e-05
-2 402 196 195 4.63352e-05
-2 402 197 195 4.63352e-05
-3 402 197 196 195 4.63352e-05
-2 346 206 91 4.63507e-05
-3 346 206 157 91 4.63507e-05
-1 368 345 4.65044e-05
-2 368 345 313 4.65044e-05
-1 412 313 4.65044e-05
-1 412 345 4.65044e-05
-2 412 345 313 4.65044e-05
-1 412 368 4.65044e-05
-2 412 368 313 4.65044e-05
-2 412 368 345 4.65044e-05
-3 412 368 345 313 4.65044e-05
-1 338 191 4.66757e-05
-2 338 191 50 4.66757e-05
-2 338 191 190 4.66757e-05
-3 338 191 190 50 4.66757e-05
-1 161 43 4.68238e-05
-2 161 43 42 4.68238e-05
-0 510 4.68238e-05
-1 510 42 4.68238e-05
-1 510 43 4.68238e-05
-2 510 43 42 4.68238e-05
-1 510 161 4.68238e-05
-2 510 161 42 4.68238e-05
-2 510 161 43 4.68238e-05
-3 510 161 43 42 4.68238e-05
-2 288 149 146 4.68528e-05
-2 288 149 147 4.68528e-05
-3 288 149 147 146 4.68528e-05
-1 299 9 4.69516e-05
-1 299 10 4.69516e-05
-2 299 10 9 4.69516e-05
-1 299 11 4.69516e-05
-2 299 11 9 4.69516e-05
-2 299 11 10 4.69516e-05
-3 299 11 10 9 4.69516e-05
-1 485 270 4.70658e-05
-2 485 271 270 4.70658e-05
-2 485 272 270 4.70658e-05
-3 485 272 271 270 4.70658e-05
-0 511 4.70864e-05
-1 511 155 4.70864e-05
-1 511 189 4.70864e-05
-2 511 189 155 4.70864e-05
-1 511 265 4.70864e-05
-2 511 265 155 4.70864e-05
-2 511 265 189 4.70864e-05
-3 511 265 189 155 4.70864e-05
-1 474 140 4.71691e-05
-2 474 140 138 4.71691e-05
-2 474 140 139 4.71691e-05
-3 474 140 139 138 4.71691e-05
-1 309 99 4.72177e-05
-2 309 102 99 4.72177e-05
-1 440 99 4.72177e-05
-1 440 102 4.72177e-05
-2 440 102 99 4.72177e-05
-1 440 309 4.72177e-05
-2 440 309 99 4.72177e-05
-2 440 309 102 4.72177e-05
-3 440 309 102 99 4.72177e-05
-2 406 257 256 4.73812e-05
-3 406 307 257 256 4.73812e-05
-2 381 213 69 4.74157e-05
-3 381 213 117 69 4.74157e-05
-1 490 147 4.74165e-05
-1 490 211 4.74165e-05
-2 490 211 147 4.74165e-05
-1 490 288 4.74165e-05
-2 490 288 147 4.74165e-05
-2 490 288 211 4.74165e-05
-3 490 288 211 147 4.74165e-05
-1 353 67 4.74762e-05
-2 353 67 64 4.74762e-05
-2 353 67 66 4.74762e-05
-3 353 67 66 64 4.74762e-05
-1 388 245 4.75264e-05
-1 388 309 4.75264e-05
-2 388 309 245 4.75264e-05
-1 404 388 4.75264e-05
-2 404 388 245 4.75264e-05
-2 404 388 309 4.75264e-05
-3 404 388 309 245 4.75264e-05
-1 229 106 4.7613e-05
-1 231 106 4.7613e-05
-2 231 229 106 4.7613e-05
-2 232 229 106 4.7613e-05
-2 232 231 106 4.7613e-05
-3 232 231 229 106 4.7613e-05
-1 493 271 4.76912e-05
-2 493 377 271 4.76912e-05
-2 493 485 271 4.76912e-05
-3 493 485 377 271 4.76912e-05
-0 512 4.78831e-05
-1 512 189 4.78831e-05
-1 512 293 4.78831e-05
-2 512 293 189 4.78831e-05
-1 512 311 4.78831e-05
-2 512 311 189 4.78831e-05
-2 512 311 293 4.78831e-05
-3 512 311 293 189 4.78831e-05
-1 375 314 4.78929e-05
-0 513 4.78929e-05
-1 513 314 4.78929e-05
-1 513 375 4.78929e-05
-2 513 375 314 4.78929e-05
-0 514 4.78929e-05
-1 514 314 4.78929e-05
-1 514 375 4.78929e-05
-2 514 375 314 4.78929e-05
-1 514 513 4.78929e-05
-2 514 513 314 4.78929e-05
-2 514 513 375 4.78929e-05
-3 514 513 375 314 4.78929e-05
-1 268 188 4.79962e-05
-2 268 188 133 4.79962e-05
-1 292 188 4.79962e-05
-2 292 188 133 4.79962e-05
-2 292 268 188 4.79962e-05
-3 292 268 188 133 4.79962e-05
-0 515 4.80217e-05
-0 516 4.80217e-05
-1 516 515 4.80217e-05
-0 517 4.80217e-05
-1 517 515 4.80217e-05
-1 517 516 4.80217e-05
-2 517 516 515 4.80217e-05
-0 518 4.80217e-05
-1 518 515 4.80217e-05
-1 518 516 4.80217e-05
-2 518 516 515 4.80217e-05
-1 518 517 4.80217e-05
-2 518 517 515 4.80217e-05
-2 518 517 516 4.80217e-05
-3 518 517 516 515 4.80217e-05
-1 292 211 4.8068e-05
-1 292 288 4.8068e-05
-2 292 288 211 4.8068e-05
-1 490 292 4.8068e-05
-2 490 292 211 4.8068e-05
-2 490 292 288 4.8068e-05
-3 490 292 288 211 4.8068e-05
-0 519 4.81443e-05
-1 519 170 4.81443e-05
-1 519 351 4.81443e-05
-2 519 351 170 4.81443e-05
-1 519 352 4.81443e-05
-2 519 352 170 4.81443e-05
-2 519 352 351 4.81443e-05
-3 519 352 351 170 4.81443e-05
-1 485 273 4.81739e-05
-2 485 273 272 4.81739e-05
-2 485 377 273 4.81739e-05
-3 485 377 273 272 4.81739e-05
-1 182 144 4.81788e-05
-2 183 182 144 4.81788e-05
-2 251 182 144 4.81788e-05
-3 251 183 182 144 4.81788e-05
-0 520 4.81915e-05
-1 520 500 4.81915e-05
-1 520 501 4.81915e-05
-2 520 501 500 4.81915e-05
-1 520 502 4.81915e-05
-2 520 502 500 4.81915e-05
-2 520 502 501 4.81915e-05
-3 520 502 501 500 4.81915e-05
-2 377 297 296 4.83214e-05
-1 493 296 4.83214e-05
-2 493 297 296 4.83214e-05
-2 493 377 296 4.83214e-05
-3 493 377 297 296 4.83214e-05
-1 309 81 4.83642e-05
-2 309 213 81 4.83642e-05
-2 404 309 81 4.83642e-05
-3 404 309 213 81 4.83642e-05
-0 521 4.84507e-05
-1 521 357 4.84507e-05
-0 522 4.84507e-05
-1 522 357 4.84507e-05
-1 522 521 4.84507e-05
-2 522 521 357 4.84507e-05
-0 523 4.84507e-05
-1 523 357 4.84507e-05
-1 523 521 4.84507e-05
-2 523 521 357 4.84507e-05
-1 523 522 4.84507e-05
-2 523 522 357 4.84507e-05
-2 523 522 521 4.84507e-05
-3 523 522 521 357 4.84507e-05
-1 210 148 4.8475e-05
-2 210 159 148 4.8475e-05
-0 524 4.8475e-05
-1 524 148 4.8475e-05
-1 524 159 4.8475e-05
-2 524 159 148 4.8475e-05
-1 524 210 4.8475e-05
-2 524 210 148 4.8475e-05
-2 524 210 159 4.8475e-05
-3 524 210 159 148 4.8475e-05
-0 525 4.85047e-05
-0 526 4.85047e-05
-1 526 525 4.85047e-05
-0 527 4.85047e-05
-1 527 525 4.85047e-05
-1 527 526 4.85047e-05
-2 527 526 525 4.85047e-05
-0 528 4.85047e-05
-1 528 525 4.85047e-05
-1 528 526 4.85047e-05
-2 528 526 525 4.85047e-05
-1 528 527 4.85047e-05
-2 528 527 525 4.85047e-05
-2 528 527 526 4.85047e-05
-3 528 527 526 525 4.85047e-05
-0 529 4.85101e-05
-1 529 336 4.85101e-05
-0 530 4.85101e-05
-1 530 336 4.85101e-05
-1 530 529 4.85101e-05
-2 530 529 336 4.85101e-05
-0 531 4.85101e-05
-1 531 336 4.85101e-05
-1 531 529 4.85101e-05
-2 531 529 336 4.85101e-05
-1 531 530 4.85101e-05
-2 531 530 336 4.85101e-05
-2 531 530 529 4.85101e-05
-3 531 530 529 336 4.85101e-05
-1 475 51 4.85723e-05
-2 475 191 51 4.85723e-05
-2 475 192 51 4.85723e-05
-3 475 192 191 51 4.85723e-05
-1 440 100 4.86093e-05
-2 440 100 99 4.86093e-05
-2 440 102 100 4.86093e-05
-3 440 102 100 99 4.86093e-05
-2 309 102 69 4.87225e-05
-3 404 309 102 69 4.87225e-05
-0 532 4.88152e-05
-1 532 18 4.88152e-05
-1 532 19 4.88152e-05
-2 532 19 18 4.88152e-05
-0 533 4.88152e-05
-1 533 18 4.88152e-05
-1 533 19 4.88152e-05
-2 533 19 18 4.88152e-05
-1 533 532 4.88152e-05
-2 533 532 18 4.88152e-05
-2 533 532 19 4.88152e-05
-3 533 532 19 18 4.88152e-05
-2 173 73 72 4.89517e-05
-2 173 75 73 4.89517e-05
-3 173 75 73 72 4.89517e-05
-1 43 34 4.91217e-05
-2 43 41 34 4.91217e-05
-2 43 42 34 4.91217e-05
-3 43 42 41 34 4.91217e-05
-1 319 15 4.91261e-05
-1 454 319 4.91261e-05
-2 454 319 15 4.91261e-05
-0 534 4.91261e-05
-1 534 15 4.91261e-05
-1 534 319 4.91261e-05
-2 534 319 15 4.91261e-05
-1 534 454 4.91261e-05
-2 534 454 15 4.91261e-05
-2 534 454 319 4.91261e-05
-3 534 454 319 15 4.91261e-05
-1 366 195 4.9246e-05
-2 366 197 195 4.9246e-05
-2 402 366 195 4.9246e-05
-3 402 366 197 195 4.9246e-05
-1 216 133 4.93002e-05
-1 216 208 4.93002e-05
-2 216 208 133 4.93002e-05
-2 268 216 133 4.93002e-05
-2 268 216 208 4.93002e-05
-3 268 216 208 133 4.93002e-05
-2 309 101 99 4.93601e-05
-3 309 102 101 99 4.93601e-05
-0 535 4.93614e-05
-1 535 322 4.93614e-05
-1 535 323 4.93614e-05
-2 535 323 322 4.93614e-05
-1 535 325 4.93614e-05
-2 535 325 322 4.93614e-05
-2 535 325 323 4.93614e-05
-3 535 325 323 322 4.93614e-05
-0 536 4.93888e-05
-1 536 9 4.93888e-05
-1 536 219 4.93888e-05
-2 536 219 9 4.93888e-05
-1 536 220 4.93888e-05
-2 536 220 9 4.93888e-05
-2 536 220 219 4.93888e-05
-3 536 220 219 9 4.93888e-05
-1 382 51 4.94124e-05
-2 382 192 51 4.94124e-05
-2 475 382 51 4.94124e-05
-3 475 382 192 51 4.94124e-05
-1 217 45 4.94267e-05
-1 268 45 4.94267e-05
-2 268 217 45 4.94267e-05
-0 537 4.94267e-05
-1 537 45 4.94267e-05
-1 537 217 4.94267e-05
-2 537 217 45 4.94267e-05
-1 537 268 4.94267e-05
-2 537 268 45 4.94267e-05
-2 537 268 217 4.94267e-05
-3 537 268 217 45 4.94267e-05
-1 259 174 4.94509e-05
-2 310 259 174 4.94509e-05
-1 461 174 4.94509e-05
-2 461 259 174 4.94509e-05
-2 461 310 174 4.94509e-05
-3 461 310 259 174 4.94509e-05
-1 505 329 4.94868e-05
-2 505 329 315 4.94868e-05
-2 505 329 328 4.94868e-05
-3 505 329 328 315 4.94868e-05
-0 538 4.95053e-05
-1 538 134 4.95053e-05
-1 538 255 4.95053e-05
-2 538 255 134 4.95053e-05
-0 539 4.95053e-05
-1 539 134 4.95053e-05
-1 539 255 4.95053e-05
-2 539 255 134 4.95053e-05
-1 539 538 4.95053e-05
-2 539 538 134 4.95053e-05
-2 539 538 255 4.95053e-05
-3 539 538 255 134 4.95053e-05
-1 101 69 4.95346e-05
-2 101 70 69 4.95346e-05
-2 102 101 69 4.95346e-05
-3 102 101 70 69 4.95346e-05
-0 540 4.95948e-05
-1 540 61 4.95948e-05
-1 540 122 4.95948e-05
-2 540 122 61 4.95948e-05
-1 540 399 4.95948e-05
-2 540 399 61 4.95948e-05
-2 540 399 122 4.95948e-05
-3 540 399 122 61 4.95948e-05
-1 511 326 4.96679e-05
-2 511 326 189 4.96679e-05
-2 511 326 265 4.96679e-05
-3 511 326 265 189 4.96679e-05
-1 289 146 4.96925e-05
-2 289 149 146 4.96925e-05
-2 289 288 146 4.96925e-05
-3 289 288 149 146 4.96925e-05
-1 257 121 4.9821e-05
-2 257 256 121 4.9821e-05
-2 406 257 121 4.9821e-05
-3 406 257 256 121 4.9821e-05
-1 296 271 4.98565e-05
-1 344 271 4.98565e-05
-2 344 296 271 4.98565e-05
-2 377 296 271 4.98565e-05
-2 377 344 271 4.98565e-05
-3 377 344 296 271 4.98565e-05
-1 284 9 4.992e-05
-2 299 284 9 4.992e-05
-1 536 284 4.992e-05
-2 536 284 9 4.992e-05
-1 536 299 4.992e-05
-2 536 299 9 4.992e-05
-2 536 299 284 4.992e-05
-3 536 299 284 9 4.992e-05
-1 540 266 4.99969e-05
-2 540 266 61 4.99969e-05
-2 540 266 122 4.99969e-05
-3 540 266 122 61 4.99969e-05
-1 345 316 5.00749e-05
-2 345 316 313 5.00749e-05
-2 345 316 315 5.00749e-05
-3 345 316 315 313 5.00749e-05
-2 505 345 316 5.0077e-05
-3 505 345 316 315 5.0077e-05
-1 440 213 5.00882e-05
-2 440 213 69 5.00882e-05
-2 440 381 213 5.00882e-05
-3 440 381 213 69 5.00882e-05
-1 337 191 5.00904e-05
-2 337 191 190 5.00904e-05
-2 338 337 191 5.00904e-05
-3 338 337 191 190 5.00904e-05
-1 265 179 5.02736e-05
-2 265 179 20 5.02736e-05
-2 327 265 179 5.02736e-05
-3 327 265 179 20 5.02736e-05
-2 344 273 271 5.02979e-05
-3 377 344 273 271 5.02979e-05
-1 493 294 5.02999e-05
-1 493 295 5.02999e-05
-2 493 295 294 5.02999e-05
-2 493 297 294 5.02999e-05
-2 493 297 295 5.02999e-05
-3 493 297 295 294 5.02999e-05
-2 366 257 195 5.03794e-05
-3 366 257 197 195 5.03794e-05
-1 493 388 5.0422e-05
-2 493 388 294 5.0422e-05
-2 493 388 295 5.0422e-05
-3 493 388 295 294 5.0422e-05
-0 541 5.04554e-05
-1 541 227 5.04554e-05
-1 541 298 5.04554e-05
-2 541 298 227 5.04554e-05
-1 541 349 5.04554e-05
-2 541 349 227 5.04554e-05
-2 541 349 298 5.04554e-05
-3 541 349 298 227 5.04554e-05
-1 230 106 5.05941e-05
-2 230 229 106 5.05941e-05
-2 232 230 106 5.05941e-05
-3 232 230 229 106 5.05941e-05
-0 542 5.06061e-05
-1 542 232 5.06061e-05
-1 542 233 5.06061e-05
-2 542 233 232 5.06061e-05
-0 543 5.06061e-05
-1 543 232 5.06061e-05
-1 543 233 5.06061e-05
-2 543 233 232 5.06061e-05
-1 543 542 5.06061e-05
-2 543 542 232 5.06061e-05
-2 543 542 233 5.06061e-05
-3 543 542 233 232 5.06061e-05
-1 320 180 5.06633e-05
-1 400 180 5.06633e-05
-1 400 320 5.06633e-05
-2 400 320 180 5.06633e-05
-1 405 320 5.06633e-05
-2 405 320 180 5.06633e-05
-1 405 400 5.06633e-05
-2 405 400 180 5.06633e-05
-2 405 400 320 5.06633e-05
-3 405 400 320 180 5.06633e-05
-0 544 5.07187e-05
-1 544 476 5.07187e-05
-1 544 477 5.07187e-05
-2 544 477 476 5.07187e-05
-0 545 5.07187e-05
-1 545 476 5.07187e-05
-1 545 477 5.07187e-05
-2 545 477 476 5.07187e-05
-1 545 544 5.07187e-05
-2 545 544 476 5.07187e-05
-2 545 544 477 5.07187e-05
-3 545 544 477 476 5.07187e-05
-1 227 168 5.07224e-05
-1 227 169 5.07224e-05
-2 227 169 168 5.07224e-05
-1 349 168 5.07224e-05
-2 349 169 168 5.07224e-05
-2 349 227 168 5.07224e-05
-2 349 227 169 5.07224e-05
-3 349 227 169 168 5.07224e-05
-1 458 174 5.07604e-05
-2 458 174 73 5.07604e-05
-2 458 310 174 5.07604e-05
-3 458 310 174 73 5.07604e-05
-1 180 84 5.07605e-05
-2 320 180 84 5.07605e-05
-2 400 180 84 5.07605e-05
-2 400 320 84 5.07605e-05
-3 400 320 180 84 5.07605e-05
-1 461 458 5.07624e-05
-2 461 458 174 5.07624e-05
-2 461 458 310 5.07624e-05
-3 461 458 310 174 5.07624e-05
-1 323 300 5.08036e-05
-1 324 300 5.08036e-05
-2 324 323 300 5.08036e-05
-0 546 5.08036e-05
-1 546 300 5.08036e-05
-1 546 323 5.08036e-05
-2 546 323 300 5.08036e-05
-1 546 324 5.08036e-05
-2 546 324 300 5.08036e-05
-2 546 324 323 5.08036e-05
-3 546 324 323 300 5.08036e-05
-1 329 168 5.08205e-05
-1 329 171 5.08205e-05
-2 329 171 168 5.08205e-05
-1 432 329 5.08205e-05
-2 432 329 168 5.08205e-05
-2 432 329 171 5.08205e-05
-3 432 329 171 168 5.08205e-05
-1 544 283 5.08278e-05
-2 544 476 283 5.08278e-05
-2 544 477 283 5.08278e-05
-3 544 477 476 283 5.08278e-05
-0 547 5.08378e-05
-1 547 481 5.08378e-05
-1 547 482 5.08378e-05
-2 547 482 481 5.08378e-05
-1 547 483 5.08378e-05
-2 547 483 481 5.08378e-05
-2 547 483 482 5.08378e-05
-3 547 483 482 481 5.08378e-05
-1 365 121 5.0912e-05
-1 365 256 5.0912e-05
-2 365 256 121 5.0912e-05
-2 365 257 121 5.0912e-05
-2 365 257 256 5.0912e-05
-3 365 257 256 121 5.0912e-05
-2 440 102 69 5.1064e-05
-2 440 309 69 5.1064e-05
-3 440 309 102 69 5.1064e-05
-1 233 230 5.1124e-05
-2 233 232 230 5.1124e-05
-1 543 230 5.1124e-05
-2 543 232 230 5.1124e-05
-2 543 233 230 5.1124e-05
-3 543 233 232 230 5.1124e-05
-0 548 5.11808e-05
-0 549 5.11808e-05
-1 549 548 5.11808e-05
-0 550 5.11808e-05
-1 550 548 5.11808e-05
-1 550 549 5.11808e-05
-2 550 549 548 5.11808e-05
-0 551 5.11808e-05
-1 551 548 5.11808e-05
-1 551 549 5.11808e-05
-2 551 549 548 5.11808e-05
-1 551 550 5.11808e-05
-2 551 550 548 5.11808e-05
-2 551 550 549 5.11808e-05
-3 551 550 549 548 5.11808e-05
-1 216 188 5.1201e-05
-2 216 188 133 5.1201e-05
-2 268 216 188 5.1201e-05
-3 268 216 188 133 5.1201e-05
-1 413 368 5.13108e-05
-2 413 412 368 5.13108e-05
-1 470 412 5.13108e-05
-2 470 412 368 5.13108e-05
-1 470 413 5.13108e-05
-2 470 413 368 5.13108e-05
-2 470 413 412 5.13108e-05
-3 470 413 412 368 5.13108e-05
-0 552 5.13338e-05
-1 552 167 5.13338e-05
-1 552 259 5.13338e-05
-2 552 259 167 5.13338e-05
-1 552 461 5.13338e-05
-2 552 461 167 5.13338e-05
-2 552 461 259 5.13338e-05
-3 552 461 259 167 5.13338e-05
-0 553 5.13523e-05
-1 553 438 5.13523e-05
-1 553 439 5.13523e-05
-2 553 439 438 5.13523e-05
-0 554 5.13523e-05
-1 554 438 5.13523e-05
-1 554 439 5.13523e-05
-2 554 439 438 5.13523e-05
-1 554 553 5.13523e-05
-2 554 553 438 5.13523e-05
-2 554 553 439 5.13523e-05
-3 554 553 439 438 5.13523e-05
-1 424 247 5.14006e-05
-0 555 5.14006e-05
-1 555 247 5.14006e-05
-1 555 424 5.14006e-05
-2 555 424 247 5.14006e-05
-0 556 5.14006e-05
-1 556 247 5.14006e-05
-1 556 424 5.14006e-05
-2 556 424 247 5.14006e-05
-1 556 555 5.14006e-05
-2 556 555 247 5.14006e-05
-2 556 555 424 5.14006e-05
-3 556 555 424 247 5.14006e-05
-1 493 387 5.14035e-05
-2 493 388 387 5.14035e-05
-0 557 5.14035e-05
-1 557 387 5.14035e-05
-1 557 388 5.14035e-05
-2 557 388 387 5.14035e-05
-1 557 493 5.14035e-05
-2 557 493 387 5.14035e-05
-2 557 493 388 5.14035e-05
-3 557 493 388 387 5.14035e-05
-0 558 5.14329e-05
-1 558 168 5.14329e-05
-1 558 432 5.14329e-05
-2 558 432 168 5.14329e-05
-1 558 494 5.14329e-05
-2 558 494 168 5.14329e-05
-2 558 494 432 5.14329e-05
-3 558 494 432 168 5.14329e-05
-0 559 5.14544e-05
-1 559 511 5.14544e-05
-0 560 5.14544e-05
-1 560 511 5.14544e-05
-1 560 559 5.14544e-05
-2 560 559 511 5.14544e-05
-0 561 5.14544e-05
-1 561 511 5.14544e-05
-1 561 559 5.14544e-05
-2 561 559 511 5.14544e-05
-1 561 560 5.14544e-05
-2 561 560 511 5.14544e-05
-2 561 560 559 5.14544e-05
-3 561 560 559 511 5.14544e-05
-1 463 442 5.14724e-05
-1 464 442 5.14724e-05
-2 464 463 442 5.14724e-05
-1 465 442 5.14724e-05
-2 465 463 442 5.14724e-05
-2 465 464 442 5.14724e-05
-3 465 464 463 442 5.14724e-05
-1 386 23 5.14802e-05
-2 386 97 23 5.14802e-05
-2 390 386 23 5.14802e-05
-2 390 386 97 5.14802e-05
-3 390 386 97 23 5.14802e-05
-0 562 5.14835e-05
-1 562 337 5.14835e-05
-1 562 342 5.14835e-05
-2 562 342 337 5.14835e-05
-0 563 5.14835e-05
-1 563 337 5.14835e-05
-1 563 342 5.14835e-05
-2 563 342 337 5.14835e-05
-1 563 562 5.14835e-05
-2 563 562 337 5.14835e-05
-2 563 562 342 5.14835e-05
-3 563 562 342 337 5.14835e-05
-1 267 172 5.1531e-05
-2 267 172 123 5.1531e-05
-2 267 172 132 5.1531e-05
-3 267 172 132 123 5.1531e-05
-0 564 5.15498e-05
-1 564 106 5.15498e-05
-1 564 229 5.15498e-05
-2 564 229 106 5.15498e-05
-1 564 230 5.15498e-05
-2 564 230 106 5.15498e-05
-2 564 230 229 5.15498e-05
-3 564 230 229 106 5.15498e-05
-0 565 5.162e-05
-1 565 164 5.162e-05
-1 565 269 5.162e-05
-2 565 269 164 5.162e-05
-0 566 5.162e-05
-1 566 164 5.162e-05
-1 566 269 5.162e-05
-2 566 269 164 5.162e-05
-1 566 565 5.162e-05
-2 566 565 164 5.162e-05
-2 566 565 269 5.162e-05
-3 566 565 269 164 5.162e-05
-1 367 141 5.16439e-05
-1 368 141 5.16439e-05
-2 368 367 141 5.16439e-05
-1 469 141 5.16439e-05
-2 469 367 141 5.16439e-05
-2 469 368 141 5.16439e-05
-3 469 368 367 141 5.16439e-05
-1 519 168 5.16459e-05
-2 519 170 168 5.16459e-05
-2 519 351 168 5.16459e-05
-3 519 351 170 168 5.16459e-05
-1 306 267 5.16937e-05
-2 306 267 123 5.16937e-05
-1 312 267 5.16937e-05
-2 312 267 123 5.16937e-05
-2 312 306 267 5.16937e-05
-3 312 306 267 123 5.16937e-05
-1 519 350 5.17377e-05
-2 519 350 168 5.17377e-05
-2 519 351 350 5.17377e-05
-3 519 351 350 168 5.17377e-05
-1 552 164 5.17791e-05
-2 552 167 164 5.17791e-05
-1 552 252 5.17791e-05
-2 552 252 164 5.17791e-05
-2 552 252 167 5.17791e-05
-3 552 252 167 164 5.17791e-05
-1 158 90 5.17931e-05
-2 158 91 90 5.17931e-05
-2 158 92 90 5.17931e-05
-3 158 92 91 90 5.17931e-05
-1 402 257 5.18459e-05
-2 402 257 195 5.18459e-05
-2 402 366 257 5.18459e-05
-3 402 366 257 195 5.18459e-05
-1 401 58 5.19774e-05
-2 401 58 57 5.19774e-05
-2 401 84 58 5.19774e-05
-3 401 84 58 57 5.19774e-05
-1 369 65 5.20168e-05
-2 369 65 64 5.20168e-05
-2 369 67 65 5.20168e-05
-3 369 67 65 64 5.20168e-05
-1 400 33 5.22149e-05
-2 400 57 33 5.22149e-05
-2 400 84 33 5.22149e-05
-3 400 84 57 33 5.22149e-05
-1 387 296 5.22478e-05
-2 387 296 295 5.22478e-05
-2 387 344 296 5.22478e-05
-3 387 344 296 295 5.22478e-05
-1 388 68 5.22955e-05
-2 388 245 68 5.22955e-05
-2 404 388 68 5.22955e-05
-3 404 388 245 68 5.22955e-05
-1 253 133 5.2348e-05
-2 253 134 133 5.2348e-05
-1 253 188 5.2348e-05
-2 253 188 133 5.2348e-05
-2 253 188 134 5.2348e-05
-3 253 188 134 133 5.2348e-05
-1 309 100 5.23673e-05
-2 309 100 71 5.23673e-05
-2 309 101 100 5.23673e-05
-3 309 101 100 71 5.23673e-05
-1 505 168 5.23856e-05
-1 505 170 5.23856e-05
-2 505 170 168 5.23856e-05
-1 505 171 5.23856e-05
-2 505 171 168 5.23856e-05
-2 505 171 170 5.23856e-05
-3 505 171 170 168 5.23856e-05
-0 567 5.24158e-05
-1 567 471 5.24158e-05
-1 567 472 5.24158e-05
-2 567 472 471 5.24158e-05
-0 568 5.24158e-05
-1 568 471 5.24158e-05
-1 568 472 5.24158e-05
-2 568 472 471 5.24158e-05
-1 568 567 5.24158e-05
-2 568 567 471 5.24158e-05
-2 568 567 472 5.24158e-05
-3 568 567 472 471 5.24158e-05
-1 476 282 5.24402e-05
-2 476 283 282 5.24402e-05
-2 476 284 282 5.24402e-05
-3 476 284 283 282 5.24402e-05
-0 569 5.2489e-05
-1 569 220 5.2489e-05
-1 569 478 5.2489e-05
-2 569 478 220 5.2489e-05
-1 569 479 5.2489e-05
-2 569 479 220 5.2489e-05
-2 569 479 478 5.2489e-05
-3 569 479 478 220 5.2489e-05
-1 557 344 5.259e-05
-2 557 387 344 5.259e-05
-1 557 413 5.259e-05
-2 557 413 344 5.259e-05
-2 557 413 387 5.259e-05
-3 557 413 387 344 5.259e-05
-1 131 25 5.26275e-05
-1 162 131 5.26275e-05
-2 162 131 25 5.26275e-05
-1 459 131 5.26275e-05
-2 459 131 25 5.26275e-05
-2 459 162 131 5.26275e-05
-3 459 162 131 25 5.26275e-05
-2 493 387 295 5.2675e-05
-3 493 388 387 295 5.2675e-05
-0 570 5.26781e-05
-1 570 16 5.26781e-05
-1 570 18 5.26781e-05
-2 570 18 16 5.26781e-05
-0 571 5.26781e-05
-1 571 16 5.26781e-05
-1 571 18 5.26781e-05
-2 571 18 16 5.26781e-05
-1 571 570 5.26781e-05
-2 571 570 16 5.26781e-05
-2 571 570 18 5.26781e-05
-3 571 570 18 16 5.26781e-05
-1 315 171 5.27397e-05
-2 505 315 171 5.27397e-05
-1 506 171 5.27397e-05
-2 506 315 171 5.27397e-05
-2 506 505 171 5.27397e-05
-3 506 505 315 171 5.27397e-05
-2 552 259 164 5.28362e-05
-3 552 259 167 164 5.28362e-05
-0 572 5.28594e-05
-1 572 417 5.28594e-05
-0 573 5.28594e-05
-1 573 417 5.28594e-05
-1 573 572 5.28594e-05
-2 573 572 417 5.28594e-05
-0 574 5.28594e-05
-1 574 417 5.28594e-05
-1 574 572 5.28594e-05
-2 574 572 417 5.28594e-05
-1 574 573 5.28594e-05
-2 574 573 417 5.28594e-05
-2 574 573 572 5.28594e-05
-3 574 573 572 417 5.28594e-05
-2 233 230 106 5.28732e-05
-3 233 232 230 106 5.28732e-05
-1 131 40 5.28881e-05
-2 162 131 40 5.28881e-05
-2 459 131 40 5.28881e-05
-3 459 162 131 40 5.28881e-05
-0 575 5.29239e-05
-1 575 409 5.29239e-05
-0 576 5.29239e-05
-1 576 409 5.29239e-05
-1 576 575 5.29239e-05
-2 576 575 409 5.29239e-05
-0 577 5.29239e-05
-1 577 409 5.29239e-05
-1 577 575 5.29239e-05
-2 577 575 409 5.29239e-05
-1 577 576 5.29239e-05
-2 577 576 409 5.29239e-05
-2 577 576 575 5.29239e-05
-3 577 576 575 409 5.29239e-05
-1 391 271 5.29286e-05
-1 391 274 5.29286e-05
-2 391 274 271 5.29286e-05
-1 391 275 5.29286e-05
-2 391 275 271 5.29286e-05
-2 391 275 274 5.29286e-05
-3 391 275 274 271 5.29286e-05
-2 306 267 172 5.29364e-05
-3 306 267 172 123 5.29364e-05
-2 386 98 23 5.30801e-05
-3 390 386 98 23 5.30801e-05
-2 493 296 295 5.31345e-05
-3 493 297 296 295 5.31345e-05
-0 578 5.32265e-05
-1 578 194 5.32265e-05
-1 578 402 5.32265e-05
-2 578 402 194 5.32265e-05
-1 578 403 5.32265e-05
-2 578 403 194 5.32265e-05
-2 578 403 402 5.32265e-05
-3 578 403 402 194 5.32265e-05
-0 579 5.32315e-05
-1 579 263 5.32315e-05
-1 579 335 5.32315e-05
-2 579 335 263 5.32315e-05
-1 579 336 5.32315e-05
-2 579 336 263 5.32315e-05
-2 579 336 335 5.32315e-05
-3 579 336 335 263 5.32315e-05
-2 329 315 171 5.32817e-05
-2 505 329 171 5.32817e-05
-3 505 329 315 171 5.32817e-05
-1 466 179 5.33269e-05
-1 466 327 5.33269e-05
-2 466 327 179 5.33269e-05
-1 468 179 5.33269e-05
-1 468 327 5.33269e-05
-2 468 327 179 5.33269e-05
-2 468 466 179 5.33269e-05
-2 468 466 327 5.33269e-05
-3 468 466 327 179 5.33269e-05
-1 379 181 5.33746e-05
-2 379 181 180 5.33746e-05
-2 379 182 181 5.33746e-05
-3 379 182 181 180 5.33746e-05
-1 536 11 5.35231e-05
-2 536 11 9 5.35231e-05
-2 536 220 11 5.35231e-05
-3 536 220 11 9 5.35231e-05
-0 580 5.36533e-05
-1 580 79 5.36533e-05
-0 581 5.36533e-05
-1 581 79 5.36533e-05
-1 581 580 5.36533e-05
-2 581 580 79 5.36533e-05
-0 582 5.36533e-05
-1 582 79 5.36533e-05
-1 582 580 5.36533e-05
-2 582 580 79 5.36533e-05
-1 582 581 5.36533e-05
-2 582 581 79 5.36533e-05
-2 582 581 580 5.36533e-05
-3 582 581 580 79 5.36533e-05
-0 583 5.37334e-05
-1 583 232 5.37334e-05
-1 583 233 5.37334e-05
-2 583 233 232 5.37334e-05
-1 583 542 5.37334e-05
-2 583 542 232 5.37334e-05
-2 583 542 233 5.37334e-05
-3 583 542 233 232 5.37334e-05
-0 584 5.38102e-05
-1 584 417 5.38102e-05
-1 584 573 5.38102e-05
-2 584 573 417 5.38102e-05
-0 585 5.38102e-05
-1 585 417 5.38102e-05
-1 585 573 5.38102e-05
-2 585 573 417 5.38102e-05
-1 585 584 5.38102e-05
-2 585 584 417 5.38102e-05
-2 585 584 573 5.38102e-05
-3 585 584 573 417 5.38102e-05
-0 586 5.38329e-05
-1 586 405 5.38329e-05
-0 587 5.38329e-05
-1 587 405 5.38329e-05
-1 587 586 5.38329e-05
-2 587 586 405 5.38329e-05
-0 588 5.38329e-05
-1 588 405 5.38329e-05
-1 588 586 5.38329e-05
-2 588 586 405 5.38329e-05
-1 588 587 5.38329e-05
-2 588 587 405 5.38329e-05
-2 588 587 586 5.38329e-05
-3 588 587 586 405 5.38329e-05
-0 589 5.3854e-05
-0 590 5.3854e-05
-1 590 589 5.3854e-05
-0 591 5.3854e-05
-1 591 589 5.3854e-05
-1 591 590 5.3854e-05
-2 591 590 589 5.3854e-05
-0 592 5.3854e-05
-1 592 589 5.3854e-05
-1 592 590 5.3854e-05
-2 592 590 589 5.3854e-05
-1 592 591 5.3854e-05
-2 592 591 589 5.3854e-05
-2 592 591 590 5.3854e-05
-3 592 591 590 589 5.3854e-05
-1 559 450 5.38553e-05
-1 560 450 5.38553e-05
-2 560 559 450 5.38553e-05
-0 593 5.38553e-05
-1 593 450 5.38553e-05
-1 593 559 5.38553e-05
-2 593 559 450 5.38553e-05
-1 593 560 5.38553e-05
-2 593 560 450 5.38553e-05
-2 593 560 559 5.38553e-05
-3 593 560 559 450 5.38553e-05
-2 398 369 65 5.39019e-05
-3 398 369 65 64 5.39019e-05
-1 284 11 5.40659e-05
-2 284 11 9 5.40659e-05
-2 299 284 11 5.40659e-05
-3 299 284 11 9 5.40659e-05
-1 129 25 5.41282e-05
-2 131 129 25 5.41282e-05
-1 459 129 5.41282e-05
-2 459 129 25 5.41282e-05
-2 459 131 129 5.41282e-05
-3 459 131 129 25 5.41282e-05
-1 568 462 5.41362e-05
-0 594 5.41362e-05
-1 594 462 5.41362e-05
-1 594 568 5.41362e-05
-2 594 568 462 5.41362e-05
-0 595 5.41362e-05
-1 595 462 5.41362e-05
-1 595 568 5.41362e-05
-2 595 568 462 5.41362e-05
-1 595 594 5.41362e-05
-2 595 594 462 5.41362e-05
-2 595 594 568 5.41362e-05
-3 595 594 568 462 5.41362e-05
-1 372 66 5.41755e-05
-1 372 67 5.41755e-05
-2 372 67 66 5.41755e-05
-1 372 353 5.41755e-05
-2 372 353 66 5.41755e-05
-2 372 353 67 5.41755e-05
-3 372 353 67 66 5.41755e-05
-1 162 37 5.41905e-05
-2 162 37 34 5.41905e-05
-2 162 37 36 5.41905e-05
-3 162 37 36 34 5.41905e-05
-0 596 5.4195e-05
-1 596 11 5.4195e-05
-1 596 220 5.4195e-05
-2 596 220 11 5.4195e-05
-1 596 536 5.4195e-05
-2 596 536 11 5.4195e-05
-2 596 536 220 5.4195e-05
-3 596 536 220 11 5.4195e-05
-1 285 122 5.42759e-05
-2 285 266 122 5.42759e-05
-1 540 285 5.42759e-05
-2 540 285 122 5.42759e-05
-2 540 285 266 5.42759e-05
-3 540 285 266 122 5.42759e-05
-0 597 5.43817e-05
-1 597 447 5.43817e-05
-1 597 449 5.43817e-05
-2 597 449 447 5.43817e-05
-0 598 5.43817e-05
-1 598 447 5.43817e-05
-1 598 449 5.43817e-05
-2 598 449 447 5.43817e-05
-1 598 597 5.43817e-05
-2 598 597 447 5.43817e-05
-2 598 597 449 5.43817e-05
-3 598 597 449 447 5.43817e-05
-2 309 245 100 5.44001e-05
-3 309 245 100 71 5.44001e-05
-2 406 365 121 5.44266e-05
-3 406 365 257 121 5.44266e-05
-1 592 143 5.44648e-05
-1 592 144 5.44648e-05
-2 592 144 143 5.44648e-05
-0 599 5.44648e-05
-1 599 143 5.44648e-05
-1 599 144 5.44648e-05
-2 599 144 143 5.44648e-05
-1 599 592 5.44648e-05
-2 599 592 143 5.44648e-05
-2 599 592 144 5.44648e-05
-3 599 592 144 143 5.44648e-05
-1 572 414 5.45472e-05
-1 572 416 5.45472e-05
-2 572 416 414 5.45472e-05
-2 572 417 414 5.45472e-05
-2 572 417 416 5.45472e-05
-3 572 417 416 414 5.45472e-05
-0 600 5.45801e-05
-1 600 462 5.45801e-05
-1 600 594 5.45801e-05
-2 600 594 462 5.45801e-05
-1 600 595 5.45801e-05
-2 600 595 462 5.45801e-05
-2 600 595 594 5.45801e-05
-3 600 595 594 462 5.45801e-05
-1 406 118 5.46458e-05
-2 406 121 118 5.46458e-05
-2 406 156 118 5.46458e-05
-3 406 156 121 118 5.46458e-05
-0 601 5.46595e-05
-1 601 18 5.46595e-05
-1 601 571 5.46595e-05
-2 601 571 18 5.46595e-05
-0 602 5.46595e-05
-1 602 18 5.46595e-05
-1 602 571 5.46595e-05
-2 602 571 18 5.46595e-05
-1 602 601 5.46595e-05
-2 602 601 18 5.46595e-05
-2 602 601 571 5.46595e-05
-3 602 601 571 18 5.46595e-05
-2 402 195 194 5.47246e-05
-3 402 196 195 194 5.47246e-05
-1 213 99 5.4753e-05
-1 381 99 5.4753e-05
-2 381 213 99 5.4753e-05
-2 440 213 99 5.4753e-05
-2 440 381 99 5.4753e-05
-3 440 381 213 99 5.4753e-05
-0 603 5.48007e-05
-1 603 363 5.48007e-05
-0 604 5.48007e-05
-1 604 363 5.48007e-05
-1 604 603 5.48007e-05
-2 604 603 363 5.48007e-05
-0 605 5.48007e-05
-1 605 363 5.48007e-05
-1 605 603 5.48007e-05
-2 605 603 363 5.48007e-05
-1 605 604 5.48007e-05
-2 605 604 363 5.48007e-05
-2 605 604 603 5.48007e-05
-3 605 604 603 363 5.48007e-05
-1 285 132 5.48427e-05
-2 285 132 122 5.48427e-05
-2 285 266 132 5.48427e-05
-3 285 266 132 122 5.48427e-05
-2 350 349 168 5.48535e-05
-3 350 349 169 168 5.48535e-05
-1 539 136 5.49341e-05
-1 539 434 5.49341e-05
-2 539 434 136 5.49341e-05
-0 606 5.49341e-05
-1 606 136 5.49341e-05
-1 606 434 5.49341e-05
-2 606 434 136 5.49341e-05
-1 606 539 5.49341e-05
-2 606 539 136 5.49341e-05
-2 606 539 434 5.49341e-05
-3 606 539 434 136 5.49341e-05
-0 607 5.49978e-05
-0 608 5.49978e-05
-1 608 607 5.49978e-05
-0 609 5.49978e-05
-1 609 607 5.49978e-05
-1 609 608 5.49978e-05
-2 609 608 607 5.49978e-05
-0 610 5.49978e-05
-1 610 607 5.49978e-05
-1 610 608 5.49978e-05
-2 610 608 607 5.49978e-05
-1 610 609 5.49978e-05
-2 610 609 607 5.49978e-05
-2 610 609 608 5.49978e-05
-3 610 609 608 607 5.49978e-05
-0 611 5.50717e-05
-1 611 409 5.50717e-05
-1 611 575 5.50717e-05
-2 611 575 409 5.50717e-05
-0 612 5.50717e-05
-1 612 409 5.50717e-05
-1 612 575 5.50717e-05
-2 612 575 409 5.50717e-05
-1 612 611 5.50717e-05
-2 612 611 409 5.50717e-05
-2 612 611 575 5.50717e-05
-3 612 611 575 409 5.50717e-05
-1 306 132 5.50718e-05
-2 306 172 132 5.50718e-05
-2 306 267 132 5.50718e-05
-3 306 267 172 132 5.50718e-05
-0 613 5.50982e-05
-0 614 5.50982e-05
-1 614 613 5.50982e-05
-0 615 5.50982e-05
-1 615 613 5.50982e-05
-1 615 614 5.50982e-05
-2 615 614 613 5.50982e-05
-0 616 5.50982e-05
-1 616 613 5.50982e-05
-1 616 614 5.50982e-05
-2 616 614 613 5.50982e-05
-1 616 615 5.50982e-05
-2 616 615 613 5.50982e-05
-2 616 615 614 5.50982e-05
-3 616 615 614 613 5.50982e-05
-0 617 5.5104e-05
-1 617 48 5.5104e-05
-0 618 5.5104e-05
-1 618 48 5.5104e-05
-1 618 617 5.5104e-05
-2 618 617 48 5.5104e-05
-0 619 5.5104e-05
-1 619 48 5.5104e-05
-1 619 617 5.5104e-05
-2 619 617 48 5.5104e-05
-1 619 618 5.5104e-05
-2 619 618 48 5.5104e-05
-2 619 618 617 5.5104e-05
-3 619 618 617 48 5.5104e-05
-1 539 397 5.51905e-05
-1 606 397 5.51905e-05
-2 606 539 397 5.51905e-05
-0 620 5.51905e-05
-1 620 397 5.51905e-05
-1 620 539 5.51905e-05
-2 620 539 397 5.51905e-05
-1 620 606 5.51905e-05
-2 620 606 397 5.51905e-05
-2 620 606 539 5.51905e-05
-3 620 606 539 397 5.51905e-05
-2 440 309 213 5.51944e-05
-3 440 309 213 69 5.51944e-05
-1 312 82 5.51956e-05
-2 312 82 80 5.51956e-05
-2 312 113 82 5.51956e-05
-3 312 113 82 80 5.51956e-05
-1 495 350 5.52111e-05
-2 495 350 168 5.52111e-05
-1 519 495 5.52111e-05
-2 519 495 168 5.52111e-05
-2 519 495 350 5.52111e-05
-3 519 495 350 168 5.52111e-05
-1 175 164 5.5219e-05
-1 259 175 5.5219e-05
-2 259 175 164 5.5219e-05
-1 566 175 5.5219e-05
-2 566 175 164 5.5219e-05
-1 566 259 5.5219e-05
-2 566 259 164 5.5219e-05
-2 566 259 175 5.5219e-05
-3 566 259 175 164 5.5219e-05
-1 519 328 5.53298e-05
-1 519 345 5.53298e-05
-2 519 345 328 5.53298e-05
-1 519 505 5.53298e-05
-2 519 505 328 5.53298e-05
-2 519 505 345 5.53298e-05
-3 519 505 345 328 5.53298e-05
-1 281 11 5.53621e-05
-2 284 281 11 5.53621e-05
-2 299 281 11 5.53621e-05
-3 299 284 281 11 5.53621e-05
-0 621 5.5431e-05
-1 621 420 5.5431e-05
-0 622 5.5431e-05
-1 622 420 5.5431e-05
-1 622 621 5.5431e-05
-2 622 621 420 5.5431e-05
-0 623 5.5431e-05
-1 623 420 5.5431e-05
-1 623 621 5.5431e-05
-2 623 621 420 5.5431e-05
-1 623 622 5.5431e-05
-2 623 622 420 5.5431e-05
-2 623 622 621 5.5431e-05
-3 623 622 621 420 5.5431e-05
-1 557 296 5.56237e-05
-2 557 344 296 5.56237e-05
-2 557 387 296 5.56237e-05
-3 557 387 344 296 5.56237e-05
-1 468 265 5.56584e-05
-2 468 265 179 5.56584e-05
-2 468 327 265 5.56584e-05
-3 468 327 265 179 5.56584e-05
-1 536 281 5.56771e-05
-2 536 281 11 5.56771e-05
-1 596 281 5.56771e-05
-2 596 281 11 5.56771e-05
-2 596 536 281 5.56771e-05
-3 596 536 281 11 5.56771e-05
-1 232 108 5.57589e-05
-2 232 108 106 5.57589e-05
-2 234 232 108 5.57589e-05
-3 234 232 108 106 5.57589e-05
-1 306 287 5.57988e-05
-2 306 287 267 5.57988e-05
-1 312 287 5.57988e-05
-2 312 287 267 5.57988e-05
-2 312 306 287 5.57988e-05
-3 312 306 287 267 5.57988e-05
-0 624 5.58178e-05
-1 624 26 5.58178e-05
-1 624 28 5.58178e-05
-2 624 28 26 5.58178e-05
-1 624 418 5.58178e-05
-2 624 418 26 5.58178e-05
-2 624 418 28 5.58178e-05
-3 624 418 28 26 5.58178e-05
-2 536 284 11 5.58418e-05
-3 536 284 11 9 5.58418e-05
-1 467 327 5.59653e-05
-2 467 466 327 5.59653e-05
-2 468 467 327 5.59653e-05
-3 468 467 466 327 5.59653e-05
-1 596 219 5.60987e-05
-2 596 220 219 5.60987e-05
-2 596 536 219 5.60987e-05
-3 596 536 220 219 5.60987e-05
-1 596 479 5.61385e-05
-2 596 479 219 5.61385e-05
-2 596 479 220 5.61385e-05
-3 596 479 220 219 5.61385e-05
-0 625 5.63049e-05
-1 625 414 5.63049e-05
-1 625 415 5.63049e-05
-2 625 415 414 5.63049e-05
-0 626 5.63049e-05
-1 626 414 5.63049e-05
-1 626 415 5.63049e-05
-2 626 415 414 5.63049e-05
-1 626 625 5.63049e-05
-2 626 625 414 5.63049e-05
-2 626 625 415 5.63049e-05
-3 626 625 415 414 5.63049e-05
-1 363 359 5.63217e-05
-2 363 359 358 5.63217e-05
-1 604 358 5.63217e-05
-1 604 359 5.63217e-05
-2 604 359 358 5.63217e-05
-2 604 363 358 5.63217e-05
-2 604 363 359 5.63217e-05
-3 604 363 359 358 5.63217e-05
-1 459 128 5.63224e-05
-2 459 129 128 5.63224e-05
-2 459 131 128 5.63224e-05
-3 459 131 129 128 5.63224e-05
-2 536 284 281 5.63953e-05
-3 536 284 281 11 5.63953e-05
-1 596 478 5.64319e-05
-1 596 569 5.64319e-05
-2 596 569 478 5.64319e-05
-0 627 5.64319e-05
-1 627 478 5.64319e-05
-1 627 569 5.64319e-05
-2 627 569 478 5.64319e-05
-1 627 596 5.64319e-05
-2 627 596 478 5.64319e-05
-2 627 596 569 5.64319e-05
-3 627 596 569 478 5.64319e-05
-0 628 5.64991e-05
-1 628 304 5.64991e-05
-1 628 305 5.64991e-05
-2 628 305 304 5.64991e-05
-1 628 504 5.64991e-05
-2 628 504 304 5.64991e-05
-2 628 504 305 5.64991e-05
-3 628 504 305 304 5.64991e-05
-1 600 568 5.65403e-05
-2 600 568 462 5.65403e-05
-2 600 594 568 5.65403e-05
-3 600 594 568 462 5.65403e-05
-1 335 260 5.67692e-05
-2 335 261 260 5.67692e-05
-2 335 263 260 5.67692e-05
-3 335 263 261 260 5.67692e-05
-2 596 478 220 5.67817e-05
-2 596 569 220 5.67817e-05
-3 596 569 478 220 5.67817e-05
-1 305 215 5.68564e-05
-1 460 305 5.68564e-05
-2 460 305 215 5.68564e-05
-1 628 215 5.68564e-05
-2 628 305 215 5.68564e-05
-1 628 460 5.68564e-05
-2 628 460 215 5.68564e-05
-2 628 460 305 5.68564e-05
-3 628 460 305 215 5.68564e-05
-1 536 479 5.69103e-05
-2 536 479 219 5.69103e-05
-2 596 536 479 5.69103e-05
-3 596 536 479 219 5.69103e-05
-1 406 366 5.69505e-05
-2 406 366 197 5.69505e-05
-2 406 366 365 5.69505e-05
-3 406 366 365 197 5.69505e-05
-0 629 5.69708e-05
-1 629 129 5.69708e-05
-1 629 130 5.69708e-05
-2 629 130 129 5.69708e-05
-0 630 5.69708e-05
-1 630 129 5.69708e-05
-1 630 130 5.69708e-05
-2 630 130 129 5.69708e-05
-1 630 629 5.69708e-05
-2 630 629 129 5.69708e-05
-2 630 629 130 5.69708e-05
-3 630 629 130 129 5.69708e-05
-1 117 102 5.73243e-05
-2 117 102 69 5.73243e-05
-2 440 117 102 5.73243e-05
-3 440 117 102 69 5.73243e-05
-1 412 316 5.74608e-05
-2 412 316 313 5.74608e-05
-2 412 345 316 5.74608e-05
-3 412 345 316 313 5.74608e-05
-1 311 155 5.75281e-05
-2 311 155 154 5.75281e-05
-2 311 189 155 5.75281e-05
-3 311 189 155 154 5.75281e-05
-1 309 257 5.75922e-05
-1 365 309 5.75922e-05
-2 365 309 257 5.75922e-05
-1 366 309 5.75922e-05
-2 366 309 257 5.75922e-05
-2 366 365 309 5.75922e-05
-3 366 365 309 257 5.75922e-05
-1 487 355 5.76147e-05
-1 487 392 5.76147e-05
-2 487 392 355 5.76147e-05
-0 631 5.76147e-05
-1 631 355 5.76147e-05
-1 631 392 5.76147e-05
-2 631 392 355 5.76147e-05
-1 631 487 5.76147e-05
-2 631 487 355 5.76147e-05
-2 631 487 392 5.76147e-05
-3 631 487 392 355 5.76147e-05
-1 402 309 5.77897e-05
-2 402 309 257 5.77897e-05
-2 402 366 309 5.77897e-05
-3 402 366 309 257 5.77897e-05
-2 596 569 479 5.78036e-05
-3 596 569 479 220 5.78036e-05
-0 632 5.78936e-05
-1 632 198 5.78936e-05
-1 632 199 5.78936e-05
-2 632 199 198 5.78936e-05
-0 633 5.78936e-05
-1 633 198 5.78936e-05
-1 633 199 5.78936e-05
-2 633 199 198 5.78936e-05
-1 633 632 5.78936e-05
-2 633 632 198 5.78936e-05
-2 633 632 199 5.78936e-05
-3 633 632 199 198 5.78936e-05
-2 309 100 99 5.79165e-05
-3 309 101 100 99 5.79165e-05
-2 306 287 132 5.79579e-05
-3 306 287 267 132 5.79579e-05
-1 191 49 5.80637e-05
-2 191 50 49 5.80637e-05
-2 191 51 49 5.80637e-05
-3 191 51 50 49 5.80637e-05
-1 475 49 5.80736e-05
-2 475 51 49 5.80736e-05
-2 475 191 49 5.80736e-05
-3 475 191 51 49 5.80736e-05
-1 385 22 5.81254e-05
-2 385 97 22 5.81254e-05
-2 385 116 22 5.81254e-05
-3 385 116 97 22 5.81254e-05
-1 614 563 5.81466e-05
-1 615 563 5.81466e-05
-2 615 614 563 5.81466e-05
-0 634 5.81466e-05
-1 634 563 5.81466e-05
-1 634 614 5.81466e-05
-2 634 614 563 5.81466e-05
-1 634 615 5.81466e-05
-2 634 615 563 5.81466e-05
-2 634 615 614 5.81466e-05
-3 634 615 614 563 5.81466e-05
-1 558 431 5.81773e-05
-2 558 431 168 5.81773e-05
-2 558 432 431 5.81773e-05
-3 558 432 431 168 5.81773e-05
-0 635 5.81857e-05
-1 635 479 5.81857e-05
-1 635 536 5.81857e-05
-2 635 536 479 5.81857e-05
-1 635 596 5.81857e-05
-2 635 596 479 5.81857e-05
-2 635 596 536 5.81857e-05
-3 635 596 536 479 5.81857e-05
-0 636 5.81974e-05
-1 636 348 5.81974e-05
-1 636 467 5.81974e-05
-2 636 467 348 5.81974e-05
-1 636 468 5.81974e-05
-2 636 468 348 5.81974e-05
-2 636 468 467 5.81974e-05
-3 636 468 467 348 5.81974e-05
-0 637 5.82404e-05
-1 637 143 5.82404e-05
-1 637 144 5.82404e-05
-2 637 144 143 5.82404e-05
-1 637 599 5.82404e-05
-2 637 599 143 5.82404e-05
-2 637 599 144 5.82404e-05
-3 637 599 144 143 5.82404e-05
-1 379 183 5.82427e-05
-2 379 183 142 5.82427e-05
-2 379 183 182 5.82427e-05
-3 379 183 182 142 5.82427e-05
-1 487 318 5.84266e-05
-2 487 355 318 5.84266e-05
-1 577 318 5.84266e-05
-1 577 355 5.84266e-05
-2 577 355 318 5.84266e-05
-1 577 487 5.84266e-05
-2 577 487 318 5.84266e-05
-2 577 487 355 5.84266e-05
-3 577 487 355 318 5.84266e-05
-1 613 441 5.84412e-05
-1 614 441 5.84412e-05
-2 614 613 441 5.84412e-05
-1 615 441 5.84412e-05
-2 615 613 441 5.84412e-05
-2 615 614 441 5.84412e-05
-3 615 614 613 441 5.84412e-05
-1 177 38 5.85134e-05
-2 177 137 38 5.85134e-05
-2 214 177 38 5.85134e-05
-3 214 177 137 38 5.85134e-05
-0 638 5.87426e-05
-1 638 584 5.87426e-05
-1 638 585 5.87426e-05
-2 638 585 584 5.87426e-05
-0 639 5.87426e-05
-1 639 584 5.87426e-05
-1 639 585 5.87426e-05
-2 639 585 584 5.87426e-05
-1 639 638 5.87426e-05
-2 639 638 584 5.87426e-05
-2 639 638 585 5.87426e-05
-3 639 638 585 584 5.87426e-05
-2 363 362 359 5.87677e-05
-3 363 362 359 358 5.87677e-05
-1 258 37 5.89144e-05
-2 258 37 35 5.89144e-05
-0 640 5.89144e-05
-1 640 35 5.89144e-05
-1 640 37 5.89144e-05
-2 640 37 35 5.89144e-05
-1 640 258 5.89144e-05
-2 640 258 35 5.89144e-05
-2 640 258 37 5.89144e-05
-3 640 258 37 35 5.89144e-05
-1 373 44 5.89897e-05
-1 373 45 5.89897e-05
-2 373 45 44 5.89897e-05
-1 373 46 5.89897e-05
-2 373 46 44 5.89897e-05
-2 373 46 45 5.89897e-05
-3 373 46 45 44 5.89897e-05
-1 379 145 5.91183e-05
-2 379 145 142 5.91183e-05
-2 379 183 145 5.91183e-05
-3 379 183 145 142 5.91183e-05
-1 386 22 5.91635e-05
-2 386 23 22 5.91635e-05
-2 386 97 22 5.91635e-05
-3 386 97 23 22 5.91635e-05
-1 466 346 5.92327e-05
-2 466 348 346 5.92327e-05
-1 467 346 5.92327e-05
-2 467 348 346 5.92327e-05
-2 467 466 346 5.92327e-05
-3 467 466 348 346 5.92327e-05
-1 543 231 5.94107e-05
-2 543 231 230 5.94107e-05
-2 543 232 231 5.94107e-05
-3 543 232 231 230 5.94107e-05
-2 493 387 296 5.94633e-05
-3 493 387 296 295 5.94633e-05
-1 297 194 5.95172e-05
-1 403 297 5.95172e-05
-2 403 297 194 5.95172e-05
-0 641 5.95172e-05
-1 641 194 5.95172e-05
-1 641 297 5.95172e-05
-2 641 297 194 5.95172e-05
-1 641 403 5.95172e-05
-2 641 403 194 5.95172e-05
-2 641 403 297 5.95172e-05
-3 641 403 297 194 5.95172e-05
-1 343 49 5.96118e-05
-2 343 338 49 5.96118e-05
-1 617 49 5.96118e-05
-1 617 338 5.96118e-05
-2 617 338 49 5.96118e-05
-1 617 343 5.96118e-05
-2 617 343 49 5.96118e-05
-2 617 343 338 5.96118e-05
-3 617 343 338 49 5.96118e-05
-1 634 441 5.96328e-05
-2 634 614 441 5.96328e-05
-2 634 615 441 5.96328e-05
-3 634 615 614 441 5.96328e-05
-2 557 493 296 5.96391e-05
-3 557 493 387 296 5.96391e-05
-1 395 254 5.96801e-05
-1 395 255 5.96801e-05
-2 395 255 254 5.96801e-05
-0 642 5.96801e-05
-1 642 254 5.96801e-05
-1 642 255 5.96801e-05
-2 642 255 254 5.96801e-05
-1 642 395 5.96801e-05
-2 642 395 254 5.96801e-05
-2 642 395 255 5.96801e-05
-3 642 395 255 254 5.96801e-05
-1 41 35 5.97413e-05
-2 41 35 34 5.97413e-05
-2 52 41 35 5.97413e-05
-3 52 41 35 34 5.97413e-05
-0 643 5.98112e-05
-0 644 5.98112e-05
-1 644 643 5.98112e-05
-0 645 5.98112e-05
-1 645 643 5.98112e-05
-1 645 644 5.98112e-05
-2 645 644 643 5.98112e-05
-0 646 5.98112e-05
-1 646 643 5.98112e-05
-1 646 644 5.98112e-05
-2 646 644 643 5.98112e-05
-1 646 645 5.98112e-05
-2 646 645 643 5.98112e-05
-2 646 645 644 5.98112e-05
-3 646 645 644 643 5.98112e-05
-2 386 385 22 5.98751e-05
-3 386 385 97 22 5.98751e-05
-1 583 235 5.98903e-05
-2 583 235 232 5.98903e-05
-2 583 235 233 5.98903e-05
-3 583 235 233 232 5.98903e-05
-1 370 66 5.99512e-05
-1 370 353 5.99512e-05
-2 370 353 66 5.99512e-05
-2 372 370 66 5.99512e-05
-2 372 370 353 5.99512e-05
-3 372 370 353 66 5.99512e-05
-1 635 281 6.00353e-05
-2 635 536 281 6.00353e-05
-2 635 596 281 6.00353e-05
-3 635 596 536 281 6.00353e-05
-2 158 90 89 6.00556e-05
-3 158 92 90 89 6.00556e-05
-1 641 294 6.01091e-05
-1 641 388 6.01091e-05
-2 641 388 294 6.01091e-05
-1 641 389 6.01091e-05
-2 641 389 294 6.01091e-05
-2 641 389 388 6.01091e-05
-3 641 389 388 294 6.01091e-05
-1 635 284 6.0191e-05
-2 635 284 281 6.0191e-05
-2 635 536 284 6.0191e-05
-3 635 536 284 281 6.0191e-05
-0 647 6.0234e-05
-1 647 448 6.0234e-05
-0 648 6.0234e-05
-1 648 448 6.0234e-05
-1 648 647 6.0234e-05
-2 648 647 448 6.0234e-05
-0 649 6.0234e-05
-1 649 448 6.0234e-05
-1 649 647 6.0234e-05
-2 649 647 448 6.0234e-05
-1 649 648 6.0234e-05
-2 649 648 448 6.0234e-05
-2 649 648 647 6.0234e-05
-3 649 648 647 448 6.0234e-05
-2 379 183 181 6.02629e-05
-3 379 183 182 181 6.02629e-05
-1 385 23 6.04373e-05
-2 385 23 22 6.04373e-05
-2 386 385 23 6.04373e-05
-3 386 385 23 22 6.04373e-05
-1 275 98 6.04771e-05
-1 386 275 6.04771e-05
-2 386 275 98 6.04771e-05
-2 391 275 98 6.04771e-05
-2 391 386 275 6.04771e-05
-3 391 386 275 98 6.04771e-05
-1 441 202 6.05078e-05
-1 613 202 6.05078e-05
-2 613 441 202 6.05078e-05
-1 614 202 6.05078e-05
-2 614 441 202 6.05078e-05
-2 614 613 202 6.05078e-05
-3 614 613 441 202 6.05078e-05
-1 345 329 6.05557e-05
-2 345 329 313 6.05557e-05
-2 345 329 328 6.05557e-05
-3 345 329 328 313 6.05557e-05
-2 290 289 146 6.05716e-05
-3 290 289 149 146 6.05716e-05
-1 478 189 6.06912e-05
-1 478 293 6.06912e-05
-2 478 293 189 6.06912e-05
-1 627 189 6.06912e-05
-1 627 293 6.06912e-05
-2 627 293 189 6.06912e-05
-2 627 478 189 6.06912e-05
-2 627 478 293 6.06912e-05
-3 627 478 293 189 6.06912e-05
-1 625 212 6.08452e-05
-0 650 6.08452e-05
-1 650 212 6.08452e-05
-1 650 625 6.08452e-05
-2 650 625 212 6.08452e-05
-0 651 6.08452e-05
-1 651 212 6.08452e-05
-1 651 625 6.08452e-05
-2 651 625 212 6.08452e-05
-1 651 650 6.08452e-05
-2 651 650 212 6.08452e-05
-2 651 650 625 6.08452e-05
-3 651 650 625 212 6.08452e-05
-2 287 285 132 6.09354e-05
-3 287 285 266 132 6.09354e-05
-1 264 127 6.10226e-05
-2 264 127 125 6.10226e-05
-1 423 127 6.10226e-05
-2 423 127 125 6.10226e-05
-2 423 264 127 6.10226e-05
-3 423 264 127 125 6.10226e-05
-0 652 6.12408e-05
-1 652 582 6.12408e-05
-0 653 6.12408e-05
-1 653 582 6.12408e-05
-1 653 652 6.12408e-05
-2 653 652 582 6.12408e-05
-0 654 6.12408e-05
-1 654 582 6.12408e-05
-1 654 652 6.12408e-05
-2 654 652 582 6.12408e-05
-1 654 653 6.12408e-05
-2 654 653 582 6.12408e-05
-2 654 653 652 6.12408e-05
-3 654 653 652 582 6.12408e-05
-1 560 327 6.12913e-05
-1 560 467 6.12913e-05
-2 560 467 327 6.12913e-05
-1 593 327 6.12913e-05
-1 593 467 6.12913e-05
-2 593 467 327 6.12913e-05
-2 593 560 327 6.12913e-05
-2 593 560 467 6.12913e-05
-3 593 560 467 327 6.12913e-05
-0 655 6.14134e-05
-1 655 422 6.14134e-05
-0 656 6.14134e-05
-1 656 422 6.14134e-05
-1 656 655 6.14134e-05
-2 656 655 422 6.14134e-05
-0 657 6.14134e-05
-1 657 422 6.14134e-05
-1 657 655 6.14134e-05
-2 657 655 422 6.14134e-05
-1 657 656 6.14134e-05
-2 657 656 422 6.14134e-05
-2 657 656 655 6.14134e-05
-3 657 656 655 422 6.14134e-05
-1 513 141 6.14157e-05
-1 513 367 6.14157e-05
-2 513 367 141 6.14157e-05
-1 514 141 6.14157e-05
-1 514 367 6.14157e-05
-2 514 367 141 6.14157e-05
-2 514 513 141 6.14157e-05
-2 514 513 367 6.14157e-05
-3 514 513 367 141 6.14157e-05
-1 638 417 6.14185e-05
-2 638 584 417 6.14185e-05
-2 638 585 417 6.14185e-05
-3 638 585 584 417 6.14185e-05
-2 309 213 99 6.14208e-05
-3 440 309 213 99 6.14208e-05
-1 520 107 6.14301e-05
-1 520 178 6.14301e-05
-2 520 178 107 6.14301e-05
-1 520 496 6.14301e-05
-2 520 496 107 6.14301e-05
-2 520 496 178 6.14301e-05
-3 520 496 178 107 6.14301e-05
-0 658 6.14311e-05
-1 658 387 6.14311e-05
-1 658 413 6.14311e-05
-2 658 413 387 6.14311e-05
-1 658 557 6.14311e-05
-2 658 557 387 6.14311e-05
-2 658 557 413 6.14311e-05
-3 658 557 413 387 6.14311e-05
-1 217 184 6.15035e-05
-2 217 184 45 6.15035e-05
-1 217 185 6.15035e-05
-2 217 185 45 6.15035e-05
-2 217 185 184 6.15035e-05
-3 217 185 184 45 6.15035e-05
-1 493 403 6.15911e-05
-2 493 403 297 6.15911e-05
-1 578 297 6.15911e-05
-2 578 403 297 6.15911e-05
-1 578 493 6.15911e-05
-2 578 493 297 6.15911e-05
-2 578 493 403 6.15911e-05
-3 578 493 403 297 6.15911e-05
-1 431 227 6.16393e-05
-2 431 227 168 6.16393e-05
-2 431 227 169 6.16393e-05
-3 431 227 169 168 6.16393e-05
-1 634 337 6.16883e-05
-1 634 562 6.16883e-05
-2 634 562 337 6.16883e-05
-2 634 563 337 6.16883e-05
-2 634 563 562 6.16883e-05
-3 634 563 562 337 6.16883e-05
-1 412 314 6.17089e-05
-2 412 314 313 6.17089e-05
-2 412 368 314 6.17089e-05
-3 412 368 314 313 6.17089e-05
-1 657 623 6.17206e-05
-0 659 6.17206e-05
-1 659 623 6.17206e-05
-1 659 657 6.17206e-05
-2 659 657 623 6.17206e-05
-0 660 6.17206e-05
-1 660 623 6.17206e-05
-1 660 657 6.17206e-05
-2 660 657 623 6.17206e-05
-1 660 659 6.17206e-05
-2 660 659 623 6.17206e-05
-2 660 659 657 6.17206e-05
-3 660 659 657 623 6.17206e-05
-0 661 6.17784e-05
-1 661 153 6.17784e-05
-0 662 6.17784e-05
-1 662 153 6.17784e-05
-1 662 661 6.17784e-05
-2 662 661 153 6.17784e-05
-0 663 6.17784e-05
-1 663 153 6.17784e-05
-1 663 661 6.17784e-05
-2 663 661 153 6.17784e-05
-1 663 662 6.17784e-05
-2 663 662 153 6.17784e-05
-2 663 662 661 6.17784e-05
-3 663 662 661 153 6.17784e-05
-1 432 328 6.18121e-05
-2 432 329 328 6.18121e-05
-1 495 328 6.18121e-05
-1 495 329 6.18121e-05
-2 495 329 328 6.18121e-05
-2 495 432 328 6.18121e-05
-2 495 432 329 6.18121e-05
-3 495 432 329 328 6.18121e-05
-1 41 37 6.19021e-05
-2 41 37 34 6.19021e-05
-2 162 41 34 6.19021e-05
-2 162 41 37 6.19021e-05
-3 162 41 37 34 6.19021e-05
-1 559 526 6.19625e-05
-1 559 528 6.19625e-05
-2 559 528 526 6.19625e-05
-1 561 526 6.19625e-05
-1 561 528 6.19625e-05
-2 561 528 526 6.19625e-05
-2 561 559 526 6.19625e-05
-2 561 559 528 6.19625e-05
-3 561 559 528 526 6.19625e-05
-1 399 285 6.20191e-05
-2 399 285 122 6.20191e-05
-2 540 399 285 6.20191e-05
-3 540 399 285 122 6.20191e-05
-1 528 511 6.21885e-05
-2 559 528 511 6.21885e-05
-1 560 528 6.21885e-05
-2 560 528 511 6.21885e-05
-2 560 559 528 6.21885e-05
-3 560 559 528 511 6.21885e-05
-0 664 6.25536e-05
-1 664 415 6.25536e-05
-1 664 416 6.25536e-05
-2 664 416 415 6.25536e-05
-0 665 6.25536e-05
-1 665 415 6.25536e-05
-1 665 416 6.25536e-05
-2 665 416 415 6.25536e-05
-1 665 664 6.25536e-05
-2 665 664 415 6.25536e-05
-2 665 664 416 6.25536e-05
-3 665 664 416 415 6.25536e-05
-1 164 90 6.25602e-05
-1 252 90 6.25602e-05
-2 252 164 90 6.25602e-05
-1 269 90 6.25602e-05
-2 269 164 90 6.25602e-05
-2 269 252 90 6.25602e-05
-3 269 252 164 90 6.25602e-05
-1 575 181 6.2567e-05
-1 575 183 6.2567e-05
-2 575 183 181 6.2567e-05
-1 611 181 6.2567e-05
-1 611 183 6.2567e-05
-2 611 183 181 6.2567e-05
-2 611 575 181 6.2567e-05
-2 611 575 183 6.2567e-05
-3 611 575 183 181 6.2567e-05
-1 316 148 6.26341e-05
-1 316 290 6.26341e-05
-2 316 290 148 6.26341e-05
-1 524 290 6.26341e-05
-2 524 290 148 6.26341e-05
-1 524 316 6.26341e-05
-2 524 316 148 6.26341e-05
-2 524 316 290 6.26341e-05
-3 524 316 290 148 6.26341e-05
-1 585 574 6.2653e-05
-2 585 574 417 6.2653e-05
-2 585 574 573 6.2653e-05
-3 585 574 573 417 6.2653e-05
-1 634 613 6.26795e-05
-2 634 613 441 6.26795e-05
-2 634 615 613 6.26795e-05
-3 634 615 613 441 6.26795e-05
-1 636 155 6.27091e-05
-1 636 265 6.27091e-05
-2 636 265 155 6.27091e-05
-1 636 511 6.27091e-05
-2 636 511 155 6.27091e-05
-2 636 511 265 6.27091e-05
-3 636 511 265 155 6.27091e-05
-1 454 84 6.27421e-05
-2 454 84 58 6.27421e-05
-1 454 321 6.27421e-05
-2 454 321 58 6.27421e-05
-2 454 321 84 6.27421e-05
-3 454 321 84 58 6.27421e-05
-1 628 218 6.27574e-05
-2 628 218 215 6.27574e-05
-2 628 460 218 6.27574e-05
-3 628 460 218 215 6.27574e-05
-0 666 6.28907e-05
-1 666 430 6.28907e-05
-0 667 6.28907e-05
-1 667 430 6.28907e-05
-1 667 666 6.28907e-05
-2 667 666 430 6.28907e-05
-0 668 6.28907e-05
-1 668 430 6.28907e-05
-1 668 666 6.28907e-05
-2 668 666 430 6.28907e-05
-1 668 667 6.28907e-05
-2 668 667 430 6.28907e-05
-2 668 667 666 6.28907e-05
-3 668 667 666 430 6.28907e-05
-2 338 191 49 6.29297e-05
-3 338 191 50 49 6.29297e-05
-1 460 151 6.30019e-05
-1 642 151 6.30019e-05
-1 642 460 6.30019e-05
-2 642 460 151 6.30019e-05
-0 669 6.30019e-05
-1 669 151 6.30019e-05
-1 669 460 6.30019e-05
-2 669 460 151 6.30019e-05
-1 669 642 6.30019e-05
-2 669 642 151 6.30019e-05
-2 669 642 460 6.30019e-05
-3 669 642 460 151 6.30019e-05
-0 670 6.30632e-05
-1 670 643 6.30632e-05
-0 671 6.30632e-05
-1 671 643 6.30632e-05
-1 671 670 6.30632e-05
-2 671 670 643 6.30632e-05
-0 672 6.30632e-05
-1 672 643 6.30632e-05
-1 672 670 6.30632e-05
-2 672 670 643 6.30632e-05
-1 672 671 6.30632e-05
-2 672 671 643 6.30632e-05
-2 672 671 670 6.30632e-05
-3 672 671 670 643 6.30632e-05
-0 673 6.30955e-05
-1 673 607 6.30955e-05
-1 673 609 6.30955e-05
-2 673 609 607 6.30955e-05
-1 673 610 6.30955e-05
-2 673 610 607 6.30955e-05
-2 673 610 609 6.30955e-05
-3 673 610 609 607 6.30955e-05
-1 328 168 6.32923e-05
-2 495 328 168 6.32923e-05
-2 519 328 168 6.32923e-05
-2 519 495 328 6.32923e-05
-3 519 495 328 168 6.32923e-05
-1 590 476 6.3307e-05
-1 590 477 6.3307e-05
-2 590 477 476 6.3307e-05
-0 674 6.3307e-05
-1 674 476 6.3307e-05
-1 674 477 6.3307e-05
-2 674 477 476 6.3307e-05
-1 674 590 6.3307e-05
-2 674 590 476 6.3307e-05
-2 674 590 477 6.3307e-05
-3 674 590 477 476 6.3307e-05
-2 177 56 38 6.34019e-05
-3 177 137 56 38 6.34019e-05
-2 641 297 294 6.34715e-05
-1 641 493 6.34715e-05
-2 641 493 294 6.34715e-05
-2 641 493 297 6.34715e-05
-3 641 493 297 294 6.34715e-05
-1 276 96 6.35025e-05
-2 276 96 93 6.35025e-05
-2 276 96 95 6.35025e-05
-3 276 96 95 93 6.35025e-05
-1 641 578 6.35159e-05
-2 641 578 297 6.35159e-05
-2 641 578 403 6.35159e-05
-3 641 578 403 297 6.35159e-05
-1 541 168 6.36516e-05
-1 541 494 6.36516e-05
-2 541 494 168 6.36516e-05
-1 558 541 6.36516e-05
-2 558 541 168 6.36516e-05
-2 558 541 494 6.36516e-05
-3 558 541 494 168 6.36516e-05
-1 535 324 6.37155e-05
-2 535 324 322 6.37155e-05
-2 535 324 323 6.37155e-05
-3 535 324 323 322 6.37155e-05
-1 233 105 6.38126e-05
-2 233 106 105 6.38126e-05
-0 675 6.38126e-05
-1 675 105 6.38126e-05
-1 675 106 6.38126e-05
-2 675 106 105 6.38126e-05
-1 675 233 6.38126e-05
-2 675 233 105 6.38126e-05
-2 675 233 106 6.38126e-05
-3 675 233 106 105 6.38126e-05
-1 635 569 6.39552e-05
-2 635 569 479 6.39552e-05
-2 635 596 569 6.39552e-05
-3 635 596 569 479 6.39552e-05
-1 541 177 6.39861e-05
-1 541 214 6.39861e-05
-2 541 214 177 6.39861e-05
-2 541 298 177 6.39861e-05
-2 541 298 214 6.39861e-05
-3 541 298 214 177 6.39861e-05
-1 450 326 6.41185e-05
-1 450 327 6.41185e-05
-2 450 327 326 6.41185e-05
-1 560 326 6.41185e-05
-2 560 327 326 6.41185e-05
-2 560 450 326 6.41185e-05
-2 560 450 327 6.41185e-05
-3 560 450 327 326 6.41185e-05
-2 641 493 388 6.41189e-05
-3 641 493 388 294 6.41189e-05
-1 505 352 6.42185e-05
-2 505 352 170 6.42185e-05
-2 519 505 170 6.42185e-05
-2 519 505 352 6.42185e-05
-3 519 505 352 170 6.42185e-05
-2 593 450 327 6.42742e-05
-3 593 560 450 327 6.42742e-05
-1 495 349 6.42913e-05
-2 495 349 168 6.42913e-05
-2 495 350 349 6.42913e-05
-3 495 350 349 168 6.42913e-05
-2 41 37 35 6.42946e-05
-3 41 37 35 34 6.42946e-05
-1 293 220 6.43752e-05
-2 478 293 220 6.43752e-05
-1 596 293 6.43752e-05
-2 596 293 220 6.43752e-05
-2 596 478 293 6.43752e-05
-3 596 478 293 220 6.43752e-05
-1 563 343 6.45356e-05
-2 563 343 342 6.45356e-05
-1 634 342 6.45356e-05
-1 634 343 6.45356e-05
-2 634 343 342 6.45356e-05
-2 634 563 342 6.45356e-05
-2 634 563 343 6.45356e-05
-3 634 563 343 342 6.45356e-05
-1 213 195 6.46858e-05
-2 257 213 195 6.46858e-05
-2 381 213 195 6.46858e-05
-3 381 257 213 195 6.46858e-05
-1 596 284 6.4776e-05
-2 596 284 281 6.4776e-05
-2 635 596 284 6.4776e-05
-3 635 596 284 281 6.4776e-05
-1 541 431 6.48039e-05
-2 541 431 168 6.48039e-05
-2 558 541 431 6.48039e-05
-3 558 541 431 168 6.48039e-05
-0 676 6.48208e-05
-1 676 515 6.48208e-05
-1 676 517 6.48208e-05
-2 676 517 515 6.48208e-05
-0 677 6.48208e-05
-1 677 515 6.48208e-05
-1 677 517 6.48208e-05
-2 677 517 515 6.48208e-05
-1 677 676 6.48208e-05
-2 677 676 515 6.48208e-05
-2 677 676 517 6.48208e-05
-3 677 676 517 515 6.48208e-05
-1 590 370 6.48759e-05
-1 591 370 6.48759e-05
-2 591 590 370 6.48759e-05
-1 592 370 6.48759e-05
-2 592 590 370 6.48759e-05
-2 592 591 370 6.48759e-05
-3 592 591 590 370 6.48759e-05
-2 495 329 168 6.48913e-05
-3 495 432 329 168 6.48913e-05
-1 637 145 6.49057e-05
-2 637 145 144 6.49057e-05
-1 637 183 6.49057e-05
-2 637 183 144 6.49057e-05
-2 637 183 145 6.49057e-05
-3 637 183 145 144 6.49057e-05
-2 637 145 143 6.49525e-05
-3 637 145 144 143 6.49525e-05
-1 400 181 6.4971e-05
-2 400 181 180 6.4971e-05
-1 405 181 6.4971e-05
-2 405 181 180 6.4971e-05
-2 405 400 181 6.4971e-05
-3 405 400 181 180 6.4971e-05
-2 634 342 337 6.52722e-05
-3 634 563 342 337 6.52722e-05
-2 329 328 168 6.52953e-05
-3 495 329 328 168 6.52953e-05
-2 505 329 168 6.53405e-05
-3 505 329 171 168 6.53405e-05
-1 399 59 6.57585e-05
-2 399 61 59 6.57585e-05
-2 399 104 59 6.57585e-05
-3 399 104 61 59 6.57585e-05
-1 578 245 6.58355e-05
-1 578 309 6.58355e-05
-2 578 309 245 6.58355e-05
-1 578 388 6.58355e-05
-2 578 388 245 6.58355e-05
-2 578 388 309 6.58355e-05
-3 578 388 309 245 6.58355e-05
-2 412 316 314 6.58743e-05
-3 412 316 314 313 6.58743e-05
-1 531 421 6.59184e-05
-0 678 6.59184e-05
-1 678 421 6.59184e-05
-1 678 531 6.59184e-05
-2 678 531 421 6.59184e-05
-0 679 6.59184e-05
-1 679 421 6.59184e-05
-1 679 531 6.59184e-05
-2 679 531 421 6.59184e-05
-1 679 678 6.59184e-05
-2 679 678 421 6.59184e-05
-2 679 678 531 6.59184e-05
-3 679 678 531 421 6.59184e-05
-2 541 227 168 6.5986e-05
-2 541 431 227 6.5986e-05
-3 541 431 227 168 6.5986e-05
-1 183 143 6.60054e-05
-2 183 145 143 6.60054e-05
-2 637 183 143 6.60054e-05
-3 637 183 145 143 6.60054e-05
-2 505 328 168 6.60104e-05
-3 505 329 328 168 6.60104e-05
-1 389 99 6.60333e-05
-1 389 100 6.60333e-05
-2 389 100 99 6.60333e-05
-1 641 99 6.60333e-05
-1 641 100 6.60333e-05
-2 641 100 99 6.60333e-05
-2 641 389 99 6.60333e-05
-2 641 389 100 6.60333e-05
-3 641 389 100 99 6.60333e-05
-2 634 343 337 6.60762e-05
-3 634 343 342 337 6.60762e-05
-1 591 66 6.61725e-05
-1 591 353 6.61725e-05
-2 591 353 66 6.61725e-05
-2 591 370 66 6.61725e-05
-2 591 370 353 6.61725e-05
-3 591 370 353 66 6.61725e-05
-2 641 578 194 6.61963e-05
-3 641 578 403 194 6.61963e-05
-1 397 255 6.62021e-05
-2 397 395 255 6.62021e-05
-1 539 395 6.62021e-05
-2 539 395 255 6.62021e-05
-2 539 397 255 6.62021e-05
-2 539 397 395 6.62021e-05
-3 539 397 395 255 6.62021e-05
-2 627 596 293 6.6218e-05
-3 627 596 478 293 6.6218e-05
-1 528 450 6.62729e-05
-2 559 528 450 6.62729e-05
-2 560 528 450 6.62729e-05
-3 560 559 528 450 6.62729e-05
-2 36 27 26 6.63127e-05
-1 162 26 6.63127e-05
-2 162 27 26 6.63127e-05
-2 162 36 26 6.63127e-05
-3 162 36 27 26 6.63127e-05
-1 572 78 6.64218e-05
-1 574 78 6.64218e-05
-2 574 572 78 6.64218e-05
-0 680 6.64218e-05
-1 680 78 6.64218e-05
-1 680 572 6.64218e-05
-2 680 572 78 6.64218e-05
-1 680 574 6.64218e-05
-2 680 574 78 6.64218e-05
-2 680 574 572 6.64218e-05
-3 680 574 572 78 6.64218e-05
-1 578 366 6.64619e-05
-2 578 366 309 6.64619e-05
-2 578 402 309 6.64619e-05
-2 578 402 366 6.64619e-05
-3 578 402 366 309 6.64619e-05
-0 681 6.68004e-05
-1 681 562 6.68004e-05
-1 681 634 6.68004e-05
-2 681 634 562 6.68004e-05
-0 682 6.68004e-05
-1 682 562 6.68004e-05
-1 682 634 6.68004e-05
-2 682 634 562 6.68004e-05
-1 682 681 6.68004e-05
-2 682 681 562 6.68004e-05
-2 682 681 634 6.68004e-05
-3 682 681 634 562 6.68004e-05
-2 561 528 511 6.68602e-05
-3 561 559 528 511 6.68602e-05
-1 485 403 6.68685e-05
-2 485 403 297 6.68685e-05
-2 493 485 403 6.68685e-05
-3 493 485 403 297 6.68685e-05
-1 613 65 6.70309e-05
-1 613 353 6.70309e-05
-2 613 353 65 6.70309e-05
-2 613 441 65 6.70309e-05
-2 613 441 353 6.70309e-05
-3 613 441 353 65 6.70309e-05
-1 651 414 6.7074e-05
-2 651 625 414 6.7074e-05
-1 651 626 6.7074e-05
-2 651 626 414 6.7074e-05
-2 651 626 625 6.7074e-05
-3 651 626 625 414 6.7074e-05
-1 463 443 6.70797e-05
-1 465 443 6.70797e-05
-2 465 463 443 6.70797e-05
-0 683 6.70797e-05
-1 683 443 6.70797e-05
-1 683 463 6.70797e-05
-2 683 463 443 6.70797e-05
-1 683 465 6.70797e-05
-2 683 465 443 6.70797e-05
-2 683 465 463 6.70797e-05
-3 683 465 463 443 6.70797e-05
-1 519 296 6.71551e-05
-1 519 297 6.71551e-05
-2 519 297 296 6.71551e-05
-1 519 344 6.71551e-05
-2 519 344 296 6.71551e-05
-2 519 344 297 6.71551e-05
-3 519 344 297 296 6.71551e-05
-1 511 311 6.71665e-05
-2 511 311 155 6.71665e-05
-2 511 311 189 6.71665e-05
-3 511 311 189 155 6.71665e-05
-2 617 49 48 6.71921e-05
-1 618 49 6.71921e-05
-2 618 49 48 6.71921e-05
-2 618 617 49 6.71921e-05
-3 618 617 49 48 6.71921e-05
-1 232 107 6.72171e-05
-2 232 107 106 6.72171e-05
-2 232 108 107 6.72171e-05
-3 232 108 107 106 6.72171e-05
-2 441 353 202 6.72426e-05
-2 613 353 202 6.72426e-05
-3 613 441 353 202 6.72426e-05
-1 627 512 6.72545e-05
-2 627 512 189 6.72545e-05
-2 627 512 293 6.72545e-05
-3 627 512 293 189 6.72545e-05
-1 426 130 6.72553e-05
-1 556 130 6.72553e-05
-1 556 426 6.72553e-05
-2 556 426 130 6.72553e-05
-0 684 6.72553e-05
-1 684 130 6.72553e-05
-1 684 426 6.72553e-05
-2 684 426 130 6.72553e-05
-1 684 556 6.72553e-05
-2 684 556 130 6.72553e-05
-2 684 556 426 6.72553e-05
-3 684 556 426 130 6.72553e-05
-1 328 170 6.74468e-05
-2 505 328 170 6.74468e-05
-2 519 328 170 6.74468e-05
-3 519 505 328 170 6.74468e-05
-2 162 26 25 6.75089e-05
-2 162 27 25 6.75089e-05
-3 162 27 26 25 6.75089e-05
-1 234 107 6.75486e-05
-2 234 108 107 6.75486e-05
-1 496 234 6.75486e-05
-2 496 234 107 6.75486e-05
-2 496 234 108 6.75486e-05
-3 496 234 108 107 6.75486e-05
-0 685 6.75697e-05
-1 685 141 6.75697e-05
-1 685 367 6.75697e-05
-2 685 367 141 6.75697e-05
-1 685 514 6.75697e-05
-2 685 514 141 6.75697e-05
-2 685 514 367 6.75697e-05
-3 685 514 367 141 6.75697e-05
-1 596 512 6.75859e-05
-2 596 512 293 6.75859e-05
-2 627 596 512 6.75859e-05
-3 627 596 512 293 6.75859e-05
-1 589 143 6.76315e-05
-2 592 589 143 6.76315e-05
-0 686 6.76315e-05
-1 686 143 6.76315e-05
-1 686 589 6.76315e-05
-2 686 589 143 6.76315e-05
-1 686 592 6.76315e-05
-2 686 592 143 6.76315e-05
-2 686 592 589 6.76315e-05
-3 686 592 589 143 6.76315e-05
-1 331 224 6.77564e-05
-1 332 224 6.77564e-05
-2 332 331 224 6.77564e-05
-0 687 6.77564e-05
-1 687 224 6.77564e-05
-1 687 331 6.77564e-05
-2 687 331 224 6.77564e-05
-1 687 332 6.77564e-05
-2 687 332 224 6.77564e-05
-2 687 332 331 6.77564e-05
-3 687 332 331 224 6.77564e-05
-2 328 170 168 6.77656e-05
-3 519 328 170 168 6.77656e-05
-1 511 327 6.77929e-05
-2 511 327 326 6.77929e-05
-2 560 511 326 6.77929e-05
-2 560 511 327 6.77929e-05
-3 560 511 327 326 6.77929e-05
-1 630 555 6.79174e-05
-0 688 6.79174e-05
-1 688 555 6.79174e-05
-1 688 630 6.79174e-05
-2 688 630 555 6.79174e-05
-0 689 6.79174e-05
-1 689 555 6.79174e-05
-1 689 630 6.79174e-05
-2 689 630 555 6.79174e-05
-1 689 688 6.79174e-05
-2 689 688 555 6.79174e-05
-2 689 688 630 6.79174e-05
-3 689 688 630 555 6.79174e-05
-1 345 294 6.79459e-05
-1 345 295 6.79459e-05
-2 345 295 294 6.79459e-05
-1 519 294 6.79459e-05
-1 519 295 6.79459e-05
-2 519 295 294 6.79459e-05
-2 519 345 294 6.79459e-05
-2 519 345 295 6.79459e-05
-3 519 345 295 294 6.79459e-05
-1 537 44 6.79494e-05
-2 537 45 44 6.79494e-05
-1 537 373 6.79494e-05
-2 537 373 44 6.79494e-05
-2 537 373 45 6.79494e-05
-3 537 373 45 44 6.79494e-05
-1 513 313 6.79533e-05
-2 513 314 313 6.79533e-05
-2 513 367 313 6.79533e-05
-2 513 367 314 6.79533e-05
-3 513 367 314 313 6.79533e-05
-2 234 232 107 6.79977e-05
-3 234 232 108 107 6.79977e-05
-3 505 328 170 168 6.80119e-05
-2 309 257 213 6.80266e-05
-1 365 213 6.80266e-05
-2 365 257 213 6.80266e-05
-2 365 309 213 6.80266e-05
-3 365 309 257 213 6.80266e-05
-1 177 63 6.80799e-05
-2 177 63 38 6.80799e-05
-2 214 177 63 6.80799e-05
-3 214 177 63 38 6.80799e-05
-0 690 6.82536e-05
-1 690 512 6.82536e-05
-1 690 596 6.82536e-05
-2 690 596 512 6.82536e-05
-1 690 627 6.82536e-05
-2 690 627 512 6.82536e-05
-2 690 627 596 6.82536e-05
-3 690 627 596 512 6.82536e-05
-2 519 297 294 6.83285e-05
-1 641 519 6.83285e-05
-2 641 519 294 6.83285e-05
-2 641 519 297 6.83285e-05
-3 641 519 297 294 6.83285e-05
-1 605 580 6.8455e-05
-1 605 581 6.8455e-05
-2 605 581 580 6.8455e-05
-1 605 582 6.8455e-05
-2 605 582 580 6.8455e-05
-2 605 582 581 6.8455e-05
-3 605 582 581 580 6.8455e-05
-0 691 6.84586e-05
-1 691 500 6.84586e-05
-1 691 502 6.84586e-05
-2 691 502 500 6.84586e-05
-1 691 503 6.84586e-05
-2 691 503 500 6.84586e-05
-2 691 503 502 6.84586e-05
-3 691 503 502 500 6.84586e-05
-1 361 74 6.85524e-05
-2 361 75 74 6.85524e-05
-0 692 6.85524e-05
-1 692 74 6.85524e-05
-1 692 75 6.85524e-05
-2 692 75 74 6.85524e-05
-1 692 361 6.85524e-05
-2 692 361 74 6.85524e-05
-2 692 361 75 6.85524e-05
-3 692 361 75 74 6.85524e-05
-1 516 510 6.87419e-05
-1 656 510 6.87419e-05
-1 656 516 6.87419e-05
-2 656 516 510 6.87419e-05
-0 693 6.87419e-05
-1 693 510 6.87419e-05
-1 693 516 6.87419e-05
-2 693 516 510 6.87419e-05
-1 693 656 6.87419e-05
-2 693 656 510 6.87419e-05
-2 693 656 516 6.87419e-05
-3 693 656 516 510 6.87419e-05
-1 680 573 6.88858e-05
-2 680 573 572 6.88858e-05
-2 680 574 573 6.88858e-05
-3 680 574 573 572 6.88858e-05
-0 694 6.89095e-05
-1 694 606 6.89095e-05
-1 694 620 6.89095e-05
-2 694 620 606 6.89095e-05
-0 695 6.89095e-05
-1 695 606 6.89095e-05
-1 695 620 6.89095e-05
-2 695 620 606 6.89095e-05
-1 695 694 6.89095e-05
-2 695 694 606 6.89095e-05
-2 695 694 620 6.89095e-05
-3 695 694 620 606 6.89095e-05
-0 696 6.89103e-05
-1 696 263 6.89103e-05
-0 697 6.89103e-05
-1 697 263 6.89103e-05
-1 697 696 6.89103e-05
-2 697 696 263 6.89103e-05
-0 698 6.89103e-05
-1 698 263 6.89103e-05
-1 698 696 6.89103e-05
-2 698 696 263 6.89103e-05
-1 698 697 6.89103e-05
-2 698 697 263 6.89103e-05
-2 698 697 696 6.89103e-05
-3 698 697 696 263 6.89103e-05
-1 317 15 6.89815e-05
-2 317 15 12 6.89815e-05
-2 319 15 12 6.89815e-05
-2 319 317 15 6.89815e-05
-3 319 317 15 12 6.89815e-05
-0 699 6.90126e-05
-1 699 416 6.90126e-05
-0 700 6.90126e-05
-1 700 416 6.90126e-05
-1 700 699 6.90126e-05
-2 700 699 416 6.90126e-05
-0 701 6.90126e-05
-1 701 416 6.90126e-05
-1 701 699 6.90126e-05
-2 701 699 416 6.90126e-05
-1 701 700 6.90126e-05
-2 701 700 416 6.90126e-05
-2 701 700 699 6.90126e-05
-3 701 700 699 416 6.90126e-05
-2 641 578 493 6.90534e-05
-3 641 578 493 297 6.90534e-05
-1 661 150 6.9133e-05
-2 661 153 150 6.9133e-05
-1 662 150 6.9133e-05
-2 662 153 150 6.9133e-05
-2 662 661 150 6.9133e-05
-3 662 661 153 150 6.9133e-05
-2 405 379 181 6.91499e-05
-3 405 379 181 180 6.91499e-05
-1 674 545 6.9215e-05
-2 674 545 476 6.9215e-05
-2 674 545 477 6.9215e-05
-3 674 545 477 476 6.9215e-05
-0 702 6.92195e-05
-1 702 106 6.92195e-05
-1 702 231 6.92195e-05
-2 702 231 106 6.92195e-05
-1 702 232 6.92195e-05
-2 702 232 106 6.92195e-05
-2 702 232 231 6.92195e-05
-3 702 232 231 106 6.92195e-05
-1 589 144 6.9315e-05
-2 589 144 143 6.9315e-05
-2 592 589 144 6.9315e-05
-3 592 589 144 143 6.9315e-05
-2 519 344 294 6.93506e-05
-2 519 344 295 6.93506e-05
-3 519 344 295 294 6.93506e-05
-1 552 90 6.94312e-05
-2 552 252 90 6.94312e-05
-0 703 6.94312e-05
-1 703 90 6.94312e-05
-1 703 252 6.94312e-05
-2 703 252 90 6.94312e-05
-1 703 552 6.94312e-05
-2 703 552 90 6.94312e-05
-2 703 552 252 6.94312e-05
-3 703 552 252 90 6.94312e-05
-1 685 513 6.94415e-05
-2 685 513 367 6.94415e-05
-2 685 514 513 6.94415e-05
-3 685 514 513 367 6.94415e-05
-0 704 6.95198e-05
-1 704 340 6.95198e-05
-1 704 455 6.95198e-05
-2 704 455 340 6.95198e-05
-0 705 6.95198e-05
-1 705 340 6.95198e-05
-1 705 455 6.95198e-05
-2 705 455 340 6.95198e-05
-1 705 704 6.95198e-05
-2 705 704 340 6.95198e-05
-2 705 704 455 6.95198e-05
-3 705 704 455 340 6.95198e-05
-1 595 464 6.95332e-05
-2 595 464 462 6.95332e-05
-1 600 464 6.95332e-05
-2 600 464 462 6.95332e-05
-2 600 595 464 6.95332e-05
-3 600 595 464 462 6.95332e-05
-1 680 77 6.95373e-05
-0 706 6.95373e-05
-1 706 77 6.95373e-05
-1 706 680 6.95373e-05
-2 706 680 77 6.95373e-05
-0 707 6.95373e-05
-1 707 77 6.95373e-05
-1 707 680 6.95373e-05
-2 707 680 77 6.95373e-05
-1 707 706 6.95373e-05
-2 707 706 77 6.95373e-05
-2 707 706 680 6.95373e-05
-3 707 706 680 77 6.95373e-05
-2 541 349 168 6.97592e-05
-3 541 349 227 168 6.97592e-05
-0 708 6.98819e-05
-1 708 193 6.98819e-05
-0 709 6.98819e-05
-1 709 193 6.98819e-05
-1 709 708 6.98819e-05
-2 709 708 193 6.98819e-05
-0 710 6.98819e-05
-1 710 193 6.98819e-05
-1 710 708 6.98819e-05
-2 710 708 193 6.98819e-05
-1 710 709 6.98819e-05
-2 710 709 193 6.98819e-05
-2 710 709 708 6.98819e-05
-3 710 709 708 193 6.98819e-05
-2 578 493 388 6.98963e-05
-2 641 578 388 6.98963e-05
-3 641 578 493 388 6.98963e-05
-3 519 344 297 294 6.99244e-05
-1 412 273 6.9939e-05
-2 412 344 273 6.9939e-05
-1 519 273 6.9939e-05
-2 519 344 273 6.9939e-05
-1 519 412 6.9939e-05
-2 519 412 273 6.9939e-05
-2 519 412 344 6.9939e-05
-3 519 412 344 273 6.9939e-05
-1 493 274 7.00801e-05
-1 557 274 7.00801e-05
-2 557 493 274 7.00801e-05
-0 711 7.00801e-05
-1 711 274 7.00801e-05
-1 711 493 7.00801e-05
-2 711 493 274 7.00801e-05
-1 711 557 7.00801e-05
-2 711 557 274 7.00801e-05
-2 711 557 493 7.00801e-05
-3 711 557 493 274 7.00801e-05
-0 712 7.01778e-05
-1 712 584 7.01778e-05
-1 712 638 7.01778e-05
-2 712 638 584 7.01778e-05
-1 712 639 7.01778e-05
-2 712 639 584 7.01778e-05
-2 712 639 638 7.01778e-05
-3 712 639 638 584 7.01778e-05
-0 713 7.03002e-05
-0 714 7.03002e-05
-1 714 713 7.03002e-05
-0 715 7.03002e-05
-1 715 713 7.03002e-05
-1 715 714 7.03002e-05
-2 715 714 713 7.03002e-05
-0 716 7.03002e-05
-1 716 713 7.03002e-05
-1 716 714 7.03002e-05
-2 716 714 713 7.03002e-05
-1 716 715 7.03002e-05
-2 716 715 713 7.03002e-05
-2 716 715 714 7.03002e-05
-3 716 715 714 713 7.03002e-05
-1 423 126 7.04376e-05
-2 423 126 125 7.04376e-05
-2 423 127 126 7.04376e-05
-3 423 127 126 125 7.04376e-05
-1 565 467 7.04753e-05
-1 565 560 7.04753e-05
-2 565 560 467 7.04753e-05
-1 593 565 7.04753e-05
-2 593 565 467 7.04753e-05
-2 593 565 560 7.04753e-05
-3 593 565 560 467 7.04753e-05
-1 544 281 7.05458e-05
-2 544 283 281 7.05458e-05
-1 544 284 7.05458e-05
-2 544 284 281 7.05458e-05
-2 544 284 283 7.05458e-05
-3 544 284 283 281 7.05458e-05
-1 195 99 7.05712e-05
-2 213 195 99 7.05712e-05
-2 381 195 99 7.05712e-05
-3 381 213 195 99 7.05712e-05
-1 636 346 7.0721e-05
-1 636 347 7.0721e-05
-2 636 347 346 7.0721e-05
-2 636 348 346 7.0721e-05
-2 636 348 347 7.0721e-05
-3 636 348 347 346 7.0721e-05
-2 493 296 271 7.08538e-05
-3 493 377 296 271 7.08538e-05
-1 600 74 7.087e-05
-1 600 75 7.087e-05
-2 600 75 74 7.087e-05
-1 600 361 7.087e-05
-2 600 361 74 7.087e-05
-2 600 361 75 7.087e-05
-3 600 361 75 74 7.087e-05
-2 412 345 295 7.09135e-05
-2 519 412 295 7.09135e-05
-2 519 412 345 7.09135e-05
-3 519 412 345 295 7.09135e-05
-1 399 132 7.09173e-05
-2 399 132 122 7.09173e-05
-2 399 285 132 7.09173e-05
-3 399 285 132 122 7.09173e-05
-3 519 412 344 295 7.09226e-05
-1 455 341 7.09575e-05
-2 455 341 340 7.09575e-05
-1 457 341 7.09575e-05
-2 457 341 340 7.09575e-05
-2 457 455 341 7.09575e-05
-3 457 455 341 340 7.09575e-05
-2 636 467 346 7.09872e-05
-3 636 467 348 346 7.09872e-05
-1 347 206 7.11126e-05
-2 347 207 206 7.11126e-05
-2 347 346 206 7.11126e-05
-3 347 346 207 206 7.11126e-05
-1 309 194 7.12229e-05
-2 402 309 194 7.12229e-05
-2 578 309 194 7.12229e-05
-3 578 402 309 194 7.12229e-05
-0 717 7.12301e-05
-1 717 652 7.12301e-05
-1 717 653 7.12301e-05
-2 717 653 652 7.12301e-05
-1 717 654 7.12301e-05
-2 717 654 652 7.12301e-05
-2 717 654 653 7.12301e-05
-3 717 654 653 652 7.12301e-05
-1 299 283 7.12828e-05
-2 299 283 281 7.12828e-05
-2 299 283 282 7.12828e-05
-3 299 283 282 281 7.12828e-05
-1 346 89 7.12993e-05
-2 346 92 89 7.12993e-05
-2 346 157 89 7.12993e-05
-3 346 157 92 89 7.12993e-05
-1 662 625 7.13079e-05
-1 662 626 7.13079e-05
-2 662 626 625 7.13079e-05
-1 663 625 7.13079e-05
-1 663 626 7.13079e-05
-2 663 626 625 7.13079e-05
-2 663 662 625 7.13079e-05
-2 663 662 626 7.13079e-05
-3 663 662 626 625 7.13079e-05
-1 194 99 7.13984e-05
-2 195 194 99 7.13984e-05
-2 641 194 99 7.13984e-05
-1 641 195 7.13984e-05
-2 641 195 99 7.13984e-05
-2 641 195 194 7.13984e-05
-3 641 195 194 99 7.13984e-05
-2 511 327 265 7.13985e-05
-3 511 327 326 265 7.13985e-05
-0 718 7.1661e-05
-1 718 638 7.1661e-05
-1 718 639 7.1661e-05
-2 718 639 638 7.1661e-05
-1 718 712 7.1661e-05
-2 718 712 638 7.1661e-05
-2 718 712 639 7.1661e-05
-3 718 712 639 638 7.1661e-05
-1 289 159 7.16817e-05
-2 289 159 146 7.16817e-05
-2 290 289 159 7.16817e-05
-3 290 289 159 146 7.16817e-05
-1 524 314 7.17161e-05
-2 524 316 314 7.17161e-05
-1 524 412 7.17161e-05
-2 524 412 314 7.17161e-05
-2 524 412 316 7.17161e-05
-3 524 412 316 314 7.17161e-05
-1 317 13 7.17506e-05
-2 317 13 12 7.17506e-05
-2 317 15 13 7.17506e-05
-3 317 15 13 12 7.17506e-05
-1 471 115 7.20508e-05
-2 471 115 114 7.20508e-05
-1 472 115 7.20508e-05
-2 472 115 114 7.20508e-05
-2 472 471 115 7.20508e-05
-3 472 471 115 114 7.20508e-05
-1 692 600 7.21089e-05
-2 692 600 361 7.21089e-05
-0 719 7.21089e-05
-1 719 361 7.21089e-05
-1 719 600 7.21089e-05
-2 719 600 361 7.21089e-05
-1 719 692 7.21089e-05
-2 719 692 361 7.21089e-05
-2 719 692 600 7.21089e-05
-3 719 692 600 361 7.21089e-05
-0 720 7.22415e-05
-1 720 655 7.22415e-05
-1 720 656 7.22415e-05
-2 720 656 655 7.22415e-05
-0 721 7.22415e-05
-1 721 655 7.22415e-05
-1 721 656 7.22415e-05
-2 721 656 655 7.22415e-05
-1 721 720 7.22415e-05
-2 721 720 655 7.22415e-05
-2 721 720 656 7.22415e-05
-3 721 720 656 655 7.22415e-05
-1 711 98 7.22587e-05
-1 711 391 7.22587e-05
-2 711 391 98 7.22587e-05
-0 722 7.22587e-05
-1 722 98 7.22587e-05
-1 722 391 7.22587e-05
-2 722 391 98 7.22587e-05
-1 722 711 7.22587e-05
-2 722 711 98 7.22587e-05
-2 722 711 391 7.22587e-05
-3 722 711 391 98 7.22587e-05
-1 564 105 7.24059e-05
-2 564 106 105 7.24059e-05
-1 703 105 7.24059e-05
-1 703 106 7.24059e-05
-2 703 106 105 7.24059e-05
-1 703 564 7.24059e-05
-2 703 564 105 7.24059e-05
-2 703 564 106 7.24059e-05
-3 703 564 106 105 7.24059e-05
-1 552 458 7.25848e-05
-2 552 461 458 7.25848e-05
-0 723 7.25848e-05
-1 723 458 7.25848e-05
-1 723 461 7.25848e-05
-2 723 461 458 7.25848e-05
-1 723 552 7.25848e-05
-2 723 552 458 7.25848e-05
-2 723 552 461 7.25848e-05
-3 723 552 461 458 7.25848e-05
-1 317 33 7.26262e-05
-2 317 33 13 7.26262e-05
-2 317 33 15 7.26262e-05
-3 317 33 15 13 7.26262e-05
-0 724 7.27137e-05
-0 725 7.27137e-05
-1 725 724 7.27137e-05
-0 726 7.27137e-05
-1 726 724 7.27137e-05
-1 726 725 7.27137e-05
-2 726 725 724 7.27137e-05
-0 727 7.27137e-05
-1 727 724 7.27137e-05
-1 727 725 7.27137e-05
-2 727 725 724 7.27137e-05
-1 727 726 7.27137e-05
-2 727 726 724 7.27137e-05
-2 727 726 725 7.27137e-05
-3 727 726 725 724 7.27137e-05
-1 702 107 7.27366e-05
-2 702 107 106 7.27366e-05
-2 702 232 107 7.27366e-05
-3 702 232 107 106 7.27366e-05
-1 385 98 7.27383e-05
-2 385 98 23 7.27383e-05
-2 386 385 98 7.27383e-05
-3 386 385 98 23 7.27383e-05
-2 544 477 284 7.28788e-05
-3 544 477 284 283 7.28788e-05
-1 615 562 7.29187e-05
-2 615 563 562 7.29187e-05
-2 634 615 562 7.29187e-05
-3 634 615 563 562 7.29187e-05
-1 129 28 7.29662e-05
-2 129 28 25 7.29662e-05
-1 459 28 7.29662e-05
-2 459 28 25 7.29662e-05
-2 459 129 28 7.29662e-05
-3 459 129 28 25 7.29662e-05
-1 702 234 7.29806e-05
-2 702 234 107 7.29806e-05
-2 702 234 232 7.29806e-05
-3 702 234 232 107 7.29806e-05
-1 681 615 7.30057e-05
-2 681 615 562 7.30057e-05
-2 681 634 615 7.30057e-05
-3 681 634 615 562 7.30057e-05
-2 692 600 74 7.31109e-05
-3 692 600 361 74 7.31109e-05
-2 552 164 90 7.31403e-05
-3 552 252 164 90 7.31403e-05
-1 470 387 7.31784e-05
-2 470 413 387 7.31784e-05
-1 658 470 7.31784e-05
-2 658 470 387 7.31784e-05
-2 658 470 413 7.31784e-05
-3 658 470 413 387 7.31784e-05
-1 686 599 7.32592e-05
-2 686 599 143 7.32592e-05
-2 686 599 592 7.32592e-05
-3 686 599 592 143 7.32592e-05
-1 161 125 7.33428e-05
-2 161 160 125 7.33428e-05
-2 423 161 125 7.33428e-05
-3 423 161 160 125 7.33428e-05
-1 560 265 7.34462e-05
-2 560 327 265 7.34462e-05
-2 560 511 265 7.34462e-05
-3 560 511 327 265 7.34462e-05
-2 162 37 26 7.34978e-05
-3 162 37 36 26 7.34978e-05
-1 703 229 7.35119e-05
-2 703 229 106 7.35119e-05
-2 703 564 229 7.35119e-05
-3 703 564 229 106 7.35119e-05
-1 569 525 7.363e-05
-1 569 526 7.363e-05
-2 569 526 525 7.363e-05
-1 569 527 7.363e-05
-2 569 527 525 7.363e-05
-2 569 527 526 7.363e-05
-3 569 527 526 525 7.363e-05
-1 507 72 7.39791e-05
-2 507 173 72 7.39791e-05
-2 507 491 72 7.39791e-05
-3 507 491 173 72 7.39791e-05
-1 717 582 7.39924e-05
-2 717 653 582 7.39924e-05
-2 717 654 582 7.39924e-05
-3 717 654 653 582 7.39924e-05
-1 614 343 7.40438e-05
-2 614 563 343 7.40438e-05
-2 634 614 343 7.40438e-05
-3 634 614 563 343 7.40438e-05
-1 470 138 7.40528e-05
-1 470 140 7.40528e-05
-2 470 140 138 7.40528e-05
-1 658 138 7.40528e-05
-1 658 140 7.40528e-05
-2 658 140 138 7.40528e-05
-2 658 470 138 7.40528e-05
-2 658 470 140 7.40528e-05
-3 658 470 140 138 7.40528e-05
-1 389 245 7.41229e-05
-2 389 245 100 7.41229e-05
-1 641 245 7.41229e-05
-2 641 245 100 7.41229e-05
-2 641 389 245 7.41229e-05
-3 641 389 245 100 7.41229e-05
-1 608 438 7.42098e-05
-1 608 439 7.42098e-05
-2 608 439 438 7.42098e-05
-1 608 553 7.42098e-05
-2 608 553 438 7.42098e-05
-2 608 553 439 7.42098e-05
-3 608 553 439 438 7.42098e-05
-1 541 495 7.42742e-05
-2 541 495 168 7.42742e-05
-2 541 495 494 7.42742e-05
-3 541 495 494 168 7.42742e-05
-1 704 683 7.42784e-05
-1 705 683 7.42784e-05
-2 705 704 683 7.42784e-05
-0 728 7.42784e-05
-1 728 683 7.42784e-05
-1 728 704 7.42784e-05
-2 728 704 683 7.42784e-05
-1 728 705 7.42784e-05
-2 728 705 683 7.42784e-05
-2 728 705 704 7.42784e-05
-3 728 705 704 683 7.42784e-05
-2 519 296 273 7.43116e-05
-3 519 344 296 273 7.43116e-05
-1 682 190 7.4688e-05
-1 682 191 7.4688e-05
-2 682 191 190 7.4688e-05
-1 682 337 7.4688e-05
-2 682 337 190 7.4688e-05
-2 682 337 191 7.4688e-05
-3 682 337 191 190 7.4688e-05
-1 636 560 7.48286e-05
-2 636 560 265 7.48286e-05
-2 636 560 511 7.48286e-05
-3 636 560 511 265 7.48286e-05
-1 226 177 7.48897e-05
-2 226 225 177 7.48897e-05
-2 308 226 177 7.48897e-05
-3 308 226 225 177 7.48897e-05
-0 729 7.49173e-05
-1 729 451 7.49173e-05
-1 729 453 7.49173e-05
-2 729 453 451 7.49173e-05
-0 730 7.49173e-05
-1 730 451 7.49173e-05
-1 730 453 7.49173e-05
-2 730 453 451 7.49173e-05
-1 730 729 7.49173e-05
-2 730 729 451 7.49173e-05
-2 730 729 453 7.49173e-05
-3 730 729 453 451 7.49173e-05
-1 177 0 7.49177e-05
-2 177 38 0 7.49177e-05
-2 177 56 0 7.49177e-05
-3 177 56 38 0 7.49177e-05
-2 389 388 245 7.49279e-05
-1 578 389 7.49279e-05
-2 578 389 245 7.49279e-05
-2 578 389 388 7.49279e-05
-3 578 389 388 245 7.49279e-05
-1 627 526 7.49697e-05
-1 627 527 7.49697e-05
-2 627 527 526 7.49697e-05
-2 627 569 526 7.49697e-05
-2 627 569 527 7.49697e-05
-3 627 569 527 526 7.49697e-05
-0 731 7.52169e-05
-1 731 486 7.52169e-05
-0 732 7.52169e-05
-1 732 486 7.52169e-05
-1 732 731 7.52169e-05
-2 732 731 486 7.52169e-05
-0 733 7.52169e-05
-1 733 486 7.52169e-05
-1 733 731 7.52169e-05
-2 733 731 486 7.52169e-05
-1 733 732 7.52169e-05
-2 733 732 486 7.52169e-05
-2 733 732 731 7.52169e-05
-3 733 732 731 486 7.52169e-05
-1 564 233 7.52422e-05
-2 564 233 106 7.52422e-05
-2 564 233 230 7.52422e-05
-3 564 233 230 106 7.52422e-05
-1 428 214 7.53936e-05
-2 428 214 63 7.53936e-05
-1 541 63 7.53936e-05
-2 541 214 63 7.53936e-05
-1 541 428 7.53936e-05
-2 541 428 63 7.53936e-05
-2 541 428 214 7.53936e-05
-3 541 428 214 63 7.53936e-05
-1 494 298 7.5401e-05
-1 495 298 7.5401e-05
-2 495 494 298 7.5401e-05
-2 541 494 298 7.5401e-05
-2 541 495 298 7.5401e-05
-3 541 495 494 298 7.5401e-05
-1 636 327 7.54276e-05
-2 636 327 265 7.54276e-05
-2 636 468 265 7.54276e-05
-2 636 468 327 7.54276e-05
-3 636 468 327 265 7.54276e-05
-2 495 349 298 7.54935e-05
-2 541 495 349 7.54935e-05
-3 541 495 349 298 7.54935e-05
-2 641 578 389 7.56625e-05
-3 641 578 389 388 7.56625e-05
-1 508 161 7.5665e-05
-2 508 161 125 7.5665e-05
-1 508 423 7.5665e-05
-2 508 423 125 7.5665e-05
-2 508 423 161 7.5665e-05
-3 508 423 161 125 7.5665e-05
-1 63 0 7.56856e-05
-2 63 3 0 7.56856e-05
-2 63 38 0 7.56856e-05
-3 63 38 3 0 7.56856e-05
-1 555 246 7.57359e-05
-2 555 247 246 7.57359e-05
-0 734 7.57359e-05
-1 734 246 7.57359e-05
-1 734 247 7.57359e-05
-2 734 247 246 7.57359e-05
-1 734 555 7.57359e-05
-2 734 555 246 7.57359e-05
-2 734 555 247 7.57359e-05
-3 734 555 247 246 7.57359e-05
-3 541 495 349 168 7.57862e-05
-0 735 7.57913e-05
-1 735 455 7.57913e-05
-1 735 705 7.57913e-05
-2 735 705 455 7.57913e-05
-0 736 7.57913e-05
-1 736 455 7.57913e-05
-1 736 705 7.57913e-05
-2 736 705 455 7.57913e-05
-1 736 735 7.57913e-05
-2 736 735 455 7.57913e-05
-2 736 735 705 7.57913e-05
-3 736 735 705 455 7.57913e-05
-1 562 190 7.58534e-05
-2 562 337 190 7.58534e-05
-2 682 562 190 7.58534e-05
-2 682 562 337 7.58534e-05
-3 682 562 337 190 7.58534e-05
-2 463 443 442 7.61611e-05
-2 465 443 442 7.61611e-05
-3 465 463 443 442 7.61611e-05
-0 737 7.63519e-05
-1 737 95 7.63519e-05
-1 737 96 7.63519e-05
-2 737 96 95 7.63519e-05
-0 738 7.63519e-05
-1 738 95 7.63519e-05
-1 738 96 7.63519e-05
-2 738 96 95 7.63519e-05
-1 738 737 7.63519e-05
-2 738 737 95 7.63519e-05
-2 738 737 96 7.63519e-05
-3 738 737 96 95 7.63519e-05
-0 739 7.64565e-05
-1 739 269 7.64565e-05
-1 739 565 7.64565e-05
-2 739 565 269 7.64565e-05
-1 739 566 7.64565e-05
-2 739 566 269 7.64565e-05
-2 739 566 565 7.64565e-05
-3 739 566 565 269 7.64565e-05
-1 291 159 7.64705e-05
-2 291 208 159 7.64705e-05
-1 291 211 7.64705e-05
-2 291 211 159 7.64705e-05
-2 291 211 208 7.64705e-05
-3 291 211 208 159 7.64705e-05
-1 418 129 7.65844e-05
-1 624 129 7.65844e-05
-2 624 418 129 7.65844e-05
-1 629 418 7.65844e-05
-2 629 418 129 7.65844e-05
-1 629 624 7.65844e-05
-2 629 624 129 7.65844e-05
-2 629 624 418 7.65844e-05
-3 629 624 418 129 7.65844e-05
-1 626 416 7.66687e-05
-2 626 416 415 7.66687e-05
-1 665 626 7.66687e-05
-2 665 626 415 7.66687e-05
-2 665 626 416 7.66687e-05
-3 665 626 416 415 7.66687e-05
-1 557 271 7.66951e-05
-2 557 296 271 7.66951e-05
-2 557 493 271 7.66951e-05
-3 557 493 296 271 7.66951e-05
-2 682 634 337 7.6737e-05
-3 682 634 562 337 7.6737e-05
-2 641 578 245 7.69605e-05
-3 641 578 389 245 7.69605e-05
-1 509 332 7.70243e-05
-2 509 332 124 7.70243e-05
-1 509 378 7.70243e-05
-2 509 378 124 7.70243e-05
-2 509 378 332 7.70243e-05
-3 509 378 332 124 7.70243e-05
-1 309 195 7.70454e-05
-2 309 213 195 7.70454e-05
-2 309 257 195 7.70454e-05
-3 309 257 213 195 7.70454e-05
-1 641 309 7.71424e-05
-2 641 309 99 7.71424e-05
-2 641 309 100 7.71424e-05
-3 641 309 100 99 7.71424e-05
-2 402 309 195 7.71763e-05
-3 402 309 257 195 7.71763e-05
-1 561 311 7.71882e-05
-1 561 512 7.71882e-05
-2 561 512 311 7.71882e-05
-1 690 311 7.71882e-05
-2 690 512 311 7.71882e-05
-1 690 561 7.71882e-05
-2 690 561 311 7.71882e-05
-2 690 561 512 7.71882e-05
-3 690 561 512 311 7.71882e-05
-1 564 543 7.72027e-05
-2 564 543 230 7.72027e-05
-2 564 543 233 7.72027e-05
-3 564 543 233 230 7.72027e-05
-1 400 13 7.72042e-05
-2 400 33 13 7.72042e-05
-2 400 57 13 7.72042e-05
-3 400 57 33 13 7.72042e-05
-1 681 190 7.72307e-05
-2 681 562 190 7.72307e-05
-2 682 681 190 7.72307e-05
-3 682 681 562 190 7.72307e-05
-2 309 195 194 7.73256e-05
-3 402 309 195 194 7.73256e-05
-2 309 195 99 7.74011e-05
-3 309 213 195 99 7.74011e-05
-1 294 99 7.74428e-05
-2 389 294 99 7.74428e-05
-2 641 294 99 7.74428e-05
-3 641 389 294 99 7.74428e-05
-1 628 254 7.74518e-05
-2 628 254 218 7.74518e-05
-2 628 460 254 7.74518e-05
-3 628 460 254 218 7.74518e-05
-1 253 216 7.74864e-05
-2 253 216 133 7.74864e-05
-2 253 216 188 7.74864e-05
-3 253 216 188 133 7.74864e-05
-2 641 309 245 7.75003e-05
-3 641 309 245 100 7.75003e-05
-2 177 63 0 7.75329e-05
-3 177 63 38 0 7.75329e-05
-1 555 426 7.75624e-05
-2 555 426 424 7.75624e-05
-2 556 426 424 7.75624e-05
-2 556 555 426 7.75624e-05
-3 556 555 426 424 7.75624e-05
-2 493 274 271 7.75812e-05
-2 557 274 271 7.75812e-05
-3 557 493 274 271 7.75812e-05
-1 569 284 7.76376e-05
-2 596 569 284 7.76376e-05
-2 635 569 284 7.76376e-05
-3 635 596 569 284 7.76376e-05
-2 641 578 309 7.76865e-05
-3 641 578 309 245 7.76865e-05
-2 636 560 327 7.77168e-05
-3 636 560 327 265 7.77168e-05
-1 561 189 7.77289e-05
-2 561 311 189 7.77289e-05
-2 561 512 189 7.77289e-05
-3 561 512 311 189 7.77289e-05
-0 740 7.7743e-05
-1 740 86 7.7743e-05
-1 740 87 7.7743e-05
-2 740 87 86 7.7743e-05
-1 740 88 7.7743e-05
-2 740 88 86 7.7743e-05
-2 740 88 87 7.7743e-05
-3 740 88 87 86 7.7743e-05
-1 314 210 7.77754e-05
-1 375 210 7.77754e-05
-2 375 314 210 7.77754e-05
-2 524 314 210 7.77754e-05
-1 524 375 7.77754e-05
-2 524 375 210 7.77754e-05
-2 524 375 314 7.77754e-05
-3 524 375 314 210 7.77754e-05
-0 741 7.77867e-05
-1 741 525 7.77867e-05
-1 741 527 7.77867e-05
-2 741 527 525 7.77867e-05
-1 741 569 7.77867e-05
-2 741 569 525 7.77867e-05
-2 741 569 527 7.77867e-05
-3 741 569 527 525 7.77867e-05
-1 429 280 7.80279e-05
-2 429 280 277 7.80279e-05
-2 429 280 279 7.80279e-05
-3 429 280 279 277 7.80279e-05
-1 231 107 7.80915e-05
-2 231 107 106 7.80915e-05
-2 702 231 107 7.80915e-05
-3 702 231 107 106 7.80915e-05
-2 309 194 99 7.81058e-05
-3 309 195 194 99 7.81058e-05
-1 404 82 7.81531e-05
-2 404 82 69 7.81531e-05
-2 404 82 81 7.81531e-05
-3 404 82 81 69 7.81531e-05
-1 318 14 7.81815e-05
-1 576 14 7.81815e-05
-1 576 318 7.81815e-05
-2 576 318 14 7.81815e-05
-1 577 14 7.81815e-05
-2 577 318 14 7.81815e-05
-2 577 576 14 7.81815e-05
-2 577 576 318 7.81815e-05
-3 577 576 318 14 7.81815e-05
-1 505 412 7.81991e-05
-2 505 412 316 7.81991e-05
-2 505 412 345 7.81991e-05
-3 505 412 345 316 7.81991e-05
-0 742 7.83461e-05
-0 743 7.83461e-05
-1 743 742 7.83461e-05
-0 744 7.83461e-05
-1 744 742 7.83461e-05
-1 744 743 7.83461e-05
-2 744 743 742 7.83461e-05
-0 745 7.83461e-05
-1 745 742 7.83461e-05
-1 745 743 7.83461e-05
-2 745 743 742 7.83461e-05
-1 745 744 7.83461e-05
-2 745 744 742 7.83461e-05
-2 745 744 743 7.83461e-05
-3 745 744 743 742 7.83461e-05
-1 177 3 7.86706e-05
-2 177 3 0 7.86706e-05
-2 177 63 3 7.86706e-05
-3 177 63 3 0 7.86706e-05
-0 746 7.87307e-05
-1 746 476 7.87307e-05
-1 746 590 7.87307e-05
-2 746 590 476 7.87307e-05
-1 746 674 7.87307e-05
-2 746 674 476 7.87307e-05
-2 746 674 590 7.87307e-05
-3 746 674 590 476 7.87307e-05
-1 426 128 7.88371e-05
-2 426 130 128 7.88371e-05
-1 684 128 7.88371e-05
-2 684 130 128 7.88371e-05
-2 684 426 128 7.88371e-05
-3 684 426 130 128 7.88371e-05
-1 269 91 7.90036e-05
-1 566 91 7.90036e-05
-2 566 269 91 7.90036e-05
-1 739 91 7.90036e-05
-2 739 269 91 7.90036e-05
-2 739 566 91 7.90036e-05
-3 739 566 269 91 7.90036e-05
-2 636 467 327 7.90423e-05
-3 636 468 467 327 7.90423e-05
-1 376 44 7.91703e-05
-2 376 373 44 7.91703e-05
-0 747 7.91703e-05
-1 747 44 7.91703e-05
-1 747 373 7.91703e-05
-2 747 373 44 7.91703e-05
-1 747 376 7.91703e-05
-2 747 376 44 7.91703e-05
-2 747 376 373 7.91703e-05
-3 747 376 373 44 7.91703e-05
-1 252 105 7.92355e-05
-1 675 252 7.92355e-05
-2 675 252 105 7.92355e-05
-2 703 252 105 7.92355e-05
-1 703 675 7.92355e-05
-2 703 675 105 7.92355e-05
-2 703 675 252 7.92355e-05
-3 703 675 252 105 7.92355e-05
-1 160 127 7.93198e-05
-2 264 160 127 7.93198e-05
-2 423 160 127 7.93198e-05
-3 423 264 160 127 7.93198e-05
-1 630 128 7.93385e-05
-2 630 129 128 7.93385e-05
-2 630 130 128 7.93385e-05
-3 630 130 129 128 7.93385e-05
-1 431 329 7.93803e-05
-2 431 329 171 7.93803e-05
-2 432 431 329 7.93803e-05
-3 432 431 329 171 7.93803e-05
-0 748 7.93991e-05
-1 748 653 7.93991e-05
-1 748 717 7.93991e-05
-2 748 717 653 7.93991e-05
-0 749 7.93991e-05
-1 749 653 7.93991e-05
-1 749 717 7.93991e-05
-2 749 717 653 7.93991e-05
-1 749 748 7.93991e-05
-2 749 748 653 7.93991e-05
-2 749 748 717 7.93991e-05
-3 749 748 717 653 7.93991e-05
-1 739 206 7.94549e-05
-2 739 206 91 7.94549e-05
-1 739 346 7.94549e-05
-2 739 346 91 7.94549e-05
-2 739 346 206 7.94549e-05
-3 739 346 206 91 7.94549e-05
-1 566 507 7.94853e-05
-0 750 7.94853e-05
-1 750 507 7.94853e-05
-1 750 566 7.94853e-05
-2 750 566 507 7.94853e-05
-0 751 7.94853e-05
-1 751 507 7.94853e-05
-1 751 566 7.94853e-05
-2 751 566 507 7.94853e-05
-1 751 750 7.94853e-05
-2 751 750 507 7.94853e-05
-2 751 750 566 7.94853e-05
-3 751 750 566 507 7.94853e-05
-2 636 560 467 7.95319e-05
-3 636 560 467 327 7.95319e-05
-1 665 663 7.95609e-05
-1 699 663 7.95609e-05
-1 699 665 7.95609e-05
-2 699 665 663 7.95609e-05
-1 700 663 7.95609e-05
-1 700 665 7.95609e-05
-2 700 665 663 7.95609e-05
-2 700 699 663 7.95609e-05
-2 700 699 665 7.95609e-05
-3 700 699 665 663 7.95609e-05
-0 752 7.96454e-05
-1 752 659 7.96454e-05
-1 752 660 7.96454e-05
-2 752 660 659 7.96454e-05
-0 753 7.96454e-05
-1 753 659 7.96454e-05
-1 753 660 7.96454e-05
-2 753 660 659 7.96454e-05
-1 753 752 7.96454e-05
-2 753 752 659 7.96454e-05
-2 753 752 660 7.96454e-05
-3 753 752 660 659 7.96454e-05
-1 229 105 7.9794e-05
-2 229 106 105 7.9794e-05
-2 703 229 105 7.9794e-05
-3 703 229 106 105 7.9794e-05
-1 312 286 7.98014e-05
-2 312 286 267 7.98014e-05
-2 312 287 286 7.98014e-05
-3 312 287 286 267 7.98014e-05
-0 754 7.98081e-05
-1 754 638 7.98081e-05
-1 754 712 7.98081e-05
-2 754 712 638 7.98081e-05
-1 754 718 7.98081e-05
-2 754 718 638 7.98081e-05
-2 754 718 712 7.98081e-05
-3 754 718 712 638 7.98081e-05
-1 508 332 7.98926e-05
-2 508 332 124 7.98926e-05
-2 509 508 332 7.98926e-05
-3 509 508 332 124 7.98926e-05
-1 683 340 7.99022e-05
-2 704 683 340 7.99022e-05
-2 705 683 340 7.99022e-05
-3 705 704 683 340 7.99022e-05
-1 319 33 8.00191e-05
-2 319 33 15 8.00191e-05
-2 319 317 33 8.00191e-05
-3 319 317 33 15 8.00191e-05
-1 163 34 8.01088e-05
-2 163 41 34 8.01088e-05
-2 163 162 34 8.01088e-05
-3 163 162 41 34 8.01088e-05
-1 743 443 8.01547e-05
-1 743 465 8.01547e-05
-2 743 465 443 8.01547e-05
-1 743 683 8.01547e-05
-2 743 683 443 8.01547e-05
-2 743 683 465 8.01547e-05
-3 743 683 465 443 8.01547e-05
-1 365 80 8.03215e-05
-2 365 256 80 8.03215e-05
-2 365 257 80 8.03215e-05
-3 365 257 256 80 8.03215e-05
-1 383 51 8.03325e-05
-2 383 382 51 8.03325e-05
-0 755 8.03325e-05
-1 755 51 8.03325e-05
-1 755 382 8.03325e-05
-2 755 382 51 8.03325e-05
-1 755 383 8.03325e-05
-2 755 383 51 8.03325e-05
-2 755 383 382 8.03325e-05
-3 755 383 382 51 8.03325e-05
-1 54 2 8.05836e-05
-2 54 2 0 8.05836e-05
-2 54 38 2 8.05836e-05
-3 54 38 2 0 8.05836e-05
-1 682 49 8.06924e-05
-2 682 191 49 8.06924e-05
-1 682 475 8.06924e-05
-2 682 475 49 8.06924e-05
-2 682 475 191 8.06924e-05
-3 682 475 191 49 8.06924e-05
-2 561 511 189 8.06991e-05
-2 561 511 311 8.06991e-05
-3 561 511 311 189 8.06991e-05
-1 754 639 8.0754e-05
-2 754 639 638 8.0754e-05
-2 754 718 639 8.0754e-05
-3 754 718 639 638 8.0754e-05
-0 756 8.08573e-05
-1 756 332 8.08573e-05
-1 756 334 8.08573e-05
-2 756 334 332 8.08573e-05
-1 756 378 8.08573e-05
-2 756 378 332 8.08573e-05
-2 756 378 334 8.08573e-05
-3 756 378 334 332 8.08573e-05
-0 757 8.09812e-05
-1 757 18 8.09812e-05
-1 757 570 8.09812e-05
-2 757 570 18 8.09812e-05
-1 757 571 8.09812e-05
-2 757 571 18 8.09812e-05
-2 757 571 570 8.09812e-05
-3 757 571 570 18 8.09812e-05
-1 469 139 8.0985e-05
-1 469 140 8.0985e-05
-2 469 140 139 8.0985e-05
-1 470 139 8.0985e-05
-2 470 140 139 8.0985e-05
-2 470 469 139 8.0985e-05
-2 470 469 140 8.0985e-05
-3 470 469 140 139 8.0985e-05
-0 758 8.10711e-05
-0 759 8.10711e-05
-1 759 758 8.10711e-05
-0 760 8.10711e-05
-1 760 758 8.10711e-05
-1 760 759 8.10711e-05
-2 760 759 758 8.10711e-05
-0 761 8.10711e-05
-1 761 758 8.10711e-05
-1 761 759 8.10711e-05
-2 761 759 758 8.10711e-05
-1 761 760 8.10711e-05
-2 761 760 758 8.10711e-05
-2 761 760 759 8.10711e-05
-3 761 760 759 758 8.10711e-05
-1 375 45 8.10846e-05
-2 375 373 45 8.10846e-05
-1 537 375 8.10846e-05
-2 537 375 45 8.10846e-05
-2 537 375 373 8.10846e-05
-3 537 375 373 45 8.10846e-05
-1 682 338 8.11432e-05
-2 682 338 191 8.11432e-05
-2 682 338 337 8.11432e-05
-3 682 338 337 191 8.11432e-05
-1 717 658 8.12205e-05
-1 749 658 8.12205e-05
-2 749 717 658 8.12205e-05
-0 762 8.12205e-05
-1 762 658 8.12205e-05
-1 762 717 8.12205e-05
-2 762 717 658 8.12205e-05
-1 762 749 8.12205e-05
-2 762 749 658 8.12205e-05
-2 762 749 717 8.12205e-05
-3 762 749 717 658 8.12205e-05
-1 745 532 8.13605e-05
-0 763 8.13605e-05
-1 763 532 8.13605e-05
-1 763 745 8.13605e-05
-2 763 745 532 8.13605e-05
-0 764 8.13605e-05
-1 764 532 8.13605e-05
-1 764 745 8.13605e-05
-2 764 745 532 8.13605e-05
-1 764 763 8.13605e-05
-2 764 763 532 8.13605e-05
-2 764 763 745 8.13605e-05
-3 764 763 745 532 8.13605e-05
-0 765 8.1366e-05
-1 765 507 8.1366e-05
-1 765 751 8.1366e-05
-2 765 751 507 8.1366e-05
-0 766 8.1366e-05
-1 766 507 8.1366e-05
-1 766 751 8.1366e-05
-2 766 751 507 8.1366e-05
-1 766 765 8.1366e-05
-2 766 765 507 8.1366e-05
-2 766 765 751 8.1366e-05
-3 766 765 751 507 8.1366e-05
-1 600 463 8.13928e-05
-2 600 463 462 8.13928e-05
-2 600 464 463 8.13928e-05
-3 600 464 463 462 8.13928e-05
-1 739 347 8.15186e-05
-2 739 347 206 8.15186e-05
-2 739 347 346 8.15186e-05
-3 739 347 346 206 8.15186e-05
-1 578 99 8.15717e-05
-2 578 194 99 8.15717e-05
-2 578 309 99 8.15717e-05
-3 578 309 194 99 8.15717e-05
-2 641 578 99 8.15947e-05
-3 641 578 309 99 8.15947e-05
-1 687 160 8.17025e-05
-1 687 258 8.17025e-05
-2 687 258 160 8.17025e-05
-1 687 264 8.17025e-05
-2 687 264 160 8.17025e-05
-2 687 264 258 8.17025e-05
-3 687 264 258 160 8.17025e-05
-1 630 556 8.20213e-05
-2 630 556 555 8.20213e-05
-1 688 556 8.20213e-05
-2 688 556 555 8.20213e-05
-2 688 630 556 8.20213e-05
-3 688 630 556 555 8.20213e-05
-1 705 443 8.21068e-05
-2 705 683 443 8.21068e-05
-1 728 443 8.21068e-05
-2 728 683 443 8.21068e-05
-2 728 705 443 8.21068e-05
-3 728 705 683 443 8.21068e-05
-1 735 443 8.22539e-05
-1 735 683 8.22539e-05
-2 735 683 443 8.22539e-05
-1 743 735 8.22539e-05
-2 743 735 443 8.22539e-05
-2 743 735 683 8.22539e-05
-3 743 735 683 443 8.22539e-05
-2 163 43 34 8.23573e-05
-3 163 43 41 34 8.23573e-05
-3 641 578 194 99 8.23633e-05
-2 680 78 77 8.24684e-05
-1 680 79 8.24684e-05
-2 680 79 77 8.24684e-05
-2 680 79 78 8.24684e-05
-3 680 79 78 77 8.24684e-05
-1 423 124 8.27018e-05
-2 423 125 124 8.27018e-05
-2 508 423 124 8.27018e-05
-3 508 423 125 124 8.27018e-05
-1 627 528 8.27987e-05
-2 627 528 526 8.27987e-05
-2 627 528 527 8.27987e-05
-3 627 528 527 526 8.27987e-05
-0 767 8.2817e-05
-1 767 747 8.2817e-05
-0 768 8.2817e-05
-1 768 747 8.2817e-05
-1 768 767 8.2817e-05
-2 768 767 747 8.2817e-05
-0 769 8.2817e-05
-1 769 747 8.2817e-05
-1 769 767 8.2817e-05
-2 769 767 747 8.2817e-05
-1 769 768 8.2817e-05
-2 769 768 747 8.2817e-05
-2 769 768 767 8.2817e-05
-3 769 768 767 747 8.2817e-05
-2 423 126 124 8.28993e-05
-3 423 126 125 124 8.28993e-05
-2 557 344 271 8.30946e-05
-3 557 344 296 271 8.30946e-05
-0 770 8.33809e-05
-1 770 363 8.33809e-05
-1 770 603 8.33809e-05
-2 770 603 363 8.33809e-05
-1 770 604 8.33809e-05
-2 770 604 363 8.33809e-05
-2 770 604 603 8.33809e-05
-3 770 604 603 363 8.33809e-05
-1 614 203 8.33841e-05
-1 614 204 8.33841e-05
-2 614 204 203 8.33841e-05
-0 771 8.33841e-05
-1 771 203 8.33841e-05
-1 771 204 8.33841e-05
-2 771 204 203 8.33841e-05
-1 771 614 8.33841e-05
-2 771 614 203 8.33841e-05
-2 771 614 204 8.33841e-05
-3 771 614 204 203 8.33841e-05
-1 115 86 8.34617e-05
-2 115 86 85 8.34617e-05
-2 115 88 86 8.34617e-05
-3 115 88 86 85 8.34617e-05
-0 772 8.34792e-05
-1 772 233 8.34792e-05
-1 772 542 8.34792e-05
-2 772 542 233 8.34792e-05
-1 772 583 8.34792e-05
-2 772 583 233 8.34792e-05
-2 772 583 542 8.34792e-05
-3 772 583 542 233 8.34792e-05
-1 340 262 8.34981e-05
-1 683 262 8.34981e-05
-2 683 340 262 8.34981e-05
-1 704 262 8.34981e-05
-2 704 340 262 8.34981e-05
-2 704 683 262 8.34981e-05
-3 704 683 340 262 8.34981e-05
-1 287 113 8.35469e-05
-2 306 287 113 8.35469e-05
-2 312 287 113 8.35469e-05
-3 312 306 287 113 8.35469e-05
-1 453 326 8.35604e-05
-1 453 327 8.35604e-05
-2 453 327 326 8.35604e-05
-2 453 450 326 8.35604e-05
-2 453 450 327 8.35604e-05
-3 453 450 327 326 8.35604e-05
-1 772 543 8.36516e-05
-2 772 543 233 8.36516e-05
-2 772 543 542 8.36516e-05
-3 772 543 542 233 8.36516e-05
-1 513 315 8.36583e-05
-2 513 315 313 8.36583e-05
-2 513 315 314 8.36583e-05
-3 513 315 314 313 8.36583e-05
-1 382 49 8.36701e-05
-2 382 51 49 8.36701e-05
-2 475 382 49 8.36701e-05
-3 475 382 51 49 8.36701e-05
-1 722 275 8.36798e-05
-2 722 275 98 8.36798e-05
-2 722 391 275 8.36798e-05
-3 722 391 275 98 8.36798e-05
-1 762 748 8.37462e-05
-0 773 8.37462e-05
-1 773 748 8.37462e-05
-1 773 762 8.37462e-05
-2 773 762 748 8.37462e-05
-0 774 8.37462e-05
-1 774 748 8.37462e-05
-1 774 762 8.37462e-05
-2 774 762 748 8.37462e-05
-1 774 773 8.37462e-05
-2 774 773 748 8.37462e-05
-2 774 773 762 8.37462e-05
-3 774 773 762 748 8.37462e-05
-1 508 378 8.38045e-05
-2 508 378 332 8.38045e-05
-2 509 508 378 8.38045e-05
-3 509 508 378 332 8.38045e-05
-1 756 508 8.39249e-05
-2 756 508 378 8.39249e-05
-1 756 509 8.39249e-05
-2 756 509 378 8.39249e-05
-2 756 509 508 8.39249e-05
-3 756 509 508 378 8.39249e-05
-1 383 236 8.40011e-05
-2 383 237 236 8.40011e-05
-0 775 8.40011e-05
-1 775 236 8.40011e-05
-1 775 237 8.40011e-05
-2 775 237 236 8.40011e-05
-1 775 383 8.40011e-05
-2 775 383 236 8.40011e-05
-2 775 383 237 8.40011e-05
-3 775 383 237 236 8.40011e-05
-1 687 127 8.41707e-05
-2 687 160 127 8.41707e-05
-2 687 264 127 8.41707e-05
-3 687 264 160 127 8.41707e-05
-1 709 25 8.4177e-05
-1 709 26 8.4177e-05
-2 709 26 25 8.4177e-05
-1 709 418 8.4177e-05
-2 709 418 25 8.4177e-05
-2 709 418 26 8.4177e-05
-3 709 418 26 25 8.4177e-05
-2 682 338 49 8.41859e-05
-3 682 338 191 49 8.41859e-05
-1 580 76 8.42498e-05
-1 580 78 8.42498e-05
-2 580 78 76 8.42498e-05
-2 580 79 76 8.42498e-05
-2 580 79 78 8.42498e-05
-3 580 79 78 76 8.42498e-05
-1 375 46 8.42538e-05
-2 375 46 45 8.42538e-05
-2 375 373 46 8.42538e-05
-3 375 373 46 45 8.42538e-05
-1 511 450 8.44749e-05
-2 528 511 450 8.44749e-05
-2 560 511 450 8.44749e-05
-3 560 528 511 450 8.44749e-05
-1 614 342 8.45387e-05
-2 614 343 342 8.45387e-05
-2 614 563 342 8.45387e-05
-3 614 563 343 342 8.45387e-05
-1 569 281 8.48159e-05
-2 569 284 281 8.48159e-05
-2 596 569 281 8.48159e-05
-3 596 569 284 281 8.48159e-05
-1 718 199 8.49969e-05
-0 776 8.49969e-05
-1 776 199 8.49969e-05
-1 776 718 8.49969e-05
-2 776 718 199 8.49969e-05
-0 777 8.49969e-05
-1 777 199 8.49969e-05
-1 777 718 8.49969e-05
-2 777 718 199 8.49969e-05
-1 777 776 8.49969e-05
-2 777 776 199 8.49969e-05
-2 777 776 718 8.49969e-05
-3 777 776 718 199 8.49969e-05
-1 692 73 8.50699e-05
-2 692 74 73 8.50699e-05
-1 692 458 8.50699e-05
-2 692 458 73 8.50699e-05
-2 692 458 74 8.50699e-05
-3 692 458 74 73 8.50699e-05
-1 694 21 8.53018e-05
-1 694 116 8.53018e-05
-2 694 116 21 8.53018e-05
-0 778 8.53018e-05
-1 778 21 8.53018e-05
-1 778 116 8.53018e-05
-2 778 116 21 8.53018e-05
-1 778 694 8.53018e-05
-2 778 694 21 8.53018e-05
-2 778 694 116 8.53018e-05
-3 778 694 116 21 8.53018e-05
-1 702 496 8.54377e-05
-2 702 496 107 8.54377e-05
-2 702 496 234 8.54377e-05
-3 702 496 234 107 8.54377e-05
-1 328 294 8.5496e-05
-2 345 328 294 8.5496e-05
-2 519 328 294 8.5496e-05
-3 519 345 328 294 8.5496e-05
-1 579 531 8.55954e-05
-1 679 579 8.55954e-05
-2 679 579 531 8.55954e-05
-1 697 531 8.55954e-05
-1 697 579 8.55954e-05
-2 697 579 531 8.55954e-05
-1 697 679 8.55954e-05
-2 697 679 531 8.55954e-05
-2 697 679 579 8.55954e-05
-3 697 679 579 531 8.55954e-05
-1 709 162 8.56144e-05
-2 709 162 25 8.56144e-05
-2 709 162 26 8.56144e-05
-3 709 162 26 25 8.56144e-05
-0 779 8.56416e-05
-1 779 475 8.56416e-05
-1 779 682 8.56416e-05
-2 779 682 475 8.56416e-05
-0 780 8.56416e-05
-1 780 475 8.56416e-05
-1 780 682 8.56416e-05
-2 780 682 475 8.56416e-05
-1 780 779 8.56416e-05
-2 780 779 475 8.56416e-05
-2 780 779 682 8.56416e-05
-3 780 779 682 475 8.56416e-05
-1 499 277 8.5643e-05
-1 499 280 8.5643e-05
-2 499 280 277 8.5643e-05
-2 499 429 277 8.5643e-05
-2 499 429 280 8.5643e-05
-3 499 429 280 277 8.5643e-05
-1 731 278 8.59208e-05
-1 731 279 8.59208e-05
-2 731 279 278 8.59208e-05
-1 731 280 8.59208e-05
-2 731 280 278 8.59208e-05
-2 731 280 279 8.59208e-05
-3 731 280 279 278 8.59208e-05
-0 781 8.59355e-05
-0 782 8.59355e-05
-1 782 781 8.59355e-05
-0 783 8.59355e-05
-1 783 781 8.59355e-05
-1 783 782 8.59355e-05
-2 783 782 781 8.59355e-05
-0 784 8.59355e-05
-1 784 781 8.59355e-05
-1 784 782 8.59355e-05
-2 784 782 781 8.59355e-05
-1 784 783 8.59355e-05
-2 784 783 781 8.59355e-05
-2 784 783 782 8.59355e-05
-3 784 783 782 781 8.59355e-05
-1 593 566 8.61208e-05
-2 593 566 565 8.61208e-05
-0 785 8.61208e-05
-1 785 565 8.61208e-05
-1 785 566 8.61208e-05
-2 785 566 565 8.61208e-05
-1 785 593 8.61208e-05
-2 785 593 565 8.61208e-05
-2 785 593 566 8.61208e-05
-3 785 593 566 565 8.61208e-05
-1 385 275 8.62331e-05
-2 385 275 98 8.62331e-05
-2 386 385 275 8.62331e-05
-3 386 385 275 98 8.62331e-05
-1 193 162 8.62768e-05
-2 193 162 26 8.62768e-05
-2 193 162 37 8.62768e-05
-3 193 162 37 26 8.62768e-05
-1 755 48 8.6334e-05
-1 755 49 8.6334e-05
-2 755 49 48 8.6334e-05
-2 755 51 48 8.6334e-05
-2 755 51 49 8.6334e-05
-3 755 51 49 48 8.6334e-05
-1 711 275 8.64545e-05
-2 711 391 275 8.64545e-05
-2 722 711 275 8.64545e-05
-3 722 711 391 275 8.64545e-05
-1 164 91 8.64812e-05
-2 164 91 90 8.64812e-05
-2 269 91 90 8.64812e-05
-2 269 164 91 8.64812e-05
-3 269 164 91 90 8.64812e-05
-0 786 8.65088e-05
-1 786 262 8.65088e-05
-1 786 340 8.65088e-05
-2 786 340 262 8.65088e-05
-1 786 704 8.65088e-05
-2 786 704 262 8.65088e-05
-2 786 704 340 8.65088e-05
-3 786 704 340 262 8.65088e-05
-1 559 525 8.65344e-05
-2 559 526 525 8.65344e-05
-2 559 528 525 8.65344e-05
-3 559 528 526 525 8.65344e-05
-1 496 233 8.67409e-05
-2 496 233 108 8.67409e-05
-2 496 234 233 8.67409e-05
-3 496 234 233 108 8.67409e-05
-1 316 273 8.67492e-05
-2 412 316 273 8.67492e-05
-1 524 273 8.67492e-05
-2 524 316 273 8.67492e-05
-2 524 412 273 8.67492e-05
-3 524 412 316 273 8.67492e-05
-2 709 193 26 8.67649e-05
-2 709 193 162 8.67649e-05
-3 709 193 162 26 8.67649e-05
-1 462 442 8.68232e-05
-2 464 462 442 8.68232e-05
-1 595 442 8.68232e-05
-2 595 462 442 8.68232e-05
-2 595 464 442 8.68232e-05
-3 595 464 462 442 8.68232e-05
-1 370 205 8.71465e-05
-2 370 353 205 8.71465e-05
-1 372 205 8.71465e-05
-2 372 353 205 8.71465e-05
-2 372 370 205 8.71465e-05
-3 372 370 353 205 8.71465e-05
-2 365 213 80 8.72568e-05
-3 365 257 213 80 8.72568e-05
-1 627 561 8.73692e-05
-2 627 561 189 8.73692e-05
-2 627 561 512 8.73692e-05
-3 627 561 512 189 8.73692e-05
-1 505 290 8.74592e-05
-2 505 316 290 8.74592e-05
-1 506 290 8.74592e-05
-2 506 316 290 8.74592e-05
-2 506 505 290 8.74592e-05
-3 506 505 316 290 8.74592e-05
-1 759 588 8.76247e-05
-1 760 588 8.76247e-05
-2 760 759 588 8.76247e-05
-1 761 588 8.76247e-05
-2 761 759 588 8.76247e-05
-2 761 760 588 8.76247e-05
-3 761 760 759 588 8.76247e-05
-0 787 8.77002e-05
-1 787 48 8.77002e-05
-1 787 618 8.77002e-05
-2 787 618 48 8.77002e-05
-0 788 8.77002e-05
-1 788 48 8.77002e-05
-1 788 618 8.77002e-05
-2 788 618 48 8.77002e-05
-1 788 787 8.77002e-05
-2 788 787 48 8.77002e-05
-2 788 787 618 8.77002e-05
-3 788 787 618 48 8.77002e-05
-2 690 627 561 8.77048e-05
-3 690 627 561 512 8.77048e-05
-1 543 90 8.7767e-05
-1 564 90 8.7767e-05
-2 564 543 90 8.7767e-05
-1 772 90 8.7767e-05
-2 772 543 90 8.7767e-05
-1 772 564 8.7767e-05
-2 772 564 90 8.7767e-05
-2 772 564 543 8.7767e-05
-3 772 564 543 90 8.7767e-05
-1 316 272 8.79809e-05
-2 316 273 272 8.79809e-05
-1 524 272 8.79809e-05
-2 524 273 272 8.79809e-05
-2 524 316 272 8.79809e-05
-3 524 316 273 272 8.79809e-05
-0 789 8.79967e-05
-1 789 94 8.79967e-05
-0 790 8.79967e-05
-1 790 94 8.79967e-05
-1 790 789 8.79967e-05
-2 790 789 94 8.79967e-05
-0 791 8.79967e-05
-1 791 94 8.79967e-05
-1 791 789 8.79967e-05
-2 791 789 94 8.79967e-05
-1 791 790 8.79967e-05
-2 791 790 94 8.79967e-05
-2 791 790 789 8.79967e-05
-3 791 790 789 94 8.79967e-05
-2 614 204 202 8.80866e-05
-1 771 202 8.80866e-05
-2 771 204 202 8.80866e-05
-2 771 614 202 8.80866e-05
-3 771 614 204 202 8.80866e-05
-1 552 229 8.80923e-05
-1 552 231 8.80923e-05
-2 552 231 229 8.80923e-05
-1 703 231 8.80923e-05
-2 703 231 229 8.80923e-05
-2 703 552 229 8.80923e-05
-2 703 552 231 8.80923e-05
-3 703 552 231 229 8.80923e-05
-1 630 426 8.81051e-05
-2 630 555 426 8.81051e-05
-2 630 556 426 8.81051e-05
-3 630 556 555 426 8.81051e-05
-1 413 345 8.83823e-05
-2 413 345 295 8.83823e-05
-2 413 412 345 8.83823e-05
-3 413 412 345 295 8.83823e-05
-0 792 8.84607e-05
-1 792 527 8.84607e-05
-1 792 528 8.84607e-05
-2 792 528 527 8.84607e-05
-1 792 627 8.84607e-05
-2 792 627 527 8.84607e-05
-2 792 627 528 8.84607e-05
-3 792 627 528 527 8.84607e-05
-1 583 89 8.85278e-05
-1 583 158 8.85278e-05
-2 583 158 89 8.85278e-05
-1 772 89 8.85278e-05
-1 772 158 8.85278e-05
-2 772 158 89 8.85278e-05
-2 772 583 89 8.85278e-05
-2 772 583 158 8.85278e-05
-3 772 583 158 89 8.85278e-05
-1 686 590 8.85496e-05
-2 686 590 589 8.85496e-05
-2 686 592 590 8.85496e-05
-3 686 592 590 589 8.85496e-05
-1 759 587 8.85587e-05
-1 761 587 8.85587e-05
-2 761 759 587 8.85587e-05
-0 793 8.85587e-05
-1 793 587 8.85587e-05
-1 793 759 8.85587e-05
-2 793 759 587 8.85587e-05
-1 793 761 8.85587e-05
-2 793 761 587 8.85587e-05
-2 793 761 759 8.85587e-05
-3 793 761 759 587 8.85587e-05
-1 413 273 8.85719e-05
-2 413 344 273 8.85719e-05
-2 413 412 273 8.85719e-05
-3 413 412 344 273 8.85719e-05
-0 794 8.87165e-05
-1 794 451 8.87165e-05
-1 794 729 8.87165e-05
-2 794 729 451 8.87165e-05
-1 794 730 8.87165e-05
-2 794 730 451 8.87165e-05
-2 794 730 729 8.87165e-05
-3 794 730 729 451 8.87165e-05
-1 590 205 8.87218e-05
-1 674 205 8.87218e-05
-2 674 590 205 8.87218e-05
-1 746 205 8.87218e-05
-2 746 590 205 8.87218e-05
-2 746 674 205 8.87218e-05
-3 746 674 590 205 8.87218e-05
-1 537 376 8.87277e-05
-2 537 376 373 8.87277e-05
-2 537 376 375 8.87277e-05
-3 537 376 375 373 8.87277e-05
-1 289 148 8.87573e-05
-2 289 159 148 8.87573e-05
-2 290 289 148 8.87573e-05
-3 290 289 159 148 8.87573e-05
-1 288 159 8.87838e-05
-2 288 159 146 8.87838e-05
-2 289 288 159 8.87838e-05
-3 289 288 159 146 8.87838e-05
-2 772 90 89 8.87944e-05
-2 772 158 90 8.87944e-05
-3 772 158 90 89 8.87944e-05
-2 711 275 274 8.88612e-05
-2 711 391 274 8.88612e-05
-3 711 391 275 274 8.88612e-05
-0 795 8.88749e-05
-1 795 393 8.88749e-05
-0 796 8.88749e-05
-1 796 393 8.88749e-05
-1 796 795 8.88749e-05
-2 796 795 393 8.88749e-05
-0 797 8.88749e-05
-1 797 393 8.88749e-05
-1 797 795 8.88749e-05
-2 797 795 393 8.88749e-05
-1 797 796 8.88749e-05
-2 797 796 393 8.88749e-05
-2 797 796 795 8.88749e-05
-3 797 796 795 393 8.88749e-05
-1 591 205 8.88957e-05
-2 591 353 205 8.88957e-05
-2 591 370 205 8.88957e-05
-3 591 370 353 205 8.88957e-05
-0 798 8.89451e-05
-1 798 241 8.89451e-05
-1 798 242 8.89451e-05
-2 798 242 241 8.89451e-05
-1 798 243 8.89451e-05
-2 798 243 241 8.89451e-05
-2 798 243 242 8.89451e-05
-3 798 243 242 241 8.89451e-05
-1 548 128 8.89684e-05
-1 548 129 8.89684e-05
-2 548 129 128 8.89684e-05
-1 548 459 8.89684e-05
-2 548 459 128 8.89684e-05
-2 548 459 129 8.89684e-05
-3 548 459 129 128 8.89684e-05
-1 681 191 8.89981e-05
-2 681 191 190 8.89981e-05
-2 682 681 191 8.89981e-05
-3 682 681 191 190 8.89981e-05
-2 756 508 332 8.91853e-05
-3 756 508 378 332 8.91853e-05
-1 692 72 8.93786e-05
-2 692 73 72 8.93786e-05
-2 692 74 72 8.93786e-05
-3 692 74 73 72 8.93786e-05
-2 511 450 326 8.96133e-05
-3 560 511 450 326 8.96133e-05
-1 597 178 8.98387e-05
-1 597 520 8.98387e-05
-2 597 520 178 8.98387e-05
-1 598 178 8.98387e-05
-1 598 520 8.98387e-05
-2 598 520 178 8.98387e-05
-2 598 597 178 8.98387e-05
-2 598 597 520 8.98387e-05
-3 598 597 520 178 8.98387e-05
-2 566 164 91 9.01234e-05
-3 566 269 164 91 9.01234e-05
-0 799 9.01787e-05
-1 799 246 9.01787e-05
-1 799 734 9.01787e-05
-2 799 734 246 9.01787e-05
-0 800 9.01787e-05
-1 800 246 9.01787e-05
-1 800 734 9.01787e-05
-2 800 734 246 9.01787e-05
-1 800 799 9.01787e-05
-2 800 799 246 9.01787e-05
-2 800 799 734 9.01787e-05
-3 800 799 734 246 9.01787e-05
-1 674 203 9.02279e-05
-2 674 205 203 9.02279e-05
-1 746 203 9.02279e-05
-2 746 205 203 9.02279e-05
-2 746 674 203 9.02279e-05
-3 746 674 205 203 9.02279e-05
-2 627 561 526 9.02429e-05
-2 627 561 528 9.02429e-05
-3 627 561 528 526 9.02429e-05
-1 542 231 9.03071e-05
-2 542 232 231 9.03071e-05
-2 543 542 231 9.03071e-05
-3 543 542 232 231 9.03071e-05
-0 801 9.03765e-05
-1 801 449 9.03765e-05
-1 801 597 9.03765e-05
-2 801 597 449 9.03765e-05
-0 802 9.03765e-05
-1 802 449 9.03765e-05
-1 802 597 9.03765e-05
-2 802 597 449 9.03765e-05
-1 802 801 9.03765e-05
-2 802 801 449 9.03765e-05
-2 802 801 597 9.03765e-05
-3 802 801 597 449 9.03765e-05
-2 692 75 72 9.03912e-05
-3 692 75 74 72 9.03912e-05
-1 739 467 9.04146e-05
-2 739 467 346 9.04146e-05
-1 739 636 9.04146e-05
-2 739 636 346 9.04146e-05
-2 739 636 467 9.04146e-05
-3 739 636 467 346 9.04146e-05
-2 590 370 205 9.04594e-05
-2 591 590 205 9.04594e-05
-3 591 590 370 205 9.04594e-05
-1 305 187 9.04964e-05
-2 305 187 185 9.04964e-05
-2 305 187 186 9.04964e-05
-3 305 187 186 185 9.04964e-05
-1 584 572 9.05481e-05
-2 584 572 417 9.05481e-05
-2 584 573 572 9.05481e-05
-3 584 573 572 417 9.05481e-05
-2 418 129 28 9.05865e-05
-2 624 129 28 9.05865e-05
-3 624 418 129 28 9.05865e-05
-1 452 327 9.06196e-05
-2 452 450 327 9.06196e-05
-1 593 452 9.06196e-05
-2 593 452 327 9.06196e-05
-2 593 452 450 9.06196e-05
-3 593 452 450 327 9.06196e-05
-1 401 320 9.08212e-05
-2 401 320 84 9.08212e-05
-2 401 400 320 9.08212e-05
-3 401 400 320 84 9.08212e-05
-1 175 90 9.08854e-05
-2 175 164 90 9.08854e-05
-1 259 90 9.08854e-05
-2 259 164 90 9.08854e-05
-2 259 175 90 9.08854e-05
-3 259 175 164 90 9.08854e-05
-1 161 34 9.09127e-05
-2 161 42 34 9.09127e-05
-2 161 52 34 9.09127e-05
-3 161 52 42 34 9.09127e-05
-2 739 636 347 9.09184e-05
-3 739 636 347 346 9.09184e-05
-1 394 151 9.09962e-05
-1 394 152 9.09962e-05
-2 394 152 151 9.09962e-05
-1 642 152 9.09962e-05
-2 642 152 151 9.09962e-05
-1 642 394 9.09962e-05
-2 642 394 151 9.09962e-05
-2 642 394 152 9.09962e-05
-3 642 394 152 151 9.09962e-05
-2 346 91 89 9.11507e-05
-3 346 92 91 89 9.11507e-05
-1 699 153 9.12107e-05
-1 701 153 9.12107e-05
-2 701 699 153 9.12107e-05
-0 803 9.12107e-05
-1 803 153 9.12107e-05
-1 803 699 9.12107e-05
-2 803 699 153 9.12107e-05
-1 803 701 9.12107e-05
-2 803 701 153 9.12107e-05
-2 803 701 699 9.12107e-05
-3 803 701 699 153 9.12107e-05
-1 505 273 9.12697e-05
-2 505 316 273 9.12697e-05
-2 505 412 273 9.12697e-05
-3 505 412 316 273 9.12697e-05
-1 175 91 9.13874e-05
-2 175 164 91 9.13874e-05
-2 566 175 91 9.13874e-05
-3 566 175 164 91 9.13874e-05
-1 611 143 9.14558e-05
-2 611 183 143 9.14558e-05
-1 637 611 9.14558e-05
-2 637 611 143 9.14558e-05
-2 637 611 183 9.14558e-05
-3 637 611 183 143 9.14558e-05
-1 651 572 9.14588e-05
-2 651 572 414 9.14588e-05
-1 707 414 9.14588e-05
-1 707 572 9.14588e-05
-2 707 572 414 9.14588e-05
-1 707 651 9.14588e-05
-2 707 651 414 9.14588e-05
-2 707 651 572 9.14588e-05
-3 707 651 572 414 9.14588e-05
-1 470 345 9.14918e-05
-2 470 368 345 9.14918e-05
-2 470 412 345 9.14918e-05
-3 470 412 368 345 9.14918e-05
-1 635 219 9.15667e-05
-2 635 479 219 9.15667e-05
-2 635 536 219 9.15667e-05
-3 635 536 479 219 9.15667e-05
-0 804 9.16074e-05
-1 804 715 9.16074e-05
-0 805 9.16074e-05
-1 805 715 9.16074e-05
-1 805 804 9.16074e-05
-2 805 804 715 9.16074e-05
-0 806 9.16074e-05
-1 806 715 9.16074e-05
-1 806 804 9.16074e-05
-2 806 804 715 9.16074e-05
-1 806 805 9.16074e-05
-2 806 805 715 9.16074e-05
-2 806 805 804 9.16074e-05
-3 806 805 804 715 9.16074e-05
-1 681 616 9.18142e-05
-0 807 9.18142e-05
-1 807 616 9.18142e-05
-1 807 681 9.18142e-05
-2 807 681 616 9.18142e-05
-0 808 9.18142e-05
-1 808 616 9.18142e-05
-1 808 681 9.18142e-05
-2 808 681 616 9.18142e-05
-1 808 807 9.18142e-05
-2 808 807 616 9.18142e-05
-2 808 807 681 9.18142e-05
-3 808 807 681 616 9.18142e-05
-1 339 335 9.19768e-05
-2 339 335 261 9.19768e-05
-1 341 335 9.19768e-05
-2 341 335 261 9.19768e-05
-2 341 339 335 9.19768e-05
-3 341 339 335 261 9.19768e-05
-1 588 180 9.19813e-05
-1 588 320 9.19813e-05
-2 588 320 180 9.19813e-05
-2 588 405 180 9.19813e-05
-2 588 405 320 9.19813e-05
-3 588 405 320 180 9.19813e-05
-1 771 441 9.20546e-05
-2 771 441 202 9.20546e-05
-2 771 614 441 9.20546e-05
-3 771 614 441 202 9.20546e-05
-1 383 49 9.20656e-05
-2 383 51 49 9.20656e-05
-2 755 383 49 9.20656e-05
-3 755 383 51 49 9.20656e-05
-2 630 556 130 9.20671e-05
-1 684 630 9.20671e-05
-2 684 630 130 9.20671e-05
-2 684 630 556 9.20671e-05
-3 684 630 556 130 9.20671e-05
-1 675 564 9.21914e-05
-2 675 564 105 9.21914e-05
-2 703 675 564 9.21914e-05
-3 703 675 564 105 9.21914e-05
-1 180 33 9.22028e-05
-2 180 84 33 9.22028e-05
-2 400 180 33 9.22028e-05
-3 400 180 84 33 9.22028e-05
-1 597 107 9.2321e-05
-2 597 178 107 9.2321e-05
-2 597 520 107 9.2321e-05
-3 597 520 178 107 9.2321e-05
-1 519 377 9.25784e-05
-2 519 377 296 9.25784e-05
-2 519 377 297 9.25784e-05
-3 519 377 297 296 9.25784e-05
-1 687 423 9.26237e-05
-2 687 423 127 9.26237e-05
-2 687 423 160 9.26237e-05
-3 687 423 160 127 9.26237e-05
-1 666 279 9.26243e-05
-2 666 430 279 9.26243e-05
-0 809 9.26243e-05
-1 809 279 9.26243e-05
-1 809 430 9.26243e-05
-2 809 430 279 9.26243e-05
-1 809 666 9.26243e-05
-2 809 666 279 9.26243e-05
-2 809 666 430 9.26243e-05
-3 809 666 430 279 9.26243e-05
-1 293 39 9.2909e-05
-2 293 103 39 9.2909e-05
-2 293 154 39 9.2909e-05
-3 293 154 103 39 9.2909e-05
-1 431 428 9.30204e-05
-2 541 431 428 9.30204e-05
-1 558 428 9.30204e-05
-2 558 431 428 9.30204e-05
-2 558 541 428 9.30204e-05
-3 558 541 431 428 9.30204e-05
-2 383 382 49 9.30433e-05
-3 383 382 51 49 9.30433e-05
-1 555 249 9.37837e-05
-2 555 249 246 9.37837e-05
-2 555 249 247 9.37837e-05
-3 555 249 247 246 9.37837e-05
-2 175 91 90 9.38146e-05
-3 175 164 91 90 9.38146e-05
-1 590 372 9.3891e-05
-2 590 372 205 9.3891e-05
-2 590 372 370 9.3891e-05
-3 590 372 370 205 9.3891e-05
-1 123 60 9.38971e-05
-2 123 61 60 9.38971e-05
-2 123 119 60 9.38971e-05
-3 123 119 61 60 9.38971e-05
-2 211 159 146 9.42991e-05
-2 288 211 159 9.42991e-05
-3 288 211 159 146 9.42991e-05
-1 428 298 9.43522e-05
-2 428 298 214 9.43522e-05
-2 541 428 298 9.43522e-05
-3 541 428 298 214 9.43522e-05
-2 519 377 273 9.43839e-05
-3 519 377 296 273 9.43839e-05
-2 519 505 412 9.4497e-05
-3 519 505 412 345 9.4497e-05
-0 810 9.45506e-05
-1 810 186 9.45506e-05
-1 810 187 9.45506e-05
-2 810 187 186 9.45506e-05
-1 810 305 9.45506e-05
-2 810 305 186 9.45506e-05
-2 810 305 187 9.45506e-05
-3 810 305 187 186 9.45506e-05
-1 669 153 9.47573e-05
-2 669 153 151 9.47573e-05
-1 803 151 9.47573e-05
-2 803 153 151 9.47573e-05
-1 803 669 9.47573e-05
-2 803 669 151 9.47573e-05
-2 803 669 153 9.47573e-05
-3 803 669 153 151 9.47573e-05
-2 519 505 273 9.48353e-05
-3 519 505 412 273 9.48353e-05
-1 394 150 9.49298e-05
-2 394 152 150 9.49298e-05
-1 661 152 9.49298e-05
-2 661 152 150 9.49298e-05
-1 661 394 9.49298e-05
-2 661 394 150 9.49298e-05
-2 661 394 152 9.49298e-05
-3 661 394 152 150 9.49298e-05
-1 384 49 9.49329e-05
-2 384 382 49 9.49329e-05
-1 475 384 9.49329e-05
-2 475 384 49 9.49329e-05
-2 475 384 382 9.49329e-05
-3 475 384 382 49 9.49329e-05
-2 298 226 177 9.50466e-05
-3 298 226 225 177 9.50466e-05
-1 514 315 9.5138e-05
-2 514 315 314 9.5138e-05
-2 514 513 315 9.5138e-05
-3 514 513 315 314 9.5138e-05
-1 638 416 9.51423e-05
-1 701 638 9.51423e-05
-2 701 638 416 9.51423e-05
-1 754 416 9.51423e-05
-2 754 638 416 9.51423e-05
-1 754 701 9.51423e-05
-2 754 701 416 9.51423e-05
-2 754 701 638 9.51423e-05
-3 754 701 638 416 9.51423e-05
-2 454 84 33 9.51515e-05
-3 454 84 58 33 9.51515e-05
-1 360 300 9.51991e-05
-1 360 302 9.51991e-05
-2 360 302 300 9.51991e-05
-1 360 303 9.51991e-05
-2 360 303 300 9.51991e-05
-2 360 303 302 9.51991e-05
-3 360 303 302 300 9.51991e-05
-2 233 108 105 9.52276e-05
-3 233 108 106 105 9.52276e-05
-1 739 560 9.54463e-05
-2 739 560 467 9.54463e-05
-2 739 565 467 9.54463e-05
-2 739 565 560 9.54463e-05
-3 739 565 560 467 9.54463e-05
-1 205 67 9.54911e-05
-2 353 205 67 9.54911e-05
-2 372 205 67 9.54911e-05
-3 372 353 205 67 9.54911e-05
-1 565 452 9.56089e-05
-2 593 565 452 9.56089e-05
-1 785 452 9.56089e-05
-2 785 565 452 9.56089e-05
-2 785 593 452 9.56089e-05
-3 785 593 565 452 9.56089e-05
-1 434 188 9.58089e-05
-2 434 188 135 9.58089e-05
-1 435 188 9.58089e-05
-2 435 188 135 9.58089e-05
-2 435 434 188 9.58089e-05
-3 435 434 188 135 9.58089e-05
-1 217 187 9.58122e-05
-2 217 187 184 9.58122e-05
-2 217 187 185 9.58122e-05
-3 217 187 185 184 9.58122e-05
-1 585 416 9.58354e-05
-2 585 417 416 9.58354e-05
-2 638 417 416 9.58354e-05
-2 638 585 416 9.58354e-05
-3 638 585 417 416 9.58354e-05
-1 785 450 9.614e-05
-2 785 452 450 9.614e-05
-2 785 593 450 9.614e-05
-3 785 593 452 450 9.614e-05
-1 424 249 9.6292e-05
-2 424 249 247 9.6292e-05
-2 555 424 249 9.6292e-05
-3 555 424 249 247 9.6292e-05
-1 418 162 9.63443e-05
-2 418 162 25 9.63443e-05
-2 709 418 162 9.63443e-05
-3 709 418 162 25 9.63443e-05
-1 323 88 9.63482e-05
-2 323 114 88 9.63482e-05
-1 325 88 9.63482e-05
-1 325 114 9.63482e-05
-2 325 114 88 9.63482e-05
-2 325 323 88 9.63482e-05
-2 325 323 114 9.63482e-05
-3 325 323 114 88 9.63482e-05
-1 674 353 9.63988e-05
-2 674 353 203 9.63988e-05
-2 674 353 205 9.63988e-05
-3 674 353 205 203 9.63988e-05
-1 521 198 9.66307e-05
-1 737 198 9.66307e-05
-1 737 521 9.66307e-05
-2 737 521 198 9.66307e-05
-0 811 9.66307e-05
-1 811 198 9.66307e-05
-1 811 521 9.66307e-05
-2 811 521 198 9.66307e-05
-1 811 737 9.66307e-05
-2 811 737 198 9.66307e-05
-2 811 737 521 9.66307e-05
-3 811 737 521 198 9.66307e-05
-1 574 416 9.67541e-05
-2 574 417 416 9.67541e-05
-2 585 574 416 9.67541e-05
-3 585 574 417 416 9.67541e-05
-2 418 129 25 9.68155e-05
-3 418 129 28 25 9.68155e-05
-1 693 518 9.68648e-05
-2 693 518 516 9.68648e-05
-0 812 9.68648e-05
-1 812 516 9.68648e-05
-1 812 518 9.68648e-05
-2 812 518 516 9.68648e-05
-1 812 693 9.68648e-05
-2 812 693 516 9.68648e-05
-2 812 693 518 9.68648e-05
-3 812 693 518 516 9.68648e-05
-1 499 411 9.69421e-05
-0 813 9.69421e-05
-1 813 411 9.69421e-05
-1 813 499 9.69421e-05
-2 813 499 411 9.69421e-05
-0 814 9.69421e-05
-1 814 411 9.69421e-05
-1 814 499 9.69421e-05
-2 814 499 411 9.69421e-05
-1 814 813 9.69421e-05
-2 814 813 411 9.69421e-05
-2 814 813 499 9.69421e-05
-3 814 813 499 411 9.69421e-05
-1 52 37 9.69536e-05
-2 52 37 35 9.69536e-05
-2 52 41 37 9.69536e-05
-3 52 41 37 35 9.69536e-05
-2 642 395 394 9.70362e-05
-1 642 396 9.70362e-05
-2 642 396 394 9.70362e-05
-2 642 396 395 9.70362e-05
-3 642 396 395 394 9.70362e-05
-1 641 328 9.71473e-05
-2 641 328 294 9.71473e-05
-2 641 519 328 9.71473e-05
-3 641 519 328 294 9.71473e-05
-1 642 150 9.71523e-05
-2 642 151 150 9.71523e-05
-2 642 152 150 9.71523e-05
-3 642 152 151 150 9.71523e-05
-2 574 572 416 9.7294e-05
-3 574 572 417 416 9.7294e-05
-2 771 203 202 9.73219e-05
-3 771 204 203 202 9.73219e-05
-0 815 9.73865e-05
-1 815 589 9.73865e-05
-1 815 590 9.73865e-05
-2 815 590 589 9.73865e-05
-1 815 591 9.73865e-05
-2 815 591 589 9.73865e-05
-2 815 591 590 9.73865e-05
-3 815 591 590 589 9.73865e-05
-1 634 338 9.77181e-05
-2 634 338 337 9.77181e-05
-2 634 343 338 9.77181e-05
-3 634 343 338 337 9.77181e-05
-2 552 259 90 9.77532e-05
-3 552 259 164 90 9.77532e-05
-1 528 189 9.7832e-05
-2 528 511 189 9.7832e-05
-2 561 528 189 9.7832e-05
-3 561 528 511 189 9.7832e-05
-1 567 462 9.80027e-05
-1 567 465 9.80027e-05
-2 567 465 462 9.80027e-05
-1 568 465 9.80027e-05
-2 568 465 462 9.80027e-05
-2 568 567 462 9.80027e-05
-2 568 567 465 9.80027e-05
-3 568 567 465 462 9.80027e-05
-2 684 630 128 9.81e-05
-3 684 630 130 128 9.81e-05
-1 328 295 9.82205e-05
-2 328 295 294 9.82205e-05
-2 345 328 295 9.82205e-05
-3 345 328 295 294 9.82205e-05
-2 684 630 426 9.82383e-05
-3 684 630 556 426 9.82383e-05
-1 771 353 9.8332e-05
-2 771 353 202 9.8332e-05
-2 771 441 353 9.8332e-05
-3 771 441 353 202 9.8332e-05
-0 816 9.8407e-05
-1 816 260 9.8407e-05
-1 816 261 9.8407e-05
-2 816 261 260 9.8407e-05
-1 816 262 9.8407e-05
-2 816 262 260 9.8407e-05
-2 816 262 261 9.8407e-05
-3 816 262 261 260 9.8407e-05
-0 817 9.84638e-05
-1 817 547 9.84638e-05
-0 818 9.84638e-05
-1 818 547 9.84638e-05
-1 818 817 9.84638e-05
-2 818 817 547 9.84638e-05
-0 819 9.84638e-05
-1 819 547 9.84638e-05
-1 819 817 9.84638e-05
-2 819 817 547 9.84638e-05
-1 819 818 9.84638e-05
-2 819 818 547 9.84638e-05
-2 819 818 817 9.84638e-05
-3 819 818 817 547 9.84638e-05
-2 258 160 52 9.86804e-05
-1 687 52 9.86804e-05
-2 687 160 52 9.86804e-05
-2 687 258 52 9.86804e-05
-3 687 258 160 52 9.86804e-05
-1 365 118 9.87224e-05
-2 365 121 118 9.87224e-05
-2 406 365 118 9.87224e-05
-3 406 365 121 118 9.87224e-05
-0 820 9.8741e-05
-1 820 758 9.8741e-05
-1 820 759 9.8741e-05
-2 820 759 758 9.8741e-05
-1 820 760 9.8741e-05
-2 820 760 758 9.8741e-05
-2 820 760 759 9.8741e-05
-3 820 760 759 758 9.8741e-05
-1 754 153 9.89589e-05
-2 754 701 153 9.89589e-05
-1 803 754 9.89589e-05
-2 803 754 153 9.89589e-05
-2 803 754 701 9.89589e-05
-3 803 754 701 153 9.89589e-05
-1 385 21 9.91105e-05
-2 385 22 21 9.91105e-05
-2 385 116 21 9.91105e-05
-3 385 116 22 21 9.91105e-05
-2 627 528 189 9.92156e-05
-3 627 561 528 189 9.92156e-05
-2 384 383 49 9.92497e-05
-3 384 383 382 49 9.92497e-05
-1 467 452 9.92757e-05
-2 565 467 452 9.92757e-05
-2 593 467 452 9.92757e-05
-3 593 565 467 452 9.92757e-05
-0 821 9.92865e-05
-1 821 229 9.92865e-05
-1 821 231 9.92865e-05
-2 821 231 229 9.92865e-05
-1 821 552 9.92865e-05
-2 821 552 229 9.92865e-05
-2 821 552 231 9.92865e-05
-3 821 552 231 229 9.92865e-05
-1 290 272 9.9288e-05
-2 524 290 272 9.9288e-05
-0 822 9.9288e-05
-1 822 272 9.9288e-05
-1 822 290 9.9288e-05
-2 822 290 272 9.9288e-05
-1 822 524 9.9288e-05
-2 822 524 272 9.9288e-05
-2 822 524 290 9.9288e-05
-3 822 524 290 272 9.9288e-05
-1 552 174 9.9333e-05
-2 552 259 174 9.9333e-05
-2 552 461 174 9.9333e-05
-3 552 461 259 174 9.9333e-05
-1 244 227 9.94055e-05
-2 244 227 169 9.94055e-05
-2 349 244 227 9.94055e-05
-3 349 244 227 169 9.94055e-05
-1 687 126 9.94131e-05
-2 687 127 126 9.94131e-05
-2 687 423 126 9.94131e-05
-3 687 423 127 126 9.94131e-05
-1 564 552 9.94409e-05
-2 564 552 229 9.94409e-05
-2 703 564 552 9.94409e-05
-3 703 564 552 229 9.94409e-05
-1 361 302 9.95315e-05
-1 692 302 9.95315e-05
-2 692 361 302 9.95315e-05
-1 719 302 9.95315e-05
-2 719 361 302 9.95315e-05
-2 719 692 302 9.95315e-05
-3 719 692 361 302 9.95315e-05
-1 588 84 9.96061e-05
-2 588 180 84 9.96061e-05
-2 588 320 84 9.96061e-05
-3 588 320 180 84 9.96061e-05
-1 423 52 9.96574e-05
-2 423 52 42 9.96574e-05
-2 423 160 52 9.96574e-05
-3 423 160 52 42 9.96574e-05
-1 611 398 9.97426e-05
-1 612 398 9.97426e-05
-2 612 611 398 9.97426e-05
-1 637 398 9.97426e-05
-2 637 611 398 9.97426e-05
-1 637 612 9.97426e-05
-2 637 612 398 9.97426e-05
-2 637 612 611 9.97426e-05
-3 637 612 611 398 9.97426e-05
-1 640 52 0.000100008
-2 640 52 35 0.000100008
-2 640 258 52 0.000100008
-3 640 258 52 35 0.000100008
-2 642 394 150 0.000100082
-3 642 394 152 150 0.000100082
-1 675 90 0.000100096
-2 675 252 90 0.000100096
-2 703 675 90 0.000100096
-3 703 675 252 90 0.000100096
-1 674 591 0.00010017
-2 674 591 205 0.00010017
-2 674 591 590 0.00010017
-3 674 591 590 205 0.00010017
-0 823 0.000100646
-1 823 625 0.000100646
-1 823 662 0.000100646
-2 823 662 625 0.000100646
-1 823 663 0.000100646
-2 823 663 625 0.000100646
-2 823 663 662 0.000100646
-3 823 663 662 625 0.000100646
-1 231 105 0.000100799
-2 231 106 105 0.000100799
-2 231 229 105 0.000100799
-3 231 229 106 105 0.000100799
-1 675 165 0.000100827
-2 675 252 165 0.000100827
-1 675 269 0.000100827
-2 675 269 165 0.000100827
-2 675 269 252 0.000100827
-3 675 269 252 165 0.000100827
-1 511 453 0.0001012
-2 511 453 450 0.0001012
-1 528 453 0.0001012
-2 528 453 450 0.0001012
-2 528 511 453 0.0001012
-3 528 511 453 450 0.0001012
-0 824 0.000101207
-1 824 767 0.000101207
-1 824 768 0.000101207
-2 824 768 767 0.000101207
-0 825 0.000101207
-1 825 767 0.000101207
-1 825 768 0.000101207
-2 825 768 767 0.000101207
-1 825 824 0.000101207
-2 825 824 767 0.000101207
-2 825 824 768 0.000101207
-3 825 824 768 767 0.000101207
-1 816 263 0.000101262
-2 816 263 260 0.000101262
-0 826 0.000101262
-1 826 260 0.000101262
-1 826 263 0.000101262
-2 826 263 260 0.000101262
-1 826 816 0.000101262
-2 826 816 260 0.000101262
-2 826 816 263 0.000101262
-3 826 816 263 260 0.000101262
-2 511 453 326 0.000101343
-3 511 453 450 326 0.000101343
-1 254 151 0.00010136
-2 460 254 151 0.00010136
-2 642 254 151 0.00010136
-2 642 460 254 0.00010136
-3 642 460 254 151 0.00010136
-2 467 452 327 0.000101382
-3 593 467 452 327 0.000101382
-2 537 376 44 0.000101412
-3 537 376 373 44 0.000101412
-1 163 27 0.000101438
-2 163 27 25 0.000101438
-2 163 162 27 0.000101438
-3 163 162 27 25 0.000101438
-2 675 564 90 0.00010153
-2 703 564 90 0.00010153
-3 703 675 564 90 0.00010153
-1 342 203 0.000101568
-1 563 203 0.000101568
-2 563 342 203 0.000101568
-2 614 342 203 0.000101568
-2 614 563 203 0.000101568
-3 614 563 342 203 0.000101568
-0 827 0.000101741
-1 827 426 0.000101741
-1 827 630 0.000101741
-2 827 630 426 0.000101741
-1 827 684 0.000101741
-2 827 684 426 0.000101741
-2 827 684 630 0.000101741
-3 827 684 630 426 0.000101741
-1 771 342 0.000101784
-1 771 343 0.000101784
-2 771 343 342 0.000101784
-2 771 614 342 0.000101784
-2 771 614 343 0.000101784
-3 771 614 343 342 0.000101784
-2 674 591 353 0.000101854
-3 674 591 353 205 0.000101854
-1 701 585 0.000102149
-2 701 585 416 0.000102149
-2 701 638 585 0.000102149
-3 701 638 585 416 0.000102149
-2 682 634 338 0.000102186
-3 682 634 338 337 0.000102186
-1 785 467 0.000102208
-2 785 467 452 0.000102208
-2 785 565 467 0.000102208
-3 785 565 467 452 0.000102208
-1 815 674 0.000102415
-2 815 674 590 0.000102415
-2 815 674 591 0.000102415
-3 815 674 591 590 0.000102415
-1 589 477 0.000102555
-2 590 589 477 0.000102555
-1 686 477 0.000102555
-2 686 589 477 0.000102555
-2 686 590 477 0.000102555
-3 686 590 589 477 0.000102555
-1 815 477 0.000102991
-2 815 590 477 0.000102991
-2 815 674 477 0.000102991
-3 815 674 590 477 0.000102991
-1 434 292 0.000103002
-1 435 292 0.000103002
-2 435 434 292 0.000103002
-2 490 434 292 0.000103002
-2 490 435 292 0.000103002
-3 490 435 434 292 0.000103002
-1 744 532 0.000103011
-2 745 744 532 0.000103011
-1 763 744 0.000103011
-2 763 744 532 0.000103011
-2 763 745 744 0.000103011
-3 763 745 744 532 0.000103011
-1 675 91 0.000103056
-2 675 91 90 0.000103056
-1 675 158 0.000103056
-2 675 158 90 0.000103056
-2 675 158 91 0.000103056
-3 675 158 91 90 0.000103056
-1 822 148 0.000103165
-2 822 290 148 0.000103165
-2 822 524 148 0.000103165
-3 822 524 290 148 0.000103165
-0 828 0.000103197
-1 828 231 0.000103197
-1 828 821 0.000103197
-2 828 821 231 0.000103197
-0 829 0.000103197
-1 829 231 0.000103197
-1 829 821 0.000103197
-2 829 821 231 0.000103197
-1 829 828 0.000103197
-2 829 828 231 0.000103197
-2 829 828 821 0.000103197
-3 829 828 821 231 0.000103197
-0 830 0.000103228
-1 830 112 0.000103228
-0 831 0.000103228
-1 831 112 0.000103228
-1 831 830 0.000103228
-2 831 830 112 0.000103228
-0 832 0.000103228
-1 832 112 0.000103228
-1 832 830 0.000103228
-2 832 830 112 0.000103228
-1 832 831 0.000103228
-2 832 831 112 0.000103228
-2 832 831 830 0.000103228
-3 832 831 830 112 0.000103228
-0 833 0.000103621
-1 833 606 0.000103621
-1 833 694 0.000103621
-2 833 694 606 0.000103621
-1 833 695 0.000103621
-2 833 695 606 0.000103621
-2 833 695 694 0.000103621
-3 833 695 694 606 0.000103621
-1 423 332 0.000103622
-2 423 332 124 0.000103622
-2 508 423 332 0.000103622
-3 508 423 332 124 0.000103622
-1 541 225 0.000103841
-2 541 227 225 0.000103841
-2 541 298 225 0.000103841
-3 541 298 227 225 0.000103841
-1 566 90 0.0001039
-2 566 91 90 0.0001039
-2 566 175 90 0.0001039
-3 566 175 91 90 0.0001039
-1 694 385 0.000103938
-2 694 385 21 0.000103938
-2 694 385 116 0.000103938
-3 694 385 116 21 0.000103938
-1 718 198 0.000104172
-2 718 199 198 0.000104172
-1 718 200 0.000104172
-2 718 200 198 0.000104172
-2 718 200 199 0.000104172
-3 718 200 199 198 0.000104172
-1 719 568 0.000104234
-1 719 594 0.000104234
-2 719 594 568 0.000104234
-2 719 600 568 0.000104234
-2 719 600 594 0.000104234
-3 719 600 594 568 0.000104234
-1 591 441 0.00010424
-2 591 441 66 0.00010424
-2 591 441 353 0.00010424
-3 591 441 353 66 0.00010424
-2 815 589 477 0.000104278
-3 815 590 589 477 0.000104278
-1 792 569 0.000104321
-2 792 569 527 0.000104321
-2 792 627 569 0.000104321
-3 792 627 569 527 0.000104321
-2 640 52 37 0.000104356
-3 640 52 37 35 0.000104356
-2 675 564 106 0.000104445
-3 675 564 106 105 0.000104445
-2 617 338 48 0.000104572
-3 617 338 49 48 0.000104572
-1 252 91 0.000104629
-2 252 91 90 0.000104629
-2 269 252 91 0.000104629
-3 269 252 91 90 0.000104629
-1 711 270 0.000104725
-2 711 274 270 0.000104725
-2 711 275 270 0.000104725
-3 711 275 274 270 0.000104725
-1 528 326 0.000104914
-2 528 453 326 0.000104914
-2 528 511 326 0.000104914
-3 528 511 453 326 0.000104914
-1 821 564 0.000104966
-2 821 564 229 0.000104966
-2 821 564 552 0.000104966
-3 821 564 552 229 0.000104966
-2 434 292 188 0.000105103
-2 435 292 188 0.000105103
-3 435 434 292 188 0.000105103
-1 494 328 0.000105148
-2 494 432 328 0.000105148
-2 495 494 328 0.000105148
-3 495 494 432 328 0.000105148
-1 137 29 0.00010519
-2 137 30 29 0.00010519
-2 137 55 29 0.00010519
-3 137 55 30 29 0.00010519
-1 721 516 0.000105193
-2 721 656 516 0.000105193
-1 721 693 0.000105193
-2 721 693 516 0.000105193
-2 721 693 656 0.000105193
-3 721 693 656 516 0.000105193
-1 688 629 0.00010527
-1 708 629 0.00010527
-1 708 688 0.00010527
-2 708 688 629 0.00010527
-1 709 629 0.00010527
-1 709 688 0.00010527
-2 709 688 629 0.00010527
-2 709 708 629 0.00010527
-2 709 708 688 0.00010527
-3 709 708 688 629 0.00010527
-1 824 781 0.000105299
-1 824 783 0.000105299
-2 824 783 781 0.000105299
-1 824 784 0.000105299
-2 824 784 781 0.000105299
-2 824 784 783 0.000105299
-3 824 784 783 781 0.000105299
-1 540 59 0.000105368
-2 540 61 59 0.000105368
-2 540 399 59 0.000105368
-3 540 399 61 59 0.000105368
-1 617 342 0.000105496
-2 617 342 338 0.000105496
-2 617 343 342 0.000105496
-3 617 343 342 338 0.000105496
-1 711 658 0.000105503
-2 711 658 557 0.000105503
-1 762 557 0.000105503
-2 762 658 557 0.000105503
-1 762 711 0.000105503
-2 762 711 557 0.000105503
-2 762 711 658 0.000105503
-3 762 711 658 557 0.000105503
-2 692 361 72 0.000105552
-3 692 361 75 72 0.000105552
-1 625 24 0.000105594
-2 625 212 24 0.000105594
-1 650 24 0.000105594
-2 650 212 24 0.000105594
-2 650 625 24 0.000105594
-3 650 625 212 24 0.000105594
-2 675 252 91 0.00010578
-3 675 252 91 90 0.00010578
-1 434 288 0.000105816
-2 434 292 288 0.000105816
-2 490 434 288 0.000105816
-3 490 434 292 288 0.000105816
-1 332 126 0.000105831
-2 332 126 124 0.000105831
-2 423 332 126 0.000105831
-3 423 332 126 124 0.000105831
-1 694 212 0.000105839
-2 694 212 21 0.000105839
-1 778 212 0.000105839
-2 778 212 21 0.000105839
-2 778 694 212 0.000105839
-3 778 694 212 21 0.000105839
-2 675 269 91 0.000105855
-3 675 269 252 91 0.000105855
-1 797 715 0.000106013
-0 834 0.000106013
-1 834 715 0.000106013
-1 834 797 0.000106013
-2 834 797 715 0.000106013
-0 835 0.000106013
-1 835 715 0.000106013
-1 835 797 0.000106013
-2 835 797 715 0.000106013
-1 835 834 0.000106013
-2 835 834 715 0.000106013
-2 835 834 797 0.000106013
-3 835 834 797 715 0.000106013
-1 815 545 0.000106144
-2 815 545 477 0.000106144
-2 815 674 545 0.000106144
-3 815 674 545 477 0.000106144
-1 305 217 0.000106233
-2 305 217 185 0.000106233
-2 305 217 187 0.000106233
-3 305 217 187 185 0.000106233
-1 478 103 0.000106293
-2 478 189 103 0.000106293
-2 478 293 103 0.000106293
-3 478 293 189 103 0.000106293
-1 397 134 0.000106399
-2 397 255 134 0.000106399
-2 539 397 134 0.000106399
-3 539 397 255 134 0.000106399
-1 477 281 0.000106522
-2 477 284 281 0.000106522
-2 544 477 281 0.000106522
-3 544 477 284 281 0.000106522
-0 836 0.000106702
-1 836 165 0.000106702
-1 836 269 0.000106702
-2 836 269 165 0.000106702
-1 836 675 0.000106702
-2 836 675 165 0.000106702
-2 836 675 269 0.000106702
-3 836 675 269 165 0.000106702
-1 486 280 0.000106711
-2 731 486 280 0.000106711
-1 733 280 0.000106711
-2 733 486 280 0.000106711
-2 733 731 280 0.000106711
-3 733 731 486 280 0.000106711
-1 709 129 0.000106717
-2 709 418 129 0.000106717
-2 709 629 129 0.000106717
-2 709 629 418 0.000106717
-3 709 629 418 129 0.000106717
-1 675 206 0.00010673
-2 675 206 91 0.00010673
-2 675 206 158 0.00010673
-3 675 206 158 91 0.00010673
-1 677 518 0.000106856
-2 677 518 515 0.000106856
-2 677 518 517 0.000106856
-3 677 518 517 515 0.000106856
-1 822 289 0.000106945
-2 822 289 148 0.000106945
-2 822 290 289 0.000106945
-3 822 290 289 148 0.000106945
-1 506 148 0.000106949
-2 506 290 148 0.000106949
-2 506 316 148 0.000106949
-3 506 316 290 148 0.000106949
-1 592 371 0.000107156
-1 599 371 0.000107156
-2 599 592 371 0.000107156
-1 686 371 0.000107156
-2 686 592 371 0.000107156
-2 686 599 371 0.000107156
-3 686 599 592 371 0.000107156
-0 837 0.000107159
-1 837 622 0.000107159
-0 838 0.000107159
-1 838 622 0.000107159
-1 838 837 0.000107159
-2 838 837 622 0.000107159
-0 839 0.000107159
-1 839 622 0.000107159
-1 839 837 0.000107159
-2 839 837 622 0.000107159
-1 839 838 0.000107159
-2 839 838 622 0.000107159
-2 839 838 837 0.000107159
-3 839 838 837 622 0.000107159
-0 840 0.000107166
-1 840 804 0.000107166
-0 841 0.000107166
-1 841 804 0.000107166
-1 841 840 0.000107166
-2 841 840 804 0.000107166
-0 842 0.000107166
-1 842 804 0.000107166
-1 842 840 0.000107166
-2 842 840 804 0.000107166
-1 842 841 0.000107166
-2 842 841 804 0.000107166
-2 842 841 840 0.000107166
-3 842 841 840 804 0.000107166
-0 843 0.000107173
-1 843 515 0.000107173
-1 843 676 0.000107173
-2 843 676 515 0.000107173
-0 844 0.000107173
-1 844 515 0.000107173
-1 844 676 0.000107173
-2 844 676 515 0.000107173
-1 844 843 0.000107173
-2 844 843 515 0.000107173
-2 844 843 676 0.000107173
-3 844 843 676 515 0.000107173
-1 106 90 0.000107221
-2 564 106 90 0.000107221
-2 675 106 90 0.000107221
-3 675 564 106 90 0.000107221
-1 723 73 0.000107221
-2 723 458 73 0.000107221
-1 723 692 0.000107221
-2 723 692 73 0.000107221
-2 723 692 458 0.000107221
-3 723 692 458 73 0.000107221
-1 400 14 0.000107366
-2 400 14 13 0.000107366
-2 400 57 14 0.000107366
-3 400 57 14 13 0.000107366
-1 754 585 0.000107414
-2 754 638 585 0.000107414
-2 754 639 585 0.000107414
-3 754 639 638 585 0.000107414
-2 754 701 585 0.000107421
-3 754 701 638 585 0.000107421
-0 845 0.000107625
-1 845 107 0.000107625
-1 845 496 0.000107625
-2 845 496 107 0.000107625
-1 845 520 0.000107625
-2 845 520 107 0.000107625
-2 845 520 496 0.000107625
-3 845 520 496 107 0.000107625
-1 628 151 0.000107669
-2 628 460 151 0.000107669
-1 669 628 0.000107669
-2 669 628 151 0.000107669
-2 669 628 460 0.000107669
-3 669 628 460 151 0.000107669
-1 692 594 0.000107697
-2 692 600 594 0.000107697
-0 846 0.000107697
-1 846 594 0.000107697
-1 846 600 0.000107697
-2 846 600 594 0.000107697
-1 846 692 0.000107697
-2 846 692 594 0.000107697
-2 846 692 600 0.000107697
-3 846 692 600 594 0.000107697
-1 770 359 0.000107775
-2 770 363 359 0.000107775
-2 770 604 359 0.000107775
-3 770 604 363 359 0.000107775
-1 428 225 0.000107955
-2 428 225 214 0.000107955
-2 428 298 225 0.000107955
-3 428 298 225 214 0.000107955
-1 269 206 0.000108147
-2 269 206 91 0.000108147
-1 836 91 0.000108147
-1 836 206 0.000108147
-2 836 206 91 0.000108147
-2 836 269 91 0.000108147
-2 836 269 206 0.000108147
-3 836 269 206 91 0.000108147
-1 776 758 0.000108157
-0 847 0.000108157
-1 847 758 0.000108157
-1 847 776 0.000108157
-2 847 776 758 0.000108157
-0 848 0.000108157
-1 848 758 0.000108157
-1 848 776 0.000108157
-2 848 776 758 0.000108157
-1 848 847 0.000108157
-2 848 847 758 0.000108157
-2 848 847 776 0.000108157
-3 848 847 776 758 0.000108157
-1 701 639 0.000108252
-2 701 639 585 0.000108252
-2 754 701 639 0.000108252
-3 754 701 639 585 0.000108252
-1 558 63 0.000108313
-2 558 428 63 0.000108313
-2 558 541 63 0.000108313
-3 558 541 428 63 0.000108313
-1 505 272 0.000108319
-2 505 273 272 0.000108319
-2 505 316 272 0.000108319
-3 505 316 273 272 0.000108319
-2 771 353 203 0.000108328
-3 771 353 203 202 0.000108328
-1 233 158 0.00010851
-2 583 233 158 0.00010851
-2 772 233 158 0.00010851
-3 772 583 233 158 0.00010851
-1 771 591 0.000108558
-2 771 591 353 0.000108558
-2 771 591 441 0.000108558
-3 771 591 441 353 0.000108558
-1 432 428 0.000108595
-2 432 431 428 0.000108595
-2 558 432 428 0.000108595
-3 558 432 431 428 0.000108595
-1 223 52 0.000108595
-1 258 223 0.000108595
-2 258 223 52 0.000108595
-1 640 223 0.000108595
-2 640 223 52 0.000108595
-2 640 258 223 0.000108595
-3 640 258 223 52 0.000108595
-1 845 702 0.000108648
-2 845 702 107 0.000108648
-2 845 702 496 0.000108648
-3 845 702 496 107 0.000108648
-1 514 313 0.000108849
-2 514 315 313 0.000108849
-2 514 513 313 0.000108849
-3 514 513 315 313 0.000108849
-1 611 145 0.000108918
-2 611 145 143 0.000108918
-2 611 183 145 0.000108918
-3 611 183 145 143 0.000108918
-1 845 234 0.000108932
-2 845 496 234 0.000108932
-2 845 702 234 0.000108932
-3 845 702 496 234 0.000108932
-1 640 162 0.000108944
-2 640 162 37 0.000108944
-1 640 193 0.000108944
-2 640 193 37 0.000108944
-2 640 193 162 0.000108944
-3 640 193 162 37 0.000108944
-1 379 143 0.000108965
-2 379 145 143 0.000108965
-1 686 145 0.000108965
-2 686 145 143 0.000108965
-1 686 379 0.000108965
-2 686 379 143 0.000108965
-2 686 379 145 0.000108965
-3 686 379 145 143 0.000108965
-1 501 107 0.000108973
-2 520 501 107 0.000108973
-1 845 501 0.000108973
-2 845 501 107 0.000108973
-2 845 520 501 0.000108973
-3 845 520 501 107 0.000108973
-1 695 212 0.000109346
-2 695 694 212 0.000109346
-1 778 695 0.000109346
-2 778 695 212 0.000109346
-2 778 695 694 0.000109346
-3 778 695 694 212 0.000109346
-1 749 557 0.000109346
-2 749 658 557 0.000109346
-2 762 749 557 0.000109346
-3 762 749 658 557 0.000109346
-1 658 388 0.000109349
-2 658 388 387 0.000109349
-2 658 557 388 0.000109349
-3 658 557 388 387 0.000109349
-2 231 107 105 0.000109427
-3 231 107 106 105 0.000109427
-2 385 23 21 0.00010961
-3 385 23 22 21 0.00010961
-1 626 417 0.000109777
-2 626 417 415 0.000109777
-2 626 417 416 0.000109777
-3 626 417 416 415 0.000109777
-1 687 223 0.000109795
-2 687 223 52 0.000109795
-2 687 258 223 0.000109795
-3 687 258 223 52 0.000109795
-1 233 90 0.00010982
-2 543 233 90 0.00010982
-2 772 233 90 0.00010982
-3 772 543 233 90 0.00010982
-1 712 304 0.000110039
-1 712 504 0.000110039
-2 712 504 304 0.000110039
-1 712 628 0.000110039
-2 712 628 304 0.000110039
-2 712 628 504 0.000110039
-3 712 628 504 304 0.000110039
-2 470 413 345 0.000110065
-3 470 413 412 345 0.000110065
-2 564 233 90 0.000110143
-3 564 543 233 90 0.000110143
-1 640 41 0.000110274
-2 640 41 37 0.000110274
-2 640 162 41 0.000110274
-3 640 162 41 37 0.000110274
-0 849 0.000110314
-1 849 44 0.000110314
-1 849 373 0.000110314
-2 849 373 44 0.000110314
-1 849 747 0.000110314
-2 849 747 44 0.000110314
-2 849 747 373 0.000110314
-3 849 747 373 44 0.000110314
-2 233 106 90 0.000110376
-3 564 233 106 90 0.000110376
-2 699 663 153 0.000110455
-1 701 663 0.000110455
-2 701 663 153 0.000110455
-2 701 699 663 0.000110455
-3 701 699 663 153 0.000110455
-1 700 664 0.000110458
-2 700 664 416 0.000110458
-2 700 665 416 0.000110458
-2 700 665 664 0.000110458
-3 700 665 664 416 0.000110458
-1 621 419 0.000110547
-1 838 419 0.000110547
-1 838 621 0.000110547
-2 838 621 419 0.000110547
-0 850 0.000110547
-1 850 419 0.000110547
-1 850 621 0.000110547
-2 850 621 419 0.000110547
-1 850 838 0.000110547
-2 850 838 419 0.000110547
-2 850 838 621 0.000110547
-3 850 838 621 419 0.000110547
-1 701 665 0.000110682
-2 701 699 665 0.000110682
-2 701 700 665 0.000110682
-3 701 700 699 665 0.000110682
-1 771 674 0.000111089
-2 771 674 591 0.000111089
-1 815 771 0.000111089
-2 815 771 591 0.000111089
-2 815 771 674 0.000111089
-3 815 771 674 591 0.000111089
-2 701 665 663 0.0001113
-3 701 699 665 663 0.0001113
-1 620 136 0.000111354
-2 620 539 136 0.000111354
-2 620 606 136 0.000111354
-3 620 606 539 136 0.000111354
-1 754 700 0.000111373
-2 754 700 416 0.000111373
-2 754 701 700 0.000111373
-3 754 701 700 416 0.000111373
-1 736 456 0.000111552
-0 851 0.000111552
-1 851 456 0.000111552
-1 851 736 0.000111552
-2 851 736 456 0.000111552
-0 852 0.000111552
-1 852 456 0.000111552
-1 852 736 0.000111552
-2 852 736 456 0.000111552
-1 852 851 0.000111552
-2 852 851 456 0.000111552
-2 852 851 736 0.000111552
-3 852 851 736 456 0.000111552
-2 836 675 91 0.000111774
-2 836 675 206 0.000111774
-3 836 675 206 91 0.000111774
-1 722 385 0.000111899
-2 722 385 98 0.000111899
-2 722 385 275 0.000111899
-3 722 385 275 98 0.000111899
-2 703 231 105 0.000112014
-3 703 231 229 105 0.000112014
-1 825 571 0.000112124
-1 825 757 0.000112124
-2 825 757 571 0.000112124
-0 853 0.000112124
-1 853 571 0.000112124
-1 853 757 0.000112124
-2 853 757 571 0.000112124
-1 853 825 0.000112124
-2 853 825 571 0.000112124
-2 853 825 757 0.000112124
-3 853 825 757 571 0.000112124
-2 233 158 90 0.000112279
-3 772 233 158 90 0.000112279
-1 374 314 0.000112598
-2 375 374 314 0.000112598
-1 514 374 0.000112598
-2 514 374 314 0.000112598
-2 514 375 374 0.000112598
-3 514 375 374 314 0.000112598
-2 739 269 206 0.000112762
-3 739 269 206 91 0.000112762
-2 771 342 203 0.00011277
-3 771 614 342 203 0.00011277
-1 688 130 0.000112927
-2 688 556 130 0.000112927
-2 688 630 130 0.000112927
-3 688 630 556 130 0.000112927
-1 817 666 0.000112943
-1 817 667 0.000112943
-2 817 667 666 0.000112943
-0 854 0.000112943
-1 854 666 0.000112943
-1 854 667 0.000112943
-2 854 667 666 0.000112943
-1 854 817 0.000112943
-2 854 817 666 0.000112943
-2 854 817 667 0.000112943
-3 854 817 667 666 0.000112943
-1 689 556 0.000113074
-2 689 556 555 0.000113074
-2 689 688 556 0.000113074
-3 689 688 556 555 0.000113074
-1 434 133 0.000113091
-2 434 135 133 0.000113091
-2 434 188 133 0.000113091
-3 434 188 135 133 0.000113091
-1 374 315 0.000113364
-2 374 315 314 0.000113364
-2 514 374 315 0.000113364
-3 514 374 315 314 0.000113364
-1 375 315 0.000113408
-2 375 315 314 0.000113408
-2 375 374 315 0.000113408
-3 375 374 315 314 0.000113408
-1 495 226 0.000113437
-2 495 298 226 0.000113437
-2 495 349 226 0.000113437
-3 495 349 298 226 0.000113437
-1 568 301 0.000113515
-1 594 301 0.000113515
-2 594 568 301 0.000113515
-1 719 301 0.000113515
-2 719 568 301 0.000113515
-2 719 594 301 0.000113515
-3 719 594 568 301 0.000113515
-3 836 675 269 91 0.00011363
-2 739 636 560 0.000113744
-3 739 636 560 467 0.000113744
-1 538 136 0.000113878
-2 539 538 136 0.000113878
-1 620 538 0.000113878
-2 620 538 136 0.000113878
-2 620 539 538 0.000113878
-3 620 539 538 136 0.000113878
-1 634 49 0.000114007
-2 634 338 49 0.000114007
-2 682 634 49 0.000114007
-3 682 634 338 49 0.000114007
-1 685 313 0.000114009
-2 685 367 313 0.000114009
-2 685 513 313 0.000114009
-3 685 513 367 313 0.000114009
-2 735 705 443 0.000114036
-2 735 705 683 0.000114036
-3 735 705 683 443 0.000114036
-1 601 16 0.000114037
-2 601 18 16 0.000114037
-2 601 571 16 0.000114037
-3 601 571 18 16 0.000114037
-1 789 527 0.000114045
-1 789 569 0.000114045
-2 789 569 527 0.000114045
-1 789 741 0.000114045
-2 789 741 527 0.000114045
-2 789 741 569 0.000114045
-3 789 741 569 527 0.000114045
-1 520 234 0.000114376
-2 520 496 234 0.000114376
-2 845 520 234 0.000114376
-3 845 520 496 234 0.000114376
-0 855 0.000114513
-1 855 830 0.000114513
-1 855 832 0.000114513
-2 855 832 830 0.000114513
-0 856 0.000114513
-1 856 830 0.000114513
-1 856 832 0.000114513
-2 856 832 830 0.000114513
-1 856 855 0.000114513
-2 856 855 830 0.000114513
-2 856 855 832 0.000114513
-3 856 855 832 830 0.000114513
-1 754 665 0.00011452
-2 754 700 665 0.00011452
-2 754 701 665 0.00011452
-3 754 701 700 665 0.00011452
-2 634 343 49 0.00011457
-3 634 343 338 49 0.00011457
-2 316 290 272 0.000114738
-3 524 316 290 272 0.000114738
-2 754 665 416 0.000114749
-3 754 700 665 416 0.000114749
-2 771 674 203 0.00011481
-2 771 674 353 0.00011481
-3 771 674 353 203 0.00011481
-1 365 119 0.000114922
-2 365 119 118 0.000114922
-2 365 121 119 0.000114922
-3 365 121 119 118 0.000114922
-2 640 52 41 0.000115014
-3 640 52 41 37 0.000115014
-1 418 131 0.000115029
-2 418 131 25 0.000115029
-2 418 131 129 0.000115029
-3 418 131 129 25 0.000115029
-1 258 161 0.000115134
-2 258 161 52 0.000115134
-2 258 161 160 0.000115134
-3 258 161 160 52 0.000115134
-1 661 642 0.00011517
-2 661 642 150 0.00011517
-2 661 642 394 0.00011517
-3 661 642 394 150 0.00011517
-1 336 262 0.00011539
-2 336 262 261 0.00011539
-2 336 263 262 0.00011539
-3 336 263 262 261 0.00011539
-1 665 638 0.00011574
-2 665 638 416 0.00011574
-2 754 665 638 0.00011574
-3 754 665 638 416 0.00011574
-1 387 245 0.000115908
-2 388 387 245 0.000115908
-2 389 387 245 0.000115908
-3 389 388 387 245 0.000115908
-0 857 0.000116216
-1 857 571 0.000116216
-1 857 757 0.000116216
-2 857 757 571 0.000116216
-1 857 853 0.000116216
-2 857 853 571 0.000116216
-2 857 853 757 0.000116216
-3 857 853 757 571 0.000116216
-2 340 262 261 0.000116381
-1 816 340 0.000116381
-2 816 340 261 0.000116381
-2 816 340 262 0.000116381
-3 816 340 262 261 0.000116381
-0 858 0.00011663
-1 858 617 0.00011663
-1 858 618 0.00011663
-2 858 618 617 0.00011663
-1 858 619 0.00011663
-2 858 619 617 0.00011663
-2 858 619 618 0.00011663
-3 858 619 618 617 0.00011663
-1 318 13 0.000116701
-2 318 13 12 0.000116701
-2 318 14 12 0.000116701
-2 318 14 13 0.000116701
-3 318 14 13 12 0.000116701
-1 292 159 0.000116704
-2 292 211 159 0.000116704
-2 292 291 159 0.000116704
-2 292 291 211 0.000116704
-3 292 291 211 159 0.000116704
-1 325 86 0.000116823
-1 535 86 0.000116823
-2 535 325 86 0.000116823
-1 740 325 0.000116823
-2 740 325 86 0.000116823
-1 740 535 0.000116823
-2 740 535 86 0.000116823
-2 740 535 325 0.000116823
-3 740 535 325 86 0.000116823
-1 765 322 0.000117051
-1 765 324 0.000117051
-2 765 324 322 0.000117051
-0 859 0.000117051
-1 859 322 0.000117051
-1 859 324 0.000117051
-2 859 324 322 0.000117051
-1 859 765 0.000117051
-2 859 765 322 0.000117051
-2 859 765 324 0.000117051
-3 859 765 324 322 0.000117051
-1 158 106 0.000117108
-2 233 158 106 0.000117108
-2 675 158 106 0.000117108
-2 675 233 158 0.000117108
-3 675 233 158 106 0.000117108
-1 606 135 0.000117111
-2 606 136 135 0.000117111
-2 606 434 135 0.000117111
-3 606 434 136 135 0.000117111
-1 441 343 0.000117114
-2 614 441 343 0.000117114
-2 771 441 343 0.000117114
-3 771 614 441 343 0.000117114
-1 722 23 0.000117172
-2 722 98 23 0.000117172
-2 722 385 23 0.000117172
-3 722 385 98 23 0.000117172
-1 352 273 0.000117213
-2 505 352 273 0.000117213
-2 519 352 273 0.000117213
-3 519 505 352 273 0.000117213
-1 659 551 0.00011725
-1 839 551 0.00011725
-1 839 659 0.00011725
-2 839 659 551 0.00011725
-0 860 0.00011725
-1 860 551 0.00011725
-1 860 659 0.00011725
-2 860 659 551 0.00011725
-1 860 839 0.00011725
-2 860 839 551 0.00011725
-2 860 839 659 0.00011725
-3 860 839 659 551 0.00011725
-2 158 106 90 0.000117447
-3 675 158 106 90 0.000117447
-3 233 158 106 90 0.000117458
-2 318 317 13 0.000117666
-3 318 317 13 12 0.000117666
-1 375 316 0.000117701
-2 375 316 314 0.000117701
-2 524 375 316 0.000117701
-3 524 375 316 314 0.000117701
-2 163 34 27 0.00011777
-3 163 162 34 27 0.00011777
-2 375 316 315 0.000117783
-3 375 316 315 314 0.000117783
-2 634 441 343 0.00011794
-3 634 614 441 343 0.00011794
-2 685 514 313 0.000118043
-3 685 514 513 313 0.000118043
-2 688 630 629 0.000118318
-1 708 630 0.000118318
-2 708 630 629 0.000118318
-2 708 688 630 0.000118318
-3 708 688 630 629 0.000118318
-1 746 477 0.000118346
-2 746 477 476 0.000118346
-2 746 590 477 0.000118346
-3 746 590 477 476 0.000118346
-1 658 245 0.00011836
-2 658 387 245 0.00011836
-2 658 388 245 0.00011836
-3 658 388 387 245 0.00011836
-1 558 298 0.000118442
-2 558 494 298 0.000118442
-2 558 541 298 0.000118442
-3 558 541 494 298 0.000118442
-1 550 128 0.000118457
-2 550 548 128 0.000118457
-0 861 0.000118457
-1 861 128 0.000118457
-1 861 548 0.000118457
-2 861 548 128 0.000118457
-1 861 550 0.000118457
-2 861 550 128 0.000118457
-2 861 550 548 0.000118457
-3 861 550 548 128 0.000118457
-2 541 428 225 0.000118702
-3 541 428 298 225 0.000118702
-1 392 317 0.000118838
-2 392 354 317 0.000118838
-2 392 355 317 0.000118838
-3 392 355 354 317 0.000118838
-1 694 23 0.000118888
-2 694 23 21 0.000118888
-2 694 385 23 0.000118888
-3 694 385 23 21 0.000118888
-1 403 271 0.000119097
-2 485 403 271 0.000119097
-2 493 403 271 0.000119097
-3 493 485 403 271 0.000119097
-1 658 389 0.000119195
-2 658 389 245 0.000119195
-2 658 389 387 0.000119195
-3 658 389 387 245 0.000119195
-1 606 133 0.000119559
-2 606 135 133 0.000119559
-2 606 136 133 0.000119559
-3 606 136 135 133 0.000119559
-1 729 528 0.000119603
-1 729 627 0.000119603
-2 729 627 528 0.000119603
-1 792 729 0.000119603
-2 792 729 528 0.000119603
-2 792 729 627 0.000119603
-3 792 729 627 528 0.000119603
-2 606 434 133 0.000119702
-3 606 434 135 133 0.000119702
-1 558 177 0.000119736
-2 558 298 177 0.000119736
-2 558 541 177 0.000119736
-3 558 541 298 177 0.000119736
-1 484 67 0.00011977
-2 484 67 64 0.00011977
-2 484 398 67 0.00011977
-3 484 398 67 64 0.00011977
-1 428 2 0.000119816
-2 428 2 1 0.000119816
-2 428 63 2 0.000119816
-3 428 63 2 1 0.000119816
-1 709 130 0.00011984
-2 709 130 129 0.00011984
-2 709 629 130 0.00011984
-3 709 629 130 129 0.00011984
-1 489 318 0.00011988
-2 489 487 318 0.00011988
-1 577 489 0.00011988
-2 577 489 318 0.00011988
-2 577 489 487 0.00011988
-3 577 489 487 318 0.00011988
-1 513 469 0.000120012
-2 513 469 141 0.000120012
-2 513 469 367 0.000120012
-3 513 469 367 141 0.000120012
-1 799 236 0.000120176
-1 799 237 0.000120176
-2 799 237 236 0.000120176
-1 799 492 0.000120176
-2 799 492 236 0.000120176
-2 799 492 237 0.000120176
-3 799 492 237 236 0.000120176
-1 494 177 0.000120181
-2 494 298 177 0.000120181
-2 558 494 177 0.000120181
-3 558 494 298 177 0.000120181
-1 638 626 0.000120218
-2 638 626 416 0.000120218
-2 665 638 626 0.000120218
-3 665 638 626 416 0.000120218
-1 465 445 0.000120332
-2 465 445 442 0.000120332
-2 465 445 443 0.000120332
-3 465 445 443 442 0.000120332
-1 800 247 0.000120677
-2 800 247 246 0.000120677
-2 800 734 247 0.000120677
-3 800 734 247 246 0.000120677
-1 589 545 0.000121031
-2 589 545 477 0.000121031
-2 815 589 545 0.000121031
-3 815 589 545 477 0.000121031
-1 620 134 0.000121333
-2 620 538 134 0.000121333
-2 620 539 134 0.000121333
-3 620 539 538 134 0.000121333
-0 862 0.000121375
-1 862 334 0.000121375
-1 862 756 0.000121375
-2 862 756 334 0.000121375
-0 863 0.000121375
-1 863 334 0.000121375
-1 863 756 0.000121375
-2 863 756 334 0.000121375
-1 863 862 0.000121375
-2 863 862 334 0.000121375
-2 863 862 756 0.000121375
-3 863 862 756 334 0.000121375
-1 618 446 0.000121411
-1 619 446 0.000121411
-2 619 618 446 0.000121411
-1 802 446 0.000121411
-1 802 618 0.000121411
-2 802 618 446 0.000121411
-1 802 619 0.000121411
-2 802 619 446 0.000121411
-2 802 619 618 0.000121411
-3 802 619 618 446 0.000121411
-1 216 209 0.000121484
-2 216 209 208 0.000121484
-1 268 209 0.000121484
-2 268 209 208 0.000121484
-2 268 216 209 0.000121484
-3 268 216 209 208 0.000121484
-1 319 14 0.000121517
-2 319 14 12 0.000121517
-2 319 318 14 0.000121517
-3 319 318 14 12 0.000121517
-1 489 355 0.000121548
-2 489 355 318 0.000121548
-2 489 487 355 0.000121548
-3 489 487 355 318 0.000121548
-2 469 141 139 0.000121854
-1 513 139 0.000121854
-2 513 141 139 0.000121854
-2 513 469 139 0.000121854
-3 513 469 141 139 0.000121854
-2 638 626 417 0.000122569
-3 638 626 417 416 0.000122569
-3 771 674 591 353 0.000122643
-1 581 76 0.000122686
-2 581 79 76 0.000122686
-1 706 76 0.000122686
-1 706 79 0.000122686
-2 706 79 76 0.000122686
-1 706 581 0.000122686
-2 706 581 76 0.000122686
-2 706 581 79 0.000122686
-3 706 581 79 76 0.000122686
-1 653 581 0.000122755
-1 706 653 0.000122755
-2 706 653 581 0.000122755
-1 773 581 0.000122755
-1 773 653 0.000122755
-2 773 653 581 0.000122755
-1 773 706 0.000122755
-2 773 706 581 0.000122755
-2 773 706 653 0.000122755
-3 773 706 653 581 0.000122755
-1 205 64 0.000122804
-2 205 67 64 0.000122804
-2 353 205 64 0.000122804
-3 353 205 67 64 0.000122804
-1 558 214 0.000122984
-2 558 214 63 0.000122984
-2 558 541 214 0.000122984
-3 558 541 214 63 0.000122984
-1 734 689 0.000123284
-2 734 689 555 0.000123284
-1 800 555 0.000123284
-1 800 689 0.000123284
-2 800 689 555 0.000123284
-2 800 734 555 0.000123284
-2 800 734 689 0.000123284
-3 800 734 689 555 0.000123284
-0 864 0.000123536
-1 864 87 0.000123536
-1 864 740 0.000123536
-2 864 740 87 0.000123536
-0 865 0.000123536
-1 865 87 0.000123536
-1 865 740 0.000123536
-2 865 740 87 0.000123536
-1 865 864 0.000123536
-2 865 864 87 0.000123536
-2 865 864 740 0.000123536
-3 865 864 740 87 0.000123536
-1 397 253 0.000123569
-2 397 253 134 0.000123569
-2 397 255 253 0.000123569
-3 397 255 253 134 0.000123569
-1 734 556 0.000123764
-2 734 556 247 0.000123764
-2 734 556 555 0.000123764
-3 734 556 555 247 0.000123764
-0 866 0.000123914
-1 866 545 0.000123914
-1 866 589 0.000123914
-2 866 589 545 0.000123914
-1 866 815 0.000123914
-2 866 815 545 0.000123914
-2 866 815 589 0.000123914
-3 866 815 589 545 0.000123914
-0 867 0.000124007
-1 867 165 0.000124007
-1 867 675 0.000124007
-2 867 675 165 0.000124007
-1 867 836 0.000124007
-2 867 836 165 0.000124007
-2 867 836 675 0.000124007
-3 867 836 675 165 0.000124007
-1 491 303 0.000124015
-1 765 303 0.000124015
-1 765 491 0.000124015
-2 765 491 303 0.000124015
-1 766 303 0.000124015
-1 766 491 0.000124015
-2 766 491 303 0.000124015
-2 766 765 303 0.000124015
-2 766 765 491 0.000124015
-3 766 765 491 303 0.000124015
-1 829 552 0.000124108
-2 829 552 231 0.000124108
-2 829 821 552 0.000124108
-3 829 821 552 231 0.000124108
-2 538 136 134 0.00012414
-2 620 136 134 0.00012414
-3 620 538 136 134 0.00012414
-2 453 452 327 0.000124148
-3 453 452 450 327 0.000124148
-2 620 397 134 0.000124447
-3 620 539 397 134 0.000124447
-1 534 33 0.00012451
-2 534 33 15 0.00012451
-2 534 454 33 0.00012451
-3 534 454 33 15 0.00012451
-2 558 214 177 0.000124592
-3 558 541 214 177 0.000124592
-1 304 215 0.000124641
-2 305 304 215 0.000124641
-2 628 304 215 0.000124641
-3 628 305 304 215 0.000124641
-1 441 370 0.000124809
-2 441 370 66 0.000124809
-2 591 441 370 0.000124809
-3 591 441 370 66 0.000124809
-1 396 255 0.000125016
-2 396 395 255 0.000125016
-2 397 396 255 0.000125016
-3 397 396 395 255 0.000125016
-1 754 663 0.000125242
-2 754 665 663 0.000125242
-2 754 701 663 0.000125242
-3 754 701 665 663 0.000125242
-1 787 51 0.000125405
-2 787 51 48 0.000125405
-1 787 755 0.000125405
-2 787 755 48 0.000125405
-2 787 755 51 0.000125405
-3 787 755 51 48 0.000125405
-1 821 230 0.000125731
-2 821 230 229 0.000125731
-2 821 564 230 0.000125731
-3 821 564 230 229 0.000125731
-1 708 130 0.000125806
-2 708 630 130 0.000125806
-2 708 688 130 0.000125806
-3 708 688 630 130 0.000125806
-1 800 556 0.000125816
-2 800 556 555 0.000125816
-2 800 689 556 0.000125816
-3 800 689 556 555 0.000125816
-0 868 0.000125892
-1 868 436 0.000125892
-1 868 437 0.000125892
-2 868 437 436 0.000125892
-0 869 0.000125892
-1 869 436 0.000125892
-1 869 437 0.000125892
-2 869 437 436 0.000125892
-1 869 868 0.000125892
-2 869 868 436 0.000125892
-2 869 868 437 0.000125892
-3 869 868 437 436 0.000125892
-1 661 396 0.000125995
-2 661 396 394 0.000125995
-2 661 642 396 0.000125995
-3 661 642 396 394 0.000125995
-0 870 0.000126117
-1 870 480 0.000126117
-1 870 482 0.000126117
-2 870 482 480 0.000126117
-0 871 0.000126117
-1 871 480 0.000126117
-1 871 482 0.000126117
-2 871 482 480 0.000126117
-1 871 870 0.000126117
-2 871 870 480 0.000126117
-2 871 870 482 0.000126117
-3 871 870 482 480 0.000126117
-0 872 0.000126125
-1 872 334 0.000126125
-1 872 862 0.000126125
-2 872 862 334 0.000126125
-1 872 863 0.000126125
-2 872 863 334 0.000126125
-2 872 863 862 0.000126125
-3 872 863 862 334 0.000126125
-1 365 81 0.000126188
-2 365 81 80 0.000126188
-2 365 213 81 0.000126188
-3 365 213 81 80 0.000126188
-0 873 0.000126242
-1 873 759 0.000126242
-1 873 793 0.000126242
-2 873 793 759 0.000126242
-0 874 0.000126242
-1 874 759 0.000126242
-1 874 793 0.000126242
-2 874 793 759 0.000126242
-1 874 873 0.000126242
-2 874 873 759 0.000126242
-2 874 873 793 0.000126242
-3 874 873 793 759 0.000126242
-1 800 688 0.000126381
-2 800 688 556 0.000126381
-2 800 689 688 0.000126381
-3 800 689 688 556 0.000126381
-2 708 629 130 0.000126418
-3 708 630 629 130 0.000126418
-1 596 526 0.000126593
-2 596 569 526 0.000126593
-2 627 596 526 0.000126593
-3 627 596 569 526 0.000126593
-2 258 161 34 0.000126712
-3 258 161 52 34 0.000126712
-1 474 469 0.000126933
-2 474 469 139 0.000126933
-2 474 469 140 0.000126933
-3 474 469 140 139 0.000126933
-2 292 288 159 0.000126944
-3 292 288 211 159 0.000126944
-1 628 153 0.000126955
-2 628 153 151 0.000126955
-2 669 628 153 0.000126955
-3 669 628 153 151 0.000126955
-2 800 734 556 0.000127112
-3 800 734 556 555 0.000127112
-0 875 0.000127509
-1 875 784 0.000127509
-0 876 0.000127509
-1 876 784 0.000127509
-1 876 875 0.000127509
-2 876 875 784 0.000127509
-0 877 0.000127509
-1 877 784 0.000127509
-1 877 875 0.000127509
-2 877 875 784 0.000127509
-1 877 876 0.000127509
-2 877 876 784 0.000127509
-2 877 876 875 0.000127509
-3 877 876 875 784 0.000127509
-1 872 756 0.000127549
-2 872 756 334 0.000127549
-0 878 0.000127549
-1 878 334 0.000127549
-1 878 756 0.000127549
-2 878 756 334 0.000127549
-1 878 872 0.000127549
-2 878 872 334 0.000127549
-2 878 872 756 0.000127549
-3 878 872 756 334 0.000127549
-1 313 141 0.00012764
-2 367 313 141 0.00012764
-2 368 313 141 0.00012764
-3 368 367 313 141 0.00012764
-1 685 315 0.000127643
-2 685 315 313 0.000127643
-2 685 514 315 0.000127643
-3 685 514 315 313 0.000127643
-2 754 663 153 0.000128119
-3 754 701 663 153 0.000128119
-2 465 462 442 0.000128293
-3 465 464 462 442 0.000128293
-2 872 862 756 0.000128356
-3 872 862 756 334 0.000128356
-1 755 192 0.000128452
-2 755 192 51 0.000128452
-2 755 382 192 0.000128452
-3 755 382 192 51 0.000128452
-1 243 23 0.000128542
-1 385 243 0.000128542
-2 385 243 23 0.000128542
-1 694 243 0.000128542
-2 694 243 23 0.000128542
-2 694 385 243 0.000128542
-3 694 385 243 23 0.000128542
-1 597 448 0.000128577
-2 597 448 447 0.000128577
-2 597 449 448 0.000128577
-3 597 449 448 447 0.000128577
-1 723 564 0.000128779
-2 723 564 552 0.000128779
-1 821 723 0.000128779
-2 821 723 552 0.000128779
-2 821 723 564 0.000128779
-3 821 723 564 552 0.000128779
-0 879 0.000128885
-1 879 263 0.000128885
-1 879 696 0.000128885
-2 879 696 263 0.000128885
-1 879 697 0.000128885
-2 879 697 263 0.000128885
-2 879 697 696 0.000128885
-3 879 697 696 263 0.000128885
-1 561 525 0.000128904
-2 561 526 525 0.000128904
-2 561 559 525 0.000128904
-3 561 559 526 525 0.000128904
-1 594 464 0.000128935
-2 595 594 464 0.000128935
-2 600 594 464 0.000128935
-3 600 595 594 464 0.000128935
-1 323 86 0.000128982
-2 325 323 86 0.000128982
-2 535 323 86 0.000128982
-3 535 325 323 86 0.000128982
-1 396 254 0.000129304
-2 396 395 254 0.000129304
-2 642 396 254 0.000129304
-3 642 396 395 254 0.000129304
-2 709 708 130 0.000129404
-3 709 708 629 130 0.000129404
-1 754 626 0.000129469
-2 754 638 626 0.000129469
-2 754 665 626 0.000129469
-3 754 665 638 626 0.000129469
-1 709 131 0.000129618
-2 709 131 129 0.000129618
-2 709 418 131 0.000129618
-3 709 418 131 129 0.000129618
-1 756 331 0.000129848
-2 756 332 331 0.000129848
-2 756 334 331 0.000129848
-3 756 334 332 331 0.000129848
-2 418 162 131 0.000130177
-3 418 162 131 25 0.000130177
-2 528 326 189 0.00013038
-3 528 511 326 189 0.00013038
-1 729 326 0.000130682
-2 729 453 326 0.000130682
-2 729 528 326 0.000130682
-2 729 528 453 0.000130682
-3 729 528 453 326 0.000130682
-1 710 162 0.000130824
-2 710 193 162 0.000130824
-1 710 640 0.000130824
-2 710 640 162 0.000130824
-2 710 640 193 0.000130824
-3 710 640 193 162 0.000130824
-2 323 88 86 0.000130866
-2 325 88 86 0.000130866
-3 325 323 88 86 0.000130866
-2 505 290 272 0.000130944
-3 505 316 290 272 0.000130944
-1 174 90 0.000130966
-2 175 174 90 0.000130966
-2 259 174 90 0.000130966
-2 259 175 174 0.000130966
-3 259 175 174 90 0.000130966
-1 703 107 0.000130984
-2 703 107 105 0.000130984
-2 703 231 107 0.000130984
-3 703 231 107 105 0.000130984
-1 347 269 0.000131366
-2 347 269 206 0.000131366
-2 739 347 269 0.000131366
-3 739 347 269 206 0.000131366
-1 180 13 0.000131409
-2 180 33 13 0.000131409
-2 400 180 13 0.000131409
-3 400 180 33 13 0.000131409
-1 755 236 0.000131422
-2 755 383 236 0.000131422
-1 775 755 0.000131422
-2 775 755 236 0.000131422
-2 775 755 383 0.000131422
-3 775 755 383 236 0.000131422
-2 258 161 125 0.000131458
-3 258 161 160 125 0.000131458
-2 665 663 626 0.000131496
-2 754 663 626 0.000131496
-3 754 665 663 626 0.000131496
-1 216 134 0.000131522
-2 216 188 134 0.000131522
-2 253 216 134 0.000131522
-3 253 216 188 134 0.000131522
-1 772 703 0.0001317
-2 772 703 90 0.0001317
-2 772 703 564 0.0001317
-3 772 703 564 90 0.0001317
-1 596 561 0.000132003
-2 627 596 561 0.000132003
-2 690 596 561 0.000132003
-3 690 627 596 561 0.000132003
-2 558 177 63 0.000132043
-3 558 214 177 63 0.000132043
-1 799 247 0.000132067
-2 799 247 246 0.000132067
-1 799 248 0.000132067
-2 799 248 246 0.000132067
-2 799 248 247 0.000132067
-3 799 248 247 246 0.000132067
-2 552 174 90 0.000132181
-3 552 259 174 90 0.000132181
-1 590 371 0.000132247
-2 590 371 370 0.000132247
-2 592 371 370 0.000132247
-2 592 590 371 0.000132247
-3 592 590 371 370 0.000132247
-1 396 253 0.000132655
-2 396 255 253 0.000132655
-2 397 396 253 0.000132655
-3 397 396 255 253 0.000132655
-1 803 628 0.000132743
-2 803 628 153 0.000132743
-2 803 669 628 0.000132743
-3 803 669 628 153 0.000132743
-1 584 304 0.000132754
-1 638 304 0.000132754
-2 638 584 304 0.000132754
-2 712 584 304 0.000132754
-2 712 638 304 0.000132754
-3 712 638 584 304 0.000132754
-0 880 0.000132767
-1 880 545 0.000132767
-1 880 589 0.000132767
-2 880 589 545 0.000132767
-1 880 866 0.000132767
-2 880 866 545 0.000132767
-2 880 866 589 0.000132767
-3 880 866 589 545 0.000132767
-1 408 398 0.000132779
-1 484 408 0.000132779
-2 484 408 398 0.000132779
-1 612 408 0.000132779
-2 612 408 398 0.000132779
-1 612 484 0.000132779
-2 612 484 398 0.000132779
-2 612 484 408 0.000132779
-3 612 484 408 398 0.000132779
-1 836 347 0.00013315
-2 836 347 206 0.00013315
-2 836 347 269 0.00013315
-3 836 347 269 206 0.00013315
-1 754 628 0.000133346
-1 754 669 0.000133346
-2 754 669 628 0.000133346
-2 803 754 628 0.000133346
-2 803 754 669 0.000133346
-3 803 754 669 628 0.000133346
-2 709 162 131 0.000133355
-3 709 418 162 131 0.000133355
-2 596 561 526 0.000133821
-3 627 596 561 526 0.000133821
-1 501 234 0.000133937
-2 520 501 234 0.000133937
-2 845 501 234 0.000133937
-3 845 520 501 234 0.000133937
-1 638 628 0.000133995
-2 638 628 304 0.000133995
-2 712 638 628 0.000133995
-3 712 638 628 304 0.000133995
-1 792 789 0.000134138
-2 792 789 527 0.000134138
-2 792 789 569 0.000134138
-3 792 789 569 527 0.000134138
-1 631 486 0.000134214
-1 732 631 0.000134214
-2 732 631 486 0.000134214
-1 733 631 0.000134214
-2 733 631 486 0.000134214
-2 733 732 631 0.000134214
-3 733 732 631 486 0.000134214
-1 657 510 0.000134319
-2 657 656 510 0.000134319
-1 660 510 0.000134319
-1 660 656 0.000134319
-2 660 656 510 0.000134319
-2 660 657 510 0.000134319
-2 660 657 656 0.000134319
-3 660 657 656 510 0.000134319
-2 694 212 23 0.000134381
-3 694 212 23 21 0.000134381
-1 799 775 0.000134481
-2 799 775 236 0.000134481
-2 799 775 237 0.000134481
-3 799 775 237 236 0.000134481
-2 709 131 130 0.000134549
-3 709 131 130 129 0.000134549
-1 826 786 0.000134681
-0 881 0.000134681
-1 881 786 0.000134681
-1 881 826 0.000134681
-2 881 826 786 0.000134681
-0 882 0.000134681
-1 882 786 0.000134681
-1 882 826 0.000134681
-2 882 826 786 0.000134681
-1 882 881 0.000134681
-2 882 881 786 0.000134681
-2 882 881 826 0.000134681
-3 882 881 826 786 0.000134681
-1 710 41 0.000134762
-2 710 162 41 0.000134762
-2 710 640 41 0.000134762
-3 710 640 162 41 0.000134762
-0 883 0.000134771
-1 883 571 0.000134771
-1 883 757 0.000134771
-2 883 757 571 0.000134771
-1 883 857 0.000134771
-2 883 857 571 0.000134771
-2 883 857 757 0.000134771
-3 883 857 757 571 0.000134771
-2 686 590 371 0.000134772
-3 686 592 590 371 0.000134772
-1 710 130 0.000134801
-2 710 708 130 0.000134801
-2 710 709 130 0.000134801
-3 710 709 708 130 0.000134801
-1 492 246 0.000134821
-1 492 248 0.000134821
-2 492 248 246 0.000134821
-2 799 492 246 0.000134821
-2 799 492 248 0.000134821
-3 799 492 248 246 0.000134821
-1 791 569 0.00013486
-1 791 741 0.00013486
-2 791 741 569 0.00013486
-2 791 789 569 0.00013486
-2 791 789 741 0.00013486
-3 791 789 741 569 0.00013486
-1 711 388 0.000134864
-2 711 493 388 0.000134864
-2 711 557 388 0.000134864
-3 711 557 493 388 0.000134864
-0 884 0.000135117
-1 884 864 0.000135117
-0 885 0.000135117
-1 885 864 0.000135117
-1 885 884 0.000135117
-2 885 884 864 0.000135117
-0 886 0.000135117
-1 886 864 0.000135117
-1 886 884 0.000135117
-2 886 884 864 0.000135117
-1 886 885 0.000135117
-2 886 885 864 0.000135117
-2 886 885 884 0.000135117
-3 886 885 884 864 0.000135117
-1 344 270 0.000135166
-2 344 271 270 0.000135166
-2 344 273 270 0.000135166
-3 344 273 271 270 0.000135166
-1 685 329 0.000135209
-2 685 329 313 0.000135209
-2 685 329 315 0.000135209
-3 685 329 315 313 0.000135209
-1 836 739 0.000135307
-2 836 739 269 0.000135307
-2 836 739 347 0.000135307
-3 836 739 347 269 0.000135307
-1 814 318 0.000135346
-1 814 489 0.000135346
-2 814 489 318 0.000135346
-1 814 577 0.000135346
-2 814 577 318 0.000135346
-2 814 577 489 0.000135346
-3 814 577 489 318 0.000135346
-1 526 281 0.000135441
-2 569 526 281 0.000135441
-2 596 526 281 0.000135441
-3 596 569 526 281 0.000135441
-2 754 638 628 0.000135497
-2 754 712 628 0.000135497
-3 754 712 638 628 0.000135497
-1 686 637 0.000135653
-2 686 637 143 0.000135653
-2 686 637 599 0.000135653
-3 686 637 599 143 0.000135653
-1 223 160 0.000136102
-2 223 160 52 0.000136102
-2 687 223 160 0.000136102
-3 687 223 160 52 0.000136102
-1 842 806 0.00013613
-0 887 0.00013613
-1 887 806 0.00013613
-1 887 842 0.00013613
-2 887 842 806 0.00013613
-0 888 0.00013613
-1 888 806 0.00013613
-1 888 842 0.00013613
-2 888 842 806 0.00013613
-1 888 887 0.00013613
-2 888 887 806 0.00013613
-2 888 887 842 0.00013613
-3 888 887 842 806 0.00013613
-1 773 717 0.000136183
-2 773 717 653 0.000136183
-2 773 748 653 0.000136183
-2 773 748 717 0.000136183
-3 773 748 717 653 0.000136183
-1 856 503 0.000136286
-0 889 0.000136286
-1 889 503 0.000136286
-1 889 856 0.000136286
-2 889 856 503 0.000136286
-0 890 0.000136286
-1 890 503 0.000136286
-1 890 856 0.000136286
-2 890 856 503 0.000136286
-1 890 889 0.000136286
-2 890 889 503 0.000136286
-2 890 889 856 0.000136286
-3 890 889 856 503 0.000136286
-2 800 799 247 0.000136358
-3 800 799 247 246 0.000136358
-1 721 517 0.000136503
-1 721 677 0.000136503
-2 721 677 517 0.000136503
-0 891 0.000136503
-1 891 517 0.000136503
-1 891 677 0.000136503
-2 891 677 517 0.000136503
-1 891 721 0.000136503
-2 891 721 517 0.000136503
-2 891 721 677 0.000136503
-3 891 721 677 517 0.000136503
-1 732 278 0.000136673
-1 732 279 0.000136673
-2 732 279 278 0.000136673
-2 732 731 278 0.000136673
-2 732 731 279 0.000136673
-3 732 731 279 278 0.000136673
-1 669 504 0.000136728
-2 669 628 504 0.000136728
-1 847 504 0.000136728
-1 847 628 0.000136728
-2 847 628 504 0.000136728
-1 847 669 0.000136728
-2 847 669 504 0.000136728
-2 847 669 628 0.000136728
-3 847 669 628 504 0.000136728
-1 846 719 0.00013734
-2 846 719 600 0.00013734
-2 846 719 692 0.00013734
-3 846 719 692 600 0.00013734
-1 620 253 0.000137424
-2 620 253 134 0.000137424
-2 620 397 253 0.000137424
-3 620 397 253 134 0.000137424
-1 814 355 0.000137457
-2 814 355 318 0.000137457
-2 814 489 355 0.000137457
-3 814 489 355 318 0.000137457
-1 606 134 0.000137713
-2 606 136 134 0.000137713
-2 620 606 134 0.000137713
-3 620 606 136 134 0.000137713
-1 691 501 0.000137777
-2 691 502 501 0.000137777
-2 691 503 501 0.000137777
-3 691 503 502 501 0.000137777
-1 599 369 0.000138074
-2 599 371 369 0.000138074
-1 686 369 0.000138074
-2 686 371 369 0.000138074
-2 686 599 369 0.000138074
-3 686 599 371 369 0.000138074
-1 497 430 0.000138133
-1 667 497 0.000138133
-2 667 497 430 0.000138133
-1 668 497 0.000138133
-2 668 497 430 0.000138133
-2 668 667 497 0.000138133
-3 668 667 497 430 0.000138133
-1 773 707 0.000138295
-2 773 707 706 0.000138295
-1 774 706 0.000138295
-1 774 707 0.000138295
-2 774 707 706 0.000138295
-2 774 773 706 0.000138295
-2 774 773 707 0.000138295
-3 774 773 707 706 0.000138295
-2 606 134 133 0.000138345
-3 606 136 134 133 0.000138345
-1 352 272 0.000138363
-2 352 273 272 0.000138363
-2 505 352 272 0.000138363
-3 505 352 273 272 0.000138363
-1 820 186 0.000138389
-1 820 305 0.000138389
-2 820 305 186 0.000138389
-1 820 504 0.000138389
-2 820 504 186 0.000138389
-2 820 504 305 0.000138389
-3 820 504 305 186 0.000138389
-1 812 125 0.00013844
-1 812 161 0.00013844
-2 812 161 125 0.00013844
-1 812 508 0.00013844
-2 812 508 125 0.00013844
-2 812 508 161 0.00013844
-3 812 508 161 125 0.00013844
-1 771 370 0.000138791
-2 771 441 370 0.000138791
-2 771 591 370 0.000138791
-3 771 591 441 370 0.000138791
-1 561 544 0.000138855
-1 596 544 0.000138855
-2 596 561 544 0.000138855
-1 690 544 0.000138855
-2 690 561 544 0.000138855
-2 690 596 544 0.000138855
-3 690 596 561 544 0.000138855
-1 741 479 0.000138945
-2 741 569 479 0.000138945
-1 741 635 0.000138945
-2 741 635 479 0.000138945
-2 741 635 569 0.000138945
-3 741 635 569 479 0.000138945
-1 403 274 0.000139005
-2 403 274 271 0.000139005
-2 493 403 274 0.000139005
-3 493 403 274 271 0.000139005
-1 712 669 0.000139076
-2 754 712 669 0.000139076
-1 803 712 0.000139076
-2 803 712 669 0.000139076
-2 803 754 712 0.000139076
-3 803 754 712 669 0.000139076
-1 252 178 0.00013939
-2 252 178 105 0.00013939
-1 675 178 0.00013939
-2 675 178 105 0.00013939
-2 675 252 178 0.00013939
-3 675 252 178 105 0.00013939
-1 620 133 0.000139419
-2 620 134 133 0.000139419
-2 620 606 133 0.000139419
-3 620 606 134 133 0.000139419
-1 544 526 0.000139549
-2 544 526 281 0.000139549
-2 596 544 281 0.000139549
-2 596 544 526 0.000139549
-3 596 544 526 281 0.000139549
-2 821 231 230 0.000139572
-3 821 231 230 229 0.000139572
-1 595 445 0.000139744
-2 595 445 442 0.000139744
-0 892 0.000139744
-1 892 442 0.000139744
-1 892 445 0.000139744
-2 892 445 442 0.000139744
-1 892 595 0.000139744
-2 892 595 442 0.000139744
-2 892 595 445 0.000139744
-3 892 595 445 442 0.000139744
-2 800 556 247 0.000139751
-3 800 734 556 247 0.000139751
-1 351 273 0.000140085
-2 352 351 273 0.000140085
-2 519 351 273 0.000140085
-3 519 352 351 273 0.000140085
-1 323 301 0.000140132
-1 471 301 0.000140132
-2 471 323 301 0.000140132
-1 546 301 0.000140132
-2 546 323 301 0.000140132
-1 546 471 0.000140132
-2 546 471 301 0.000140132
-2 546 471 323 0.000140132
-3 546 471 323 301 0.000140132
-1 525 284 0.000140173
-1 526 284 0.000140173
-2 526 525 284 0.000140173
-2 569 525 284 0.000140173
-2 569 526 284 0.000140173
-3 569 526 525 284 0.000140173
-1 848 199 0.000140528
-1 848 718 0.000140528
-2 848 718 199 0.000140528
-2 848 776 199 0.000140528
-2 848 776 718 0.000140528
-3 848 776 718 199 0.000140528
-1 669 394 0.000140538
-2 669 394 151 0.000140538
-2 669 642 394 0.000140538
-3 669 642 394 151 0.000140538
-2 712 669 628 0.000140843
-3 754 712 669 628 0.000140843
-1 409 183 0.000140848
-2 575 409 183 0.000140848
-2 611 409 183 0.000140848
-3 611 575 409 183 0.000140848
-1 671 603 0.000141083
-1 672 603 0.000141083
-2 672 671 603 0.000141083
-1 770 671 0.000141083
-2 770 671 603 0.000141083
-1 770 672 0.000141083
-2 770 672 603 0.000141083
-2 770 672 671 0.000141083
-3 770 672 671 603 0.000141083
-1 637 369 0.000141085
-2 637 599 369 0.000141085
-2 686 637 369 0.000141085
-3 686 637 599 369 0.000141085
-1 427 247 0.000141138
-1 427 249 0.000141138
-2 427 249 247 0.000141138
-2 427 424 247 0.000141138
-2 427 424 249 0.000141138
-3 427 424 249 247 0.000141138
-1 791 479 0.000141257
-2 791 569 479 0.000141257
-2 791 741 479 0.000141257
-3 791 741 569 479 0.000141257
-1 620 396 0.000141334
-2 620 396 253 0.000141334
-2 620 397 396 0.000141334
-3 620 397 396 253 0.000141334
-1 545 283 0.000141337
-2 545 476 283 0.000141337
-2 545 544 283 0.000141337
-3 545 544 476 283 0.000141337
-1 561 155 0.00014144
-2 561 311 155 0.00014144
-2 561 511 155 0.00014144
-3 561 511 311 155 0.00014144
-1 525 477 0.00014156
-1 526 477 0.00014156
-2 526 525 477 0.00014156
-1 589 525 0.00014156
-2 589 525 477 0.00014156
-1 589 526 0.00014156
-2 589 526 477 0.00014156
-2 589 526 525 0.00014156
-3 589 526 525 477 0.00014156
-2 846 719 594 0.000141763
-3 846 719 600 594 0.000141763
-2 561 544 526 0.000141904
-3 596 561 544 526 0.000141904
-2 526 284 281 0.000141964
-3 569 526 284 281 0.000141964
-2 754 628 153 0.000142061
-3 803 754 628 153 0.000142061
-1 529 339 0.00014216
-1 529 341 0.00014216
-2 529 341 339 0.00014216
-0 893 0.00014216
-1 893 339 0.00014216
-1 893 341 0.00014216
-2 893 341 339 0.00014216
-1 893 529 0.00014216
-2 893 529 339 0.00014216
-2 893 529 341 0.00014216
-3 893 529 341 339 0.00014216
-1 561 545 0.000142195
-2 561 545 544 0.000142195
-1 690 545 0.000142195
-2 690 545 544 0.000142195
-2 690 561 545 0.000142195
-3 690 561 545 544 0.000142195
-2 762 748 717 0.000142367
-2 762 749 748 0.000142367
-3 762 749 748 717 0.000142367
-1 412 272 0.000142408
-2 412 273 272 0.000142408
-2 524 412 272 0.000142408
-3 524 412 273 272 0.000142408
-1 682 343 0.000142651
-2 682 343 49 0.000142651
-2 682 634 343 0.000142651
-3 682 634 343 49 0.000142651
-2 687 332 126 0.000142667
-2 687 423 332 0.000142667
-3 687 423 332 126 0.000142667
-2 434 292 133 0.000142803
-3 434 292 188 133 0.000142803
-1 878 508 0.000142813
-1 878 509 0.000142813
-2 878 509 508 0.000142813
-2 878 756 508 0.000142813
-2 878 756 509 0.000142813
-3 878 756 509 508 0.000142813
-1 685 374 0.000142824
-2 685 374 315 0.000142824
-2 685 514 374 0.000142824
-3 685 514 374 315 0.000142824
-1 292 289 0.00014299
-2 292 289 159 0.00014299
-2 292 289 288 0.00014299
-3 292 289 288 159 0.00014299
-2 396 255 254 0.000143013
-3 396 395 255 254 0.000143013
-1 686 525 0.000143258
-2 686 525 477 0.000143258
-2 686 589 525 0.000143258
-3 686 589 525 477 0.000143258
-1 176 63 0.000143585
-2 176 137 63 0.000143585
-2 214 176 63 0.000143585
-3 214 176 137 63 0.000143585
-1 814 487 0.000143751
-2 814 487 355 0.000143751
-2 814 489 487 0.000143751
-3 814 489 487 355 0.000143751
-1 470 313 0.000143906
-2 470 345 313 0.000143906
-2 470 368 313 0.000143906
-3 470 368 345 313 0.000143906
-1 367 329 0.000143973
-2 367 329 313 0.000143973
-2 685 367 329 0.000143973
-3 685 367 329 313 0.000143973
-1 291 209 0.000143997
-2 291 209 208 0.000143997
-2 291 211 209 0.000143997
-3 291 211 209 208 0.000143997
-1 799 383 0.000144085
-2 799 383 237 0.000144085
-2 799 775 383 0.000144085
-3 799 775 383 237 0.000144085
-1 822 159 0.000144376
-2 822 159 148 0.000144376
-2 822 289 159 0.000144376
-3 822 289 159 148 0.000144376
-2 396 254 253 0.000144531
-3 396 255 254 253 0.000144531
-1 816 786 0.000144753
-2 826 816 786 0.000144753
-1 882 816 0.000144753
-2 882 816 786 0.000144753
-2 882 826 816 0.000144753
-3 882 826 816 786 0.000144753
-1 494 226 0.000144766
-2 494 298 226 0.000144766
-2 495 494 226 0.000144766
-3 495 494 298 226 0.000144766
-1 847 712 0.000145042
-2 847 712 504 0.000145042
-2 847 712 628 0.000145042
-3 847 712 628 504 0.000145042
-1 780 382 0.000145201
-1 780 384 0.000145201
-2 780 384 382 0.000145201
-2 780 475 382 0.000145201
-2 780 475 384 0.000145201
-3 780 475 384 382 0.000145201
-1 729 189 0.000145202
-2 729 326 189 0.000145202
-2 729 528 189 0.000145202
-3 729 528 326 189 0.000145202
-1 487 393 0.000145265
-2 487 393 355 0.000145265
-2 487 393 392 0.000145265
-3 487 393 392 355 0.000145265
-2 816 786 262 0.000145565
-2 816 786 340 0.000145565
-3 816 786 340 262 0.000145565
-1 642 153 0.000146084
-2 642 153 150 0.000146084
-2 642 153 151 0.000146084
-3 642 153 151 150 0.000146084
-1 224 160 0.000146085
-2 224 223 160 0.000146085
-2 687 224 160 0.000146085
-2 687 224 223 0.000146085
-3 687 224 223 160 0.000146085
-1 729 478 0.000146209
-2 729 627 478 0.000146209
-1 792 478 0.000146209
-2 792 627 478 0.000146209
-2 792 729 478 0.000146209
-3 792 729 627 478 0.000146209
-1 789 479 0.000146314
-2 789 569 479 0.000146314
-2 791 789 479 0.000146314
-3 791 789 569 479 0.000146314
-2 474 469 141 0.000146337
-3 474 469 141 139 0.000146337
-0 894 0.000146487
-1 894 585 0.000146487
-1 894 639 0.000146487
-2 894 639 585 0.000146487
-1 894 701 0.000146487
-2 894 701 585 0.000146487
-2 894 701 639 0.000146487
-3 894 701 639 585 0.000146487
-1 641 495 0.000146711
-2 641 495 328 0.000146711
-2 641 519 495 0.000146711
-3 641 519 495 328 0.000146711
-0 895 0.000146961
-1 895 591 0.000146961
-1 895 771 0.000146961
-2 895 771 591 0.000146961
-1 895 815 0.000146961
-2 895 815 591 0.000146961
-2 895 815 771 0.000146961
-3 895 815 771 591 0.000146961
-2 526 477 281 0.000147036
-2 526 477 284 0.000147036
-3 526 477 284 281 0.000147036
-1 800 248 0.000147063
-2 800 248 247 0.000147063
-2 800 799 248 0.000147063
-3 800 799 248 247 0.000147063
-0 896 0.000147375
-1 896 342 0.000147375
-1 896 343 0.000147375
-2 896 343 342 0.000147375
-1 896 617 0.000147375
-2 896 617 342 0.000147375
-2 896 617 343 0.000147375
-3 896 617 343 342 0.000147375
-1 619 338 0.000147667
-2 619 338 48 0.000147667
-2 619 617 338 0.000147667
-3 619 617 338 48 0.000147667
-2 544 526 477 0.000147685
-3 544 526 477 281 0.000147685
-1 685 16 0.000147802
-1 685 570 0.000147802
-2 685 570 16 0.000147802
-1 685 571 0.000147802
-2 685 571 16 0.000147802
-2 685 571 570 0.000147802
-3 685 571 570 16 0.000147802
-2 792 569 478 0.000147891
-3 792 627 569 478 0.000147891
-1 513 140 0.000148133
-2 513 140 139 0.000148133
-2 513 141 140 0.000148133
-3 513 141 140 139 0.000148133
-1 469 313 0.000148135
-2 469 368 313 0.000148135
-2 470 469 313 0.000148135
-3 470 469 368 313 0.000148135
-1 579 260 0.000148419
-2 579 263 260 0.000148419
-2 579 335 260 0.000148419
-3 579 335 263 260 0.000148419
-2 847 712 669 0.00014853
-3 847 712 669 628 0.00014853
-1 722 24 0.000148567
-2 722 24 23 0.000148567
-0 897 0.000148567
-1 897 23 0.000148567
-1 897 24 0.000148567
-2 897 24 23 0.000148567
-1 897 722 0.000148567
-2 897 722 23 0.000148567
-2 897 722 24 0.000148567
-3 897 722 24 23 0.000148567
-1 329 141 0.000148641
-2 329 313 141 0.000148641
-2 367 329 141 0.000148641
-3 367 329 313 141 0.000148641
-2 729 627 189 0.000148789
-3 729 627 528 189 0.000148789
-1 224 52 0.00014879
-2 224 160 52 0.00014879
-2 224 223 52 0.00014879
-3 224 223 160 52 0.00014879
-1 254 153 0.000148913
-2 254 153 151 0.000148913
-2 642 254 153 0.000148913
-3 642 254 153 151 0.000148913
-1 193 130 0.000148972
-2 709 193 130 0.000148972
-2 710 193 130 0.000148972
-3 710 709 193 130 0.000148972
-2 525 477 284 0.000149113
-3 526 525 477 284 0.000149113
-2 469 313 141 0.000149551
-3 469 368 313 141 0.000149551
-1 705 456 0.000149634
-2 705 456 455 0.000149634
-2 736 456 455 0.000149634
-2 736 705 456 0.000149634
-3 736 705 456 455 0.000149634
-1 708 556 0.000149746
-2 708 556 130 0.000149746
-2 708 688 556 0.000149746
-3 708 688 556 130 0.000149746
-1 828 552 0.000149793
-2 828 821 552 0.000149793
-2 829 828 552 0.000149793
-3 829 828 821 552 0.000149793
-1 344 274 0.00014999
-2 344 274 271 0.00014999
-2 557 344 274 0.00014999
-3 557 344 274 271 0.00014999
-1 578 274 0.000150203
-2 578 403 274 0.000150203
-2 578 493 274 0.000150203
-3 578 493 403 274 0.000150203
-1 500 234 0.000150241
-2 501 500 234 0.000150241
-2 520 500 234 0.000150241
-3 520 501 500 234 0.000150241
-1 186 47 0.000150302
-2 186 184 47 0.000150302
-2 186 185 47 0.000150302
-3 186 185 184 47 0.000150302
-1 878 378 0.000150334
-2 878 378 334 0.000150334
-2 878 756 378 0.000150334
-3 878 756 378 334 0.000150334
-1 513 470 0.000150369
-2 513 470 367 0.000150369
-2 513 470 469 0.000150369
-3 513 470 469 367 0.000150369
-1 829 702 0.000150411
-1 845 829 0.000150411
-2 845 829 702 0.000150411
-0 898 0.000150411
-1 898 702 0.000150411
-1 898 829 0.000150411
-2 898 829 702 0.000150411
-1 898 845 0.000150411
-2 898 845 702 0.000150411
-2 898 845 829 0.000150411
-3 898 845 829 702 0.000150411
-2 319 15 14 0.000150531
-3 319 15 14 12 0.000150531
-1 616 202 0.000150579
-2 616 613 202 0.000150579
-2 616 614 202 0.000150579
-3 616 614 613 202 0.000150579
-2 685 329 141 0.000150705
-3 685 367 329 141 0.000150705
-1 635 525 0.000150947
-2 635 569 525 0.000150947
-2 741 635 525 0.000150947
-3 741 635 569 525 0.000150947
-1 659 420 0.000151503
-1 659 622 0.000151503
-2 659 622 420 0.000151503
-2 659 623 420 0.000151503
-2 659 623 622 0.000151503
-3 659 623 622 420 0.000151503
-1 756 333 0.000151565
-2 756 334 333 0.000151565
-1 863 333 0.000151565
-2 863 334 333 0.000151565
-2 863 756 333 0.000151565
-3 863 756 334 333 0.000151565
-1 626 153 0.000151733
-2 663 626 153 0.000151733
-2 754 626 153 0.000151733
-3 754 663 626 153 0.000151733
-0 899 0.000151846
-1 899 806 0.000151846
-1 899 842 0.000151846
-2 899 842 806 0.000151846
-1 899 888 0.000151846
-2 899 888 806 0.000151846
-2 899 888 842 0.000151846
-3 899 888 842 806 0.000151846
-1 193 131 0.000151919
-2 193 162 131 0.000151919
-2 709 193 131 0.000151919
-3 709 193 162 131 0.000151919
-1 879 679 0.000151953
-1 891 679 0.000151953
-1 891 879 0.000151953
-2 891 879 679 0.000151953
-0 900 0.000151953
-1 900 679 0.000151953
-1 900 879 0.000151953
-2 900 879 679 0.000151953
-1 900 891 0.000151953
-2 900 891 679 0.000151953
-2 900 891 879 0.000151953
-3 900 891 879 679 0.000151953
-1 761 586 0.000151962
-2 761 587 586 0.000151962
-2 761 588 586 0.000151962
-2 761 588 587 0.000151962
-3 761 588 587 586 0.000151962
-1 254 150 0.000152286
-2 254 153 150 0.000152286
-2 642 254 150 0.000152286
-3 642 254 153 150 0.000152286
-1 662 396 0.000152451
-1 662 642 0.000152451
-2 662 642 396 0.000152451
-2 662 661 396 0.000152451
-2 662 661 642 0.000152451
-3 662 661 642 396 0.000152451
-2 305 217 215 0.000152462
-1 305 218 0.000152462
-2 305 218 215 0.000152462
-2 305 218 217 0.000152462
-3 305 218 217 215 0.000152462
-2 344 274 270 0.000152462
-3 344 274 271 270 0.000152462
-1 650 572 0.000152689
-2 651 650 572 0.000152689
-1 707 650 0.000152689
-2 707 650 572 0.000152689
-2 707 651 650 0.000152689
-3 707 651 650 572 0.000152689
-1 173 74 0.000152731
-2 173 74 73 0.000152731
-2 173 75 74 0.000152731
-3 173 75 74 73 0.000152731
-1 768 757 0.000152836
-2 825 768 757 0.000152836
-1 853 768 0.000152836
-2 853 768 757 0.000152836
-2 853 825 768 0.000152836
-3 853 825 768 757 0.000152836
-1 304 218 0.000152856
-2 304 218 215 0.000152856
-2 628 304 218 0.000152856
-3 628 304 218 215 0.000152856
-2 193 131 130 0.000152866
-3 709 193 131 130 0.000152866
-1 738 521 0.000152883
-1 738 522 0.000152883
-2 738 522 521 0.000152883
-1 738 523 0.000152883
-2 738 523 521 0.000152883
-2 738 523 522 0.000152883
-3 738 523 522 521 0.000152883
-2 635 525 284 0.000152888
-3 635 569 525 284 0.000152888
-1 405 401 0.000152894
-2 405 401 320 0.000152894
-2 405 401 400 0.000152894
-3 405 401 400 320 0.000152894
-1 163 161 0.000153056
-2 163 161 43 0.000153056
-1 510 163 0.000153056
-2 510 163 43 0.000153056
-2 510 163 161 0.000153056
-3 510 163 161 43 0.000153056
-2 161 43 34 0.000153118
-3 161 43 42 34 0.000153118
-1 550 129 0.00015326
-2 550 129 128 0.00015326
-2 550 548 129 0.00015326
-3 550 548 129 128 0.00015326
-2 620 253 133 0.000153333
-3 620 253 134 133 0.000153333
-1 702 552 0.000153473
-2 702 552 231 0.000153473
-2 829 702 231 0.000153473
-2 829 702 552 0.000153473
-3 829 702 552 231 0.000153473
-2 878 509 378 0.000153492
-3 878 756 509 378 0.000153492
-1 557 270 0.000153602
-2 557 274 270 0.000153602
-2 557 344 270 0.000153602
-3 557 344 274 270 0.000153602
-0 901 0.000153617
-1 901 750 0.000153617
-1 901 751 0.000153617
-2 901 751 750 0.000153617
-0 902 0.000153617
-1 902 750 0.000153617
-1 902 751 0.000153617
-2 902 751 750 0.000153617
-1 902 901 0.000153617
-2 902 901 750 0.000153617
-2 902 901 751 0.000153617
-3 902 901 751 750 0.000153617
-1 602 19 0.000153652
-2 602 19 18 0.000153652
-1 602 532 0.000153652
-2 602 532 18 0.000153652
-2 602 532 19 0.000153652
-3 602 532 19 18 0.000153652
-1 854 808 0.000153707
-0 903 0.000153707
-1 903 808 0.000153707
-1 903 854 0.000153707
-2 903 854 808 0.000153707
-0 904 0.000153707
-1 904 808 0.000153707
-1 904 854 0.000153707
-2 904 854 808 0.000153707
-1 904 903 0.000153707
-2 904 903 808 0.000153707
-2 904 903 854 0.000153707
-3 904 903 854 808 0.000153707
-1 703 178 0.000153987
-2 703 178 105 0.000153987
-2 703 178 107 0.000153987
-3 703 178 107 105 0.000153987
-2 513 470 139 0.000154128
-3 513 470 469 139 0.000154128
-1 769 374 0.000154259
-1 769 375 0.000154259
-2 769 375 374 0.000154259
-1 769 376 0.000154259
-2 769 376 374 0.000154259
-2 769 376 375 0.000154259
-3 769 376 375 374 0.000154259
-1 896 771 0.000154503
-2 896 771 342 0.000154503
-2 896 771 343 0.000154503
-3 896 771 343 342 0.000154503
-2 703 252 178 0.000154569
-3 703 252 178 105 0.000154569
-2 628 254 151 0.00015462
-3 628 460 254 151 0.00015462
-1 776 759 0.000155309
-1 873 776 0.000155309
-2 873 776 759 0.000155309
-1 874 776 0.000155309
-2 874 776 759 0.000155309
-2 874 873 776 0.000155309
-3 874 873 776 759 0.000155309
-1 597 501 0.000155419
-1 597 502 0.000155419
-2 597 502 501 0.000155419
-1 691 597 0.000155419
-2 691 597 501 0.000155419
-2 691 597 502 0.000155419
-3 691 597 502 501 0.000155419
-1 637 65 0.000155805
-2 637 369 65 0.000155805
-2 637 398 65 0.000155805
-2 637 398 369 0.000155805
-3 637 398 369 65 0.000155805
-1 519 194 0.000155884
-2 519 297 194 0.000155884
-2 641 519 194 0.000155884
-3 641 519 297 194 0.000155884
-0 905 0.000156013
-1 905 617 0.000156013
-1 905 619 0.000156013
-2 905 619 617 0.000156013
-1 905 858 0.000156013
-2 905 858 617 0.000156013
-2 905 858 619 0.000156013
-3 905 858 619 617 0.000156013
-1 329 16 0.000156291
-1 329 17 0.000156291
-2 329 17 16 0.000156291
-1 685 17 0.000156291
-2 685 17 16 0.000156291
-2 685 329 16 0.000156291
-2 685 329 17 0.000156291
-3 685 329 17 16 0.000156291
-1 861 630 0.00015647
-2 861 630 128 0.00015647
-1 861 684 0.00015647
-2 861 684 128 0.00015647
-2 861 684 630 0.00015647
-3 861 684 630 128 0.00015647
-2 756 333 331 0.00015654
-3 756 334 333 331 0.00015654
-1 423 40 0.000156613
-2 423 42 40 0.000156613
-2 423 52 40 0.000156613
-3 423 52 42 40 0.000156613
-1 588 321 0.000156756
-2 588 321 320 0.000156756
-1 760 320 0.000156756
-1 760 321 0.000156756
-2 760 321 320 0.000156756
-2 760 588 320 0.000156756
-2 760 588 321 0.000156756
-3 760 588 321 320 0.000156756
-1 881 444 0.000156895
-0 906 0.000156895
-1 906 444 0.000156895
-1 906 881 0.000156895
-2 906 881 444 0.000156895
-0 907 0.000156895
-1 907 444 0.000156895
-1 907 881 0.000156895
-2 907 881 444 0.000156895
-1 907 906 0.000156895
-2 907 906 444 0.000156895
-2 907 906 881 0.000156895
-3 907 906 881 444 0.000156895
-1 469 345 0.000157116
-2 469 345 313 0.000157116
-2 470 469 345 0.000157116
-3 470 469 345 313 0.000157116
-1 703 702 0.000157208
-2 703 702 231 0.000157208
-2 703 702 552 0.000157208
-3 703 702 552 231 0.000157208
-1 710 131 0.000157423
-2 710 131 130 0.000157423
-2 710 193 131 0.000157423
-3 710 193 131 130 0.000157423
-1 762 388 0.000157519
-2 762 557 388 0.000157519
-2 762 711 388 0.000157519
-3 762 711 557 388 0.000157519
-2 710 162 131 0.000157893
-3 710 193 162 131 0.000157893
-1 288 240 0.000158094
-1 292 240 0.000158094
-2 292 288 240 0.000158094
-1 434 240 0.000158094
-2 434 288 240 0.000158094
-2 434 292 240 0.000158094
-3 434 292 288 240 0.000158094
-1 217 44 0.000158193
-2 217 45 44 0.000158193
-2 217 184 44 0.000158193
-3 217 184 45 44 0.000158193
-1 702 542 0.000158238
-2 702 542 231 0.000158238
-2 702 542 232 0.000158238
-3 702 542 232 231 0.000158238
-1 872 503 0.000158341
-1 889 872 0.000158341
-2 889 872 503 0.000158341
-1 890 872 0.000158341
-2 890 872 503 0.000158341
-2 890 889 872 0.000158341
-3 890 889 872 503 0.000158341
-1 893 554 0.000158643
-0 908 0.000158643
-1 908 554 0.000158643
-1 908 893 0.000158643
-2 908 893 554 0.000158643
-0 909 0.000158643
-1 909 554 0.000158643
-1 909 893 0.000158643
-2 909 893 554 0.000158643
-1 909 908 0.000158643
-2 909 908 554 0.000158643
-2 909 908 893 0.000158643
-3 909 908 893 554 0.000158643
-1 686 370 0.000158861
-2 686 371 370 0.000158861
-2 686 590 370 0.000158861
-3 686 590 371 370 0.000158861
-1 557 273 0.00015887
-2 557 273 270 0.00015887
-2 557 344 273 0.00015887
-3 557 344 273 270 0.00015887
-0 910 0.000158977
-1 910 356 0.000158977
-1 910 357 0.000158977
-2 910 357 356 0.000158977
-1 910 362 0.000158977
-2 910 362 356 0.000158977
-2 910 362 357 0.000158977
-3 910 362 357 356 0.000158977
-1 431 315 0.000159062
-2 431 315 171 0.000159062
-2 431 329 315 0.000159062
-3 431 329 315 171 0.000159062
-0 911 0.000159121
-1 911 715 0.000159121
-1 911 805 0.000159121
-2 911 805 715 0.000159121
-1 911 806 0.000159121
-2 911 806 715 0.000159121
-2 911 806 805 0.000159121
-3 911 806 805 715 0.000159121
-1 588 250 0.000159184
-2 588 250 180 0.000159184
-2 588 405 250 0.000159184
-3 588 405 250 180 0.000159184
-1 141 17 0.000159361
-2 329 141 17 0.000159361
-2 685 141 17 0.000159361
-3 685 329 141 17 0.000159361
-1 773 76 0.000159534
-2 773 581 76 0.000159534
-2 773 706 76 0.000159534
-3 773 706 581 76 0.000159534
-1 267 60 0.000159829
-2 267 61 60 0.000159829
-2 267 123 60 0.000159829
-3 267 123 61 60 0.000159829
-2 557 413 273 0.00015983
-3 557 413 344 273 0.00015983
-0 912 0.000159872
-1 912 315 0.000159872
-1 912 374 0.000159872
-2 912 374 315 0.000159872
-1 912 685 0.000159872
-2 912 685 315 0.000159872
-2 912 685 374 0.000159872
-3 912 685 374 315 0.000159872
-1 638 153 0.000160102
-2 638 626 153 0.000160102
-2 754 638 153 0.000160102
-3 754 638 626 153 0.000160102
-1 538 395 0.000160135
-2 538 395 255 0.000160135
-2 539 538 395 0.000160135
-3 539 538 395 255 0.000160135
-1 375 47 0.000160229
-2 375 47 45 0.000160229
-2 375 47 46 0.000160229
-3 375 47 46 45 0.000160229
-1 791 635 0.000160415
-2 791 635 479 0.000160415
-2 791 741 635 0.000160415
-3 791 741 635 479 0.000160415
-1 162 130 0.00016042
-2 162 131 130 0.00016042
-2 710 162 130 0.00016042
-3 710 162 131 130 0.00016042
-1 242 23 0.00016045
-2 243 242 23 0.00016045
-1 694 242 0.00016045
-2 694 242 23 0.00016045
-2 694 243 242 0.00016045
-3 694 243 242 23 0.00016045
-1 423 224 0.000160481
-2 423 224 160 0.000160481
-2 687 423 224 0.000160481
-3 687 423 224 160 0.000160481
-1 469 329 0.000160559
-2 469 329 141 0.000160559
-2 469 329 313 0.000160559
-3 469 329 313 141 0.000160559
-1 835 713 0.000160601
-2 835 715 713 0.000160601
-0 913 0.000160601
-1 913 713 0.000160601
-1 913 715 0.000160601
-2 913 715 713 0.000160601
-1 913 835 0.000160601
-2 913 835 713 0.000160601
-2 913 835 715 0.000160601
-3 913 835 715 713 0.000160601
-2 305 304 218 0.000160829
-3 305 304 218 215 0.000160829
-2 711 557 270 0.000160844
-3 711 557 274 270 0.000160844
-1 540 286 0.000160947
-2 540 286 266 0.000160947
-2 540 286 285 0.000160947
-3 540 286 285 266 0.000160947
-0 914 0.000160969
-1 914 480 0.000160969
-1 914 481 0.000160969
-2 914 481 480 0.000160969
-1 914 482 0.000160969
-2 914 482 480 0.000160969
-2 914 482 481 0.000160969
-3 914 482 481 480 0.000160969
-1 387 345 0.000160988
-2 387 345 295 0.000160988
-2 413 387 345 0.000160988
-3 413 387 345 295 0.000160988
-1 720 679 0.000161431
-1 891 720 0.000161431
-2 891 720 679 0.000161431
-1 900 720 0.000161431
-2 900 720 679 0.000161431
-2 900 891 720 0.000161431
-3 900 891 720 679 0.000161431
-1 662 254 0.000161648
-2 662 396 254 0.000161648
-2 662 642 254 0.000161648
-3 662 642 396 254 0.000161648
-1 741 686 0.000161743
-2 741 686 525 0.000161743
-0 915 0.000161743
-1 915 525 0.000161743
-1 915 686 0.000161743
-2 915 686 525 0.000161743
-1 915 741 0.000161743
-2 915 741 525 0.000161743
-2 915 741 686 0.000161743
-3 915 741 686 525 0.000161743
-2 469 345 329 0.000161872
-3 469 345 329 313 0.000161872
-0 916 0.000161878
-1 916 275 0.000161878
-1 916 385 0.000161878
-2 916 385 275 0.000161878
-1 916 722 0.000161878
-2 916 722 275 0.000161878
-2 916 722 385 0.000161878
-3 916 722 385 275 0.000161878
-1 481 278 0.000161925
-1 481 279 0.000161925
-2 481 279 278 0.000161925
-1 888 278 0.000161925
-1 888 279 0.000161925
-2 888 279 278 0.000161925
-1 888 481 0.000161925
-2 888 481 278 0.000161925
-2 888 481 279 0.000161925
-3 888 481 279 278 0.000161925
-1 740 85 0.000161987
-2 740 86 85 0.000161987
-2 740 87 85 0.000161987
-3 740 87 86 85 0.000161987
-2 423 332 224 0.000162056
-3 687 423 332 224 0.000162056
-1 883 853 0.00016244
-2 883 853 571 0.00016244
-2 883 857 853 0.00016244
-3 883 857 853 571 0.00016244
-1 619 448 0.000162545
-1 858 448 0.000162545
-2 858 619 448 0.000162545
-1 905 448 0.000162545
-2 905 619 448 0.000162545
-2 905 858 448 0.000162545
-3 905 858 619 448 0.000162545
-1 848 712 0.00016272
-2 848 718 712 0.00016272
-1 848 754 0.00016272
-2 848 754 712 0.00016272
-2 848 754 718 0.00016272
-3 848 754 718 712 0.00016272
-1 593 164 0.000162927
-2 593 565 164 0.000162927
-2 593 566 164 0.000162927
-3 593 566 565 164 0.000162927
-1 369 66 0.000162976
-2 369 67 66 0.000162976
-2 372 369 66 0.000162976
-2 372 369 67 0.000162976
-3 372 369 67 66 0.000162976
-1 558 3 0.000163104
-2 558 63 3 0.000163104
-2 558 428 3 0.000163104
-3 558 428 63 3 0.000163104
-1 699 661 0.000163114
-2 699 661 153 0.000163114
-2 699 663 661 0.000163114
-3 699 663 661 153 0.000163114
-1 636 561 0.000163196
-2 636 561 155 0.000163196
-2 636 561 511 0.000163196
-3 636 561 511 155 0.000163196
-1 675 108 0.000163457
-2 675 108 105 0.000163457
-2 675 178 108 0.000163457
-3 675 178 108 105 0.000163457
-1 882 262 0.000163563
-2 882 786 262 0.000163563
-2 882 816 262 0.000163563
-3 882 816 786 262 0.000163563
-1 585 572 0.000163656
-2 585 572 416 0.000163656
-2 585 574 572 0.000163656
-3 585 574 572 416 0.000163656
-1 519 485 0.000163985
-2 519 485 297 0.000163985
-2 519 485 377 0.000163985
-3 519 485 377 297 0.000163985
-1 616 204 0.000164011
-2 616 204 202 0.000164011
-2 616 614 204 0.000164011
-3 616 614 204 202 0.000164011
-1 130 40 0.000164039
-2 131 130 40 0.000164039
-2 162 130 40 0.000164039
-3 162 131 130 40 0.000164039
-2 662 626 153 0.000164041
-3 663 662 626 153 0.000164041
-1 660 459 0.000164124
-1 660 473 0.000164124
-2 660 473 459 0.000164124
-1 752 459 0.000164124
-1 752 473 0.000164124
-2 752 473 459 0.000164124
-2 752 660 459 0.000164124
-2 752 660 473 0.000164124
-3 752 660 473 459 0.000164124
-0 917 0.00016419
-1 917 556 0.00016419
-1 917 688 0.00016419
-2 917 688 556 0.00016419
-1 917 800 0.00016419
-2 917 800 556 0.00016419
-2 917 800 688 0.00016419
-3 917 800 688 556 0.00016419
-1 749 388 0.000164338
-2 749 557 388 0.000164338
-2 762 749 388 0.000164338
-3 762 749 557 388 0.000164338
-1 821 543 0.000164454
-2 821 543 230 0.000164454
-2 821 564 543 0.000164454
-3 821 564 543 230 0.000164454
-1 820 588 0.000164509
-2 820 759 588 0.000164509
-2 820 760 588 0.000164509
-3 820 760 759 588 0.000164509
-1 350 226 0.000165141
-2 350 349 226 0.000165141
-2 495 350 226 0.000165141
-3 495 350 349 226 0.000165141
-1 779 191 0.000165494
-2 779 475 191 0.000165494
-2 779 682 191 0.000165494
-3 779 682 475 191 0.000165494
-1 474 17 0.000165652
-2 474 141 17 0.000165652
-1 685 474 0.000165652
-2 685 474 17 0.000165652
-2 685 474 141 0.000165652
-3 685 474 141 17 0.000165652
-1 917 708 0.00016576
-2 917 708 556 0.00016576
-2 917 708 688 0.00016576
-3 917 708 688 556 0.00016576
-2 675 233 108 0.000165906
-3 675 233 108 105 0.000165906
-2 369 66 65 0.000166014
-3 369 67 66 65 0.000166014
-2 638 628 153 0.000166412
-3 754 638 628 153 0.000166412
-1 772 552 0.000166533
-2 772 564 552 0.000166533
-2 772 703 552 0.000166533
-3 772 703 564 552 0.000166533
-1 686 284 0.000166602
-2 686 477 284 0.000166602
-2 686 525 284 0.000166602
-3 686 525 477 284 0.000166602
-1 618 448 0.000166625
-2 618 448 446 0.000166625
-2 619 448 446 0.000166625
-2 619 618 448 0.000166625
-3 619 618 448 446 0.000166625
-1 498 411 0.000166891
-2 499 498 411 0.000166891
-1 813 498 0.000166891
-2 813 498 411 0.000166891
-2 813 499 498 0.000166891
-3 813 499 498 411 0.000166891
-1 366 118 0.000166987
-2 366 365 118 0.000166987
-2 406 366 118 0.000166987
-3 406 366 365 118 0.000166987
-2 686 370 369 0.000167025
-3 686 371 370 369 0.000167025
-1 545 526 0.00016711
-2 545 544 526 0.00016711
-2 561 545 526 0.00016711
-3 561 545 544 526 0.00016711
-1 608 554 0.000167183
-2 608 554 439 0.000167183
-2 608 554 553 0.000167183
-3 608 554 553 439 0.000167183
-1 314 272 0.000167296
-2 412 314 272 0.000167296
-2 524 314 272 0.000167296
-3 524 412 314 272 0.000167296
-1 878 125 0.00016731
-2 878 508 125 0.00016731
-2 878 509 125 0.00016731
-3 878 509 508 125 0.00016731
-2 628 254 153 0.000167598
-3 628 254 153 151 0.000167598
-1 577 319 0.000167708
-2 577 319 14 0.000167708
-2 577 319 318 0.000167708
-3 577 319 318 14 0.000167708
-2 772 552 90 0.000167862
-3 772 703 552 90 0.000167862
-2 749 658 388 0.000167934
-3 749 658 557 388 0.000167934
-2 729 478 189 0.000167979
-3 729 627 478 189 0.000167979
-1 523 359 0.000168214
-2 523 359 357 0.000168214
-1 523 362 0.000168214
-2 523 362 357 0.000168214
-2 523 362 359 0.000168214
-3 523 362 359 357 0.000168214
-1 560 347 0.000168219
-2 636 560 347 0.000168219
-2 739 560 347 0.000168219
-3 739 636 560 347 0.000168219
-2 858 618 448 0.0001684
-3 858 619 618 448 0.0001684
-1 828 230 0.000168802
-2 828 231 230 0.000168802
-2 828 821 230 0.000168802
-3 828 821 231 230 0.000168802
-1 374 141 0.000168865
-2 514 374 141 0.000168865
-2 685 374 141 0.000168865
-3 685 514 374 141 0.000168865
-2 513 470 140 0.000168978
-3 513 470 140 139 0.000168978
-2 534 319 33 0.000169003
-3 534 319 33 15 0.000169003
-0 918 0.000169073
-1 918 679 0.000169073
-1 918 720 0.000169073
-2 918 720 679 0.000169073
-1 918 900 0.000169073
-2 918 900 679 0.000169073
-2 918 900 720 0.000169073
-3 918 900 720 679 0.000169073
-2 597 520 501 0.000169259
-2 597 520 502 0.000169259
-3 597 520 502 501 0.000169259
-1 441 372 0.000169296
-2 441 372 66 0.000169296
-2 441 372 370 0.000169296
-3 441 372 370 66 0.000169296
-2 545 526 477 0.000169344
-3 545 544 526 477 0.000169344
-1 775 492 0.000169354
-2 775 492 236 0.000169354
-2 799 775 492 0.000169354
-3 799 775 492 236 0.000169354
-1 587 320 0.000169627
-2 587 405 320 0.000169627
-2 588 587 320 0.000169627
-3 588 587 405 320 0.000169627
-1 209 133 0.000169671
-2 209 208 133 0.000169671
-2 216 209 133 0.000169671
-3 216 209 208 133 0.000169671
-1 820 628 0.000169727
-2 820 628 305 0.000169727
-2 820 628 504 0.000169727
-3 820 628 504 305 0.000169727
-1 801 502 0.000169862
-2 801 597 502 0.000169862
-1 801 691 0.000169862
-2 801 691 502 0.000169862
-2 801 691 597 0.000169862
-3 801 691 597 502 0.000169862
-1 732 280 0.000169994
-2 732 731 280 0.000169994
-2 733 732 280 0.000169994
-3 733 732 731 280 0.000169994
-1 848 803 0.000170123
-2 848 803 712 0.000170123
-2 848 803 754 0.000170123
-3 848 803 754 712 0.000170123
-1 661 254 0.000170511
-2 661 642 254 0.000170511
-2 662 661 254 0.000170511
-3 662 661 642 254 0.000170511
-2 661 254 150 0.000170546
-3 661 642 254 150 0.000170546
-1 130 41 0.000170648
-2 130 41 40 0.000170648
-2 162 130 41 0.000170648
-3 162 130 41 40 0.000170648
-1 469 328 0.000170749
-2 469 329 328 0.000170749
-2 469 345 328 0.000170749
-3 469 345 329 328 0.000170749
-1 508 331 0.000171057
-2 508 332 331 0.000171057
-2 756 508 331 0.000171057
-3 756 508 332 331 0.000171057
-2 662 254 150 0.00017111
-3 662 661 254 150 0.00017111
-1 401 181 0.000171246
-1 401 183 0.000171246
-2 401 183 181 0.000171246
-1 575 401 0.000171246
-2 575 401 181 0.000171246
-2 575 401 183 0.000171246
-3 575 401 183 181 0.000171246
-1 752 25 0.00017151
-2 752 459 25 0.00017151
-2 752 473 25 0.00017151
-3 752 473 459 25 0.00017151
-1 878 812 0.000171565
-2 878 812 125 0.000171565
-2 878 812 508 0.000171565
-3 878 812 508 125 0.000171565
-1 451 327 0.000171659
-2 452 451 327 0.000171659
-2 453 451 327 0.000171659
-3 453 452 451 327 0.000171659
-1 916 270 0.000171703
-2 916 275 270 0.000171703
-1 916 711 0.000171703
-2 916 711 270 0.000171703
-2 916 711 275 0.000171703
-3 916 711 275 270 0.000171703
-1 246 238 0.000172202
-1 248 238 0.000172202
-2 248 246 238 0.000172202
-1 249 238 0.000172202
-2 249 246 238 0.000172202
-2 249 248 238 0.000172202
-3 249 248 246 238 0.000172202
-1 470 328 0.000172265
-2 470 345 328 0.000172265
-2 470 469 328 0.000172265
-3 470 469 345 328 0.000172265
-1 473 27 0.000172301
-2 473 27 25 0.000172301
-2 473 163 27 0.000172301
-3 473 163 27 25 0.000172301
-2 492 246 238 0.000172347
-2 492 248 238 0.000172347
-3 492 248 246 238 0.000172347
-1 289 240 0.000172363
-2 289 288 240 0.000172363
-2 292 289 240 0.000172363
-3 292 289 288 240 0.000172363
-1 694 24 0.000172398
-2 694 24 23 0.000172398
-2 694 212 24 0.000172398
-3 694 212 24 23 0.000172398
-1 222 52 0.000173263
-2 223 222 52 0.000173263
-1 640 222 0.000173263
-2 640 222 52 0.000173263
-2 640 223 222 0.000173263
-3 640 223 222 52 0.000173263
-0 919 0.000173296
-1 919 606 0.000173296
-1 919 620 0.000173296
-2 919 620 606 0.000173296
-1 919 695 0.000173296
-2 919 695 606 0.000173296
-2 919 695 620 0.000173296
-3 919 695 620 606 0.000173296
-1 810 217 0.000173318
-2 810 217 187 0.000173318
-2 810 305 217 0.000173318
-3 810 305 217 187 0.000173318
-1 789 478 0.000173513
-2 789 569 478 0.000173513
-2 792 789 478 0.000173513
-3 792 789 569 478 0.000173513
-1 593 259 0.000173606
-2 593 259 164 0.000173606
-2 593 566 259 0.000173606
-3 593 566 259 164 0.000173606
-1 565 559 0.000173771
-2 565 560 559 0.000173771
-2 593 565 559 0.000173771
-3 593 565 560 559 0.000173771
-2 710 130 41 0.000173805
-3 710 162 130 41 0.000173805
-1 644 582 0.000173977
-1 644 605 0.000173977
-2 644 605 582 0.000173977
-0 920 0.000173977
-1 920 582 0.000173977
-1 920 605 0.000173977
-2 920 605 582 0.000173977
-1 920 644 0.000173977
-2 920 644 582 0.000173977
-2 920 644 605 0.000173977
-3 920 644 605 582 0.000173977
-1 352 290 0.000174139
-2 352 290 272 0.000174139
-2 505 352 290 0.000174139
-3 505 352 290 272 0.000174139
-1 400 183 0.000174712
-2 400 183 180 0.000174712
-2 400 183 181 0.000174712
-3 400 183 181 180 0.000174712
-0 921 0.000174756
-1 921 684 0.000174756
-1 921 827 0.000174756
-2 921 827 684 0.000174756
-0 922 0.000174756
-1 922 684 0.000174756
-1 922 827 0.000174756
-2 922 827 684 0.000174756
-1 922 921 0.000174756
-2 922 921 684 0.000174756
-2 922 921 827 0.000174756
-3 922 921 827 684 0.000174756
-1 557 272 0.000174838
-2 557 272 270 0.000174838
-2 557 273 272 0.000174838
-3 557 273 272 270 0.000174838
-1 760 186 0.000174936
-1 760 305 0.000174936
-2 760 305 186 0.000174936
-2 820 760 186 0.000174936
-2 820 760 305 0.000174936
-3 820 760 305 186 0.000174936
-2 916 722 711 0.000174991
-3 916 722 711 275 0.000174991
-1 671 646 0.000175137
-2 671 646 643 0.000175137
-0 923 0.000175137
-1 923 643 0.000175137
-1 923 646 0.000175137
-2 923 646 643 0.000175137
-1 923 671 0.000175137
-2 923 671 643 0.000175137
-2 923 671 646 0.000175137
-3 923 671 646 643 0.000175137
-1 761 320 0.000175149
-2 761 587 320 0.000175149
-2 761 588 320 0.000175149
-3 761 588 587 320 0.000175149
-1 657 163 0.000175373
-2 657 510 163 0.000175373
-1 660 163 0.000175373
-2 660 510 163 0.000175373
-2 660 657 163 0.000175373
-3 660 657 510 163 0.000175373
-1 348 158 0.000175432
-2 348 158 157 0.000175432
-2 348 207 158 0.000175432
-3 348 207 158 157 0.000175432
-1 759 586 0.00017547
-2 759 587 586 0.00017547
-1 793 586 0.00017547
-2 793 587 586 0.00017547
-2 793 759 586 0.00017547
-3 793 759 587 586 0.00017547
-1 226 32 0.000175614
-2 226 177 32 0.000175614
-2 308 226 32 0.000175614
-3 308 226 177 32 0.000175614
-0 924 0.000175629
-1 924 248 0.000175629
-1 924 799 0.000175629
-2 924 799 248 0.000175629
-1 924 800 0.000175629
-2 924 800 248 0.000175629
-2 924 800 799 0.000175629
-3 924 800 799 248 0.000175629
-1 639 573 0.000175713
-2 639 584 573 0.000175713
-2 639 585 573 0.000175713
-3 639 585 584 573 0.000175713
-1 828 723 0.000175737
-2 828 723 552 0.000175737
-2 828 821 723 0.000175737
-3 828 821 723 552 0.000175737
-1 82 68 0.000175819
-2 82 69 68 0.000175819
-2 404 82 68 0.000175819
-3 404 82 69 68 0.000175819
-2 401 320 58 0.000175866
-3 401 320 84 58 0.000175866
-1 319 58 0.000176041
-2 319 58 15 0.000176041
-2 454 319 58 0.000176041
-3 454 319 58 15 0.000176041
-1 794 478 0.000176076
-2 794 729 478 0.000176076
-1 794 792 0.000176076
-2 794 792 478 0.000176076
-2 794 792 729 0.000176076
-3 794 792 729 478 0.000176076
-1 351 272 0.000176171
-2 351 273 272 0.000176171
-2 352 351 272 0.000176171
-3 352 351 273 272 0.000176171
-1 861 129 0.0001763
-2 861 129 128 0.0001763
-2 861 550 129 0.0001763
-3 861 550 129 128 0.0001763
-1 823 396 0.000176418
-1 823 620 0.000176418
-2 823 620 396 0.000176418
-1 919 396 0.000176418
-2 919 620 396 0.000176418
-1 919 823 0.000176418
-2 919 823 396 0.000176418
-2 919 823 620 0.000176418
-3 919 823 620 396 0.000176418
-1 892 444 0.000176532
-2 892 444 442 0.000176532
-2 892 445 444 0.000176532
-3 892 445 444 442 0.000176532
-1 330 172 0.00017659
-2 330 306 172 0.00017659
-2 330 307 172 0.00017659
-3 330 307 306 172 0.00017659
-1 636 311 0.000176639
-2 636 311 155 0.000176639
-2 636 561 311 0.000176639
-3 636 561 311 155 0.000176639
-1 818 482 0.000176957
-2 818 547 482 0.000176957
-0 925 0.000176957
-1 925 482 0.000176957
-1 925 547 0.000176957
-2 925 547 482 0.000176957
-1 925 818 0.000176957
-2 925 818 482 0.000176957
-2 925 818 547 0.000176957
-3 925 818 547 482 0.000176957
-2 773 762 717 0.000177004
-3 773 762 748 717 0.000177004
-0 926 0.000177069
-1 926 883 0.000177069
-0 927 0.000177069
-1 927 883 0.000177069
-1 927 926 0.000177069
-2 927 926 883 0.000177069
-0 928 0.000177069
-1 928 883 0.000177069
-1 928 926 0.000177069
-2 928 926 883 0.000177069
-1 928 927 0.000177069
-2 928 927 883 0.000177069
-2 928 927 926 0.000177069
-3 928 927 926 883 0.000177069
-1 823 254 0.000177115
-2 823 396 254 0.000177115
-2 823 662 254 0.000177115
-2 823 662 396 0.000177115
-3 823 662 396 254 0.000177115
-1 413 272 0.000177315
-2 413 273 272 0.000177315
-2 557 413 272 0.000177315
-3 557 413 273 272 0.000177315
-1 779 634 0.000177373
-1 779 681 0.000177373
-2 779 681 634 0.000177373
-2 779 682 634 0.000177373
-2 779 682 681 0.000177373
-3 779 682 681 634 0.000177373
-1 242 24 0.000177434
-2 242 24 23 0.000177434
-2 694 242 24 0.000177434
-3 694 242 24 23 0.000177434
-2 597 501 107 0.00017747
-3 597 520 501 107 0.00017747
-2 636 561 560 0.000177527
-3 636 561 560 511 0.000177527
-1 742 602 0.000177832
-1 744 602 0.000177832
-2 744 742 602 0.000177832
-1 763 602 0.000177832
-1 763 742 0.000177832
-2 763 742 602 0.000177832
-2 763 744 602 0.000177832
-2 763 744 742 0.000177832
-3 763 744 742 602 0.000177832
-1 814 488 0.000178009
-2 814 488 487 0.000178009
-2 814 489 488 0.000178009
-3 814 489 488 487 0.000178009
-1 710 40 0.000178046
-2 710 41 40 0.000178046
-2 710 130 40 0.000178046
-3 710 130 41 40 0.000178046
-2 224 222 52 0.000178165
-3 224 223 222 52 0.000178165
-1 710 52 0.000178384
-2 710 52 41 0.000178384
-2 710 640 52 0.000178384
-3 710 640 52 41 0.000178384
-1 474 470 0.000178415
-2 474 470 140 0.000178415
-2 474 470 469 0.000178415
-3 474 470 469 140 0.000178415
-1 574 79 0.000178431
-2 574 79 78 0.000178431
-2 680 574 79 0.000178431
-3 680 574 79 78 0.000178431
-2 621 420 419 0.000178499
-1 838 420 0.000178499
-2 838 420 419 0.000178499
-2 838 621 420 0.000178499
-3 838 621 420 419 0.000178499
-2 706 77 76 0.000178565
-1 773 77 0.000178565
-2 773 77 76 0.000178565
-2 773 706 77 0.000178565
-3 773 706 77 76 0.000178565
-1 711 272 0.000178707
-2 711 272 270 0.000178707
-2 711 557 272 0.000178707
-3 711 557 272 270 0.000178707
-1 710 222 0.000178849
-2 710 222 52 0.000178849
-2 710 640 222 0.000178849
-3 710 640 222 52 0.000178849
-1 823 253 0.000178899
-2 823 396 253 0.000178899
-2 823 620 253 0.000178899
-3 823 620 396 253 0.000178899
-1 919 253 0.000178981
-2 919 620 253 0.000178981
-2 919 823 253 0.000178981
-3 919 823 620 253 0.000178981
-1 350 194 0.000179702
-2 519 350 194 0.000179702
-1 641 350 0.000179702
-2 641 350 194 0.000179702
-2 641 519 350 0.000179702
-3 641 519 350 194 0.000179702
-2 822 524 159 0.000180033
-3 822 524 159 148 0.000180033
-1 798 159 0.000180225
-1 798 289 0.000180225
-2 798 289 159 0.000180225
-1 822 798 0.000180225
-2 822 798 159 0.000180225
-2 822 798 289 0.000180225
-3 822 798 289 159 0.000180225
-1 522 95 0.000180538
-2 738 522 95 0.000180538
-0 929 0.000180538
-1 929 95 0.000180538
-1 929 522 0.000180538
-2 929 522 95 0.000180538
-1 929 738 0.000180538
-2 929 738 95 0.000180538
-2 929 738 522 0.000180538
-3 929 738 522 95 0.000180538
-1 887 804 0.000180543
-1 887 841 0.000180543
-2 887 841 804 0.000180543
-2 887 842 804 0.000180543
-2 887 842 841 0.000180543
-3 887 842 841 804 0.000180543
-2 761 759 586 0.000180902
-3 761 759 587 586 0.000180902
-1 910 78 0.000181272
-1 910 574 0.000181272
-2 910 574 78 0.000181272
-0 930 0.000181272
-1 930 78 0.000181272
-1 930 574 0.000181272
-2 930 574 78 0.000181272
-1 930 910 0.000181272
-2 930 910 78 0.000181272
-2 930 910 574 0.000181272
-3 930 910 574 78 0.000181272
-1 769 315 0.000181334
-2 769 374 315 0.000181334
-1 912 769 0.000181334
-2 912 769 315 0.000181334
-2 912 769 374 0.000181334
-3 912 769 374 315 0.000181334
-0 931 0.000181407
-1 931 670 0.000181407
-1 931 671 0.000181407
-2 931 671 670 0.000181407
-1 931 672 0.000181407
-2 931 672 670 0.000181407
-2 931 672 671 0.000181407
-3 931 672 671 670 0.000181407
-2 861 630 129 0.000181756
-3 861 630 129 128 0.000181756
-1 722 243 0.000182019
-2 722 243 23 0.000182019
-2 722 385 243 0.000182019
-3 722 385 243 23 0.000182019
-1 389 345 0.0001821
-2 389 345 295 0.0001821
-2 389 387 345 0.0001821
-3 389 387 345 295 0.0001821
-1 849 767 0.000182298
-1 849 824 0.000182298
-2 849 824 767 0.000182298
-1 849 825 0.000182298
-2 849 825 767 0.000182298
-2 849 825 824 0.000182298
-3 849 825 824 767 0.000182298
-2 519 485 273 0.000182331
-3 519 485 377 273 0.000182331
-1 576 183 0.000182481
-1 576 401 0.000182481
-2 576 401 183 0.000182481
-2 576 575 183 0.000182481
-2 576 575 401 0.000182481
-3 576 575 401 183 0.000182481
-1 339 336 0.000182541
-2 529 339 336 0.000182541
-1 531 339 0.000182541
-2 531 339 336 0.000182541
-2 531 529 339 0.000182541
-3 531 529 339 336 0.000182541
-2 537 217 44 0.000182751
-3 537 217 45 44 0.000182751
-0 932 0.000182785
-1 932 556 0.000182785
-1 932 708 0.000182785
-2 932 708 556 0.000182785
-1 932 917 0.000182785
-2 932 917 556 0.000182785
-2 932 917 708 0.000182785
-3 932 917 708 556 0.000182785
-1 664 414 0.000183098
-2 664 415 414 0.000183098
-2 664 416 414 0.000183098
-3 664 416 415 414 0.000183098
-1 718 701 0.000183156
-2 718 701 639 0.000183156
-2 754 718 701 0.000183156
-3 754 718 701 639 0.000183156
-1 739 89 0.000183182
-2 739 91 89 0.000183182
-2 739 346 89 0.000183182
-3 739 346 91 89 0.000183182
-1 245 69 0.000183416
-2 245 70 69 0.000183416
-2 245 71 69 0.000183416
-3 245 71 70 69 0.000183416
-1 771 592 0.000183507
-2 771 592 370 0.000183507
-2 771 592 591 0.000183507
-3 771 592 591 370 0.000183507
-1 312 121 0.000183626
-2 312 123 121 0.000183626
-2 312 256 121 0.000183626
-3 312 256 123 121 0.000183626
-2 823 254 253 0.00018384
-3 823 396 254 253 0.00018384
-1 561 477 0.000184021
-2 561 526 477 0.000184021
-2 561 545 477 0.000184021
-3 561 545 526 477 0.000184021
-1 711 413 0.000184166
-2 711 413 272 0.000184166
-2 711 557 413 0.000184166
-3 711 557 413 272 0.000184166
-2 413 412 272 0.000184345
-3 413 412 273 272 0.000184345
-1 221 130 0.00018464
-1 708 221 0.00018464
-2 708 221 130 0.00018464
-1 710 221 0.00018464
-2 710 221 130 0.00018464
-2 710 708 221 0.00018464
-3 710 708 221 130 0.00018464
-1 916 243 0.000184769
-2 916 385 243 0.000184769
-2 916 722 243 0.000184769
-3 916 722 385 243 0.000184769
-1 825 781 0.000184796
-1 825 784 0.000184796
-2 825 784 781 0.000184796
-2 825 824 781 0.000184796
-2 825 824 784 0.000184796
-3 825 824 784 781 0.000184796
-1 813 410 0.000184932
-0 933 0.000184932
-1 933 410 0.000184932
-1 933 813 0.000184932
-2 933 813 410 0.000184932
-0 934 0.000184932
-1 934 410 0.000184932
-1 934 813 0.000184932
-2 934 813 410 0.000184932
-1 934 933 0.000184932
-2 934 933 410 0.000184932
-2 934 933 813 0.000184932
-3 934 933 813 410 0.000184932
-2 789 479 478 0.000184932
-3 789 569 479 478 0.000184932
-1 222 41 0.000184974
-2 222 52 41 0.000184974
-2 710 222 41 0.000184974
-3 710 222 52 41 0.000184974
-1 222 40 0.000184992
-2 222 41 40 0.000184992
-2 710 222 40 0.000184992
-3 710 222 41 40 0.000184992
-2 222 52 40 0.000184993
-3 222 52 41 40 0.000184993
-1 114 86 0.000185115
-2 114 88 86 0.000185115
-2 115 114 86 0.000185115
-3 115 114 88 86 0.000185115
-1 924 247 0.000185368
-2 924 248 247 0.000185368
-2 924 800 247 0.000185368
-3 924 800 248 247 0.000185368
-1 720 422 0.000185449
-2 720 655 422 0.000185449
-1 918 422 0.000185449
-1 918 655 0.000185449
-2 918 655 422 0.000185449
-2 918 720 422 0.000185449
-2 918 720 655 0.000185449
-3 918 720 655 422 0.000185449
-2 292 208 159 0.000186284
-3 292 291 208 159 0.000186284
-1 878 862 0.000186422
-2 878 862 756 0.000186422
-2 878 872 862 0.000186422
-3 878 872 862 756 0.000186422
-2 838 622 420 0.000186522
-2 838 622 621 0.000186522
-3 838 622 621 420 0.000186522
-1 773 680 0.000186827
-2 773 680 77 0.000186827
-2 773 706 680 0.000186827
-3 773 706 680 77 0.000186827
-2 641 495 350 0.000186847
-3 641 519 495 350 0.000186847
-2 365 309 81 0.000187138
-3 365 309 213 81 0.000187138
-0 935 0.000187413
-1 935 359 0.000187413
-1 935 604 0.000187413
-2 935 604 359 0.000187413
-1 935 770 0.000187413
-2 935 770 359 0.000187413
-2 935 770 604 0.000187413
-3 935 770 604 359 0.000187413
-1 643 603 0.000187435
-2 671 643 603 0.000187435
-1 923 603 0.000187435
-2 923 643 603 0.000187435
-2 923 671 603 0.000187435
-3 923 671 643 603 0.000187435
-1 268 185 0.000187459
-2 268 185 45 0.000187459
-2 268 217 185 0.000187459
-3 268 217 185 45 0.000187459
-1 498 410 0.000187543
-2 498 411 410 0.000187543
-2 813 411 410 0.000187543
-2 813 498 410 0.000187543
-3 813 498 411 410 0.000187543
-1 894 198 0.000187806
-1 894 521 0.000187806
-2 894 521 198 0.000187806
-1 894 811 0.000187806
-2 894 811 198 0.000187806
-2 894 811 521 0.000187806
-3 894 811 521 198 0.000187806
-2 361 360 302 0.000187822
-1 692 360 0.000187822
-2 692 360 302 0.000187822
-2 692 361 360 0.000187822
-3 692 361 360 302 0.000187822
-1 932 130 0.000187973
-2 932 556 130 0.000187973
-2 932 708 130 0.000187973
-3 932 708 556 130 0.000187973
-1 665 414 0.000188034
-2 665 415 414 0.000188034
-2 665 626 414 0.000188034
-3 665 626 415 414 0.000188034
-2 470 387 345 0.000188258
-3 470 413 387 345 0.000188258
-2 576 409 183 0.000188337
-3 576 575 409 183 0.000188337
-1 810 760 0.000188733
-2 810 760 186 0.000188733
-2 810 760 305 0.000188733
-3 810 760 305 186 0.000188733
-1 828 543 0.000188851
-2 828 543 230 0.000188851
-2 828 821 543 0.000188851
-3 828 821 543 230 0.000188851
-2 773 707 680 0.000188897
-3 773 707 706 680 0.000188897
-1 799 238 0.000188962
-2 799 238 237 0.000188962
-2 799 492 238 0.000188962
-3 799 492 238 237 0.000188962
-1 848 669 0.000188977
-2 848 712 669 0.000188977
-2 848 847 669 0.000188977
-2 848 847 712 0.000188977
-3 848 847 712 669 0.000188977
-1 250 84 0.000189245
-2 250 180 84 0.000189245
-2 588 250 84 0.000189245
-3 588 250 180 84 0.000189245
-2 719 302 301 0.000189374
-1 719 303 0.000189374
-2 719 303 301 0.000189374
-2 719 303 302 0.000189374
-3 719 303 302 301 0.000189374
-1 589 561 0.000189397
-2 589 561 477 0.000189397
-2 589 561 526 0.000189397
-3 589 561 526 477 0.000189397
-1 910 572 0.00018947
-2 910 572 78 0.00018947
-2 910 574 572 0.00018947
-3 910 574 572 78 0.00018947
-2 681 616 615 0.000189825
-1 808 615 0.000189825
-2 808 616 615 0.000189825
-2 808 681 615 0.000189825
-3 808 681 616 615 0.000189825
-1 570 315 0.000189998
-2 685 570 315 0.000189998
-1 912 570 0.000189998
-2 912 570 315 0.000189998
-2 912 685 570 0.000189998
-3 912 685 570 315 0.000189998
-1 625 417 0.000190028
-2 625 417 415 0.000190028
-2 626 625 417 0.000190028
-3 626 625 417 415 0.000190028
-1 240 133 0.000190094
-2 292 240 133 0.000190094
-2 434 240 133 0.000190094
-3 434 292 240 133 0.000190094
-1 625 606 0.00019011
-1 695 625 0.00019011
-2 695 625 606 0.00019011
-1 919 625 0.00019011
-2 919 625 606 0.00019011
-2 919 695 625 0.00019011
-3 919 695 625 606 0.00019011
-1 924 556 0.00019092
-2 924 800 556 0.00019092
-1 924 917 0.00019092
-2 924 917 556 0.00019092
-2 924 917 800 0.00019092
-3 924 917 800 556 0.00019092
-0 936 0.000191158
-0 937 0.000191158
-1 937 936 0.000191158
-0 938 0.000191158
-1 938 936 0.000191158
-1 938 937 0.000191158
-2 938 937 936 0.000191158
-0 939 0.000191158
-1 939 936 0.000191158
-1 939 937 0.000191158
-2 939 937 936 0.000191158
-1 939 938 0.000191158
-2 939 938 936 0.000191158
-2 939 938 937 0.000191158
-3 939 938 937 936 0.000191158
-1 932 924 0.000191228
-2 932 924 556 0.000191228
-2 932 924 917 0.000191228
-3 932 924 917 556 0.000191228
-1 555 427 0.00019133
-2 555 427 249 0.00019133
-2 555 427 424 0.00019133
-3 555 427 424 249 0.00019133
-1 350 297 0.00019136
-2 350 297 194 0.00019136
-2 519 350 297 0.00019136
-3 519 350 297 194 0.00019136
-1 218 134 0.000191368
-2 218 216 134 0.000191368
-1 253 218 0.000191368
-2 253 218 134 0.000191368
-2 253 218 216 0.000191368
-3 253 218 216 134 0.000191368
-1 570 329 0.000191602
-2 570 329 315 0.000191602
-2 685 570 329 0.000191602
-3 685 570 329 315 0.000191602
-1 891 656 0.000191916
-2 891 720 656 0.000191916
-2 891 721 656 0.000191916
-2 891 721 720 0.000191916
-3 891 721 720 656 0.000191916
-1 921 480 0.00019205
-1 921 482 0.00019205
-2 921 482 480 0.00019205
-1 921 871 0.00019205
-2 921 871 480 0.00019205
-2 921 871 482 0.00019205
-3 921 871 482 480 0.00019205
-1 548 28 0.000192056
-2 548 129 28 0.000192056
-2 548 459 28 0.000192056
-3 548 459 129 28 0.000192056
-1 597 503 0.000192273
-2 597 503 501 0.000192273
-2 691 597 503 0.000192273
-3 691 597 503 501 0.000192273
-2 291 268 209 0.000192306
-3 291 268 209 208 0.000192306
-1 389 328 0.000192565
-2 389 328 295 0.000192565
-2 389 345 328 0.000192565
-3 389 345 328 295 0.000192565
-1 376 210 0.000192592
-2 376 375 210 0.000192592
-1 537 210 0.000192592
-2 537 375 210 0.000192592
-2 537 376 210 0.000192592
-3 537 376 375 210 0.000192592
-1 932 221 0.000192667
-2 932 221 130 0.000192667
-2 932 708 221 0.000192667
-3 932 708 221 130 0.000192667
-1 866 591 0.000193022
-2 866 591 589 0.000193022
-2 866 815 591 0.000193022
-3 866 815 591 589 0.000193022
-1 785 507 0.000193389
-2 785 566 507 0.000193389
-1 785 750 0.000193389
-2 785 750 507 0.000193389
-2 785 750 566 0.000193389
-3 785 750 566 507 0.000193389
-2 589 561 545 0.000193421
-3 589 561 545 477 0.000193421
-1 243 24 0.000193522
-2 243 24 23 0.000193522
-2 243 242 24 0.000193522
-3 243 242 24 23 0.000193522
-1 625 620 0.000194021
-2 625 620 606 0.000194021
-2 919 625 620 0.000194021
-3 919 625 620 606 0.000194021
-1 929 357 0.000194034
-1 929 359 0.000194034
-2 929 359 357 0.000194034
-1 929 523 0.000194034
-2 929 523 357 0.000194034
-2 929 523 359 0.000194034
-3 929 523 359 357 0.000194034
-1 717 388 0.000194303
-2 717 658 388 0.000194303
-2 749 717 388 0.000194303
-3 749 717 658 388 0.000194303
-1 466 452 0.0001945
-2 466 452 327 0.0001945
-2 467 466 452 0.0001945
-3 467 466 452 327 0.0001945
-2 828 543 231 0.000194529
-3 828 543 231 230 0.000194529
-0 940 0.000194764
-1 940 552 0.000194764
-1 940 828 0.000194764
-2 940 828 552 0.000194764
-1 940 829 0.000194764
-2 940 829 552 0.000194764
-2 940 829 828 0.000194764
-3 940 829 828 552 0.000194764
-2 254 218 134 0.000194841
-2 254 253 218 0.000194841
-3 254 253 218 134 0.000194841
-1 604 364 0.000195109
-2 604 364 363 0.000195109
-1 605 364 0.000195109
-2 605 364 363 0.000195109
-2 605 604 364 0.000195109
-3 605 604 364 363 0.000195109
-1 384 238 0.00019515
-2 384 239 238 0.00019515
-1 780 238 0.00019515
-1 780 239 0.00019515
-2 780 239 238 0.00019515
-2 780 384 238 0.00019515
-2 780 384 239 0.00019515
-3 780 384 239 238 0.00019515
-2 323 301 300 0.000195607
-2 546 301 300 0.000195607
-3 546 323 301 300 0.000195607
-1 762 493 0.000195635
-2 762 493 388 0.000195635
-2 762 711 493 0.000195635
-3 762 711 493 388 0.000195635
-1 743 445 0.000195809
-2 743 445 443 0.000195809
-2 743 465 445 0.000195809
-3 743 465 445 443 0.000195809
-1 880 561 0.000195973
-2 880 561 545 0.000195973
-0 941 0.000195973
-1 941 545 0.000195973
-1 941 561 0.000195973
-2 941 561 545 0.000195973
-1 941 880 0.000195973
-2 941 880 545 0.000195973
-2 941 880 561 0.000195973
-3 941 880 561 545 0.000195973
-1 912 329 0.000195998
-2 912 329 315 0.000195998
-2 912 570 329 0.000195998
-3 912 570 329 315 0.000195998
-2 323 114 86 0.000196082
-3 323 114 88 86 0.000196082
-1 318 57 0.000196082
-2 318 57 14 0.000196082
-1 576 57 0.000196082
-2 576 57 14 0.000196082
-2 576 318 57 0.000196082
-3 576 318 57 14 0.000196082
-1 729 7 0.00019643
-2 729 189 7 0.00019643
-2 729 326 7 0.00019643
-3 729 326 189 7 0.00019643
-2 692 360 72 0.000196485
-3 692 361 360 72 0.000196485
-1 795 392 0.00019671
-1 795 487 0.00019671
-2 795 487 392 0.00019671
-1 795 631 0.00019671
-2 795 631 392 0.00019671
-2 795 631 487 0.00019671
-3 795 631 487 392 0.00019671
-2 552 458 174 0.000196911
-3 552 461 458 174 0.000196911
-0 942 0.000196961
-1 942 564 0.000196961
-1 942 723 0.000196961
-2 942 723 564 0.000196961
-1 942 821 0.000196961
-2 942 821 564 0.000196961
-2 942 821 723 0.000196961
-3 942 821 723 564 0.000196961
-1 686 635 0.000197121
-2 686 635 284 0.000197121
-2 686 635 525 0.000197121
-3 686 635 525 284 0.000197121
-1 637 408 0.000197221
-2 637 408 398 0.000197221
-2 637 612 408 0.000197221
-3 637 612 408 398 0.000197221
-2 494 226 177 0.000197242
-3 494 298 226 177 0.000197242
-1 289 241 0.000197388
-2 289 241 240 0.000197388
-1 292 241 0.000197388
-2 292 241 240 0.000197388
-2 292 289 241 0.000197388
-3 292 289 241 240 0.000197388
-1 565 346 0.000197463
-2 565 467 346 0.000197463
-2 739 565 346 0.000197463
-3 739 565 467 346 0.000197463
-1 625 253 0.000197544
-2 823 625 253 0.000197544
-2 919 625 253 0.000197544
-2 919 823 625 0.000197544
-3 919 823 625 253 0.000197544
-1 898 830 0.000197649
-1 898 831 0.000197649
-2 898 831 830 0.000197649
-0 943 0.000197649
-1 943 830 0.000197649
-1 943 831 0.000197649
-2 943 831 830 0.000197649
-1 943 898 0.000197649
-2 943 898 830 0.000197649
-2 943 898 831 0.000197649
-3 943 898 831 830 0.000197649
-2 705 456 340 0.000198162
-3 705 456 455 340 0.000198162
-1 794 789 0.000198393
-2 794 789 478 0.000198393
-2 794 792 789 0.000198393
-3 794 792 789 478 0.000198393
-1 914 547 0.000198701
-2 914 547 481 0.000198701
-2 914 547 482 0.000198701
-3 914 547 482 481 0.000198701
-1 328 99 0.000198808
-2 328 294 99 0.000198808
-2 641 328 99 0.000198808
-3 641 328 294 99 0.000198808
-2 703 702 107 0.000198972
-3 703 702 231 107 0.000198972
-2 174 173 74 0.000199043
-3 174 173 74 73 0.000199043
-1 409 318 0.000199091
-2 576 409 318 0.000199091
-2 577 409 318 0.000199091
-3 577 576 409 318 0.000199091
-1 241 159 0.00019912
-2 289 241 159 0.00019912
-2 798 241 159 0.00019912
-2 798 289 241 0.00019912
-3 798 289 241 159 0.00019912
-1 593 269 0.000199159
-2 593 269 164 0.000199159
-2 593 565 269 0.000199159
-3 593 565 269 164 0.000199159
-1 559 269 0.00019916
-2 565 559 269 0.00019916
-2 593 559 269 0.00019916
-3 593 565 559 269 0.00019916
-1 559 164 0.00019916
-2 559 269 164 0.00019916
-2 593 559 164 0.00019916
-3 593 559 269 164 0.00019916
-1 697 336 0.000199169
-2 697 336 263 0.000199169
-2 697 579 263 0.000199169
-2 697 579 336 0.000199169
-3 697 579 336 263 0.000199169
-1 885 138 0.000199317
-1 885 140 0.000199317
-2 885 140 138 0.000199317
-1 885 658 0.000199317
-2 885 658 138 0.000199317
-2 885 658 140 0.000199317
-3 885 658 140 138 0.000199317
-2 662 254 153 0.000199442
-3 662 254 153 150 0.000199442
-2 799 246 238 0.000199521
-3 799 492 246 238 0.000199521
-2 604 364 358 0.000199641
-3 604 364 363 358 0.000199641
-1 814 409 0.000200137
-2 814 409 318 0.000200137
-2 814 577 409 0.000200137
-3 814 577 409 318 0.000200137
-1 706 580 0.000200269
-2 706 580 76 0.000200269
-2 706 580 79 0.000200269
-3 706 580 79 76 0.000200269
-1 772 723 0.000200346
-2 772 723 552 0.000200346
-2 772 723 564 0.000200346
-3 772 723 564 552 0.000200346
-1 920 652 0.000200348
-2 920 652 582 0.000200348
-1 920 653 0.000200348
-2 920 653 582 0.000200348
-2 920 653 652 0.000200348
-3 920 653 652 582 0.000200348
-1 925 817 0.000200351
-2 925 817 547 0.000200351
-2 925 818 817 0.000200351
-3 925 818 817 547 0.000200351
-1 289 208 0.000200426
-2 289 208 159 0.000200426
-2 292 289 208 0.000200426
-3 292 289 208 159 0.000200426
-1 566 173 0.000200515
-2 566 507 173 0.000200515
-1 785 173 0.000200515
-2 785 507 173 0.000200515
-2 785 566 173 0.000200515
-3 785 566 507 173 0.000200515
-0 944 0.00020077
-0 945 0.00020077
-1 945 944 0.00020077
-0 946 0.00020077
-1 946 944 0.00020077
-1 946 945 0.00020077
-2 946 945 944 0.00020077
-0 947 0.00020077
-1 947 944 0.00020077
-1 947 945 0.00020077
-2 947 945 944 0.00020077
-1 947 946 0.00020077
-2 947 946 944 0.00020077
-2 947 946 945 0.00020077
-3 947 946 945 944 0.00020077
-1 485 351 0.000201215
-2 485 351 273 0.000201215
-2 519 485 351 0.000201215
-3 519 485 351 273 0.000201215
-1 728 455 0.000201372
-2 728 704 455 0.000201372
-2 728 705 455 0.000201372
-3 728 705 704 455 0.000201372
-1 892 881 0.000201422
-2 892 881 444 0.000201422
-1 907 892 0.000201422
-2 907 892 444 0.000201422
-2 907 892 881 0.000201422
-3 907 892 881 444 0.000201422
-1 851 341 0.000201661
-1 851 457 0.000201661
-2 851 457 341 0.000201661
-1 893 457 0.000201661
-2 893 457 341 0.000201661
-1 893 851 0.000201661
-2 893 851 341 0.000201661
-2 893 851 457 0.000201661
-3 893 851 457 341 0.000201661
-1 224 40 0.000201789
-2 224 52 40 0.000201789
-2 224 222 40 0.000201789
-3 224 222 52 40 0.000201789
-1 55 2 0.000201942
-2 55 38 2 0.000201942
-2 55 54 2 0.000201942
-3 55 54 38 2 0.000201942
-1 833 24 0.000202154
-1 833 242 0.000202154
-2 833 242 24 0.000202154
-2 833 694 24 0.000202154
-2 833 694 242 0.000202154
-3 833 694 242 24 0.000202154
-1 799 787 0.000202293
-1 924 787 0.000202293
-2 924 799 787 0.000202293
-0 948 0.000202293
-1 948 787 0.000202293
-1 948 799 0.000202293
-2 948 799 787 0.000202293
-1 948 924 0.000202293
-2 948 924 787 0.000202293
-2 948 924 799 0.000202293
-3 948 924 799 787 0.000202293
-1 807 613 0.000202307
-2 807 616 613 0.000202307
-1 933 613 0.000202307
-1 933 616 0.000202307
-2 933 616 613 0.000202307
-1 933 807 0.000202307
-2 933 807 613 0.000202307
-2 933 807 616 0.000202307
-3 933 807 616 613 0.000202307
-1 350 195 0.000202629
-2 350 195 194 0.000202629
-2 641 350 195 0.000202629
-3 641 350 195 194 0.000202629
-1 466 6 0.000203135
-2 466 179 6 0.000203135
-2 466 327 6 0.000203135
-3 466 327 179 6 0.000203135
-1 782 44 0.000203136
-1 782 46 0.000203136
-2 782 46 44 0.000203136
-1 782 184 0.000203136
-2 782 184 44 0.000203136
-2 782 184 46 0.000203136
-3 782 184 46 44 0.000203136
-1 942 543 0.000203136
-2 942 564 543 0.000203136
-2 942 821 543 0.000203136
-3 942 821 564 543 0.000203136
-1 458 90 0.000204204
-2 458 174 90 0.000204204
-2 552 458 90 0.000204204
-3 552 458 174 90 0.000204204
-1 747 375 0.000204333
-2 747 376 375 0.000204333
-2 769 747 375 0.000204333
-2 769 747 376 0.000204333
-3 769 747 376 375 0.000204333
-1 752 28 0.000204913
-2 752 28 25 0.000204913
-2 752 459 28 0.000204913
-3 752 459 28 25 0.000204913
-1 611 379 0.000205303
-2 611 379 145 0.000205303
-2 611 379 183 0.000205303
-3 611 379 183 145 0.000205303
-1 723 543 0.000205508
-2 723 564 543 0.000205508
-2 772 723 543 0.000205508
-3 772 723 564 543 0.000205508
-1 495 99 0.000205614
-2 495 328 99 0.000205614
-2 641 495 99 0.000205614
-3 641 495 328 99 0.000205614
-1 803 718 0.000205636
-2 803 754 718 0.000205636
-2 848 803 718 0.000205636
-3 848 803 754 718 0.000205636
-1 944 725 0.000205879
-1 947 725 0.000205879
-2 947 944 725 0.000205879
-0 949 0.000205879
-1 949 725 0.000205879
-1 949 944 0.000205879
-2 949 944 725 0.000205879
-1 949 947 0.000205879
-2 949 947 725 0.000205879
-2 949 947 944 0.000205879
-3 949 947 944 725 0.000205879
-2 942 723 543 0.000206094
-3 942 723 564 543 0.000206094
-1 423 331 0.000206102
-2 423 332 331 0.000206102
-2 508 423 331 0.000206102
-3 508 423 332 331 0.000206102
-1 521 362 0.000206324
-2 521 362 357 0.000206324
-1 910 521 0.000206324
-2 910 521 357 0.000206324
-2 910 521 362 0.000206324
-3 910 521 362 357 0.000206324
-0 950 0.000206546
-1 950 270 0.000206546
-1 950 711 0.000206546
-2 950 711 270 0.000206546
-1 950 916 0.000206546
-2 950 916 270 0.000206546
-2 950 916 711 0.000206546
-3 950 916 711 270 0.000206546
-1 559 259 0.00020697
-2 559 259 164 0.00020697
-2 593 559 259 0.00020697
-3 593 559 259 164 0.00020697
-1 940 723 0.000207123
-2 940 723 552 0.000207123
-2 940 828 723 0.000207123
-3 940 828 723 552 0.000207123
-1 495 195 0.000207367
-2 495 350 195 0.000207367
-2 641 495 195 0.000207367
-3 641 495 350 195 0.000207367
-2 558 177 3 0.000207488
-3 558 177 63 3 0.000207488
-1 562 203 0.000207562
-2 562 342 203 0.000207562
-2 563 562 203 0.000207562
-3 563 562 342 203 0.000207562
-1 470 389 0.000207636
-2 470 389 345 0.000207636
-2 470 389 387 0.000207636
-3 470 389 387 345 0.000207636
-1 351 297 0.000207639
-2 485 351 297 0.000207639
-2 519 351 297 0.000207639
-3 519 485 351 297 0.000207639
-1 241 208 0.000207723
-2 289 241 208 0.000207723
-2 292 241 208 0.000207723
-3 292 289 241 208 0.000207723
-1 514 140 0.000208013
-2 514 141 140 0.000208013
-2 514 513 140 0.000208013
-3 514 513 141 140 0.000208013
-2 401 400 181 0.000208153
-2 405 401 181 0.000208153
-3 405 401 400 181 0.000208153
-1 910 522 0.000208221
-2 910 522 357 0.000208221
-2 910 522 521 0.000208221
-3 910 522 521 357 0.000208221
-1 723 90 0.000208294
-2 723 458 90 0.000208294
-2 723 552 90 0.000208294
-3 723 552 458 90 0.000208294
-2 474 470 138 0.000208699
-3 474 470 140 138 0.000208699
-1 466 157 0.000208883
-2 466 346 157 0.000208883
-2 466 348 157 0.000208883
-3 466 348 346 157 0.000208883
-1 413 314 0.000208952
-2 413 368 314 0.000208952
-2 413 412 314 0.000208952
-3 413 412 368 314 0.000208952
-2 625 620 253 0.00020921
-3 919 625 620 253 0.00020921
-2 241 208 159 0.000209265
-3 289 241 208 159 0.000209265
-1 521 201 0.0002098
-2 521 201 198 0.0002098
-1 894 201 0.0002098
-2 894 201 198 0.0002098
-2 894 521 201 0.0002098
-3 894 521 201 198 0.0002098
-0 951 0.000209814
-1 951 670 0.000209814
-1 951 672 0.000209814
-2 951 672 670 0.000209814
-1 951 931 0.000209814
-2 951 931 670 0.000209814
-2 951 931 672 0.000209814
-3 951 931 672 670 0.000209814
-1 576 319 0.000209908
-2 576 319 14 0.000209908
-2 577 576 319 0.000209908
-3 577 576 319 14 0.000209908
-2 495 195 99 0.000209965
-3 641 495 195 99 0.000209965
-1 221 40 0.000209995
-2 222 221 40 0.000209995
-2 710 221 40 0.000209995
-2 710 222 221 0.000209995
-3 710 222 221 40 0.000209995
-1 931 901 0.000210401
-1 931 902 0.000210401
-2 931 902 901 0.000210401
-1 951 901 0.000210401
-1 951 902 0.000210401
-2 951 902 901 0.000210401
-2 951 931 901 0.000210401
-2 951 931 902 0.000210401
-3 951 931 902 901 0.000210401
-1 812 515 0.000210417
-2 812 516 515 0.000210417
-2 812 518 515 0.000210417
-3 812 518 516 515 0.000210417
-1 478 7 0.000210828
-2 478 103 7 0.000210828
-2 478 189 7 0.000210828
-3 478 189 103 7 0.000210828
-1 486 355 0.000211073
-2 487 486 355 0.000211073
-2 631 486 355 0.000211073
-2 631 487 486 0.000211073
-3 631 487 486 355 0.000211073
-1 786 728 0.000211199
-2 786 728 704 0.000211199
-1 881 704 0.000211199
-1 881 728 0.000211199
-2 881 728 704 0.000211199
-2 881 786 704 0.000211199
-2 881 786 728 0.000211199
-3 881 786 728 704 0.000211199
-2 224 221 40 0.000211345
-3 224 222 221 40 0.000211345
-0 952 0.000211358
-1 952 28 0.000211358
-1 952 459 0.000211358
-2 952 459 28 0.000211358
-1 952 548 0.000211358
-2 952 548 28 0.000211358
-2 952 548 459 0.000211358
-3 952 548 459 28 0.000211358
-1 178 165 0.000211463
-2 252 178 165 0.000211463
-2 675 178 165 0.000211463
-3 675 252 178 165 0.000211463
-1 845 500 0.000211616
-2 845 500 234 0.000211616
-2 845 501 500 0.000211616
-3 845 501 500 234 0.000211616
-2 351 350 297 0.000211674
-3 519 351 350 297 0.000211674
-1 686 372 0.00021168
-2 686 372 369 0.00021168
-2 686 372 370 0.00021168
-3 686 372 370 369 0.00021168
-2 389 328 294 0.000211701
-3 389 328 295 294 0.000211701
-1 272 244 0.000211881
-2 351 272 244 0.000211881
-2 352 272 244 0.000211881
-3 352 351 272 244 0.000211881
-2 924 556 247 0.000211928
-3 924 800 556 247 0.000211928
-1 833 212 0.000211988
-2 833 212 24 0.000211988
-2 833 694 212 0.000211988
-3 833 694 212 24 0.000211988
-2 686 590 372 0.000212023
-3 686 590 372 370 0.000212023
-0 953 0.000212398
-1 953 783 0.000212398
-1 953 784 0.000212398
-2 953 784 783 0.000212398
-1 953 824 0.000212398
-2 953 824 783 0.000212398
-2 953 824 784 0.000212398
-3 953 824 784 783 0.000212398
-1 747 537 0.000212571
-2 747 537 44 0.000212571
-2 747 537 376 0.000212571
-3 747 537 376 44 0.000212571
-1 941 690 0.00021263
-2 941 690 545 0.00021263
-2 941 690 561 0.00021263
-3 941 690 561 545 0.00021263
-1 707 76 0.000212663
-2 707 77 76 0.000212663
-2 707 706 76 0.000212663
-3 707 706 77 76 0.000212663
-1 374 46 0.000212726
-2 374 373 46 0.000212726
-2 375 374 46 0.000212726
-3 375 374 373 46 0.000212726
-1 882 260 0.000212841
-2 882 816 260 0.000212841
-2 882 826 260 0.000212841
-3 882 826 816 260 0.000212841
-1 495 381 0.000212842
-2 495 381 99 0.000212842
-2 495 381 195 0.000212842
-3 495 381 195 99 0.000212842
-1 239 49 0.000213047
-2 383 239 49 0.000213047
-2 384 239 49 0.000213047
-3 384 383 239 49 0.000213047
-2 221 130 40 0.000213094
-3 710 221 130 40 0.000213094
-1 304 217 0.000213577
-2 304 217 185 0.000213577
-2 305 304 217 0.000213577
-3 305 304 217 185 0.000213577
-1 499 486 0.00021366
-1 499 488 0.00021366
-2 499 488 486 0.00021366
-1 733 488 0.00021366
-2 733 488 486 0.00021366
-1 733 499 0.00021366
-2 733 499 486 0.00021366
-2 733 499 488 0.00021366
-3 733 499 488 486 0.00021366
-1 840 805 0.000213878
-2 840 805 804 0.000213878
-0 954 0.000213878
-1 954 804 0.000213878
-1 954 805 0.000213878
-2 954 805 804 0.000213878
-1 954 840 0.000213878
-2 954 840 804 0.000213878
-2 954 840 805 0.000213878
-3 954 840 805 804 0.000213878
-2 761 760 320 0.000213923
-3 761 760 588 320 0.000213923
-1 488 355 0.00021427
-2 488 486 355 0.00021427
-2 488 487 355 0.00021427
-3 488 487 486 355 0.00021427
-2 882 262 260 0.000214277
-3 882 816 262 260 0.000214277
-1 750 565 0.00021428
-2 750 566 565 0.00021428
-2 785 750 565 0.00021428
-3 785 750 566 565 0.00021428
-1 787 775 0.000214309
-2 799 787 775 0.000214309
-1 948 775 0.000214309
-2 948 787 775 0.000214309
-2 948 799 775 0.000214309
-3 948 799 787 775 0.000214309
-1 625 254 0.000214452
-2 625 254 253 0.000214452
-2 823 625 254 0.000214452
-3 823 625 254 253 0.000214452
-1 469 17 0.000214636
-2 469 141 17 0.000214636
-2 474 469 17 0.000214636
-3 474 469 141 17 0.000214636
-2 319 58 14 0.000214732
-3 319 58 15 14 0.000214732
-2 662 625 254 0.000214912
-3 823 662 625 254 0.000214912
-1 181 57 0.000215095
-2 400 181 57 0.000215095
-2 401 181 57 0.000215095
-3 401 400 181 57 0.000215095
-1 434 242 0.000215247
-2 434 242 240 0.000215247
-1 833 240 0.000215247
-2 833 242 240 0.000215247
-1 833 434 0.000215247
-2 833 434 240 0.000215247
-2 833 434 242 0.000215247
-3 833 434 242 240 0.000215247
-2 769 375 315 0.000215297
-3 769 375 374 315 0.000215297
-1 872 691 0.000215645
-2 872 691 503 0.000215645
-1 889 691 0.000215645
-2 889 691 503 0.000215645
-2 889 872 691 0.000215645
-3 889 872 691 503 0.000215645
-2 523 521 362 0.000215801
-3 523 521 362 357 0.000215801
-2 880 589 561 0.000215812
-3 880 589 561 545 0.000215812
-1 836 565 0.000215976
-2 836 565 269 0.000215976
-2 836 739 565 0.000215976
-3 836 739 565 269 0.000215976
-2 833 695 212 0.000216128
-3 833 695 694 212 0.000216128
-2 741 686 635 0.000216143
-3 741 686 635 525 0.000216143
-1 514 138 0.000216289
-2 514 140 138 0.000216289
-2 514 141 138 0.000216289
-3 514 141 140 138 0.000216289
-1 506 170 0.000216446
-2 506 171 170 0.000216446
-2 506 505 170 0.000216446
-3 506 505 171 170 0.000216446
-1 829 542 0.000216789
-2 829 542 231 0.000216789
-2 829 702 542 0.000216789
-3 829 702 542 231 0.000216789
-1 833 625 0.000216859
-2 833 625 606 0.000216859
-2 833 695 625 0.000216859
-3 833 695 625 606 0.000216859
-1 456 341 0.00021742
-2 456 341 340 0.00021742
-2 457 456 341 0.00021742
-3 457 456 341 340 0.00021742
-1 463 444 0.000217588
-2 463 444 442 0.000217588
-2 463 444 443 0.000217588
-3 463 444 443 442 0.000217588
-1 950 722 0.000217643
-2 950 722 711 0.000217643
-2 950 916 722 0.000217643
-3 950 916 722 711 0.000217643
-1 923 644 0.000217695
-2 923 644 643 0.000217695
-2 923 646 644 0.000217695
-3 923 646 644 643 0.000217695
-1 846 821 0.000217933
-1 846 828 0.000217933
-2 846 828 821 0.000217933
-1 907 821 0.000217933
-1 907 828 0.000217933
-2 907 828 821 0.000217933
-1 907 846 0.000217933
-2 907 846 821 0.000217933
-2 907 846 828 0.000217933
-3 907 846 828 821 0.000217933
-1 730 359 0.000218019
-1 929 730 0.000218019
-2 929 730 359 0.000218019
-1 935 730 0.000218019
-2 935 730 359 0.000218019
-1 935 929 0.000218019
-2 935 929 359 0.000218019
-2 935 929 730 0.000218019
-3 935 929 730 359 0.000218019
-1 63 30 0.000218184
-2 137 63 30 0.000218184
-2 176 63 30 0.000218184
-3 176 137 63 30 0.000218184
-1 861 629 0.000218198
-2 861 629 129 0.000218198
-2 861 630 629 0.000218198
-3 861 630 629 129 0.000218198
-1 595 465 0.000218241
-2 595 465 442 0.000218241
-2 595 465 462 0.000218241
-3 595 465 462 442 0.000218241
-1 638 254 0.000218415
-2 638 254 153 0.000218415
-2 638 628 254 0.000218415
-3 638 628 254 153 0.000218415
-1 934 498 0.00021849
-2 934 498 410 0.00021849
-2 934 813 498 0.00021849
-3 934 813 498 410 0.00021849
-1 441 369 0.000218844
-2 441 369 65 0.000218844
-2 441 369 66 0.000218844
-3 441 369 66 65 0.000218844
-1 625 133 0.000218859
-2 625 253 133 0.000218859
-2 625 620 133 0.000218859
-3 625 620 253 133 0.000218859
-1 611 408 0.000219051
-2 611 409 408 0.000219051
-2 612 409 408 0.000219051
-2 612 611 408 0.000219051
-3 612 611 409 408 0.000219051
-1 662 638 0.000219079
-2 662 638 153 0.000219079
-2 662 638 626 0.000219079
-3 662 638 626 153 0.000219079
-1 686 611 0.000219364
-2 686 611 143 0.000219364
-2 686 637 611 0.000219364
-3 686 637 611 143 0.000219364
-2 423 331 224 0.0002196
-3 423 332 331 224 0.0002196
-1 875 825 0.000220063
-2 875 825 784 0.000220063
-1 877 825 0.000220063
-2 877 825 784 0.000220063
-2 877 875 825 0.000220063
-3 877 875 825 784 0.000220063
-2 413 314 272 0.000220482
-3 413 412 314 272 0.000220482
-1 867 178 0.000220973
-2 867 178 165 0.000220973
-2 867 675 178 0.000220973
-3 867 675 178 165 0.000220973
-2 720 656 422 0.000221023
-3 720 656 655 422 0.000221023
-2 441 372 369 0.000221494
-3 441 372 369 66 0.000221494
-1 566 559 0.000221564
-2 566 559 259 0.000221564
-2 593 566 559 0.000221564
-3 593 566 559 259 0.000221564
-2 929 523 522 0.00022161
-2 929 738 523 0.00022161
-3 929 738 523 522 0.00022161
-1 156 122 0.000221629
-2 156 122 118 0.000221629
-2 156 122 120 0.000221629
-3 156 122 120 118 0.000221629
-1 829 543 0.000222114
-2 829 543 231 0.000222114
-2 829 543 542 0.000222114
-3 829 543 542 231 0.000222114
-1 500 496 0.000222178
-2 500 496 234 0.000222178
-2 520 500 496 0.000222178
-3 520 500 496 234 0.000222178
-1 896 619 0.000222197
-2 896 619 617 0.000222197
-1 905 896 0.000222197
-2 905 896 617 0.000222197
-2 905 896 619 0.000222197
-3 905 896 619 617 0.000222197
-2 389 328 99 0.000222744
-3 389 328 294 99 0.000222744
-1 574 362 0.000222836
-2 910 574 362 0.000222836
-1 930 362 0.000222836
-2 930 574 362 0.000222836
-2 930 910 362 0.000222836
-3 930 910 574 362 0.000222836
-1 387 138 0.000222866
-2 470 387 138 0.000222866
-2 658 387 138 0.000222866
-3 658 470 387 138 0.000222866
-1 760 628 0.000223115
-2 760 628 305 0.000223115
-2 820 760 628 0.000223115
-3 820 760 628 305 0.000223115
-1 836 560 0.000223844
-2 836 560 347 0.000223844
-2 836 739 560 0.000223844
-3 836 739 560 347 0.000223844
-1 910 585 0.000224287
-2 910 585 572 0.000224287
-2 910 585 574 0.000224287
-3 910 585 574 572 0.000224287
-1 952 752 0.000224482
-2 952 752 28 0.000224482
-2 952 752 459 0.000224482
-3 952 752 459 28 0.000224482
-0 955 0.000224716
-1 955 666 0.000224716
-1 955 817 0.000224716
-2 955 817 666 0.000224716
-1 955 854 0.000224716
-2 955 854 666 0.000224716
-2 955 854 817 0.000224716
-3 955 854 817 666 0.000224716
-1 431 225 0.00022478
-2 431 227 225 0.00022478
-2 541 431 225 0.00022478
-3 541 431 227 225 0.00022478
-1 664 663 0.000224888
-2 665 664 663 0.000224888
-2 700 664 663 0.000224888
-3 700 665 664 663 0.000224888
-1 927 601 0.000225037
-1 927 602 0.000225037
-2 927 602 601 0.000225037
-0 956 0.000225037
-1 956 601 0.000225037
-1 956 602 0.000225037
-2 956 602 601 0.000225037
-1 956 927 0.000225037
-2 956 927 601 0.000225037
-2 956 927 602 0.000225037
-3 956 927 602 601 0.000225037
-1 913 714 0.000225207
-2 913 714 713 0.000225207
-2 913 715 714 0.000225207
-3 913 715 714 713 0.000225207
-1 578 365 0.000225388
-2 578 365 309 0.000225388
-2 578 366 365 0.000225388
-3 578 366 365 309 0.000225388
-1 668 498 0.000225434
-2 668 498 497 0.000225434
-1 934 497 0.000225434
-2 934 498 497 0.000225434
-1 934 668 0.000225434
-2 934 668 497 0.000225434
-2 934 668 498 0.000225434
-3 934 668 498 497 0.000225434
-1 458 175 0.000225462
-2 458 175 90 0.000225462
-2 458 175 174 0.000225462
-3 458 175 174 90 0.000225462
-1 954 714 0.000225564
-0 957 0.000225564
-1 957 714 0.000225564
-1 957 954 0.000225564
-2 957 954 714 0.000225564
-0 958 0.000225564
-1 958 714 0.000225564
-1 958 954 0.000225564
-2 958 954 714 0.000225564
-1 958 957 0.000225564
-2 958 957 714 0.000225564
-2 958 957 954 0.000225564
-3 958 957 954 714 0.000225564
-1 723 174 0.000225889
-2 723 174 73 0.000225889
-2 723 458 174 0.000225889
-3 723 458 174 73 0.000225889
-2 686 611 145 0.00022606
-3 686 611 145 143 0.00022606
-1 649 446 0.000226171
-1 649 447 0.000226171
-2 649 447 446 0.000226171
-2 649 448 446 0.000226171
-2 649 448 447 0.000226171
-3 649 448 447 446 0.000226171
-1 451 326 0.000226269
-2 451 327 326 0.000226269
-2 453 451 326 0.000226269
-3 453 451 327 326 0.000226269
-1 836 636 0.000226446
-2 836 636 347 0.000226446
-2 836 636 560 0.000226446
-3 836 636 560 347 0.000226446
-1 829 234 0.000226665
-2 829 702 234 0.000226665
-2 845 829 234 0.000226665
-3 845 829 702 234 0.000226665
-1 639 199 0.000226746
-1 639 200 0.000226746
-2 639 200 199 0.000226746
-2 718 639 199 0.000226746
-2 718 639 200 0.000226746
-3 718 639 200 199 0.000226746
-2 625 417 414 0.000226756
-3 625 417 415 414 0.000226756
-1 613 398 0.000226773
-2 613 398 65 0.000226773
-1 613 484 0.000226773
-2 613 484 65 0.000226773
-2 613 484 398 0.000226773
-3 613 484 398 65 0.000226773
-2 779 681 191 0.000226955
-3 779 682 681 191 0.000226955
-2 304 218 217 0.000227713
-3 305 304 218 217 0.000227713
-1 894 416 0.00022777
-2 894 585 416 0.00022777
-2 894 701 416 0.00022777
-3 894 701 585 416 0.00022777
-1 723 175 0.000227992
-2 723 175 174 0.000227992
-2 723 458 175 0.000227992
-3 723 458 175 174 0.000227992
-1 942 772 0.000228109
-2 942 772 543 0.000228109
-2 942 772 723 0.000228109
-3 942 772 723 543 0.000228109
-1 801 446 0.000228164
-2 801 449 446 0.000228164
-2 802 449 446 0.000228164
-2 802 801 446 0.000228164
-3 802 801 449 446 0.000228164
-2 723 175 90 0.000228384
-3 723 458 175 90 0.000228384
-1 733 277 0.000228479
-2 733 280 277 0.000228479
-2 733 499 277 0.000228479
-2 733 499 280 0.000228479
-3 733 499 280 277 0.000228479
-2 929 522 357 0.000228653
-3 929 523 522 357 0.000228653
-1 915 635 0.000228662
-2 915 686 635 0.000228662
-2 915 741 635 0.000228662
-3 915 741 686 635 0.000228662
-1 943 723 0.000228672
-1 943 828 0.000228672
-2 943 828 723 0.000228672
-1 943 940 0.000228672
-2 943 940 723 0.000228672
-2 943 940 828 0.000228672
-3 943 940 828 723 0.000228672
-1 490 149 0.000228838
-2 490 149 147 0.000228838
-2 490 288 149 0.000228838
-3 490 288 149 147 0.000228838
-1 224 130 0.000229125
-2 224 221 130 0.000229125
-1 932 224 0.000229125
-2 932 224 130 0.000229125
-2 932 224 221 0.000229125
-3 932 224 221 130 0.000229125
-2 224 130 40 0.000229169
-3 224 221 130 40 0.000229169
-1 838 421 0.000229779
-2 838 421 419 0.000229779
-1 850 421 0.000229779
-2 850 421 419 0.000229779
-2 850 838 421 0.000229779
-3 850 838 421 419 0.000229779
-1 178 166 0.00022989
-2 178 166 165 0.00022989
-2 252 178 166 0.00022989
-3 252 178 166 165 0.00022989
-1 736 683 0.000230333
-2 736 705 683 0.000230333
-2 736 735 683 0.000230333
-3 736 735 705 683 0.000230333
-1 638 625 0.000230781
-2 638 625 417 0.000230781
-2 638 626 625 0.000230781
-3 638 626 625 417 0.000230781
-2 848 803 669 0.000230895
-3 848 803 712 669 0.000230895
-0 959 0.000231149
-1 959 676 0.000231149
-1 959 677 0.000231149
-2 959 677 676 0.000231149
-0 960 0.000231149
-1 960 676 0.000231149
-1 960 677 0.000231149
-2 960 677 676 0.000231149
-1 960 959 0.000231149
-2 960 959 676 0.000231149
-2 960 959 677 0.000231149
-3 960 959 677 676 0.000231149
-1 892 464 0.000231156
-2 892 464 442 0.000231156
-2 892 595 464 0.000231156
-3 892 595 464 442 0.000231156
-1 836 561 0.000231162
-2 836 561 560 0.000231162
-2 836 636 561 0.000231162
-3 836 636 561 560 0.000231162
-1 495 177 0.000231764
-2 495 226 177 0.000231764
-2 495 494 177 0.000231764
-3 495 494 226 177 0.000231764
-2 740 325 88 0.000232085
-3 740 325 88 86 0.000232085
-1 905 446 0.000232113
-2 905 448 446 0.000232113
-2 905 619 446 0.000232113
-3 905 619 448 446 0.000232113
-1 955 667 0.000232502
-2 955 817 667 0.000232502
-2 955 854 667 0.000232502
-3 955 854 817 667 0.000232502
-1 180 14 0.000232736
-2 180 14 13 0.000232736
-2 400 180 14 0.000232736
-3 400 180 14 13 0.000232736
-2 772 723 90 0.000232894
-3 772 723 552 90 0.000232894
-1 833 133 0.000233208
-2 833 434 133 0.000233208
-2 833 606 133 0.000233208
-2 833 606 434 0.000233208
-3 833 606 434 133 0.000233208
-1 506 149 0.000233361
-2 506 149 148 0.000233361
-2 506 290 149 0.000233361
-3 506 290 149 148 0.000233361
-2 723 175 73 0.000233817
-3 723 175 174 73 0.000233817
-1 389 138 0.00023422
-2 389 387 138 0.00023422
-2 470 389 138 0.00023422
-3 470 389 387 138 0.00023422
-1 137 31 0.000234485
-2 137 31 29 0.000234485
-2 137 31 30 0.000234485
-3 137 31 30 29 0.000234485
-1 583 157 0.000234488
-2 583 157 89 0.000234488
-2 583 158 157 0.000234488
-3 583 158 157 89 0.000234488
-1 308 29 0.000234568
-2 308 31 29 0.000234568
-2 308 32 29 0.000234568
-3 308 32 31 29 0.000234568
-2 814 488 355 0.000234701
-3 814 488 487 355 0.000234701
-1 181 14 0.000235032
-2 181 57 14 0.000235032
-2 400 181 14 0.000235032
-3 400 181 57 14 0.000235032
-1 892 594 0.000235057
-2 892 594 464 0.000235057
-2 892 595 594 0.000235057
-3 892 595 594 464 0.000235057
-1 906 728 0.000235383
-2 906 881 728 0.000235383
-1 907 728 0.000235383
-2 907 881 728 0.000235383
-2 907 906 728 0.000235383
-3 907 906 881 728 0.000235383
-1 183 57 0.000235474
-2 183 181 57 0.000235474
-2 401 183 57 0.000235474
-3 401 183 181 57 0.000235474
-1 806 631 0.000235528
-1 888 631 0.000235528
-2 888 806 631 0.000235528
-1 899 631 0.000235528
-2 899 806 631 0.000235528
-2 899 888 631 0.000235528
-3 899 888 806 631 0.000235528
-1 624 548 0.000235624
-2 624 548 28 0.000235624
-2 624 548 129 0.000235624
-3 624 548 129 28 0.000235624
-2 836 565 560 0.000236066
-3 836 739 565 560 0.000236066
-2 625 606 133 0.000236241
-3 625 620 606 133 0.000236241
-1 695 24 0.000236256
-2 695 212 24 0.000236256
-2 833 695 24 0.000236256
-3 833 695 212 24 0.000236256
-1 475 239 0.00023649
-2 475 384 239 0.00023649
-2 780 475 239 0.00023649
-3 780 475 384 239 0.00023649
-2 833 240 133 0.000236654
-3 833 434 240 133 0.000236654
-1 836 559 0.000236977
-2 836 560 559 0.000236977
-2 836 561 559 0.000236977
-3 836 561 560 559 0.000236977
-1 821 772 0.000237097
-2 821 772 543 0.000237097
-2 942 821 772 0.000237097
-3 942 821 772 543 0.000237097
-2 686 611 379 0.000237108
-3 686 611 379 145 0.000237108
-1 525 379 0.000237127
-2 686 525 379 0.000237127
-1 915 379 0.000237127
-2 915 525 379 0.000237127
-2 915 686 379 0.000237127
-3 915 686 525 379 0.000237127
-1 706 78 0.000237182
-2 706 78 76 0.000237182
-2 706 580 78 0.000237182
-3 706 580 78 76 0.000237182
-1 826 698 0.000237618
-2 826 698 263 0.000237618
-1 882 263 0.000237618
-1 882 698 0.000237618
-2 882 698 263 0.000237618
-2 882 826 263 0.000237618
-2 882 826 698 0.000237618
-3 882 826 698 263 0.000237618
-2 836 565 559 0.00023764
-3 836 565 560 559 0.00023764
-1 242 133 0.000237669
-2 242 240 133 0.000237669
-2 833 242 133 0.000237669
-3 833 242 240 133 0.000237669
-2 882 263 260 0.000238059
-3 882 826 263 260 0.000238059
-2 595 568 465 0.000238463
-3 595 568 465 462 0.000238463
-1 401 318 0.000238558
-2 401 318 57 0.000238558
-2 576 401 57 0.000238558
-2 576 401 318 0.000238558
-3 576 401 318 57 0.000238558
-1 769 373 0.000238891
-2 769 374 373 0.000238891
-2 769 376 373 0.000238891
-3 769 376 374 373 0.000238891
-1 782 217 0.00023929
-2 782 217 44 0.00023929
-2 782 217 184 0.00023929
-3 782 217 184 44 0.00023929
-1 895 866 0.000239368
-2 895 866 591 0.000239368
-2 895 866 815 0.000239368
-3 895 866 815 591 0.000239368
-1 639 574 0.00023937
-2 639 574 573 0.00023937
-2 639 585 574 0.00023937
-3 639 585 574 573 0.00023937
-2 722 243 24 0.000239399
-3 722 243 24 23 0.000239399
-1 902 452 0.000239511
-1 902 785 0.000239511
-2 902 785 452 0.000239511
-0 961 0.000239511
-1 961 452 0.000239511
-1 961 785 0.000239511
-2 961 785 452 0.000239511
-1 961 902 0.000239511
-2 961 902 452 0.000239511
-2 961 902 785 0.000239511
-3 961 902 785 452 0.000239511
-1 266 60 0.000239524
-2 266 61 60 0.000239524
-2 267 266 60 0.000239524
-3 267 266 61 60 0.000239524
-1 829 232 0.000239555
-2 829 234 232 0.000239555
-2 829 702 232 0.000239555
-3 829 702 234 232 0.000239555
-1 822 352 0.00023961
-2 822 352 272 0.00023961
-2 822 352 290 0.00023961
-3 822 352 290 272 0.00023961
-1 571 329 0.000239905
-2 571 570 329 0.000239905
-2 685 571 329 0.000239905
-3 685 571 570 329 0.000239905
-1 590 284 0.000239979
-2 590 477 284 0.000239979
-2 686 590 284 0.000239979
-3 686 590 477 284 0.000239979
-1 574 77 0.00024005
-2 574 79 77 0.00024005
-2 680 574 77 0.00024005
-3 680 574 79 77 0.00024005
-1 637 613 0.000240088
-2 637 613 65 0.000240088
-2 637 613 398 0.000240088
-3 637 613 398 65 0.000240088
-2 658 389 138 0.000240212
-3 658 389 387 138 0.000240212
-1 874 586 0.000240259
-2 874 793 586 0.000240259
-1 915 586 0.000240259
-1 915 793 0.000240259
-2 915 793 586 0.000240259
-1 915 874 0.000240259
-2 915 874 586 0.000240259
-2 915 874 793 0.000240259
-3 915 874 793 586 0.000240259
-1 644 603 0.000240929
-2 644 605 603 0.000240929
-1 923 605 0.000240929
-2 923 605 603 0.000240929
-2 923 644 603 0.000240929
-2 923 644 605 0.000240929
-3 923 644 605 603 0.000240929
-2 470 389 328 0.000241248
-3 470 389 345 328 0.000241248
-0 962 0.00024125
-1 962 676 0.00024125
-1 962 843 0.00024125
-2 962 843 676 0.00024125
-1 962 844 0.00024125
-2 962 844 676 0.00024125
-2 962 844 843 0.00024125
-3 962 844 843 676 0.00024125
-1 240 208 0.000241717
-2 241 240 208 0.000241717
-2 292 240 208 0.000241717
-3 292 241 240 208 0.000241717
-1 849 781 0.000242126
-2 849 824 781 0.000242126
-2 849 825 781 0.000242126
-3 849 825 824 781 0.000242126
-1 846 302 0.000242303
-2 846 692 302 0.000242303
-2 846 719 302 0.000242303
-3 846 719 692 302 0.000242303
-1 924 492 0.000242382
-2 924 492 248 0.000242382
-2 924 799 492 0.000242382
-3 924 799 492 248 0.000242382
-1 573 77 0.000242969
-2 574 573 77 0.000242969
-2 680 573 77 0.000242969
-3 680 574 573 77 0.000242969
-1 796 354 0.000242969
-2 796 393 354 0.000242969
-1 877 354 0.000242969
-1 877 393 0.000242969
-2 877 393 354 0.000242969
-1 877 796 0.000242969
-2 877 796 354 0.000242969
-2 877 796 393 0.000242969
-3 877 796 393 354 0.000242969
-1 753 657 0.000243172
-2 753 659 657 0.000243172
-2 753 660 657 0.000243172
-3 753 660 659 657 0.000243172
-2 163 161 34 0.000243184
-3 163 161 43 34 0.000243184
-1 943 552 0.000243222
-2 943 723 552 0.000243222
-2 943 940 552 0.000243222
-3 943 940 723 552 0.000243222
-1 183 14 0.000243239
-2 183 57 14 0.000243239
-2 183 181 14 0.000243239
-3 183 181 57 14 0.000243239
-1 884 582 0.000243352
-1 884 652 0.000243352
-2 884 652 582 0.000243352
-1 884 654 0.000243352
-2 884 654 582 0.000243352
-2 884 654 652 0.000243352
-3 884 654 652 582 0.000243352
-2 836 559 269 0.000243575
-3 836 565 559 269 0.000243575
-1 736 602 0.000243636
-1 742 736 0.000243636
-2 742 736 602 0.000243636
-1 956 736 0.000243636
-2 956 736 602 0.000243636
-1 956 742 0.000243636
-2 956 742 602 0.000243636
-2 956 742 736 0.000243636
-3 956 742 736 602 0.000243636
-1 286 60 0.000243985
-2 286 266 60 0.000243985
-2 286 267 60 0.000243985
-3 286 267 266 60 0.000243985
-1 471 86 0.000244102
-2 471 114 86 0.000244102
-2 471 323 86 0.000244102
-3 471 323 114 86 0.000244102
-1 724 480 0.000244308
-1 870 724 0.000244308
-2 870 724 480 0.000244308
-1 899 480 0.000244308
-1 899 724 0.000244308
-2 899 724 480 0.000244308
-1 899 870 0.000244308
-2 899 870 480 0.000244308
-2 899 870 724 0.000244308
-3 899 870 724 480 0.000244308
-2 829 828 543 0.000244313
-3 829 828 543 231 0.000244313
-1 805 714 0.000244592
-2 954 805 714 0.000244592
-1 958 805 0.000244592
-2 958 805 714 0.000244592
-2 958 954 805 0.000244592
-3 958 954 805 714 0.000244592
-1 352 289 0.000244599
-2 352 290 289 0.000244599
-2 822 352 289 0.000244599
-3 822 352 290 289 0.000244599
-1 816 335 0.00024471
-2 816 335 260 0.00024471
-2 816 335 261 0.00024471
-3 816 335 261 260 0.00024471
-1 755 618 0.000244844
-2 755 618 48 0.000244844
-2 787 755 618 0.000244844
-3 787 755 618 48 0.000244844
-2 339 336 335 0.000245074
-1 579 339 0.000245074
-2 579 339 335 0.000245074
-2 579 339 336 0.000245074
-3 579 339 336 335 0.000245074
-1 631 488 0.000245171
-2 631 488 355 0.000245171
-2 631 488 486 0.000245171
-3 631 488 486 355 0.000245171
-2 729 478 7 0.000245475
-3 729 478 189 7 0.000245475
-2 571 329 16 0.000245616
-3 685 571 329 16 0.000245616
-1 312 119 0.000245629
-2 312 121 119 0.000245629
-2 312 123 119 0.000245629
-3 312 123 121 119 0.000245629
-1 523 95 0.000245647
-2 738 523 95 0.000245647
-2 929 523 95 0.000245647
-3 929 738 523 95 0.000245647
-1 808 634 0.000245881
-2 808 681 634 0.000245881
-1 808 779 0.000245881
-2 808 779 634 0.000245881
-2 808 779 681 0.000245881
-3 808 779 681 634 0.000245881
-1 885 389 0.000246161
-2 885 389 138 0.000246161
-2 885 658 389 0.000246161
-3 885 658 389 138 0.000246161
-1 573 79 0.000246255
-2 573 79 77 0.000246255
-2 574 573 79 0.000246255
-3 574 573 79 77 0.000246255
-1 746 282 0.000246261
-1 746 284 0.000246261
-2 746 284 282 0.000246261
-2 746 476 282 0.000246261
-2 746 476 284 0.000246261
-3 746 476 284 282 0.000246261
-1 883 825 0.000246334
-2 883 825 571 0.000246334
-2 883 853 825 0.000246334
-3 883 853 825 571 0.000246334
-2 665 664 414 0.000246358
-3 665 664 415 414 0.000246358
-1 600 458 0.000246398
-2 600 458 74 0.000246398
-2 692 600 458 0.000246398
-3 692 600 458 74 0.000246398
-2 662 638 254 0.000246442
-3 662 638 254 153 0.000246442
-1 432 16 0.000246626
-1 432 17 0.000246626
-2 432 17 16 0.000246626
-2 432 329 16 0.000246626
-2 432 329 17 0.000246626
-3 432 329 17 16 0.000246626
-1 474 389 0.000247027
-2 474 389 138 0.000247027
-2 474 470 389 0.000247027
-3 474 470 389 138 0.000247027
-1 948 492 0.000247097
-2 948 775 492 0.000247097
-2 948 799 492 0.000247097
-3 948 799 775 492 0.000247097
-1 512 220 0.00024731
-2 512 293 220 0.00024731
-2 596 512 220 0.00024731
-3 596 512 293 220 0.00024731
-1 318 183 0.000247331
-2 401 318 183 0.000247331
-2 576 318 183 0.000247331
-3 576 401 318 183 0.000247331
-2 662 638 625 0.000247622
-3 662 638 626 625 0.000247622
-2 318 183 57 0.000247691
-3 401 318 183 57 0.000247691
-2 409 318 183 0.000247717
-3 576 409 318 183 0.000247717
-2 695 625 24 0.000247827
-2 695 625 212 0.000247827
-3 695 625 212 24 0.000247827
-1 690 636 0.000247856
-2 690 636 311 0.000247856
-2 690 636 561 0.000247856
-3 690 636 561 311 0.000247856
-2 795 393 392 0.000247859
-1 796 392 0.000247859
-2 796 393 392 0.000247859
-2 796 795 392 0.000247859
-3 796 795 393 392 0.000247859
-1 453 7 0.000248118
-2 453 326 7 0.000248118
-2 729 453 7 0.000248118
-3 729 453 326 7 0.000248118
-0 963 0.000248214
-1 963 263 0.000248214
-1 963 696 0.000248214
-2 963 696 263 0.000248214
-1 963 698 0.000248214
-2 963 698 263 0.000248214
-2 963 698 696 0.000248214
-3 963 698 696 263 0.000248214
-1 769 757 0.000248267
-2 769 768 757 0.000248267
-1 912 757 0.000248267
-1 912 768 0.000248267
-2 912 768 757 0.000248267
-2 912 769 757 0.000248267
-2 912 769 768 0.000248267
-3 912 769 768 757 0.000248267
-1 940 898 0.000248303
-2 940 898 829 0.000248303
-1 943 829 0.000248303
-2 943 898 829 0.000248303
-2 943 940 829 0.000248303
-2 943 940 898 0.000248303
-3 943 940 898 829 0.000248303
-1 525 143 0.00024841
-2 525 379 143 0.00024841
-2 686 525 143 0.00024841
-3 686 525 379 143 0.00024841
-1 674 283 0.000248621
-2 674 476 283 0.000248621
-2 674 545 283 0.000248621
-3 674 545 476 283 0.000248621
-1 819 666 0.000249036
-1 819 667 0.000249036
-2 819 667 666 0.000249036
-2 819 817 666 0.000249036
-2 819 817 667 0.000249036
-3 819 817 667 666 0.000249036
-0 964 0.000249042
-1 964 652 0.000249042
-1 964 654 0.000249042
-2 964 654 652 0.000249042
-1 964 884 0.000249042
-2 964 884 652 0.000249042
-2 964 884 654 0.000249042
-3 964 884 654 652 0.000249042
-1 537 209 0.000249419
-2 537 210 209 0.000249419
-1 537 211 0.000249419
-2 537 211 209 0.000249419
-2 537 211 210 0.000249419
-3 537 211 210 209 0.000249419
-2 803 718 701 0.000249562
-3 803 754 718 701 0.000249562
-1 660 27 0.00024962
-2 660 163 27 0.00024962
-2 660 473 27 0.00024962
-2 660 473 163 0.00024962
-3 660 473 163 27 0.00024962
-1 692 464 0.000249665
-2 692 594 464 0.000249665
-2 692 600 464 0.000249665
-3 692 600 594 464 0.000249665
-1 855 107 0.000249848
-1 855 501 0.000249848
-2 855 501 107 0.000249848
-1 855 845 0.000249848
-2 855 845 107 0.000249848
-2 855 845 501 0.000249848
-3 855 845 501 107 0.000249848
-1 963 882 0.000250246
-2 963 882 263 0.000250246
-2 963 882 698 0.000250246
-3 963 882 698 263 0.000250246
-1 629 548 0.000250387
-2 629 548 129 0.000250387
-2 629 624 548 0.000250387
-3 629 624 548 129 0.000250387
-2 475 239 49 0.000250474
-3 475 384 239 49 0.000250474
-2 400 183 14 0.000250503
-3 400 183 181 14 0.000250503
-2 851 456 341 0.000250558
-2 851 457 456 0.000250558
-3 851 457 456 341 0.000250558
-2 318 183 14 0.00025061
-3 318 183 57 14 0.00025061
-1 865 643 0.000250679
-1 865 645 0.000250679
-2 865 645 643 0.000250679
-1 865 646 0.000250679
-2 865 646 643 0.000250679
-2 865 646 645 0.000250679
-3 865 646 645 643 0.000250679
-1 268 44 0.00025117
-2 268 217 44 0.00025117
-2 537 268 44 0.00025117
-3 537 268 217 44 0.00025117
-2 808 634 615 0.000251586
-3 808 681 634 615 0.000251586
-1 686 398 0.000251712
-2 686 611 398 0.000251712
-2 686 637 398 0.000251712
-3 686 637 611 398 0.000251712
-1 556 224 0.000251802
-2 556 224 130 0.000251802
-2 932 556 224 0.000251802
-3 932 556 224 130 0.000251802
-1 618 449 0.000252024
-2 618 449 446 0.000252024
-2 802 618 449 0.000252024
-3 802 618 449 446 0.000252024
-1 846 464 0.000252202
-2 846 594 464 0.000252202
-1 892 846 0.000252202
-2 892 846 464 0.000252202
-2 892 846 594 0.000252202
-3 892 846 594 464 0.000252202
-1 787 236 0.000252407
-1 787 492 0.000252407
-2 787 492 236 0.000252407
-2 787 775 236 0.000252407
-2 787 775 492 0.000252407
-3 787 775 492 236 0.000252407
-2 759 588 586 0.000252638
-3 761 759 588 586 0.000252638
-1 441 371 0.000252735
-2 441 371 369 0.000252735
-2 441 372 371 0.000252735
-3 441 372 371 369 0.000252735
-1 820 669 0.000252752
-2 820 669 504 0.000252752
-2 820 669 628 0.000252752
-3 820 669 628 504 0.000252752
-1 855 503 0.00025277
-2 855 503 501 0.00025277
-1 855 597 0.00025277
-2 855 597 501 0.00025277
-2 855 597 503 0.00025277
-3 855 597 503 501 0.00025277
-1 333 224 0.000252891
-2 333 331 224 0.000252891
-1 924 224 0.000252891
-1 924 331 0.000252891
-2 924 331 224 0.000252891
-1 924 333 0.000252891
-2 924 333 224 0.000252891
-2 924 333 331 0.000252891
-3 924 333 331 224 0.000252891
-1 470 314 0.000253196
-2 470 367 314 0.000253196
-2 470 368 314 0.000253196
-3 470 368 367 314 0.000253196
-2 948 787 492 0.000253333
-3 948 787 775 492 0.000253333
-1 521 95 0.000254351
-2 737 521 95 0.000254351
-2 738 521 95 0.000254351
-2 738 737 521 0.000254351
-3 738 737 521 95 0.000254351
-2 653 582 581 0.000254518
-1 773 582 0.000254518
-2 773 582 581 0.000254518
-2 773 653 582 0.000254518
-3 773 653 582 581 0.000254518
-1 218 133 0.000254736
-2 218 216 133 0.000254736
-2 253 218 133 0.000254736
-3 253 218 216 133 0.000254736
-1 954 806 0.000255356
-2 954 806 804 0.000255356
-2 954 806 805 0.000255356
-3 954 806 805 804 0.000255356
-1 847 820 0.000255575
-2 847 820 504 0.000255575
-2 847 820 669 0.000255575
-3 847 820 669 504 0.000255575
-1 389 70 0.000255875
-2 389 100 70 0.000255875
-2 389 245 70 0.000255875
-3 389 245 100 70 0.000255875
-1 629 550 0.00025623
-2 629 550 129 0.00025623
-2 861 629 550 0.00025623
-3 861 629 550 129 0.00025623
-1 822 210 0.000256271
-2 822 210 159 0.000256271
-2 822 524 210 0.000256271
-3 822 524 210 159 0.000256271
-1 950 272 0.00025657
-2 950 272 270 0.00025657
-2 950 711 272 0.00025657
-3 950 711 272 270 0.00025657
-1 680 584 0.000256852
-2 680 584 572 0.000256852
-2 680 584 573 0.000256852
-3 680 584 573 572 0.000256852
-1 923 582 0.000257588
-2 923 605 582 0.000257588
-2 923 644 582 0.000257588
-3 923 644 605 582 0.000257588
-1 868 838 0.000257768
-1 868 850 0.000257768
-2 868 850 838 0.000257768
-1 869 838 0.000257768
-1 869 850 0.000257768
-2 869 850 838 0.000257768
-2 869 868 838 0.000257768
-2 869 868 850 0.000257768
-3 869 868 850 838 0.000257768
-2 746 477 284 0.000258211
-3 746 477 476 284 0.000258211
-2 638 625 254 0.000258309
-3 662 638 625 254 0.000258309
-2 579 531 336 0.000258722
-2 697 531 336 0.000258722
-3 697 579 531 336 0.000258722
-1 849 46 0.000258779
-2 849 46 44 0.000258779
-2 849 373 46 0.000258779
-3 849 373 46 44 0.000258779
-1 788 492 0.000258804
-2 788 787 492 0.000258804
-1 948 788 0.000258804
-2 948 788 492 0.000258804
-2 948 788 787 0.000258804
-3 948 788 787 492 0.000258804
-1 750 467 0.000258844
-2 750 565 467 0.000258844
-2 785 750 467 0.000258844
-3 785 750 565 467 0.000258844
-1 849 537 0.000258918
-2 849 537 44 0.000258918
-2 849 747 537 0.000258918
-3 849 747 537 44 0.000258918
-1 856 843 0.000259032
-1 856 844 0.000259032
-2 856 844 843 0.000259032
-1 962 856 0.000259032
-2 962 856 843 0.000259032
-2 962 856 844 0.000259032
-3 962 856 844 843 0.000259032
-1 885 474 0.000259638
-2 885 474 138 0.000259638
-2 885 474 389 0.000259638
-3 885 474 389 138 0.000259638
-2 588 321 84 0.000259661
-3 588 321 320 84 0.000259661
-2 431 428 225 0.000259726
-3 541 431 428 225 0.000259726
-2 706 581 580 0.000260304
-3 706 581 580 79 0.000260304
-1 513 138 0.000260357
-2 513 140 138 0.000260357
-2 514 513 138 0.000260357
-3 514 513 140 138 0.000260357
-1 780 49 0.000260558
-2 780 239 49 0.000260558
-2 780 475 49 0.000260558
-3 780 475 239 49 0.000260558
-2 629 550 548 0.000260859
-3 629 550 548 129 0.000260859
-1 175 72 0.000261303
-2 175 73 72 0.000261303
-2 175 173 72 0.000261303
-3 175 173 73 72 0.000261303
-1 692 463 0.000261425
-2 692 464 463 0.000261425
-2 692 600 463 0.000261425
-3 692 600 464 463 0.000261425
-1 328 100 0.00026144
-2 328 100 99 0.00026144
-2 389 328 100 0.00026144
-3 389 328 100 99 0.00026144
-1 808 613 0.000261947
-2 808 616 613 0.000261947
-2 808 807 613 0.000261947
-3 808 807 616 613 0.000261947
-1 788 236 0.000262048
-2 788 492 236 0.000262048
-2 788 787 236 0.000262048
-3 788 787 492 236 0.000262048
-1 366 119 0.000262091
-2 366 119 118 0.000262091
-2 366 365 119 0.000262091
-3 366 365 119 118 0.000262091
-2 924 556 224 0.00026212
-2 932 924 224 0.00026212
-3 932 924 556 224 0.00026212
-1 638 218 0.000262237
-2 638 254 218 0.000262237
-2 638 628 218 0.000262237
-3 638 628 254 218 0.000262237
-1 619 342 0.000263338
-2 619 342 338 0.000263338
-2 619 617 342 0.000263338
-3 619 617 342 338 0.000263338
-1 63 31 0.000263539
-2 63 31 30 0.000263539
-2 176 63 31 0.000263539
-3 176 63 31 30 0.000263539
-1 514 46 0.000263726
-2 514 374 46 0.000263726
-2 514 375 46 0.000263726
-3 514 375 374 46 0.000263726
-1 566 89 0.000264221
-2 566 91 89 0.000264221
-2 739 566 89 0.000264221
-3 739 566 91 89 0.000264221
-1 417 304 0.00026513
-2 584 417 304 0.00026513
-2 638 417 304 0.00026513
-3 638 584 417 304 0.00026513
-1 883 601 0.000265222
-2 927 883 601 0.000265222
-1 956 883 0.000265222
-2 956 883 601 0.000265222
-2 956 927 883 0.000265222
-3 956 927 883 601 0.000265222
-1 941 636 0.000265994
-2 941 636 561 0.000265994
-1 941 836 0.000265994
-2 941 836 561 0.000265994
-2 941 836 636 0.000265994
-3 941 836 636 561 0.000265994
-2 941 690 636 0.000266117
-3 941 690 636 561 0.000266117
-2 469 329 17 0.000266121
-3 469 329 141 17 0.000266121
-1 571 432 0.000266183
-2 571 432 16 0.000266183
-2 571 432 329 0.000266183
-3 571 432 329 16 0.000266183
-1 507 175 0.000266888
-2 507 175 173 0.000266888
-2 566 175 173 0.000266888
-2 566 507 175 0.000266888
-3 566 507 175 173 0.000266888
-1 887 840 0.000266963
-2 887 840 804 0.000266963
-2 887 841 840 0.000266963
-3 887 841 840 804 0.000266963
-1 594 303 0.000267064
-2 594 303 301 0.000267064
-2 719 594 303 0.000267064
-3 719 594 303 301 0.000267064
-1 497 279 0.000267207
-2 497 429 279 0.000267207
-2 497 430 279 0.000267207
-2 497 430 429 0.000267207
-3 497 430 429 279 0.000267207
-1 651 417 0.000267298
-2 651 417 414 0.000267298
-2 651 572 417 0.000267298
-3 651 572 417 414 0.000267298
-2 833 625 24 0.00026746
-3 833 695 625 24 0.00026746
-2 846 692 464 0.000267748
-3 846 692 594 464 0.000267748
-1 889 843 0.000268229
-1 889 844 0.000268229
-2 889 844 843 0.000268229
-2 889 856 843 0.000268229
-2 889 856 844 0.000268229
-3 889 856 844 843 0.000268229
-1 559 165 0.000268619
-2 559 165 164 0.000268619
-2 559 269 165 0.000268619
-3 559 269 165 164 0.000268619
-2 471 115 86 0.000268659
-3 471 115 114 86 0.000268659
-2 638 304 218 0.000269173
-3 638 628 304 218 0.000269173
-1 798 208 0.000269194
-2 798 208 159 0.000269194
-2 798 241 208 0.000269194
-3 798 241 208 159 0.000269194
-1 707 78 0.000269524
-2 707 78 76 0.000269524
-2 707 78 77 0.000269524
-3 707 78 77 76 0.000269524
-1 915 791 0.000269549
-2 915 791 635 0.000269549
-2 915 791 741 0.000269549
-3 915 791 741 635 0.000269549
-2 589 525 143 0.00026968
-3 686 589 525 143 0.00026968
-2 707 706 78 0.000269752
-3 707 706 78 76 0.000269752
-1 798 210 0.000269878
-2 798 210 159 0.000269878
-2 822 798 210 0.000269878
-3 822 798 210 159 0.000269878
-1 760 460 0.000270372
-2 760 460 305 0.000270372
-2 760 628 460 0.000270372
-3 760 628 460 305 0.000270372
-1 546 86 0.000270383
-2 546 323 86 0.000270383
-2 546 471 86 0.000270383
-3 546 471 323 86 0.000270383
-1 625 218 0.000270668
-2 625 253 218 0.000270668
-2 625 254 218 0.000270668
-3 625 254 253 218 0.000270668
-1 851 340 0.000270695
-2 851 341 340 0.000270695
-2 851 456 340 0.000270695
-3 851 456 341 340 0.000270695
-1 670 646 0.00027142
-2 670 646 643 0.00027142
-2 671 670 646 0.00027142
-3 671 670 646 643 0.00027142
-1 843 812 0.000271493
-2 843 812 515 0.000271493
-1 878 515 0.000271493
-2 878 812 515 0.000271493
-1 878 843 0.000271493
-2 878 843 515 0.000271493
-2 878 843 812 0.000271493
-3 878 843 812 515 0.000271493
-2 798 210 208 0.000271593
-3 798 210 208 159 0.000271593
-1 798 722 0.000271719
-2 798 722 243 0.000271719
-1 916 798 0.000271719
-2 916 798 243 0.000271719
-2 916 798 722 0.000271719
-3 916 798 722 243 0.000271719
-1 909 341 0.000271789
-1 909 851 0.000271789
-2 909 851 341 0.000271789
-2 909 893 341 0.000271789
-2 909 893 851 0.000271789
-3 909 893 851 341 0.000271789
-2 566 90 89 0.000272368
-3 566 91 90 89 0.000272368
-1 888 732 0.00027294
-2 888 732 278 0.00027294
-2 888 732 279 0.00027294
-3 888 732 279 278 0.00027294
-0 965 0.000273009
-1 965 853 0.000273009
-1 965 857 0.000273009
-2 965 857 853 0.000273009
-0 966 0.000273009
-1 966 853 0.000273009
-1 966 857 0.000273009
-2 966 857 853 0.000273009
-1 966 965 0.000273009
-2 966 965 853 0.000273009
-2 966 965 857 0.000273009
-3 966 965 857 853 0.000273009
-1 440 328 0.000273854
-2 440 328 99 0.000273854
-2 440 328 100 0.000273854
-3 440 328 100 99 0.000273854
-2 733 631 488 0.000274257
-3 733 631 488 486 0.000274257
-1 667 279 0.000274315
-2 667 430 279 0.000274315
-2 667 666 279 0.000274315
-3 667 666 430 279 0.000274315
-2 833 625 133 0.00027443
-3 833 625 606 133 0.00027443
-1 897 572 0.000274579
-1 897 650 0.000274579
-2 897 650 572 0.000274579
-1 897 707 0.000274579
-2 897 707 572 0.000274579
-2 897 707 650 0.000274579
-3 897 707 650 572 0.000274579
-1 556 40 0.000274905
-2 556 130 40 0.000274905
-2 556 224 40 0.000274905
-3 556 224 130 40 0.000274905
-2 711 658 413 0.000274971
-3 711 658 557 413 0.000274971
-1 616 203 0.000275048
-2 616 204 203 0.000275048
-2 616 614 203 0.000275048
-3 616 614 204 203 0.000275048
-1 400 318 0.000275159
-2 400 318 14 0.000275159
-2 400 318 183 0.000275159
-3 400 318 183 14 0.000275159
-2 686 398 369 0.00027518
-3 686 637 398 369 0.00027518
-2 948 924 492 0.000275243
-3 948 924 799 492 0.000275243
-1 891 655 0.00027532
-2 891 720 655 0.00027532
-2 891 721 655 0.00027532
-3 891 721 720 655 0.00027532
-1 942 846 0.00027548
-2 942 846 821 0.00027548
-1 942 907 0.00027548
-2 942 907 821 0.00027548
-2 942 907 846 0.00027548
-3 942 907 846 821 0.00027548
-1 653 605 0.000275553
-2 653 605 581 0.000275553
-2 653 605 582 0.000275553
-3 653 605 582 581 0.000275553
-1 497 411 0.00027582
-2 498 497 411 0.00027582
-2 499 497 411 0.00027582
-3 499 498 497 411 0.00027582
-1 252 107 0.000275882
-2 252 178 107 0.000275882
-2 703 252 107 0.000275882
-3 703 252 178 107 0.000275882
-1 895 592 0.000276434
-2 895 592 591 0.000276434
-2 895 771 592 0.000276434
-3 895 771 592 591 0.000276434
-1 38 30 0.00027649
-2 63 38 30 0.00027649
-2 137 38 30 0.00027649
-3 137 63 38 30 0.00027649
-1 698 579 0.000276851
-2 698 579 263 0.000276851
-2 698 697 579 0.000276851
-3 698 697 579 263 0.000276851
-1 785 466 0.000276875
-2 785 466 452 0.000276875
-2 785 467 466 0.000276875
-3 785 467 466 452 0.000276875
-1 290 170 0.000277386
-2 352 290 170 0.000277386
-2 505 290 170 0.000277386
-3 505 352 290 170 0.000277386
-1 515 508 0.00027741
-2 812 515 508 0.00027741
-2 878 515 508 0.00027741
-3 878 812 515 508 0.00027741
-1 902 672 0.000277572
-2 951 902 672 0.000277572
-1 961 672 0.000277572
-2 961 902 672 0.000277572
-1 961 951 0.000277572
-2 961 951 672 0.000277572
-2 961 951 902 0.000277572
-3 961 951 902 672 0.000277572
-2 808 615 613 0.000277746
-3 808 616 615 613 0.000277746
-1 930 580 0.000277877
-2 930 580 78 0.000277877
-1 930 706 0.000277877
-2 930 706 78 0.000277877
-2 930 706 580 0.000277877
-3 930 706 580 78 0.000277877
-1 351 194 0.000278081
-2 351 297 194 0.000278081
-2 351 350 194 0.000278081
-3 351 350 297 194 0.000278081
-1 867 166 0.000278122
-2 867 166 165 0.000278122
-2 867 178 166 0.000278122
-3 867 178 166 165 0.000278122
-1 637 484 0.000278293
-2 637 484 398 0.000278293
-2 637 613 484 0.000278293
-3 637 613 484 398 0.000278293
-1 601 432 0.000278577
-2 601 432 16 0.000278577
-2 601 571 432 0.000278577
-3 601 571 432 16 0.000278577
-1 956 456 0.000278782
-2 956 736 456 0.000278782
-1 956 852 0.000278782
-2 956 852 456 0.000278782
-2 956 852 736 0.000278782
-3 956 852 736 456 0.000278782
-1 567 533 0.000278802
-1 764 533 0.000278802
-1 764 567 0.000278802
-2 764 567 533 0.000278802
-0 967 0.000278802
-1 967 533 0.000278802
-1 967 567 0.000278802
-2 967 567 533 0.000278802
-1 967 764 0.000278802
-2 967 764 533 0.000278802
-2 967 764 567 0.000278802
-3 967 764 567 533 0.000278802
-1 820 460 0.000279737
-2 820 628 460 0.000279737
-2 820 760 460 0.000279737
-3 820 760 628 460 0.000279737
-1 613 64 0.000280243
-2 613 65 64 0.000280243
-2 613 484 64 0.000280243
-3 613 484 65 64 0.000280243
-2 707 680 78 0.000280852
-3 707 680 78 77 0.000280852
-2 441 371 370 0.000281322
-3 441 372 371 370 0.000281322
-1 508 333 0.000281927
-2 508 333 331 0.000281927
-2 756 508 333 0.000281927
-3 756 508 333 331 0.000281927
-1 685 18 0.00028195
-2 685 18 16 0.00028195
-2 685 570 18 0.00028195
-3 685 570 18 16 0.00028195
-1 906 443 0.000282447
-2 906 728 443 0.000282447
-1 907 443 0.000282447
-2 907 728 443 0.000282447
-2 907 906 443 0.000282447
-3 907 906 728 443 0.000282447
-1 417 218 0.000282466
-2 417 304 218 0.000282466
-2 638 417 218 0.000282466
-3 638 417 304 218 0.000282466
-1 816 579 0.000282777
-2 816 579 260 0.000282777
-2 816 579 263 0.000282777
-3 816 579 263 260 0.000282777
-2 637 611 408 0.000282789
-3 637 612 611 408 0.000282789
-2 537 268 209 0.000282887
-1 537 291 0.000282887
-2 537 291 209 0.000282887
-2 537 291 268 0.000282887
-3 537 291 268 209 0.000282887
-1 90 73 0.000283082
-2 175 90 73 0.000283082
-2 723 90 73 0.000283082
-3 723 175 90 73 0.000283082
-1 957 716 0.000283327
-0 968 0.000283327
-1 968 716 0.000283327
-1 968 957 0.000283327
-2 968 957 716 0.000283327
-0 969 0.000283327
-1 969 716 0.000283327
-1 969 957 0.000283327
-2 969 957 716 0.000283327
-1 969 968 0.000283327
-2 969 968 716 0.000283327
-2 969 968 957 0.000283327
-3 969 968 957 716 0.000283327
-2 240 208 133 0.000283797
-3 292 240 208 133 0.000283797
-1 790 776 0.000284038
-1 790 777 0.000284038
-2 790 777 776 0.000284038
-1 873 777 0.000284038
-2 873 777 776 0.000284038
-1 873 790 0.000284038
-2 873 790 776 0.000284038
-2 873 790 777 0.000284038
-3 873 790 777 776 0.000284038
-0 970 0.000284271
-1 970 93 0.000284271
-1 970 94 0.000284271
-2 970 94 93 0.000284271
-1 970 96 0.000284271
-2 970 96 93 0.000284271
-2 970 96 94 0.000284271
-3 970 96 94 93 0.000284271
-1 821 110 0.00028445
-1 828 110 0.00028445
-2 828 821 110 0.00028445
-1 907 110 0.00028445
-2 907 821 110 0.00028445
-2 907 828 110 0.00028445
-3 907 828 821 110 0.00028445
-1 853 769 0.000284863
-2 853 769 757 0.000284863
-2 853 769 768 0.000284863
-3 853 769 768 757 0.000284863
-2 637 484 408 0.000284868
-3 637 484 408 398 0.000284868
-0 971 0.000285211
-1 971 554 0.000285211
-1 971 908 0.000285211
-2 971 908 554 0.000285211
-1 971 909 0.000285211
-2 971 909 554 0.000285211
-2 971 909 908 0.000285211
-3 971 909 908 554 0.000285211
-2 651 625 417 0.000285636
-3 651 625 417 414 0.000285636
-1 757 329 0.00028565
-2 757 570 329 0.00028565
-2 757 571 329 0.00028565
-3 757 571 570 329 0.00028565
-1 743 567 0.000285692
-1 744 567 0.000285692
-2 744 743 567 0.000285692
-1 745 567 0.000285692
-2 745 743 567 0.000285692
-2 745 744 567 0.000285692
-3 745 744 743 567 0.000285692
-1 492 333 0.000285745
-2 924 492 333 0.000285745
-1 948 333 0.000285745
-2 948 492 333 0.000285745
-2 948 924 333 0.000285745
-3 948 924 492 333 0.000285745
-1 417 254 0.000285815
-2 625 417 254 0.000285815
-2 638 417 254 0.000285815
-3 638 625 417 254 0.000285815
-1 568 302 0.000286262
-2 568 302 301 0.000286262
-2 719 568 302 0.000286262
-3 719 568 302 301 0.000286262
-1 318 180 0.000286288
-2 318 180 14 0.000286288
-2 400 318 180 0.000286288
-3 400 318 180 14 0.000286288
-1 613 369 0.000286475
-2 613 369 65 0.000286475
-2 637 613 369 0.000286475
-3 637 613 369 65 0.000286475
-1 247 224 0.000287006
-2 556 247 224 0.000287006
-2 924 247 224 0.000287006
-3 924 556 247 224 0.000287006
-2 912 757 329 0.000287204
-2 912 757 570 0.000287204
-3 912 757 570 329 0.000287204
-2 417 254 218 0.000287253
-3 638 417 254 218 0.000287253
-1 950 798 0.000288116
-2 950 798 722 0.000288116
-2 950 916 798 0.000288116
-3 950 916 798 722 0.000288116
-2 470 413 314 0.000288357
-3 470 413 368 314 0.000288357
-1 945 841 0.000288361
-0 972 0.000288361
-1 972 841 0.000288361
-1 972 945 0.000288361
-2 972 945 841 0.000288361
-0 973 0.000288361
-1 973 841 0.000288361
-1 973 945 0.000288361
-2 973 945 841 0.000288361
-1 973 972 0.000288361
-2 973 972 841 0.000288361
-2 973 972 945 0.000288361
-3 973 972 945 841 0.000288361
-1 777 94 0.000288594
-2 790 777 94 0.000288594
-1 791 777 0.000288594
-2 791 777 94 0.000288594
-2 791 790 777 0.000288594
-3 791 790 777 94 0.000288594
-1 882 704 0.000288635
-2 882 786 704 0.000288635
-2 882 881 704 0.000288635
-3 882 881 786 704 0.000288635
-1 576 58 0.000289364
-2 576 58 14 0.000289364
-2 576 58 57 0.000289364
-3 576 58 57 14 0.000289364
-2 625 417 218 0.000289522
-3 625 417 254 218 0.000289522
-1 785 451 0.000289692
-2 785 452 451 0.000289692
-1 961 451 0.000289692
-2 961 452 451 0.000289692
-2 961 785 451 0.000289692
-3 961 785 452 451 0.000289692
-1 931 751 0.000290525
-2 931 901 751 0.000290525
-2 931 902 751 0.000290525
-3 931 902 901 751 0.000290525
-1 250 33 0.000290554
-2 250 84 33 0.000290554
-2 250 180 33 0.000290554
-3 250 180 84 33 0.000290554
-1 760 454 0.00029103
-2 760 454 321 0.00029103
-0 974 0.00029103
-1 974 321 0.00029103
-1 974 454 0.00029103
-2 974 454 321 0.00029103
-1 974 760 0.00029103
-2 974 760 321 0.00029103
-2 974 760 454 0.00029103
-3 974 760 454 321 0.00029103
-2 882 704 262 0.000291491
-3 882 786 704 262 0.000291491
-1 949 946 0.000291636
-2 949 946 944 0.000291636
-2 949 947 946 0.000291636
-3 949 947 946 944 0.000291636
-0 975 0.000291939
-1 975 165 0.000291939
-1 975 836 0.000291939
-2 975 836 165 0.000291939
-1 975 867 0.000291939
-2 975 867 165 0.000291939
-2 975 867 836 0.000291939
-3 975 867 836 165 0.000291939
-1 308 227 0.000291979
-2 308 227 225 0.000291979
-2 308 228 227 0.000291979
-3 308 228 227 225 0.000291979
-1 494 99 0.00029246
-1 494 381 0.00029246
-2 494 381 99 0.00029246
-2 495 494 99 0.00029246
-2 495 494 381 0.00029246
-3 495 494 381 99 0.00029246
-2 882 263 262 0.000292504
-3 882 263 262 260 0.000292504
-1 914 870 0.000292934
-2 914 870 480 0.000292934
-1 914 899 0.000292934
-2 914 899 480 0.000292934
-2 914 899 870 0.000292934
-3 914 899 870 480 0.000292934
-1 825 747 0.000293135
-2 825 767 747 0.000293135
-2 825 768 747 0.000293135
-3 825 768 767 747 0.000293135
-1 864 654 0.000293296
-2 884 864 654 0.000293296
-1 885 654 0.000293296
-2 885 864 654 0.000293296
-2 885 884 654 0.000293296
-3 885 884 864 654 0.000293296
-1 840 715 0.00029372
-2 840 804 715 0.00029372
-2 840 805 715 0.00029372
-3 840 805 804 715 0.00029372
-1 205 65 0.000293772
-2 205 65 64 0.000293772
-2 353 205 65 0.000293772
-3 353 205 65 64 0.000293772
-1 963 262 0.000294075
-2 963 263 262 0.000294075
-2 963 882 262 0.000294075
-3 963 882 263 262 0.000294075
-1 611 411 0.00029428
-2 611 411 408 0.00029428
-2 611 411 409 0.00029428
-3 611 411 409 408 0.00029428
-1 631 280 0.000294913
-2 732 631 280 0.000294913
-2 733 631 280 0.000294913
-3 733 732 631 280 0.000294913
-2 494 328 99 0.000295013
-3 495 494 328 99 0.000295013
-1 428 176 0.000295028
-2 428 214 176 0.000295028
-2 428 225 176 0.000295028
-3 428 225 214 176 0.000295028
-2 820 669 460 0.000295402
-3 820 669 628 460 0.000295402
-1 366 62 0.00029544
-2 366 118 62 0.00029544
-2 366 119 62 0.00029544
-3 366 119 118 62 0.00029544
-2 318 180 13 0.000295578
-3 318 180 14 13 0.000295578
-1 692 491 0.000295951
-2 692 491 72 0.000295951
-2 692 491 360 0.000295951
-3 692 491 360 72 0.000295951
-2 836 559 165 0.000295954
-3 836 559 269 165 0.000295954
-1 608 437 0.000295967
-2 608 438 437 0.000295967
-2 608 439 437 0.000295967
-3 608 439 438 437 0.000295967
-1 613 205 0.000296164
-2 613 205 65 0.000296164
-2 613 353 205 0.000296164
-3 613 353 205 65 0.000296164
-2 943 829 552 0.000296289
-3 943 940 829 552 0.000296289
-2 780 682 49 0.000296504
-3 780 682 475 49 0.000296504
-1 370 343 0.000296556
-2 441 370 343 0.000296556
-2 771 370 343 0.000296556
-3 771 441 370 343 0.000296556
-2 625 218 133 0.000296726
-3 625 253 218 133 0.000296726
-1 847 760 0.000296824
-2 847 760 758 0.000296824
-2 847 820 758 0.000296824
-2 847 820 760 0.000296824
-3 847 820 760 758 0.000296824
-1 492 331 0.000296864
-2 492 333 331 0.000296864
-2 924 492 331 0.000296864
-3 924 492 333 331 0.000296864
-1 785 559 0.000297045
-2 785 559 450 0.000297045
-2 785 593 559 0.000297045
-3 785 593 559 450 0.000297045
-1 304 268 0.000297315
-2 304 268 217 0.000297315
-2 304 268 218 0.000297315
-3 304 268 218 217 0.000297315
-2 318 183 180 0.00029733
-3 400 318 183 180 0.00029733
-1 733 355 0.000297531
-2 733 488 355 0.000297531
-2 733 631 355 0.000297531
-3 733 631 488 355 0.000297531
-1 862 597 0.000297663
-1 862 691 0.000297663
-2 862 691 597 0.000297663
-1 862 801 0.000297663
-2 862 801 597 0.000297663
-2 862 801 691 0.000297663
-3 862 801 691 597 0.000297663
-1 571 431 0.000298539
-2 571 431 329 0.000298539
-2 571 432 431 0.000298539
-3 571 432 431 329 0.000298539
-1 598 166 0.000298924
-2 598 178 166 0.000298924
-1 867 598 0.000298924
-2 867 598 166 0.000298924
-2 867 598 178 0.000298924
-3 867 598 178 166 0.000298924
-1 822 722 0.00029895
-2 822 798 722 0.00029895
-1 950 822 0.00029895
-2 950 822 722 0.00029895
-2 950 822 798 0.00029895
-3 950 822 798 722 0.00029895
-1 898 107 0.000299136
-2 898 702 107 0.000299136
-2 898 845 107 0.000299136
-3 898 845 702 107 0.000299136
-1 435 134 0.000299153
-2 435 135 134 0.000299153
-2 435 188 134 0.000299153
-3 435 188 135 134 0.000299153
-2 485 351 272 0.000299578
-3 485 351 273 272 0.000299578
-1 38 31 0.000299816
-2 38 31 30 0.000299816
-2 63 38 31 0.000299816
-3 63 38 31 30 0.000299816
-2 383 239 236 0.000299852
-3 383 239 237 236 0.000299852
-1 767 373 0.00030067
-2 767 747 373 0.00030067
-2 849 767 373 0.00030067
-2 849 767 747 0.00030067
-3 849 767 747 373 0.00030067
-1 954 936 0.000301213
-1 954 939 0.000301213
-2 954 939 936 0.000301213
-1 973 936 0.000301213
-1 973 939 0.000301213
-2 973 939 936 0.000301213
-1 973 954 0.000301213
-2 973 954 936 0.000301213
-2 973 954 939 0.000301213
-3 973 954 939 936 0.000301213
-1 324 301 0.000301365
-2 324 301 300 0.000301365
-2 324 323 301 0.000301365
-3 324 323 301 300 0.000301365
-1 846 463 0.000301374
-2 846 464 463 0.000301374
-2 846 692 463 0.000301374
-3 846 692 464 463 0.000301374
-1 331 248 0.000301783
-2 492 331 248 0.000301783
-2 924 331 248 0.000301783
-3 924 492 331 248 0.000301783
-1 272 210 0.000301916
-2 524 272 210 0.000301916
-2 822 272 210 0.000301916
-3 822 524 272 210 0.000301916
-2 137 38 31 0.000301947
-3 137 38 31 30 0.000301947
-1 485 194 0.000302019
-2 485 297 194 0.000302019
-2 485 403 194 0.000302019
-3 485 403 297 194 0.000302019
-1 539 490 0.000302174
-2 539 490 136 0.000302174
-2 539 490 434 0.000302174
-3 539 490 434 136 0.000302174
-1 685 19 0.000302272
-2 685 19 16 0.000302272
-2 685 19 17 0.000302272
-3 685 19 17 16 0.000302272
-1 909 339 0.000302294
-2 909 341 339 0.000302294
-2 909 893 339 0.000302294
-3 909 893 341 339 0.000302294
-1 556 52 0.000302432
-2 556 52 40 0.000302432
-2 556 224 52 0.000302432
-3 556 224 52 40 0.000302432
-1 546 535 0.000302837
-2 546 535 323 0.000302837
-2 546 535 324 0.000302837
-3 546 535 324 323 0.000302837
-1 821 692 0.000302891
-2 821 723 692 0.000302891
-1 942 692 0.000302891
-2 942 723 692 0.000302891
-2 942 821 692 0.000302891
-3 942 821 723 692 0.000302891
-1 885 582 0.000303086
-2 885 654 582 0.000303086
-2 885 884 582 0.000303086
-3 885 884 654 582 0.000303086
-1 625 216 0.000303377
-2 625 216 133 0.000303377
-2 625 218 216 0.000303377
-3 625 218 216 133 0.000303377
-1 886 389 0.000303704
-1 886 474 0.000303704
-2 886 474 389 0.000303704
-2 886 885 389 0.000303704
-2 886 885 474 0.000303704
-3 886 885 474 389 0.000303704
-2 829 542 232 0.000303792
-3 829 702 542 232 0.000303792
-2 304 268 185 0.000303874
-3 304 268 217 185 0.000303874
-1 874 741 0.000303962
-1 874 791 0.000303962
-2 874 791 741 0.000303962
-2 915 874 741 0.000303962
-2 915 874 791 0.000303962
-3 915 874 791 741 0.000303962
-1 725 549 0.0003042
-1 949 549 0.0003042
-2 949 725 549 0.0003042
-0 976 0.0003042
-1 976 549 0.0003042
-1 976 725 0.0003042
-2 976 725 549 0.0003042
-1 976 949 0.0003042
-2 976 949 549 0.0003042
-2 976 949 725 0.0003042
-3 976 949 725 549 0.0003042
-1 899 887 0.000304394
-2 899 887 806 0.000304394
-2 899 887 842 0.000304394
-3 899 887 842 806 0.000304394
-1 885 245 0.000304397
-2 885 389 245 0.000304397
-2 885 658 245 0.000304397
-3 885 658 389 245 0.000304397
-1 586 250 0.000304632
-1 586 379 0.000304632
-2 586 379 250 0.000304632
-2 586 405 250 0.000304632
-2 586 405 379 0.000304632
-3 586 405 379 250 0.000304632
-1 824 757 0.000304825
-2 824 768 757 0.000304825
-2 825 824 757 0.000304825
-3 825 824 768 757 0.000304825
-1 598 496 0.000304918
-2 598 496 178 0.000304918
-2 598 520 496 0.000304918
-3 598 520 496 178 0.000304918
-0 977 0.000305312
-1 977 549 0.000305312
-1 977 976 0.000305312
-2 977 976 549 0.000305312
-0 978 0.000305312
-1 978 549 0.000305312
-1 978 976 0.000305312
-2 978 976 549 0.000305312
-1 978 977 0.000305312
-2 978 977 549 0.000305312
-2 978 977 976 0.000305312
-3 978 977 976 549 0.000305312
-1 592 343 0.000305353
-2 592 370 343 0.000305353
-2 771 592 343 0.000305353
-3 771 592 370 343 0.000305353
-1 757 431 0.000305366
-2 757 431 329 0.000305366
-2 757 571 431 0.000305366
-3 757 571 431 329 0.000305366
-1 757 602 0.000306711
-2 757 602 18 0.000306711
-2 757 602 571 0.000306711
-3 757 602 571 18 0.000306711
-1 846 360 0.000306712
-2 846 360 302 0.000306712
-2 846 692 360 0.000306712
-3 846 692 360 302 0.000306712
-2 743 567 465 0.000307023
-1 744 465 0.000307023
-2 744 567 465 0.000307023
-2 744 743 465 0.000307023
-3 744 743 567 465 0.000307023
-2 339 336 261 0.000307114
-3 339 336 335 261 0.000307114
-1 909 852 0.000307142
-2 909 852 851 0.000307142
-1 928 851 0.000307142
-1 928 852 0.000307142
-2 928 852 851 0.000307142
-1 928 909 0.000307142
-2 928 909 851 0.000307142
-2 928 909 852 0.000307142
-3 928 909 852 851 0.000307142
-2 613 205 64 0.000307274
-3 613 205 65 64 0.000307274
-1 594 302 0.000307566
-2 594 303 302 0.000307566
-2 719 594 302 0.000307566
-3 719 594 303 302 0.000307566
-2 846 594 302 0.000307603
-3 846 719 594 302 0.000307603
-2 435 136 134 0.000307631
-3 435 136 135 134 0.000307631
-1 248 224 0.000307657
-2 331 248 224 0.000307657
-2 924 248 224 0.000307657
-3 924 331 248 224 0.000307657
-1 912 431 0.000307711
-2 912 431 329 0.000307711
-2 912 757 431 0.000307711
-3 912 757 431 329 0.000307711
-2 912 431 315 0.000307735
-3 912 431 329 315 0.000307735
-0 979 0.000307778
-1 979 322 0.000307778
-1 979 765 0.000307778
-2 979 765 322 0.000307778
-1 979 859 0.000307778
-2 979 859 322 0.000307778
-2 979 859 765 0.000307778
-3 979 859 765 322 0.000307778
-1 757 315 0.000308017
-2 757 431 315 0.000308017
-2 912 757 315 0.000308017
-3 912 757 431 315 0.000308017
-2 589 561 525 0.000308116
-3 589 561 526 525 0.000308116
-1 846 303 0.000308124
-2 846 303 302 0.000308124
-2 846 594 303 0.000308124
-3 846 594 303 302 0.000308124
-1 941 589 0.000308133
-2 941 589 561 0.000308133
-2 941 880 589 0.000308133
-3 941 880 589 561 0.000308133
-2 707 680 572 0.000308191
-1 773 572 0.000308191
-2 773 680 572 0.000308191
-2 773 707 572 0.000308191
-3 773 707 680 572 0.000308191
-1 783 187 0.000308262
-1 810 783 0.000308262
-2 810 783 187 0.000308262
-1 974 187 0.000308262
-1 974 783 0.000308262
-2 974 783 187 0.000308262
-1 974 810 0.000308262
-2 974 810 187 0.000308262
-2 974 810 783 0.000308262
-3 974 810 783 187 0.000308262
-1 852 602 0.000308262
-2 852 736 602 0.000308262
-2 956 852 602 0.000308262
-3 956 852 736 602 0.000308262
-1 623 422 0.000308427
-2 623 422 420 0.000308427
-1 657 420 0.000308427
-2 657 422 420 0.000308427
-2 657 623 420 0.000308427
-2 657 623 422 0.000308427
-3 657 623 422 420 0.000308427
-1 752 548 0.000308601
-2 752 548 459 0.000308601
-2 952 752 548 0.000308601
-3 952 752 548 459 0.000308601
-1 892 463 0.000308886
-2 892 463 442 0.000308886
-2 892 464 463 0.000308886
-3 892 464 463 442 0.000308886
-1 498 277 0.000309022
-2 498 429 277 0.000309022
-2 499 498 277 0.000309022
-3 499 498 429 277 0.000309022
-2 579 531 339 0.000309276
-3 579 531 339 336 0.000309276
-1 712 573 0.000309977
-2 712 584 573 0.000309977
-2 712 639 573 0.000309977
-3 712 639 584 573 0.000309977
-1 573 76 0.000310011
-2 573 77 76 0.000310011
-2 573 79 76 0.000310011
-3 573 79 77 76 0.000310011
-2 248 247 224 0.000311011
-3 924 248 247 224 0.000311011
-2 769 747 373 0.000311266
-3 769 747 376 373 0.000311266
-1 872 500 0.000311392
-2 872 503 500 0.000311392
-2 872 691 500 0.000311392
-3 872 691 503 500 0.000311392
-1 975 166 0.000311646
-2 975 166 165 0.000311646
-2 975 867 166 0.000311646
-3 975 867 166 165 0.000311646
-1 822 244 0.000311695
-2 822 272 244 0.000311695
-2 822 352 244 0.000311695
-3 822 352 272 244 0.000311695
-1 328 102 0.000312052
-2 328 102 100 0.000312052
-2 440 328 102 0.000312052
-3 440 328 102 100 0.000312052
-1 518 510 0.000312078
-2 518 516 510 0.000312078
-2 693 518 510 0.000312078
-3 693 518 516 510 0.000312078
-1 584 218 0.00031228
-2 584 304 218 0.00031228
-2 584 417 218 0.00031228
-3 584 417 304 218 0.00031228
-1 896 592 0.000312622
-2 896 771 592 0.000312622
-1 896 895 0.000312622
-2 896 895 592 0.000312622
-2 896 895 771 0.000312622
-3 896 895 771 592 0.000312622
-2 887 806 804 0.000312675
-1 954 887 0.000312675
-2 954 887 804 0.000312675
-2 954 887 806 0.000312675
-3 954 887 806 804 0.000312675
-1 798 24 0.000312708
-2 798 243 24 0.000312708
-2 798 722 24 0.000312708
-3 798 722 243 24 0.000312708
-1 952 624 0.000312975
-2 952 624 28 0.000312975
-2 952 624 548 0.000312975
-3 952 624 548 28 0.000312975
-1 613 408 0.000313421
-2 613 484 408 0.000313421
-2 637 613 408 0.000313421
-3 637 613 484 408 0.000313421
-1 585 362 0.000313482
-2 585 574 362 0.000313482
-2 910 585 362 0.000313482
-3 910 585 574 362 0.000313482
-2 846 360 303 0.00031371
-3 846 360 303 302 0.00031371
-2 855 597 107 0.000313735
-3 855 597 501 107 0.000313735
-1 633 96 0.000313794
-1 737 633 0.000313794
-2 737 633 96 0.000313794
-1 970 633 0.000313794
-2 970 633 96 0.000313794
-1 970 737 0.000313794
-2 970 737 96 0.000313794
-2 970 737 633 0.000313794
-3 970 737 633 96 0.000313794
-1 247 52 0.00031387
-2 247 224 52 0.00031387
-2 556 247 52 0.00031387
-3 556 247 224 52 0.00031387
-2 838 421 420 0.000314162
-3 838 421 420 419 0.000314162
-2 613 205 202 0.000314218
-3 613 353 205 202 0.000314218
-1 247 40 0.000314404
-2 247 52 40 0.000314404
-2 556 247 40 0.000314404
-3 556 247 52 40 0.000314404
-2 568 471 301 0.000314843
-1 594 471 0.000314843
-2 594 471 301 0.000314843
-2 594 568 471 0.000314843
-3 594 568 471 301 0.000314843
-1 975 598 0.000314899
-2 975 598 166 0.000314899
-2 975 867 598 0.000314899
-3 975 867 598 166 0.000314899
-2 428 176 63 0.000314937
-3 428 214 176 63 0.000314937
-1 508 42 0.000315005
-2 508 161 42 0.000315005
-2 508 423 42 0.000315005
-3 508 423 161 42 0.000315005
-2 892 463 444 0.000315294
-3 892 463 444 442 0.000315294
-2 769 757 315 0.000315384
-3 912 769 757 315 0.000315384
-1 174 75 0.000315426
-2 174 75 74 0.000315426
-2 174 173 75 0.000315426
-3 174 173 75 74 0.000315426
-1 811 585 0.000315596
-2 894 811 585 0.000315596
-1 910 811 0.000315596
-2 910 811 585 0.000315596
-1 910 894 0.000315596
-2 910 894 585 0.000315596
-2 910 894 811 0.000315596
-3 910 894 811 585 0.000315596
-1 828 542 0.000315994
-2 828 543 542 0.000315994
-2 829 828 542 0.000315994
-3 829 828 543 542 0.000315994
-2 892 846 463 0.000316691
-3 892 846 464 463 0.000316691
-1 782 187 0.000316946
-2 782 187 184 0.000316946
-1 783 184 0.000316946
-2 783 187 184 0.000316946
-2 783 782 184 0.000316946
-2 783 782 187 0.000316946
-3 783 782 187 184 0.000316946
-1 133 24 0.00031766
-2 625 133 24 0.00031766
-2 833 133 24 0.00031766
-3 833 625 133 24 0.00031766
-1 810 215 0.000317791
-2 810 217 215 0.000317791
-2 810 305 215 0.000317791
-3 810 305 217 215 0.000317791
-2 798 242 24 0.000317961
-3 798 243 242 24 0.000317961
-1 875 781 0.00031798
-2 875 784 781 0.00031798
-2 875 825 781 0.00031798
-3 875 825 784 781 0.00031798
-1 758 320 0.000318082
-2 760 758 320 0.000318082
-2 761 758 320 0.000318082
-3 761 760 758 320 0.000318082
-1 847 759 0.000318475
-2 847 759 758 0.000318475
-2 847 820 759 0.000318475
-3 847 820 759 758 0.000318475
-1 631 279 0.000318783
-2 732 631 279 0.000318783
-2 888 631 279 0.000318783
-2 888 732 631 0.000318783
-3 888 732 631 279 0.000318783
-1 851 339 0.000319282
-2 851 340 339 0.000319282
-2 851 341 339 0.000319282
-3 851 341 340 339 0.000319282
-2 746 590 284 0.00031986
-3 746 590 477 284 0.00031986
-2 755 618 49 0.000320089
-3 755 618 49 48 0.000320089
-2 546 535 86 0.000320324
-3 546 535 323 86 0.000320324
-1 933 408 0.00032042
-2 933 613 408 0.00032042
-1 933 637 0.00032042
-2 933 637 408 0.00032042
-2 933 637 613 0.00032042
-3 933 637 613 408 0.00032042
-1 774 572 0.000321059
-2 774 707 572 0.000321059
-1 897 774 0.000321059
-2 897 774 572 0.000321059
-2 897 774 707 0.000321059
-3 897 774 707 572 0.000321059
-1 559 175 0.00032107
-2 559 259 175 0.00032107
-2 566 559 175 0.00032107
-3 566 559 259 175 0.00032107
-1 595 471 0.000321573
-2 595 568 471 0.000321573
-2 595 594 471 0.000321573
-3 595 594 568 471 0.000321573
-1 723 110 0.000321642
-2 828 723 110 0.000321642
-1 943 110 0.000321642
-2 943 723 110 0.000321642
-2 943 828 110 0.000321642
-3 943 828 723 110 0.000321642
-2 314 272 210 0.000321776
-3 524 314 272 210 0.000321776
-1 747 210 0.0003219
-2 747 376 210 0.0003219
-2 747 537 210 0.0003219
-3 747 537 376 210 0.0003219
-1 497 410 0.000322122
-2 497 411 410 0.000322122
-2 498 497 410 0.000322122
-3 498 497 411 410 0.000322122
-2 774 773 572 0.000322152
-3 774 773 707 572 0.000322152
-1 632 94 0.000322349
-1 633 94 0.000322349
-2 633 632 94 0.000322349
-1 777 632 0.000322349
-2 777 632 94 0.000322349
-1 777 633 0.000322349
-2 777 633 94 0.000322349
-2 777 633 632 0.000322349
-3 777 633 632 94 0.000322349
-1 247 160 0.000322466
-2 247 160 52 0.000322466
-2 247 224 160 0.000322466
-3 247 224 160 52 0.000322466
-1 737 94 0.000322686
-2 737 96 94 0.000322686
-2 970 737 94 0.000322686
-3 970 737 96 94 0.000322686
-1 881 683 0.000322739
-2 881 704 683 0.000322739
-2 881 728 683 0.000322739
-3 881 728 704 683 0.000322739
-2 821 723 110 0.000322904
-3 828 821 723 110 0.000322904
-2 737 95 94 0.000322976
-3 737 96 95 94 0.000322976
-1 834 631 0.000323061
-1 834 795 0.000323061
-2 834 795 631 0.000323061
-1 911 631 0.000323061
-1 911 795 0.000323061
-2 911 795 631 0.000323061
-1 911 834 0.000323061
-2 911 834 631 0.000323061
-2 911 834 795 0.000323061
-3 911 834 795 631 0.000323061
-1 502 449 0.000323749
-2 597 502 449 0.000323749
-2 801 502 449 0.000323749
-3 801 597 502 449 0.000323749
-2 910 811 521 0.000323758
-2 910 894 521 0.000323758
-3 910 894 811 521 0.000323758
-1 860 753 0.000323795
-2 860 753 659 0.000323795
-1 952 659 0.000323795
-1 952 753 0.000323795
-2 952 753 659 0.000323795
-1 952 860 0.000323795
-2 952 860 659 0.000323795
-2 952 860 753 0.000323795
-3 952 860 753 659 0.000323795
-1 552 107 0.000324184
-2 552 252 107 0.000324184
-2 703 552 107 0.000324184
-3 703 552 252 107 0.000324184
-1 523 363 0.000324478
-2 523 363 359 0.000324478
-2 523 363 362 0.000324478
-3 523 363 362 359 0.000324478
-2 896 619 342 0.000324595
-3 896 619 617 342 0.000324595
-2 737 633 94 0.000324681
-2 970 633 94 0.000324681
-3 970 737 633 94 0.000324681
-1 580 574 0.000325026
-2 580 574 78 0.000325026
-2 580 574 79 0.000325026
-3 580 574 79 78 0.000325026
-1 423 247 0.000325622
-2 423 247 52 0.000325622
-2 423 247 160 0.000325622
-3 423 247 160 52 0.000325622
-2 423 247 224 0.00032566
-3 423 247 224 160 0.00032566
-1 914 631 0.000325786
-1 914 888 0.000325786
-2 914 888 631 0.000325786
-2 914 899 631 0.000325786
-2 914 899 888 0.000325786
-3 914 899 888 631 0.000325786
-1 886 245 0.00032599
-2 886 389 245 0.00032599
-2 886 885 245 0.00032599
-3 886 885 389 245 0.00032599
-1 781 44 0.000326245
-1 781 46 0.000326245
-2 781 46 44 0.000326245
-2 849 781 44 0.000326245
-2 849 781 46 0.000326245
-3 849 781 46 44 0.000326245
-2 782 781 44 0.000326362
-2 782 781 46 0.000326362
-3 782 781 46 44 0.000326362
-1 674 342 0.000326413
-2 674 342 203 0.000326413
-2 771 674 342 0.000326413
-3 771 674 342 203 0.000326413
-1 769 431 0.00032663
-2 769 431 315 0.00032663
-2 769 757 431 0.00032663
-3 769 757 431 315 0.00032663
-1 514 47 0.000327194
-2 514 47 46 0.000327194
-2 514 375 47 0.000327194
-3 514 375 47 46 0.000327194
-2 423 247 40 0.000327226
-3 423 247 52 40 0.000327226
-2 909 851 339 0.000327295
-3 909 851 341 339 0.000327295
-1 581 573 0.000327324
-2 581 573 76 0.000327324
-2 581 573 79 0.000327324
-3 581 573 79 76 0.000327324
-1 730 523 0.000327391
-2 730 523 359 0.000327391
-2 929 730 523 0.000327391
-3 929 730 523 359 0.000327391
-1 317 180 0.00032755
-2 317 180 13 0.00032755
-2 318 317 180 0.00032755
-3 318 317 180 13 0.00032755
-1 751 670 0.000328223
-1 765 670 0.000328223
-2 765 751 670 0.000328223
-2 931 751 670 0.000328223
-1 931 765 0.000328223
-2 931 765 670 0.000328223
-2 931 765 751 0.000328223
-3 931 765 751 670 0.000328223
-1 304 216 0.000328793
-2 304 218 216 0.000328793
-2 304 268 216 0.000328793
-3 304 268 218 216 0.000328793
-2 765 507 491 0.000328821
-2 766 507 491 0.000328821
-3 766 765 507 491 0.000328821
-2 702 552 107 0.000328919
-3 703 702 552 107 0.000328919
-1 902 670 0.000329083
-2 931 902 670 0.000329083
-2 951 902 670 0.000329083
-3 951 931 902 670 0.000329083
-2 242 133 24 0.000329218
-3 833 242 133 24 0.000329218
-1 660 422 0.000329501
-2 660 656 422 0.000329501
-2 660 657 422 0.000329501
-3 660 657 656 422 0.000329501
-1 333 248 0.000329604
-2 333 331 248 0.000329604
-2 492 333 248 0.000329604
-3 492 333 331 248 0.000329604
-1 816 341 0.000329642
-2 816 341 261 0.000329642
-2 816 341 340 0.000329642
-3 816 341 340 261 0.000329642
-1 255 136 0.000329714
-2 255 136 134 0.000329714
-2 538 255 136 0.000329714
-3 538 255 136 134 0.000329714
-1 817 425 0.000330075
-1 818 425 0.000330075
-2 818 817 425 0.000330075
-1 925 425 0.000330075
-2 925 817 425 0.000330075
-2 925 818 425 0.000330075
-3 925 818 817 425 0.000330075
-1 810 460 0.000330136
-2 810 460 305 0.000330136
-2 810 760 460 0.000330136
-3 810 760 460 305 0.000330136
-1 474 100 0.000331061
-2 474 389 100 0.000331061
-1 886 100 0.000331061
-2 886 389 100 0.000331061
-2 886 474 100 0.000331061
-3 886 474 389 100 0.000331061
-2 782 217 187 0.000331212
-3 782 217 187 184 0.000331212
-1 403 391 0.000331248
-2 403 391 271 0.000331248
-2 403 391 274 0.000331248
-3 403 391 274 271 0.000331248
-1 566 174 0.000331801
-2 566 174 173 0.000331801
-2 566 175 174 0.000331801
-3 566 175 174 173 0.000331801
-1 907 692 0.000332341
-2 907 846 692 0.000332341
-2 942 846 692 0.000332341
-2 942 907 692 0.000332341
-3 942 907 846 692 0.000332341
-1 580 364 0.00033267
-2 605 580 364 0.00033267
-1 930 364 0.00033267
-2 930 580 364 0.00033267
-1 930 605 0.00033267
-2 930 605 364 0.00033267
-2 930 605 580 0.00033267
-3 930 605 580 364 0.00033267
-0 980 0.000332884
-1 980 359 0.000332884
-1 980 770 0.000332884
-2 980 770 359 0.000332884
-1 980 935 0.000332884
-2 980 935 359 0.000332884
-2 980 935 770 0.000332884
-3 980 935 770 359 0.000332884
-1 559 174 0.000333171
-2 559 175 174 0.000333171
-2 559 259 174 0.000333171
-3 559 259 175 174 0.000333171
-1 886 70 0.00033347
-2 886 245 70 0.00033347
-2 886 389 70 0.00033347
-3 886 389 245 70 0.00033347
-2 874 759 586 0.000333471
-3 874 793 759 586 0.000333471
-2 886 100 70 0.000333486
-3 886 389 100 70 0.000333486
-2 906 444 443 0.000333834
-2 907 444 443 0.000333834
-3 907 906 444 443 0.000333834
-1 889 597 0.000334059
-2 889 597 503 0.000334059
-2 889 691 597 0.000334059
-3 889 691 597 503 0.000334059
-1 510 34 0.000334554
-2 510 161 34 0.000334554
-2 510 163 34 0.000334554
-3 510 163 161 34 0.000334554
-1 697 262 0.00033477
-2 697 263 262 0.00033477
-2 697 336 262 0.00033477
-3 697 336 263 262 0.00033477
-1 493 391 0.000334907
-2 493 391 274 0.000334907
-2 711 493 391 0.000334907
-3 711 493 391 274 0.000334907
-1 432 18 0.000334965
-2 432 18 16 0.000334965
-2 432 18 17 0.000334965
-3 432 18 17 16 0.000334965
-2 785 566 559 0.000335567
-3 785 593 566 559 0.000335567
-1 241 133 0.00033559
-2 241 208 133 0.00033559
-2 241 240 133 0.00033559
-3 241 240 208 133 0.00033559
-2 601 432 18 0.00033573
-3 601 432 18 16 0.00033573
-2 787 755 236 0.000335748
-2 787 775 755 0.000335748
-3 787 775 755 236 0.000335748
-1 746 283 0.000335909
-2 746 283 282 0.000335909
-2 746 476 283 0.000335909
-3 746 476 283 282 0.000335909
-2 672 643 603 0.000336232
-3 672 671 643 603 0.000336232
-1 849 782 0.00033666
-2 849 782 46 0.00033666
-2 849 782 781 0.00033666
-3 849 782 781 46 0.00033666
-1 881 443 0.000337075
-2 881 683 443 0.000337075
-2 881 728 443 0.000337075
-3 881 728 683 443 0.000337075
-1 856 597 0.000337269
-2 856 597 503 0.000337269
-2 889 856 597 0.000337269
-3 889 856 597 503 0.000337269
-2 732 280 279 0.000337446
-3 732 731 280 279 0.000337446
-1 182 33 0.000337736
-2 182 180 33 0.000337736
-2 250 182 33 0.000337736
-3 250 182 180 33 0.000337736
-1 954 911 0.000337756
-2 954 911 805 0.000337756
-2 954 911 806 0.000337756
-3 954 911 806 805 0.000337756
-1 554 529 0.000337863
-2 893 554 529 0.000337863
-1 909 529 0.000337863
-2 909 554 529 0.000337863
-2 909 893 529 0.000337863
-3 909 893 554 529 0.000337863
-1 578 391 0.000337936
-2 578 391 274 0.000337936
-2 578 403 391 0.000337936
-3 578 403 391 274 0.000337936
-1 327 4 0.000338014
-2 327 6 4 0.000338014
-2 327 7 4 0.000338014
-3 327 7 6 4 0.000338014
-2 816 579 335 0.000338281
-3 816 579 335 260 0.000338281
-1 585 521 0.000338431
-2 894 585 521 0.000338431
-2 910 585 521 0.000338431
-3 910 894 585 521 0.000338431
-1 666 483 0.000338545
-1 809 483 0.000338545
-2 809 666 483 0.000338545
-1 819 483 0.000338545
-2 819 666 483 0.000338545
-1 819 809 0.000338545
-2 819 809 483 0.000338545
-2 819 809 666 0.000338545
-3 819 809 666 483 0.000338545
-2 907 881 443 0.000338595
-3 907 881 728 443 0.000338595
-2 954 887 840 0.000338635
-3 954 887 840 804 0.000338635
-2 795 487 393 0.000339214
-3 795 487 393 392 0.000339214
-1 241 24 0.000339289
-2 242 241 24 0.000339289
-2 798 241 24 0.000339289
-3 798 242 241 24 0.000339289
-1 247 130 0.000339719
-2 247 130 40 0.000339719
-2 556 247 130 0.000339719
-3 556 247 130 40 0.000339719
-2 856 855 503 0.000339945
-2 856 855 597 0.000339945
-3 856 855 597 503 0.000339945
-1 585 200 0.000340179
-2 639 585 200 0.000340179
-1 894 200 0.000340179
-2 894 585 200 0.000340179
-2 894 639 200 0.000340179
-3 894 639 585 200 0.000340179
-1 862 802 0.000340213
-2 862 802 801 0.000340213
-0 981 0.000340213
-1 981 801 0.000340213
-1 981 802 0.000340213
-2 981 802 801 0.000340213
-1 981 862 0.000340213
-2 981 862 801 0.000340213
-2 981 862 802 0.000340213
-3 981 862 802 801 0.000340213
-1 199 94 0.000340305
-2 632 199 94 0.000340305
-2 633 199 94 0.000340305
-3 633 632 199 94 0.000340305
-1 566 346 0.000340932
-2 566 346 89 0.000340932
-2 739 566 346 0.000340932
-3 739 566 346 89 0.000340932
-1 601 431 0.000341391
-2 601 432 431 0.000341391
-2 601 571 431 0.000341391
-3 601 571 432 431 0.000341391
-1 432 19 0.000341513
-2 432 19 17 0.000341513
-2 432 19 18 0.000341513
-3 432 19 18 17 0.000341513
-2 773 717 582 0.000341529
-3 773 717 653 582 0.000341529
-1 793 379 0.000342157
-2 793 586 379 0.000342157
-2 915 586 379 0.000342157
-2 915 793 379 0.000342157
-3 915 793 586 379 0.000342157
-1 469 19 0.000342664
-2 469 19 17 0.000342664
-1 474 19 0.000342664
-2 474 19 17 0.000342664
-2 474 469 19 0.000342664
-3 474 469 19 17 0.000342664
-1 660 420 0.000343435
-2 660 623 420 0.000343435
-2 660 659 420 0.000343435
-3 660 659 623 420 0.000343435
-1 772 692 0.000343452
-2 772 723 692 0.000343452
-2 942 772 692 0.000343452
-3 942 772 723 692 0.000343452
-2 595 465 445 0.000343561
-3 595 465 445 442 0.000343561
-1 182 13 0.000343923
-2 182 33 13 0.000343923
-2 182 180 13 0.000343923
-3 182 180 33 13 0.000343923
-2 763 745 742 0.000344099
-3 763 745 744 742 0.000344099
-1 533 474 0.000345217
-1 764 474 0.000345217
-2 764 533 474 0.000345217
-1 967 474 0.000345217
-2 967 533 474 0.000345217
-2 967 764 474 0.000345217
-3 967 764 533 474 0.000345217
-2 896 592 343 0.000345844
-3 896 771 592 343 0.000345844
-1 806 732 0.000345892
-2 806 732 631 0.000345892
-2 888 806 732 0.000345892
-3 888 806 732 631 0.000345892
-1 474 70 0.000346005
-2 474 100 70 0.000346005
-2 886 474 70 0.000346005
-3 886 474 100 70 0.000346005
-1 859 535 0.000346503
-2 859 535 322 0.000346503
-1 865 322 0.000346503
-1 865 535 0.000346503
-2 865 535 322 0.000346503
-1 865 859 0.000346503
-2 865 859 322 0.000346503
-2 865 859 535 0.000346503
-3 865 859 535 322 0.000346503
-2 777 199 94 0.000346546
-2 777 632 199 0.000346546
-3 777 632 199 94 0.000346546
-1 948 756 0.000347099
-2 948 756 333 0.000347099
-1 948 863 0.000347099
-2 948 863 333 0.000347099
-2 948 863 756 0.000347099
-3 948 863 756 333 0.000347099
-2 747 375 210 0.000347101
-3 747 376 375 210 0.000347101
-1 647 591 0.000347163
-1 866 647 0.000347163
-2 866 647 591 0.000347163
-1 895 647 0.000347163
-2 895 647 591 0.000347163
-2 895 866 647 0.000347163
-3 895 866 647 591 0.000347163
-1 371 343 0.000347727
-2 371 370 343 0.000347727
-2 441 371 343 0.000347727
-3 441 371 370 343 0.000347727
-2 592 371 343 0.000347778
-3 592 371 370 343 0.000347778
-1 602 432 0.000347808
-2 602 432 18 0.000347808
-2 602 601 432 0.000347808
-3 602 601 432 18 0.000347808
-1 817 249 0.000347863
-1 817 427 0.000347863
-2 817 427 249 0.000347863
-1 955 249 0.000347863
-1 955 427 0.000347863
-2 955 427 249 0.000347863
-2 955 817 249 0.000347863
-2 955 817 427 0.000347863
-3 955 817 427 249 0.000347863
-1 506 431 0.000347911
-2 506 431 171 0.000347911
-2 506 431 315 0.000347911
-3 506 431 315 171 0.000347911
-1 423 248 0.000348187
-2 423 248 224 0.000348187
-2 423 248 247 0.000348187
-3 423 248 247 224 0.000348187
-1 704 341 0.000348552
-2 704 341 340 0.000348552
-2 704 455 341 0.000348552
-3 704 455 341 340 0.000348552
-1 732 429 0.000348616
-2 732 429 279 0.000348616
-2 732 429 280 0.000348616
-3 732 429 280 279 0.000348616
-2 423 331 248 0.000348998
-3 423 331 248 224 0.000348998
-0 982 0.000349611
-1 982 857 0.000349611
-1 982 965 0.000349611
-2 982 965 857 0.000349611
-0 983 0.000349611
-1 983 857 0.000349611
-1 983 965 0.000349611
-2 983 965 857 0.000349611
-1 983 982 0.000349611
-2 983 982 857 0.000349611
-2 983 982 965 0.000349611
-3 983 982 965 857 0.000349611
-1 750 466 0.000349634
-2 750 467 466 0.000349634
-2 785 750 466 0.000349634
-3 785 750 467 466 0.000349634
-1 980 730 0.000349785
-2 980 730 359 0.000349785
-2 980 935 730 0.000349785
-3 980 935 730 359 0.000349785
-1 459 43 0.000349992
-2 459 43 40 0.000349992
-2 459 163 43 0.000349992
-3 459 163 43 40 0.000349992
-2 785 451 450 0.000350345
-3 785 452 451 450 0.000350345
-1 660 25 0.000350845
-2 660 27 25 0.000350845
-2 660 473 25 0.000350845
-3 660 473 27 25 0.000350845
-1 743 444 0.000352096
-2 743 444 443 0.000352096
-2 743 445 444 0.000352096
-3 743 445 444 443 0.000352096
-1 902 451 0.000352925
-2 902 785 451 0.000352925
-2 961 902 451 0.000352925
-3 961 902 785 451 0.000352925
-1 897 98 0.00035302
-2 897 98 23 0.00035302
-2 897 722 98 0.00035302
-3 897 722 98 23 0.00035302
-1 595 472 0.00035306
-2 595 472 471 0.00035306
-2 595 568 472 0.00035306
-3 595 568 472 471 0.00035306
-1 616 563 0.000353083
-2 616 614 563 0.000353083
-2 616 615 563 0.000353083
-3 616 615 614 563 0.000353083
-1 247 238 0.000353166
-2 248 247 238 0.000353166
-2 249 247 238 0.000353166
-3 249 248 247 238 0.000353166
-2 618 449 448 0.000353562
-3 618 449 448 446 0.000353562
-2 952 752 659 0.000353782
-2 952 753 752 0.000353782
-3 952 753 752 659 0.000353782
-1 883 431 0.000353941
-2 883 571 431 0.000353941
-2 883 601 431 0.000353941
-2 883 601 571 0.000353941
-3 883 601 571 431 0.000353941
-1 658 68 0.000354003
-2 658 245 68 0.000354003
-2 658 388 68 0.000354003
-3 658 388 245 68 0.000354003
-2 611 379 181 0.000354468
-3 611 379 183 181 0.000354468
-2 685 19 18 0.000354561
-3 685 19 18 16 0.000354561
-1 411 183 0.000354859
-2 411 409 183 0.000354859
-2 611 411 183 0.000354859
-3 611 411 409 183 0.000354859
-1 948 508 0.000355131
-2 948 508 333 0.000355131
-2 948 756 508 0.000355131
-3 948 756 508 333 0.000355131
-1 240 24 0.000355402
-2 241 240 24 0.000355402
-2 242 240 24 0.000355402
-3 242 241 240 24 0.000355402
-1 907 683 0.000355472
-2 907 683 443 0.000355472
-2 907 881 683 0.000355472
-3 907 881 683 443 0.000355472
-1 711 314 0.000355508
-2 711 314 272 0.000355508
-2 711 413 314 0.000355508
-3 711 413 314 272 0.000355508
-1 552 178 0.000355511
-2 552 178 107 0.000355511
-2 552 252 178 0.000355511
-3 552 252 178 107 0.000355511
-1 821 542 0.000355618
-2 821 543 542 0.000355618
-2 828 821 542 0.000355618
-3 828 821 543 542 0.000355618
-1 469 389 0.000355641
-2 470 469 389 0.000355641
-2 474 469 389 0.000355641
-3 474 470 469 389 0.000355641
-2 559 259 165 0.000355778
-3 559 259 165 164 0.000355778
-2 902 672 670 0.000355995
-3 951 902 672 670 0.000355995
-2 566 559 174 0.000356498
-3 566 559 175 174 0.000356498
-1 655 510 0.000357057
-2 656 655 510 0.000357057
-2 657 655 510 0.000357057
-3 657 656 655 510 0.000357057
-2 883 757 431 0.000357601
-3 883 757 571 431 0.000357601
-1 650 417 0.000357918
-2 650 572 417 0.000357918
-2 651 650 417 0.000357918
-3 651 650 572 417 0.000357918
-1 844 832 0.000358267
-1 962 832 0.000358267
-2 962 844 832 0.000358267
-0 984 0.000358267
-1 984 832 0.000358267
-1 984 844 0.000358267
-2 984 844 832 0.000358267
-1 984 962 0.000358267
-2 984 962 832 0.000358267
-2 984 962 844 0.000358267
-3 984 962 844 832 0.000358267
-1 784 354 0.000358998
-1 784 393 0.000358998
-2 784 393 354 0.000358998
-2 877 784 354 0.000358998
-2 877 784 393 0.000358998
-3 877 784 393 354 0.000358998
-2 240 133 24 0.000359529
-3 242 240 133 24 0.000359529
-1 786 341 0.000359674
-2 786 341 340 0.000359674
-2 786 704 341 0.000359674
-3 786 704 341 340 0.000359674
-1 846 444 0.000359709
-2 846 463 444 0.000359709
-2 892 846 444 0.000359709
-3 892 846 463 444 0.000359709
-2 821 772 542 0.000359819
-3 821 772 543 542 0.000359819
-1 375 367 0.000359854
-2 375 367 314 0.000359854
-2 513 375 367 0.000359854
-3 513 375 367 314 0.000359854
-1 584 77 0.000360054
-2 584 573 77 0.000360054
-2 680 584 77 0.000360054
-3 680 584 573 77 0.000360054
-2 907 846 444 0.000360286
-2 907 892 846 0.000360286
-3 907 892 846 444 0.000360286
-2 578 493 391 0.000360769
-3 578 493 391 274 0.000360769
-1 525 144 0.000360801
-2 525 144 143 0.000360801
-2 589 525 144 0.000360801
-3 589 525 144 143 0.000360801
-1 950 210 0.000360957
-2 950 272 210 0.000360957
-2 950 822 210 0.000360957
-2 950 822 272 0.000360957
-3 950 822 272 210 0.000360957
-1 878 844 0.000361471
-2 878 844 843 0.000361471
-1 889 878 0.000361471
-2 889 878 843 0.000361471
-2 889 878 844 0.000361471
-3 889 878 844 843 0.000361471
-1 525 145 0.000361508
-2 525 145 143 0.000361508
-2 525 379 145 0.000361508
-3 525 379 145 143 0.000361508
-1 582 76 0.000361929
-2 582 581 76 0.000361929
-2 773 582 76 0.000361929
-3 773 582 581 76 0.000361929
-1 755 239 0.000362365
-2 755 239 236 0.000362365
-2 755 383 239 0.000362365
-3 755 383 239 236 0.000362365
-2 241 133 24 0.00036288
-3 241 240 133 24 0.00036288
-1 758 669 0.000363366
-2 847 758 669 0.000363366
-2 848 758 669 0.000363366
-3 848 847 758 669 0.000363366
-1 747 315 0.000363511
-2 747 375 315 0.000363511
-2 769 747 315 0.000363511
-3 769 747 375 315 0.000363511
-1 428 38 0.0003638
-2 428 38 2 0.0003638
-2 428 63 38 0.0003638
-3 428 63 38 2 0.0003638
-1 762 98 0.000364039
-2 762 711 98 0.000364039
-1 762 722 0.000364039
-2 762 722 98 0.000364039
-2 762 722 711 0.000364039
-3 762 722 711 98 0.000364039
-1 451 7 0.000364224
-2 451 326 7 0.000364224
-2 453 451 7 0.000364224
-3 453 451 326 7 0.000364224
-2 907 821 692 0.000364485
-3 942 907 821 692 0.000364485
-1 890 843 0.000364525
-2 890 856 843 0.000364525
-2 890 889 843 0.000364525
-3 890 889 856 843 0.000364525
-2 602 432 19 0.0003658
-3 602 432 19 18 0.0003658
-1 424 130 0.000366428
-2 426 424 130 0.000366428
-2 556 424 130 0.000366428
-3 556 426 424 130 0.000366428
-2 755 239 49 0.00036647
-3 755 383 239 49 0.00036647
-2 685 474 19 0.000366512
-3 685 474 19 17 0.000366512
-1 634 65 0.000366701
-2 634 441 65 0.000366701
-2 634 613 65 0.000366701
-3 634 613 441 65 0.000366701
-0 985 0.000366726
-1 985 696 0.000366726
-1 985 698 0.000366726
-2 985 698 696 0.000366726
-1 985 963 0.000366726
-2 985 963 696 0.000366726
-2 985 963 698 0.000366726
-3 985 963 698 696 0.000366726
-1 781 537 0.000367197
-2 781 537 44 0.000367197
-2 849 781 537 0.000367197
-3 849 781 537 44 0.000367197
-1 520 449 0.000367674
-2 597 520 449 0.000367674
-2 598 520 449 0.000367674
-3 598 597 520 449 0.000367674
-1 435 268 0.000367723
-2 435 268 188 0.000367723
-2 435 292 268 0.000367723
-3 435 292 268 188 0.000367723
-2 862 802 597 0.000367809
-3 862 802 801 597 0.000367809
-1 682 617 0.000367971
-2 682 617 49 0.000367971
-2 682 617 343 0.000367971
-3 682 617 343 49 0.000367971
-1 670 507 0.000368159
-2 751 670 507 0.000368159
-2 765 670 507 0.000368159
-3 765 751 670 507 0.000368159
-2 808 634 613 0.000368204
-3 808 634 615 613 0.000368204
-1 981 756 0.000368221
-2 981 862 756 0.000368221
-1 981 863 0.000368221
-2 981 863 756 0.000368221
-2 981 863 862 0.000368221
-3 981 863 862 756 0.000368221
-1 508 248 0.000368606
-2 508 331 248 0.000368606
-2 508 423 248 0.000368606
-3 508 423 331 248 0.000368606
-1 907 463 0.000368786
-2 907 463 444 0.000368786
-2 907 846 463 0.000368786
-3 907 846 463 444 0.000368786
-1 654 140 0.000368832
-1 658 654 0.000368832
-2 658 654 140 0.000368832
-2 885 654 140 0.000368832
-2 885 658 654 0.000368832
-3 885 658 654 140 0.000368832
-1 953 810 0.000369282
-2 953 810 783 0.000369282
-1 974 953 0.000369282
-2 974 953 783 0.000369282
-2 974 953 810 0.000369282
-3 974 953 810 783 0.000369282
-2 816 341 335 0.000369318
-3 816 341 335 261 0.000369318
-1 587 401 0.000369421
-2 587 401 320 0.000369421
-2 587 405 401 0.000369421
-3 587 405 401 320 0.000369421
-2 520 502 449 0.000369563
-3 597 520 502 449 0.000369563
-1 208 24 0.00036977
-2 208 133 24 0.00036977
-2 241 208 24 0.00036977
-3 241 208 133 24 0.00036977
-2 907 463 443 0.000369873
-3 907 463 444 443 0.000369873
-2 585 521 362 0.00037029
-3 910 585 521 362 0.00037029
-1 494 440 0.000370382
-2 494 440 99 0.000370382
-2 494 440 328 0.000370382
-3 494 440 328 99 0.000370382
-1 722 210 0.000370526
-2 798 722 210 0.000370526
-2 822 722 210 0.000370526
-3 822 798 722 210 0.000370526
-1 525 142 0.000371
-2 525 145 142 0.000371
-2 525 379 142 0.000371
-3 525 379 145 142 0.000371
-1 318 182 0.000371295
-2 318 182 180 0.000371295
-2 318 183 182 0.000371295
-3 318 183 182 180 0.000371295
-2 525 143 142 0.000371967
-3 525 145 143 142 0.000371967
-2 566 565 346 0.000371988
-3 739 566 565 346 0.000371988
-1 829 107 0.000372213
-2 829 702 107 0.000372213
-2 898 829 107 0.000372213
-3 898 829 702 107 0.000372213
-1 920 654 0.000372308
-2 920 654 652 0.000372308
-1 964 920 0.000372308
-2 964 920 652 0.000372308
-2 964 920 654 0.000372308
-3 964 920 654 652 0.000372308
-0 986 0.000372406
-1 986 789 0.000372406
-1 986 790 0.000372406
-2 986 790 789 0.000372406
-1 986 791 0.000372406
-2 986 791 789 0.000372406
-2 986 791 790 0.000372406
-3 986 791 790 789 0.000372406
-1 721 510 0.000372624
-2 721 516 510 0.000372624
-2 721 656 510 0.000372624
-3 721 656 516 510 0.000372624
-1 883 428 0.000372674
-1 926 428 0.000372674
-2 926 883 428 0.000372674
-0 987 0.000372674
-1 987 428 0.000372674
-1 987 883 0.000372674
-2 987 883 428 0.000372674
-1 987 926 0.000372674
-2 987 926 428 0.000372674
-2 987 926 883 0.000372674
-3 987 926 883 428 0.000372674
-1 408 183 0.000372757
-2 411 408 183 0.000372757
-2 611 408 183 0.000372757
-3 611 411 408 183 0.000372757
-1 266 59 0.000373026
-2 266 61 59 0.000373026
-2 540 266 59 0.000373026
-3 540 266 61 59 0.000373026
-2 798 208 24 0.000373162
-3 798 241 208 24 0.000373162
-1 747 316 0.000373529
-2 747 316 315 0.000373529
-2 747 375 316 0.000373529
-3 747 375 316 315 0.000373529
-1 317 182 0.000373625
-2 317 182 13 0.000373625
-2 317 182 180 0.000373625
-3 317 182 180 13 0.000373625
-2 950 722 210 0.000374184
-3 950 822 722 210 0.000374184
-1 366 60 0.000374278
-2 366 62 60 0.000374278
-2 366 119 60 0.000374278
-3 366 119 62 60 0.000374278
-1 601 428 0.000375455
-2 601 431 428 0.000375455
-2 601 432 428 0.000375455
-3 601 432 431 428 0.000375455
-1 329 19 0.000375725
-2 329 19 17 0.000375725
-2 432 329 19 0.000375725
-3 432 329 19 17 0.000375725
-1 857 431 0.000376162
-2 857 757 431 0.000376162
-2 883 857 431 0.000376162
-3 883 857 757 431 0.000376162
-1 590 67 0.000376321
-2 590 205 67 0.000376321
-2 590 372 67 0.000376321
-3 590 372 205 67 0.000376321
-1 534 317 0.000376528
-2 534 317 33 0.000376528
-2 534 319 317 0.000376528
-3 534 319 317 33 0.000376528
-1 986 776 0.000376677
-2 986 790 776 0.000376677
-1 986 873 0.000376677
-2 986 873 776 0.000376677
-2 986 873 790 0.000376677
-3 986 873 790 776 0.000376677
-1 371 65 0.000376816
-2 371 369 65 0.000376816
-2 441 371 65 0.000376816
-3 441 371 369 65 0.000376816
-1 784 317 0.000377108
-1 784 319 0.000377108
-2 784 319 317 0.000377108
-2 784 354 317 0.000377108
-2 784 354 319 0.000377108
-3 784 354 319 317 0.000377108
-1 986 874 0.000377173
-2 986 874 776 0.000377173
-2 986 874 873 0.000377173
-3 986 874 873 776 0.000377173
-1 466 89 0.000377336
-2 466 157 89 0.000377336
-2 466 346 89 0.000377336
-3 466 346 157 89 0.000377336
-1 907 723 0.000377581
-2 907 723 110 0.000377581
-2 907 821 723 0.000377581
-3 907 821 723 110 0.000377581
-2 318 317 182 0.000377599
-3 318 317 182 180 0.000377599
-1 506 147 0.000377803
-2 506 148 147 0.000377803
-2 506 149 147 0.000377803
-3 506 149 148 147 0.000377803
-1 711 210 0.00037793
-2 711 272 210 0.00037793
-2 950 711 210 0.00037793
-3 950 711 272 210 0.00037793
-1 747 524 0.00037805
-2 747 524 210 0.00037805
-2 747 524 375 0.00037805
-3 747 524 375 210 0.00037805
-1 747 148 0.000378203
-2 747 210 148 0.000378203
-2 747 524 148 0.000378203
-3 747 524 210 148 0.000378203
-1 822 351 0.000378363
-2 822 351 244 0.000378363
-2 822 351 272 0.000378363
-3 822 351 272 244 0.000378363
-2 722 711 210 0.000378409
-3 950 722 711 210 0.000378409
-1 537 185 0.000378439
-2 537 185 45 0.000378439
-2 537 268 185 0.000378439
-3 537 268 185 45 0.000378439
-1 927 428 0.000378762
-2 927 883 428 0.000378762
-2 927 926 428 0.000378762
-3 927 926 883 428 0.000378762
-2 883 601 428 0.000378903
-2 927 601 428 0.000378903
-3 927 883 601 428 0.000378903
-2 883 431 428 0.000378952
-3 883 601 431 428 0.000378952
-2 878 844 515 0.000379255
-3 878 844 843 515 0.000379255
-1 365 60 0.000379481
-2 365 119 60 0.000379481
-2 366 365 60 0.000379481
-3 366 365 119 60 0.000379481
-2 711 314 210 0.000379686
-3 711 314 272 210 0.000379686
-1 712 574 0.000379875
-2 712 574 573 0.000379875
-2 712 639 574 0.000379875
-3 712 639 574 573 0.000379875
-1 948 248 0.000380046
-2 948 333 248 0.000380046
-2 948 492 248 0.000380046
-3 948 492 333 248 0.000380046
-1 717 68 0.000380215
-2 717 388 68 0.000380215
-2 717 658 68 0.000380215
-3 717 658 388 68 0.000380215
-2 907 723 692 0.000380376
-3 907 821 723 692 0.000380376
-2 902 751 670 0.000380436
-3 931 902 751 670 0.000380436
-1 660 34 0.000380494
-2 660 34 27 0.000380494
-2 660 163 34 0.000380494
-3 660 163 34 27 0.000380494
-1 912 373 0.000380625
-2 912 374 373 0.000380625
-2 912 769 373 0.000380625
-3 912 769 374 373 0.000380625
-1 474 374 0.000380726
-2 474 374 141 0.000380726
-2 685 474 374 0.000380726
-3 685 474 374 141 0.000380726
-1 974 184 0.000380821
-2 974 187 184 0.000380821
-2 974 783 184 0.000380821
-3 974 783 187 184 0.000380821
-2 816 786 341 0.000381145
-3 816 786 341 340 0.000381145
-2 491 360 303 0.000381686
-1 765 360 0.000381686
-2 765 360 303 0.000381686
-2 765 491 360 0.000381686
-3 765 491 360 303 0.000381686
-1 722 208 0.000382083
-2 722 210 208 0.000382083
-2 798 722 208 0.000382083
-3 798 722 210 208 0.000382083
-2 722 208 24 0.000382115
-3 798 722 208 24 0.000382115
-1 780 249 0.000382157
-2 780 249 238 0.000382157
-1 955 238 0.000382157
-2 955 249 238 0.000382157
-1 955 780 0.000382157
-2 955 780 238 0.000382157
-2 955 780 249 0.000382157
-3 955 780 249 238 0.000382157
-1 561 165 0.000382272
-2 561 559 165 0.000382272
-2 836 561 165 0.000382272
-3 836 561 559 165 0.000382272
-1 647 592 0.000382808
-2 647 592 591 0.000382808
-2 895 647 592 0.000382808
-3 895 647 592 591 0.000382808
-2 508 333 248 0.000383088
-3 508 333 331 248 0.000383088
-1 653 644 0.000383367
-2 653 644 582 0.000383367
-2 920 653 644 0.000383367
-3 920 653 644 582 0.000383367
-1 595 567 0.000383407
-2 595 567 465 0.000383407
-2 595 568 567 0.000383407
-3 595 568 567 465 0.000383407
-2 747 524 316 0.000383441
-3 747 524 375 316 0.000383441
-1 880 647 0.000383685
-2 880 866 647 0.000383685
-1 941 647 0.000383685
-1 941 866 0.000383685
-2 941 866 647 0.000383685
-2 941 880 647 0.000383685
-2 941 880 866 0.000383685
-3 941 880 866 647 0.000383685
-1 398 372 0.000383776
-2 398 372 67 0.000383776
-2 398 372 369 0.000383776
-3 398 372 369 67 0.000383776
-1 930 356 0.000384303
-2 930 362 356 0.000384303
-2 930 910 356 0.000384303
-3 930 910 362 356 0.000384303
-1 210 24 0.000385281
-2 210 208 24 0.000385281
-2 722 210 24 0.000385281
-3 722 210 208 24 0.000385281
-1 897 22 0.000385604
-2 897 23 22 0.000385604
-2 897 24 22 0.000385604
-3 897 24 23 22 0.000385604
-1 717 404 0.000385841
-2 717 404 68 0.000385841
-2 717 404 388 0.000385841
-3 717 404 388 68 0.000385841
-0 988 0.000386573
-1 988 756 0.000386573
-1 988 863 0.000386573
-2 988 863 756 0.000386573
-1 988 948 0.000386573
-2 988 948 756 0.000386573
-2 988 948 863 0.000386573
-3 988 948 863 756 0.000386573
-1 794 479 0.000387101
-2 794 479 478 0.000387101
-2 794 789 479 0.000387101
-3 794 789 479 478 0.000387101
-1 913 875 0.000387338
-1 913 876 0.000387338
-2 913 876 875 0.000387338
-1 913 877 0.000387338
-2 913 877 875 0.000387338
-2 913 877 876 0.000387338
-3 913 877 876 875 0.000387338
-2 907 692 463 0.000387397
-3 907 846 692 463 0.000387397
-1 920 717 0.000388454
-2 920 717 652 0.000388454
-2 920 717 653 0.000388454
-3 920 717 653 652 0.000388454
-1 375 138 0.000388585
-2 513 375 138 0.000388585
-2 514 375 138 0.000388585
-3 514 513 375 138 0.000388585
-1 907 704 0.00038866
-2 907 704 683 0.00038866
-2 907 881 704 0.00038866
-3 907 881 704 683 0.00038866
-1 889 862 0.000389491
-2 889 872 862 0.000389491
-2 889 878 862 0.000389491
-2 889 878 872 0.000389491
-3 889 878 872 862 0.000389491
-1 658 314 0.000389519
-2 658 413 314 0.000389519
-2 658 470 314 0.000389519
-3 658 470 413 314 0.000389519
-2 711 658 314 0.000389632
-3 711 658 413 314 0.000389632
-1 581 77 0.000389699
-2 581 77 76 0.000389699
-2 581 573 77 0.000389699
-3 581 573 77 76 0.000389699
-2 686 398 372 0.000390326
-3 686 398 372 369 0.000390326
-1 289 244 0.000390374
-2 352 289 244 0.000390374
-2 822 289 244 0.000390374
-3 822 352 289 244 0.000390374
-2 637 408 183 0.000390394
-3 637 611 408 183 0.000390394
-1 210 146 0.000391057
-2 210 159 146 0.000391057
-2 211 210 146 0.000391057
-3 211 210 159 146 0.000391057
-2 266 60 59 0.000391673
-3 266 61 60 59 0.000391673
-1 722 658 0.000391892
-2 722 711 658 0.000391892
-2 762 722 658 0.000391892
-3 762 722 711 658 0.000391892
-2 616 563 203 0.000392672
-3 616 614 563 203 0.000392672
-1 927 432 0.000392796
-2 927 432 428 0.000392796
-2 927 601 432 0.000392796
-3 927 601 432 428 0.000392796
-1 766 72 0.000393101
-2 766 491 72 0.000393101
-2 766 507 72 0.000393101
-3 766 507 491 72 0.000393101
-0 989 0.000393481
-1 989 939 0.000393481
-1 989 954 0.000393481
-2 989 954 939 0.000393481
-1 989 973 0.000393481
-2 989 973 939 0.000393481
-2 989 973 954 0.000393481
-3 989 973 954 939 0.000393481
-2 909 529 339 0.000393633
-3 909 893 529 339 0.000393633
-1 730 95 0.000393691
-2 730 523 95 0.000393691
-2 929 730 95 0.000393691
-3 929 730 523 95 0.000393691
-2 948 508 248 0.000393926
-3 948 508 333 248 0.000393926
-1 872 597 0.000394018
-2 872 691 597 0.000394018
-2 889 872 597 0.000394018
-3 889 872 691 597 0.000394018
-1 760 669 0.000394055
-2 760 669 460 0.000394055
-2 820 760 669 0.000394055
-3 820 760 669 460 0.000394055
-1 417 216 0.000394192
-2 417 218 216 0.000394192
-2 625 417 216 0.000394192
-3 625 417 218 216 0.000394192
-2 595 567 472 0.000394468
-3 595 568 567 472 0.000394468
-1 834 713 0.000394952
-2 834 715 713 0.000394952
-2 835 834 713 0.000394952
-3 835 834 715 713 0.000394952
-1 686 67 0.000395054
-2 686 372 67 0.000395054
-2 686 398 67 0.000395054
-3 686 398 372 67 0.000395054
-1 814 497 0.000395168
-2 814 497 411 0.000395168
-2 814 499 497 0.000395168
-3 814 499 497 411 0.000395168
-1 784 534 0.000395262
-2 784 534 317 0.000395262
-2 784 534 319 0.000395262
-3 784 534 319 317 0.000395262
-1 428 308 0.000395349
-2 428 308 176 0.000395349
-2 428 308 225 0.000395349
-3 428 308 225 176 0.000395349
-2 660 657 420 0.000395934
-3 660 657 623 420 0.000395934
-1 753 28 0.000396996
-2 753 752 28 0.000396996
-2 952 753 28 0.000396996
-3 952 753 752 28 0.000396996
-1 853 431 0.000397852
-2 853 757 431 0.000397852
-2 857 853 431 0.000397852
-3 857 853 757 431 0.000397852
-2 853 769 431 0.000397896
-3 853 769 757 431 0.000397896
-2 523 521 95 0.000399381
-3 738 523 521 95 0.000399381
-2 747 316 148 0.000399741
-3 747 524 316 148 0.000399741
-1 692 90 0.000401415
-2 723 692 90 0.000401415
-2 772 692 90 0.000401415
-3 772 723 692 90 0.000401415
-1 874 635 0.000401441
-2 874 791 635 0.000401441
-2 915 874 635 0.000401441
-3 915 874 791 635 0.000401441
-2 872 862 597 0.000401749
-2 872 862 691 0.000401749
-3 872 862 691 597 0.000401749
-1 894 699 0.000403759
-2 894 699 416 0.000403759
-2 894 701 699 0.000403759
-3 894 701 699 416 0.000403759
-1 508 492 0.000404009
-2 508 492 248 0.000404009
-2 948 508 492 0.000404009
-3 948 508 492 248 0.000404009
-2 829 552 107 0.000404271
-3 829 702 552 107 0.000404271
-1 534 321 0.000404304
-2 534 454 321 0.000404304
-1 974 534 0.000404304
-2 974 534 321 0.000404304
-2 974 534 454 0.000404304
-3 974 534 454 321 0.000404304
-2 692 90 73 0.000405202
-3 723 692 90 73 0.000405202
-1 657 34 0.000405207
-2 657 163 34 0.000405207
-2 660 657 34 0.000405207
-3 660 657 163 34 0.000405207
-1 584 581 0.0004053
-2 584 581 77 0.0004053
-2 584 581 573 0.0004053
-3 584 581 573 77 0.0004053
-1 647 589 0.000405342
-2 647 591 589 0.000405342
-2 866 647 589 0.000405342
-3 866 647 591 589 0.000405342
-1 869 837 0.000405795
-2 869 838 837 0.000405795
-0 990 0.000405795
-1 990 837 0.000405795
-1 990 838 0.000405795
-2 990 838 837 0.000405795
-1 990 869 0.000405795
-2 990 869 837 0.000405795
-2 990 869 838 0.000405795
-3 990 869 838 837 0.000405795
-2 657 510 34 0.000405941
-3 657 510 163 34 0.000405941
-1 973 840 0.000405972
-2 973 841 840 0.000405972
-1 973 887 0.000405972
-2 973 887 840 0.000405972
-2 973 887 841 0.000405972
-3 973 887 841 840 0.000405972
-1 634 371 0.000406265
-2 634 371 65 0.000406265
-2 634 441 371 0.000406265
-3 634 441 371 65 0.000406265
-1 469 100 0.000406521
-2 469 389 100 0.000406521
-2 474 469 100 0.000406521
-3 474 469 389 100 0.000406521
-1 859 643 0.000406556
-1 859 645 0.000406556
-2 859 645 643 0.000406556
-2 865 859 643 0.000406556
-2 865 859 645 0.000406556
-3 865 859 645 643 0.000406556
-1 984 676 0.000407294
-1 984 677 0.000407294
-2 984 677 676 0.000407294
-1 984 959 0.000407294
-2 984 959 676 0.000407294
-2 984 959 677 0.000407294
-3 984 959 677 676 0.000407294
-1 850 437 0.000407334
-2 868 850 437 0.000407334
-2 869 850 437 0.000407334
-3 869 868 850 437 0.000407334
-1 198 94 0.00040758
-2 633 198 94 0.00040758
-2 737 198 94 0.00040758
-2 737 633 198 0.00040758
-3 737 633 198 94 0.00040758
-1 964 864 0.000407947
-2 964 864 654 0.000407947
-2 964 884 864 0.000407947
-3 964 884 864 654 0.000407947
-1 874 790 0.000408117
-2 874 790 776 0.000408117
-2 986 874 790 0.000408117
-3 986 874 790 776 0.000408117
-1 984 515 0.000408198
-2 984 676 515 0.000408198
-2 984 677 515 0.000408198
-3 984 677 676 515 0.000408198
-2 644 643 603 0.000408569
-3 923 644 643 603 0.000408569
-2 634 371 343 0.00040928
-3 634 441 371 343 0.00040928
-1 902 507 0.000409651
-2 902 750 507 0.000409651
-2 902 751 507 0.000409651
-3 902 751 750 507 0.000409651
-1 379 251 0.000409862
-2 379 251 142 0.000409862
-2 379 251 250 0.000409862
-3 379 251 250 142 0.000409862
-1 428 31 0.000410266
-2 428 176 31 0.000410266
-2 428 308 31 0.000410266
-3 428 308 176 31 0.000410266
-2 428 63 31 0.000410427
-3 428 176 63 31 0.000410427
-1 499 355 0.000410435
-2 499 488 355 0.000410435
-2 733 499 355 0.000410435
-3 733 499 488 355 0.000410435
-1 782 268 0.000410542
-2 782 268 44 0.000410542
-2 782 268 217 0.000410542
-3 782 268 217 44 0.000410542
-1 747 506 0.000410568
-2 747 506 315 0.000410568
-2 747 506 316 0.000410568
-3 747 506 316 315 0.000410568
-0 991 0.000410976
-1 991 837 0.000410976
-1 991 838 0.000410976
-2 991 838 837 0.000410976
-1 991 990 0.000410976
-2 991 990 837 0.000410976
-2 991 990 838 0.000410976
-3 991 990 838 837 0.000410976
-1 959 515 0.000411026
-2 959 677 515 0.000411026
-2 984 959 515 0.000411026
-3 984 959 677 515 0.000411026
-1 584 216 0.000411163
-2 584 218 216 0.000411163
-2 584 417 216 0.000411163
-3 584 417 218 216 0.000411163
-1 918 656 0.000411184
-2 918 656 422 0.000411184
-2 918 720 656 0.000411184
-3 918 720 656 422 0.000411184
-2 973 954 840 0.000411598
-2 973 954 887 0.000411598
-3 973 954 887 840 0.000411598
-1 907 882 0.000412306
-2 907 882 704 0.000412306
-2 907 882 881 0.000412306
-3 907 882 881 704 0.000412306
-1 902 466 0.000412646
-2 902 466 452 0.000412646
-2 902 785 466 0.000412646
-3 902 785 466 452 0.000412646
-2 199 198 94 0.000413366
-3 633 199 198 94 0.000413366
-1 930 707 0.000413947
-2 930 707 78 0.000413947
-2 930 707 706 0.000413947
-3 930 707 706 78 0.000413947
-1 819 279 0.000414627
-2 819 666 279 0.000414627
-2 819 809 279 0.000414627
-3 819 809 666 279 0.000414627
-2 506 290 170 0.000414634
-3 506 505 290 170 0.000414634
-1 577 354 0.000414727
-2 577 354 318 0.000414727
-2 577 355 354 0.000414727
-3 577 355 354 318 0.000414727
-1 988 981 0.000415047
-2 988 981 756 0.000415047
-2 988 981 863 0.000415047
-3 988 981 863 756 0.000415047
-1 911 713 0.00041591
-2 911 715 713 0.00041591
-2 911 834 713 0.00041591
-2 911 834 715 0.00041591
-3 911 834 715 713 0.00041591
-2 686 590 67 0.000415937
-3 686 590 372 67 0.000415937
-2 819 667 279 0.000415951
-3 819 667 666 279 0.000415951
-1 411 318 0.000416373
-2 411 409 318 0.000416373
-2 814 411 318 0.000416373
-2 814 411 409 0.000416373
-3 814 411 409 318 0.000416373
-1 811 572 0.000416653
-2 811 585 572 0.000416653
-2 910 811 572 0.000416653
-3 910 811 585 572 0.000416653
-1 898 552 0.000416728
-2 898 829 552 0.000416728
-2 943 898 552 0.000416728
-3 943 898 829 552 0.000416728
-2 577 354 319 0.000417199
-3 577 354 319 318 0.000417199
-1 988 508 0.000417494
-2 988 756 508 0.000417494
-2 988 948 508 0.000417494
-3 988 948 756 508 0.000417494
-1 374 138 0.000417991
-2 374 141 138 0.000417991
-2 514 374 138 0.000417991
-3 514 374 141 138 0.000417991
-1 722 314 0.000417998
-2 722 314 210 0.000417998
-2 722 711 314 0.000417998
-3 722 711 314 210 0.000417998
-2 902 670 507 0.00041801
-3 902 751 670 507 0.00041801
-2 650 625 417 0.000418879
-3 651 650 625 417 0.000418879
-1 474 101 0.000418933
-2 474 101 70 0.000418933
-2 474 101 100 0.000418933
-3 474 101 100 70 0.000418933
-2 576 401 58 0.000419239
-3 576 401 58 57 0.000419239
-1 170 149 0.000419388
-2 290 170 149 0.000419388
-2 506 170 149 0.000419388
-3 506 290 170 149 0.000419388
-1 824 782 0.00041948
-2 824 782 781 0.00041948
-2 824 783 782 0.00041948
-3 824 783 782 781 0.00041948
-2 805 715 714 0.000419725
-1 911 714 0.000419725
-2 911 715 714 0.000419725
-2 911 805 714 0.000419725
-3 911 805 715 714 0.000419725
-1 985 263 0.00042005
-2 985 696 263 0.00042005
-2 985 963 263 0.00042005
-3 985 963 696 263 0.00042005
-1 838 678 0.000420129
-2 838 678 421 0.000420129
-1 850 678 0.000420129
-2 850 678 421 0.000420129
-2 850 838 678 0.000420129
-3 850 838 678 421 0.000420129
-1 138 46 0.000420254
-1 138 47 0.000420254
-2 138 47 46 0.000420254
-2 514 138 46 0.000420254
-2 514 138 47 0.000420254
-3 514 138 47 46 0.000420254
-2 584 304 216 0.000420844
-3 584 304 218 216 0.000420844
-1 921 547 0.000420915
-2 921 547 482 0.000420915
-1 925 921 0.000420915
-2 925 921 482 0.000420915
-2 925 921 547 0.000420915
-3 925 921 547 482 0.000420915
-1 447 166 0.000420926
-2 598 447 166 0.000420926
-1 975 447 0.000420926
-2 975 447 166 0.000420926
-2 975 598 447 0.000420926
-3 975 598 447 166 0.000420926
-2 902 750 466 0.000422101
-2 902 785 750 0.000422101
-3 902 785 750 466 0.000422101
-1 807 668 0.000422262
-1 903 668 0.000422262
-1 903 807 0.000422262
-2 903 807 668 0.000422262
-1 934 807 0.000422262
-2 934 807 668 0.000422262
-1 934 903 0.000422262
-2 934 903 668 0.000422262
-2 934 903 807 0.000422262
-3 934 903 807 668 0.000422262
-2 469 389 328 0.000422382
-3 470 469 389 328 0.000422382
-1 812 721 0.000422499
-2 812 721 516 0.000422499
-2 812 721 693 0.000422499
-3 812 721 693 516 0.000422499
-1 209 24 0.000423097
-2 209 208 24 0.000423097
-2 210 209 24 0.000423097
-3 210 209 208 24 0.000423097
-1 613 371 0.000423313
-2 613 371 65 0.000423313
-2 613 371 369 0.000423313
-3 613 371 369 65 0.000423313
-1 653 580 0.000424223
-2 653 581 580 0.000424223
-2 653 605 580 0.000424223
-3 653 605 581 580 0.000424223
-2 706 653 580 0.000424329
-3 706 653 581 580 0.000424329
-2 814 499 355 0.00042435
-2 814 499 488 0.00042435
-3 814 499 488 355 0.00042435
-2 469 329 19 0.000424444
-3 469 329 19 17 0.000424444
-1 487 354 0.000424482
-2 487 355 354 0.000424482
-2 577 487 354 0.000424482
-3 577 487 355 354 0.000424482
-1 845 597 0.000424557
-2 845 597 107 0.000424557
-2 855 845 597 0.000424557
-3 855 845 597 107 0.000424557
-2 374 138 46 0.000424562
-3 514 374 138 46 0.000424562
-1 941 347 0.000424923
-2 941 636 347 0.000424923
-2 941 836 347 0.000424923
-3 941 836 636 347 0.000424923
-2 898 552 107 0.000425044
-3 898 829 552 107 0.000425044
-2 634 613 371 0.000425306
-3 634 613 371 65 0.000425306
-2 209 133 24 0.000425427
-3 209 208 133 24 0.000425427
-1 794 527 0.000426202
-2 794 789 527 0.000426202
-2 794 792 527 0.000426202
-3 794 792 789 527 0.000426202
-1 677 516 0.000426363
-2 677 517 516 0.000426363
-2 677 518 516 0.000426363
-3 677 518 517 516 0.000426363
-1 546 115 0.000426573
-2 546 115 86 0.000426573
-2 546 471 115 0.000426573
-3 546 471 115 86 0.000426573
-1 701 200 0.000426852
-2 701 639 200 0.000426852
-2 894 701 200 0.000426852
-3 894 701 639 200 0.000426852
-1 495 407 0.000427348
-2 495 407 195 0.000427348
-2 495 407 381 0.000427348
-3 495 407 381 195 0.000427348
-1 304 45 0.000427449
-1 304 47 0.000427449
-2 304 47 45 0.000427449
-2 304 185 45 0.000427449
-2 304 185 47 0.000427449
-3 304 185 47 45 0.000427449
-2 934 497 410 0.00042765
-3 934 498 497 410 0.00042765
-1 367 210 0.000427902
-2 367 314 210 0.000427902
-2 375 367 210 0.000427902
-3 375 367 314 210 0.000427902
-1 706 605 0.000428082
-2 706 605 580 0.000428082
-2 706 653 605 0.000428082
-3 706 653 605 580 0.000428082
-2 927 602 432 0.000428295
-3 927 602 601 432 0.000428295
-1 768 315 0.000428744
-2 768 747 315 0.000428744
-2 769 768 315 0.000428744
-3 769 768 747 315 0.000428744
-2 941 866 589 0.000429116
-3 941 880 866 589 0.000429116
-1 941 165 0.000429828
-2 941 836 165 0.000429828
-1 975 941 0.000429828
-2 975 941 165 0.000429828
-2 975 941 836 0.000429828
-3 975 941 836 165 0.000429828
-1 618 236 0.000430841
-2 755 618 236 0.000430841
-2 787 618 236 0.000430841
-3 787 755 618 236 0.000430841
-1 896 371 0.000431412
-2 896 371 343 0.000431412
-2 896 592 371 0.000431412
-3 896 592 371 343 0.000431412
-2 941 561 165 0.000431634
-3 941 836 561 165 0.000431634
-2 941 647 589 0.000431959
-3 941 866 647 589 0.000431959
-1 799 382 0.000432291
-2 799 382 237 0.000432291
-2 799 383 382 0.000432291
-3 799 383 382 237 0.000432291
-1 657 27 0.000432422
-2 657 34 27 0.000432422
-2 660 657 27 0.000432422
-3 660 657 34 27 0.000432422
-1 324 303 0.000432431
-2 324 303 300 0.000432431
-2 324 303 301 0.000432431
-3 324 303 301 300 0.000432431
-1 648 446 0.000433139
-2 648 448 446 0.000433139
-2 649 648 446 0.000433139
-3 649 648 448 446 0.000433139
-1 943 461 0.000433248
-2 943 552 461 0.000433248
-2 943 723 461 0.000433248
-3 943 723 552 461 0.000433248
-1 768 506 0.000433494
-2 768 506 315 0.000433494
-2 768 747 506 0.000433494
-3 768 747 506 315 0.000433494
-1 233 206 0.000433594
-2 233 206 158 0.000433594
-2 675 233 206 0.000433594
-3 675 233 206 158 0.000433594
-1 966 825 0.000433664
-1 966 875 0.000433664
-2 966 875 825 0.000433664
-1 966 877 0.000433664
-2 966 877 825 0.000433664
-2 966 877 875 0.000433664
-3 966 877 875 825 0.000433664
-1 508 247 0.000433757
-2 508 248 247 0.000433757
-2 508 423 247 0.000433757
-3 508 423 248 247 0.000433757
-1 375 140 0.000434063
-2 375 140 138 0.000434063
-2 513 375 140 0.000434063
-3 513 375 140 138 0.000434063
-2 576 319 58 0.000434249
-3 576 319 58 14 0.000434249
-2 752 660 25 0.000434339
-3 752 660 473 25 0.000434339
-1 718 94 0.000434361
-2 718 198 94 0.000434361
-2 718 199 94 0.000434361
-3 718 199 198 94 0.000434361
-1 781 268 0.000434615
-2 781 268 44 0.000434615
-2 782 781 268 0.000434615
-3 782 781 268 44 0.000434615
-2 537 291 211 0.00043544
-3 537 291 211 209 0.00043544
-1 428 227 0.000435458
-2 428 227 225 0.000435458
-2 431 428 227 0.000435458
-3 431 428 227 225 0.000435458
-1 928 428 0.000435651
-2 928 926 428 0.000435651
-2 928 927 428 0.000435651
-3 928 927 926 428 0.000435651
-1 178 167 0.000436656
-2 178 167 166 0.000436656
-2 252 178 167 0.000436656
-3 252 178 167 166 0.000436656
-1 650 133 0.000436727
-2 650 133 24 0.000436727
-2 650 625 133 0.000436727
-3 650 625 133 24 0.000436727
-1 538 490 0.000437626
-2 538 490 136 0.000437626
-2 539 538 490 0.000437626
-3 539 538 490 136 0.000437626
-2 722 658 314 0.000437913
-3 722 711 658 314 0.000437913
-2 777 718 94 0.000438097
-3 777 718 199 94 0.000438097
-1 926 908 0.000438926
-1 928 908 0.000438926
-2 928 926 908 0.000438926
-1 971 926 0.000438926
-2 971 926 908 0.000438926
-1 971 928 0.000438926
-2 971 928 908 0.000438926
-2 971 928 926 0.000438926
-3 971 928 926 908 0.000438926
-1 658 367 0.000439
-2 658 367 314 0.000439
-2 658 470 367 0.000439
-3 658 470 367 314 0.000439
-1 654 245 0.00044019
-2 658 654 245 0.00044019
-2 885 654 245 0.00044019
-3 885 658 654 245 0.00044019
-2 552 178 167 0.000440384
-3 552 252 178 167 0.000440384
-1 768 431 0.000440706
-2 769 768 431 0.000440706
-2 853 768 431 0.000440706
-3 853 769 768 431 0.000440706
-2 304 186 47 0.000441184
-3 304 186 185 47 0.000441184
-2 889 862 597 0.000441676
-3 889 872 862 597 0.000441676
-2 920 717 654 0.000441881
-3 920 717 654 652 0.000441881
-1 574 200 0.000443
-2 585 574 200 0.000443
-2 639 574 200 0.000443
-3 639 585 574 200 0.000443
-2 781 537 268 0.000443208
-3 781 537 268 44 0.000443208
-1 986 635 0.000443483
-2 986 791 635 0.000443483
-2 986 874 635 0.000443483
-2 986 874 791 0.000443483
-3 986 874 791 635 0.000443483
-2 469 328 100 0.000443751
-3 469 389 328 100 0.000443751
-1 574 521 0.000444086
-2 574 521 362 0.000444086
-2 585 574 521 0.000444086
-3 585 574 521 362 0.000444086
-2 375 138 47 0.000444735
-3 514 375 138 47 0.000444735
-1 494 380 0.000445549
-2 494 381 380 0.000445549
-1 495 380 0.000445549
-2 495 381 380 0.000445549
-2 495 494 380 0.000445549
-3 495 494 381 380 0.000445549
-1 985 677 0.000445795
-1 985 959 0.000445795
-2 985 959 677 0.000445795
-1 985 960 0.000445795
-2 985 960 677 0.000445795
-2 985 960 959 0.000445795
-3 985 960 959 677 0.000445795
-1 559 527 0.000446367
-2 559 527 525 0.000446367
-2 559 528 527 0.000446367
-3 559 528 527 525 0.000446367
-1 537 304 0.000446396
-2 537 304 185 0.000446396
-2 537 304 268 0.000446396
-3 537 304 268 185 0.000446396
-1 952 551 0.00044645
-2 952 659 551 0.00044645
-2 952 860 551 0.00044645
-3 952 860 659 551 0.00044645
-1 650 216 0.000446673
-2 650 216 133 0.000446673
-2 650 625 216 0.000446673
-3 650 625 216 133 0.000446673
-1 546 302 0.000446964
-2 546 302 300 0.000446964
-2 546 302 301 0.000446964
-3 546 302 301 300 0.000446964
-1 896 599 0.00044738
-2 896 599 371 0.00044738
-2 896 599 592 0.00044738
-3 896 599 592 371 0.00044738
-1 896 647 0.000447604
-2 896 647 592 0.000447604
-2 896 895 647 0.000447604
-3 896 895 647 592 0.000447604
-1 561 144 0.000447913
-2 561 525 144 0.000447913
-2 589 561 144 0.000447913
-3 589 561 525 144 0.000447913
-1 723 600 0.000447953
-2 723 600 458 0.000447953
-2 723 692 600 0.000447953
-3 723 692 600 458 0.000447953
-1 686 205 0.000448334
-2 686 205 67 0.000448334
-2 686 590 205 0.000448334
-3 686 590 205 67 0.000448334
-1 580 362 0.000448485
-2 580 364 362 0.000448485
-2 930 364 362 0.000448485
-2 930 580 362 0.000448485
-3 930 580 364 362 0.000448485
-1 210 147 0.00044865
-2 210 148 147 0.00044865
-2 210 159 147 0.00044865
-3 210 159 148 147 0.00044865
-1 749 404 0.000448695
-2 749 404 388 0.000448695
-2 749 717 404 0.000448695
-3 749 717 404 388 0.000448695
-1 618 239 0.000449277
-2 618 239 49 0.000449277
-2 755 618 239 0.000449277
-3 755 618 239 49 0.000449277
-2 618 239 236 0.000449325
-3 755 618 239 236 0.000449325
-2 660 422 420 0.000449516
-3 660 657 422 420 0.000449516
-2 667 497 279 0.000449813
-3 667 497 430 279 0.000449813
-2 485 351 194 0.000451368
-3 485 351 297 194 0.000451368
-1 658 513 0.00045187
-2 658 513 367 0.00045187
-2 658 513 470 0.00045187
-3 658 513 470 367 0.00045187
-1 876 835 0.00045343
-1 877 835 0.00045343
-2 877 876 835 0.00045343
-2 913 876 835 0.00045343
-2 913 877 835 0.00045343
-3 913 877 876 835 0.00045343
-1 923 653 0.000453533
-2 923 653 582 0.000453533
-2 923 653 644 0.000453533
-3 923 653 644 582 0.000453533
-1 911 716 0.000453542
-2 911 716 713 0.000453542
-2 911 716 715 0.000453542
-3 911 716 715 713 0.000453542
-1 933 808 0.000453926
-2 933 808 613 0.000453926
-2 933 808 807 0.000453926
-3 933 808 807 613 0.000453926
-1 658 210 0.000454191
-2 658 314 210 0.000454191
-2 722 658 210 0.000454191
-3 722 658 314 210 0.000454191
-1 985 879 0.000454763
-2 985 879 696 0.000454763
-0 992 0.000454763
-1 992 696 0.000454763
-1 992 879 0.000454763
-2 992 879 696 0.000454763
-1 992 985 0.000454763
-2 992 985 696 0.000454763
-2 992 985 879 0.000454763
-3 992 985 879 696 0.000454763
-1 648 589 0.000454804
-2 648 647 589 0.000454804
-1 941 648 0.000454804
-2 941 648 589 0.000454804
-2 941 648 647 0.000454804
-3 941 648 647 589 0.000454804
-1 647 446 0.000454958
-2 647 448 446 0.000454958
-2 648 647 446 0.000454958
-3 648 647 448 446 0.000454958
-1 987 857 0.000455603
-1 987 983 0.000455603
-2 987 983 857 0.000455603
-0 993 0.000455603
-1 993 857 0.000455603
-1 993 983 0.000455603
-2 993 983 857 0.000455603
-1 993 987 0.000455603
-2 993 987 857 0.000455603
-2 993 987 983 0.000455603
-3 993 987 983 857 0.000455603
-1 654 68 0.000455619
-2 654 245 68 0.000455619
-2 658 654 68 0.000455619
-3 658 654 245 68 0.000455619
-1 559 173 0.000455991
-2 566 559 173 0.000455991
-2 785 559 173 0.000455991
-3 785 566 559 173 0.000455991
-2 769 767 373 0.0004562
-3 769 767 747 373 0.0004562
-1 906 743 0.000456384
-2 906 743 443 0.000456384
-2 906 743 444 0.000456384
-3 906 743 444 443 0.000456384
-2 210 147 146 0.000456401
-3 210 159 147 146 0.000456401
-2 658 513 140 0.000456536
-3 658 513 470 140 0.000456536
-1 730 7 0.000456754
-2 730 451 7 0.000456754
-2 730 453 7 0.000456754
-3 730 453 451 7 0.000456754
-1 723 463 0.00045701
-2 723 600 463 0.00045701
-2 723 692 463 0.00045701
-3 723 692 600 463 0.00045701
-1 831 110 0.000457012
-1 831 111 0.000457012
-2 831 111 110 0.000457012
-1 943 111 0.000457012
-2 943 111 110 0.000457012
-2 943 831 110 0.000457012
-2 943 831 111 0.000457012
-3 943 831 111 110 0.000457012
-1 979 507 0.000457494
-1 979 670 0.000457494
-2 979 670 507 0.000457494
-2 979 765 507 0.000457494
-2 979 765 670 0.000457494
-3 979 765 670 507 0.000457494
-1 989 841 0.000457573
-1 989 972 0.000457573
-2 989 972 841 0.000457573
-2 989 973 841 0.000457573
-2 989 973 972 0.000457573
-3 989 973 972 841 0.000457573
-2 650 417 216 0.000457584
-3 650 625 417 216 0.000457584
-1 832 597 0.00045783
-2 855 832 597 0.00045783
-2 856 832 597 0.00045783
-3 856 855 832 597 0.00045783
-2 559 174 173 0.000457988
-3 566 559 174 173 0.000457988
-1 905 647 0.000458089
-2 905 647 446 0.000458089
-2 905 647 448 0.000458089
-3 905 647 448 446 0.000458089
-1 717 76 0.00045823
-2 717 582 76 0.00045823
-2 773 717 76 0.00045823
-3 773 717 582 76 0.00045823
-1 631 499 0.00045836
-2 631 499 280 0.00045836
-2 733 631 499 0.00045836
-3 733 631 499 280 0.00045836
-1 830 597 0.000458468
-1 845 830 0.000458468
-2 845 830 597 0.000458468
-2 855 830 597 0.000458468
-2 855 845 830 0.000458468
-3 855 845 830 597 0.000458468
-1 463 458 0.000458835
-2 600 463 458 0.000458835
-2 723 463 458 0.000458835
-3 723 600 463 458 0.000458835
-2 658 367 210 0.000458853
-3 658 367 314 210 0.000458853
-1 750 346 0.000458972
-2 750 467 346 0.000458972
-2 750 565 346 0.000458972
-3 750 565 467 346 0.000458972
-2 537 304 45 0.000459106
-3 537 304 185 45 0.000459106
-1 954 937 0.000459795
-2 954 937 936 0.000459795
-2 954 939 937 0.000459795
-3 954 939 937 936 0.000459795
-2 768 431 315 0.000459878
-3 769 768 431 315 0.000459878
-1 582 77 0.000460384
-2 582 77 76 0.000460384
-2 582 581 77 0.000460384
-3 582 581 77 76 0.000460384
-2 487 393 354 0.000460618
-3 487 393 355 354 0.000460618
-1 977 725 0.000460897
-2 977 725 549 0.000460897
-2 977 976 725 0.000460897
-3 977 976 725 549 0.000460897
-1 799 239 0.000460966
-2 799 239 237 0.000460966
-2 799 239 238 0.000460966
-3 799 239 238 237 0.000460966
-1 809 481 0.00046138
-2 809 481 279 0.00046138
-1 888 809 0.00046138
-2 888 809 279 0.00046138
-2 888 809 481 0.00046138
-3 888 809 481 279 0.00046138
-2 810 460 215 0.000461445
-3 810 460 305 215 0.000461445
-1 585 201 0.000461501
-2 585 201 200 0.000461501
-2 894 201 200 0.000461501
-2 894 585 201 0.000461501
-3 894 585 201 200 0.000461501
-1 897 762 0.000461719
-2 897 762 98 0.000461719
-2 897 762 722 0.000461719
-3 897 762 722 98 0.000461719
-1 906 735 0.000461995
-2 906 735 443 0.000461995
-2 906 743 735 0.000461995
-3 906 743 735 443 0.000461995
-1 958 911 0.000462593
-2 958 911 805 0.000462593
-2 958 954 911 0.000462593
-3 958 954 911 805 0.000462593
-1 817 426 0.000462714
-2 817 426 425 0.000462714
-2 817 427 425 0.000462714
-2 817 427 426 0.000462714
-3 817 427 426 425 0.000462714
-1 529 439 0.000462895
-1 530 439 0.000462895
-2 530 529 439 0.000462895
-2 554 529 439 0.000462895
-1 554 530 0.000462895
-2 554 530 439 0.000462895
-2 554 530 529 0.000462895
-3 554 530 529 439 0.000462895
-1 789 93 0.000463058
-1 789 276 0.000463058
-2 789 276 93 0.000463058
-1 794 93 0.000463058
-1 794 276 0.000463058
-2 794 276 93 0.000463058
-2 794 789 93 0.000463058
-2 794 789 276 0.000463058
-3 794 789 276 93 0.000463058
-1 772 73 0.000463295
-2 772 90 73 0.000463295
-2 772 692 73 0.000463295
-3 772 692 90 73 0.000463295
-2 907 683 463 0.000463494
-3 907 683 463 443 0.000463494
-1 950 485 0.00046399
-2 950 485 270 0.00046399
-2 950 485 272 0.00046399
-3 950 485 272 270 0.00046399
-2 631 499 355 0.000464068
-3 733 631 499 355 0.000464068
-2 411 318 183 0.000464215
-3 411 409 318 183 0.000464215
-1 216 24 0.000464383
-2 216 133 24 0.000464383
-2 650 216 24 0.000464383
-3 650 216 133 24 0.000464383
-1 440 432 0.000464552
-2 440 432 328 0.000464552
-2 494 440 432 0.000464552
-3 494 440 432 328 0.000464552
-2 911 716 714 0.00046457
-3 911 716 715 714 0.00046457
-2 750 566 346 0.000465388
-3 750 566 565 346 0.000465388
-1 991 839 0.000465482
-2 991 839 837 0.000465482
-2 991 839 838 0.000465482
-3 991 839 838 837 0.000465482
-1 513 210 0.000465699
-2 513 367 210 0.000465699
-2 513 375 210 0.000465699
-3 513 375 367 210 0.000465699
-1 827 425 0.000465993
-1 921 425 0.000465993
-2 921 827 425 0.000465993
-1 925 827 0.000465993
-2 925 827 425 0.000465993
-2 925 921 425 0.000465993
-2 925 921 827 0.000465993
-3 925 921 827 425 0.000465993
-2 507 175 72 0.000466324
-3 507 175 173 72 0.000466324
-1 711 578 0.000466417
-2 711 578 391 0.000466417
-2 711 578 493 0.000466417
-3 711 578 493 391 0.000466417
-1 90 72 0.000466794
-2 90 73 72 0.000466794
-2 175 90 72 0.000466794
-3 175 90 73 72 0.000466794
-1 582 573 0.000467105
-2 582 581 573 0.000467105
-1 584 582 0.000467105
-2 584 582 573 0.000467105
-2 584 582 581 0.000467105
-3 584 582 581 573 0.000467105
-2 765 324 303 0.000467552
-1 859 303 0.000467552
-2 859 324 303 0.000467552
-2 859 765 303 0.000467552
-3 859 765 324 303 0.000467552
-1 988 492 0.000467612
-1 988 788 0.000467612
-2 988 788 492 0.000467612
-2 988 948 492 0.000467612
-2 988 948 788 0.000467612
-3 988 948 788 492 0.000467612
-1 599 343 0.000467696
-2 599 371 343 0.000467696
-2 896 599 343 0.000467696
-3 896 599 371 343 0.000467696
-1 835 796 0.000468783
-2 877 835 796 0.000468783
-1 913 796 0.000468783
-2 913 835 796 0.000468783
-2 913 877 796 0.000468783
-3 913 877 835 796 0.000468783
-2 216 209 24 0.000469235
-3 216 209 133 24 0.000469235
-1 350 197 0.000469514
-2 350 197 194 0.000469514
-2 350 197 195 0.000469514
-3 350 197 195 194 0.000469514
-2 717 654 68 0.000469726
-2 717 658 654 0.000469726
-3 717 658 654 68 0.000469726
-1 885 47 0.000469768
-2 885 138 47 0.000469768
-1 885 375 0.000469768
-2 885 375 47 0.000469768
-2 885 375 138 0.000469768
-3 885 375 138 47 0.000469768
-2 474 374 138 0.000469984
-3 474 374 141 138 0.000469984
-2 831 112 111 0.000470019
-1 943 112 0.000470019
-2 943 112 111 0.000470019
-2 943 831 112 0.000470019
-3 943 831 112 111 0.000470019
-1 813 408 0.000470114
-2 813 410 408 0.000470114
-2 933 410 408 0.000470114
-2 933 813 408 0.000470114
-3 933 813 410 408 0.000470114
-2 584 582 77 0.000470323
-3 584 582 581 77 0.000470323
-1 382 239 0.000470483
-2 382 239 237 0.000470483
-2 384 382 239 0.000470483
-3 384 382 239 237 0.000470483
-2 658 513 210 0.000470734
-3 658 513 367 210 0.000470734
-2 923 653 605 0.000470821
-3 923 653 605 582 0.000470821
-1 864 245 0.000470859
-2 885 864 245 0.000470859
-2 886 864 245 0.000470859
-3 886 885 864 245 0.000470859
-1 584 268 0.000471202
-2 584 268 216 0.000471202
-2 584 304 268 0.000471202
-3 584 304 268 216 0.000471202
-2 721 517 516 0.000471607
-1 812 517 0.000471607
-2 812 517 516 0.000471607
-2 812 721 517 0.000471607
-3 812 721 517 516 0.000471607
-1 658 375 0.000471694
-2 658 375 210 0.000471694
-2 658 513 375 0.000471694
-3 658 513 375 210 0.000471694
-1 484 205 0.000472152
-2 484 205 64 0.000472152
-2 484 205 67 0.000472152
-3 484 205 67 64 0.000472152
-1 328 19 0.000472219
-2 329 328 19 0.000472219
-2 469 328 19 0.000472219
-3 469 329 328 19 0.000472219
-1 737 718 0.000472773
-2 737 718 94 0.000472773
-2 737 718 198 0.000472773
-3 737 718 198 94 0.000472773
-1 883 852 0.000472803
-1 927 852 0.000472803
-2 927 883 852 0.000472803
-2 928 883 852 0.000472803
-2 928 927 852 0.000472803
-3 928 927 883 852 0.000472803
-2 930 580 574 0.000473061
-3 930 580 574 78 0.000473061
-1 882 683 0.000473388
-2 882 704 683 0.000473388
-2 907 882 683 0.000473388
-3 907 882 704 683 0.000473388
-1 575 405 0.00047377
-2 575 405 181 0.00047377
-2 575 405 401 0.00047377
-3 575 405 401 181 0.00047377
-1 762 210 0.000473848
-2 762 658 210 0.000473848
-2 762 722 210 0.000473848
-3 762 722 658 210 0.000473848
-2 495 407 380 0.000475542
-3 495 407 381 380 0.000475542
-2 882 683 262 0.000475683
-3 882 704 683 262 0.000475683
-1 981 508 0.000475912
-2 981 756 508 0.000475912
-2 988 981 508 0.000475912
-3 988 981 756 508 0.000475912
-1 574 201 0.000475939
-2 574 201 200 0.000475939
-2 585 574 201 0.000475939
-3 585 574 201 200 0.000475939
-1 613 204 0.000476558
-2 613 204 202 0.000476558
-2 616 613 204 0.000476558
-3 616 613 204 202 0.000476558
-1 654 513 0.000476723
-2 654 513 140 0.000476723
-2 658 654 513 0.000476723
-3 658 654 513 140 0.000476723
-1 874 789 0.000476856
-2 874 791 789 0.000476856
-2 986 874 789 0.000476856
-3 986 874 791 789 0.000476856
-2 956 883 852 0.000477069
-2 956 927 852 0.000477069
-3 956 927 883 852 0.000477069
-1 911 392 0.000477106
-2 911 631 392 0.000477106
-2 911 795 392 0.000477106
-3 911 795 631 392 0.000477106
-1 102 83 0.000477192
-2 102 83 69 0.000477192
-2 117 102 83 0.000477192
-3 117 102 83 69 0.000477192
-2 958 911 714 0.000477464
-3 958 911 805 714 0.000477464
-1 961 466 0.00047768
-2 961 466 452 0.00047768
-2 961 902 466 0.00047768
-3 961 902 466 452 0.00047768
-2 957 716 714 0.000477932
-1 969 714 0.000477932
-2 969 716 714 0.000477932
-2 969 957 714 0.000477932
-3 969 957 716 714 0.000477932
-1 650 209 0.000478108
-2 650 209 24 0.000478108
-2 650 216 209 0.000478108
-3 650 216 209 24 0.000478108
-1 953 317 0.00047819
-1 953 534 0.00047819
-2 953 534 317 0.00047819
-2 953 784 317 0.00047819
-2 953 784 534 0.00047819
-3 953 784 534 317 0.00047819
-1 613 599 0.000478534
-2 613 599 369 0.000478534
-2 637 613 599 0.000478534
-3 637 613 599 369 0.000478534
-1 654 71 0.000478705
-2 654 71 68 0.000478705
-2 654 245 71 0.000478705
-3 654 245 71 68 0.000478705
-1 474 328 0.000478717
-2 474 328 19 0.000478717
-2 474 469 328 0.000478717
-3 474 469 328 19 0.000478717
-1 717 77 0.000478874
-2 717 77 76 0.000478874
-2 773 717 77 0.000478874
-3 773 717 77 76 0.000478874
-1 791 527 0.00047924
-2 791 741 527 0.00047924
-2 791 789 527 0.00047924
-3 791 789 741 527 0.00047924
-1 654 375 0.000480175
-2 654 375 140 0.000480175
-2 654 513 375 0.000480175
-3 654 513 375 140 0.000480175
-2 943 112 110 0.000480356
-3 943 112 111 110 0.000480356
-1 600 302 0.000480367
-2 600 361 302 0.000480367
-2 719 600 302 0.000480367
-3 719 600 361 302 0.000480367
-1 407 350 0.000480722
-2 407 350 195 0.000480722
-2 495 407 350 0.000480722
-3 495 407 350 195 0.000480722
-2 747 506 148 0.000481145
-3 747 506 316 148 0.000481145
-2 730 729 7 0.000481178
-3 730 729 453 7 0.000481178
-1 920 580 0.000481527
-2 920 582 580 0.000481527
-2 920 605 580 0.000481527
-3 920 605 582 580 0.000481527
-1 718 95 0.000482173
-2 718 95 94 0.000482173
-2 737 718 95 0.000482173
-3 737 718 95 94 0.000482173
-1 894 574 0.000482485
-2 894 574 201 0.000482485
-2 894 585 574 0.000482485
-3 894 585 574 201 0.000482485
-1 783 217 0.000483225
-2 783 217 187 0.000483225
-2 783 782 217 0.000483225
-3 783 782 217 187 0.000483225
-2 658 654 375 0.000483332
-3 658 654 513 375 0.000483332
-1 735 444 0.000483561
-2 743 735 444 0.000483561
-2 906 735 444 0.000483561
-3 906 743 735 444 0.000483561
-2 885 375 140 0.000483711
-3 885 375 140 138 0.000483711
-2 885 654 375 0.000483903
-3 885 654 375 140 0.000483903
-1 587 575 0.000484486
-2 587 575 401 0.000484486
-2 587 575 405 0.000484486
-3 587 575 405 401 0.000484486
-1 495 307 0.000484653
-2 495 380 307 0.000484653
-2 495 407 307 0.000484653
-3 495 407 380 307 0.000484653
-2 894 574 521 0.000486082
-3 894 585 574 521 0.000486082
-1 432 102 0.000486146
-2 432 328 102 0.000486146
-2 440 432 102 0.000486146
-3 440 432 328 102 0.000486146
-2 494 440 381 0.000487209
-3 494 440 381 99 0.000487209
-1 762 24 0.000487449
-2 762 722 24 0.000487449
-2 897 762 24 0.000487449
-3 897 762 722 24 0.000487449
-1 735 728 0.00048861
-2 735 728 443 0.00048861
-2 735 728 705 0.00048861
-3 735 728 705 443 0.00048861
-1 934 408 0.000488629
-2 934 410 408 0.000488629
-2 934 933 408 0.000488629
-3 934 933 410 408 0.000488629
-1 898 178 0.000488872
-2 898 178 107 0.000488872
-2 898 552 178 0.000488872
-3 898 552 178 107 0.000488872
-2 984 844 515 0.000489909
-2 984 844 676 0.000489909
-3 984 844 676 515 0.000489909
-2 864 654 245 0.000490747
-3 885 864 654 245 0.000490747
-1 985 262 0.000490998
-2 985 263 262 0.000490998
-2 985 963 262 0.000490998
-3 985 963 263 262 0.000490998
-1 958 938 0.000491186
-0 994 0.000491186
-1 994 938 0.000491186
-1 994 958 0.000491186
-2 994 958 938 0.000491186
-0 995 0.000491186
-1 995 938 0.000491186
-1 995 958 0.000491186
-2 995 958 938 0.000491186
-1 995 994 0.000491186
-2 995 994 938 0.000491186
-2 995 994 958 0.000491186
-3 995 994 958 938 0.000491186
-1 859 360 0.000491923
-2 859 360 303 0.000491923
-2 859 765 360 0.000491923
-3 859 765 360 303 0.000491923
-2 647 592 589 0.000491963
-3 647 592 591 589 0.000491963
-1 889 515 0.000492133
-2 889 844 515 0.000492133
-2 889 878 515 0.000492133
-3 889 878 844 515 0.000492133
-1 411 355 0.000492548
-2 411 355 318 0.000492548
-2 814 411 355 0.000492548
-3 814 411 355 318 0.000492548
-2 451 327 7 0.000493102
-3 451 327 326 7 0.000493102
-1 648 592 0.000493446
-2 648 592 589 0.000493446
-2 648 647 592 0.000493446
-3 648 647 592 589 0.000493446
-1 962 597 0.000493782
-2 962 832 597 0.000493782
-2 962 856 597 0.000493782
-2 962 856 832 0.000493782
-3 962 856 832 597 0.000493782
-1 838 437 0.000494057
-2 850 838 437 0.000494057
-2 869 838 437 0.000494057
-3 869 850 838 437 0.000494057
-1 938 609 0.000494153
-1 939 609 0.000494153
-2 939 938 609 0.000494153
-0 996 0.000494153
-1 996 609 0.000494153
-1 996 938 0.000494153
-2 996 938 609 0.000494153
-1 996 939 0.000494153
-2 996 939 609 0.000494153
-2 996 939 938 0.000494153
-3 996 939 938 609 0.000494153
-1 766 692 0.000494217
-2 766 692 72 0.000494217
-2 766 692 491 0.000494217
-3 766 692 491 72 0.000494217
-2 424 247 130 0.000495036
-3 556 424 247 130 0.000495036
-1 586 525 0.000495075
-2 586 525 379 0.000495075
-2 915 586 525 0.000495075
-3 915 586 525 379 0.000495075
-1 530 437 0.000495596
-1 531 437 0.000495596
-2 531 530 437 0.000495596
-1 678 437 0.000495596
-1 678 530 0.000495596
-2 678 530 437 0.000495596
-2 678 531 437 0.000495596
-2 678 531 530 0.000495596
-3 678 531 530 437 0.000495596
-2 768 506 431 0.00049573
-3 768 506 431 315 0.00049573
-1 844 597 0.000495853
-2 856 844 597 0.000495853
-2 962 844 597 0.000495853
-3 962 856 844 597 0.000495853
-1 398 205 0.000495868
-2 398 205 67 0.000495868
-2 686 398 205 0.000495868
-3 686 398 205 67 0.000495868
-1 631 429 0.000496054
-2 631 429 280 0.000496054
-2 732 631 429 0.000496054
-3 732 631 429 280 0.000496054
-2 985 879 263 0.000496115
-3 985 879 696 263 0.000496115
-2 844 832 597 0.000496176
-3 962 844 832 597 0.000496176
-2 717 582 77 0.000496217
-3 717 582 77 76 0.000496217
-1 729 450 0.000496267
-2 729 453 450 0.000496267
-2 729 528 450 0.000496267
-3 729 528 453 450 0.000496267
-1 861 726 0.000496756
-1 977 726 0.000496756
-1 977 861 0.000496756
-2 977 861 726 0.000496756
-1 978 726 0.000496756
-1 978 861 0.000496756
-2 978 861 726 0.000496756
-2 978 977 726 0.000496756
-2 978 977 861 0.000496756
-3 978 977 861 726 0.000496756
-1 967 115 0.000496897
-1 967 471 0.000496897
-2 967 471 115 0.000496897
-1 967 472 0.000496897
-2 967 472 115 0.000496897
-2 967 472 471 0.000496897
-3 967 472 471 115 0.000496897
-2 613 599 371 0.000497152
-3 613 599 371 369 0.000497152
-1 650 584 0.000497375
-2 650 584 417 0.000497375
-2 650 584 572 0.000497375
-3 650 584 572 417 0.000497375
-2 574 521 201 0.00049757
-3 894 574 521 201 0.00049757
-1 744 462 0.000497976
-2 744 465 462 0.000497976
-2 744 567 462 0.000497976
-3 744 567 465 462 0.000497976
-1 857 428 0.000498548
-2 857 431 428 0.000498548
-2 883 857 428 0.000498548
-3 883 857 431 428 0.000498548
-1 380 177 0.000498638
-2 494 380 177 0.000498638
-2 495 380 177 0.000498638
-3 495 494 380 177 0.000498638
-1 937 911 0.000498939
-2 954 937 911 0.000498939
-1 958 937 0.000498939
-2 958 937 911 0.000498939
-2 958 954 937 0.000498939
-3 958 954 937 911 0.000498939
-1 757 532 0.000499089
-2 757 532 18 0.000499089
-2 757 602 532 0.000499089
-3 757 602 532 18 0.000499089
-1 808 682 0.000499262
-2 808 682 634 0.000499262
-2 808 779 682 0.000499262
-3 808 779 682 634 0.000499262
-1 587 181 0.000499782
-2 587 405 181 0.000499782
-2 587 575 181 0.000499782
-3 587 575 405 181 0.000499782
-2 914 870 482 0.000500098
-3 914 870 482 480 0.000500098
-1 685 533 0.000500272
-2 685 533 18 0.000500272
-2 685 533 19 0.000500272
-3 685 533 19 18 0.000500272
-1 963 959 0.000500858
-1 963 960 0.000500858
-2 963 960 959 0.000500858
-2 985 963 959 0.000500858
-2 985 963 960 0.000500858
-3 985 963 960 959 0.000500858
-1 853 506 0.00050163
-2 853 506 431 0.00050163
-2 853 768 506 0.00050163
-3 853 768 506 431 0.00050163
-1 648 144 0.000501787
-2 648 589 144 0.000501787
-2 648 592 144 0.000501787
-3 648 592 589 144 0.000501787
-2 484 398 205 0.000502031
-3 484 398 205 67 0.000502031
-1 863 332 0.000502334
-2 863 333 332 0.000502334
-2 863 334 332 0.000502334
-3 863 334 333 332 0.000502334
-2 474 328 100 0.000502491
-3 474 469 328 100 0.000502491
-1 717 375 0.000502801
-2 717 654 375 0.000502801
-2 717 658 375 0.000502801
-3 717 658 654 375 0.000502801
-1 576 454 0.000503209
-2 576 454 58 0.000503209
-2 576 454 319 0.000503209
-3 576 454 319 58 0.000503209
-2 988 508 492 0.000504527
-3 988 948 508 492 0.000504527
-1 647 144 0.000504673
-2 647 592 144 0.000504673
-2 648 647 144 0.000504673
-3 648 647 592 144 0.000504673
-2 967 567 471 0.000504698
-2 967 567 472 0.000504698
-3 967 567 472 471 0.000504698
-1 825 506 0.000504967
-2 825 768 506 0.000504967
-2 853 825 506 0.000504967
-3 853 825 768 506 0.000504967
-2 613 205 204 0.000505632
-3 613 205 204 202 0.000505632
-1 594 323 0.000507232
-2 594 323 301 0.000507232
-2 594 471 323 0.000507232
-3 594 471 323 301 0.000507232
-1 934 616 0.000507473
-2 934 807 616 0.000507473
-2 934 933 616 0.000507473
-2 934 933 807 0.000507473
-3 934 933 807 616 0.000507473
-1 885 45 0.000507513
-2 885 47 45 0.000507513
-2 885 375 45 0.000507513
-3 885 375 47 45 0.000507513
-1 610 436 0.000507526
-1 610 437 0.000507526
-2 610 437 436 0.000507526
-1 869 610 0.000507526
-2 869 610 436 0.000507526
-2 869 610 437 0.000507526
-3 869 610 437 436 0.000507526
-1 573 304 0.000507638
-2 584 573 304 0.000507638
-2 712 573 304 0.000507638
-3 712 584 573 304 0.000507638
-1 885 46 0.000507822
-2 885 47 46 0.000507822
-2 885 138 46 0.000507822
-3 885 138 47 46 0.000507822
-1 957 911 0.0005081
-2 957 911 714 0.0005081
-2 958 957 911 0.0005081
-3 958 957 911 714 0.0005081
-1 616 205 0.000508246
-2 616 205 204 0.000508246
-2 616 613 205 0.000508246
-3 616 613 205 204 0.000508246
-1 982 713 0.000508698
-1 982 835 0.000508698
-2 982 835 713 0.000508698
-1 982 913 0.000508698
-2 982 913 713 0.000508698
-2 982 913 835 0.000508698
-3 982 913 835 713 0.000508698
-1 478 4 0.000508717
-2 478 7 4 0.000508717
-2 478 103 4 0.000508717
-3 478 103 7 4 0.000508717
-1 426 131 0.000508992
-2 426 131 128 0.000508992
-2 426 131 130 0.000508992
-3 426 131 130 128 0.000508992
-1 978 550 0.000509252
-1 978 629 0.000509252
-2 978 629 550 0.000509252
-2 978 861 550 0.000509252
-2 978 861 629 0.000509252
-3 978 861 629 550 0.000509252
-2 763 602 532 0.000509738
-1 763 757 0.000509738
-2 763 757 532 0.000509738
-2 763 757 602 0.000509738
-3 763 757 602 532 0.000509738
-1 559 310 0.000510168
-2 559 310 174 0.000510168
-2 559 310 259 0.000510168
-3 559 310 259 174 0.000510168
-1 683 462 0.00051025
-2 683 463 462 0.00051025
-2 683 465 462 0.00051025
-3 683 465 463 462 0.00051025
-1 955 247 0.000510285
-2 955 249 247 0.000510285
-2 955 427 247 0.000510285
-3 955 427 249 247 0.000510285
-1 584 537 0.000510562
-2 584 537 268 0.000510562
-2 584 537 304 0.000510562
-3 584 537 304 268 0.000510562
-1 961 327 0.000511542
-2 961 451 327 0.000511542
-2 961 452 327 0.000511542
-3 961 452 451 327 0.000511542
-1 845 178 0.000511845
-2 845 178 107 0.000511845
-2 845 597 178 0.000511845
-3 845 597 178 107 0.000511845
-1 943 178 0.000511881
-2 943 552 178 0.000511881
-2 943 898 178 0.000511881
-3 943 898 552 178 0.000511881
-1 307 177 0.000512248
-2 380 307 177 0.000512248
-2 495 307 177 0.000512248
-3 495 380 307 177 0.000512248
-2 559 310 165 0.000512265
-3 559 310 259 165 0.000512265
-1 772 72 0.000512325
-2 772 73 72 0.000512325
-2 772 692 72 0.000512325
-3 772 692 73 72 0.000512325
-1 762 375 0.000512576
-2 762 375 210 0.000512576
-2 762 658 375 0.000512576
-3 762 658 375 210 0.000512576
-1 859 300 0.000513016
-2 859 303 300 0.000513016
-2 859 324 300 0.000513016
-3 859 324 303 300 0.000513016
-1 974 782 0.000513317
-2 974 782 184 0.000513317
-2 974 783 782 0.000513317
-3 974 783 782 184 0.000513317
-2 898 845 178 0.000513578
-3 898 845 178 107 0.000513578
-1 584 209 0.00051374
-2 584 216 209 0.00051374
-2 584 268 209 0.00051374
-3 584 268 216 209 0.00051374
-1 461 110 0.000513858
-2 723 461 110 0.000513858
-2 943 461 110 0.000513858
-3 943 723 461 110 0.000513858
-1 131 43 0.000514009
-2 131 43 40 0.000514009
-2 459 131 43 0.000514009
-3 459 131 43 40 0.000514009
-2 729 451 450 0.000514024
-3 729 453 451 450 0.000514024
-1 891 696 0.00051409
-2 891 879 696 0.00051409
-1 992 891 0.00051409
-2 992 891 696 0.00051409
-2 992 891 879 0.00051409
-3 992 891 879 696 0.00051409
-2 762 717 375 0.000514191
-3 762 717 658 375 0.000514191
-2 772 90 72 0.000514591
-3 772 90 73 72 0.000514591
-1 857 825 0.000514759
-2 857 853 825 0.000514759
-2 883 857 825 0.000514759
-3 883 857 853 825 0.000514759
-2 211 210 147 0.000515083
-3 211 210 147 146 0.000515083
-2 927 852 602 0.000515083
-3 956 927 852 602 0.000515083
-1 847 718 0.000515318
-2 847 718 712 0.000515318
-2 848 847 718 0.000515318
-3 848 847 718 712 0.000515318
-1 582 304 0.000515836
-2 582 573 304 0.000515836
-2 584 582 304 0.000515836
-3 584 582 573 304 0.000515836
-2 650 584 216 0.000517088
-3 650 584 417 216 0.000517088
-2 859 360 300 0.000517144
-3 859 360 303 300 0.000517144
-1 312 60 0.00051735
-2 312 123 60 0.00051735
-2 312 267 60 0.00051735
-3 312 267 123 60 0.00051735
-1 919 663 0.000517554
-2 919 663 625 0.000517554
-2 919 823 663 0.000517554
-3 919 823 663 625 0.000517554
-1 794 7 0.00051776
-2 794 478 7 0.00051776
-2 794 729 7 0.00051776
-3 794 729 478 7 0.00051776
-1 717 210 0.000517846
-2 717 375 210 0.000517846
-2 762 717 210 0.000517846
-3 762 717 375 210 0.000517846
-1 926 3 0.000517938
-2 926 428 3 0.000517938
-1 928 3 0.000517938
-2 928 428 3 0.000517938
-2 928 926 3 0.000517938
-3 928 926 428 3 0.000517938
-2 582 573 79 0.000518154
-3 582 581 573 79 0.000518154
-2 762 210 24 0.000519171
-3 762 722 210 24 0.000519171
-1 967 85 0.00051921
-1 967 114 0.00051921
-2 967 114 85 0.00051921
-2 967 115 85 0.00051921
-2 967 115 114 0.00051921
-3 967 115 114 85 0.00051921
-1 741 586 0.000519705
-2 874 741 586 0.000519705
-2 915 741 586 0.000519705
-3 915 874 741 586 0.000519705
-1 941 144 0.000520234
-2 941 589 144 0.000520234
-2 941 648 144 0.000520234
-3 941 648 589 144 0.000520234
-1 897 210 0.000521167
-2 897 210 24 0.000521167
-2 897 762 210 0.000521167
-3 897 762 210 24 0.000521167
-1 546 322 0.000522937
-2 546 324 322 0.000522937
-2 546 535 322 0.000522937
-3 546 535 324 322 0.000522937
-1 907 262 0.000522948
-2 907 683 262 0.000522948
-2 907 882 262 0.000522948
-3 907 882 683 262 0.000522948
-2 584 537 209 0.000523194
-3 584 537 268 209 0.000523194
-1 312 81 0.000523391
-2 312 81 80 0.000523391
-2 312 82 81 0.000523391
-3 312 82 81 80 0.000523391
-2 533 474 19 0.000523628
-2 685 533 474 0.000523628
-3 685 533 474 19 0.000523628
-1 579 529 0.000523826
-2 579 529 339 0.000523826
-2 579 531 529 0.000523826
-3 579 531 529 339 0.000523826
-1 927 3 0.000524182
-2 927 428 3 0.000524182
-2 928 927 3 0.000524182
-3 928 927 428 3 0.000524182
-1 582 47 0.000524417
-1 884 47 0.000524417
-2 884 582 47 0.000524417
-2 885 582 47 0.000524417
-2 885 884 47 0.000524417
-3 885 884 582 47 0.000524417
-2 650 584 209 0.000524621
-3 650 584 216 209 0.000524621
-1 959 262 0.000524944
-1 959 882 0.000524944
-2 959 882 262 0.000524944
-2 963 959 262 0.000524944
-2 963 959 882 0.000524944
-3 963 959 882 262 0.000524944
-1 953 33 0.000525244
-2 953 317 33 0.000525244
-2 953 534 33 0.000525244
-3 953 534 317 33 0.000525244
-2 707 572 78 0.000525604
-3 707 680 572 78 0.000525604
-2 889 844 597 0.000525824
-3 889 856 844 597 0.000525824
-2 847 776 718 0.00052585
-3 848 847 776 718 0.00052585
-1 897 209 0.000526201
-2 897 209 24 0.000526201
-2 897 210 209 0.000526201
-3 897 210 209 24 0.000526201
-1 610 438 0.000527449
-2 610 438 436 0.000527449
-2 610 438 437 0.000527449
-3 610 438 437 436 0.000527449
-1 518 508 0.000527482
-2 518 515 508 0.000527482
-2 812 518 508 0.000527482
-3 812 518 515 508 0.000527482
-1 518 161 0.000527875
-1 693 161 0.000527875
-2 693 518 161 0.000527875
-2 812 518 161 0.000527875
-2 812 693 161 0.000527875
-3 812 693 518 161 0.000527875
-2 897 650 24 0.000528031
-2 897 650 209 0.000528031
-3 897 650 209 24 0.000528031
-1 780 617 0.000528123
-2 780 617 49 0.000528123
-2 780 682 617 0.000528123
-3 780 682 617 49 0.000528123
-1 247 131 0.000528219
-2 247 131 40 0.000528219
-2 247 131 130 0.000528219
-3 247 131 130 40 0.000528219
-1 407 177 0.000528263
-2 407 307 177 0.000528263
-2 495 407 177 0.000528263
-3 495 407 307 177 0.000528263
-1 950 351 0.000528331
-2 950 351 272 0.000528331
-2 950 822 351 0.000528331
-3 950 822 351 272 0.000528331
-1 751 175 0.000528461
-2 751 507 175 0.000528461
-2 751 566 175 0.000528461
-3 751 566 507 175 0.000528461
-2 907 723 463 0.000529105
-3 907 723 692 463 0.000529105
-2 407 350 197 0.000529128
-3 407 350 197 195 0.000529128
-1 582 45 0.000529136
-2 582 47 45 0.000529136
-2 885 582 45 0.000529136
-3 885 582 47 45 0.000529136
-2 825 747 506 0.000529288
-3 825 768 747 506 0.000529288
-1 751 90 0.00052948
-2 751 175 90 0.00052948
-2 751 566 90 0.00052948
-3 751 566 175 90 0.00052948
-1 250 13 0.00052956
-2 250 33 13 0.00052956
-2 250 182 13 0.00052956
-3 250 182 33 13 0.00052956
-1 528 451 0.000529586
-2 528 451 450 0.000529586
-2 729 528 451 0.000529586
-3 729 528 451 450 0.000529586
-1 507 90 0.000529592
-2 507 175 90 0.000529592
-2 751 507 90 0.000529592
-3 751 507 175 90 0.000529592
-1 634 599 0.000529759
-2 634 599 371 0.000529759
-2 634 613 599 0.000529759
-3 634 613 599 371 0.000529759
-1 584 45 0.000530052
-2 584 304 45 0.000530052
-2 584 537 45 0.000530052
-3 584 537 304 45 0.000530052
-1 284 205 0.000530327
-2 590 284 205 0.000530327
-2 746 284 205 0.000530327
-3 746 590 284 205 0.000530327
-2 582 304 45 0.000530448
-2 582 304 47 0.000530448
-3 582 304 47 45 0.000530448
-1 776 669 0.00053068
-2 776 758 669 0.00053068
-2 848 776 669 0.00053068
-3 848 776 758 669 0.00053068
-1 559 144 0.000531141
-2 559 525 144 0.000531141
-2 561 559 144 0.000531141
-3 561 559 525 144 0.000531141
-1 479 93 0.00053226
-2 789 479 93 0.00053226
-2 794 479 93 0.00053226
-3 794 789 479 93 0.00053226
-2 903 808 807 0.000532759
-1 904 807 0.000532759
-2 904 808 807 0.000532759
-2 904 903 807 0.000532759
-3 904 903 808 807 0.000532759
-1 964 582 0.000533635
-2 964 652 582 0.000533635
-2 964 920 582 0.000533635
-3 964 920 652 582 0.000533635
-2 987 857 428 0.000533753
-2 987 883 857 0.000533753
-3 987 883 857 428 0.000533753
-1 792 451 0.000534274
-2 792 528 451 0.000534274
-2 792 729 451 0.000534274
-3 792 729 528 451 0.000534274
-2 794 792 451 0.000534628
-3 794 792 729 451 0.000534628
-1 749 309 0.000534632
-2 749 388 309 0.000534632
-2 749 404 309 0.000534632
-3 749 404 388 309 0.000534632
-2 849 824 782 0.000534747
-3 849 824 782 781 0.000534747
-1 580 363 0.000534747
-2 580 363 362 0.000534747
-2 580 364 363 0.000534747
-3 580 364 363 362 0.000534747
-1 945 842 0.000535221
-2 945 842 841 0.000535221
-1 945 887 0.000535221
-2 945 887 841 0.000535221
-2 945 887 842 0.000535221
-3 945 887 842 841 0.000535221
-2 432 328 19 0.000535361
-3 432 329 328 19 0.000535361
-2 507 90 72 0.000536011
-3 507 175 90 72 0.000536011
-1 884 304 0.000536091
-2 884 304 47 0.000536091
-2 884 582 304 0.000536091
-3 884 582 304 47 0.000536091
-2 776 759 758 0.000536212
-2 847 776 759 0.000536212
-3 847 776 759 758 0.000536212
-1 964 740 0.000536514
-2 964 864 740 0.000536514
-1 964 865 0.000536514
-2 964 865 740 0.000536514
-2 964 865 864 0.000536514
-3 964 865 864 740 0.000536514
-1 933 599 0.000536661
-2 933 613 599 0.000536661
-2 933 637 599 0.000536661
-3 933 637 613 599 0.000536661
-1 693 42 0.000536775
-2 693 161 42 0.000536775
-2 693 510 42 0.000536775
-2 693 510 161 0.000536775
-3 693 510 161 42 0.000536775
-1 795 486 0.000536885
-2 795 487 486 0.000536885
-2 795 631 486 0.000536885
-3 795 631 487 486 0.000536885
-2 584 582 45 0.000537102
-3 584 582 304 45 0.000537102
-2 634 599 343 0.000537472
-3 634 599 371 343 0.000537472
-2 631 499 429 0.000537723
-3 631 499 429 280 0.000537723
-1 790 759 0.00053845
-2 790 776 759 0.00053845
-2 874 790 759 0.00053845
-3 874 790 776 759 0.00053845
-1 793 776 0.000538772
-2 793 776 759 0.000538772
-2 873 793 776 0.000538772
-3 873 793 776 759 0.000538772
-0 997 0.000539065
-1 997 713 0.000539065
-1 997 835 0.000539065
-2 997 835 713 0.000539065
-1 997 982 0.000539065
-2 997 982 713 0.000539065
-2 997 982 835 0.000539065
-3 997 982 835 713 0.000539065
-1 961 670 0.000539085
-2 961 672 670 0.000539085
-2 961 902 670 0.000539085
-3 961 902 672 670 0.000539085
-1 824 571 0.000539868
-2 824 757 571 0.000539868
-2 825 824 571 0.000539868
-3 825 824 757 571 0.000539868
-1 407 226 0.000539953
-2 407 350 226 0.000539953
-2 495 407 226 0.000539953
-3 495 407 350 226 0.000539953
-2 961 466 327 0.000539982
-3 961 466 452 327 0.000539982
-1 554 339 0.000540023
-2 554 529 339 0.000540023
-2 909 554 339 0.000540023
-3 909 554 529 339 0.000540023
-1 408 144 0.000540239
-2 408 183 144 0.000540239
-2 637 408 144 0.000540239
-3 637 408 183 144 0.000540239
-1 582 375 0.000541019
-2 582 375 45 0.000541019
-2 885 582 375 0.000541019
-3 885 582 375 45 0.000541019
-1 898 597 0.000541283
-2 898 597 178 0.000541283
-2 898 845 597 0.000541283
-3 898 845 597 178 0.000541283
-1 572 209 0.000541485
-2 584 572 209 0.000541485
-2 650 572 209 0.000541485
-3 650 584 572 209 0.000541485
-1 325 87 0.000541869
-2 325 88 87 0.000541869
-2 740 325 87 0.000541869
-3 740 325 88 87 0.000541869
-2 654 582 375 0.00054199
-3 885 654 582 375 0.00054199
-1 997 716 0.00054209
-2 997 716 713 0.00054209
-1 997 911 0.00054209
-2 997 911 713 0.00054209
-2 997 911 716 0.00054209
-3 997 911 716 713 0.00054209
-1 612 410 0.000542274
-2 612 410 408 0.000542274
-2 612 410 409 0.000542274
-3 612 410 409 408 0.000542274
-2 898 830 597 0.000542553
-2 898 845 830 0.000542553
-3 898 845 830 597 0.000542553
-1 723 683 0.000542971
-2 723 683 463 0.000542971
-2 907 723 683 0.000542971
-3 907 723 683 463 0.000542971
-1 953 187 0.000543169
-2 953 783 187 0.000543169
-2 953 810 187 0.000543169
-3 953 810 783 187 0.000543169
-1 859 507 0.000543553
-2 859 765 507 0.000543553
-2 979 859 507 0.000543553
-3 979 859 765 507 0.000543553
-1 956 851 0.000543889
-2 956 851 456 0.000543889
-2 956 852 851 0.000543889
-3 956 852 851 456 0.000543889
-2 897 572 209 0.000544346
-3 897 650 572 209 0.000544346
-1 877 853 0.000545241
-2 877 853 825 0.000545241
-2 966 853 825 0.000545241
-2 966 877 853 0.000545241
-3 966 877 853 825 0.000545241
-1 859 491 0.000545805
-2 859 491 360 0.000545805
-2 859 765 491 0.000545805
-3 859 765 491 360 0.000545805
-1 989 887 0.000546048
-2 989 954 887 0.000546048
-2 989 973 887 0.000546048
-3 989 973 954 887 0.000546048
-2 928 909 908 0.000546466
-2 971 928 909 0.000546466
-3 971 928 909 908 0.000546466
-2 838 678 437 0.000546731
-2 850 678 437 0.000546731
-3 850 838 678 437 0.000546731
-1 792 450 0.00054684
-2 792 451 450 0.00054684
-2 792 528 450 0.00054684
-3 792 528 451 450 0.00054684
-1 908 3 0.000547489
-2 926 908 3 0.000547489
-2 928 908 3 0.000547489
-3 928 926 908 3 0.000547489
-1 927 558 0.000547654
-2 927 558 428 0.000547654
-2 927 558 432 0.000547654
-3 927 558 432 428 0.000547654
-1 717 680 0.00054832
-2 717 680 77 0.00054832
-2 773 717 680 0.00054832
-3 773 717 680 77 0.00054832
-2 832 830 597 0.000548424
-3 855 832 830 597 0.000548424
-1 492 247 0.000549513
-2 492 247 238 0.000549513
-2 492 248 247 0.000549513
-3 492 248 247 238 0.000549513
-2 610 608 437 0.000549725
-2 610 608 438 0.000549725
-3 610 608 438 437 0.000549725
-2 788 618 236 0.000549761
-3 788 787 618 236 0.000549761
-1 594 472 0.000549937
-2 594 472 471 0.000549937
-2 595 594 472 0.000549937
-3 595 594 472 471 0.000549937
-1 654 77 0.00055003
-2 654 582 77 0.00055003
-2 717 654 77 0.00055003
-3 717 654 582 77 0.00055003
-1 264 124 0.00055013
-2 264 125 124 0.00055013
-2 264 127 124 0.00055013
-3 264 127 125 124 0.00055013
-2 407 226 177 0.00055046
-3 495 407 226 177 0.00055046
-1 660 548 0.00055058
-2 660 548 459 0.00055058
-2 752 660 548 0.00055058
-3 752 660 548 459 0.00055058
-1 474 102 0.000550732
-2 474 102 100 0.000550732
-2 474 102 101 0.000550732
-3 474 102 101 100 0.000550732
-1 979 902 0.000550774
-2 979 902 507 0.000550774
-2 979 902 670 0.000550774
-3 979 902 670 507 0.000550774
-1 77 45 0.000551093
-2 582 77 45 0.000551093
-2 584 77 45 0.000551093
-3 584 582 77 45 0.000551093
-1 766 360 0.000551485
-2 766 360 303 0.000551485
-2 766 491 360 0.000551485
-3 766 491 360 303 0.000551485
-1 435 211 0.000552118
-2 435 292 211 0.000552118
-2 490 435 211 0.000552118
-3 490 435 292 211 0.000552118
-1 774 210 0.000552622
-2 774 762 210 0.000552622
-2 897 774 210 0.000552622
-2 897 774 762 0.000552622
-3 897 774 762 210 0.000552622
-1 435 255 0.000552646
-2 435 255 134 0.000552646
-2 435 255 136 0.000552646
-3 435 255 136 134 0.000552646
-2 827 426 425 0.000552857
-1 925 426 0.000552857
-2 925 426 425 0.000552857
-2 925 827 426 0.000552857
-3 925 827 426 425 0.000552857
-1 617 239 0.000553709
-2 617 239 49 0.000553709
-2 618 617 239 0.000553709
-3 618 617 239 49 0.000553709
-1 322 300 0.000553805
-2 324 322 300 0.000553805
-2 546 322 300 0.000553805
-3 546 324 322 300 0.000553805
-2 530 439 437 0.000553922
-1 608 530 0.000553922
-2 608 530 437 0.000553922
-2 608 530 439 0.000553922
-3 608 530 439 437 0.000553922
-2 474 328 102 0.000553925
-3 474 328 102 100 0.000553925
-1 987 928 0.000554954
-2 987 928 883 0.000554954
-2 987 928 926 0.000554954
-3 987 928 926 883 0.000554954
-1 774 209 0.000555668
-2 774 210 209 0.000555668
-2 897 774 209 0.000555668
-3 897 774 210 209 0.000555668
-2 957 911 716 0.000557173
-3 957 911 716 714 0.000557173
-1 773 210 0.000557675
-2 773 762 210 0.000557675
-2 774 773 210 0.000557675
-3 774 773 762 210 0.000557675
-1 943 167 0.00055774
-2 943 178 167 0.00055774
-2 943 552 167 0.00055774
-3 943 552 178 167 0.00055774
-1 375 77 0.000558886
-2 375 77 45 0.000558886
-2 582 375 77 0.000558886
-3 582 375 77 45 0.000558886
-2 750 466 346 0.000559112
-3 750 467 466 346 0.000559112
-2 773 717 210 0.000559258
-3 773 762 717 210 0.000559258
-2 774 572 209 0.000559514
-3 897 774 572 209 0.000559514
-1 773 209 0.00056004
-2 773 210 209 0.00056004
-2 774 773 209 0.00056004
-3 774 773 210 209 0.00056004
-1 793 405 0.00056025
-2 793 586 405 0.00056025
-2 793 587 405 0.00056025
-3 793 587 586 405 0.00056025
-1 634 617 0.000560575
-2 634 617 343 0.000560575
-2 682 634 617 0.000560575
-3 682 634 617 343 0.000560575
-2 654 375 77 0.000561145
-3 654 582 375 77 0.000561145
-1 683 458 0.000561195
-2 683 463 458 0.000561195
-2 723 683 458 0.000561195
-3 723 683 463 458 0.000561195
-2 773 572 209 0.000561441
-3 774 773 572 209 0.000561441
-1 825 354 0.000561818
-2 825 784 354 0.000561818
-2 877 825 354 0.000561818
-3 877 825 784 354 0.000561818
-1 584 375 0.000562149
-2 584 375 45 0.000562149
-2 584 537 375 0.000562149
-3 584 537 375 45 0.000562149
-2 584 375 77 0.000562241
-3 584 375 77 45 0.000562241
-1 680 375 0.000562594
-2 680 375 77 0.000562594
-2 680 584 375 0.000562594
-3 680 584 375 77 0.000562594
-1 790 635 0.000562701
-2 791 790 635 0.000562701
-2 986 790 635 0.000562701
-3 986 791 790 635 0.000562701
-1 692 507 0.000563047
-2 692 507 72 0.000563047
-2 766 692 507 0.000563047
-3 766 692 507 72 0.000563047
-2 717 375 77 0.00056324
-3 717 654 375 77 0.00056324
-1 864 70 0.000563343
-2 864 245 70 0.000563343
-2 886 864 70 0.000563343
-3 886 864 245 70 0.000563343
-1 555 425 0.00056344
-2 555 425 424 0.00056344
-2 555 426 425 0.00056344
-3 555 426 425 424 0.00056344
-1 680 209 0.000563577
-2 680 572 209 0.000563577
-2 680 584 209 0.000563577
-3 680 584 572 209 0.000563577
-2 773 680 209 0.000563579
-3 773 680 572 209 0.000563579
-2 989 887 841 0.000563729
-3 989 973 887 841 0.000563729
-2 859 322 300 0.000564692
-3 859 324 322 300 0.000564692
-2 906 735 728 0.00056479
-3 906 735 728 443 0.00056479
-1 864 69 0.000564796
-2 864 70 69 0.000564796
-1 886 69 0.000564796
-2 886 70 69 0.000564796
-2 886 864 69 0.000564796
-3 886 864 70 69 0.000564796
-2 864 245 69 0.000564937
-3 864 245 70 69 0.000564937
-1 827 555 0.000565094
-2 827 555 426 0.000565094
-2 827 630 555 0.000565094
-3 827 630 555 426 0.000565094
-1 680 537 0.000565478
-2 680 537 375 0.000565478
-2 680 584 537 0.000565478
-3 680 584 537 375 0.000565478
-2 680 537 209 0.000565968
-3 680 584 537 209 0.000565968
-2 518 508 161 0.00056638
-3 812 518 508 161 0.00056638
-1 862 508 0.000566995
-2 862 756 508 0.000566995
-2 878 862 508 0.000566995
-3 878 862 756 508 0.000566995
-1 616 562 0.000567095
-2 616 563 562 0.000567095
-2 616 615 562 0.000567095
-3 616 615 563 562 0.000567095
-2 717 680 375 0.000568578
-3 717 680 375 77 0.000568578
-2 780 617 239 0.00056865
-3 780 617 239 49 0.00056865
-1 965 431 0.000569003
-2 965 853 431 0.000569003
-2 965 857 431 0.000569003
-3 965 857 853 431 0.000569003
-1 680 210 0.000569769
-2 680 210 209 0.000569769
-2 773 680 210 0.000569769
-3 773 680 210 209 0.000569769
-2 680 537 210 0.000570433
-3 680 537 210 209 0.000570433
-2 717 680 210 0.000570671
-3 773 717 680 210 0.000570671
-1 749 493 0.000570816
-2 749 493 388 0.000570816
-2 762 749 493 0.000570816
-3 762 749 493 388 0.000570816
-1 717 537 0.000570988
-2 717 537 210 0.000570988
-2 717 537 375 0.000570988
-3 717 537 375 210 0.000570988
-1 532 432 0.000571165
-2 532 432 19 0.000571165
-2 602 532 432 0.000571165
-3 602 532 432 19 0.000571165
-2 525 144 142 0.000571321
-3 525 144 143 142 0.000571321
-2 717 680 537 0.00057134
-3 717 680 537 375 0.00057134
-3 717 680 537 210 0.000571365
-1 403 275 0.000571611
-2 403 275 271 0.000571611
-2 403 391 275 0.000571611
-3 403 391 275 271 0.000571611
-1 424 131 0.000572243
-2 424 131 130 0.000572243
-2 426 424 131 0.000572243
-3 426 424 131 130 0.000572243
-1 824 769 0.000572488
-2 824 769 767 0.000572488
-2 824 769 768 0.000572488
-3 824 769 768 767 0.000572488
-1 474 46 0.000572769
-2 474 138 46 0.000572769
-2 474 374 46 0.000572769
-3 474 374 138 46 0.000572769
-1 846 491 0.000573015
-2 846 491 360 0.000573015
-2 846 692 491 0.000573015
-3 846 692 491 360 0.000573015
-1 521 200 0.000573082
-2 521 200 198 0.000573082
-2 521 201 200 0.000573082
-3 521 201 200 198 0.000573082
-1 808 617 0.000573411
-2 808 634 617 0.000573411
-2 808 682 617 0.000573411
-3 808 682 634 617 0.000573411
-1 474 432 0.000573463
-2 474 432 19 0.000573463
-2 474 432 328 0.000573463
-3 474 432 328 19 0.000573463
-1 862 515 0.000573649
-2 862 515 508 0.000573649
-2 878 862 515 0.000573649
-3 878 862 515 508 0.000573649
-2 847 760 669 0.000573652
-3 847 820 760 669 0.000573652
-1 968 911 0.000574156
-2 968 911 716 0.000574156
-2 968 957 911 0.000574156
-3 968 957 911 716 0.000574156
-2 312 119 60 0.000574176
-3 312 123 119 60 0.000574176
-1 598 167 0.000574177
-2 598 167 166 0.000574177
-2 598 178 167 0.000574177
-3 598 178 167 166 0.000574177
-2 809 483 481 0.000574329
-1 809 547 0.000574329
-2 809 547 481 0.000574329
-2 809 547 483 0.000574329
-3 809 547 483 481 0.000574329
-1 649 166 0.000575712
-2 649 447 166 0.000575712
-1 975 649 0.000575712
-2 975 649 166 0.000575712
-2 975 649 447 0.000575712
-3 975 649 447 166 0.000575712
-1 757 744 0.000575898
-2 757 744 532 0.000575898
-2 763 757 744 0.000575898
-3 763 757 744 532 0.000575898
-1 899 725 0.000576425
-2 899 725 724 0.000576425
-1 947 724 0.000576425
-2 947 725 724 0.000576425
-1 947 899 0.000576425
-2 947 899 724 0.000576425
-2 947 899 725 0.000576425
-3 947 899 725 724 0.000576425
-1 974 588 0.00057663
-2 974 588 321 0.00057663
-2 974 760 588 0.00057663
-3 974 760 588 321 0.00057663
-1 818 483 0.000577069
-2 818 547 483 0.000577069
-2 819 547 483 0.000577069
-2 819 818 483 0.000577069
-3 819 818 547 483 0.000577069
-2 631 429 279 0.000577347
-3 732 631 429 279 0.000577347
-1 317 250 0.000577783
-2 317 250 13 0.000577783
-2 317 250 182 0.000577783
-3 317 250 182 13 0.000577783
-1 847 790 0.000577855
-2 847 790 759 0.000577855
-2 847 790 776 0.000577855
-3 847 790 776 759 0.000577855
-1 767 537 0.000578102
-2 767 747 537 0.000578102
-2 849 767 537 0.000578102
-3 849 767 747 537 0.000578102
-1 742 683 0.00057926
-1 742 735 0.00057926
-2 742 735 683 0.00057926
-2 742 736 683 0.00057926
-2 742 736 735 0.00057926
-3 742 736 735 683 0.00057926
-2 859 507 491 0.000580534
-3 859 765 507 491 0.000580534
-2 897 98 22 0.000580979
-3 897 98 23 22 0.000580979
-2 793 405 379 0.000581142
-3 793 586 405 379 0.000581142
-1 989 936 0.000581167
-2 989 939 936 0.000581167
-2 989 973 936 0.000581167
-3 989 973 939 936 0.000581167
-1 884 46 0.000581261
-2 884 47 46 0.000581261
-2 885 884 46 0.000581261
-3 885 884 47 46 0.000581261
-1 878 597 0.000583358
-2 878 862 597 0.000583358
-2 889 878 597 0.000583358
-3 889 878 862 597 0.000583358
-1 779 617 0.00058382
-2 779 682 617 0.00058382
-2 808 779 617 0.00058382
-3 808 779 682 617 0.00058382
-1 478 93 0.00058458
-2 479 478 93 0.00058458
-2 794 478 93 0.00058458
-3 794 479 478 93 0.00058458
-1 788 508 0.000584658
-2 788 508 492 0.000584658
-2 988 788 508 0.000584658
-3 988 788 508 492 0.000584658
-2 741 586 525 0.000585138
-3 915 741 586 525 0.000585138
-1 997 968 0.000586026
-2 997 968 716 0.000586026
-2 997 968 911 0.000586026
-3 997 968 911 716 0.000586026
-1 649 165 0.000586141
-2 649 166 165 0.000586141
-2 975 649 165 0.000586141
-3 975 649 166 165 0.000586141
-2 474 432 102 0.000586883
-3 474 432 328 102 0.000586883
-2 950 485 351 0.000587133
-3 950 485 351 272 0.000587133
-1 943 597 0.000588032
-2 943 597 178 0.000588032
-2 943 898 597 0.000588032
-3 943 898 597 178 0.000588032
-1 747 147 0.00058854
-2 747 148 147 0.00058854
-2 747 210 147 0.00058854
-3 747 210 148 147 0.00058854
-1 912 824 0.000588779
-2 912 824 768 0.000588779
-2 912 824 769 0.000588779
-3 912 824 769 768 0.000588779
-1 997 834 0.000589568
-2 997 834 713 0.000589568
-2 997 911 834 0.000589568
-3 997 911 834 713 0.000589568
-2 997 835 834 0.000589709
-3 997 835 834 713 0.000589709
-1 597 167 0.000589872
-2 597 178 167 0.000589872
-2 598 597 167 0.000589872
-3 598 597 178 167 0.000589872
-2 943 830 597 0.000590465
-3 943 898 830 597 0.000590465
-1 825 601 0.000590614
-2 825 601 571 0.000590614
-2 883 825 601 0.000590614
-3 883 825 601 571 0.000590614
-1 808 780 0.000590876
-2 808 780 779 0.000590876
-1 904 779 0.000590876
-1 904 780 0.000590876
-2 904 780 779 0.000590876
-2 904 808 779 0.000590876
-2 904 808 780 0.000590876
-3 904 808 780 779 0.000590876
-1 939 887 0.000592433
-2 954 939 887 0.000592433
-2 989 939 887 0.000592433
-3 989 954 939 887 0.000592433
-1 816 698 0.000592673
-2 816 698 263 0.000592673
-2 826 816 698 0.000592673
-3 826 816 698 263 0.000592673
-1 838 659 0.000593013
-2 838 659 622 0.000593013
-2 839 659 622 0.000593013
-2 839 838 659 0.000593013
-3 839 838 659 622 0.000593013
-2 838 659 420 0.000593175
-3 838 659 622 420 0.000593175
-1 751 89 0.000593255
-2 751 90 89 0.000593255
-2 751 566 89 0.000593255
-3 751 566 90 89 0.000593255
-1 905 592 0.000593284
-2 905 647 592 0.000593284
-2 905 896 592 0.000593284
-2 905 896 647 0.000593284
-3 905 896 647 592 0.000593284
-2 943 461 167 0.000593321
-3 943 552 461 167 0.000593321
-1 839 420 0.000593689
-2 839 659 420 0.000593689
-2 839 838 420 0.000593689
-3 839 838 659 420 0.000593689
-2 608 554 530 0.000593769
-3 608 554 530 439 0.000593769
-1 914 809 0.000593839
-2 914 809 481 0.000593839
-2 914 888 481 0.000593839
-2 914 888 809 0.000593839
-3 914 888 809 481 0.000593839
-2 925 817 426 0.00059398
-3 925 817 426 425 0.00059398
-1 972 887 0.000594004
-2 972 887 841 0.000594004
-2 972 945 887 0.000594004
-3 972 945 887 841 0.000594004
-2 780 779 617 0.000595138
-3 780 779 682 617 0.000595138
-1 770 730 0.000595436
-2 770 730 359 0.000595436
-2 980 770 730 0.000595436
-3 980 770 730 359 0.000595436
-1 352 169 0.000595486
-2 352 170 169 0.000595486
-2 352 244 169 0.000595486
-3 352 244 170 169 0.000595486
-2 757 744 602 0.000595531
-3 763 757 744 602 0.000595531
-1 306 285 0.000595536
-2 306 285 132 0.000595536
-2 306 287 285 0.000595536
-3 306 287 285 132 0.000595536
-1 605 358 0.00059658
-2 605 364 358 0.00059658
-2 605 604 358 0.00059658
-3 605 604 364 358 0.00059658
-2 317 250 33 0.00059662
-3 317 250 33 13 0.00059662
-1 846 766 0.000596682
-2 846 766 360 0.000596682
-2 846 766 491 0.000596682
-3 846 766 491 360 0.000596682
-1 597 515 0.000596933
-2 844 597 515 0.000596933
-2 889 597 515 0.000596933
-3 889 844 597 515 0.000596933
-1 750 89 0.000597014
-2 750 346 89 0.000597014
-2 750 566 89 0.000597014
-3 750 566 346 89 0.000597014
-2 981 862 508 0.000597206
-3 981 862 756 508 0.000597206
-1 994 911 0.000597489
-1 994 957 0.000597489
-2 994 957 911 0.000597489
-1 994 968 0.000597489
-2 994 968 911 0.000597489
-2 994 968 957 0.000597489
-3 994 968 957 911 0.000597489
-2 794 730 7 0.00059801
-3 794 730 729 7 0.00059801
-2 846 766 303 0.000598299
-3 846 766 360 303 0.000598299
-1 849 769 0.000598568
-2 849 769 767 0.000598568
-2 849 824 769 0.000598568
-3 849 824 769 767 0.000598568
-1 726 684 0.000598612
-2 861 726 684 0.000598612
-1 978 684 0.000598612
-2 978 726 684 0.000598612
-2 978 861 684 0.000598612
-3 978 861 726 684 0.000598612
-1 915 284 0.000598663
-2 915 635 284 0.000598663
-2 915 686 284 0.000598663
-3 915 686 635 284 0.000598663
-2 686 284 205 0.000599058
-3 686 590 284 205 0.000599058
-1 767 46 0.000599079
-2 767 373 46 0.000599079
-2 849 767 46 0.000599079
-3 849 767 373 46 0.000599079
-2 878 597 515 0.000599236
-3 889 878 597 515 0.000599236
-1 939 806 0.000600553
-2 939 887 806 0.000600553
-2 954 939 806 0.000600553
-3 954 939 887 806 0.000600553
-1 508 236 0.000601757
-2 508 492 236 0.000601757
-2 788 508 236 0.000601757
-3 788 508 492 236 0.000601757
-1 494 102 0.000602377
-2 494 432 102 0.000602377
-2 494 440 102 0.000602377
-3 494 440 432 102 0.000602377
-1 905 649 0.000602914
-2 905 649 448 0.000602914
-2 905 649 647 0.000602914
-3 905 649 647 448 0.000602914
-2 574 521 200 0.000603296
-3 574 521 201 200 0.000603296
-1 497 355 0.000603513
-2 499 497 355 0.000603513
-2 814 497 355 0.000603513
-3 814 499 497 355 0.000603513
-2 799 382 239 0.000604463
-3 799 382 239 237 0.000604463
-1 817 279 0.000605146
-2 817 667 279 0.000605146
-2 819 817 279 0.000605146
-3 819 817 667 279 0.000605146
-1 926 1 0.000605178
-2 926 3 1 0.000605178
-2 926 428 1 0.000605178
-3 926 428 3 1 0.000605178
-1 602 558 0.000605377
-2 602 558 432 0.000605377
-2 927 602 558 0.000605377
-3 927 602 558 432 0.000605377
-1 912 849 0.000605513
-2 912 849 769 0.000605513
-2 912 849 824 0.000605513
-3 912 849 824 769 0.000605513
-1 537 147 0.000605566
-2 537 210 147 0.000605566
-2 537 211 147 0.000605566
-3 537 211 210 147 0.000605566
-1 650 21 0.000605989
-2 650 24 21 0.000605989
-2 650 212 21 0.000605989
-3 650 212 24 21 0.000605989
-1 570 533 0.000606078
-2 570 533 18 0.000606078
-2 685 570 533 0.000606078
-3 685 570 533 18 0.000606078
-1 992 263 0.000606226
-2 992 879 263 0.000606226
-2 992 985 263 0.000606226
-3 992 985 879 263 0.000606226
-1 981 788 0.000606512
-2 981 788 508 0.000606512
-2 988 981 788 0.000606512
-3 988 981 788 508 0.000606512
-2 846 766 692 0.000606542
-3 846 766 692 491 0.000606542
-1 102 19 0.000606557
-2 432 102 19 0.000606557
-2 474 102 19 0.000606557
-3 474 432 102 19 0.000606557
-2 885 474 46 0.000606562
-3 885 474 138 46 0.000606562
-1 961 643 0.000606631
-2 961 670 643 0.000606631
-2 961 672 643 0.000606631
-3 961 672 670 643 0.000606631
-1 825 148 0.000606686
-2 825 506 148 0.000606686
-2 825 747 148 0.000606686
-3 825 747 506 148 0.000606686
-1 197 118 0.000607238
-2 366 197 118 0.000607238
-2 406 197 118 0.000607238
-3 406 366 197 118 0.000607238
-1 219 93 0.000607271
-2 478 219 93 0.000607271
-2 479 219 93 0.000607271
-3 479 478 219 93 0.000607271
-1 458 110 0.000607978
-2 461 458 110 0.000607978
-2 723 458 110 0.000607978
-3 723 461 458 110 0.000607978
-1 770 643 0.000608239
-2 770 643 603 0.000608239
-2 770 672 643 0.000608239
-3 770 672 643 603 0.000608239
-2 943 830 112 0.000608582
-3 943 831 830 112 0.000608582
-2 751 750 89 0.000608902
-3 751 750 566 89 0.000608902
-1 429 355 0.000609122
-2 499 429 355 0.000609122
-2 631 429 355 0.000609122
-3 631 499 429 355 0.000609122
-1 852 742 0.000609314
-2 852 742 602 0.000609314
-2 852 742 736 0.000609314
-3 852 742 736 602 0.000609314
-1 644 363 0.000609362
-2 644 603 363 0.000609362
-2 644 605 363 0.000609362
-3 644 605 603 363 0.000609362
-1 746 342 0.000609483
-2 746 342 203 0.000609483
-2 746 674 342 0.000609483
-3 746 674 342 203 0.000609483
-1 471 302 0.000609556
-2 471 302 301 0.000609556
-2 568 471 302 0.000609556
-3 568 471 302 301 0.000609556
-1 979 750 0.000609969
-2 979 750 507 0.000609969
-2 979 902 750 0.000609969
-3 979 902 750 507 0.000609969
-2 580 574 362 0.000610943
-3 930 580 574 362 0.000610943
-1 779 382 0.000611341
-2 779 475 382 0.000611341
-2 780 779 382 0.000611341
-3 780 779 475 382 0.000611341
-1 987 971 0.000611364
-2 987 971 926 0.000611364
-2 987 971 928 0.000611364
-3 987 971 928 926 0.000611364
-2 874 790 789 0.000611621
-3 986 874 790 789 0.000611621
-1 912 767 0.000611807
-2 912 769 767 0.000611807
-2 912 849 767 0.000611807
-3 912 849 769 767 0.000611807
-1 559 142 0.000611881
-2 559 144 142 0.000611881
-2 559 525 142 0.000611881
-3 559 525 144 142 0.000611881
-1 818 427 0.000612307
-2 818 427 425 0.000612307
-2 818 817 427 0.000612307
-3 818 817 427 425 0.000612307
-2 912 824 757 0.000612796
-3 912 824 768 757 0.000612796
-1 684 548 0.000613079
-2 684 548 128 0.000613079
-2 861 684 548 0.000613079
-3 861 684 548 128 0.000613079
-1 535 300 0.000613444
-2 535 322 300 0.000613444
-2 546 535 300 0.000613444
-3 546 535 322 300 0.000613444
-2 994 958 911 0.000613495
-2 994 958 957 0.000613495
-3 994 958 957 911 0.000613495
-2 497 429 355 0.000613532
-3 499 497 429 355 0.000613532
-2 605 580 363 0.000614018
-3 605 580 364 363 0.000614018
-1 990 437 0.000614585
-2 990 838 437 0.000614585
-2 990 869 437 0.000614585
-3 990 869 838 437 0.000614585
-1 886 46 0.000614636
-2 886 474 46 0.000614636
-2 886 885 46 0.000614636
-3 886 885 474 46 0.000614636
-2 989 972 887 0.000614823
-3 989 972 887 841 0.000614823
-1 749 578 0.000614884
-2 749 578 388 0.000614884
-2 749 578 493 0.000614884
-3 749 578 493 388 0.000614884
-1 811 416 0.000615123
-2 811 572 416 0.000615123
-2 811 585 416 0.000615123
-3 811 585 572 416 0.000615123
-1 652 304 0.000615569
-2 652 582 304 0.000615569
-2 884 652 304 0.000615569
-3 884 652 582 304 0.000615569
-1 220 103 0.00061578
-2 293 220 103 0.00061578
-2 478 220 103 0.00061578
-3 478 293 220 103 0.00061578
-1 914 871 0.000615811
-2 914 871 482 0.000615811
-2 914 871 870 0.000615811
-3 914 871 870 482 0.000615811
-1 847 777 0.00061587
-2 847 777 776 0.00061587
-2 847 790 777 0.00061587
-3 847 790 777 776 0.00061587
-2 941 561 144 0.000616075
-3 941 589 561 144 0.000616075
-1 623 419 0.000616288
-2 623 420 419 0.000616288
-2 623 422 419 0.000616288
-3 623 422 420 419 0.000616288
-2 847 777 718 0.000616583
-3 847 777 776 718 0.000616583
-1 762 578 0.000617054
-2 762 578 493 0.000617054
-2 762 749 578 0.000617054
-3 762 749 578 493 0.000617054
-2 943 597 167 0.000617056
-3 943 597 178 167 0.000617056
-2 749 578 309 0.000617702
-3 749 578 388 309 0.000617702
-2 859 535 300 0.000617804
-3 859 535 322 300 0.000617804
-1 38 29 0.000617911
-2 38 31 29 0.000617911
-2 137 38 29 0.000617911
-3 137 38 31 29 0.000617911
-1 990 610 0.00061829
-2 990 610 437 0.00061829
-2 990 869 610 0.00061829
-3 990 869 610 437 0.00061829
-1 617 599 0.000618594
-2 617 599 343 0.000618594
-2 896 617 599 0.000618594
-3 896 617 599 343 0.000618594
-2 862 597 515 0.000618871
-3 878 862 597 515 0.000618871
-1 247 236 0.000618947
-2 247 238 236 0.000618947
-2 492 247 236 0.000618947
-3 492 247 238 236 0.000618947
-1 723 109 0.000619158
-2 723 110 109 0.000619158
-1 907 109 0.000619158
-2 907 110 109 0.000619158
-2 907 723 109 0.000619158
-3 907 723 110 109 0.000619158
-1 908 1 0.00061919
-2 908 3 1 0.00061919
-2 926 908 1 0.00061919
-3 926 908 3 1 0.00061919
-1 989 806 0.000619252
-2 989 887 806 0.000619252
-2 989 939 806 0.000619252
-3 989 939 887 806 0.000619252
-1 574 304 0.000619472
-2 574 573 304 0.000619472
-2 712 574 304 0.000619472
-3 712 574 573 304 0.000619472
-1 586 527 0.000619754
-2 586 527 525 0.000619754
-2 741 586 527 0.000619754
-3 741 586 527 525 0.000619754
-2 927 558 3 0.000620129
-3 927 558 428 3 0.000620129
-1 753 25 0.000620288
-2 753 28 25 0.000620288
-2 753 752 25 0.000620288
-3 753 752 28 25 0.000620288
-1 905 144 0.00062064
-2 905 592 144 0.00062064
-2 905 647 144 0.00062064
-3 905 647 592 144 0.00062064
-1 867 108 0.000620778
-2 867 178 108 0.000620778
-2 867 675 108 0.000620778
-3 867 675 178 108 0.000620778
-1 867 206 0.000620856
-2 867 675 206 0.000620856
-2 867 836 206 0.000620856
-3 867 836 675 206 0.000620856
-1 304 79 0.00062156
-2 573 304 79 0.00062156
-2 582 304 79 0.00062156
-3 582 573 304 79 0.00062156
-1 683 600 0.00062237
-2 683 600 458 0.00062237
-2 683 600 463 0.00062237
-3 683 600 463 458 0.00062237
-1 684 550 0.000623716
-2 861 684 550 0.000623716
-2 978 684 550 0.000623716
-3 978 861 684 550 0.000623716
-2 827 555 425 0.000623722
-3 827 555 426 425 0.000623722
-2 681 616 562 0.00062384
-3 681 616 615 562 0.00062384
-2 747 537 147 0.000624042
-3 747 537 210 147 0.000624042
-1 718 276 0.000625236
-2 718 276 94 0.000625236
-2 718 276 95 0.000625236
-3 718 276 95 94 0.000625236
-1 587 379 0.000626075
-2 587 405 379 0.000626075
-2 793 587 379 0.000626075
-3 793 587 405 379 0.000626075
-2 955 247 238 0.000626277
-3 955 249 247 238 0.000626277
-1 905 599 0.000626419
-2 905 599 592 0.000626419
-2 905 896 599 0.000626419
-3 905 896 599 592 0.000626419
-1 878 124 0.000626996
-2 878 334 124 0.000626996
-2 878 378 124 0.000626996
-3 878 378 334 124 0.000626996
-1 406 177 0.000627272
-2 406 307 177 0.000627272
-2 407 406 177 0.000627272
-3 407 406 307 177 0.000627272
-1 631 497 0.00062734
-2 631 497 355 0.00062734
-2 631 497 429 0.00062734
-3 631 497 429 355 0.00062734
-1 948 224 0.000628499
-2 948 333 224 0.000628499
-2 948 924 224 0.000628499
-3 948 924 333 224 0.000628499
-1 875 796 0.000628556
-2 877 875 796 0.000628556
-2 913 875 796 0.000628556
-3 913 877 875 796 0.000628556
-1 330 177 0.000628739
-2 330 307 177 0.000628739
-2 380 330 177 0.000628739
-3 380 330 307 177 0.000628739
-1 967 685 0.000628965
-2 967 685 474 0.000628965
-2 967 685 533 0.000628965
-3 967 685 533 474 0.000628965
-1 912 533 0.000628975
-2 912 570 533 0.000628975
-2 912 685 533 0.000628975
-3 912 685 570 533 0.000628975
-1 911 732 0.000629116
-2 911 732 631 0.000629116
-2 911 806 631 0.000629116
-2 911 806 732 0.000629116
-3 911 806 732 631 0.000629116
-1 474 69 0.000629475
-2 474 70 69 0.000629475
-2 886 474 69 0.000629475
-3 886 474 70 69 0.000629475
-2 762 711 578 0.000630087
-3 762 711 578 493 0.000630087
-1 82 71 0.00063011
-2 82 71 68 0.00063011
-2 82 71 69 0.00063011
-3 82 71 69 68 0.00063011
-1 983 835 0.000630832
-2 983 982 835 0.000630832
-1 997 983 0.000630832
-2 997 983 835 0.000630832
-2 997 983 982 0.000630832
-3 997 983 982 835 0.000630832
-2 497 411 355 0.000630863
-3 814 497 411 355 0.000630863
-2 660 459 163 0.000631412
-3 660 473 459 163 0.000631412
-2 894 811 416 0.00063155
-3 894 811 585 416 0.00063155
-1 784 33 0.000631719
-2 784 317 33 0.000631719
-2 953 784 33 0.000631719
-3 953 784 317 33 0.000631719
-1 403 386 0.000632205
-2 403 386 275 0.000632205
-2 403 391 386 0.000632205
-3 403 391 386 275 0.000632205
-1 382 238 0.000632208
-2 382 239 238 0.000632208
-2 384 382 238 0.000632208
-3 384 382 239 238 0.000632208
-2 905 599 144 0.000632841
-3 905 599 592 144 0.000632841
-1 167 110 0.000634413
-2 461 167 110 0.000634413
-2 943 167 110 0.000634413
-3 943 461 167 110 0.000634413
-2 424 247 131 0.000634663
-3 424 247 131 130 0.000634663
-1 834 796 0.00063473
-2 834 797 796 0.00063473
-2 835 797 796 0.00063473
-2 835 834 796 0.00063473
-3 835 834 797 796 0.00063473
-2 886 884 46 0.000635008
-3 886 885 884 46 0.000635008
-1 558 102 0.00063564
-2 558 432 102 0.00063564
-2 558 494 102 0.00063564
-3 558 494 432 102 0.00063564
-1 554 336 0.000635694
-2 554 339 336 0.000635694
-2 554 529 336 0.000635694
-3 554 529 339 336 0.000635694
-1 939 911 0.000635793
-2 939 911 806 0.000635793
-2 954 939 911 0.000635793
-3 954 939 911 806 0.000635793
-2 878 509 124 0.000636135
-3 878 509 378 124 0.000636135
-1 907 458 0.000636649
-2 907 683 458 0.000636649
-2 907 723 458 0.000636649
-3 907 723 683 458 0.000636649
-1 558 440 0.000637553
-2 558 440 102 0.000637553
-2 558 494 440 0.000637553
-3 558 494 440 102 0.000637553
-2 474 101 69 0.000637684
-3 474 101 70 69 0.000637684
-1 726 550 0.000637725
-2 726 684 550 0.000637725
-2 978 726 550 0.000637725
-3 978 726 684 550 0.000637725
-1 981 236 0.000637782
-2 981 508 236 0.000637782
-2 981 788 236 0.000637782
-3 981 788 508 236 0.000637782
-1 920 79 0.000637838
-2 920 580 79 0.000637838
-2 920 582 79 0.000637838
-3 920 582 580 79 0.000637838
-2 912 767 373 0.000638147
-3 912 769 767 373 0.000638147
-1 594 324 0.00063866
-2 594 324 301 0.00063866
-2 594 324 303 0.00063866
-3 594 324 303 301 0.00063866
-1 752 27 0.000638746
-2 752 27 25 0.000638746
-2 752 660 27 0.000638746
-3 752 660 27 25 0.000638746
-1 870 727 0.000639424
-2 870 727 724 0.000639424
-1 899 727 0.000639424
-2 899 727 724 0.000639424
-2 899 870 727 0.000639424
-3 899 870 727 724 0.000639424
-2 587 379 181 0.000640016
-3 587 405 379 181 0.000640016
-1 226 197 0.000640126
-2 350 226 197 0.000640126
-2 407 226 197 0.000640126
-3 407 350 226 197 0.000640126
-2 939 937 911 0.000640263
-3 954 939 937 911 0.000640263
-1 938 911 0.000640674
-2 938 937 911 0.000640674
-2 958 938 911 0.000640674
-2 958 938 937 0.000640674
-3 958 938 937 911 0.000640674
-1 408 318 0.000641002
-2 408 318 183 0.000641002
-2 411 408 318 0.000641002
-3 411 408 318 183 0.000641002
-1 523 276 0.000643164
-2 523 276 95 0.000643164
-1 730 276 0.000643164
-2 730 276 95 0.000643164
-2 730 523 276 0.000643164
-3 730 523 276 95 0.000643164
-2 808 780 617 0.000643544
-3 808 780 779 617 0.000643544
-2 834 796 795 0.000644866
-2 834 797 795 0.000644866
-3 834 797 796 795 0.000644866
-1 458 109 0.000644994
-2 458 110 109 0.000644994
-2 723 458 109 0.000644994
-3 723 458 110 109 0.000644994
-1 825 147 0.000645189
-2 825 148 147 0.000645189
-2 825 747 147 0.000645189
-3 825 747 148 147 0.000645189
-1 795 489 0.000645216
-2 795 489 486 0.000645216
-2 795 489 487 0.000645216
-3 795 489 487 486 0.000645216
-2 594 324 323 0.000645286
-3 594 324 323 301 0.000645286
-1 793 181 0.000645469
-2 793 379 181 0.000645469
-2 793 587 181 0.000645469
-3 793 587 379 181 0.000645469
-2 907 458 109 0.00064564
-3 907 723 458 109 0.00064564
-1 874 527 0.000645752
-2 874 741 527 0.000645752
-2 874 791 527 0.000645752
-3 874 791 741 527 0.000645752
-1 435 291 0.00064709
-2 435 291 211 0.00064709
-2 435 292 291 0.00064709
-3 435 292 291 211 0.00064709
-1 956 928 0.000647579
-2 956 928 852 0.000647579
-2 956 928 883 0.000647579
-3 956 928 883 852 0.000647579
-1 867 496 0.00064772
-2 867 496 108 0.00064772
-2 867 496 178 0.00064772
-3 867 496 178 108 0.00064772
-1 197 62 0.000647988
-2 197 118 62 0.000647988
-2 366 197 62 0.000647988
-3 366 197 118 62 0.000647988
-1 912 46 0.000648641
-2 912 373 46 0.000648641
-2 912 767 46 0.000648641
-3 912 767 373 46 0.000648641
-1 953 217 0.000649064
-2 953 217 187 0.000649064
-2 953 783 217 0.000649064
-3 953 783 217 187 0.000649064
-1 567 532 0.000651177
-2 567 533 532 0.000651177
-2 764 533 532 0.000651177
-2 764 567 532 0.000651177
-3 764 567 533 532 0.000651177
-1 859 546 0.000652078
-2 859 546 300 0.000652078
-2 859 546 535 0.000652078
-3 859 546 535 300 0.000652078
-1 586 251 0.000653223
-2 586 251 250 0.000653223
-2 586 379 251 0.000653223
-3 586 379 251 250 0.000653223
-1 852 558 0.000653454
-2 852 602 558 0.000653454
-2 927 852 558 0.000653454
-3 927 852 602 558 0.000653454
-2 859 507 360 0.000653712
-3 859 507 491 360 0.000653712
-1 683 74 0.000654118
-2 683 458 74 0.000654118
-2 683 600 74 0.000654118
-3 683 600 458 74 0.000654118
-1 697 421 0.000654529
-2 697 531 421 0.000654529
-2 697 679 421 0.000654529
-3 697 679 531 421 0.000654529
-2 953 810 217 0.00065479
-3 953 810 217 187 0.00065479
-1 321 33 0.000655451
-2 321 84 33 0.000655451
-2 454 321 33 0.000655451
-3 454 321 84 33 0.000655451
-2 874 789 527 0.000656214
-3 874 791 789 527 0.000656214
-1 852 3 0.000656783
-2 927 852 3 0.000656783
-2 928 852 3 0.000656783
-3 928 927 852 3 0.000656783
-1 825 537 0.000656869
-2 825 767 537 0.000656869
-2 849 825 537 0.000656869
-3 849 825 767 537 0.000656869
-1 984 597 0.000657083
-2 984 832 597 0.000657083
-2 984 844 597 0.000657083
-3 984 844 832 597 0.000657083
-1 255 218 0.000657653
-2 255 218 134 0.000657653
-2 255 254 218 0.000657653
-3 255 254 218 134 0.000657653
-1 718 521 0.000658103
-2 718 521 198 0.000658103
-2 718 521 200 0.000658103
-3 718 521 200 198 0.000658103
-1 909 3 0.000658187
-2 909 908 3 0.000658187
-2 928 909 3 0.000658187
-3 928 909 908 3 0.000658187
-1 408 355 0.000658246
-2 408 355 318 0.000658246
-2 411 408 355 0.000658246
-3 411 408 355 318 0.000658246
-1 820 586 0.000658447
-2 820 588 586 0.000658447
-2 820 759 586 0.000658447
-3 820 759 588 586 0.000658447
-1 410 355 0.000658772
-2 411 410 355 0.000658772
-2 497 410 355 0.000658772
-3 497 411 410 355 0.000658772
-1 648 165 0.0006596
-2 941 648 165 0.0006596
-1 975 648 0.0006596
-2 975 648 165 0.0006596
-2 975 941 648 0.0006596
-3 975 941 648 165 0.0006596
-1 914 279 0.000659617
-2 914 809 279 0.000659617
-2 914 888 279 0.000659617
-3 914 888 809 279 0.000659617
-1 479 94 0.000659638
-2 479 94 93 0.000659638
-2 789 94 93 0.000659638
-2 789 479 94 0.000659638
-3 789 479 94 93 0.000659638
-1 538 435 0.00066076
-2 538 435 136 0.00066076
-2 538 435 255 0.00066076
-3 538 435 255 136 0.00066076
-2 649 648 165 0.000660875
-2 975 649 648 0.000660875
-3 975 649 648 165 0.000660875
-1 812 258 0.000661114
-2 812 258 125 0.000661114
-2 812 258 161 0.000661114
-3 812 258 161 125 0.000661114
-2 985 959 262 0.000662076
-3 985 963 959 262 0.000662076
-2 825 747 537 0.000662544
-3 825 767 747 537 0.000662544
-2 912 849 46 0.000662572
-3 912 849 767 46 0.000662572
-2 631 497 279 0.000663516
-3 631 497 429 279 0.000663516
-2 555 427 425 0.000663772
-3 555 427 425 424 0.000663772
-1 984 112 0.000663924
-1 984 830 0.000663924
-2 984 830 112 0.000663924
-2 984 832 112 0.000663924
-2 984 832 830 0.000663924
-3 984 832 830 112 0.000663924
-1 579 341 0.000664959
-2 579 341 335 0.000664959
-2 579 341 339 0.000664959
-3 579 341 339 335 0.000664959
-2 737 718 521 0.000665472
-3 737 718 521 198 0.000665472
-2 789 276 94 0.000666442
-3 789 276 94 93 0.000666442
-2 546 471 302 0.000668311
-3 546 471 302 301 0.000668311
-1 645 603 0.00066885
-2 645 643 603 0.00066885
-2 645 644 603 0.00066885
-3 645 644 643 603 0.00066885
-2 939 938 911 0.000669011
-3 939 938 937 911 0.000669011
-1 918 420 0.000669504
-1 918 421 0.000669504
-2 918 421 420 0.000669504
-2 918 422 420 0.000669504
-2 918 422 421 0.000669504
-3 918 422 421 420 0.000669504
-1 827 817 0.000670061
-2 827 817 426 0.000670061
-2 925 827 817 0.000670061
-3 925 827 817 426 0.000670061
-1 701 199 0.000670298
-2 701 639 199 0.000670298
-2 718 701 199 0.000670298
-3 718 701 639 199 0.000670298
-1 977 550 0.000671122
-2 977 726 550 0.000671122
-2 978 977 550 0.000671122
-3 978 977 726 550 0.000671122
-1 753 27 0.000671674
-2 753 27 25 0.000671674
-2 753 752 27 0.000671674
-3 753 752 27 25 0.000671674
-1 904 617 0.000672283
-2 904 780 617 0.000672283
-2 904 808 617 0.000672283
-3 904 808 780 617 0.000672283
-1 914 727 0.000672334
-2 914 870 727 0.000672334
-2 914 899 727 0.000672334
-3 914 899 870 727 0.000672334
-1 255 216 0.000672457
-2 255 216 134 0.000672457
-2 255 218 216 0.000672457
-3 255 218 216 134 0.000672457
-1 406 62 0.000672513
-2 406 118 62 0.000672513
-2 406 197 62 0.000672513
-3 406 197 118 62 0.000672513
-1 808 599 0.000672544
-2 808 613 599 0.000672544
-2 933 808 599 0.000672544
-3 933 808 613 599 0.000672544
-2 683 600 462 0.000672547
-3 683 600 463 462 0.000672547
-1 435 216 0.000672757
-2 435 216 188 0.000672757
-2 435 268 216 0.000672757
-3 435 268 216 188 0.000672757
-2 428 38 31 0.000672874
-3 428 63 38 31 0.000672874
-1 451 276 0.000672943
-2 730 451 276 0.000672943
-2 794 451 276 0.000672943
-2 794 730 276 0.000672943
-3 794 730 451 276 0.000672943
-1 597 112 0.000673093
-2 830 597 112 0.000673093
-2 943 597 112 0.000673093
-3 943 830 597 112 0.000673093
-2 984 830 597 0.000673254
-3 984 832 830 597 0.000673254
-1 660 43 0.000673745
-2 660 163 43 0.000673745
-2 660 510 43 0.000673745
-3 660 510 163 43 0.000673745
-2 977 550 549 0.000673856
-2 978 550 549 0.000673856
-3 978 977 550 549 0.000673856
-2 914 809 547 0.000673955
-3 914 809 547 481 0.000673955
-1 567 445 0.000674149
-2 567 465 445 0.000674149
-2 595 567 445 0.000674149
-3 595 567 465 445 0.000674149
-2 760 758 669 0.000674633
-3 847 760 758 669 0.000674633
-2 984 597 112 0.000675341
-3 984 830 597 112 0.000675341
-2 746 674 283 0.000675345
-3 746 674 476 283 0.000675345
-1 993 428 0.000675612
-2 993 857 428 0.000675612
-2 993 987 428 0.000675612
-3 993 987 857 428 0.000675612
-1 586 142 0.000676106
-2 586 251 142 0.000676106
-2 586 379 142 0.000676106
-3 586 379 251 142 0.000676106
-2 684 550 548 0.000677112
-3 861 684 550 548 0.000677112
-1 793 611 0.000677494
-2 793 611 181 0.000677494
-2 793 611 379 0.000677494
-3 793 611 379 181 0.000677494
-2 825 537 147 0.000677646
-3 825 747 537 147 0.000677646
-1 558 0 0.000678075
-2 558 3 0 0.000678075
-2 558 177 0 0.000678075
-3 558 177 3 0 0.000678075
-1 165 144 0.00067829
-2 561 165 144 0.00067829
-2 941 165 144 0.00067829
-3 941 561 165 144 0.00067829
-2 718 521 95 0.000678747
-3 737 718 521 95 0.000678747
-1 825 211 0.000679036
-2 825 211 147 0.000679036
-2 825 537 211 0.000679036
-3 825 537 211 147 0.000679036
-1 864 71 0.000679383
-2 864 71 69 0.000679383
-2 864 245 71 0.000679383
-3 864 245 71 69 0.000679383
-1 967 374 0.000679668
-2 967 474 374 0.000679668
-2 967 685 374 0.000679668
-3 967 685 474 374 0.000679668
-2 559 165 144 0.000679825
-3 561 559 165 144 0.000679825
-1 553 530 0.000679991
-2 554 553 530 0.000679991
-2 608 553 530 0.000679991
-3 608 554 553 530 0.000679991
-2 753 660 27 0.00068021
-3 753 752 660 27 0.00068021
-2 808 634 599 0.000680215
-3 808 634 613 599 0.000680215
-1 983 834 0.000680859
-2 983 835 834 0.000680859
-2 997 983 834 0.000680859
-3 997 983 835 834 0.000680859
-1 853 148 0.000680987
-2 853 506 148 0.000680987
-2 853 825 148 0.000680987
-3 853 825 506 148 0.000680987
-2 816 579 341 0.000681608
-3 816 579 341 335 0.000681608
-1 701 201 0.000682102
-2 701 201 200 0.000682102
-2 894 701 201 0.000682102
-3 894 701 201 200 0.000682102
-2 735 728 455 0.000682844
-3 735 728 705 455 0.000682844
-2 874 586 527 0.000683355
-3 874 741 586 527 0.000683355
-2 574 304 79 0.000683466
-3 574 573 304 79 0.000683466
-1 772 507 0.00068409
-2 772 507 72 0.00068409
-2 772 507 90 0.00068409
-3 772 507 90 72 0.00068409
-2 878 125 124 0.000684385
-3 878 509 125 124 0.000684385
-2 912 374 46 0.000684594
-3 912 374 373 46 0.000684594
-1 879 262 0.000684604
-2 879 263 262 0.000684604
-2 879 697 262 0.000684604
-3 879 697 263 262 0.000684604
-1 810 534 0.000684745
-2 953 810 534 0.000684745
-2 974 810 534 0.000684745
-2 974 953 534 0.000684745
-3 974 953 810 534 0.000684745
-2 864 654 71 0.000685103
-3 864 654 245 71 0.000685103
-2 410 408 355 0.000685133
-3 411 410 408 355 0.000685133
-1 433 262 0.000685384
-1 882 433 0.000685384
-2 882 433 262 0.000685384
-1 907 433 0.000685384
-2 907 433 262 0.000685384
-2 907 882 433 0.000685384
-3 907 882 433 262 0.000685384
-1 558 532 0.000686327
-2 558 532 432 0.000686327
-2 602 558 532 0.000686327
-3 602 558 532 432 0.000686327
-1 972 842 0.000686636
-2 972 887 842 0.000686636
-2 972 945 842 0.000686636
-3 972 945 887 842 0.000686636
-2 791 479 94 0.000687695
-3 791 789 479 94 0.000687695
-2 435 291 268 0.0006877
-3 435 292 291 268 0.0006877
-1 262 109 0.000688105
-2 433 262 109 0.000688105
-2 907 262 109 0.000688105
-2 907 433 109 0.000688105
-3 907 433 262 109 0.000688105
-1 790 479 0.000688702
-2 790 635 479 0.000688702
-2 791 790 479 0.000688702
-3 791 790 635 479 0.000688702
-1 966 796 0.000688991
-2 966 875 796 0.000688991
-2 966 877 796 0.000688991
-3 966 877 875 796 0.000688991
-1 993 938 0.000689682
-1 994 993 0.000689682
-2 994 993 938 0.000689682
-1 995 993 0.000689682
-2 995 993 938 0.000689682
-2 995 994 993 0.000689682
-3 995 994 993 938 0.000689682
-2 852 558 3 0.00068988
-3 927 852 558 3 0.00068988
-2 508 492 247 0.000689959
-3 508 492 248 247 0.000689959
-1 318 144 0.000689985
-2 318 182 144 0.000689985
-2 318 183 144 0.000689985
-3 318 183 182 144 0.000689985
-2 799 382 238 0.000690665
-3 799 382 239 238 0.000690665
-1 912 782 0.000690682
-2 912 782 46 0.000690682
-2 912 849 782 0.000690682
-3 912 849 782 46 0.000690682
-1 283 11 0.000691518
-2 283 281 11 0.000691518
-2 299 283 11 0.000691518
-3 299 283 281 11 0.000691518
-1 810 454 0.000692473
-2 810 760 454 0.000692473
-2 974 810 454 0.000692473
-2 974 810 760 0.000692473
-3 974 810 760 454 0.000692473
-1 359 276 0.000692487
-2 523 359 276 0.000692487
-2 730 359 276 0.000692487
-3 730 523 359 276 0.000692487
-1 934 808 0.000692738
-2 934 808 807 0.000692738
-2 934 933 808 0.000692738
-3 934 933 808 807 0.000692738
-1 494 117 0.000693007
-2 494 381 117 0.000693007
-2 494 440 117 0.000693007
-3 494 440 381 117 0.000693007
-1 177 172 0.000693008
-2 307 177 172 0.000693008
-2 330 177 172 0.000693008
-3 330 307 177 172 0.000693008
-2 435 216 134 0.000694244
-3 435 216 188 134 0.000694244
-1 736 340 0.000694634
-2 736 456 340 0.000694634
-2 736 705 340 0.000694634
-3 736 705 456 340 0.000694634
-1 931 766 0.000694853
-2 931 766 751 0.000694853
-2 931 766 765 0.000694853
-3 931 766 765 751 0.000694853
-1 803 199 0.000696696
-2 803 701 199 0.000696696
-2 803 718 199 0.000696696
-3 803 718 701 199 0.000696696
-1 533 432 0.000696807
-2 533 432 19 0.000696807
-2 533 532 432 0.000696807
-3 533 532 432 19 0.000696807
-2 914 631 279 0.000698497
-3 914 888 631 279 0.000698497
-1 961 770 0.000700003
-2 961 770 643 0.000700003
-2 961 770 672 0.000700003
-3 961 770 672 643 0.000700003
-1 406 226 0.000700322
-2 406 226 177 0.000700322
-2 407 406 226 0.000700322
-3 407 406 226 177 0.000700322
-1 860 28 0.000700604
-2 860 753 28 0.000700604
-2 952 860 28 0.000700604
-3 952 860 753 28 0.000700604
-2 912 824 782 0.000701583
-3 912 849 824 782 0.000701583
-1 921 817 0.000702157
-2 921 827 817 0.000702157
-2 925 921 817 0.000702157
-3 925 921 827 817 0.000702157
-1 247 42 0.000702395
-2 247 42 40 0.000702395
-2 423 247 42 0.000702395
-3 423 247 42 40 0.000702395
-1 953 321 0.000702998
-2 953 534 321 0.000702998
-2 974 953 321 0.000702998
-3 974 953 534 321 0.000702998
-1 611 587 0.000703583
-2 611 587 181 0.000703583
-2 793 611 587 0.000703583
-3 793 611 587 181 0.000703583
-1 586 559 0.00070431
-2 586 559 525 0.00070431
-2 586 559 527 0.00070431
-3 586 559 527 525 0.00070431
-1 983 911 0.000704561
-2 983 911 834 0.000704561
-2 997 983 911 0.000704561
-3 997 983 911 834 0.000704561
-1 559 75 0.000704911
-2 559 173 75 0.000704911
-2 559 174 75 0.000704911
-3 559 174 173 75 0.000704911
-2 930 706 605 0.000705202
-3 930 706 605 580 0.000705202
-2 408 318 144 0.000705855
-3 408 318 183 144 0.000705855
-1 802 448 0.000706255
-2 802 449 448 0.000706255
-2 802 618 448 0.000706255
-3 802 618 449 448 0.000706255
-2 994 938 911 0.000706519
-3 994 958 938 911 0.000706519
-2 736 683 340 0.000707021
-3 736 705 683 340 0.000707021
-1 902 643 0.000707299
-2 902 670 643 0.000707299
-2 961 902 643 0.000707299
-3 961 902 670 643 0.000707299
-2 909 852 3 0.000707499
-3 928 909 852 3 0.000707499
-1 992 262 0.000707684
-2 992 263 262 0.000707684
-2 992 985 262 0.000707684
-3 992 985 263 262 0.000707684
-2 867 598 496 0.000707756
-3 867 598 496 178 0.000707756
-2 508 247 42 0.000708044
-3 508 423 247 42 0.000708044
-1 853 147 0.000708325
-2 853 148 147 0.000708325
-2 853 825 147 0.000708325
-3 853 825 148 147 0.000708325
-1 355 144 0.000709201
-2 355 318 144 0.000709201
-2 408 355 144 0.000709201
-3 408 355 318 144 0.000709201
-1 871 727 0.000709205
-2 871 870 727 0.000709205
-2 914 871 727 0.000709205
-3 914 871 870 727 0.000709205
-1 352 149 0.00070929
-2 352 170 149 0.00070929
-2 352 290 149 0.00070929
-3 352 290 170 149 0.00070929
-1 186 46 0.000709601
-2 186 47 46 0.000709601
-2 186 184 46 0.000709601
-3 186 184 47 46 0.000709601
-1 497 408 0.000709637
-2 497 410 408 0.000709637
-2 934 497 408 0.000709637
-3 934 497 410 408 0.000709637
-1 744 568 0.000709683
-2 744 568 462 0.000709683
-2 744 568 567 0.000709683
-3 744 568 567 462 0.000709683
-1 874 847 0.00070971
-2 874 847 759 0.00070971
-2 874 847 790 0.00070971
-3 874 847 790 759 0.00070971
-1 965 875 0.000709904
-1 965 913 0.000709904
-2 965 913 875 0.000709904
-1 982 875 0.000709904
-2 982 913 875 0.000709904
-2 982 965 875 0.000709904
-2 982 965 913 0.000709904
-3 982 965 913 875 0.000709904
-1 54 1 0.000710006
-2 54 1 0 0.000710006
-2 54 2 1 0.000710006
-3 54 2 1 0 0.000710006
-1 406 32 0.000710623
-2 406 177 32 0.000710623
-2 406 226 32 0.000710623
-3 406 226 177 32 0.000710623
-1 533 102 0.000710992
-2 533 102 19 0.000710992
-2 533 474 102 0.000710992
-3 533 474 102 19 0.000710992
-1 498 430 0.000711337
-2 498 497 430 0.000711337
-2 668 498 430 0.000711337
-3 668 498 497 430 0.000711337
-1 874 94 0.000711824
-2 874 789 94 0.000711824
-2 874 790 94 0.000711824
-3 874 790 789 94 0.000711824
-1 580 304 0.000712486
-2 580 304 79 0.000712486
-2 580 574 304 0.000712486
-3 580 574 304 79 0.000712486
-1 177 120 0.000714491
-1 177 132 0.000714491
-2 177 132 120 0.000714491
-2 177 172 120 0.000714491
-2 177 172 132 0.000714491
-3 177 172 132 120 0.000714491
-2 721 677 516 0.000714878
-3 721 677 517 516 0.000714878
-1 959 433 0.000714912
-2 959 433 262 0.000714912
-2 959 882 433 0.000714912
-3 959 882 433 262 0.000714912
-1 967 46 0.000715201
-2 967 374 46 0.000715201
-2 967 474 46 0.000715201
-3 967 474 374 46 0.000715201
-1 847 94 0.000716345
-2 847 718 94 0.000716345
-2 847 777 94 0.000716345
-3 847 777 718 94 0.000716345
-1 644 580 0.00071644
-2 644 605 580 0.00071644
-2 920 644 580 0.00071644
-3 920 644 605 580 0.00071644
-1 645 535 0.000716723
-2 859 645 535 0.000716723
-2 865 645 535 0.000716723
-3 865 859 645 535 0.000716723
-1 559 379 0.000716922
-2 559 379 142 0.000716922
-2 559 525 379 0.000716922
-3 559 525 379 142 0.000716922
-1 177 156 0.00071732
-2 307 177 156 0.00071732
-2 406 177 156 0.00071732
-3 406 307 177 156 0.00071732
-2 177 172 156 0.000717621
-3 307 177 172 156 0.000717621
-1 967 886 0.000717762
-2 967 886 46 0.000717762
-2 967 886 474 0.000717762
-3 967 886 474 46 0.000717762
-2 753 657 27 0.000717996
-3 753 660 657 27 0.000717996
-2 648 165 144 0.000718055
-3 941 648 165 144 0.000718055
-1 533 374 0.00071839
-2 685 533 374 0.00071839
-2 912 533 374 0.00071839
-3 912 685 533 374 0.00071839
-2 992 879 262 0.000718617
-3 992 879 263 262 0.000718617
-2 750 466 89 0.000718952
-3 750 466 346 89 0.000718952
-1 982 796 0.000719103
-2 982 835 796 0.000719103
-2 982 913 796 0.000719103
-3 982 913 835 796 0.000719103
-1 981 618 0.000719352
-2 981 618 236 0.000719352
-2 981 788 618 0.000719352
-3 981 788 618 236 0.000719352
-1 352 288 0.000719969
-2 352 289 288 0.000719969
-2 352 290 288 0.000719969
-3 352 290 289 288 0.000719969
-1 494 330 0.000720634
-2 494 330 177 0.000720634
-2 494 380 330 0.000720634
-3 494 380 330 177 0.000720634
-2 967 533 374 0.000721343
-3 967 685 533 374 0.000721343
-2 847 790 94 0.00072197
-3 847 790 777 94 0.00072197
-1 965 796 0.000722221
-2 965 875 796 0.000722221
-2 965 913 796 0.000722221
-3 965 913 875 796 0.000722221
-1 654 404 0.000723481
-2 654 404 68 0.000723481
-2 717 654 404 0.000723481
-3 717 654 404 68 0.000723481
-2 554 530 336 0.00072371
-3 554 530 529 336 0.00072371
-2 982 965 796 0.000725454
-3 982 965 913 796 0.000725454
-1 156 32 0.000725698
-2 177 156 32 0.000725698
-2 406 156 32 0.000725698
-3 406 177 156 32 0.000725698
-2 497 408 355 0.000726003
-3 497 410 408 355 0.000726003
-1 437 336 0.000726698
-2 530 437 336 0.000726698
-2 531 437 336 0.000726698
-3 531 530 437 336 0.000726698
-1 172 32 0.00072684
-2 172 156 32 0.00072684
-2 177 172 32 0.00072684
-3 177 172 156 32 0.00072684
-2 586 559 379 0.000727009
-3 586 559 525 379 0.000727009
-1 890 878 0.000727642
-2 890 878 843 0.000727642
-2 890 889 878 0.000727642
-3 890 889 878 843 0.000727642
-2 753 28 27 0.000727907
-3 753 28 27 25 0.000727907
-1 746 299 0.000728783
-2 746 299 282 0.000728783
-2 746 299 284 0.000728783
-3 746 299 284 282 0.000728783
-1 171 149 0.000729078
-2 171 170 149 0.000729078
-2 506 171 149 0.000729078
-3 506 171 170 149 0.000729078
-1 853 796 0.000729213
-2 877 853 796 0.000729213
-2 966 853 796 0.000729213
-3 966 877 853 796 0.000729213
-1 617 238 0.000729969
-2 617 239 238 0.000729969
-2 780 617 238 0.000729969
-3 780 617 239 238 0.000729969
-1 964 304 0.000730729
-2 964 582 304 0.000730729
-2 964 652 304 0.000730729
-3 964 652 582 304 0.000730729
-1 683 310 0.0007308
-2 683 310 74 0.0007308
-2 683 458 310 0.0007308
-3 683 458 310 74 0.0007308
-1 933 144 0.00073103
-2 933 408 144 0.00073103
-2 933 637 144 0.00073103
-3 933 637 408 144 0.00073103
-1 825 796 0.000731338
-2 825 796 354 0.000731338
-2 877 825 796 0.000731338
-3 877 825 796 354 0.000731338
-2 634 617 599 0.000731541
-3 634 617 599 343 0.000731541
-1 120 32 0.000731692
-2 172 120 32 0.000731692
-2 177 120 32 0.000731692
-3 177 172 120 32 0.000731692
-1 832 433 0.000732182
-2 832 433 112 0.000732182
-1 984 433 0.000732182
-2 984 433 112 0.000732182
-2 984 832 433 0.000732182
-3 984 832 433 112 0.000732182
-1 857 796 0.000732612
-2 965 857 796 0.000732612
-2 982 857 796 0.000732612
-3 982 965 857 796 0.000732612
-1 802 508 0.000733195
-2 862 802 508 0.000733195
-2 981 802 508 0.000733195
-3 981 862 802 508 0.000733195
-2 964 884 304 0.000733242
-3 964 884 652 304 0.000733242
-1 884 186 0.000733289
-2 884 186 47 0.000733289
-2 884 304 186 0.000733289
-3 884 304 186 47 0.000733289
-1 983 428 0.000733499
-2 983 857 428 0.000733499
-2 993 983 428 0.000733499
-3 993 983 857 428 0.000733499
-1 597 110 0.000733637
-2 597 112 110 0.000733637
-2 943 597 110 0.000733637
-3 943 597 112 110 0.000733637
-1 362 200 0.000734487
-2 521 362 200 0.000734487
-2 574 362 200 0.000734487
-3 574 521 362 200 0.000734487
-2 853 825 796 0.000734819
-3 877 853 825 796 0.000734819
-2 905 617 599 0.00073493
-3 905 896 617 599 0.00073493
-1 321 250 0.000735009
-2 321 250 84 0.000735009
-2 588 321 250 0.000735009
-3 588 321 250 84 0.000735009
-1 630 425 0.000736233
-2 630 555 425 0.000736233
-2 827 630 425 0.000736233
-3 827 630 555 425 0.000736233
-1 567 474 0.000736945
-2 764 567 474 0.000736945
-2 967 567 474 0.000736945
-3 967 764 567 474 0.000736945
-2 597 167 110 0.000737786
-3 943 597 167 110 0.000737786
-1 310 144 0.000738642
-2 310 165 144 0.000738642
-2 559 310 144 0.000738642
-3 559 310 165 144 0.000738642
-1 567 302 0.000738983
-2 567 471 302 0.000738983
-2 568 567 302 0.000738983
-3 568 567 471 302 0.000738983
-0 998 0.0007403
-1 998 842 0.0007403
-1 998 945 0.0007403
-2 998 945 842 0.0007403
-1 998 972 0.0007403
-2 998 972 842 0.0007403
-2 998 972 945 0.0007403
-3 998 972 945 842 0.0007403
-1 893 3 0.000742109
-2 908 893 3 0.000742109
-2 909 893 3 0.000742109
-3 909 908 893 3 0.000742109
-2 494 380 117 0.000742115
-3 494 381 380 117 0.000742115
-1 946 842 0.000742316
-2 946 945 842 0.000742316
-1 947 842 0.000742316
-2 947 945 842 0.000742316
-2 947 946 842 0.000742316
-3 947 946 945 842 0.000742316
-1 617 236 0.000742706
-2 617 239 236 0.000742706
-2 618 617 236 0.000742706
-3 618 617 239 236 0.000742706
-1 979 643 0.000743412
-2 979 670 643 0.000743412
-2 979 902 643 0.000743412
-3 979 902 670 643 0.000743412
-2 808 617 599 0.000743981
-3 808 634 617 599 0.000743981
-1 864 46 0.000744101
-2 884 864 46 0.000744101
-2 886 864 46 0.000744101
-3 886 884 864 46 0.000744101
-1 558 533 0.000744257
-2 558 533 432 0.000744257
-2 558 533 532 0.000744257
-3 558 533 532 432 0.000744257
-1 559 74 0.000744453
-2 559 75 74 0.000744453
-2 559 174 74 0.000744453
-3 559 174 75 74 0.000744453
-1 533 46 0.000744731
-2 533 374 46 0.000744731
-2 912 533 46 0.000744731
-3 912 533 374 46 0.000744731
-1 925 480 0.000744763
-2 925 482 480 0.000744763
-2 925 921 480 0.000744763
-3 925 921 482 480 0.000744763
-1 523 200 0.000745028
-2 523 362 200 0.000745028
-2 523 521 200 0.000745028
-3 523 521 362 200 0.000745028
-1 574 363 0.00074616
-2 574 363 362 0.00074616
-2 580 574 363 0.00074616
-3 580 574 363 362 0.00074616
-2 967 533 46 0.000746513
-3 967 533 374 46 0.000746513
-2 594 472 323 0.000746686
-3 594 472 471 323 0.000746686
-1 851 3 0.000746879
-2 852 851 3 0.000746879
-2 909 851 3 0.000746879
-3 909 852 851 3 0.000746879
-1 847 276 0.000747079
-2 847 276 94 0.000747079
-2 847 718 276 0.000747079
-3 847 718 276 94 0.000747079
-1 993 911 0.000747332
-1 993 968 0.000747332
-2 993 968 911 0.000747332
-2 994 993 911 0.000747332
-2 994 993 968 0.000747332
-3 994 993 968 911 0.000747332
-1 777 479 0.00074751
-2 790 777 479 0.00074751
-2 791 777 479 0.00074751
-3 791 790 777 479 0.00074751
-1 897 21 0.000747727
-2 897 22 21 0.000747727
-2 897 24 21 0.000747727
-3 897 24 22 21 0.000747727
-1 132 32 0.000747753
-2 132 120 32 0.000747753
-2 177 132 32 0.000747753
-3 177 132 120 32 0.000747753
-1 875 857 0.000748029
-2 965 875 857 0.000748029
-2 966 875 857 0.000748029
-2 966 965 875 0.000748029
-3 966 965 875 857 0.000748029
-1 912 783 0.000748242
-2 912 783 782 0.000748242
-2 912 824 783 0.000748242
-3 912 824 783 782 0.000748242
-1 772 751 0.000748529
-2 772 751 90 0.000748529
-2 772 751 507 0.000748529
-3 772 751 507 90 0.000748529
-1 898 234 0.000748651
-2 898 829 234 0.000748651
-2 898 845 234 0.000748651
-3 898 845 829 234 0.000748651
-2 55 38 29 0.000749175
-3 137 55 38 29 0.000749175
-2 156 120 32 0.00074925
-3 172 156 120 32 0.00074925
-1 964 79 0.000749274
-2 964 582 79 0.000749274
-2 964 920 79 0.000749274
-3 964 920 582 79 0.000749274
-1 983 431 0.00074929
-2 983 857 431 0.00074929
-2 983 965 431 0.00074929
-3 983 965 857 431 0.00074929
-2 875 857 796 0.000749725
-3 965 875 857 796 0.000749725
-2 777 479 94 0.000750005
-3 791 777 479 94 0.000750005
-1 998 946 0.000750041
-2 998 946 842 0.000750041
-2 998 946 945 0.000750041
-3 998 946 945 842 0.000750041
-1 551 420 0.000750229
-2 659 551 420 0.000750229
-2 839 551 420 0.000750229
-3 839 659 551 420 0.000750229
-2 993 938 911 0.0007505
-3 994 993 938 911 0.0007505
-1 649 144 0.000750869
-2 649 647 144 0.000750869
-2 649 648 144 0.000750869
-3 649 648 647 144 0.000750869
-1 306 177 0.000751388
-2 306 177 172 0.000751388
-2 330 306 177 0.000751388
-3 330 306 177 172 0.000751388
-1 860 624 0.000751665
-2 860 624 28 0.000751665
-2 952 860 624 0.000751665
-3 952 860 624 28 0.000751665
-1 759 527 0.000752004
-2 759 586 527 0.000752004
-2 874 759 527 0.000752004
-3 874 759 586 527 0.000752004
-1 871 547 0.000753315
-2 871 547 482 0.000753315
-2 921 871 547 0.000753315
-3 921 871 547 482 0.000753315
-2 613 484 205 0.000754434
-3 613 484 205 64 0.000754434
-1 695 651 0.000755126
-2 695 651 212 0.000755126
-2 695 651 625 0.000755126
-3 695 651 625 212 0.000755126
-2 559 310 74 0.000755401
-3 559 310 174 74 0.000755401
-2 853 506 147 0.000756014
-3 853 506 148 147 0.000756014
-2 802 597 448 0.000756438
-3 802 597 449 448 0.000756438
-2 964 304 79 0.000756462
-3 964 582 304 79 0.000756462
-2 649 165 144 0.000757344
-3 649 648 165 144 0.000757344
-1 255 215 0.000757561
-2 255 218 215 0.000757561
-2 255 254 215 0.000757561
-3 255 254 218 215 0.000757561
-1 859 750 0.000757562
-2 859 750 507 0.000757562
-2 979 859 750 0.000757562
-3 979 859 750 507 0.000757562
-1 171 147 0.000758244
-2 171 149 147 0.000758244
-2 506 171 147 0.000758244
-3 506 171 149 147 0.000758244
-1 874 276 0.000758294
-2 874 276 94 0.000758294
-2 874 789 276 0.000758294
-3 874 789 276 94 0.000758294
-1 949 899 0.000758326
-2 949 899 725 0.000758326
-2 949 947 899 0.000758326
-3 949 947 899 725 0.000758326
-2 934 903 808 0.000758698
-3 934 903 808 807 0.000758698
-1 980 327 0.000759761
-1 980 451 0.000759761
-2 980 451 327 0.000759761
-1 980 961 0.000759761
-2 980 961 327 0.000759761
-2 980 961 451 0.000759761
-3 980 961 451 327 0.000759761
-1 712 200 0.000760443
-2 712 639 200 0.000760443
-2 718 712 200 0.000760443
-3 718 712 639 200 0.000760443
-1 953 215 0.000760828
-2 953 217 215 0.000760828
-2 953 810 215 0.000760828
-3 953 810 217 215 0.000760828
-1 922 727 0.000761116
-1 922 870 0.000761116
-2 922 870 727 0.000761116
-1 922 871 0.000761116
-2 922 871 727 0.000761116
-2 922 871 870 0.000761116
-3 922 871 870 727 0.000761116
-1 983 796 0.000761376
-2 983 835 796 0.000761376
-2 983 982 796 0.000761376
-3 983 982 835 796 0.000761376
-1 903 667 0.000761412
-2 903 668 667 0.000761412
-1 934 667 0.000761412
-2 934 668 667 0.000761412
-2 934 903 667 0.000761412
-3 934 903 668 667 0.000761412
-1 920 304 0.000761582
-2 920 304 79 0.000761582
-2 964 920 304 0.000761582
-3 964 920 304 79 0.000761582
-1 744 571 0.000763036
-2 744 602 571 0.000763036
-2 757 744 571 0.000763036
-3 757 744 602 571 0.000763036
-1 706 364 0.000763131
-2 706 605 364 0.000763131
-2 930 706 364 0.000763131
-3 930 706 605 364 0.000763131
-2 255 216 215 0.000763179
-3 255 218 216 215 0.000763179
-2 701 200 199 0.000763238
-3 701 639 200 199 0.000763238
-2 983 857 796 0.00076372
-3 983 982 857 796 0.00076372
-1 952 629 0.000764188
-2 952 629 548 0.000764188
-2 952 629 624 0.000764188
-3 952 629 624 548 0.000764188
-1 472 325 0.00076439
-2 472 325 114 0.00076439
-2 472 325 323 0.00076439
-3 472 325 323 114 0.00076439
-2 956 928 851 0.000765356
-3 956 928 852 851 0.000765356
-1 934 355 0.000765604
-2 934 408 355 0.000765604
-2 934 497 355 0.000765604
-3 934 497 408 355 0.000765604
-2 874 847 94 0.000765716
-3 874 847 790 94 0.000765716
-1 128 43 0.000767959
-2 131 128 43 0.000767959
-2 459 128 43 0.000767959
-3 459 131 128 43 0.000767959
-1 786 455 0.000767991
-2 786 455 341 0.000767991
-2 786 704 455 0.000767991
-3 786 704 455 341 0.000767991
-1 656 420 0.0007683
-2 656 422 420 0.0007683
-2 660 656 420 0.0007683
-3 660 656 422 420 0.0007683
-2 772 692 507 0.000768431
-3 772 692 507 72 0.000768431
-1 934 144 0.000768584
-2 934 408 144 0.000768584
-2 934 933 144 0.000768584
-3 934 933 408 144 0.000768584
-2 796 392 354 0.000768893
-3 796 393 392 354 0.000768893
-1 196 62 0.000769717
-2 197 196 62 0.000769717
-2 366 196 62 0.000769717
-3 366 197 196 62 0.000769717
-1 250 144 0.000769755
-2 250 182 144 0.000769755
-2 251 250 144 0.000769755
-3 251 250 182 144 0.000769755
-1 683 109 0.000769766
-2 683 262 109 0.000769766
-2 907 683 109 0.000769766
-3 907 683 262 109 0.000769766
-1 964 186 0.000769796
-2 964 304 186 0.000769796
-2 964 884 186 0.000769796
-3 964 884 304 186 0.000769796
-1 639 362 0.000769947
-2 639 362 200 0.000769947
-2 639 574 362 0.000769947
-3 639 574 362 200 0.000769947
-1 639 523 0.000770832
-2 639 523 200 0.000770832
-2 639 523 362 0.000770832
-3 639 523 362 200 0.000770832
-2 983 431 428 0.000771264
-3 983 857 431 428 0.000771264
-1 243 116 0.000771721
-2 385 243 116 0.000771721
-2 694 243 116 0.000771721
-3 694 385 243 116 0.000771721
-1 934 599 0.00077245
-2 934 808 599 0.00077245
-2 934 933 599 0.00077245
-3 934 933 808 599 0.00077245
-1 813 277 0.000773085
-2 813 498 277 0.000773085
-2 813 499 277 0.000773085
-3 813 499 498 277 0.000773085
-1 718 523 0.00077311
-2 718 523 200 0.00077311
-2 718 523 521 0.00077311
-3 718 523 521 200 0.00077311
-2 644 580 363 0.000773446
-3 644 605 580 363 0.000773446
-1 609 553 0.00077369
-1 996 553 0.00077369
-2 996 609 553 0.00077369
-0 999 0.00077369
-1 999 553 0.00077369
-1 999 609 0.00077369
-2 999 609 553 0.00077369
-1 999 996 0.00077369
-2 999 996 553 0.00077369
-2 999 996 609 0.00077369
-3 999 996 609 553 0.00077369
-1 761 401 0.000773913
-2 761 401 320 0.000773913
-2 761 587 401 0.000773913
-3 761 587 401 320 0.000773913
-1 558 117 0.000775765
-2 558 440 117 0.000775765
-2 558 494 117 0.000775765
-3 558 494 440 117 0.000775765
-1 955 617 0.000776158
-2 955 780 617 0.000776158
-1 955 904 0.000776158
-2 955 904 617 0.000776158
-2 955 904 780 0.000776158
-3 955 904 780 617 0.000776158
-1 317 144 0.000776395
-2 317 182 144 0.000776395
-2 318 317 144 0.000776395
-3 318 317 182 144 0.000776395
-2 920 580 304 0.000776648
-3 920 580 304 79 0.000776648
-1 712 523 0.000776869
-2 712 523 200 0.000776869
-2 718 712 523 0.000776869
-3 718 712 523 200 0.000776869
-2 533 432 102 0.000777198
-3 533 432 102 19 0.000777198
-1 971 1 0.000777247
-2 971 908 1 0.000777247
-2 971 926 1 0.000777247
-3 971 926 908 1 0.000777247
-1 639 363 0.000777351
-2 639 363 362 0.000777351
-2 639 523 363 0.000777351
-3 639 523 363 362 0.000777351
-2 712 639 523 0.000777364
-3 712 639 523 200 0.000777364
-2 639 574 363 0.000777447
-3 639 574 363 362 0.000777447
-1 983 968 0.000777849
-2 983 968 911 0.000777849
-2 997 983 968 0.000777849
-3 997 983 968 911 0.000777849
-1 712 363 0.000777913
-2 712 574 363 0.000777913
-2 712 639 363 0.000777913
-3 712 639 574 363 0.000777913
-2 712 523 363 0.000778164
-3 712 639 523 363 0.000778164
-1 968 713 0.000778385
-2 968 716 713 0.000778385
-2 997 968 713 0.000778385
-3 997 968 716 713 0.000778385
-2 918 656 420 0.000778398
-3 918 656 422 420 0.000778398
-2 874 847 276 0.000779162
-3 874 847 276 94 0.000779162
-1 748 578 0.000779203
-2 749 748 578 0.000779203
-2 762 748 578 0.000779203
-3 762 749 748 578 0.000779203
-1 966 431 0.000780067
-2 966 853 431 0.000780067
-2 966 965 431 0.000780067
-3 966 965 853 431 0.000780067
-2 966 857 796 0.000780106
-3 966 875 857 796 0.000780106
-1 989 911 0.000780226
-2 989 911 806 0.000780226
-2 989 939 911 0.000780226
-3 989 939 911 806 0.000780226
-1 597 433 0.000780549
-2 597 433 112 0.000780549
-2 984 597 433 0.000780549
-3 984 597 433 112 0.000780549
-1 759 276 0.000780776
-2 847 759 276 0.000780776
-2 874 759 276 0.000780776
-3 874 847 759 276 0.000780776
-1 853 354 0.000781969
-2 853 796 354 0.000781969
-2 853 825 354 0.000781969
-3 853 825 796 354 0.000781969
-1 834 732 0.000782141
-2 834 732 631 0.000782141
-2 911 834 732 0.000782141
-3 911 834 732 631 0.000782141
-1 864 47 0.000782347
-2 864 47 46 0.000782347
-2 884 864 47 0.000782347
-3 884 864 47 46 0.000782347
-1 220 4 0.000783346
-2 220 103 4 0.000783346
-2 478 220 4 0.000783346
-3 478 220 103 4 0.000783346
-1 403 351 0.000784592
-2 403 351 194 0.000784592
-2 485 403 351 0.000784592
-3 485 403 351 194 0.000784592
-2 897 650 21 0.00078487
-3 897 650 24 21 0.00078487
-1 757 533 0.000784875
-2 757 533 18 0.000784875
-2 757 533 532 0.000784875
-3 757 533 532 18 0.000784875
-1 964 47 0.000784878
-2 964 186 47 0.000784878
-2 964 884 47 0.000784878
-3 964 884 186 47 0.000784878
-1 809 631 0.000785381
-2 809 631 279 0.000785381
-2 914 809 631 0.000785381
-3 914 809 631 279 0.000785381
-2 964 864 47 0.000785762
-3 964 884 864 47 0.000785762
-1 85 46 0.000786635
-1 886 85 0.000786635
-2 886 85 46 0.000786635
-2 967 85 46 0.000786635
-2 967 886 85 0.000786635
-3 967 886 85 46 0.000786635
-1 971 339 0.000787653
-2 971 554 339 0.000787653
-2 971 909 339 0.000787653
-3 971 909 554 339 0.000787653
-1 645 363 0.000787917
-2 645 603 363 0.000787917
-2 645 644 363 0.000787917
-3 645 644 603 363 0.000787917
-1 527 276 0.000788354
-2 789 527 276 0.000788354
-2 794 527 276 0.000788354
-3 794 789 527 276 0.000788354
-1 902 859 0.000789993
-2 902 859 750 0.000789993
-2 979 902 859 0.000789993
-3 979 902 859 750 0.000789993
-1 461 109 0.000790039
-2 461 110 109 0.000790039
-2 461 458 109 0.000790039
-3 461 458 110 109 0.000790039
-2 905 649 144 0.000790439
-3 905 649 647 144 0.000790439
-1 995 911 0.000791353
-2 995 938 911 0.000791353
-2 995 993 911 0.000791353
-3 995 993 938 911 0.000791353
-2 586 559 142 0.00079142
-3 586 559 379 142 0.00079142
-1 693 258 0.000791832
-2 693 258 161 0.000791832
-2 812 693 258 0.000791832
-3 812 693 258 161 0.000791832
-1 448 144 0.000792636
-2 649 448 144 0.000792636
-2 905 448 144 0.000792636
-3 905 649 448 144 0.000792636
-2 780 382 238 0.000793137
-3 780 384 382 238 0.000793137
-1 934 637 0.000793161
-2 934 637 144 0.000793161
-2 934 933 637 0.000793161
-3 934 933 637 144 0.000793161
-1 858 599 0.000793768
-2 858 617 599 0.000793768
-2 905 858 599 0.000793768
-3 905 858 617 599 0.000793768
-1 942 766 0.000794315
-2 942 766 692 0.000794315
-2 942 846 766 0.000794315
-3 942 846 766 692 0.000794315
-1 911 673 0.000795053
-1 939 673 0.000795053
-2 939 911 673 0.000795053
-1 989 673 0.000795053
-2 989 911 673 0.000795053
-2 989 939 673 0.000795053
-3 989 939 911 673 0.000795053
-2 934 637 599 0.000796647
-3 934 933 637 599 0.000796647
-2 617 238 236 0.000796693
-3 617 239 238 236 0.000796693
-1 789 759 0.000797245
-2 789 759 527 0.000797245
-2 874 789 759 0.000797245
-3 874 789 759 527 0.000797245
-1 793 686 0.000797294
-2 793 686 379 0.000797294
-2 915 793 686 0.000797294
-3 915 793 686 379 0.000797294
-1 854 617 0.000797294
-2 904 854 617 0.000797294
-2 955 854 617 0.000797294
-2 955 904 854 0.000797294
-3 955 904 854 617 0.000797294
-2 534 321 33 0.000797776
-3 534 454 321 33 0.000797776
-2 579 529 341 0.000798118
-3 579 529 341 339 0.000798118
-2 854 808 617 0.000798543
-3 904 854 808 617 0.000798543
-2 616 205 203 0.000798688
-3 616 205 204 203 0.000798688
-1 818 480 0.000799247
-2 818 482 480 0.000799247
-2 925 818 480 0.000799247
-3 925 818 482 480 0.000799247
-1 903 666 0.000799301
-2 903 667 666 0.000799301
-2 903 854 666 0.000799301
-2 903 854 667 0.000799301
-3 903 854 667 666 0.000799301
-1 748 309 0.000800425
-2 748 578 309 0.000800425
-2 749 748 309 0.000800425
-3 749 748 578 309 0.000800425
-1 876 781 0.000801492
-2 876 784 781 0.000801492
-2 876 875 781 0.000801492
-3 876 875 784 781 0.000801492
-2 611 587 575 0.000801632
-3 611 587 575 181 0.000801632
-2 508 247 236 0.0008018
-3 508 492 247 236 0.0008018
-2 743 742 683 0.0008019
-2 743 742 735 0.0008019
-3 743 742 735 683 0.0008019
-2 558 533 102 0.000802081
-3 558 533 432 102 0.000802081
-1 527 450 0.000802688
-2 528 527 450 0.000802688
-2 792 527 450 0.000802688
-3 792 528 527 450 0.000802688
-2 321 250 33 0.000802956
-3 321 250 84 33 0.000802956
-2 757 570 533 0.000803796
-3 757 570 533 18 0.000803796
-1 656 421 0.000803797
-2 656 421 420 0.000803797
-2 918 656 421 0.000803797
-3 918 656 421 420 0.000803797
-1 712 580 0.000804529
-2 712 580 304 0.000804529
-2 712 580 574 0.000804529
-3 712 580 574 304 0.000804529
-1 720 421 0.000804686
-2 720 679 421 0.000804686
-2 918 679 421 0.000804686
-2 918 720 421 0.000804686
-3 918 720 679 421 0.000804686
-1 784 217 0.000805286
-2 784 782 217 0.000805286
-2 784 783 217 0.000805286
-3 784 783 782 217 0.000805286
-2 712 580 363 0.00080531
-3 712 580 574 363 0.00080531
-1 972 437 0.000805789
-1 972 610 0.000805789
-2 972 610 437 0.000805789
-1 990 972 0.000805789
-2 990 972 437 0.000805789
-2 990 972 610 0.000805789
-3 990 972 610 437 0.000805789
-1 838 551 0.000806877
-2 838 551 420 0.000806877
-2 839 838 551 0.000806877
-3 839 838 551 420 0.000806877
-2 934 599 144 0.000807138
-3 934 637 599 144 0.000807138
-2 993 983 911 0.000807259
-2 993 983 968 0.000807259
-3 993 983 968 911 0.000807259
-1 166 144 0.000807953
-2 166 165 144 0.000807953
-2 310 166 144 0.000807953
-3 310 166 165 144 0.000807953
-2 474 102 69 0.00080809
-3 474 102 101 69 0.00080809
-2 494 330 117 0.000808467
-3 494 380 330 117 0.000808467
-1 576 320 0.000810689
-2 576 320 58 0.000810689
-2 576 401 320 0.000810689
-3 576 401 320 58 0.000810689
-1 450 173 0.000810758
-2 559 450 173 0.000810758
-2 785 450 173 0.000810758
-3 785 559 450 173 0.000810758
-1 486 278 0.000810764
-2 486 280 278 0.000810764
-2 731 486 278 0.000810764
-3 731 486 280 278 0.000810764
-2 967 472 114 0.000810865
-3 967 472 115 114 0.000810865
-1 980 643 0.000810896
-2 980 770 643 0.000810896
-2 980 961 643 0.000810896
-2 980 961 770 0.000810896
-3 980 961 770 643 0.000810896
-1 928 339 0.000811448
-2 928 851 339 0.000811448
-2 928 909 339 0.000811448
-3 928 909 851 339 0.000811448
-2 914 871 547 0.000812165
-3 914 871 547 482 0.000812165
-1 87 46 0.000812508
-2 864 87 46 0.000812508
-1 886 87 0.000812508
-2 886 87 46 0.000812508
-2 886 864 87 0.000812508
-3 886 864 87 46 0.000812508
-2 953 784 217 0.000812894
-3 953 784 783 217 0.000812894
-2 87 85 46 0.000813333
-2 886 87 85 0.000813333
-3 886 87 85 46 0.000813333
-1 647 619 0.000813547
-2 647 619 446 0.000813547
-2 905 647 619 0.000813547
-3 905 647 619 446 0.000813547
-1 761 575 0.000813975
-2 761 575 401 0.000813975
-2 761 587 575 0.000813975
-3 761 587 575 401 0.000813975
-2 718 523 95 0.000815368
-3 718 523 521 95 0.000815368
-1 693 34 0.000815405
-2 693 161 34 0.000815405
-2 693 510 34 0.000815405
-3 693 510 161 34 0.000815405
-1 363 304 0.000815799
-2 580 363 304 0.000815799
-2 712 363 304 0.000815799
-3 712 580 363 304 0.000815799
-2 789 759 276 0.000815983
-3 874 789 759 276 0.000815983
-1 553 336 0.000816308
-2 553 530 336 0.000816308
-2 554 553 336 0.000816308
-3 554 553 530 336 0.000816308
-1 256 119 0.000816648
-2 256 121 119 0.000816648
-2 312 256 119 0.000816648
-3 312 256 121 119 0.000816648
-2 623 621 419 0.000817364
-3 623 621 420 419 0.000817364
-2 538 490 435 0.000817395
-3 538 490 435 136 0.000817395
-1 742 601 0.000817786
-2 742 602 601 0.000817786
-2 956 742 601 0.000817786
-3 956 742 602 601 0.000817786
-1 683 433 0.000817956
-2 683 433 109 0.000817956
-2 683 433 262 0.000817956
-3 683 433 262 109 0.000817956
-1 838 531 0.000818896
-2 838 531 421 0.000818896
-2 838 678 531 0.000818896
-3 838 678 531 421 0.000818896
-1 577 393 0.000819414
-2 577 393 354 0.000819414
-2 577 487 393 0.000819414
-3 577 487 393 354 0.000819414
-2 879 697 679 0.000820128
-1 891 697 0.000820128
-2 891 697 679 0.000820128
-2 891 879 697 0.000820128
-3 891 879 697 679 0.000820128
-1 858 144 0.000820134
-2 858 599 144 0.000820134
-2 905 858 144 0.000820134
-3 905 858 599 144 0.000820134
-1 956 825 0.000820754
-2 956 825 601 0.000820754
-2 956 883 825 0.000820754
-3 956 883 825 601 0.000820754
-1 310 142 0.000821935
-2 310 144 142 0.000821935
-2 559 310 142 0.000821935
-3 559 310 144 142 0.000821935
-2 934 355 144 0.000822835
-3 934 408 355 144 0.000822835
-2 819 809 547 0.000823495
-3 819 809 547 483 0.000823495
-1 971 428 0.000823946
-2 971 428 1 0.000823946
-2 971 926 428 0.000823946
-3 971 926 428 1 0.000823946
-1 558 330 0.000824591
-2 558 330 117 0.000824591
-2 558 494 330 0.000824591
-3 558 494 330 117 0.000824591
-2 818 483 482 0.000825167
-3 818 547 483 482 0.000825167
-1 607 437 0.000825422
-2 608 607 437 0.000825422
-2 610 607 437 0.000825422
-3 610 608 607 437 0.000825422
-1 752 420 0.000825423
-2 752 659 420 0.000825423
-2 752 660 420 0.000825423
-3 752 660 659 420 0.000825423
-1 461 433 0.000825485
-2 461 433 109 0.000825485
-2 461 433 110 0.000825485
-3 461 433 110 109 0.000825485
-1 824 570 0.000826924
-2 824 757 570 0.000826924
-2 912 824 570 0.000826924
-3 912 824 757 570 0.000826924
-1 310 251 0.000830054
-2 310 251 142 0.000830054
-2 310 251 144 0.000830054
-3 310 251 144 142 0.000830054
-2 720 656 421 0.000830253
-3 918 720 656 421 0.000830253
-1 132 56 0.000830274
-2 132 56 32 0.000830274
-2 177 132 56 0.000830274
-3 177 132 56 32 0.000830274
-2 893 851 3 0.000830898
-3 909 893 851 3 0.000830898
-1 678 579 0.000830906
-2 678 579 531 0.000830906
-2 679 678 579 0.000830906
-3 679 678 579 531 0.000830906
-1 760 187 0.000831316
-2 760 187 186 0.000831316
-2 810 760 187 0.000831316
-3 810 760 187 186 0.000831316
-1 972 607 0.000831583
-2 972 607 437 0.000831583
-2 972 610 607 0.000831583
-3 972 610 607 437 0.000831583
-1 718 504 0.000832366
-2 718 712 504 0.000832366
-2 847 718 504 0.000832366
-3 847 718 712 504 0.000832366
-1 699 201 0.000832519
-2 701 699 201 0.000832519
-2 894 699 201 0.000832519
-3 894 701 699 201 0.000832519
-2 649 166 144 0.000832938
-3 649 166 165 144 0.000832938
-2 974 760 187 0.000833236
-3 974 810 760 187 0.000833236
-1 892 828 0.000833404
-2 892 846 828 0.000833404
-2 907 892 828 0.000833404
-3 907 892 846 828 0.000833404
-1 533 471 0.000833782
-2 567 533 471 0.000833782
-2 967 533 471 0.000833782
-3 967 567 533 471 0.000833782
-1 740 46 0.000833842
-2 740 85 46 0.000833842
-2 740 87 46 0.000833842
-3 740 87 85 46 0.000833842
-1 979 961 0.000834137
-2 979 961 643 0.000834137
-2 979 961 902 0.000834137
-3 979 961 902 643 0.000834137
-1 361 300 0.000834366
-2 361 302 300 0.000834366
-2 361 360 300 0.000834366
-3 361 360 302 300 0.000834366
-1 736 457 0.000834568
-2 736 457 456 0.000834568
-2 851 736 457 0.000834568
-3 851 736 457 456 0.000834568
-2 983 834 796 0.000834758
-3 983 835 834 796 0.000834758
-2 825 781 537 0.000835484
-3 849 825 781 537 0.000835484
-2 736 457 455 0.00083564
-3 736 457 456 455 0.00083564
-2 864 740 46 0.000837131
-3 864 740 87 46 0.000837131
-2 955 617 238 0.000837699
-3 955 780 617 238 0.000837699
-1 942 507 0.00083772
-2 942 692 507 0.00083772
-2 942 772 507 0.00083772
-3 942 772 692 507 0.00083772
-1 686 612 0.000837817
-2 686 612 398 0.000837817
-2 686 612 611 0.000837817
-3 686 612 611 398 0.000837817
-1 949 842 0.000838087
-2 949 946 842 0.000838087
-2 949 947 842 0.000838087
-3 949 947 946 842 0.000838087
-1 643 451 0.000839132
-2 961 643 451 0.000839132
-2 980 643 451 0.000839132
-3 980 961 643 451 0.000839132
-1 763 558 0.000839361
-2 763 558 532 0.000839361
-2 763 602 558 0.000839361
-3 763 602 558 532 0.000839361
-2 947 899 842 0.00083952
-2 949 899 842 0.00083952
-3 949 947 899 842 0.00083952
-1 872 332 0.000839606
-2 872 334 332 0.000839606
-2 872 863 332 0.000839606
-3 872 863 334 332 0.000839606
-1 895 342 0.000839733
-2 895 771 342 0.000839733
-2 896 895 342 0.000839733
-3 896 895 771 342 0.000839733
-1 834 392 0.000839837
-2 834 795 392 0.000839837
-2 911 834 392 0.000839837
-3 911 834 795 392 0.000839837
-1 608 336 0.000839843
-2 608 530 336 0.000839843
-2 608 553 336 0.000839843
-3 608 553 530 336 0.000839843
-1 820 276 0.000840223
-2 820 759 276 0.000840223
-2 847 820 276 0.000840223
-3 847 820 759 276 0.000840223
-1 660 421 0.000840468
-2 660 421 420 0.000840468
-2 660 656 421 0.000840468
-3 660 656 421 420 0.000840468
-1 990 678 0.000840709
-2 990 678 437 0.000840709
-2 990 838 678 0.000840709
-3 990 838 678 437 0.000840709
-1 115 46 0.000840741
-2 115 85 46 0.000840741
-2 967 115 46 0.000840741
-3 967 115 85 46 0.000840741
-2 600 568 302 0.000841327
-3 719 600 568 302 0.000841327
-1 820 718 0.000841358
-2 820 718 504 0.000841358
-2 847 820 718 0.000841358
-3 847 820 718 504 0.000841358
-1 559 251 0.000843236
-2 559 251 142 0.000843236
-2 586 559 251 0.000843236
-3 586 559 251 142 0.000843236
-1 847 95 0.000843418
-2 847 276 95 0.000843418
-2 847 718 95 0.000843418
-3 847 718 276 95 0.000843418
-1 644 304 0.000843494
-2 644 580 304 0.000843494
-2 920 644 304 0.000843494
-3 920 644 580 304 0.000843494
-1 864 82 0.000843656
-2 864 82 69 0.000843656
-2 864 82 71 0.000843656
-3 864 82 71 69 0.000843656
-1 875 537 0.000843857
-2 875 781 537 0.000843857
-2 875 825 537 0.000843857
-3 875 825 781 537 0.000843857
-1 602 3 0.000844261
-2 602 558 3 0.000844261
-2 852 602 3 0.000844261
-3 852 602 558 3 0.000844261
-2 559 310 251 0.000845329
-3 559 310 251 142 0.000845329
-1 827 128 0.00084559
-2 827 426 128 0.00084559
-2 827 684 128 0.00084559
-3 827 684 426 128 0.00084559
-2 644 363 304 0.000845634
-3 644 580 363 304 0.000845634
-1 820 95 0.000845795
-2 820 718 95 0.000845795
-2 847 820 95 0.000845795
-3 847 820 718 95 0.000845795
-2 820 276 95 0.000845797
-3 847 820 276 95 0.000845797
-1 87 69 0.000846062
-2 864 87 69 0.000846062
-2 886 87 69 0.000846062
-3 886 864 87 69 0.000846062
-1 586 528 0.000847249
-2 586 528 527 0.000847249
-2 586 559 528 0.000847249
-3 586 559 528 527 0.000847249
-1 995 928 0.000848544
-1 995 971 0.000848544
-2 995 971 928 0.000848544
-1 995 987 0.000848544
-2 995 987 928 0.000848544
-2 995 987 971 0.000848544
-3 995 987 971 928 0.000848544
-1 910 416 0.000849669
-2 910 572 416 0.000849669
-2 910 811 416 0.000849669
-3 910 811 572 416 0.000849669
-1 504 95 0.000849998
-2 718 504 95 0.000849998
-2 820 504 95 0.000849998
-3 820 718 504 95 0.000849998
-2 683 458 109 0.000850283
-3 907 683 458 109 0.000850283
-1 597 508 0.000850822
-2 597 515 508 0.000850822
-2 862 597 508 0.000850822
-3 862 597 515 508 0.000850822
-2 987 971 428 0.000850993
-3 987 971 926 428 0.000850993
-2 745 567 532 0.000851026
-2 764 745 567 0.000851026
-3 764 745 567 532 0.000851026
-1 972 806 0.000851205
-2 972 887 806 0.000851205
-2 989 972 806 0.000851205
-3 989 972 887 806 0.000851205
-1 798 244 0.000851714
-2 798 289 244 0.000851714
-2 822 798 244 0.000851714
-3 822 798 289 244 0.000851714
-2 816 698 579 0.000851741
-3 816 698 579 263 0.000851741
-1 617 144 0.000853348
-2 617 599 144 0.000853348
-2 858 617 144 0.000853348
-3 858 617 599 144 0.000853348
-1 645 304 0.000853552
-1 920 645 0.000853552
-2 920 645 304 0.000853552
-1 964 645 0.000853552
-2 964 645 304 0.000853552
-2 964 920 645 0.000853552
-3 964 920 645 304 0.000853552
-1 497 144 0.000854028
-2 497 355 144 0.000854028
-2 934 497 144 0.000854028
-3 934 497 355 144 0.000854028
-1 859 785 0.000854645
-2 859 785 750 0.000854645
-2 902 859 785 0.000854645
-3 902 859 785 750 0.000854645
-1 507 450 0.000854743
-2 507 450 173 0.000854743
-2 785 507 450 0.000854743
-3 785 507 450 173 0.000854743
-1 764 102 0.000854961
-2 764 474 102 0.000854961
-2 764 533 102 0.000854961
-3 764 533 474 102 0.000854961
-1 967 69 0.000855015
-2 967 474 69 0.000855015
-2 967 886 69 0.000855015
-3 967 886 474 69 0.000855015
-1 276 7 0.000856097
-2 730 276 7 0.000856097
-2 794 276 7 0.000856097
-3 794 730 276 7 0.000856097
-2 921 817 547 0.000856281
-3 925 921 817 547 0.000856281
-2 810 534 454 0.000857122
-3 974 810 534 454 0.000857122
-2 645 644 304 0.000857179
-2 920 645 644 0.000857179
-3 920 645 644 304 0.000857179
-2 355 317 144 0.000857359
-3 355 318 317 144 0.000857359
-1 922 547 0.000858737
-2 922 871 547 0.000858737
-2 922 921 547 0.000858737
-2 922 921 871 0.000858737
-3 922 921 871 547 0.000858737
-1 783 570 0.000859479
-2 824 783 570 0.000859479
-2 912 783 570 0.000859479
-3 912 824 783 570 0.000859479
-1 285 172 0.000859633
-2 285 172 132 0.000859633
-2 306 285 172 0.000859633
-3 306 285 172 132 0.000859633
-2 802 597 508 0.000860017
-3 862 802 597 508 0.000860017
-1 712 95 0.000860703
-2 712 504 95 0.000860703
-2 718 712 95 0.000860703
-3 718 712 504 95 0.000860703
-1 247 43 0.000860734
-2 247 43 40 0.000860734
-2 247 43 42 0.000860734
-3 247 43 42 40 0.000860734
-1 172 56 0.000861804
-2 172 132 56 0.000861804
-2 177 172 56 0.000861804
-3 177 172 132 56 0.000861804
-1 527 451 0.000862248
-2 527 451 450 0.000862248
-2 792 527 451 0.000862248
-3 792 527 451 450 0.000862248
-1 966 147 0.000862495
-2 966 825 147 0.000862495
-2 966 853 147 0.000862495
-3 966 853 825 147 0.000862495
-1 752 551 0.000863195
-2 752 659 551 0.000863195
-2 952 752 551 0.000863195
-3 952 752 659 551 0.000863195
-1 433 167 0.000863459
-2 433 167 110 0.000863459
-2 461 433 167 0.000863459
-3 461 433 167 110 0.000863459
-2 247 131 43 0.00086371
-3 247 131 43 40 0.00086371
-1 961 859 0.000863801
-2 961 902 859 0.000863801
-2 979 961 859 0.000863801
-3 979 961 902 859 0.000863801
-2 961 859 643 0.00086415
-2 979 859 643 0.00086415
-3 979 961 859 643 0.00086415
-1 764 558 0.00086433
-2 764 558 532 0.00086433
-2 764 763 558 0.00086433
-3 764 763 558 532 0.00086433
-1 857 834 0.000864612
-2 857 834 796 0.000864612
-2 983 857 834 0.000864612
-3 983 857 834 796 0.000864612
-1 864 186 0.000864652
-2 864 186 47 0.000864652
-2 964 864 186 0.000864652
-3 964 864 186 47 0.000864652
-1 966 211 0.00086511
-2 966 211 147 0.00086511
-2 966 825 211 0.00086511
-3 966 825 211 147 0.00086511
-1 740 47 0.000865695
-2 740 47 46 0.000865695
-2 864 740 47 0.000865695
-3 864 740 47 46 0.000865695
-2 712 523 95 0.000866551
-3 718 712 523 95 0.000866551
-1 966 537 0.000866551
-2 966 825 537 0.000866551
-2 966 875 537 0.000866551
-3 966 875 825 537 0.000866551
-1 534 250 0.000867491
-2 534 250 33 0.000867491
-2 534 321 250 0.000867491
-3 534 321 250 33 0.000867491
-1 980 466 0.00086755
-2 980 466 327 0.00086755
-2 980 961 466 0.00086755
-3 980 961 466 327 0.00086755
-1 820 789 0.000867705
-2 820 789 276 0.000867705
-2 820 789 759 0.000867705
-3 820 789 759 276 0.000867705
-2 588 586 250 0.000867852
-3 588 586 405 250 0.000867852
-1 431 147 0.000868224
-2 431 171 147 0.000868224
-2 506 431 147 0.000868224
-3 506 431 171 147 0.000868224
-1 964 71 0.000868238
-2 964 654 71 0.000868238
-2 964 864 71 0.000868238
-3 964 864 654 71 0.000868238
-2 764 558 533 0.000868589
-3 764 558 533 532 0.000868589
-1 830 503 0.000868752
-2 855 830 503 0.000868752
-2 856 830 503 0.000868752
-3 856 855 830 503 0.000868752
-1 820 527 0.000869261
-2 820 759 527 0.000869261
-2 820 789 527 0.000869261
-3 820 789 759 527 0.000869261
-1 306 56 0.000870856
-2 306 172 56 0.000870856
-2 306 177 56 0.000870856
-3 306 177 172 56 0.000870856
-1 744 683 0.000871056
-2 744 742 683 0.000871056
-2 744 743 683 0.000871056
-3 744 743 742 683 0.000871056
-2 820 527 276 0.000871071
-3 820 789 527 276 0.000871071
-1 998 949 0.000871414
-2 998 949 842 0.000871414
-2 998 949 946 0.000871414
-3 998 949 946 842 0.000871414
-1 86 46 0.000872324
-2 86 85 46 0.000872324
-2 740 86 46 0.000872324
-3 740 86 85 46 0.000872324
-1 740 186 0.000872351
-2 740 186 47 0.000872351
-2 864 740 186 0.000872351
-3 864 740 186 47 0.000872351
-1 971 336 0.00087268
-2 971 339 336 0.00087268
-2 971 554 336 0.00087268
-3 971 554 339 336 0.00087268
-2 859 785 507 0.000872819
-3 859 785 750 507 0.000872819
-1 727 684 0.00087285
-2 727 726 684 0.00087285
-1 922 726 0.00087285
-2 922 726 684 0.00087285
-2 922 727 684 0.00087285
-2 922 727 726 0.00087285
-3 922 727 726 684 0.00087285
-1 736 601 0.000872868
-2 742 736 601 0.000872868
-2 956 736 601 0.000872868
-3 956 742 736 601 0.000872868
-1 770 645 0.000873257
-2 770 645 363 0.000873257
-2 770 645 603 0.000873257
-3 770 645 603 363 0.000873257
-1 523 304 0.000873264
-2 523 363 304 0.000873264
-2 712 523 304 0.000873264
-3 712 523 363 304 0.000873264
-1 559 250 0.000873419
-2 559 251 250 0.000873419
-2 586 559 250 0.000873419
-3 586 559 251 250 0.000873419
-2 770 645 643 0.000873577
-3 770 645 643 603 0.000873577
-2 964 740 186 0.000873812
-3 964 864 740 186 0.000873812
-2 942 766 507 0.000874336
-3 942 766 692 507 0.000874336
-1 770 451 0.000874958
-2 770 643 451 0.000874958
-2 980 770 451 0.000874958
-3 980 770 643 451 0.000874958
-1 859 451 0.000875317
-2 859 643 451 0.000875317
-2 961 859 451 0.000875317
-3 961 859 643 451 0.000875317
-2 902 859 451 0.000876225
-3 961 902 859 451 0.000876225
-1 865 71 0.000876881
-2 865 864 71 0.000876881
-2 964 865 71 0.000876881
-3 964 865 864 71 0.000876881
-1 285 56 0.000877003
-2 285 132 56 0.000877003
-2 285 172 56 0.000877003
-3 285 172 132 56 0.000877003
-1 751 466 0.000877692
-2 751 466 89 0.000877692
-2 751 750 466 0.000877692
-3 751 750 466 89 0.000877692
-2 306 285 56 0.000878332
-3 306 285 172 56 0.000878332
-2 857 853 796 0.000879159
-3 966 857 853 796 0.000879159
-1 964 535 0.000879456
-2 964 645 535 0.000879456
-2 964 865 535 0.000879456
-2 964 865 645 0.000879456
-3 964 865 645 535 0.000879456
-2 966 537 211 0.000879748
-3 966 825 537 211 0.000879748
-1 952 660 0.000880157
-2 952 660 548 0.000880157
-2 952 752 660 0.000880157
-3 952 752 660 548 0.000880157
-1 726 549 0.00088023
-2 726 725 549 0.00088023
-2 977 726 549 0.00088023
-2 977 726 725 0.00088023
-3 977 726 725 549 0.00088023
-1 122 32 0.000880628
-2 122 120 32 0.000880628
-2 156 122 32 0.000880628
-3 156 122 120 32 0.000880628
-1 85 69 0.000880845
-2 87 85 69 0.000880845
-2 886 85 69 0.000880845
-3 886 87 85 69 0.000880845
-1 523 504 0.000880911
-2 523 504 304 0.000880911
-2 712 523 504 0.000880911
-3 712 523 504 304 0.000880911
-2 523 504 95 0.000881079
-3 712 523 504 95 0.000881079
-2 132 122 32 0.00088111
-3 132 122 120 32 0.00088111
-2 740 186 46 0.000881421
-3 740 186 47 46 0.000881421
-2 770 730 451 0.000881524
-2 980 730 451 0.000881524
-3 980 770 730 451 0.000881524
-2 967 85 69 0.000881524
-3 967 886 85 69 0.000881524
-2 865 740 535 0.000881985
-2 964 740 535 0.000881985
-3 964 865 740 535 0.000881985
-2 597 433 110 0.000881992
-3 597 433 112 110 0.000881992
-2 616 562 203 0.000882346
-3 616 563 562 203 0.000882346
-1 451 4 0.000882381
-2 451 7 4 0.000882381
-2 451 327 4 0.000882381
-3 451 327 7 4 0.000882381
-1 964 68 0.000882586
-2 964 71 68 0.000882586
-2 964 654 68 0.000882586
-3 964 654 71 68 0.000882586
-1 424 43 0.000883276
-2 424 131 43 0.000883276
-2 424 247 43 0.000883276
-3 424 247 131 43 0.000883276
-2 608 437 336 0.000883335
-3 608 530 437 336 0.000883335
-1 806 607 0.000883665
-2 972 806 607 0.000883665
-1 989 607 0.000883665
-2 989 806 607 0.000883665
-2 989 972 607 0.000883665
-3 989 972 806 607 0.000883665
-1 783 757 0.00088514
-2 783 757 570 0.00088514
-2 824 783 757 0.00088514
-3 824 783 757 570 0.00088514
-2 971 928 339 0.000885403
-3 971 928 909 339 0.000885403
-2 558 330 177 0.000885552
-3 558 494 330 177 0.000885552
-2 848 803 199 0.000887408
-3 848 803 718 199 0.000887408
-1 901 466 0.000887439
-2 901 750 466 0.000887439
-2 902 901 466 0.000887439
-3 902 901 750 466 0.000887439
-1 826 579 0.000887572
-2 826 698 579 0.000887572
-2 826 816 579 0.000887572
-3 826 816 698 579 0.000887572
-1 219 94 0.0008876
-2 219 94 93 0.0008876
-2 479 219 94 0.0008876
-3 479 219 94 93 0.0008876
-2 820 586 527 0.000888272
-3 820 759 586 527 0.000888272
-1 575 320 0.000888547
-2 575 401 320 0.000888547
-2 761 575 320 0.000888547
-3 761 575 401 320 0.000888547
-1 981 691 0.000888664
-2 981 801 691 0.000888664
-2 981 862 691 0.000888664
-3 981 862 801 691 0.000888664
-1 865 82 0.000889102
-2 865 82 71 0.000889102
-2 865 864 82 0.000889102
-3 865 864 82 71 0.000889102
-2 406 226 197 0.000889636
-3 407 406 226 197 0.000889636
-2 597 433 167 0.000891267
-3 597 433 167 110 0.000891267
-1 865 68 0.000892605
-2 865 71 68 0.000892605
-2 964 865 68 0.000892605
-3 964 865 71 68 0.000892605
-2 115 86 46 0.000892803
-3 115 86 85 46 0.000892803
-1 504 363 0.000893557
-2 504 363 304 0.000893557
-2 523 504 363 0.000893557
-3 523 504 363 304 0.000893557
-1 645 186 0.00089359
-2 645 304 186 0.00089359
-2 964 645 186 0.00089359
-3 964 645 304 186 0.00089359
-1 251 74 0.000894571
-2 310 251 74 0.000894571
-2 559 251 74 0.000894571
-3 559 310 251 74 0.000894571
-1 293 4 0.00089519
-2 293 103 4 0.00089519
-2 293 220 4 0.00089519
-3 293 220 103 4 0.00089519
-1 679 656 0.000895618
-2 679 656 421 0.000895618
-2 720 679 656 0.000895618
-3 720 679 656 421 0.000895618
-2 865 82 68 0.000895628
-3 865 82 71 68 0.000895628
-1 659 27 0.000896701
-2 659 657 27 0.000896701
-2 753 659 27 0.000896701
-3 753 659 657 27 0.000896701
-1 998 899 0.000897674
-2 998 899 842 0.000897674
-2 998 949 899 0.000897674
-3 998 949 899 842 0.000897674
-2 984 597 515 0.000897858
-3 984 844 597 515 0.000897858
-2 853 431 147 0.000897933
-3 853 506 431 147 0.000897933
-1 518 42 0.000898853
-2 518 161 42 0.000898853
-2 693 518 42 0.000898853
-3 693 518 161 42 0.000898853
-1 853 392 0.000899043
-2 853 392 354 0.000899043
-2 853 796 392 0.000899043
-3 853 796 392 354 0.000899043
-1 922 630 0.000899349
-2 922 684 630 0.000899349
-2 922 827 630 0.000899349
-3 922 827 684 630 0.000899349
-1 867 233 0.000899775
-2 867 233 206 0.000899775
-2 867 675 233 0.000899775
-3 867 675 233 206 0.000899775
-1 964 82 0.000900123
-2 964 82 68 0.000900123
-2 964 865 82 0.000900123
-3 964 865 82 68 0.000900123
-2 934 667 497 0.000900723
-3 934 668 667 497 0.000900723
-1 609 336 0.000901627
-2 609 553 336 0.000901627
-2 609 608 336 0.000901627
-2 609 608 553 0.000901627
-3 609 608 553 336 0.000901627
-1 618 508 0.000901893
-2 618 508 236 0.000901893
-2 981 618 508 0.000901893
-3 981 618 508 236 0.000901893
-1 911 857 0.000902423
-2 911 857 834 0.000902423
-2 983 911 857 0.000902423
-3 983 911 857 834 0.000902423
-1 251 75 0.000902604
-2 251 75 74 0.000902604
-2 559 251 75 0.000902604
-3 559 251 75 74 0.000902604
-1 578 98 0.00090344
-2 578 391 98 0.00090344
-2 711 578 98 0.00090344
-3 711 578 391 98 0.00090344
-1 534 215 0.00090382
-2 810 534 215 0.00090382
-2 953 534 215 0.00090382
-3 953 810 534 215 0.00090382
-2 645 363 304 0.000903986
-3 645 644 363 304 0.000903986
-1 911 609 0.000904338
-2 911 673 609 0.000904338
-2 939 673 609 0.000904338
-2 939 911 609 0.000904338
-3 939 911 673 609 0.000904338
-1 618 597 0.000904599
-2 618 597 448 0.000904599
-2 802 618 597 0.000904599
-3 802 618 597 448 0.000904599
-1 788 51 0.000904978
-2 788 51 48 0.000904978
-2 788 787 51 0.000904978
-3 788 787 51 48 0.000904978
-1 770 276 0.000906894
-2 770 359 276 0.000906894
-2 770 730 276 0.000906894
-3 770 730 359 276 0.000906894
-1 686 484 0.000906901
-2 686 484 398 0.000906901
-2 686 612 484 0.000906901
-3 686 612 484 398 0.000906901
-1 645 359 0.000907405
-2 645 363 359 0.000907405
-2 770 645 359 0.000907405
-3 770 645 363 359 0.000907405
-1 597 518 0.000908865
-2 597 518 508 0.000908865
-2 597 518 515 0.000908865
-3 597 518 515 508 0.000908865
-2 686 484 205 0.000909435
-3 686 484 398 205 0.000909435
-1 399 56 0.000909822
-2 399 132 56 0.000909822
-2 399 285 56 0.000909822
-3 399 285 132 56 0.000909822
-2 752 551 420 0.000910004
-3 752 659 551 420 0.000910004
-1 460 454 0.000910352
-2 760 460 454 0.000910352
-2 810 460 454 0.000910352
-3 810 760 460 454 0.000910352
-1 399 32 0.000911154
-2 399 56 32 0.000911154
-2 399 132 32 0.000911154
-3 399 132 56 32 0.000911154
-2 938 911 609 0.000912582
-3 939 938 911 609 0.000912582
-2 518 508 42 0.000912627
-3 518 508 161 42 0.000912627
-1 186 86 0.000913826
-2 186 86 46 0.000913826
-2 740 186 86 0.000913826
-3 740 186 86 46 0.000913826
-1 655 34 0.000915323
-2 655 510 34 0.000915323
-2 657 655 34 0.000915323
-3 657 655 510 34 0.000915323
-1 424 42 0.000915578
-2 424 43 42 0.000915578
-2 424 247 42 0.000915578
-3 424 247 43 42 0.000915578
-1 875 211 0.000915633
-2 875 537 211 0.000915633
-2 966 875 211 0.000915633
-3 966 875 537 211 0.000915633
-2 802 618 508 0.000916432
-2 981 802 618 0.000916432
-3 981 802 618 508 0.000916432
-2 772 751 89 0.000917333
-3 772 751 90 89 0.000917333
-1 953 250 0.000917871
-2 953 321 250 0.000917871
-2 953 534 250 0.000917871
-3 953 534 321 250 0.000917871
-1 990 531 0.000918037
-2 990 531 437 0.000918037
-2 990 678 531 0.000918037
-3 990 678 531 437 0.000918037
-1 654 82 0.00091839
-2 654 82 68 0.00091839
-2 964 654 82 0.00091839
-3 964 654 82 68 0.00091839
-1 784 268 0.000918581
-2 784 781 268 0.000918581
-2 784 782 268 0.000918581
-3 784 782 781 268 0.000918581
-1 577 454 0.000918963
-2 577 454 319 0.000918963
-2 577 576 454 0.000918963
-3 577 576 454 319 0.000918963
-1 998 887 0.000919901
-2 998 887 842 0.000919901
-2 998 972 887 0.000919901
-3 998 972 887 842 0.000919901
-1 982 431 0.000920278
-2 982 965 431 0.000920278
-2 983 982 431 0.000920278
-3 983 982 965 431 0.000920278
-1 665 651 0.00092088
-2 665 651 414 0.00092088
-2 665 651 626 0.00092088
-3 665 651 626 414 0.00092088
-1 720 697 0.00092098
-2 720 697 679 0.00092098
-2 891 720 697 0.00092098
-3 891 720 697 679 0.00092098
-1 426 43 0.000921042
-2 426 131 43 0.000921042
-2 426 424 43 0.000921042
-3 426 424 131 43 0.000921042
-1 742 571 0.000921562
-2 742 601 571 0.000921562
-2 742 602 571 0.000921562
-3 742 602 601 571 0.000921562
-1 820 523 0.000921985
-2 820 523 95 0.000921985
-2 820 523 504 0.000921985
-3 820 523 504 95 0.000921985
-1 820 304 0.000922025
-2 820 304 186 0.000922025
-2 820 504 304 0.000922025
-3 820 504 304 186 0.000922025
-2 399 122 32 0.00092214
-3 399 132 122 32 0.00092214
-1 777 635 0.000922221
-2 777 635 479 0.000922221
-2 790 777 635 0.000922221
-3 790 777 635 479 0.000922221
-2 784 268 217 0.000922594
-3 784 782 268 217 0.000922594
-2 953 250 33 0.000922639
-3 953 534 250 33 0.000922639
-1 645 504 0.00092266
-2 645 504 304 0.00092266
-2 645 504 363 0.00092266
-3 645 504 363 304 0.00092266
-1 995 428 0.000923461
-2 995 987 428 0.000923461
-2 995 993 428 0.000923461
-2 995 993 987 0.000923461
-3 995 993 987 428 0.000923461
-2 990 838 531 0.000924408
-3 990 838 678 531 0.000924408
-1 559 361 0.000926291
-2 559 361 75 0.000926291
-2 559 361 173 0.000926291
-3 559 361 173 75 0.000926291
-1 987 911 0.000928212
-2 987 983 911 0.000928212
-2 993 987 911 0.000928212
-3 993 987 983 911 0.000928212
-1 478 276 0.000928777
-2 478 276 93 0.000928777
-2 794 478 276 0.000928777
-3 794 478 276 93 0.000928777
-1 683 461 0.000929281
-2 683 461 310 0.000929281
-2 683 461 458 0.000929281
-3 683 461 458 310 0.000929281
-2 794 527 451 0.000929646
-3 794 792 527 451 0.000929646
-1 952 420 0.0009301
-2 952 551 420 0.0009301
-2 952 752 420 0.0009301
-3 952 752 551 420 0.0009301
-2 764 558 102 0.000930115
-3 764 558 533 102 0.000930115
-1 820 645 0.000930511
-2 820 645 186 0.000930511
-2 820 645 304 0.000930511
-3 820 645 304 186 0.000930511
-2 820 645 504 0.000930636
-3 820 645 504 304 0.000930636
-1 250 74 0.000930772
-1 250 75 0.000930772
-2 250 75 74 0.000930772
-2 251 250 74 0.000930772
-2 251 250 75 0.000930772
-3 251 250 75 74 0.000930772
-2 859 785 451 0.000930801
-3 902 859 785 451 0.000930801
-1 471 46 0.000931715
-2 533 471 46 0.000931715
-2 967 471 46 0.000931715
-3 967 533 471 46 0.000931715
-1 287 117 0.000932455
-2 287 117 113 0.000932455
-2 306 287 117 0.000932455
-3 306 287 117 113 0.000932455
-2 559 250 75 0.00093248
-3 559 251 250 75 0.00093248
-2 867 233 108 0.000932611
-3 867 675 233 108 0.000932611
-1 643 359 0.000932699
-2 645 643 359 0.000932699
-2 770 643 359 0.000932699
-3 770 645 643 359 0.000932699
-1 184 86 0.00093272
-2 184 86 46 0.00093272
-2 186 184 86 0.00093272
-3 186 184 86 46 0.00093272
-2 471 115 46 0.000933885
-3 967 471 115 46 0.000933885
-2 660 459 43 0.000934041
-3 660 459 163 43 0.000934041
-1 903 599 0.000934064
-2 903 808 599 0.000934064
-2 934 903 599 0.000934064
-3 934 903 808 599 0.000934064
-1 928 340 0.000934584
-2 928 340 339 0.000934584
-2 928 851 340 0.000934584
-3 928 851 340 339 0.000934584
-1 184 115 0.000935353
-2 184 115 46 0.000935353
-2 184 115 86 0.000935353
-3 184 115 86 46 0.000935353
-2 744 742 571 0.00093549
-3 744 742 602 571 0.00093549
-1 940 831 0.000936119
-2 940 898 831 0.000936119
-2 943 940 831 0.000936119
-3 943 940 898 831 0.000936119
-1 911 899 0.000937103
-2 911 899 631 0.000937103
-2 911 899 806 0.000937103
-3 911 899 806 631 0.000937103
-1 893 0 0.000937183
-2 893 3 0 0.000937183
-1 908 0 0.000937183
-2 908 3 0 0.000937183
-2 908 893 0 0.000937183
-3 908 893 3 0 0.000937183
-1 730 4 0.000937308
-2 730 7 4 0.000937308
-2 730 451 4 0.000937308
-3 730 451 7 4 0.000937308
-1 872 124 0.000937906
-2 872 332 124 0.000937906
-2 872 334 124 0.000937906
-3 872 334 332 124 0.000937906
-2 426 128 43 0.000938547
-3 426 131 128 43 0.000938547
-1 730 643 0.00093961
-2 730 643 451 0.00093961
-2 770 730 643 0.00093961
-3 770 730 643 451 0.00093961
-1 504 359 0.000940135
-2 504 363 359 0.000940135
-2 523 504 359 0.000940135
-3 523 504 363 359 0.000940135
-1 991 551 0.000940229
-2 991 838 551 0.000940229
-2 991 839 551 0.000940229
-3 991 839 838 551 0.000940229
-2 793 686 611 0.000940365
-3 793 686 611 379 0.000940365
-1 968 428 0.000940522
-2 983 968 428 0.000940522
-2 993 968 428 0.000940522
-3 993 983 968 428 0.000940522
-1 782 533 0.000941691
-2 782 533 46 0.000941691
-2 912 782 533 0.000941691
-3 912 782 533 46 0.000941691
-1 821 583 0.000941917
-2 821 583 542 0.000941917
-2 821 772 583 0.000941917
-3 821 772 583 542 0.000941917
-1 999 336 0.000942369
-2 999 553 336 0.000942369
-1 999 554 0.000942369
-2 999 554 336 0.000942369
-2 999 554 553 0.000942369
-3 999 554 553 336 0.000942369
-2 820 523 276 0.000942836
-3 820 523 276 95 0.000942836
-1 351 196 0.000943677
-2 351 196 194 0.000943677
-2 403 351 196 0.000943677
-3 403 351 196 194 0.000943677
-1 857 392 0.000943957
-2 857 796 392 0.000943957
-2 857 853 392 0.000943957
-3 857 853 796 392 0.000943957
-1 783 533 0.000944556
-2 783 782 533 0.000944556
-2 912 783 533 0.000944556
-3 912 783 782 533 0.000944556
-1 471 184 0.000944621
-2 471 184 46 0.000944621
-2 471 184 115 0.000944621
-3 471 184 115 46 0.000944621
-1 745 568 0.000945018
-2 745 568 567 0.000945018
-2 745 744 568 0.000945018
-3 745 744 568 567 0.000945018
-1 820 359 0.00094552
-2 820 504 359 0.00094552
-2 820 523 359 0.00094552
-3 820 523 504 359 0.00094552
-2 858 448 144 0.000945931
-3 905 858 448 144 0.000945931
-1 533 184 0.000945964
-2 533 184 46 0.000945964
-2 782 533 184 0.000945964
-3 782 533 184 46 0.000945964
-2 783 570 533 0.000946074
-3 912 783 570 533 0.000946074
-1 883 851 0.000946565
-2 928 883 851 0.000946565
-2 956 883 851 0.000946565
-3 956 928 883 851 0.000946565
-1 528 173 0.000947041
-2 528 450 173 0.000947041
-2 559 528 173 0.000947041
-3 559 528 450 173 0.000947041
-2 987 911 857 0.000947516
-3 987 983 911 857 0.000947516
-1 999 971 0.000947886
-2 999 971 336 0.000947886
-2 999 971 554 0.000947886
-3 999 971 554 336 0.000947886
-1 857 795 0.000948238
-2 857 796 795 0.000948238
-2 857 834 795 0.000948238
-3 857 834 796 795 0.000948238
-1 631 547 0.000949238
-2 809 631 547 0.000949238
-2 914 631 547 0.000949238
-3 914 809 631 547 0.000949238
-1 859 450 0.00094962
-2 859 451 450 0.00094962
-2 859 785 450 0.00094962
-3 859 785 451 450 0.00094962
-2 533 471 184 0.000949637
-3 533 471 184 46 0.000949637
-1 879 677 0.000950088
-2 891 879 677 0.000950088
-1 992 677 0.000950088
-2 992 879 677 0.000950088
-2 992 891 677 0.000950088
-3 992 891 879 677 0.000950088
-1 535 186 0.000950422
-2 740 535 186 0.000950422
-2 964 535 186 0.000950422
-3 964 740 535 186 0.000950422
-1 528 507 0.000951252
-2 528 507 173 0.000951252
-2 528 507 450 0.000951252
-3 528 507 450 173 0.000951252
-2 645 504 359 0.000951344
-3 645 504 363 359 0.000951344
-2 820 645 359 0.000951888
-3 820 645 504 359 0.000951888
-1 996 336 0.000952437
-1 996 971 0.000952437
-2 996 971 336 0.000952437
-2 999 996 336 0.000952437
-2 999 996 971 0.000952437
-3 999 996 971 336 0.000952437
-2 744 683 465 0.000953337
-3 744 743 683 465 0.000953337
-1 782 471 0.000953458
-2 782 471 184 0.000953458
-2 782 533 471 0.000953458
-3 782 533 471 184 0.000953458
-1 87 82 0.00095392
-2 87 82 69 0.00095392
-2 864 87 82 0.00095392
-3 864 87 82 69 0.00095392
-1 287 56 0.000954091
-2 287 285 56 0.000954091
-2 306 287 56 0.000954091
-3 306 287 285 56 0.000954091
-1 679 660 0.000954344
-2 679 660 421 0.000954344
-2 679 660 656 0.000954344
-3 679 660 656 421 0.000954344
-2 820 359 276 0.000954435
-3 820 523 359 276 0.000954435
-1 974 186 0.000954526
-2 974 187 186 0.000954526
-2 974 760 186 0.000954526
-3 974 760 187 186 0.000954526
-1 618 247 0.000955062
-2 618 247 236 0.000955062
-2 618 508 247 0.000955062
-3 618 508 247 236 0.000955062
-2 645 535 186 0.000956602
-3 964 645 535 186 0.000956602
-1 972 531 0.000957105
-2 972 531 437 0.000957105
-2 990 972 531 0.000957105
-3 990 972 531 437 0.000957105
-1 586 75 0.000958381
-2 586 250 75 0.000958381
-2 586 559 75 0.000958381
-3 586 559 250 75 0.000958381
-1 974 471 0.000958496
-2 974 471 184 0.000958496
-2 974 782 471 0.000958496
-3 974 782 471 184 0.000958496
-2 683 461 109 0.000958648
-3 683 461 458 109 0.000958648
-1 878 264 0.00095893
-2 878 264 124 0.00095893
-2 878 264 125 0.00095893
-3 878 264 125 124 0.00095893
-1 783 471 0.000959165
-2 783 533 471 0.000959165
-2 783 782 471 0.000959165
-3 783 782 533 471 0.000959165
-1 220 10 0.000959346
-2 220 10 8 0.000959346
-2 220 11 10 0.000959346
-3 220 11 10 8 0.000959346
-2 974 783 471 0.000961407
-3 974 783 782 471 0.000961407
-1 928 261 0.00096147
-2 928 339 261 0.00096147
-2 928 340 261 0.00096147
-3 928 340 339 261 0.00096147
-1 872 333 0.000961805
-2 872 333 332 0.000961805
-2 872 863 333 0.000961805
-3 872 863 333 332 0.000961805
-1 736 3 0.000962538
-2 851 736 3 0.000962538
-2 852 736 3 0.000962538
-3 852 851 736 3 0.000962538
-1 897 748 0.00096282
-2 897 762 748 0.00096282
-2 897 774 748 0.00096282
-3 897 774 762 748 0.00096282
-2 966 431 147 0.000962867
-3 966 853 431 147 0.000962867
-1 607 336 0.000963977
-2 607 437 336 0.000963977
-2 608 607 336 0.000963977
-3 608 607 437 336 0.000963977
-1 657 36 0.000964372
-2 657 36 27 0.000964372
-2 657 36 34 0.000964372
-3 657 36 34 27 0.000964372
-2 535 186 86 0.00096487
-3 740 535 186 86 0.00096487
-2 908 1 0 0.0009651
-3 908 3 1 0 0.0009651
-1 631 144 0.000965388
-2 631 355 144 0.000965388
-2 631 497 144 0.000965388
-3 631 497 355 144 0.000965388
-1 903 144 0.00096577
-2 903 599 144 0.00096577
-2 934 903 144 0.00096577
-3 934 903 599 144 0.00096577
-2 857 795 392 0.000967454
-3 857 796 795 392 0.000967454
-1 586 361 0.000967723
-2 586 361 75 0.000967723
-2 586 559 361 0.000967723
-3 586 559 361 75 0.000967723
-1 721 518 0.000968108
-2 721 518 516 0.000968108
-2 721 677 518 0.000968108
-3 721 677 518 516 0.000968108
-1 598 446 0.000968364
-2 598 447 446 0.000968364
-2 598 449 446 0.000968364
-3 598 449 447 446 0.000968364
-2 996 553 336 0.000969022
-3 999 996 553 336 0.000969022
-1 959 518 0.000969803
-2 959 518 515 0.000969803
-2 959 677 518 0.000969803
-3 959 677 518 515 0.000969803
-1 783 567 0.000969883
-2 783 567 471 0.000969883
-2 783 567 533 0.000969883
-3 783 567 533 471 0.000969883
-1 921 630 0.00096996
-2 921 630 425 0.00096996
-2 921 827 630 0.00096996
-3 921 827 630 425 0.00096996
-2 995 971 428 0.000970203
-3 995 987 971 428 0.000970203
-2 996 609 336 0.000970872
-3 996 609 553 336 0.000970872
-2 683 461 433 0.000971544
-3 683 461 433 109 0.000971544
-1 757 567 0.00097162
-2 757 567 532 0.00097162
-2 757 567 533 0.00097162
-3 757 567 533 532 0.00097162
-2 896 647 619 0.000971633
-3 905 896 647 619 0.000971633
-1 643 276 0.000972261
-2 730 643 276 0.000972261
-2 770 643 276 0.000972261
-3 770 730 643 276 0.000972261
-2 995 987 911 0.000972445
-3 995 993 987 911 0.000972445
-2 693 258 34 0.00097255
-3 693 258 161 34 0.00097255
-1 911 607 0.000973219
-2 911 806 607 0.000973219
-2 989 911 607 0.000973219
-3 989 911 806 607 0.000973219
-1 547 279 0.000974406
-2 809 547 279 0.000974406
-2 819 547 279 0.000974406
-3 819 809 547 279 0.000974406
-1 883 456 0.000974598
-2 883 851 456 0.000974598
-2 956 883 456 0.000974598
-3 956 883 851 456 0.000974598
-2 783 757 533 0.000974816
-3 783 757 570 533 0.000974816
-2 527 451 276 0.000975343
-3 794 527 451 276 0.000975343
-2 721 518 510 0.000977257
-3 721 518 516 510 0.000977257
-1 742 3 0.000977648
-2 742 602 3 0.000977648
-2 852 742 3 0.000977648
-3 852 742 602 3 0.000977648
-1 187 86 0.000978439
-2 187 184 86 0.000978439
-2 187 186 86 0.000978439
-3 187 186 184 86 0.000978439
-1 746 562 0.000978757
-2 746 562 203 0.000978757
-2 746 562 342 0.000978757
-3 746 562 342 203 0.000978757
-1 828 583 0.000979067
-2 828 583 542 0.000979067
-2 828 821 583 0.000979067
-3 828 821 583 542 0.000979067
-1 972 336 0.00097915
-2 972 437 336 0.00097915
-2 972 607 336 0.00097915
-3 972 607 437 336 0.00097915
-2 643 359 276 0.000979206
-3 770 643 359 276 0.000979206
-1 586 173 0.000979677
-2 586 361 173 0.000979677
-2 586 559 173 0.000979677
-3 586 559 361 173 0.000979677
-1 187 115 0.000979935
-2 187 115 86 0.000979935
-2 187 184 115 0.000979935
-3 187 184 115 86 0.000979935
-2 972 531 336 0.000979943
-3 972 531 437 336 0.000979943
-1 859 186 0.000981111
-2 859 535 186 0.000981111
-2 859 645 186 0.000981111
-3 859 645 535 186 0.000981111
-1 820 643 0.000981852
-2 820 643 359 0.000981852
-2 820 645 643 0.000981852
-3 820 645 643 359 0.000981852
-1 471 187 0.000984232
-2 471 187 115 0.000984232
-2 471 187 184 0.000984232
-3 471 187 184 115 0.000984232
-1 219 4 0.000984241
-2 220 219 4 0.000984241
-2 478 219 4 0.000984241
-3 478 220 219 4 0.000984241
-2 974 471 187 0.00098429
-3 974 471 187 184 0.00098429
-1 447 144 0.00098463
-2 448 447 144 0.00098463
-2 649 447 144 0.00098463
-3 649 448 447 144 0.00098463
-1 534 460 0.000984869
-2 534 460 454 0.000984869
-2 810 534 460 0.000984869
-3 810 534 460 454 0.000984869
-1 980 4 0.000985761
-2 980 327 4 0.000985761
-2 980 451 4 0.000985761
-3 980 451 327 4 0.000985761
-2 820 643 276 0.000985856
-3 820 643 359 276 0.000985856
-1 677 510 0.000986216
-2 677 518 510 0.000986216
-2 721 677 510 0.000986216
-3 721 677 518 510 0.000986216
-2 726 550 549 0.000986834
-3 977 726 550 549 0.000986834
-2 576 575 320 0.00098695
-3 576 575 401 320 0.00098695
-2 742 736 3 0.000987519
-3 852 742 736 3 0.000987519
-1 399 53 0.000988606
-2 399 53 32 0.000988606
-2 399 56 53 0.000988606
-3 399 56 53 32 0.000988606
-1 859 820 0.000988848
-2 859 820 186 0.000988848
-2 859 820 645 0.000988848
-3 859 820 645 186 0.000988848
-1 891 510 0.000988855
-2 891 656 510 0.000988855
-2 891 721 510 0.000988855
-3 891 721 656 510 0.000988855
-1 811 699 0.000989984
-2 811 699 416 0.000989984
-2 894 811 699 0.000989984
-3 894 811 699 416 0.000989984
-1 361 250 0.000990287
-2 361 250 75 0.000990287
-2 586 361 250 0.000990287
-3 586 361 250 75 0.000990287
-1 546 187 0.000991011
-2 546 187 115 0.000991011
-2 546 471 187 0.000991011
-3 546 471 187 115 0.000991011
-1 910 414 0.000991612
-2 910 416 414 0.000991612
-2 910 572 414 0.000991612
-3 910 572 416 414 0.000991612
-2 643 451 276 0.000991919
-3 730 643 451 276 0.000991919
-2 859 820 643 0.000992728
-3 859 820 645 643 0.000992728
-1 904 681 0.000994712
-2 904 779 681 0.000994712
-2 904 808 681 0.000994712
-3 904 808 779 681 0.000994712
-2 952 660 420 0.000994717
-3 952 752 660 420 0.000994717
-1 684 629 0.000994892
-2 684 630 629 0.000994892
-2 861 684 629 0.000994892
-3 861 684 630 629 0.000994892
-1 690 347 0.000995051
-2 690 636 347 0.000995051
-2 941 690 347 0.000995051
-3 941 690 636 347 0.000995051
-1 764 69 0.000996411
-2 764 102 69 0.000996411
-2 764 474 69 0.000996411
-3 764 474 102 69 0.000996411
-1 447 167 0.000996672
-2 447 167 166 0.000996672
-2 598 447 167 0.000996672
-3 598 447 167 166 0.000996672
-1 507 300 0.000996763
-2 507 360 300 0.000996763
-2 859 507 300 0.000996763
-3 859 507 360 300 0.000996763
-1 974 567 0.000997101
-2 974 567 471 0.000997101
-2 974 783 567 0.000997101
-3 974 783 567 471 0.000997101
-1 568 532 0.000997218
-2 568 567 532 0.000997218
-2 745 568 532 0.000997218
-3 745 568 567 532 0.000997218
-2 609 607 336 0.00099742
-3 609 608 607 336 0.00099742
-1 588 361 0.000998075
-2 588 361 250 0.000998075
-2 588 586 361 0.000998075
-3 588 586 361 250 0.000998075
-1 974 546 0.000998114
-2 974 546 187 0.000998114
-2 974 546 471 0.000998114
-3 974 546 471 187 0.000998114
-1 673 336 0.000999145
-2 673 607 336 0.000999145
-2 673 609 336 0.000999145
-3 673 609 607 336 0.000999145
-2 783 757 567 0.000999165
-3 783 757 567 533 0.000999165
-1 928 336 0.00100012
-2 928 339 336 0.00100012
-2 971 928 336 0.00100012
-3 971 928 339 336 0.00100012
-1 820 451 0.00100024
-2 820 451 276 0.00100024
-2 820 527 451 0.00100024
-3 820 527 451 276 0.00100024
-1 928 911 0.00100039
-2 987 928 911 0.00100039
-2 995 928 911 0.00100039
-3 995 987 928 911 0.00100039
-1 457 3 0.00100109
-2 851 457 3 0.00100109
-2 893 457 3 0.00100109
-3 893 851 457 3 0.00100109
-2 998 899 887 0.00100133
-3 998 899 887 842 0.00100133
-1 659 28 0.00100223
-2 659 28 27 0.00100223
-2 753 659 28 0.00100223
-3 753 659 28 27 0.00100223
-2 546 187 86 0.00100272
-3 546 187 115 86 0.00100272
-2 744 568 532 0.0010036
-3 745 744 568 532 0.0010036
-1 955 424 0.0010062
-2 955 424 247 0.0010062
-2 955 427 424 0.0010062
-3 955 427 424 247 0.0010062
-2 586 528 173 0.0010085
-3 586 559 528 173 0.0010085
-2 534 460 215 0.00100867
-3 810 534 460 215 0.00100867
-1 808 144 0.00100968
-2 808 599 144 0.00100968
-2 903 808 144 0.00100968
-3 903 808 599 144 0.00100968
-1 546 186 0.00100989
-2 546 186 86 0.00100989
-2 546 187 186 0.00100989
-3 546 187 186 86 0.00100989
-2 631 547 279 0.00101006
-3 809 631 547 279 0.00101006
-1 996 911 0.00101015
-2 996 911 609 0.00101015
-2 996 938 911 0.00101015
-3 996 938 911 609 0.00101015
-1 617 247 0.00101056
-2 617 247 236 0.00101056
-2 617 247 238 0.00101056
-3 617 247 238 236 0.00101056
-2 618 617 247 0.00101187
-3 618 617 247 236 0.00101187
-1 875 147 0.00101202
-2 875 211 147 0.00101202
-2 966 875 147 0.00101202
-3 966 875 211 147 0.00101202
-2 820 643 451 0.00101209
-3 820 643 451 276 0.00101209
-2 857 834 392 0.00101257
-3 857 834 795 392 0.00101257
-1 906 455 0.00101269
-2 906 728 455 0.00101269
-2 906 735 455 0.00101269
-3 906 735 728 455 0.00101269
-2 859 820 451 0.00101358
-3 859 820 643 451 0.00101358
-1 567 69 0.00101445
-2 567 474 69 0.00101445
-2 967 567 69 0.00101445
-3 967 567 474 69 0.00101445
-1 667 144 0.00101458
-2 903 667 144 0.00101458
-2 934 667 144 0.00101458
-3 934 903 667 144 0.00101458
-1 971 938 0.00101468
-2 995 971 938 0.00101468
-2 996 971 938 0.00101468
-1 996 995 0.00101468
-2 996 995 938 0.00101468
-2 996 995 971 0.00101468
-3 996 995 971 938 0.00101468
-2 980 730 4 0.00101713
-3 980 730 451 4 0.00101713
-2 859 507 450 0.00101714
-3 859 785 507 450 0.00101714
-2 654 404 82 0.00101757
-3 654 404 82 68 0.00101757
-2 764 567 69 0.00101823
-3 764 567 474 69 0.00101823
-1 854 144 0.00101874
-2 854 667 144 0.00101874
-2 903 854 144 0.00101874
-3 903 854 667 144 0.00101874
-1 558 306 0.0010191
-2 558 306 177 0.0010191
-2 558 330 306 0.0010191
-3 558 330 306 177 0.0010191
-1 803 776 0.00101928
-2 803 776 669 0.00101928
-2 848 803 776 0.00101928
-3 848 803 776 669 0.00101928
-1 742 558 0.00101934
-2 742 602 558 0.00101934
-2 763 742 558 0.00101934
-3 763 742 602 558 0.00101934
-1 764 83 0.00101935
-2 764 83 69 0.00101935
-2 764 102 83 0.00101935
-3 764 102 83 69 0.00101935
-1 995 1 0.00101946
-2 995 428 1 0.00101946
-2 995 971 1 0.00101946
-3 995 971 428 1 0.00101946
-1 757 568 0.00101957
-2 757 568 532 0.00101957
-2 757 744 568 0.00101957
-3 757 744 568 532 0.00101957
-1 629 551 0.0010199
-2 629 551 548 0.0010199
-2 952 551 548 0.0010199
-2 952 629 551 0.0010199
-3 952 629 551 548 0.0010199
-1 820 535 0.00102066
-2 820 535 186 0.00102066
-2 859 820 535 0.00102066
-3 859 820 535 186 0.00102066
-2 757 568 567 0.00102104
-3 757 568 567 532 0.00102104
-2 629 551 550 0.00102194
-3 629 551 550 548 0.00102194
-1 726 548 0.00102238
-2 726 550 548 0.00102238
-2 726 684 548 0.00102238
-3 726 684 550 548 0.00102238
-1 812 264 0.0010225
-2 812 264 125 0.0010225
-2 812 264 258 0.0010225
-3 812 264 258 125 0.0010225
-1 859 527 0.00102267
-2 859 527 450 0.00102267
-2 859 527 451 0.00102267
-3 859 527 451 450 0.00102267
-1 813 616 0.00102287
-2 933 813 616 0.00102287
-2 934 813 616 0.00102287
-3 934 933 813 616 0.00102287
-1 956 857 0.00102324
-2 956 857 825 0.00102324
-2 956 883 857 0.00102324
-3 956 883 857 825 0.00102324
-1 971 911 0.00102385
-2 971 938 911 0.00102385
-2 995 971 911 0.00102385
-3 995 971 938 911 0.00102385
-1 586 507 0.00102425
-2 586 507 173 0.00102425
-2 586 528 507 0.00102425
-3 586 528 507 173 0.00102425
-2 891 677 510 0.00102426
-3 891 721 677 510 0.00102426
-2 911 673 607 0.00102445
-2 989 673 607 0.00102445
-3 989 911 673 607 0.00102445
-2 971 928 911 0.0010245
-3 995 971 928 911 0.0010245
-1 170 147 0.00102456
-2 170 149 147 0.00102456
-2 171 170 147 0.00102456
-3 171 170 149 147 0.00102456
-2 996 971 911 0.00102485
-3 996 971 938 911 0.00102485
-1 972 911 0.00102514
-2 972 911 607 0.00102514
-2 972 911 806 0.00102514
-3 972 911 806 607 0.00102514
-1 578 390 0.00102525
-2 578 390 98 0.00102525
-2 578 391 390 0.00102525
-3 578 391 390 98 0.00102525
-2 854 808 144 0.00102588
-3 903 854 808 144 0.00102588
-1 974 302 0.00102679
-2 974 471 302 0.00102679
-2 974 546 302 0.00102679
-3 974 546 471 302 0.00102679
-1 618 42 0.00102741
-2 618 247 42 0.00102741
-2 618 508 42 0.00102741
-3 618 508 247 42 0.00102741
-2 742 558 3 0.00102888
-3 742 602 558 3 0.00102888
-2 808 617 144 0.00102926
-3 808 617 599 144 0.00102926
-1 118 32 0.00102957
-2 122 118 32 0.00102957
-2 156 118 32 0.00102957
-3 156 122 118 32 0.00102957
-1 745 558 0.00102965
-2 763 745 558 0.00102965
-2 764 745 558 0.00102965
-3 764 763 745 558 0.00102965
-1 793 575 0.00103028
-2 793 587 575 0.00103028
-2 793 611 575 0.00103028
-3 793 611 587 575 0.00103028
-2 546 535 186 0.00103037
-3 546 535 186 86 0.00103037
-1 974 250 0.00103107
-2 974 321 250 0.00103107
-2 974 953 250 0.00103107
-3 974 953 321 250 0.00103107
-1 998 806 0.00103155
-2 998 887 806 0.00103155
-2 998 972 806 0.00103155
-3 998 972 887 806 0.00103155
-1 612 205 0.00103217
-2 612 484 205 0.00103217
-2 686 612 205 0.00103217
-3 686 612 484 205 0.00103217
-2 859 820 527 0.0010326
-3 859 820 527 451 0.0010326
-2 974 567 302 0.00103261
-3 974 567 471 302 0.00103261
-1 911 336 0.00103291
-2 911 609 336 0.00103291
-2 996 911 336 0.00103291
-3 996 911 609 336 0.00103291
-1 928 857 0.00103315
-2 928 883 857 0.00103315
-2 987 928 857 0.00103315
-3 987 928 883 857 0.00103315
-1 784 215 0.00103593
-2 784 217 215 0.00103593
-2 953 784 215 0.00103593
-3 953 784 217 215 0.00103593
-2 854 617 144 0.00103629
-3 854 808 617 144 0.00103629
-2 998 899 806 0.00103707
-3 998 899 887 806 0.00103707
-2 447 166 144 0.0010376
-3 649 447 166 144 0.0010376
-2 971 911 336 0.00103767
-3 996 971 911 336 0.00103767
-1 567 83 0.00103826
-2 567 83 69 0.00103826
-2 764 567 83 0.00103826
-3 764 567 83 69 0.00103826
-1 967 83 0.0010386
-2 967 83 69 0.0010386
-2 967 567 83 0.0010386
-3 967 567 83 69 0.0010386
-1 783 302 0.00103887
-2 783 567 302 0.00103887
-2 974 783 302 0.00103887
-3 974 783 567 302 0.00103887
-2 878 872 124 0.00103936
-3 878 872 334 124 0.00103936
-2 928 911 336 0.00103962
-3 971 928 911 336 0.00103962
-1 310 250 0.00104082
-2 310 250 74 0.00104082
-2 310 251 250 0.00104082
-3 310 251 250 74 0.00104082
-1 588 302 0.00104247
-2 588 361 302 0.00104247
-1 974 361 0.00104247
-2 974 361 302 0.00104247
-2 974 588 302 0.00104247
-2 974 588 361 0.00104247
-3 974 588 361 302 0.00104247
-1 588 300 0.00104509
-2 588 302 300 0.00104509
-1 588 546 0.00104509
-2 588 546 300 0.00104509
-2 588 546 302 0.00104509
-3 588 546 302 300 0.00104509
-2 588 361 300 0.00104566
-3 588 361 302 300 0.00104566
-1 736 571 0.00104576
-2 736 601 571 0.00104576
-2 742 736 571 0.00104576
-3 742 736 601 571 0.00104576
-2 974 588 546 0.00104585
-3 974 588 546 302 0.00104585
-2 974 546 186 0.00104716
-3 974 546 187 186 0.00104716
-2 928 911 857 0.00104793
-3 987 928 911 857 0.00104793
-1 760 546 0.00104859
-2 760 546 186 0.00104859
-2 974 760 546 0.00104859
-3 974 760 546 186 0.00104859
-1 527 507 0.00104918
-2 527 507 450 0.00104918
-2 528 527 507 0.00104918
-3 528 527 507 450 0.00104918
-1 764 117 0.00104933
-2 764 117 83 0.00104933
-2 764 117 102 0.00104933
-3 764 117 102 83 0.00104933
-2 744 683 462 0.00104968
-3 744 683 465 462 0.00104968
-1 727 547 0.00104969
-2 871 727 547 0.00104969
-2 914 727 547 0.00104969
-3 914 871 727 547 0.00104969
-1 667 631 0.00104978
-2 667 631 279 0.00104978
-2 667 631 497 0.00104978
-3 667 631 497 279 0.00104978
-1 977 684 0.00105002
-2 977 726 684 0.00105002
-2 977 861 684 0.00105002
-3 977 861 726 684 0.00105002
-2 955 617 247 0.00105086
-3 955 617 247 238 0.00105086
-1 586 360 0.001051
-2 586 360 173 0.001051
-2 586 507 360 0.001051
-3 586 507 360 173 0.001051
-2 586 361 360 0.001052
-3 586 361 360 173 0.001052
-1 588 360 0.00105321
-2 588 361 360 0.00105321
-2 588 586 360 0.00105321
-3 588 586 361 360 0.00105321
-2 760 588 546 0.00105333
-3 974 760 588 546 0.00105333
-2 911 673 336 0.0010536
-3 911 673 609 336 0.0010536
-2 586 527 507 0.00105402
-3 586 528 527 507 0.00105402
-2 911 857 392 0.00105526
-3 911 857 834 392 0.00105526
-2 588 360 300 0.00105548
-3 588 361 360 300 0.00105548
-1 784 571 0.00105715
-2 824 784 571 0.00105715
-2 825 784 571 0.00105715
-3 825 824 784 571 0.00105715
-1 588 507 0.0010593
-2 588 507 360 0.0010593
-2 588 586 507 0.0010593
-3 588 586 507 360 0.0010593
-1 911 339 0.00105941
-2 911 339 336 0.00105941
-2 928 911 339 0.00105941
-3 928 911 339 336 0.00105941
-1 820 546 0.00105978
-2 820 546 186 0.00105978
-2 820 546 535 0.00105978
-3 820 546 535 186 0.00105978
-2 820 760 546 0.00106043
-3 820 760 546 186 0.00106043
-1 288 244 0.00106049
-2 289 288 244 0.00106049
-2 352 288 244 0.00106049
-3 352 289 288 244 0.00106049
-2 478 276 7 0.00106102
-3 794 478 276 7 0.00106102
-1 624 551 0.00106114
-2 629 624 551 0.00106114
-2 952 624 551 0.00106114
-3 952 629 624 551 0.00106114
-2 859 527 507 0.00106359
-3 859 527 507 450 0.00106359
-2 667 497 144 0.00106395
-3 934 667 497 144 0.00106395
-1 824 567 0.00106415
-2 824 757 567 0.00106415
-2 824 783 567 0.00106415
-3 824 783 757 567 0.00106415
-1 757 462 0.00106579
-2 757 568 462 0.00106579
-2 757 744 462 0.00106579
-3 757 744 568 462 0.00106579
-2 911 607 336 0.00106669
-3 911 673 607 336 0.00106669
-2 558 117 102 0.00106671
-3 558 440 117 102 0.00106671
-1 928 456 0.00106727
-2 928 851 456 0.00106727
-2 928 883 456 0.00106727
-3 928 883 851 456 0.00106727
-1 855 500 0.00106774
-2 855 501 500 0.00106774
-2 855 503 500 0.00106774
-3 855 503 501 500 0.00106774
-2 406 118 32 0.00106818
-3 406 156 118 32 0.00106818
-2 518 510 42 0.00106856
-3 693 518 510 42 0.00106856
-1 824 568 0.00106857
-2 824 568 567 0.00106857
-2 824 757 568 0.00106857
-3 824 757 568 567 0.00106857
-2 922 921 630 0.00106876
-3 922 921 827 630 0.00106876
-1 866 674 0.00106911
-2 866 674 545 0.00106911
-2 866 815 674 0.00106911
-3 866 815 674 545 0.00106911
-1 783 568 0.00106986
-2 783 568 567 0.00106986
-2 824 783 568 0.00106986
-3 824 783 568 567 0.00106986
-2 783 568 302 0.00106998
-3 783 568 567 302 0.00106998
-2 859 820 546 0.00107025
-3 859 820 546 535 0.00107025
-1 895 674 0.0010706
-2 895 771 674 0.0010706
-2 895 815 674 0.0010706
-3 895 815 771 674 0.0010706
-1 597 42 0.00107135
-2 597 508 42 0.00107135
-2 597 518 42 0.00107135
-3 597 518 508 42 0.00107135
-2 860 624 551 0.00107149
-3 952 860 624 551 0.00107149
-1 548 420 0.00107194
-2 551 548 420 0.00107194
-2 952 548 420 0.00107194
-3 952 551 548 420 0.00107194
-1 857 354 0.00107256
-2 857 392 354 0.00107256
-2 857 853 354 0.00107256
-3 857 853 392 354 0.00107256
-2 820 588 546 0.00107322
-3 820 760 588 546 0.00107322
-1 820 300 0.00107377
-2 820 546 300 0.00107377
-2 859 820 300 0.00107377
-3 859 820 546 300 0.00107377
-2 588 507 300 0.00107421
-3 588 507 360 300 0.00107421
-2 820 588 300 0.00107421
-3 820 588 546 300 0.00107421
-1 859 586 0.00107694
-2 859 586 527 0.00107694
-2 859 820 586 0.00107694
-3 859 820 586 527 0.00107694
-2 859 586 507 0.00107723
-3 859 586 527 507 0.00107723
-1 306 0 0.00107754
-2 306 177 0 0.00107754
-2 558 306 0 0.00107754
-3 558 306 177 0 0.00107754
-1 433 310 0.00107818
-2 461 433 310 0.00107818
-2 683 433 310 0.00107818
-3 683 461 433 310 0.00107818
-2 901 751 466 0.00107904
-3 901 751 750 466 0.00107904
-1 859 588 0.00107934
-2 859 588 586 0.00107934
-2 859 820 588 0.00107934
-3 859 820 588 586 0.00107934
-2 859 588 507 0.00107971
-3 859 588 586 507 0.00107971
-2 859 588 300 0.00107973
-3 859 820 588 300 0.00107973
-2 660 548 420 0.00107976
-3 952 660 548 420 0.00107976
-1 911 883 0.00108065
-2 911 883 857 0.00108065
-2 928 911 883 0.00108065
-3 928 911 883 857 0.00108065
-3 859 588 507 300 0.00108106
-1 85 82 0.00108207
-2 85 82 69 0.00108207
-2 87 85 82 0.00108207
-3 87 85 82 69 0.00108207
-2 365 256 119 0.0010838
-3 365 256 121 119 0.0010838
-2 857 825 354 0.00108452
-3 857 853 825 354 0.00108452
-1 783 361 0.00108547
-2 783 361 302 0.00108547
-2 974 783 361 0.00108547
-3 974 783 361 302 0.00108547
-2 433 310 167 0.00108595
-3 461 433 310 167 0.00108595
-2 974 588 250 0.00108716
-3 974 588 321 250 0.00108716
-1 457 0 0.00108735
-2 457 3 0 0.00108735
-2 893 457 0 0.00108735
-3 893 457 3 0 0.00108735
-1 824 462 0.00108825
-2 824 568 462 0.00108825
-2 824 757 462 0.00108825
-3 824 757 568 462 0.00108825
-1 920 82 0.00108907
-2 920 654 82 0.00108907
-2 964 920 82 0.00108907
-3 964 920 654 82 0.00108907
-1 916 271 0.00109095
-2 916 271 270 0.00109095
-2 916 275 271 0.00109095
-3 916 275 271 270 0.00109095
-2 899 727 725 0.00109458
-3 899 727 725 724 0.00109458
-2 974 361 250 0.00109555
-3 974 588 361 250 0.00109555
-2 558 306 117 0.00109598
-3 558 330 306 117 0.00109598
-1 916 485 0.00109722
-2 916 485 270 0.00109722
-2 916 485 271 0.00109722
-3 916 485 271 270 0.00109722
-1 571 354 0.00109734
-2 784 571 354 0.00109734
-2 825 571 354 0.00109734
-3 825 784 571 354 0.00109734
-1 824 744 0.00109736
-2 824 744 462 0.00109736
-2 824 757 744 0.00109736
-3 824 757 744 462 0.00109736
-2 922 727 547 0.00109783
-3 922 871 727 547 0.00109783
-1 669 454 0.0010994
-2 669 460 454 0.0010994
-2 760 669 454 0.0010994
-3 760 669 460 454 0.0010994
-2 618 597 508 0.00109953
-3 802 618 597 508 0.00109953
-1 745 83 0.00109996
-2 745 567 83 0.00109996
-2 764 745 83 0.00109996
-3 764 745 567 83 0.00109996
-1 824 302 0.00110033
-2 824 568 302 0.00110033
-2 824 783 302 0.00110033
-3 824 783 568 302 0.00110033
-2 972 911 336 0.0011005
-3 972 911 607 336 0.0011005
-2 618 597 42 0.00110086
-3 618 597 508 42 0.00110086
-1 956 354 0.00110089
-2 956 825 354 0.00110089
-2 956 857 354 0.00110089
-3 956 857 825 354 0.00110089
-1 568 361 0.00110193
-2 568 361 302 0.00110193
-2 600 568 361 0.00110193
-3 600 568 361 302 0.00110193
-1 601 354 0.00110223
-2 601 571 354 0.00110223
-2 825 601 354 0.00110223
-3 825 601 571 354 0.00110223
-1 510 459 0.00110334
-2 510 459 43 0.00110334
-2 660 510 459 0.00110334
-3 660 510 459 43 0.00110334
-1 911 261 0.00110369
-2 911 339 261 0.00110369
-2 928 911 261 0.00110369
-3 928 911 339 261 0.00110369
-1 485 275 0.00110389
-2 485 275 271 0.00110389
-2 916 485 275 0.00110389
-3 916 485 275 271 0.00110389
-1 683 571 0.00110404
-2 736 683 571 0.00110404
-2 742 683 571 0.00110404
-3 742 736 683 571 0.00110404
-1 824 361 0.00110498
-2 824 361 302 0.00110498
-2 824 783 361 0.00110498
-3 824 783 361 302 0.00110498
-2 824 568 361 0.00110499
-3 824 568 361 302 0.00110499
-2 956 601 354 0.00110546
-3 956 825 601 354 0.00110546
-1 824 600 0.00110595
-2 824 600 361 0.00110595
-2 824 600 568 0.00110595
-3 824 600 568 361 0.00110595
-2 726 549 548 0.00110674
-3 726 550 549 548 0.00110674
-1 980 6 0.00110695
-2 980 6 4 0.00110695
-2 980 327 6 0.00110695
-3 980 327 6 4 0.00110695
-2 911 336 261 0.00110698
-3 911 339 336 261 0.00110698
-1 956 392 0.00110841
-2 956 392 354 0.00110841
-2 956 857 392 0.00110841
-3 956 857 392 354 0.00110841
-1 349 197 0.0011104
-2 349 226 197 0.0011104
-2 350 349 197 0.0011104
-3 350 349 226 197 0.0011104
-1 819 631 0.00111086
-2 819 631 279 0.00111086
-2 819 631 547 0.00111086
-3 819 631 547 279 0.00111086
-1 631 317 0.00111089
-2 631 355 317 0.00111089
-2 631 392 317 0.00111089
-3 631 392 355 317 0.00111089
-2 667 631 144 0.00111093
-3 667 631 497 144 0.00111093
-1 693 655 0.00111147
-2 693 655 510 0.00111147
-2 693 656 655 0.00111147
-3 693 656 655 510 0.00111147
-1 953 361 0.0011128
-2 953 783 361 0.0011128
-2 974 953 361 0.0011128
-3 974 953 783 361 0.0011128
-1 878 127 0.00111288
-2 878 127 124 0.00111288
-2 878 264 127 0.00111288
-3 878 264 127 124 0.00111288
-2 317 250 144 0.00111294
-3 317 250 182 144 0.00111294
-2 803 776 199 0.00111298
-3 848 803 776 199 0.00111298
-2 485 403 275 0.00111382
-3 485 403 275 271 0.00111382
-2 953 824 361 0.00111745
-3 953 824 783 361 0.00111745
-1 645 82 0.00111842
-2 865 645 82 0.00111842
-2 964 645 82 0.00111842
-3 964 865 645 82 0.00111842
-2 306 56 0 0.00111887
-3 306 177 56 0 0.00111887
-2 824 600 462 0.00111916
-3 824 600 568 462 0.00111916
-2 953 361 250 0.00111938
-3 974 953 361 250 0.00111938
-1 953 600 0.00111969
-2 953 600 361 0.00111969
-2 953 824 600 0.00111969
-3 953 824 600 361 0.00111969
-2 824 744 571 0.00112009
-3 824 757 744 571 0.00112009
-1 883 392 0.0011211
-2 883 857 392 0.0011211
-2 956 883 392 0.0011211
-3 956 883 857 392 0.0011211
-1 727 548 0.00112114
-2 727 684 548 0.00112114
-2 727 726 548 0.00112114
-3 727 726 684 548 0.00112114
-1 911 340 0.00112408
-2 911 340 261 0.00112408
-2 928 911 340 0.00112408
-3 928 911 340 261 0.00112408
-1 448 42 0.00112417
-2 597 448 42 0.00112417
-2 618 448 42 0.00112417
-3 618 597 448 42 0.00112417
-2 764 558 117 0.00112481
-3 764 558 117 102 0.00112481
-1 991 531 0.00112498
-2 991 838 531 0.00112498
-2 991 990 531 0.00112498
-3 991 990 838 531 0.00112498
-2 911 883 392 0.00112552
-3 911 883 857 392 0.00112552
-1 777 219 0.00112638
-2 777 219 94 0.00112638
-2 777 479 219 0.00112638
-3 777 479 219 94 0.00112638
-1 916 403 0.00112654
-2 916 403 275 0.00112654
-2 916 485 403 0.00112654
-3 916 485 403 275 0.00112654
-1 975 496 0.00112797
-2 975 598 496 0.00112797
-2 975 867 496 0.00112797
-3 975 867 598 496 0.00112797
-1 684 547 0.00112839
-2 921 684 547 0.00112839
-2 922 684 547 0.00112839
-3 922 921 684 547 0.00112839
-1 837 610 0.0011288
-2 869 837 610 0.0011288
-2 990 837 610 0.0011288
-3 990 869 837 610 0.0011288
-1 310 262 0.00113108
-2 433 310 262 0.00113108
-2 683 310 262 0.00113108
-3 683 433 310 262 0.00113108
-2 920 645 82 0.00113279
-3 964 920 645 82 0.00113279
-2 855 845 500 0.00113344
-3 855 845 501 500 0.00113344
-2 428 308 227 0.00113671
-3 428 308 227 225 0.00113671
-1 697 656 0.00113703
-2 720 697 656 0.00113703
-2 891 697 656 0.00113703
-3 891 720 697 656 0.00113703
-1 953 462 0.00113754
-2 953 600 462 0.00113754
-2 953 824 462 0.00113754
-3 953 824 600 462 0.00113754
-1 928 392 0.00113905
-2 928 883 392 0.00113905
-2 928 911 392 0.00113905
-3 928 911 883 392 0.00113905
-1 350 196 0.00113925
-2 350 196 194 0.00113925
-2 351 350 196 0.00113925
-3 351 350 196 194 0.00113925
-2 928 456 340 0.00113951
-3 928 851 456 340 0.00113951
-1 717 82 0.0011406
-2 717 404 82 0.0011406
-2 717 654 82 0.0011406
-3 717 654 404 82 0.0011406
-1 991 972 0.00114089
-2 991 972 531 0.00114089
-2 991 990 972 0.00114089
-3 991 990 972 531 0.00114089
-1 617 42 0.00114426
-2 617 247 42 0.00114426
-2 618 617 42 0.00114426
-3 618 617 247 42 0.00114426
-2 697 679 656 0.00114468
-3 720 697 679 656 0.00114468
-2 779 382 191 0.00114577
-3 779 475 382 191 0.00114577
-1 262 167 0.00114618
-2 310 262 167 0.00114618
-2 433 262 167 0.00114618
-3 433 310 262 167 0.00114618
-1 858 42 0.0011462
-2 858 448 42 0.0011462
-2 858 618 42 0.0011462
-3 858 618 448 42 0.0011462
-1 745 117 0.00114706
-2 745 117 83 0.00114706
-2 764 745 117 0.00114706
-3 764 745 117 83 0.00114706
-1 456 392 0.00114808
-2 883 456 392 0.00114808
-2 928 456 392 0.00114808
-3 928 883 456 392 0.00114808
-2 435 255 216 0.00114971
-3 435 255 216 134 0.00114971
-1 677 262 0.00115007
-2 879 677 262 0.00115007
-2 992 677 262 0.00115007
-3 992 879 677 262 0.00115007
-1 551 421 0.0011519
-2 551 421 420 0.0011519
-2 838 551 421 0.0011519
-3 838 551 421 420 0.0011519
-2 858 617 42 0.00115208
-3 858 618 617 42 0.00115208
-1 629 549 0.00115219
-2 629 550 549 0.00115219
-2 978 629 549 0.00115219
-3 978 629 550 549 0.00115219
-1 693 35 0.00115256
-2 693 35 34 0.00115256
-2 693 258 35 0.00115256
-3 693 258 35 34 0.00115256
-2 956 456 392 0.00115385
-3 956 883 456 392 0.00115385
-2 985 677 262 0.00115449
-2 992 985 677 0.00115449
-3 992 985 677 262 0.00115449
-1 911 456 0.00115481
-2 911 456 340 0.00115481
-2 928 911 456 0.00115481
-3 928 911 456 340 0.00115481
-2 911 456 392 0.0011551
-3 928 911 456 392 0.0011551
-1 169 147 0.00115527
-2 170 169 147 0.00115527
-2 171 169 147 0.00115527
-3 171 170 169 147 0.00115527
-1 392 340 0.00115639
-2 456 392 340 0.00115639
-2 911 392 340 0.00115639
-3 911 456 392 340 0.00115639
-1 285 53 0.0011603
-2 285 56 53 0.0011603
-2 399 285 53 0.0011603
-3 399 285 56 53 0.0011603
-1 941 649 0.00116323
-2 941 649 648 0.00116323
-2 975 941 649 0.00116323
-3 975 941 649 648 0.00116323
-1 459 426 0.00116384
-2 459 426 43 0.00116384
-2 459 426 128 0.00116384
-3 459 426 128 43 0.00116384
-1 971 0 0.00116415
-2 971 1 0 0.00116415
-2 971 908 0 0.00116415
-3 971 908 1 0 0.00116415
-1 817 631 0.00116529
-2 817 631 279 0.00116529
-2 819 817 631 0.00116529
-3 819 817 631 279 0.00116529
-1 104 32 0.00116672
-2 122 104 32 0.00116672
-2 399 104 32 0.00116672
-3 399 122 104 32 0.00116672
-1 717 644 0.00116822
-2 717 653 644 0.00116822
-2 920 717 644 0.00116822
-3 920 717 653 644 0.00116822
-1 600 250 0.00116827
-2 600 361 250 0.00116827
-2 953 600 250 0.00116827
-3 953 600 361 250 0.00116827
-1 167 144 0.00117136
-2 167 166 144 0.00117136
-2 310 167 144 0.00117136
-3 310 167 166 144 0.00117136
-1 955 42 0.0011725
-2 955 247 42 0.0011725
-2 955 424 42 0.0011725
-3 955 424 247 42 0.0011725
-1 955 279 0.00117328
-2 955 667 279 0.00117328
-2 955 817 279 0.00117328
-3 955 817 667 279 0.00117328
-1 942 751 0.00117543
-2 942 751 507 0.00117543
-2 942 772 751 0.00117543
-3 942 772 751 507 0.00117543
-1 977 629 0.00117554
-2 977 684 629 0.00117554
-2 977 861 629 0.00117554
-3 977 861 684 629 0.00117554
-2 600 250 75 0.00117617
-3 600 361 250 75 0.00117617
-1 834 806 0.00117646
-2 834 806 732 0.00117646
-2 911 834 806 0.00117646
-3 911 834 806 732 0.00117646
-1 726 629 0.00117668
-2 726 684 629 0.00117668
-2 977 726 629 0.00117668
-3 977 726 684 629 0.00117668
-1 956 571 0.00117683
-2 956 601 571 0.00117683
-2 956 736 571 0.00117683
-3 956 736 601 571 0.00117683
-2 950 916 485 0.00117784
-3 950 916 485 270 0.00117784
-1 571 317 0.00117854
-2 571 354 317 0.00117854
-2 784 571 317 0.00117854
-3 784 571 354 317 0.00117854
-1 426 42 0.00117864
-2 426 43 42 0.00117864
-2 426 424 42 0.00117864
-3 426 424 43 42 0.00117864
-1 953 744 0.0011792
-2 953 744 462 0.0011792
-2 953 824 744 0.0011792
-3 953 824 744 462 0.0011792
-1 287 0 0.00118021
-2 287 56 0 0.00118021
-2 306 287 0 0.00118021
-3 306 287 56 0 0.00118021
-2 978 977 629 0.00118032
-3 978 977 861 629 0.00118032
-2 956 571 354 0.00118185
-3 956 601 571 354 0.00118185
-2 865 87 82 0.00118199
-3 865 864 87 82 0.00118199
-1 996 1 0.001183
-2 996 971 1 0.001183
-2 996 995 1 0.001183
-3 996 995 971 1 0.001183
-1 169 149 0.00118518
-2 169 149 147 0.00118518
-2 170 169 149 0.00118518
-3 170 169 149 147 0.00118518
-1 597 510 0.0011868
-2 597 510 42 0.0011868
-2 597 518 510 0.0011868
-3 597 518 510 42 0.0011868
-2 744 683 571 0.00118775
-3 744 742 683 571 0.00118775
-1 684 459 0.00118801
-2 684 459 128 0.00118801
-2 684 548 459 0.00118801
-3 684 548 459 128 0.00118801
-1 956 317 0.00118827
-2 956 354 317 0.00118827
-2 956 571 317 0.00118827
-3 956 571 354 317 0.00118827
-1 85 83 0.00118874
-2 85 83 69 0.00118874
-2 967 85 83 0.00118874
-3 967 85 83 69 0.00118874
-1 392 261 0.00118964
-2 392 340 261 0.00118964
-2 911 392 261 0.00118964
-3 911 392 340 261 0.00118964
-1 760 58 0.00119285
-2 760 320 58 0.00119285
-2 760 321 58 0.00119285
-3 760 321 320 58 0.00119285
-1 827 459 0.00119355
-2 827 459 128 0.00119355
-2 827 684 459 0.00119355
-3 827 684 459 128 0.00119355
-1 548 421 0.00119489
-2 548 421 420 0.00119489
-2 660 548 421 0.00119489
-3 660 548 421 420 0.00119489
-1 824 33 0.00119605
-2 824 784 33 0.00119605
-2 953 824 33 0.00119605
-3 953 824 784 33 0.00119605
-2 551 548 421 0.00119745
-3 551 548 421 420 0.00119745
-2 600 250 74 0.00119984
-3 600 250 75 74 0.00119984
-2 817 631 547 0.00120027
-3 819 817 631 547 0.00120027
-1 991 336 0.00120028
-2 991 531 336 0.00120028
-2 991 972 336 0.00120028
-3 991 972 531 336 0.00120028
-2 827 459 426 0.00120103
-3 827 459 426 128 0.00120103
-1 435 215 0.00120107
-2 435 216 215 0.00120107
-2 435 268 215 0.00120107
-3 435 268 216 215 0.00120107
-1 736 317 0.00120132
-2 736 571 317 0.00120132
-2 956 736 317 0.00120132
-3 956 736 571 317 0.00120132
-2 955 617 42 0.00120191
-3 955 617 247 42 0.00120191
-1 736 354 0.00120262
-2 736 354 317 0.00120262
-2 956 736 354 0.00120262
-3 956 736 354 317 0.00120262
-1 551 531 0.00120366
-2 551 531 421 0.00120366
-2 838 551 531 0.00120366
-3 838 551 531 421 0.00120366
-2 631 317 144 0.00120376
-3 631 355 317 144 0.00120376
-1 949 551 0.00120436
-2 949 551 549 0.00120436
-1 991 549 0.00120436
-2 991 551 549 0.00120436
-1 991 949 0.00120436
-2 991 949 549 0.00120436
-2 991 949 551 0.00120436
-3 991 949 551 549 0.00120436
-1 875 268 0.00120464
-2 875 537 268 0.00120464
-2 875 781 268 0.00120464
-3 875 781 537 268 0.00120464
-1 403 390 0.00120516
-2 403 390 386 0.00120516
-2 403 391 390 0.00120516
-3 403 391 390 386 0.00120516
-1 824 683 0.00120649
-2 824 683 571 0.00120649
-2 824 744 683 0.00120649
-3 824 744 683 571 0.00120649
-1 827 548 0.00120665
-2 827 548 459 0.00120665
-2 827 684 548 0.00120665
-3 827 684 548 459 0.00120665
-1 683 317 0.00120759
-2 683 571 317 0.00120759
-2 736 683 317 0.00120759
-3 736 683 571 317 0.00120759
-2 435 255 215 0.00120788
-3 435 255 216 215 0.00120788
-1 876 268 0.00120894
-2 876 781 268 0.00120894
-2 876 784 268 0.00120894
-3 876 784 781 268 0.00120894
-2 777 635 219 0.00120975
-3 777 635 479 219 0.00120975
-1 697 660 0.00120976
-2 697 660 421 0.00120976
-2 697 679 660 0.00120976
-3 697 679 660 421 0.00120976
-1 976 629 0.00121128
-2 976 629 549 0.00121128
-2 978 976 629 0.00121128
-3 978 976 629 549 0.00121128
-1 88 82 0.00121163
-2 88 85 82 0.00121163
-2 88 87 82 0.00121163
-3 88 87 85 82 0.00121163
-2 903 668 666 0.00121165
-3 903 668 667 666 0.00121165
-1 31 2 0.00121215
-2 38 31 2 0.00121215
-2 428 31 2 0.00121215
-3 428 38 31 2 0.00121215
-1 784 683 0.0012127
-2 784 683 317 0.0012127
-2 784 683 571 0.0012127
-3 784 683 571 317 0.0012127
-1 427 42 0.00121432
-2 427 424 42 0.00121432
-2 955 427 42 0.00121432
-3 955 427 424 42 0.00121432
-2 824 784 683 0.00121442
-3 824 784 683 571 0.00121442
-2 697 660 656 0.00121551
-3 697 679 660 656 0.00121551
-1 959 597 0.00121705
-2 959 597 515 0.00121705
-2 984 959 597 0.00121705
-3 984 959 597 515 0.00121705
-1 600 33 0.00121733
-2 600 250 33 0.00121733
-2 953 600 33 0.00121733
-3 953 600 250 33 0.00121733
-1 462 33 0.00121822
-2 600 462 33 0.00121822
-2 953 462 33 0.00121822
-3 953 600 462 33 0.00121822
-2 350 197 196 0.00121993
-3 350 197 196 194 0.00121993
-2 876 875 268 0.00122018
-3 876 875 781 268 0.00122018
-2 85 83 82 0.00122184
-3 85 83 82 69 0.00122184
-2 991 551 531 0.00122338
-3 991 838 551 531 0.00122338
-2 427 426 42 0.00122428
-3 427 426 424 42 0.00122428
-1 744 33 0.00122448
-2 824 744 33 0.00122448
-2 953 744 33 0.00122448
-3 953 824 744 33 0.00122448
-2 942 766 751 0.00122558
-3 942 766 751 507 0.00122558
-1 462 250 0.00122624
-2 462 250 33 0.00122624
-2 600 462 250 0.00122624
-3 600 462 250 33 0.00122624
-2 744 462 33 0.00122672
-3 953 744 462 33 0.00122672
-2 959 597 518 0.00122802
-3 959 597 518 515 0.00122802
-1 644 82 0.00122873
-2 645 644 82 0.00122873
-2 920 644 82 0.00122873
-3 920 645 644 82 0.00122873
-2 431 169 147 0.00123005
-3 431 171 169 147 0.00123005
-1 829 235 0.00123161
-2 829 235 232 0.00123161
-2 829 235 234 0.00123161
-3 829 235 234 232 0.00123161
-1 793 635 0.00123179
-2 874 793 635 0.00123179
-2 915 793 635 0.00123179
-3 915 874 793 635 0.00123179
-1 761 576 0.00123289
-2 761 576 320 0.00123289
-2 761 576 575 0.00123289
-3 761 576 575 320 0.00123289
-1 365 312 0.00123553
-2 365 312 80 0.00123553
-2 365 312 256 0.00123553
-3 365 312 256 80 0.00123553
-2 365 312 119 0.0012364
-3 365 312 256 119 0.0012364
-1 890 500 0.00123796
-2 890 503 500 0.00123796
-2 890 872 500 0.00123796
-3 890 872 503 500 0.00123796
-1 998 336 0.00123869
-2 998 972 336 0.00123869
-1 998 991 0.00123869
-2 998 991 336 0.00123869
-2 998 991 972 0.00123869
-3 998 991 972 336 0.00123869
-1 683 33 0.00123937
-2 784 683 33 0.00123937
-2 824 683 33 0.00123937
-3 824 784 683 33 0.00123937
-2 744 683 33 0.00123983
-3 824 744 683 33 0.00123983
-2 890 878 872 0.00123993
-3 890 889 878 872 0.00123993
-2 683 317 33 0.00123994
-3 784 683 317 33 0.00123994
-2 959 597 433 0.00124251
-2 984 959 433 0.00124251
-3 984 959 597 433 0.00124251
-1 727 549 0.00124263
-2 727 725 549 0.00124263
-2 727 726 549 0.00124263
-3 727 726 725 549 0.00124263
-2 578 403 390 0.00124649
-3 578 403 391 390 0.00124649
-2 447 167 144 0.0012471
-3 447 167 166 144 0.0012471
-2 745 742 558 0.00124776
-3 763 745 742 558 0.00124776
-1 726 630 0.00124903
-2 726 630 629 0.00124903
-2 726 684 630 0.00124903
-3 726 684 630 629 0.00124903
-1 456 354 0.00125027
-2 456 392 354 0.00125027
-2 956 456 354 0.00125027
-3 956 456 392 354 0.00125027
-2 736 456 354 0.00125044
-3 956 736 456 354 0.00125044
-2 629 551 549 0.00125047
-3 629 551 550 549 0.00125047
-1 891 262 0.00125101
-2 891 677 262 0.00125101
-2 891 879 262 0.00125101
-3 891 879 677 262 0.00125101
-1 683 354 0.00125137
-2 683 354 317 0.00125137
-2 736 683 354 0.00125137
-3 736 683 354 317 0.00125137
-2 727 549 548 0.00125539
-3 727 726 549 548 0.00125539
-1 959 167 0.00125947
-2 959 262 167 0.00125947
-2 959 433 167 0.00125947
-3 959 433 262 167 0.00125947
-1 548 531 0.00125947
-2 548 531 421 0.00125947
-2 551 548 531 0.00125947
-3 551 548 531 421 0.00125947
-1 998 911 0.00126048
-2 998 911 806 0.00126048
-2 998 972 911 0.00126048
-3 998 972 911 806 0.00126048
-2 980 466 6 0.00126057
-3 980 466 327 6 0.00126057
-2 959 597 167 0.00126154
-3 959 597 433 167 0.00126154
-1 817 42 0.00126209
-2 817 426 42 0.00126209
-2 817 427 42 0.00126209
-3 817 427 426 42 0.00126209
-2 683 462 33 0.00126236
-3 744 683 462 33 0.00126236
-2 955 817 42 0.00126344
-3 955 817 427 42 0.00126344
-2 920 717 82 0.00126381
-3 920 717 654 82 0.00126381
-1 875 291 0.00126398
-2 875 291 211 0.00126398
-2 875 537 291 0.00126398
-3 875 537 291 211 0.00126398
-1 817 43 0.00126485
-2 817 43 42 0.00126485
-2 817 426 43 0.00126485
-3 817 426 43 42 0.00126485
-2 998 911 899 0.00126619
-3 998 911 899 806 0.00126619
-1 354 340 0.0012662
-2 392 354 340 0.0012662
-2 456 354 340 0.0012662
-3 456 392 354 340 0.0012662
-2 736 354 340 0.00126629
-3 736 456 354 340 0.00126629
-2 745 558 117 0.00126752
-3 764 745 558 117 0.00126752
-1 683 250 0.00126812
-2 683 462 250 0.00126812
-2 683 600 250 0.00126812
-3 683 600 462 250 0.00126812
-2 683 250 33 0.00126827
-3 683 462 250 33 0.00126827
-1 955 858 0.00126992
-2 955 858 42 0.00126992
-2 955 858 617 0.00126992
-3 955 858 617 42 0.00126992
-2 683 250 74 0.00127123
-3 683 600 250 74 0.00127123
-2 597 447 167 0.00127282
-3 598 597 447 167 0.00127282
-1 62 32 0.00127342
-2 118 62 32 0.00127342
-2 122 62 32 0.00127342
-3 122 118 62 32 0.00127342
-1 244 241 0.00127735
-2 289 244 241 0.00127735
-2 798 244 241 0.00127735
-3 798 289 244 241 0.00127735
-1 834 486 0.00128068
-2 834 631 486 0.00128068
-2 834 795 486 0.00128068
-3 834 795 631 486 0.00128068
-1 727 631 0.00128386
-2 899 727 631 0.00128386
-2 914 727 631 0.00128386
-3 914 899 727 631 0.00128386
-1 510 448 0.00128782
-2 510 448 42 0.00128782
-2 597 510 448 0.00128782
-3 597 510 448 42 0.00128782
-1 725 548 0.00128985
-2 725 549 548 0.00128985
-2 727 725 548 0.00128985
-3 727 725 549 548 0.00128985
-1 597 262 0.00129027
-2 597 262 167 0.00129027
-2 959 597 262 0.00129027
-3 959 597 262 167 0.00129027
-2 683 354 340 0.00129132
-3 736 683 354 340 0.00129132
-1 669 320 0.00129208
-2 758 669 320 0.00129208
-2 760 669 320 0.00129208
-3 760 758 669 320 0.00129208
-1 551 336 0.00129237
-2 551 531 336 0.00129237
-2 991 551 336 0.00129237
-3 991 551 531 336 0.00129237
-2 727 631 547 0.00129247
-3 914 727 631 547 0.00129247
-2 683 317 250 0.00129299
-3 683 317 250 33 0.00129299
-1 708 222 0.00129317
-2 708 222 221 0.00129317
-2 710 708 222 0.00129317
-3 710 708 222 221 0.00129317
-2 998 911 336 0.00129342
-3 998 972 911 336 0.00129342
-1 994 428 0.0012999
-2 994 968 428 0.0012999
-2 994 993 428 0.0012999
-3 994 993 968 428 0.0012999
-1 340 317 0.00130053
-2 354 340 317 0.00130053
-2 683 340 317 0.00130053
-3 683 354 340 317 0.00130053
-1 949 336 0.0013011
-2 991 949 336 0.0013011
-2 998 949 336 0.0013011
-2 998 991 949 0.0013011
-3 998 991 949 336 0.0013011
-2 392 340 317 0.00130292
-3 392 354 340 317 0.00130292
-1 899 336 0.00130484
-2 911 899 336 0.00130484
-2 998 899 336 0.00130484
-3 998 911 899 336 0.00130484
-2 701 201 199 0.00130691
-3 701 201 200 199 0.00130691
-2 760 454 58 0.00130912
-3 760 454 321 58 0.00130912
-1 697 510 0.00131065
-2 697 656 510 0.00131065
-2 891 697 510 0.00131065
-3 891 697 656 510 0.00131065
-2 683 310 250 0.00131103
-3 683 310 250 74 0.00131103
-1 548 336 0.00131257
-2 548 531 336 0.00131257
-2 551 548 336 0.00131257
-3 551 548 531 336 0.00131257
-1 697 548 0.00131386
-2 697 548 421 0.00131386
-2 697 660 548 0.00131386
-3 697 660 548 421 0.00131386
-2 949 551 336 0.00131402
-3 991 949 551 336 0.00131402
-2 949 899 336 0.00131676
-3 998 949 899 336 0.00131676
-1 669 58 0.00131717
-2 669 454 58 0.00131717
-2 760 669 58 0.00131717
-3 760 669 454 58 0.00131717
-2 736 457 3 0.001319
-3 851 736 457 3 0.001319
-1 631 261 0.00131945
-2 631 392 261 0.00131945
-2 911 631 261 0.00131945
-3 911 631 392 261 0.00131945
-1 549 336 0.00131968
-2 551 549 336 0.00131968
-2 949 549 336 0.00131968
-3 949 551 549 336 0.00131968
-1 631 336 0.0013198
-2 631 336 261 0.0013198
-2 911 631 336 0.0013198
-3 911 631 336 261 0.0013198
-1 817 684 0.00132009
-2 827 817 684 0.00132009
-2 921 817 684 0.00132009
-3 921 827 817 684 0.00132009
-1 677 597 0.00132073
-2 677 597 518 0.00132073
-2 959 677 597 0.00132073
-3 959 677 597 518 0.00132073
-2 365 312 81 0.00132138
-3 365 312 81 80 0.00132138
-1 879 698 0.00132143
-2 879 698 696 0.00132143
-2 879 698 697 0.00132143
-3 879 698 697 696 0.00132143
-2 697 548 531 0.00132146
-3 697 548 531 421 0.00132146
-2 104 62 32 0.00132516
-3 122 104 62 32 0.00132516
-1 919 651 0.00132672
-2 919 651 625 0.00132672
-2 919 695 651 0.00132672
-3 919 695 651 625 0.00132672
-1 913 268 0.0013269
-2 913 875 268 0.0013269
-2 913 876 268 0.0013269
-3 913 876 875 268 0.0013269
-2 875 291 268 0.00132809
-3 875 537 291 268 0.00132809
-2 899 631 336 0.0013289
-3 911 899 631 336 0.0013289
-2 762 578 98 0.00132904
-3 762 711 578 98 0.00132904
-2 293 39 4 0.00133231
-3 293 103 39 4 0.00133231
-1 777 536 0.00133379
-2 777 536 219 0.00133379
-2 777 635 536 0.00133379
-3 777 635 536 219 0.00133379
-2 669 320 58 0.00133588
-3 760 669 320 58 0.00133588
-2 697 548 336 0.00133619
-3 697 548 531 336 0.00133619
-2 549 548 336 0.00133661
-3 551 549 548 336 0.00133661
-1 899 548 0.00133731
-2 899 725 548 0.00133731
-2 899 727 548 0.00133731
-3 899 727 725 548 0.00133731
-1 858 854 0.00133861
-2 858 854 144 0.00133861
-2 858 854 617 0.00133861
-3 858 854 617 144 0.00133861
-2 955 858 854 0.00133872
-3 955 858 854 617 0.00133872
-1 114 82 0.00134037
-2 114 85 82 0.00134037
-2 114 88 82 0.00134037
-3 114 88 85 82 0.00134037
-1 817 459 0.00134086
-2 817 459 426 0.00134086
-2 827 817 459 0.00134086
-3 827 817 459 426 0.00134086
-2 922 726 630 0.00134131
-3 922 726 684 630 0.00134131
-1 899 549 0.00134146
-2 899 725 549 0.00134146
-2 949 899 549 0.00134146
-3 949 899 725 549 0.00134146
-1 554 0 0.00134227
-2 908 554 0 0.00134227
-2 971 554 0 0.00134227
-3 971 908 554 0 0.00134227
-1 955 144 0.00134236
-2 955 854 144 0.00134236
-2 955 858 144 0.00134236
-3 955 858 854 144 0.00134236
-1 510 426 0.00134282
-2 510 426 43 0.00134282
-2 510 459 426 0.00134282
-3 510 459 426 43 0.00134282
-2 697 660 510 0.00134313
-3 697 660 656 510 0.00134313
-1 955 631 0.00134362
-2 955 631 279 0.00134362
-2 955 817 631 0.00134362
-3 955 817 631 279 0.00134362
-2 727 684 547 0.00134467
-3 922 727 684 547 0.00134467
-2 899 549 548 0.00134598
-3 899 725 549 548 0.00134598
-2 312 286 60 0.00134638
-3 312 286 267 60 0.00134638
-1 817 510 0.0013482
-2 817 510 43 0.0013482
-2 817 510 426 0.0013482
-3 817 510 426 43 0.0013482
-1 496 449 0.00134878
-2 520 496 449 0.00134878
-2 598 496 449 0.00134878
-3 598 520 496 449 0.00134878
-2 955 667 631 0.00134893
-3 955 667 631 279 0.00134893
-2 878 812 264 0.00135193
-3 878 812 264 125 0.00135193
-2 817 510 459 0.00135365
-3 817 510 459 426 0.00135365
-1 798 351 0.00135368
-2 798 351 244 0.00135368
-2 822 798 351 0.00135368
-3 822 798 351 244 0.00135368
-1 817 548 0.00135576
-2 817 684 548 0.00135576
-2 827 817 548 0.00135576
-3 827 817 684 548 0.00135576
-1 907 111 0.00136006
-2 907 111 109 0.00136006
-2 907 111 110 0.00136006
-3 907 111 110 109 0.00136006
-2 817 548 459 0.00136043
-3 827 817 548 459 0.00136043
-2 899 549 336 0.00136172
-3 949 899 549 336 0.00136172
-1 276 219 0.00136176
-2 276 219 93 0.00136176
-2 478 276 219 0.00136176
-3 478 276 219 93 0.00136176
-2 955 667 144 0.00136447
-3 955 854 667 144 0.00136447
-1 955 448 0.00136566
-2 955 448 42 0.00136566
-2 955 858 448 0.00136566
-3 955 858 448 42 0.00136566
-2 817 684 547 0.00136744
-3 921 817 684 547 0.00136744
-1 683 251 0.00136772
-2 683 251 250 0.00136772
-2 683 310 251 0.00136772
-3 683 310 251 250 0.00136772
-1 683 144 0.00137606
-2 683 251 144 0.00137606
-2 683 310 144 0.00137606
-3 683 310 251 144 0.00137606
-1 594 325 0.001377
-2 594 325 323 0.001377
-2 594 472 325 0.001377
-3 594 472 325 323 0.001377
-1 951 466 0.00137755
-2 951 901 466 0.00137755
-2 951 902 466 0.00137755
-3 951 902 901 466 0.00137755
-2 899 548 336 0.00137842
-3 899 549 548 336 0.00137842
-2 834 732 486 0.00138037
-3 834 732 631 486 0.00138037
-2 961 951 466 0.00138159
-3 961 951 902 466 0.00138159
-1 631 548 0.00138295
-2 727 631 548 0.00138295
-2 899 631 548 0.00138295
-3 899 727 631 548 0.00138295
-2 352 288 149 0.00138355
-3 352 290 288 149 0.00138355
-2 721 693 655 0.00138441
-3 721 693 656 655 0.00138441
-1 900 696 0.00138629
-2 900 879 696 0.00138629
-2 900 891 696 0.00138629
-3 900 891 879 696 0.00138629
-1 913 291 0.00138631
-2 913 291 268 0.00138631
-2 913 875 291 0.00138631
-3 913 875 291 268 0.00138631
-2 817 510 42 0.00138725
-3 817 510 43 42 0.00138725
-1 548 547 0.00138759
-2 684 548 547 0.00138759
-2 727 548 547 0.00138759
-3 727 684 548 547 0.00138759
-2 683 250 144 0.00138787
-3 683 251 250 144 0.00138787
-2 891 697 262 0.00138923
-3 891 879 697 262 0.00138923
-1 455 3 0.00139041
-2 457 455 3 0.00139041
-2 736 455 3 0.00139041
-3 736 457 455 3 0.00139041
-1 548 510 0.00139233
-2 548 510 459 0.00139233
-2 660 548 510 0.00139233
-3 660 548 510 459 0.00139233
-1 975 347 0.00139252
-2 975 836 347 0.00139252
-2 975 941 347 0.00139252
-3 975 941 836 347 0.00139252
-1 985 597 0.00139302
-2 985 677 597 0.00139302
-2 985 959 597 0.00139302
-3 985 959 677 597 0.00139302
-1 916 351 0.0013945
-2 916 485 351 0.0013945
-2 950 916 351 0.0013945
-3 950 916 485 351 0.0013945
-1 276 4 0.00139533
-2 276 7 4 0.00139533
-2 730 276 4 0.00139533
-3 730 276 7 4 0.00139533
-2 631 548 336 0.00139601
-3 899 631 548 336 0.00139601
-1 875 431 0.00139677
-2 965 875 431 0.00139677
-2 966 875 431 0.00139677
-3 966 965 875 431 0.00139677
-1 455 0 0.00139897
-2 455 3 0 0.00139897
-2 457 455 0 0.00139897
-3 457 455 3 0 0.00139897
-1 117 0 0.00140341
-2 306 117 0 0.00140341
-2 558 117 0 0.00140341
-3 558 306 117 0 0.00140341
-2 985 597 262 0.00140395
-3 985 959 597 262 0.00140395
-2 895 674 342 0.00140821
-3 895 771 674 342 0.00140821
-2 875 431 147 0.00140821
-3 966 875 431 147 0.00140821
-1 846 324 0.0014092
-2 846 324 303 0.0014092
-2 846 594 324 0.0014092
-3 846 594 324 303 0.0014092
-1 955 510 0.00140935
-2 955 510 42 0.00140935
-2 955 817 510 0.00140935
-3 955 817 510 42 0.00140935
-2 677 597 262 0.00141055
-3 985 677 597 262 0.00141055
-1 510 262 0.00141267
-2 697 510 262 0.00141267
-2 891 510 262 0.00141267
-3 891 697 510 262 0.00141267
-2 677 510 262 0.00141329
-3 891 677 510 262 0.00141329
-2 693 655 34 0.00141396
-3 693 655 510 34 0.00141396
-1 865 325 0.0014168
-2 865 535 325 0.0014168
-2 865 740 325 0.0014168
-3 865 740 535 325 0.0014168
-2 817 548 510 0.00141704
-3 817 548 510 459 0.00141704
-1 736 0 0.00141771
-2 736 3 0 0.00141771
-2 736 455 0 0.00141771
-3 736 455 3 0 0.00141771
-2 955 510 448 0.0014188
-3 955 510 448 42 0.0014188
-1 669 576 0.00141924
-2 669 576 58 0.00141924
-2 669 576 320 0.00141924
-3 669 576 320 58 0.00141924
-1 775 382 0.00142064
-2 775 383 382 0.00142064
-2 775 755 382 0.00142064
-3 775 755 383 382 0.00142064
-1 758 576 0.00142117
-2 758 576 320 0.00142117
-2 761 758 576 0.00142117
-3 761 758 576 320 0.00142117
-2 955 631 144 0.0014217
-3 955 667 631 144 0.0014217
-1 393 319 0.00142381
-2 393 354 319 0.00142381
-2 577 393 319 0.00142381
-3 577 393 354 319 0.00142381
-1 867 347 0.0014253
-2 867 347 206 0.0014253
-2 867 836 347 0.0014253
-3 867 836 347 206 0.0014253
-1 325 82 0.00142814
-2 325 87 82 0.00142814
-2 325 88 82 0.00142814
-3 325 88 87 82 0.00142814
-1 968 431 0.00142978
-2 968 431 428 0.00142978
-2 983 968 431 0.00142978
-3 983 968 431 428 0.00142978
-2 817 548 547 0.00143158
-3 817 684 548 547 0.00143158
-1 845 503 0.0014341
-2 845 503 500 0.0014341
-2 855 845 503 0.0014341
-3 855 845 503 500 0.0014341
-1 226 118 0.00143411
-2 226 118 32 0.00143411
-2 406 226 118 0.00143411
-3 406 226 118 32 0.00143411
-1 447 310 0.00143443
-2 447 310 144 0.00143443
-2 447 310 167 0.00143443
-3 447 310 167 144 0.00143443
-2 631 548 547 0.00143464
-3 727 631 548 547 0.00143464
-1 876 291 0.00143671
-2 876 291 268 0.00143671
-2 913 876 291 0.00143671
-3 913 876 291 268 0.00143671
-1 904 382 0.00144379
-2 904 779 382 0.00144379
-2 904 780 382 0.00144379
-3 904 780 779 382 0.00144379
-1 392 262 0.00144861
-2 392 262 261 0.00144861
-2 392 340 262 0.00144861
-3 392 340 262 261 0.00144861
-2 683 317 144 0.00145387
-3 683 317 250 144 0.00145387
-2 893 554 0 0.00145546
-3 908 893 554 0 0.00145546
-1 317 262 0.00145943
-2 340 317 262 0.00145943
-2 683 317 262 0.00145943
-3 683 340 317 262 0.00145943
-1 877 268 0.00146169
-2 877 784 268 0.00146169
-2 877 876 268 0.00146169
-3 877 876 784 268 0.00146169
-1 285 54 0.00146171
-2 285 54 53 0.00146171
-2 285 56 54 0.00146171
-3 285 56 54 53 0.00146171
-1 623 27 0.00146225
-2 657 623 27 0.00146225
-2 659 623 27 0.00146225
-3 659 657 623 27 0.00146225
-2 392 317 262 0.00146555
-3 392 340 317 262 0.00146555
-1 472 445 0.00146608
-2 567 472 445 0.00146608
-2 595 472 445 0.00146608
-3 595 567 472 445 0.00146608
-2 669 576 454 0.00146859
-3 669 576 454 58 0.00146859
-2 867 496 233 0.00146995
-3 867 496 233 108 0.00146995
-2 478 276 4 0.00147069
-3 478 276 7 4 0.00147069
-1 817 448 0.00147281
-2 817 510 448 0.00147281
-2 955 817 448 0.00147281
-3 955 817 510 448 0.00147281
-1 793 284 0.00147429
-2 793 635 284 0.00147429
-2 915 793 284 0.00147429
-3 915 793 635 284 0.00147429
-1 790 536 0.0014754
-2 790 635 536 0.0014754
-2 790 777 536 0.0014754
-3 790 777 635 536 0.0014754
-2 758 669 576 0.00147567
-3 758 669 576 320 0.00147567
-1 114 83 0.00148002
-2 114 83 82 0.00148002
-2 114 85 83 0.00148002
-3 114 85 83 82 0.00148002
-1 403 385 0.00148097
-2 403 385 275 0.00148097
-2 403 386 385 0.00148097
-3 403 386 385 275 0.00148097
-1 631 262 0.00148417
-2 631 262 261 0.00148417
-2 631 392 262 0.00148417
-3 631 392 262 261 0.00148417
-1 787 192 0.00148992
-2 787 192 51 0.00148992
-2 787 755 192 0.00148992
-3 787 755 192 51 0.00148992
-1 29 2 0.00149423
-2 31 29 2 0.00149423
-2 38 29 2 0.00149423
-3 38 31 29 2 0.00149423
-2 975 867 347 0.00149862
-3 975 867 836 347 0.00149862
-2 55 29 2 0.00149898
-3 55 38 29 2 0.00149898
-1 594 114 0.00150069
-2 594 325 114 0.00150069
-2 594 472 114 0.00150069
-3 594 472 325 114 0.00150069
-2 799 775 382 0.00150292
-3 799 775 383 382 0.00150292
-1 663 651 0.00150402
-2 663 651 625 0.00150402
-2 663 651 626 0.00150402
-3 663 651 626 625 0.00150402
-2 631 336 262 0.00150532
-3 631 336 262 261 0.00150532
-1 448 310 0.00150569
-2 448 310 144 0.00150569
-2 448 447 310 0.00150569
-3 448 447 310 144 0.00150569
-1 901 89 0.00150612
-2 901 466 89 0.00150612
-2 901 751 89 0.00150612
-3 901 751 466 89 0.00150612
-1 117 3 0.00150999
-2 117 3 0 0.00150999
-2 558 117 3 0.00150999
-3 558 117 3 0 0.00150999
-1 349 196 0.00151221
-2 349 197 196 0.00151221
-2 350 349 196 0.00151221
-3 350 349 197 196 0.00151221
-1 518 262 0.00151238
-2 518 510 262 0.00151238
-2 677 518 262 0.00151238
-3 677 518 510 262 0.00151238
-2 717 644 82 0.00151371
-3 920 717 644 82 0.00151371
-2 597 518 262 0.00151377
-3 677 597 518 262 0.00151377
-2 697 548 510 0.00151953
-3 697 660 548 510 0.00151953
-1 447 262 0.00152079
-2 447 262 167 0.00152079
-2 597 447 262 0.00152079
-3 597 447 262 167 0.00152079
-1 402 390 0.00152141
-2 403 402 390 0.00152141
-2 578 402 390 0.00152141
-3 578 403 402 390 0.00152141
-1 740 82 0.00152341
-2 740 87 82 0.00152341
-2 865 740 82 0.00152341
-3 865 740 87 82 0.00152341
-2 984 962 676 0.0015247
-3 984 962 844 676 0.0015247
-1 981 948 0.00152486
-2 981 948 863 0.00152486
-2 988 981 948 0.00152486
-3 988 981 948 863 0.00152486
-1 743 83 0.00152513
-2 743 567 83 0.00152513
-2 745 743 83 0.00152513
-3 745 743 567 83 0.00152513
-2 287 117 0 0.00152693
-3 306 287 117 0 0.00152693
-2 447 310 262 0.00153052
-3 447 310 262 167 0.00153052
-2 817 631 548 0.00153066
-3 817 631 548 547 0.00153066
-2 967 114 83 0.00153072
-3 967 114 85 83 0.00153072
-1 226 62 0.00153087
-2 226 62 32 0.00153087
-2 226 118 62 0.00153087
-3 226 118 62 32 0.00153087
-1 448 262 0.00153332
-2 448 447 262 0.00153332
-2 597 448 262 0.00153332
-3 597 448 447 262 0.00153332
-1 655 35 0.00153388
-2 655 35 34 0.00153388
-2 693 655 35 0.00153388
-3 693 655 35 34 0.00153388
-1 352 227 0.00153934
-2 352 227 169 0.00153934
-2 352 244 227 0.00153934
-3 352 244 227 169 0.00153934
-1 548 262 0.00154133
-2 548 336 262 0.00154133
-2 697 548 262 0.00154133
-3 697 548 336 262 0.00154133
-1 408 205 0.00154294
-2 484 408 205 0.00154294
-2 613 408 205 0.00154294
-3 613 484 408 205 0.00154294
-1 913 211 0.00154398
-2 913 291 211 0.00154398
-2 913 875 211 0.00154398
-3 913 875 291 211 0.00154398
-2 784 534 215 0.00154606
-3 953 784 534 215 0.00154606
-1 846 765 0.00154734
-2 846 765 303 0.00154734
-2 846 766 765 0.00154734
-3 846 766 765 303 0.00154734
-2 631 548 262 0.00154981
-3 631 548 336 262 0.00154981
-2 740 325 82 0.00154988
-3 740 325 87 82 0.00154988
-2 448 310 262 0.00155075
-3 448 447 310 262 0.00155075
-2 597 510 262 0.00155885
-3 597 518 510 262 0.00155885
-1 262 144 0.00156258
-2 317 262 144 0.00156258
-2 683 262 144 0.00156258
-3 683 317 262 144 0.00156258
-1 829 583 0.00156597
-2 829 583 232 0.00156597
-2 829 583 542 0.00156597
-3 829 583 542 232 0.00156597
-2 548 510 262 0.00156817
-3 697 548 510 262 0.00156817
-2 510 448 262 0.00156864
-3 597 510 448 262 0.00156864
-2 310 262 144 0.00156932
-3 683 310 262 144 0.00156932
-1 742 117 0.0015715
-2 742 558 117 0.0015715
-2 745 742 117 0.0015715
-3 745 742 558 117 0.0015715
-1 897 97 0.00157156
-2 897 97 22 0.00157156
-2 897 98 97 0.00157156
-3 897 98 97 22 0.00157156
-1 817 262 0.00157324
-2 817 548 262 0.00157324
-2 817 631 262 0.00157324
-3 817 631 548 262 0.00157324
-2 817 510 262 0.0015742
-3 817 548 510 262 0.0015742
-1 285 0 0.00158045
-2 285 56 0 0.00158045
-2 287 285 0 0.00158045
-3 287 285 56 0 0.00158045
-2 448 262 144 0.00158098
-3 448 310 262 144 0.00158098
-1 403 97 0.00158138
-2 403 386 97 0.00158138
-2 403 390 97 0.00158138
-3 403 390 386 97 0.00158138
-2 406 226 62 0.00158642
-3 406 226 118 62 0.00158642
-1 975 446 0.00158806
-2 975 447 446 0.00158806
-2 975 649 446 0.00158806
-3 975 649 447 446 0.00158806
-1 812 655 0.00158855
-2 812 693 655 0.00158855
-2 812 721 655 0.00158855
-3 812 721 693 655 0.00158855
-2 793 686 284 0.00159009
-3 915 793 686 284 0.00159009
-1 496 446 0.00159085
-2 496 449 446 0.00159085
-2 598 496 446 0.00159085
-3 598 496 449 446 0.00159085
-1 813 807 0.00159205
-2 813 807 616 0.00159205
-2 934 813 807 0.00159205
-3 934 813 807 616 0.00159205
-2 846 765 324 0.00159387
-3 846 765 324 303 0.00159387
-2 955 448 144 0.0015949
-3 955 858 448 144 0.0015949
-1 699 199 0.00159844
-2 699 201 199 0.00159844
-2 701 699 199 0.00159844
-3 701 699 201 199 0.00159844
-1 308 62 0.00159957
-2 308 62 32 0.00159957
-2 308 226 62 0.00159957
-3 308 226 62 32 0.00159957
-1 895 619 0.00160044
-2 895 647 619 0.00160044
-2 896 895 619 0.00160044
-3 896 895 647 619 0.00160044
-1 997 431 0.00160224
-2 997 968 431 0.00160224
-2 997 983 431 0.00160224
-3 997 983 968 431 0.00160224
-1 631 448 0.00160333
-2 631 448 144 0.00160333
-2 955 631 448 0.00160333
-3 955 631 448 144 0.00160333
-1 749 82 0.00160976
-2 749 404 82 0.00160976
-2 749 717 82 0.00160976
-3 749 717 404 82 0.00160976
-2 817 631 448 0.00161119
-3 955 817 631 448 0.00161119
-2 845 830 503 0.00161127
-3 855 845 830 503 0.00161127
-1 745 113 0.0016115
-2 745 113 83 0.0016115
-2 745 117 113 0.0016115
-3 745 117 113 83 0.0016115
-2 997 982 431 0.00161936
-3 997 983 982 431 0.00161936
-1 743 113 0.00162805
-2 743 113 83 0.00162805
-2 745 743 113 0.00162805
-3 745 743 113 83 0.00162805
-1 742 0 0.00163168
-2 742 3 0 0.00163168
-2 742 736 0 0.00163168
-3 742 736 3 0 0.00163168
-1 758 575 0.00163846
-2 758 576 575 0.00163846
-2 761 758 575 0.00163846
-3 761 758 576 575 0.00163846
-2 631 317 262 0.00163956
-3 631 392 317 262 0.00163956
-1 910 707 0.00163976
-2 910 707 78 0.00163976
-2 910 707 572 0.00163976
-3 910 707 572 78 0.00163976
-1 742 113 0.0016399
-2 742 117 113 0.0016399
-2 745 742 113 0.0016399
-3 745 742 117 113 0.0016399
-2 631 262 144 0.00164019
-3 631 317 262 144 0.00164019
-1 567 113 0.00164449
-2 567 113 83 0.00164449
-2 743 567 113 0.00164449
-3 743 567 113 83 0.00164449
-1 876 435 0.00165785
-2 876 435 268 0.00165785
-2 876 435 291 0.00165785
-3 876 435 291 268 0.00165785
-2 834 806 715 0.00166695
-3 911 834 806 715 0.00166695
-2 817 448 262 0.00166878
-3 817 510 448 262 0.00166878
-1 554 1 0.00168936
-2 554 1 0 0.00168936
-2 971 554 1 0.00168936
-3 971 554 1 0 0.00168936
-2 743 567 445 0.00169297
-3 743 567 465 445 0.00169297
-2 743 742 113 0.0016991
-3 745 743 742 113 0.0016991
-2 631 448 262 0.00169938
-3 817 631 448 262 0.00169938
-3 631 448 262 144 0.00170028
-2 895 619 342 0.00170725
-3 896 895 619 342 0.00170725
-2 919 663 651 0.00171156
-3 919 663 651 625 0.00171156
-1 913 435 0.00171447
-2 913 435 291 0.00171447
-2 913 876 435 0.00171447
-3 913 876 435 291 0.00171447
-1 481 430 0.00172733
-2 481 430 279 0.00172733
-2 809 481 430 0.00172733
-3 809 481 430 279 0.00172733
-1 904 249 0.00172966
-2 904 780 249 0.00172966
-2 955 904 249 0.00172966
-3 955 904 780 249 0.00172966
-2 742 117 3 0.00173162
-3 742 558 117 3 0.00173162
-1 669 575 0.00173277
-2 669 576 575 0.00173277
-2 758 669 575 0.00173277
-3 758 669 576 575 0.00173277
-1 633 219 0.00173742
-2 633 219 94 0.00173742
-2 777 633 219 0.00173742
-3 777 633 219 94 0.00173742
-2 351 349 196 0.00174269
-3 351 350 349 196 0.00174269
-2 812 517 515 0.00174657
-3 812 517 516 515 0.00174657
-2 784 268 215 0.00174737
-3 784 268 217 215 0.00174737
-1 999 1 0.00175046
-2 999 971 1 0.00175046
-2 999 996 1 0.00175046
-3 999 996 971 1 0.00175046
-2 930 910 707 0.00175052
-3 930 910 707 78 0.00175052
-1 831 828 0.00175291
-2 831 828 110 0.00175291
-2 943 831 828 0.00175291
-3 943 831 828 110 0.00175291
-1 496 447 0.00175341
-2 598 496 447 0.00175341
-2 975 496 447 0.00175341
-3 975 598 496 447 0.00175341
-2 325 114 82 0.0017543
-3 325 114 88 82 0.0017543
-1 970 219 0.00175464
-2 970 219 94 0.00175464
-2 970 633 219 0.00175464
-3 970 633 219 94 0.00175464
-2 860 659 28 0.0017565
-3 860 753 659 28 0.0017565
-1 918 419 0.00175726
-2 918 421 419 0.00175726
-2 918 422 419 0.00175726
-3 918 422 421 419 0.00175726
-1 402 97 0.00176267
-2 402 390 97 0.00176267
-2 403 402 97 0.00176267
-3 403 402 390 97 0.00176267
-1 612 284 0.00176383
-2 612 284 205 0.00176383
-2 686 612 284 0.00176383
-3 686 612 284 205 0.00176383
-1 735 0 0.0017671
-2 736 735 0 0.0017671
-2 742 735 0 0.0017671
-3 742 736 735 0 0.0017671
-1 520 446 0.00176763
-2 520 449 446 0.00176763
-2 520 496 446 0.00176763
-3 520 496 449 446 0.00176763
-2 735 455 0 0.00176795
-3 736 735 455 0 0.00176795
-2 913 435 211 0.00176961
-3 913 435 291 211 0.00176961
-1 871 630 0.00177489
-2 921 871 630 0.00177489
-2 922 871 630 0.00177489
-3 922 921 871 630 0.00177489
-1 967 113 0.00178338
-2 967 113 83 0.00178338
-2 967 567 113 0.00178338
-3 967 567 113 83 0.00178338
-1 811 700 0.00178935
-2 811 700 416 0.00178935
-2 811 700 699 0.00178935
-3 811 700 699 416 0.00178935
-2 865 325 82 0.00178985
-3 865 740 325 82 0.00178985
-1 595 114 0.00179625
-2 595 472 114 0.00179625
-2 595 594 114 0.00179625
-3 595 594 472 114 0.00179625
-1 735 113 0.00180161
-2 742 735 113 0.00180161
-2 743 735 113 0.00180161
-3 743 742 735 113 0.00180161
-1 772 766 0.00180165
-2 772 766 751 0.00180165
-2 942 772 766 0.00180165
-3 942 772 766 751 0.00180165
-2 803 699 199 0.00181016
-3 803 701 699 199 0.00181016
-2 916 403 351 0.00181059
-3 916 485 403 351 0.00181059
-1 114 113 0.00181398
-2 114 113 83 0.00181398
-2 967 114 113 0.00181398
-3 967 114 113 83 0.00181398
-2 496 447 446 0.00181503
-3 598 496 447 446 0.00181503
-1 529 0 0.00182459
-2 554 529 0 0.00182459
-2 893 529 0 0.00182459
-3 893 554 529 0 0.00182459
-1 655 517 0.00183125
-2 721 655 517 0.00183125
-2 891 655 517 0.00183125
-3 891 721 655 517 0.00183125
-1 655 258 0.00183741
-2 655 258 35 0.00183741
-2 693 655 258 0.00183741
-3 693 655 258 35 0.00183741
-2 982 875 431 0.00184186
-3 982 965 875 431 0.00184186
-2 114 113 82 0.00184564
-3 114 113 83 82 0.00184564
-1 669 577 0.00184575
-2 669 577 454 0.00184575
-2 669 577 576 0.00184575
-3 669 577 576 454 0.00184575
-1 671 604 0.00184979
-2 671 604 603 0.00184979
-2 770 671 604 0.00184979
-3 770 671 604 603 0.00184979
-2 742 117 0 0.00186532
-3 742 117 3 0 0.00186532
-1 472 113 0.0018661
-2 472 114 113 0.0018661
-2 967 472 113 0.0018661
-3 967 472 114 113 0.0018661
-1 986 536 0.00187136
-2 986 635 536 0.00187136
-2 986 790 536 0.00187136
-3 986 790 635 536 0.00187136
-2 567 472 113 0.00187491
-3 967 567 472 113 0.00187491
-1 913 490 0.00188035
-2 913 490 211 0.00188035
-2 913 490 435 0.00188035
-3 913 490 435 211 0.00188035
-1 877 435 0.00188218
-2 877 435 268 0.00188218
-2 877 876 435 0.00188218
-3 877 876 435 268 0.00188218
-1 761 669 0.00188296
-2 761 669 575 0.00188296
-2 761 758 669 0.00188296
-3 761 758 669 575 0.00188296
-2 285 54 0 0.00188444
-3 285 56 54 0 0.00188444
-1 481 277 0.00188532
-2 481 278 277 0.00188532
-2 481 279 277 0.00188532
-3 481 279 278 277 0.00188532
-2 950 798 351 0.00188609
-3 950 822 798 351 0.00188609
-1 935 4 0.00188647
-2 935 730 4 0.00188647
-2 980 935 4 0.00188647
-3 980 935 730 4 0.00188647
-1 980 672 0.00189254
-2 980 770 672 0.00189254
-2 980 961 672 0.00189254
-3 980 961 770 672 0.00189254
-1 113 0 0.00189575
-2 117 113 0 0.00189575
-2 287 113 0 0.00189575
-3 287 117 113 0 0.00189575
-1 898 235 0.00190869
-2 898 235 234 0.00190869
-2 898 829 235 0.00190869
-3 898 829 235 234 0.00190869
-1 655 36 0.00191306
-2 655 36 34 0.00191306
-2 657 655 36 0.00191306
-3 657 655 36 34 0.00191306
-1 690 220 0.00191417
-2 690 512 220 0.00191417
-2 690 596 220 0.00191417
-3 690 596 512 220 0.00191417
-2 742 113 0 0.00191574
-3 742 117 113 0 0.00191574
-2 995 994 428 0.00191733
-3 995 994 993 428 0.00191733
-2 916 798 351 0.0019241
-3 950 916 798 351 0.0019241
-2 999 554 1 0.00192959
-3 999 971 554 1 0.00192959
-1 742 287 0.00193403
-2 742 287 0 0.00193403
-2 742 287 113 0.00193403
-3 742 287 113 0 0.00193403
-2 975 496 446 0.00193741
-3 975 496 447 446 0.00193741
-1 535 82 0.00194217
-2 535 325 82 0.00194217
-2 865 535 82 0.00194217
-3 865 535 325 82 0.00194217
-1 811 522 0.00194267
-2 811 522 521 0.00194267
-2 910 811 522 0.00194267
-3 910 811 522 521 0.00194267
-1 843 517 0.0019498
-2 843 517 515 0.0019498
-2 843 676 517 0.0019498
-3 843 676 517 515 0.0019498
-1 735 287 0.00195012
-2 735 287 113 0.00195012
-2 742 735 287 0.00195012
-3 742 735 287 113 0.00195012
-1 341 0 0.00195357
-2 457 341 0 0.00195357
-2 893 341 0 0.00195357
-3 893 457 341 0 0.00195357
-2 481 430 277 0.00196043
-3 481 430 279 277 0.00196043
-1 743 287 0.00197204
-2 743 287 113 0.00197204
-2 743 735 287 0.00197204
-3 743 735 287 113 0.00197204
-1 286 59 0.00197295
-2 286 60 59 0.00197295
-2 286 266 59 0.00197295
-3 286 266 60 59 0.00197295
-1 707 364 0.00197431
-2 707 706 364 0.00197431
-2 930 707 364 0.00197431
-3 930 707 706 364 0.00197431
-1 445 113 0.00198344
-2 567 445 113 0.00198344
-2 743 445 113 0.00198344
-3 743 567 445 113 0.00198344
-1 877 215 0.00198595
-2 877 268 215 0.00198595
-2 877 784 215 0.00198595
-3 877 784 268 215 0.00198595
-2 829 828 583 0.00198927
-3 829 828 583 542 0.00198927
-1 981 619 0.00200495
-2 981 619 618 0.00200495
-2 981 802 619 0.00200495
-3 981 802 619 618 0.00200495
-2 276 219 4 0.00202802
-3 478 276 219 4 0.00202802
-1 611 284 0.00203558
-2 612 611 284 0.00203558
-2 686 611 284 0.00203558
-3 686 612 611 284 0.00203558
-1 545 347 0.00204684
-2 690 545 347 0.00204684
-2 941 545 347 0.00204684
-3 941 690 545 347 0.00204684
-1 337 192 0.00204796
-2 337 192 50 0.00204796
-2 337 192 190 0.00204796
-3 337 192 190 50 0.00204796
-1 734 249 0.00204814
-2 734 249 246 0.00204814
-2 734 555 249 0.00204814
-3 734 555 249 246 0.00204814
-2 226 197 62 0.0020505
-3 406 226 197 62 0.0020505
-1 888 804 0.00205213
-2 888 842 804 0.00205213
-2 888 887 804 0.00205213
-3 888 887 842 804 0.00205213
-1 659 26 0.00205837
-2 659 27 26 0.00205837
-2 659 28 26 0.00205837
-3 659 28 27 26 0.00205837
-1 646 82 0.00206593
-2 646 644 82 0.00206593
-2 646 645 82 0.00206593
-3 646 645 644 82 0.00206593
-2 865 646 82 0.00206604
-3 865 646 645 82 0.00206604
-1 578 97 0.00207246
-2 578 390 97 0.00207246
-2 578 402 97 0.00207246
-3 578 402 390 97 0.00207246
-1 823 661 0.0020758
-2 823 661 396 0.0020758
-2 823 662 661 0.0020758
-3 823 662 661 396 0.0020758
-2 910 707 414 0.00208079
-3 910 707 572 414 0.00208079
-1 913 147 0.00208578
-2 913 211 147 0.00208578
-2 913 875 147 0.00208578
-3 913 875 211 147 0.00208578
-1 489 393 0.00208614
-2 489 487 393 0.00208614
-2 795 489 393 0.00208614
-3 795 489 487 393 0.00208614
-1 699 198 0.0020944
-2 699 201 198 0.0020944
-2 894 699 198 0.0020944
-3 894 699 201 198 0.0020944
-1 445 287 0.00210055
-2 445 287 113 0.00210055
-2 743 445 287 0.00210055
-3 743 445 287 113 0.00210055
-1 642 215 0.0021013
-2 642 254 215 0.0021013
-2 642 460 215 0.0021013
-3 642 460 254 215 0.0021013
-2 472 445 113 0.0021017
-3 567 472 445 113 0.0021017
-2 784 393 319 0.00210594
-3 784 393 354 319 0.00210594
-2 735 287 0 0.0021086
-3 742 735 287 0 0.0021086
-2 913 490 147 0.00211677
-3 913 490 211 147 0.00211677
-1 366 97 0.00212327
-2 402 366 97 0.00212327
-2 578 366 97 0.00212327
-3 578 402 366 97 0.00212327
-1 653 82 0.00212887
-2 717 653 82 0.00212887
-2 749 653 82 0.00212887
-3 749 717 653 82 0.00212887
-1 308 104 0.00213656
-2 308 104 32 0.00213656
-2 308 104 62 0.00213656
-3 308 104 62 32 0.00213656
-1 460 319 0.00215778
-2 460 454 319 0.00215778
-2 534 460 319 0.00215778
-3 534 460 454 319 0.00215778
-2 653 644 82 0.0021743
-3 717 653 644 82 0.0021743
-1 669 319 0.0021766
-2 669 454 319 0.0021766
-2 669 460 319 0.0021766
-3 669 460 454 319 0.0021766
-2 793 611 284 0.0021774
-3 793 686 611 284 0.0021774
-1 595 113 0.00218078
-2 595 445 113 0.00218078
-2 595 472 113 0.00218078
-3 595 472 445 113 0.00218078
-1 749 81 0.00218514
-2 749 82 81 0.00218514
-2 749 404 81 0.00218514
-3 749 404 82 81 0.00218514
-2 669 577 319 0.00219582
-3 669 577 454 319 0.00219582
-2 877 435 215 0.00219728
-3 877 435 268 215 0.00219728
-1 226 196 0.00220597
-2 226 197 196 0.00220597
-2 349 226 196 0.00220597
-3 349 226 197 196 0.00220597
-1 784 460 0.00220673
-2 784 460 215 0.00220673
-2 784 534 460 0.00220673
-3 784 534 460 215 0.00220673
-1 713 431 0.0022213
-2 982 713 431 0.0022213
-2 997 713 431 0.0022213
-3 997 982 713 431 0.0022213
-1 806 278 0.00222942
-2 806 732 278 0.00222942
-2 888 806 278 0.00222942
-3 888 806 732 278 0.00222942
-2 655 36 35 0.00222963
-3 655 36 35 34 0.00222963
-1 439 0 0.002248
-2 529 439 0 0.002248
-2 554 439 0 0.002248
-3 554 529 439 0 0.002248
-1 444 287 0.0022489
-2 445 444 287 0.0022489
-2 743 444 287 0.0022489
-3 743 445 444 287 0.0022489
-2 812 655 517 0.00225564
-3 812 721 655 517 0.00225564
-1 623 26 0.00226721
-2 623 27 26 0.00226721
-2 659 623 26 0.00226721
-3 659 623 27 26 0.00226721
-1 707 356 0.00226954
-2 910 707 356 0.00226954
-2 930 707 356 0.00226954
-3 930 910 707 356 0.00226954
-1 797 489 0.00228167
-2 797 489 393 0.00228167
-2 797 795 489 0.00228167
-3 797 795 489 393 0.00228167
-1 322 82 0.00229824
-2 325 322 82 0.00229824
-2 535 322 82 0.00229824
-3 535 325 322 82 0.00229824
-1 500 233 0.0022983
-2 500 234 233 0.0022983
-2 500 496 233 0.0022983
-3 500 496 234 233 0.0022983
-1 910 700 0.00230138
-2 910 700 416 0.00230138
-2 910 811 700 0.00230138
-3 910 811 700 416 0.00230138
-2 977 976 629 0.00230328
-3 978 977 976 629 0.00230328
-2 895 866 674 0.00230507
-3 895 866 815 674 0.00230507
-2 865 322 82 0.00230569
-3 865 535 322 82 0.00230569
-2 811 699 198 0.00230791
-3 894 811 699 198 0.00230791
-1 227 170 0.00230839
-2 227 170 169 0.00230839
-2 352 227 170 0.00230839
-3 352 227 170 169 0.00230839
-1 923 82 0.00232215
-2 923 644 82 0.00232215
-2 923 646 82 0.00232215
-3 923 646 644 82 0.00232215
-2 843 812 517 0.0023263
-3 843 812 517 515 0.0023263
-1 793 612 0.00233881
-2 793 612 284 0.00233881
-2 793 612 611 0.00233881
-3 793 612 611 284 0.00233881
-2 699 199 198 0.00234031
-3 699 201 199 198 0.00234031
-2 923 653 82 0.00234375
-3 923 653 644 82 0.00234375
-1 868 837 0.00234464
-2 868 838 837 0.00234464
-2 869 868 837 0.00234464
-3 869 868 838 837 0.00234464
-1 502 446 0.00234823
-2 502 449 446 0.00234823
-2 801 502 446 0.00234823
-3 801 502 449 446 0.00234823
-2 520 502 446 0.00234974
-3 520 502 449 446 0.00234974
-2 749 309 81 0.00235252
-3 749 404 309 81 0.00235252
-1 975 206 0.00235335
-2 975 347 206 0.00235335
-2 975 867 206 0.00235335
-3 975 867 347 206 0.00235335
-2 595 114 113 0.00235577
-3 595 472 114 113 0.00235577
-2 735 444 287 0.00235737
-3 743 735 444 287 0.00235737
-2 970 219 93 0.00236215
-3 970 219 94 93 0.00236215
-1 999 0 0.00236799
-2 999 1 0 0.00236799
-2 999 554 0 0.00236799
-3 999 554 1 0 0.00236799
-1 910 664 0.00237458
-2 910 664 414 0.00237458
-2 910 664 416 0.00237458
-3 910 664 416 414 0.00237458
-2 612 408 205 0.00237868
-3 612 484 408 205 0.00237868
-1 104 53 0.00237905
-2 104 53 32 0.00237905
-2 399 104 53 0.00237905
-3 399 104 53 32 0.00237905
-2 910 700 664 0.00241395
-3 910 700 664 416 0.00241395
-1 244 240 0.00241456
-2 244 241 240 0.00241456
-2 289 244 240 0.00241456
-3 289 244 241 240 0.00241456
-1 595 287 0.00246286
-2 595 287 113 0.00246286
-2 595 445 287 0.00246286
-3 595 445 287 113 0.00246286
-1 619 50 0.00247383
-2 619 50 48 0.00247383
-2 619 338 50 0.00247383
-3 619 338 50 48 0.00247383
-1 748 81 0.00247667
-2 748 309 81 0.00247667
-2 749 748 81 0.00247667
-3 749 748 309 81 0.00247667
-1 734 238 0.00248265
-2 734 246 238 0.00248265
-2 799 734 238 0.00248265
-3 799 734 246 238 0.00248265
-1 288 170 0.00248349
-2 288 170 149 0.00248349
-2 352 288 170 0.00248349
-3 352 288 170 149 0.00248349
-1 876 490 0.00249039
-2 876 490 435 0.00249039
-2 913 876 490 0.00249039
-3 913 876 490 435 0.00249039
-2 916 403 385 0.00249271
-3 916 403 385 275 0.00249271
-1 799 755 0.00252592
-2 799 755 382 0.00252592
-2 799 775 755 0.00252592
-3 799 775 755 382 0.00252592
-2 529 341 0 0.00254035
-3 893 529 341 0 0.00254035
-1 577 460 0.00257202
-2 577 460 319 0.00257202
-2 669 577 460 0.00257202
-3 669 577 460 319 0.00257202
-1 834 804 0.00257629
-2 834 804 715 0.00257629
-2 834 806 804 0.00257629
-3 834 806 804 715 0.00257629
-1 643 82 0.00259213
-2 646 643 82 0.00259213
-2 865 643 82 0.00259213
-3 865 646 643 82 0.00259213
-1 933 205 0.0026089
-2 933 408 205 0.0026089
-2 933 613 205 0.0026089
-3 933 613 408 205 0.0026089
-2 793 612 575 0.00262555
-3 793 612 611 575 0.00262555
-1 906 287 0.00262814
-2 906 444 287 0.00262814
-2 906 735 287 0.00262814
-3 906 735 444 287 0.00262814
-1 265 154 0.00263546
-2 265 154 39 0.00263546
-2 265 155 154 0.00263546
-3 265 155 154 39 0.00263546
-1 877 255 0.00264274
-2 877 255 215 0.00264274
-2 877 435 255 0.00264274
-3 877 435 255 215 0.00264274
-1 455 287 0.00265063
-2 455 287 0 0.00265063
-2 735 455 287 0.00265063
-3 735 455 287 0 0.00265063
-1 940 235 0.00265997
-2 940 829 235 0.00265997
-2 940 898 235 0.00265997
-3 940 898 829 235 0.00265997
-1 594 113 0.00266309
-2 594 114 113 0.00266309
-2 595 594 113 0.00266309
-3 595 594 114 113 0.00266309
-1 850 622 0.00266727
-2 850 622 621 0.00266727
-2 850 838 622 0.00266727
-3 850 838 622 621 0.00266727
-1 707 362 0.00266753
-2 707 362 356 0.00266753
-2 930 707 362 0.00266753
-3 930 707 362 356 0.00266753
-1 288 227 0.00268342
-2 288 244 227 0.00268342
-2 352 288 227 0.00268342
-3 352 288 244 227 0.00268342
-1 659 624 0.00268627
-2 659 624 28 0.00268627
-2 860 659 624 0.00268627
-3 860 659 624 28 0.00268627
-1 916 196 0.00269139
-2 916 351 196 0.00269139
-2 916 403 196 0.00269139
-3 916 403 351 196 0.00269139
-1 925 630 0.00269642
-2 925 630 425 0.00269642
-2 925 921 630 0.00269642
-3 925 921 630 425 0.00269642
-1 873 635 0.00271449
-2 874 873 635 0.00271449
-2 986 873 635 0.00271449
-3 986 874 873 635 0.00271449
-1 594 82 0.0027152
-2 594 113 82 0.0027152
-2 594 114 82 0.0027152
-3 594 114 113 82 0.0027152
-1 778 651 0.00272474
-2 778 651 212 0.00272474
-2 778 695 651 0.00272474
-3 778 695 651 212 0.00272474
-2 784 460 319 0.00272618
-3 784 534 460 319 0.00272618
-1 873 536 0.00272841
-2 873 635 536 0.00272841
-2 986 873 536 0.00272841
-3 986 873 635 536 0.00272841
-1 982 147 0.00274132
-2 982 431 147 0.00274132
-2 982 875 147 0.00274132
-3 982 875 431 147 0.00274132
-1 890 124 0.00274456
-2 890 872 124 0.00274456
-2 890 878 124 0.00274456
-3 890 878 872 124 0.00274456
-1 594 287 0.00274951
-2 594 287 113 0.00274951
-2 595 594 287 0.00274951
-3 595 594 287 113 0.00274951
-1 490 170 0.00275082
-2 490 170 149 0.00275082
-2 490 288 170 0.00275082
-3 490 288 170 149 0.00275082
-2 288 227 170 0.00276445
-3 352 288 227 170 0.00276445
-1 95 4 0.00277263
-2 276 95 4 0.00277263
-2 730 95 4 0.00277263
-3 730 276 95 4 0.00277263
-1 490 169 0.00277587
-2 490 169 149 0.00277587
-2 490 170 169 0.00277587
-3 490 170 169 149 0.00277587
-2 906 455 287 0.00279957
-3 906 735 455 287 0.00279957
-1 803 777 0.00280059
-2 803 777 199 0.00280059
-2 803 777 776 0.00280059
-3 803 777 776 199 0.00280059
-2 594 325 82 0.00280584
-3 594 325 114 82 0.00280584
-1 594 312 0.00280773
-2 594 312 113 0.00280773
-2 594 312 287 0.00280773
-3 594 312 287 113 0.00280773
-1 460 393 0.00280867
-2 460 393 319 0.00280867
-2 784 460 393 0.00280867
-3 784 460 393 319 0.00280867
-2 594 312 82 0.00280886
-3 594 312 113 82 0.00280886
-1 288 169 0.00281
-2 288 170 169 0.00281
-2 490 288 169 0.00281
-3 490 288 170 169 0.00281
-2 288 227 169 0.00281107
-3 288 227 170 169 0.00281107
-1 490 227 0.00281361
-2 490 227 169 0.00281361
-2 490 288 227 0.00281361
-3 490 288 227 169 0.00281361
-1 748 706 0.00281453
-2 748 706 653 0.00281453
-2 773 748 706 0.00281453
-3 773 748 706 653 0.00281453
-1 874 536 0.00282188
-2 874 635 536 0.00282188
-2 874 873 536 0.00282188
-3 874 873 635 536 0.00282188
-2 707 364 362 0.00282238
-3 930 707 364 362 0.00282238
-1 877 460 0.00283239
-2 877 460 215 0.00283239
-2 877 784 460 0.00283239
-3 877 784 460 215 0.00283239
-1 892 287 0.00283333
-2 892 445 287 0.00283333
-2 892 595 287 0.00283333
-3 892 595 445 287 0.00283333
-1 799 192 0.00284437
-2 799 382 192 0.00284437
-2 799 755 192 0.00284437
-3 799 755 382 192 0.00284437
-2 365 312 60 0.00284462
-3 365 312 119 60 0.00284462
-2 577 489 393 0.00285013
-3 577 489 487 393 0.00285013
-2 540 286 59 0.0028553
-3 540 286 266 59 0.0028553
-2 578 98 97 0.00287388
-3 578 390 98 97 0.00287388
-1 803 632 0.00288468
-2 803 632 199 0.00288468
-2 803 777 632 0.00288468
-3 803 777 632 199 0.00288468
-2 498 430 429 0.00289013
-3 498 497 430 429 0.00289013
-1 846 772 0.00289426
-2 846 821 772 0.00289426
-2 942 846 772 0.00289426
-3 942 846 821 772 0.00289426
-2 877 460 393 0.00289591
-3 877 784 460 393 0.00289591
-1 402 386 0.0028992
-2 402 386 97 0.0028992
-2 403 402 386 0.0028992
-3 403 402 386 97 0.0028992
-1 748 82 0.00290813
-2 748 82 81 0.00290813
-2 749 748 82 0.00290813
-3 749 748 82 81 0.00290813
-1 227 149 0.00291915
-2 227 169 149 0.00291915
-2 490 227 149 0.00291915
-3 490 227 169 149 0.00291915
-1 859 82 0.00292277
-2 859 322 82 0.00292277
-2 865 859 82 0.00292277
-3 865 859 322 82 0.00292277
-2 892 594 287 0.00292517
-3 892 595 594 287 0.00292517
-2 859 643 82 0.00293289
-3 865 859 643 82 0.00293289
-2 746 299 283 0.00294897
-3 746 299 283 282 0.00294897
-1 403 243 0.00296278
-2 403 385 243 0.00296278
-2 916 403 243 0.00296278
-3 916 403 385 243 0.00296278
-2 873 790 536 0.00296451
-3 986 873 790 536 0.00296451
-1 877 254 0.00299237
-2 877 254 215 0.00299237
-2 877 255 254 0.00299237
-3 877 255 254 215 0.00299237
-1 553 0 0.00299367
-2 554 553 0 0.00299367
-2 999 553 0 0.00299367
-3 999 554 553 0 0.00299367
-1 877 642 0.00300268
-2 877 642 215 0.00300268
-2 877 642 254 0.00300268
-3 877 642 254 215 0.00300268
-2 877 642 460 0.00301154
-3 877 642 460 215 0.00301154
-2 877 642 255 0.00302459
-3 877 642 255 254 0.00302459
-1 995 2 0.00302581
-2 995 2 1 0.00302581
-2 995 428 2 0.00302581
-3 995 428 2 1 0.00302581
-1 775 192 0.00303276
-2 775 755 192 0.00303276
-2 799 775 192 0.00303276
-3 799 775 755 192 0.00303276
-1 834 731 0.00303594
-2 834 731 486 0.00303594
-2 834 732 731 0.00303594
-3 834 732 731 486 0.00303594
-1 366 59 0.00304336
-2 366 60 59 0.00304336
-2 366 62 59 0.00304336
-3 366 62 60 59 0.00304336
-1 219 96 0.00304351
-2 219 96 93 0.00304351
-2 970 219 96 0.00304351
-3 970 219 96 93 0.00304351
-1 846 583 0.00306262
-2 846 772 583 0.00306262
-2 846 821 583 0.00306262
-3 846 821 772 583 0.00306262
-1 434 397 0.00307184
-2 539 434 397 0.00307184
-2 606 434 397 0.00307184
-3 606 539 434 397 0.00307184
-2 968 713 431 0.0030919
-3 997 968 713 431 0.0030919
-1 196 59 0.00309687
-2 196 62 59 0.00309687
-2 366 196 59 0.00309687
-3 366 196 62 59 0.00309687
-1 901 772 0.00309774
-2 901 772 89 0.00309774
-2 901 772 751 0.00309774
-3 901 772 751 89 0.00309774
-1 540 53 0.00311957
-2 540 285 53 0.00311957
-2 540 399 53 0.00311957
-3 540 399 285 53 0.00311957
-2 933 616 205 0.00312773
-3 933 616 613 205 0.00312773
-1 929 4 0.00313096
-2 929 95 4 0.00313096
-2 929 730 4 0.00313096
-3 929 730 95 4 0.00313096
-1 104 29 0.00313365
-2 104 32 29 0.00313365
-2 308 104 29 0.00313365
-3 308 104 32 29 0.00313365
-1 818 555 0.00314503
-2 818 555 425 0.00314503
-2 818 555 427 0.00314503
-3 818 555 427 425 0.00314503
-1 979 82 0.00318248
-2 979 643 82 0.00318248
-2 979 859 82 0.00318248
-3 979 859 643 82 0.00318248
-1 579 530 0.00318894
-2 579 530 529 0.00318894
-2 579 531 530 0.00318894
-3 579 531 530 529 0.00318894
-1 325 312 0.00319181
-2 325 312 82 0.00319181
-2 594 325 312 0.00319181
-3 594 325 312 82 0.00319181
-1 657 26 0.00321725
-2 657 27 26 0.00321725
-2 657 623 26 0.00321725
-3 657 623 27 26 0.00321725
-1 716 431 0.00322199
-2 716 713 431 0.00322199
-2 968 716 431 0.00322199
-3 968 716 713 431 0.00322199
-1 958 428 0.00322204
-2 994 958 428 0.00322204
-2 995 958 428 0.00322204
-3 995 994 958 428 0.00322204
-1 873 803 0.00323819
-2 873 803 776 0.00323819
-2 873 803 777 0.00323819
-3 873 803 777 776 0.00323819
-2 892 444 287 0.00324086
-3 892 445 444 287 0.00324086
-1 540 54 0.00326474
-2 540 54 53 0.00326474
-2 540 285 54 0.00326474
-3 540 285 54 53 0.00326474
-1 935 6 0.00327616
-2 935 6 4 0.00327616
-2 980 935 6 0.00327616
-3 980 935 6 4 0.00327616
-1 633 536 0.00328054
-2 633 536 219 0.00328054
-2 777 633 536 0.00328054
-3 777 633 536 219 0.00328054
-2 657 36 26 0.0032896
-3 657 36 27 26 0.0032896
-2 577 460 393 0.00329742
-3 577 460 393 319 0.00329742
-1 904 191 0.0032987
-2 904 382 191 0.0032987
-2 904 779 191 0.0032987
-3 904 779 382 191 0.0032987
-2 940 831 828 0.00331175
-3 943 940 831 828 0.00331175
-1 54 29 0.00332198
-2 54 53 29 0.00332198
-2 55 54 29 0.00332198
-3 55 54 53 29 0.00332198
-1 642 393 0.00332477
-2 642 460 393 0.00332477
-2 877 642 393 0.00332477
-3 877 642 460 393 0.00332477
-1 906 0 0.00332714
-2 906 287 0 0.00332714
-2 906 455 0 0.00332714
-3 906 455 287 0 0.00332714
-1 817 555 0.00332722
-2 817 555 249 0.00332722
-2 817 555 427 0.00332722
-3 817 555 427 249 0.00332722
-1 728 0 0.00333524
-2 728 455 0 0.00333524
-2 906 728 0 0.00333524
-3 906 728 455 0 0.00333524
-1 695 663 0.00333636
-2 695 663 651 0.00333636
-2 919 695 663 0.00333636
-3 919 695 663 651 0.00333636
-1 553 1 0.00333793
-2 553 1 0 0.00333793
-2 999 553 1 0.00333793
-3 999 553 1 0 0.00333793
-1 674 647 0.00334371
-2 866 674 647 0.00334371
-2 895 674 647 0.00334371
-3 895 866 674 647 0.00334371
-1 716 428 0.00335985
-2 716 431 428 0.00335985
-2 968 716 428 0.00335985
-3 968 716 431 428 0.00335985
-1 351 243 0.00336226
-2 798 351 243 0.00336226
-2 916 351 243 0.00336226
-3 916 798 351 243 0.00336226
-2 979 322 82 0.00337226
-3 979 859 322 82 0.00337226
-1 940 232 0.00337276
-2 940 235 232 0.00337276
-2 940 829 232 0.00337276
-3 940 829 235 232 0.00337276
-2 734 249 238 0.0033782
-3 734 249 246 238 0.0033782
-1 879 579 0.0033855
-2 879 679 579 0.0033855
-2 879 697 579 0.0033855
-3 879 697 679 579 0.0033855
-1 716 227 0.00338815
-2 716 428 227 0.00338815
-2 716 431 227 0.00338815
-3 716 431 428 227 0.00338815
-1 728 287 0.00339063
-2 728 287 0 0.00339063
-2 906 728 287 0.00339063
-3 906 728 287 0 0.00339063
-1 623 36 0.0034053
-2 623 36 26 0.0034053
-2 657 623 36 0.0034053
-3 657 623 36 26 0.0034053
-1 713 227 0.00340668
-2 713 431 227 0.00340668
-2 716 713 227 0.00340668
-3 716 713 431 227 0.00340668
-2 879 698 579 0.00342519
-3 879 698 697 579 0.00342519
-1 793 536 0.0034401
-2 793 635 536 0.0034401
-2 874 793 536 0.0034401
-3 874 793 635 536 0.0034401
-1 900 655 0.00344351
-2 900 720 655 0.00344351
-2 918 900 655 0.00344351
-3 918 900 720 655 0.00344351
-1 748 365 0.00344677
-2 748 365 309 0.00344677
-2 748 578 365 0.00344677
-3 748 578 365 309 0.00344677
-1 227 147 0.00345842
-2 227 149 147 0.00345842
-2 227 169 147 0.00345842
-3 227 169 149 147 0.00345842
-1 925 555 0.0034667
-2 925 555 425 0.0034667
-2 925 630 555 0.0034667
-3 925 630 555 425 0.0034667
-1 496 206 0.00346675
-2 496 233 206 0.00346675
-2 867 496 206 0.00346675
-3 867 496 233 206 0.00346675
-2 455 341 0 0.00347273
-3 457 455 341 0 0.00347273
-2 276 219 96 0.0034774
-3 276 219 96 93 0.0034774
-2 594 325 324 0.00347891
-3 594 325 324 323 0.00347891
-1 940 583 0.00349
-2 940 828 583 0.00349
-2 940 829 583 0.00349
-3 940 829 828 583 0.00349
-1 243 196 0.00349685
-2 403 243 196 0.00349685
-2 916 243 196 0.00349685
-3 916 403 243 196 0.00349685
-1 817 734 0.00349906
-2 817 734 249 0.00349906
-2 817 734 555 0.00349906
-3 817 734 555 249 0.00349906
-1 958 2 0.00350107
-2 958 428 2 0.00350107
-2 995 958 2 0.00350107
-3 995 958 428 2 0.00350107
-2 846 772 766 0.00352108
-3 942 846 772 766 0.00352108
-1 786 0 0.00352685
-2 786 341 0 0.00352685
-2 786 455 0 0.00352685
-3 786 455 341 0 0.00352685
-1 931 772 0.00352726
-2 931 772 751 0.00352726
-2 931 901 772 0.00352726
-3 931 901 772 751 0.00352726
-1 806 731 0.00352743
-2 806 731 278 0.00352743
-2 806 732 731 0.00352743
-3 806 732 731 278 0.00352743
-1 522 4 0.00353586
-2 522 95 4 0.00353586
-2 929 522 4 0.00353586
-3 929 522 95 4 0.00353586
-2 793 536 284 0.00354757
-3 793 635 536 284 0.00354757
-1 957 428 0.00355494
-2 958 957 428 0.00355494
-2 994 957 428 0.00355494
-3 994 958 957 428 0.00355494
-2 104 53 29 0.00355822
-3 104 53 32 29 0.00355822
-2 982 913 147 0.00356018
-3 982 913 875 147 0.00356018
-2 968 957 428 0.00358469
-3 994 968 957 428 0.00358469
-1 969 428 0.00359775
-2 969 957 428 0.00359775
-2 969 968 428 0.00359775
-3 969 968 957 428 0.00359775
-1 892 312 0.00360255
-2 892 312 287 0.00360255
-2 892 594 312 0.00360255
-3 892 594 312 287 0.00360255
-1 938 1 0.00360604
-2 995 938 1 0.00360604
-2 996 938 1 0.00360604
-3 996 995 938 1 0.00360604
-1 817 689 0.00361003
-2 817 689 555 0.00361003
-2 817 734 689 0.00361003
-3 817 734 689 555 0.00361003
-1 759 669 0.00362875
-2 759 758 669 0.00362875
-2 761 759 669 0.00362875
-3 761 759 758 669 0.00362875
-1 982 169 0.00364711
-2 982 169 147 0.00364711
-2 982 431 169 0.00364711
-3 982 431 169 147 0.00364711
-2 969 716 428 0.0036548
-3 969 968 716 428 0.0036548
-1 878 126 0.00365834
-2 878 126 124 0.00365834
-2 878 127 126 0.00365834
-3 878 127 126 124 0.00365834
-1 81 60 0.0036923
-2 312 81 60 0.0036923
-2 365 81 60 0.0036923
-3 365 312 81 60 0.0036923
-1 907 831 0.00370031
-2 907 831 110 0.00370031
-2 907 831 111 0.00370031
-3 907 831 111 110 0.00370031
-2 786 728 455 0.00370206
-3 786 728 704 455 0.00370206
-1 674 619 0.00371847
-2 674 619 342 0.00371847
-2 895 674 619 0.00371847
-3 895 674 619 342 0.00371847
-2 490 227 147 0.00371945
-3 490 227 149 147 0.00371945
-2 776 759 669 0.00375052
-3 776 759 758 669 0.00375052
-1 991 946 0.00375677
-2 991 949 946 0.00375677
-2 998 991 946 0.00375677
-3 998 991 949 946 0.00375677
-1 669 393 0.00375752
-2 669 460 393 0.00375752
-2 669 577 393 0.00375752
-3 669 577 460 393 0.00375752
-1 762 365 0.00377706
-2 762 578 365 0.00377706
-2 762 748 365 0.00377706
-3 762 748 578 365 0.00377706
-2 834 806 731 0.00378999
-3 834 806 732 731 0.00378999
-2 674 647 619 0.00379476
-3 895 674 647 619 0.00379476
-2 786 728 0 0.00379564
-3 786 728 455 0 0.00379564
-1 402 116 0.00379846
-2 402 116 97 0.00379846
-2 402 386 116 0.00379846
-3 402 386 116 97 0.00379846
-2 669 642 393 0.00383222
-3 669 642 460 393 0.00383222
-1 647 545 0.00384888
-2 674 647 545 0.00384888
-2 866 647 545 0.00384888
-3 866 674 647 545 0.00384888
-2 880 647 545 0.00385086
-3 880 866 647 545 0.00385086
-1 713 169 0.00385407
-2 713 431 169 0.00385407
-2 982 713 169 0.00385407
-3 982 713 431 169 0.00385407
-2 713 227 169 0.00385577
-3 713 431 227 169 0.00385577
-1 630 480 0.00385765
-2 871 630 480 0.00385765
-2 921 630 480 0.00385765
-3 921 871 630 480 0.00385765
-2 975 496 206 0.00385949
-3 975 867 496 206 0.00385949
-1 399 54 0.00387146
-2 399 54 53 0.00387146
-2 540 399 54 0.00387146
-3 540 399 54 53 0.00387146
-1 938 2 0.00388636
-2 938 2 1 0.00388636
-2 995 938 2 0.00388636
-3 995 938 2 1 0.00388636
-1 348 179 0.00388763
-2 466 348 179 0.00388763
-2 468 348 179 0.00388763
-3 468 466 348 179 0.00388763
-1 713 147 0.00389565
-2 913 713 147 0.00389565
-2 982 713 147 0.00389565
-3 982 913 713 147 0.00389565
-2 812 655 258 0.00390145
-3 812 693 655 258 0.00390145
-1 976 944 0.00392913
-2 976 944 725 0.00392913
-2 976 949 944 0.00392913
-3 976 949 944 725 0.00392913
-1 642 577 0.00395355
-2 642 577 393 0.00395355
-2 669 642 577 0.00395355
-3 669 642 577 393 0.00395355
-1 716 308 0.00398254
-2 716 308 227 0.00398254
-2 716 428 308 0.00398254
-3 716 428 308 227 0.00398254
-2 713 169 147 0.00398303
-3 982 713 169 147 0.00398303
-2 931 772 766 0.0039945
-3 931 772 766 751 0.0039945
-1 351 241 0.003997
-2 351 244 241 0.003997
-2 798 351 241 0.003997
-3 798 351 244 241 0.003997
-1 385 196 0.00402033
-2 385 243 196 0.00402033
-2 403 385 196 0.00402033
-3 403 385 243 196 0.00402033
-2 925 818 555 0.00402664
-3 925 818 555 425 0.00402664
-2 665 663 651 0.00403643
-3 665 663 651 626 0.00403643
-1 776 151 0.00404201
-2 776 669 151 0.00404201
-2 803 776 151 0.00404201
-3 803 776 669 151 0.00404201
-1 786 579 0.00404265
-2 786 579 341 0.00404265
-2 816 786 579 0.00404265
-3 816 786 579 341 0.00404265
-1 797 486 0.00404504
-2 797 795 486 0.00404504
-2 834 797 486 0.00404504
-3 834 797 795 486 0.00404504
-2 935 929 4 0.00405533
-3 935 929 730 4 0.00405533
-1 901 583 0.00405595
-2 901 583 89 0.00405595
-2 901 772 583 0.00405595
-3 901 772 583 89 0.00405595
-1 969 308 0.00406327
-2 969 428 308 0.00406327
-2 969 716 308 0.00406327
-3 969 716 428 308 0.00406327
-1 699 632 0.00406834
-2 699 632 198 0.00406834
-2 699 632 199 0.00406834
-3 699 632 199 198 0.00406834
-1 403 116 0.00407479
-2 403 386 116 0.00407479
-2 403 402 116 0.00407479
-3 403 402 386 116 0.00407479
-1 935 357 0.00408842
-2 935 359 357 0.00408842
-2 935 929 357 0.00408842
-3 935 929 359 357 0.00408842
-1 780 734 0.00409827
-2 780 734 238 0.00409827
-2 780 734 249 0.00409827
-3 780 734 249 238 0.00409827
-1 811 738 0.00410993
-2 811 738 521 0.00410993
-2 811 738 737 0.00410993
-3 811 738 737 521 0.00410993
-2 818 817 555 0.00411196
-3 818 817 555 427 0.00411196
-1 870 630 0.00413365
-2 870 630 480 0.00413365
-2 871 870 630 0.00413365
-3 871 870 630 480 0.00413365
-1 577 488 0.00413382
-2 577 489 488 0.00413382
-2 814 577 488 0.00413382
-3 814 577 489 488 0.00413382
-1 843 264 0.00414666
-2 843 812 264 0.00414666
-2 878 843 264 0.00414666
-3 878 843 812 264 0.00414666
-2 713 227 147 0.00415473
-3 713 227 169 147 0.00415473
-2 958 938 2 0.00417041
-3 995 958 938 2 0.00417041
-1 734 382 0.00418697
-2 734 382 238 0.00418697
-2 799 734 382 0.00418697
-3 799 734 382 238 0.00418697
-2 846 828 583 0.00420605
-3 846 828 821 583 0.00420605
-2 351 243 196 0.00429155
-3 916 351 243 196 0.00429155
-1 633 9 0.00430447
-2 633 219 9 0.00430447
-2 633 536 9 0.00430447
-3 633 536 219 9 0.00430447
-2 797 489 486 0.00433024
-3 797 795 489 486 0.00433024
-2 873 777 536 0.00433513
-3 873 790 777 536 0.00433513
-1 818 689 0.00434465
-2 818 689 555 0.00434465
-2 818 817 689 0.00434465
-3 818 817 689 555 0.00434465
-1 969 31 0.00438174
-2 969 308 31 0.00438174
-2 969 428 31 0.00438174
-3 969 428 308 31 0.00438174
-1 931 583 0.00438558
-2 931 772 583 0.00438558
-2 931 901 583 0.00438558
-3 931 901 772 583 0.00438558
-1 957 31 0.00438695
-2 957 428 31 0.00438695
-2 969 957 31 0.00438695
-3 969 957 428 31 0.00438695
-2 780 734 382 0.00438802
-3 780 734 382 238 0.00438802
-1 877 538 0.00441549
-2 877 538 255 0.00441549
-2 877 538 435 0.00441549
-3 877 538 435 255 0.00441549
-1 793 669 0.00445985
-2 793 759 669 0.00445985
-2 793 776 669 0.00445985
-3 793 776 759 669 0.00445985
-2 922 870 630 0.0044648
-3 922 871 870 630 0.0044648
-1 677 655 0.00446622
-2 677 655 517 0.00446622
-2 891 677 655 0.00446622
-3 891 677 655 517 0.00446622
-1 958 31 0.00446944
-2 958 428 31 0.00446944
-2 958 957 31 0.00446944
-3 958 957 428 31 0.00446944
-2 958 31 2 0.00447102
-3 958 428 31 2 0.00447102
-2 748 653 82 0.0044774
-3 749 748 653 82 0.0044774
-1 941 446 0.00447811
-2 941 647 446 0.00447811
-2 941 648 446 0.00447811
-3 941 648 647 446 0.00447811
-2 793 761 669 0.00447941
-3 793 761 759 669 0.00447941
-1 670 82 0.00448091
-2 670 643 82 0.00448091
-2 979 670 82 0.00448091
-3 979 670 643 82 0.00448091
-1 973 607 0.00448656
-2 973 972 607 0.00448656
-2 989 973 607 0.00448656
-3 989 973 972 607 0.00448656
-1 843 258 0.00449748
-2 843 264 258 0.00449748
-2 843 812 258 0.00449748
-3 843 812 264 258 0.00449748
-1 992 698 0.00452306
-2 992 698 696 0.00452306
-2 992 985 698 0.00452306
-3 992 985 698 696 0.00452306
-1 713 490 0.00452318
-2 713 490 147 0.00452318
-2 913 713 490 0.00452318
-3 913 713 490 147 0.00452318
-2 226 196 62 0.00454125
-3 226 197 196 62 0.00454125
-2 941 649 446 0.00455011
-3 941 649 648 446 0.00455011
-2 803 699 632 0.00455255
-3 803 699 632 199 0.00455255
-1 813 205 0.00456278
-2 813 408 205 0.00456278
-2 933 813 205 0.00456278
-3 933 813 408 205 0.00456278
-1 219 95 0.0045703
-2 219 96 95 0.0045703
-2 276 219 95 0.0045703
-3 276 219 96 95 0.0045703
-1 619 545 0.00458947
-2 647 619 545 0.00458947
-2 674 619 545 0.00458947
-3 674 647 619 545 0.00458947
-1 351 240 0.00459389
-2 351 241 240 0.00459389
-2 351 244 240 0.00459389
-3 351 244 241 240 0.00459389
-2 351 243 241 0.00460196
-3 798 351 243 241 0.00460196
-1 796 489 0.00463968
-2 796 489 393 0.00463968
-2 797 796 489 0.00463968
-3 797 796 489 393 0.00463968
-2 748 365 81 0.00465562
-3 748 365 309 81 0.00465562
-1 931 846 0.00468824
-2 931 846 766 0.00468824
-2 931 846 772 0.00468824
-3 931 846 772 766 0.00468824
-2 931 846 765 0.00469681
-3 931 846 766 765 0.00469681
-1 951 671 0.00469975
-2 951 672 671 0.00469975
-2 951 931 671 0.00469975
-3 951 931 672 671 0.00469975
-2 403 385 116 0.00471851
-3 403 386 385 116 0.00471851
-2 975 941 446 0.00472246
-3 975 941 649 446 0.00472246
-1 438 0 0.00472323
-2 553 438 0 0.00472323
-2 554 438 0 0.00472323
-3 554 553 438 0 0.00472323
-1 727 630 0.0047385
-2 727 726 630 0.0047385
-2 922 727 630 0.0047385
-3 922 727 726 630 0.0047385
-2 941 647 545 0.00473997
-3 941 880 647 545 0.00473997
-2 925 630 480 0.00475553
-3 925 921 630 480 0.00475553
-1 777 9 0.00477352
-2 777 536 9 0.00477352
-2 777 633 9 0.00477352
-3 777 633 536 9 0.00477352
-2 351 243 240 0.00477471
-3 351 243 241 240 0.00477471
-1 892 324 0.00479983
-2 892 594 324 0.00479983
-2 892 846 324 0.00479983
-3 892 846 594 324 0.00479983
-2 669 577 575 0.00485643
-3 669 577 576 575 0.00485643
-2 678 579 530 0.00488892
-3 678 579 531 530 0.00488892
-2 439 438 0 0.00488951
-3 554 439 438 0 0.00488951
-1 887 278 0.00489604
-2 887 806 278 0.00489604
-2 888 887 278 0.00489604
-3 888 887 806 278 0.00489604
-1 941 619 0.00491318
-2 941 619 446 0.00491318
-2 941 647 619 0.00491318
-3 941 647 619 446 0.00491318
-1 322 312 0.004928
-2 322 312 82 0.004928
-2 325 322 312 0.004928
-3 325 322 312 82 0.004928
-1 609 1 0.00494488
-2 996 609 1 0.00494488
-2 999 609 1 0.00494488
-3 999 996 609 1 0.00494488
-2 219 95 4 0.00494623
-3 276 219 95 4 0.00494623
-1 793 205 0.00495492
-2 793 284 205 0.00495492
-2 793 612 205 0.00495492
-3 793 612 284 205 0.00495492
-1 446 206 0.00497902
-2 496 446 206 0.00497902
-2 975 446 206 0.00497902
-3 975 496 446 206 0.00497902
-1 778 663 0.00500597
-2 778 663 651 0.00500597
-2 778 695 663 0.00500597
-3 778 695 663 651 0.00500597
-1 796 642 0.00501956
-2 796 642 393 0.00501956
-2 877 796 642 0.00501956
-3 877 796 642 393 0.00501956
-2 941 619 545 0.00502544
-3 941 647 619 545 0.00502544
-2 609 553 1 0.00507711
-3 999 609 553 1 0.00507711
-1 324 312 0.00509257
-2 325 324 312 0.00509257
-2 594 324 312 0.00509257
-3 594 325 324 312 0.00509257
-2 324 322 312 0.00511261
-3 325 324 322 312 0.00511261
-2 811 738 522 0.00511386
-3 811 738 522 521 0.00511386
-1 727 629 0.0051303
-2 727 630 629 0.0051303
-2 727 726 629 0.0051303
-3 727 726 630 629 0.0051303
-2 940 583 232 0.00513941
-3 940 829 583 232 0.00513941
-1 935 358 0.00514623
-2 935 359 358 0.00514623
-2 935 604 358 0.00514623
-3 935 604 359 358 0.00514623
-1 897 578 0.0051564
-2 897 578 98 0.0051564
-2 897 762 578 0.0051564
-3 897 762 578 98 0.0051564
-1 793 299 0.00516091
-2 793 299 284 0.00516091
-2 793 536 299 0.00516091
-3 793 536 299 284 0.00516091
-2 897 578 97 0.00516339
-3 897 578 98 97 0.00516339
-1 545 446 0.00517831
-2 619 545 446 0.00517831
-2 941 545 446 0.00517831
-3 941 619 545 446 0.00517831
-1 939 1 0.00521888
-2 939 938 1 0.00521888
-2 996 939 1 0.00521888
-3 996 939 938 1 0.00521888
-1 998 973 0.00522186
-2 998 973 945 0.00522186
-2 998 973 972 0.00522186
-3 998 973 972 945 0.00522186
-1 900 698 0.00523369
-2 900 698 696 0.00523369
-2 900 879 698 0.00523369
-3 900 879 698 696 0.00523369
-1 553 54 0.00524396
-2 553 54 0 0.00524396
-2 553 54 1 0.00524396
-3 553 54 1 0 0.00524396
-1 804 278 0.00525712
-2 887 804 278 0.00525712
-2 888 804 278 0.00525712
-3 888 887 804 278 0.00525712
-2 892 324 312 0.00529024
-3 892 594 324 312 0.00529024
-1 728 285 0.00529338
-2 728 285 0 0.00529338
-2 728 287 285 0.00529338
-3 728 287 285 0 0.00529338
-1 666 481 0.00531079
-2 666 483 481 0.00531079
-2 809 666 481 0.00531079
-3 809 666 483 481 0.00531079
-2 806 804 278 0.00531963
-3 887 806 804 278 0.00531963
-1 690 281 0.00532622
-2 690 544 281 0.00532622
-2 690 596 281 0.00532622
-3 690 596 544 281 0.00532622
-2 713 490 227 0.00532662
-3 713 490 227 147 0.00532662
-1 788 619 0.00533371
-2 788 619 618 0.00533371
-2 981 788 619 0.00533371
-3 981 788 619 618 0.00533371
-1 698 679 0.00534356
-2 698 679 579 0.00534356
-2 879 698 679 0.00534356
-3 879 698 679 579 0.00534356
-1 939 2 0.00534401
-2 939 2 1 0.00534401
-2 939 938 2 0.00534401
-3 939 938 2 1 0.00534401
-1 293 5 0.00536456
-2 293 5 4 0.00536456
-2 293 39 5 0.00536456
-3 293 39 5 4 0.00536456
-1 786 285 0.0053798
-2 786 285 0 0.0053798
-2 786 728 285 0.0053798
-3 786 728 285 0 0.0053798
-1 955 734 0.00539741
-2 955 734 249 0.00539741
-2 955 817 734 0.00539741
-3 955 817 734 249 0.00539741
-1 633 8 0.00542337
-2 633 9 8 0.00542337
-2 633 219 8 0.00542337
-3 633 219 9 8 0.00542337
-1 897 365 0.0054346
-2 897 578 365 0.0054346
-2 897 762 365 0.0054346
-3 897 762 578 365 0.0054346
-2 813 616 205 0.00548666
-3 933 813 616 205 0.00548666
-1 299 205 0.00549707
-2 299 284 205 0.00549707
-2 746 299 205 0.00549707
-3 746 299 284 205 0.00549707
-1 897 366 0.00554013
-2 897 366 365 0.00554013
-2 897 578 366 0.00554013
-3 897 578 366 365 0.00554013
-1 906 285 0.00555441
-2 906 287 285 0.00555441
-2 906 728 285 0.00555441
-3 906 728 287 285 0.00555441
-2 897 366 97 0.00555522
-3 897 578 366 97 0.00555522
-1 438 54 0.00557066
-2 438 54 0 0.00557066
-2 553 438 54 0.00557066
-3 553 438 54 0 0.00557066
-2 793 299 205 0.00559914
-3 793 299 284 205 0.00559914
-2 900 698 679 0.00561527
-3 900 879 698 679 0.00561527
-2 939 609 1 0.00563404
-3 996 939 609 1 0.00563404
-2 787 775 192 0.00565476
-3 787 775 755 192 0.00565476
-1 609 2 0.00571697
-2 609 2 1 0.00571697
-2 939 609 2 0.00571697
-3 939 609 2 1 0.00571697
-1 958 29 0.00572252
-2 958 29 2 0.00572252
-2 958 31 29 0.00572252
-3 958 31 29 2 0.00572252
-1 818 630 0.00572817
-2 818 630 480 0.00572817
-2 925 818 630 0.00572817
-3 925 818 630 480 0.00572817
-2 818 630 555 0.00575029
-3 925 818 630 555 0.00575029
-1 839 624 0.0057628
-2 839 624 551 0.0057628
-2 860 839 624 0.0057628
-3 860 839 624 551 0.0057628
-1 619 51 0.0057825
-2 619 51 48 0.0057825
-2 619 51 50 0.0057825
-3 619 51 50 48 0.0057825
-2 826 786 579 0.00578298
-3 826 816 786 579 0.00578298
-1 707 358 0.00581236
-2 707 362 358 0.00581236
-2 707 364 358 0.00581236
-3 707 364 362 358 0.00581236
-1 244 243 0.00581431
-2 244 243 240 0.00581431
-2 351 244 243 0.00581431
-3 351 244 243 240 0.00581431
-1 881 285 0.00585413
-2 881 728 285 0.00585413
-2 881 786 285 0.00585413
-3 881 786 728 285 0.00585413
-2 906 881 285 0.00585525
-3 906 881 728 285 0.00585525
-1 609 54 0.00587096
-2 609 54 1 0.00587096
-2 609 553 54 0.00587096
-3 609 553 54 1 0.00587096
-2 904 681 191 0.0058737
-3 904 779 681 191 0.0058737
-1 904 734 0.00590908
-2 904 734 249 0.00590908
-2 904 780 734 0.00590908
-3 904 780 734 249 0.00590908
-1 632 9 0.00591093
-2 633 632 9 0.00591093
-2 777 632 9 0.00591093
-3 777 633 632 9 0.00591093
-2 904 807 681 0.00591204
-3 904 808 807 681 0.00591204
-1 793 746 0.0059232
-2 793 746 205 0.0059232
-2 793 746 299 0.0059232
-3 793 746 299 205 0.0059232
-2 788 619 48 0.00593201
-3 788 619 618 48 0.00593201
-2 839 659 624 0.005962
-3 860 839 659 624 0.005962
-2 931 846 583 0.00600761
-3 931 846 772 583 0.00600761
-1 446 347 0.00605088
-2 446 347 206 0.00605088
-2 975 446 347 0.00605088
-3 975 446 347 206 0.00605088
-1 439 54 0.00606839
-2 439 54 0 0.00606839
-2 439 438 54 0.00606839
-3 439 438 54 0 0.00606839
-1 642 489 0.0060795
-2 642 489 393 0.0060795
-2 642 577 489 0.0060795
-3 642 577 489 393 0.0060795
-1 608 54 0.00608202
-2 608 438 54 0.00608202
-2 608 553 54 0.00608202
-3 608 553 438 54 0.00608202
-2 941 446 347 0.00614605
-3 975 941 446 347 0.00614605
-1 366 116 0.00619918
-2 366 116 97 0.00619918
-2 402 366 116 0.00619918
-3 402 366 116 97 0.00619918
-1 410 205 0.00621108
-2 410 408 205 0.00621108
-2 813 410 205 0.00621108
-3 813 410 408 205 0.00621108
-1 365 97 0.00621119
-2 366 365 97 0.00621119
-2 897 365 97 0.00621119
-3 897 366 365 97 0.00621119
-2 873 793 536 0.00629109
-3 874 873 793 536 0.00629109
-1 765 82 0.0063109
-2 765 322 82 0.0063109
-2 979 765 82 0.0063109
-3 979 765 322 82 0.0063109
-1 765 312 0.00634055
-2 765 312 82 0.00634055
-2 765 322 312 0.00634055
-3 765 322 312 82 0.00634055
-1 672 466 0.0063553
-2 951 672 466 0.0063553
-2 961 672 466 0.0063553
-3 961 951 672 466 0.0063553
-2 765 324 312 0.00637187
-3 765 324 322 312 0.00637187
-1 444 285 0.00641196
-2 444 287 285 0.00641196
-2 906 444 285 0.00641196
-3 906 444 287 285 0.00641196
-2 897 748 365 0.00644617
-3 897 762 748 365 0.00644617
-1 579 0 0.00645201
-2 579 341 0 0.00645201
-2 579 529 0 0.00645201
-3 579 529 341 0 0.00645201
-1 796 255 0.00645205
-2 796 642 255 0.00645205
-2 877 796 255 0.00645205
-3 877 796 642 255 0.00645205
-1 725 629 0.00645683
-2 976 725 629 0.00645683
-2 977 725 629 0.00645683
-3 977 976 725 629 0.00645683
-1 937 2 0.00647482
-2 938 937 2 0.00647482
-2 958 937 2 0.00647482
-3 958 938 937 2 0.00647482
-2 818 483 480 0.00647573
-3 818 483 482 480 0.00647573
-2 870 727 630 0.00648281
-3 922 870 727 630 0.00648281
-1 196 116 0.00648802
-2 385 196 116 0.00648802
-2 403 196 116 0.00648802
-3 403 385 196 116 0.00648802
-2 881 444 285 0.00650474
-3 906 881 444 285 0.00650474
-1 846 312 0.0065755
-2 846 324 312 0.0065755
-2 892 846 312 0.0065755
-3 892 846 324 312 0.0065755
-1 962 433 0.00657697
-2 962 832 433 0.00657697
-2 984 962 433 0.00657697
-3 984 962 832 433 0.00657697
-1 936 2 0.00663333
-2 938 936 2 0.00663333
-2 939 936 2 0.00663333
-3 939 938 936 2 0.00663333
-2 609 608 54 0.00666349
-3 609 608 553 54 0.00666349
-2 402 196 116 0.00666388
-3 403 402 196 116 0.00666388
-1 979 312 0.00667915
-2 979 312 82 0.00667915
-2 979 765 312 0.00667915
-3 979 765 312 82 0.00667915
-1 220 5 0.00668402
-2 220 5 4 0.00668402
-2 293 220 5 0.00668402
-3 293 220 5 4 0.00668402
-1 737 699 0.00673725
-2 737 699 198 0.00673725
-2 811 737 699 0.00673725
-3 811 737 699 198 0.00673725
-2 846 765 312 0.00678352
-3 846 765 324 312 0.00678352
-2 937 936 2 0.00679224
-3 938 937 936 2 0.00679224
-1 502 496 0.00681451
-2 502 500 496 0.00681451
-2 520 502 496 0.00681451
-3 520 502 500 496 0.00681451
-2 609 54 2 0.00682195
-3 609 54 2 1 0.00682195
-2 793 761 575 0.00682928
-3 793 761 587 575 0.00682928
-2 818 689 630 0.00687896
-3 818 689 630 555 0.00687896
-1 349 288 0.0068845
-2 349 288 227 0.0068845
-2 349 288 244 0.0068845
-3 349 288 244 227 0.0068845
-1 486 277 0.00692219
-2 499 486 277 0.00692219
-2 733 486 277 0.00692219
-3 733 499 486 277 0.00692219
-1 220 6 0.00693059
-2 220 6 4 0.00693059
-2 220 6 5 0.00693059
-3 220 6 5 4 0.00693059
-2 707 358 356 0.0069602
-3 707 362 358 356 0.0069602
-2 612 410 205 0.0070132
-3 612 410 408 205 0.0070132
-1 937 29 0.00706055
-2 937 29 2 0.00706055
-2 958 937 29 0.00706055
-3 958 937 29 2 0.00706055
-2 897 97 21 0.00706422
-3 897 97 22 21 0.00706422
-2 666 481 430 0.00708838
-3 809 666 481 430 0.00708838
-1 670 312 0.00709562
-2 670 312 82 0.00709562
-2 979 670 312 0.00709562
-3 979 670 312 82 0.00709562
-2 288 244 240 0.00712702
-3 289 288 244 240 0.00712702
-2 670 646 82 0.00713666
-3 670 646 643 82 0.00713666
-1 881 0 0.00718674
-2 881 285 0 0.00718674
-2 881 786 0 0.00718674
-3 881 786 285 0 0.00718674
-1 82 60 0.00720681
-2 82 81 60 0.00720681
-2 312 82 60 0.00720681
-3 312 82 81 60 0.00720681
-1 876 715 0.00722006
-2 876 835 715 0.00722006
-2 913 876 715 0.00722006
-3 913 876 835 715 0.00722006
-1 935 466 0.00722983
-2 935 466 6 0.00722983
-2 980 935 466 0.00722983
-3 980 935 466 6 0.00722983
-2 486 280 277 0.00727612
-3 733 486 280 277 0.00727612
-1 738 4 0.00728677
-2 738 95 4 0.00728677
-2 738 522 4 0.00728677
-3 738 522 95 4 0.00728677
-2 980 672 466 0.00728831
-3 980 961 672 466 0.00728831
-1 632 8 0.0072888
-2 632 9 8 0.0072888
-2 633 632 8 0.0072888
-3 633 632 9 8 0.0072888
-2 765 670 312 0.00729182
-3 979 765 670 312 0.00729182
-1 436 54 0.00733005
-2 438 436 54 0.00733005
-2 439 436 54 0.00733005
-3 439 438 436 54 0.00733005
-1 575 205 0.0074105
-2 612 575 205 0.0074105
-2 793 575 205 0.0074105
-3 793 612 575 205 0.0074105
-1 936 29 0.0074862
-2 936 29 2 0.0074862
-2 937 936 29 0.0074862
-3 937 936 29 2 0.0074862
-2 498 430 277 0.00749184
-3 498 430 429 277 0.00749184
-1 770 466 0.00761888
-2 770 672 466 0.00761888
-2 980 770 466 0.00761888
-3 980 770 672 466 0.00761888
-1 914 842 0.0076393
-2 914 888 842 0.0076393
-2 914 899 842 0.0076393
-3 914 899 888 842 0.0076393
-1 888 277 0.00764444
-2 888 278 277 0.00764444
-2 888 481 277 0.00764444
-3 888 481 278 277 0.00764444
-1 422 36 0.00766042
-2 655 422 36 0.00766042
-2 657 422 36 0.00766042
-3 657 655 422 36 0.00766042
-2 793 669 575 0.00769196
-3 793 761 669 575 0.00769196
-1 819 689 0.00770941
-2 819 817 689 0.00770941
-2 819 818 689 0.00770941
-3 819 818 817 689 0.00770941
-1 801 500 0.00773585
-2 801 502 500 0.00773585
-2 801 691 500 0.00773585
-3 801 691 502 500 0.00773585
-2 955 904 734 0.00780321
-3 955 904 734 249 0.00780321
-1 529 54 0.00780872
-2 529 54 0 0.00780872
-2 529 439 54 0.00780872
-3 529 439 54 0 0.00780872
-1 881 579 0.00784857
-2 881 786 579 0.00784857
-2 881 826 579 0.00784857
-3 881 826 786 579 0.00784857
-1 854 734 0.00795461
-2 904 854 734 0.00795461
-2 955 854 734 0.00795461
-3 955 904 854 734 0.00795461
-2 786 579 0 0.0079548
-3 786 579 341 0 0.0079548
-1 939 54 0.00798221
-2 939 54 2 0.00798221
-2 939 609 54 0.00798221
-3 939 609 54 2 0.00798221
-2 796 642 489 0.00798257
-3 796 642 489 393 0.00798257
-1 804 731 0.0079885
-2 804 731 278 0.0079885
-2 806 804 731 0.0079885
-3 806 804 731 278 0.0079885
-1 837 659 0.00802714
-2 837 659 622 0.00802714
-2 839 837 659 0.00802714
-3 839 837 659 622 0.00802714
-2 545 446 347 0.00807622
-3 941 545 446 347 0.00807622
-1 746 575 0.00822033
-2 746 575 205 0.00822033
-2 793 746 575 0.00822033
-3 793 746 575 205 0.00822033
-1 803 661 0.00831099
-2 803 661 153 0.00831099
-2 803 699 661 0.00831099
-3 803 699 661 153 0.00831099
-1 96 4 0.00841453
-2 96 95 4 0.00841453
-2 219 96 4 0.00841453
-3 219 96 95 4 0.00841453
-1 873 669 0.00852228
-2 873 776 669 0.00852228
-2 873 793 669 0.00852228
-3 873 793 776 669 0.00852228
-1 530 54 0.00855409
-2 530 439 54 0.00855409
-2 530 529 54 0.00855409
-3 530 529 439 54 0.00855409
-1 835 435 0.00867232
-2 876 835 435 0.00867232
-2 877 835 435 0.00867232
-3 877 876 835 435 0.00867232
-1 835 490 0.00867316
-2 835 490 435 0.00867316
-2 876 835 490 0.00867316
-3 876 835 490 435 0.00867316
-1 774 365 0.0087698
-2 774 748 365 0.0087698
-2 897 774 365 0.0087698
-3 897 774 748 365 0.0087698
-2 788 619 51 0.0087822
-3 788 619 51 48 0.0087822
-1 409 205 0.00885065
-2 410 409 205 0.00885065
-2 612 409 205 0.00885065
-3 612 410 409 205 0.00885065
-2 726 725 629 0.00887716
-3 977 726 725 629 0.00887716
-1 936 55 0.0088783
-2 936 55 2 0.0088783
-2 936 55 29 0.0088783
-3 936 55 29 2 0.0088783
-1 801 619 0.0089602
-2 801 619 446 0.0089602
-2 802 801 619 0.0089602
-3 802 801 619 446 0.0089602
-1 244 242 0.0089697
-2 244 242 240 0.0089697
-2 244 243 242 0.0089697
-3 244 243 242 240 0.0089697
-1 699 633 0.00896976
-2 699 633 198 0.00896976
-2 699 633 632 0.00896976
-3 699 633 632 198 0.00896976
-1 813 668 0.00897415
-2 813 668 498 0.00897415
-2 934 813 668 0.00897415
-3 934 813 668 498 0.00897415
-1 622 26 0.00900335
-2 623 622 26 0.00900335
-2 659 622 26 0.00900335
-3 659 623 622 26 0.00900335
-1 873 9 0.00909309
-2 873 536 9 0.00909309
-2 873 777 9 0.00909309
-3 873 777 536 9 0.00909309
-2 935 358 357 0.00911162
-3 935 359 358 357 0.00911162
-1 807 666 0.00911953
-2 807 668 666 0.00911953
-2 903 807 666 0.00911953
-3 903 807 668 666 0.00911953
-1 939 55 0.00913512
-2 939 55 2 0.00913512
-2 939 936 55 0.00913512
-3 939 936 55 2 0.00913512
-2 907 831 828 0.00916834
-3 907 831 828 110 0.00916834
-1 619 337 0.00919113
-2 619 338 337 0.00919113
-2 619 342 337 0.00919113
-3 619 342 338 337 0.00919113
-1 835 538 0.0091984
-2 835 538 435 0.0091984
-2 877 835 538 0.0091984
-3 877 835 538 435 0.0091984
-1 846 287 0.00920079
-2 846 312 287 0.00920079
-2 892 846 287 0.00920079
-3 892 846 312 287 0.00920079
-2 939 55 54 0.00920363
-3 939 55 54 2 0.00920363
-1 796 538 0.00923135
-2 796 538 255 0.00923135
-2 877 796 538 0.00923135
-3 877 796 538 255 0.00923135
-1 349 240 0.00928364
-2 349 244 240 0.00928364
-2 349 288 240 0.00928364
-3 349 288 244 240 0.00928364
-1 446 233 0.00933097
-2 446 233 206 0.00933097
-2 496 446 233 0.00933097
-3 496 446 233 206 0.00933097
-2 834 804 731 0.00954015
-3 834 806 804 731 0.00954015
-2 738 96 4 0.00975874
-3 738 96 95 4 0.00975874
-1 931 646 0.00977815
-2 931 670 646 0.00977815
-2 931 671 646 0.00977815
-3 931 671 670 646 0.00977815
-1 803 150 0.00991648
-2 803 153 150 0.00991648
-2 803 661 150 0.00991648
-3 803 661 153 150 0.00991648
-1 579 54 0.010004
-2 579 54 0 0.010004
-2 579 529 54 0.010004
-3 579 529 54 0 0.010004
-2 935 770 466 0.0100232
-3 980 935 770 466 0.0100232
-1 881 54 0.0100712
-2 881 54 0 0.0100712
-2 881 285 54 0.0100712
-3 881 285 54 0 0.0100712
-1 924 788 0.0101151
-2 924 788 787 0.0101151
-2 948 924 788 0.0101151
-3 948 924 788 787 0.0101151
-1 936 54 0.0101199
-2 936 55 54 0.0101199
-2 939 936 54 0.0101199
-3 939 936 55 54 0.0101199
-1 970 8 0.0101363
-2 970 219 8 0.0101363
-2 970 633 8 0.0101363
-3 970 633 219 8 0.0101363
-2 881 579 0 0.0102702
-3 881 786 579 0 0.0102702
-2 835 796 538 0.010271
-3 877 835 796 538 0.010271
-1 873 151 0.0104088
-2 873 776 151 0.0104088
-2 873 803 151 0.0104088
-3 873 803 776 151 0.0104088
-1 734 666 0.0104291
-2 817 734 666 0.0104291
-2 955 734 666 0.0104291
-3 955 817 734 666 0.0104291
-1 673 54 0.010442
-2 673 609 54 0.010442
-2 939 673 54 0.010442
-3 939 673 609 54 0.010442
-2 835 538 490 0.0104572
-3 835 538 490 435 0.0104572
-2 813 807 668 0.0105459
-3 934 813 807 668 0.0105459
-1 892 285 0.0105561
-2 892 287 285 0.0105561
-2 892 444 285 0.0105561
-3 892 444 287 285 0.0105561
-1 349 243 0.0105692
-2 349 244 243 0.0105692
-2 351 349 243 0.0105692
-3 351 349 244 243 0.0105692
-1 918 678 0.0106233
-2 918 678 421 0.0106233
-2 918 679 678 0.0106233
-3 918 679 678 421 0.0106233
-1 349 242 0.0106683
-2 349 242 240 0.0106683
-2 349 244 242 0.0106683
-3 349 244 242 240 0.0106683
-2 349 243 242 0.0106876
-3 349 244 243 242 0.0106876
-1 804 486 0.0107329
-2 804 731 486 0.0107329
-2 834 804 486 0.0107329
-3 834 804 731 486 0.0107329
-1 689 666 0.0107525
-2 734 689 666 0.0107525
-2 817 689 666 0.0107525
-3 817 734 689 666 0.0107525
-1 624 549 0.0107758
-2 624 551 549 0.0107758
-2 629 624 549 0.0107758
-3 629 624 551 549 0.0107758
-1 863 691 0.0108013
-2 863 862 691 0.0108013
-2 981 863 691 0.0108013
-3 981 863 862 691 0.0108013
-1 796 395 0.0108973
-2 796 395 255 0.0108973
-2 796 642 395 0.0108973
-3 796 642 395 255 0.0108973
-1 716 490 0.0109343
-2 716 490 227 0.0109343
-2 716 713 490 0.0109343
-3 716 713 490 227 0.0109343
-1 714 490 0.0109432
-2 714 713 490 0.0109432
-2 913 714 490 0.0109432
-3 913 714 713 490 0.0109432
-2 819 689 666 0.0109715
-3 819 817 689 666 0.0109715
-2 716 714 490 0.0110185
-3 716 714 713 490 0.0110185
-1 689 480 0.0110206
-2 689 630 480 0.0110206
-2 818 689 480 0.0110206
-3 818 689 630 480 0.0110206
-1 960 698 0.0110521
-2 963 960 698 0.0110521
-2 985 960 698 0.0110521
-3 985 963 960 698 0.0110521
-2 873 669 151 0.0110572
-3 873 776 669 151 0.0110572
-1 575 299 0.0111019
-2 746 575 299 0.0111019
-2 793 575 299 0.0111019
-3 793 746 575 299 0.0111019
-2 854 734 666 0.0111087
-3 955 854 734 666 0.0111087
-2 575 409 205 0.0111129
-3 612 575 409 205 0.0111129
-1 489 395 0.0112042
-2 642 489 395 0.0112042
-2 796 489 395 0.0112042
-3 796 642 489 395 0.0112042
-2 881 579 54 0.0112122
-3 881 579 54 0 0.0112122
-1 8 4 0.011276
-2 219 8 4 0.011276
-2 220 8 4 0.011276
-3 220 219 8 4 0.011276
-1 870 629 0.0113172
-2 870 630 629 0.0113172
-2 870 727 629 0.0113172
-3 870 727 630 629 0.0113172
-1 904 666 0.0114123
-2 904 854 666 0.0114123
-2 904 903 666 0.0114123
-3 904 903 854 666 0.0114123
-1 826 54 0.0114447
-2 826 579 54 0.0114447
-2 881 826 54 0.0114447
-3 881 826 579 54 0.0114447
-1 517 258 0.0114566
-2 655 517 258 0.0114566
-2 812 517 258 0.0114566
-3 812 655 517 258 0.0114566
-2 579 530 54 0.0116972
-3 579 530 529 54 0.0116972
-1 724 629 0.0117117
-2 726 724 629 0.0117117
-2 727 724 629 0.0117117
-3 727 726 724 629 0.0117117
-1 437 54 0.0117557
-2 437 436 54 0.0117557
-2 439 437 54 0.0117557
-3 439 437 436 54 0.0117557
-2 349 243 196 0.011769
-3 351 349 243 196 0.011769
-1 583 466 0.0118228
-2 583 466 89 0.0118228
-2 901 583 466 0.0118228
-3 901 583 466 89 0.0118228
-2 737 699 633 0.011832
-3 737 699 633 198 0.011832
-1 714 308 0.0118354
-2 716 714 308 0.0118354
-2 969 714 308 0.0118354
-3 969 716 714 308 0.0118354
-1 714 227 0.0119546
-2 714 308 227 0.0119546
-2 716 714 227 0.0119546
-3 716 714 308 227 0.0119546
-1 577 394 0.0119617
-2 642 577 394 0.0119617
-2 669 577 394 0.0119617
-3 669 642 577 394 0.0119617
-1 872 331 0.0119798
-2 872 332 331 0.0119798
-2 872 333 331 0.0119798
-3 872 333 332 331 0.0119798
-1 646 312 0.0121139
-2 646 312 82 0.0121139
-2 670 646 312 0.0121139
-3 670 646 312 82 0.0121139
-1 954 29 0.0121333
-2 954 937 29 0.0121333
-2 958 954 29 0.0121333
-3 958 954 937 29 0.0121333
-2 725 724 629 0.0121655
-3 726 725 724 629 0.0121655
-2 940 583 235 0.0121758
-3 940 583 235 232 0.0121758
-2 804 486 278 0.0123481
-3 804 731 486 278 0.0123481
-2 796 538 395 0.0123573
-3 796 538 395 255 0.0123573
-1 226 104 0.0124041
-2 226 104 62 0.0124041
-2 308 226 104 0.0124041
-3 308 226 104 62 0.0124041
-1 678 54 0.0124932
-2 678 530 54 0.0124932
-2 678 579 54 0.0124932
-3 678 579 530 54 0.0124932
-1 954 31 0.0126528
-2 954 31 29 0.0126528
-2 958 954 31 0.0126528
-3 958 954 31 29 0.0126528
-1 746 11 0.0126917
-2 746 283 11 0.0126917
-2 746 299 11 0.0126917
-3 746 299 283 11 0.0126917
-2 530 437 54 0.0126918
-3 530 439 437 54 0.0126918
-2 678 437 54 0.0128732
-3 678 530 437 54 0.0128732
-1 575 536 0.0129148
-2 575 536 299 0.0129148
-2 793 575 536 0.0129148
-3 793 575 536 299 0.0129148
-1 331 223 0.0129439
-2 331 224 223 0.0129439
-2 687 331 223 0.0129439
-3 687 331 224 223 0.0129439
-2 904 734 382 0.0130525
-3 904 780 734 382 0.0130525
-2 957 954 31 0.0130693
-3 958 957 954 31 0.0130693
-1 706 358 0.013081
-2 706 364 358 0.013081
-2 707 706 358 0.013081
-3 707 706 364 358 0.013081
-1 868 54 0.0130929
-2 868 436 54 0.0130929
-2 868 437 54 0.0130929
-3 868 437 436 54 0.0130929
-1 715 490 0.0133256
-2 715 714 490 0.0133256
-2 913 715 490 0.0133256
-3 913 715 714 490 0.0133256
-2 892 881 285 0.0133387
-3 892 881 444 285 0.0133387
-2 936 54 29 0.0134106
-3 936 55 54 29 0.0134106
-2 714 490 227 0.0135019
-3 716 714 490 227 0.0135019
-1 489 394 0.0137913
-2 577 489 394 0.0137913
-2 642 489 394 0.0137913
-3 642 577 489 394 0.0137913
-2 774 748 706 0.0141141
-3 774 773 748 706 0.0141141
-1 714 31 0.0141597
-2 714 308 31 0.0141597
-2 969 714 31 0.0141597
-3 969 714 308 31 0.0141597
-1 664 651 0.0141875
-2 664 651 414 0.0141875
-2 665 664 651 0.0141875
-3 665 664 651 414 0.0141875
-2 583 466 157 0.0142586
-3 583 466 157 89 0.0142586
-2 623 422 36 0.0143653
-3 657 623 422 36 0.0143653
-1 605 82 0.0144972
-2 653 605 82 0.0144972
-2 923 605 82 0.0144972
-3 923 653 605 82 0.0144972
-1 797 395 0.0145489
-2 797 489 395 0.0145489
-2 797 796 395 0.0145489
-3 797 796 489 395 0.0145489
-1 845 235 0.0145577
-2 845 235 234 0.0145577
-2 898 845 235 0.0145577
-3 898 845 235 234 0.0145577
-1 946 549 0.0145924
-2 949 946 549 0.0145924
-2 991 946 549 0.0145924
-3 991 949 946 549 0.0145924
-2 619 337 50 0.0146089
-3 619 338 337 50 0.0146089
-2 799 787 192 0.014739
-3 799 787 775 192 0.014739
-1 746 536 0.0147441
-2 746 536 299 0.0147441
-2 746 575 536 0.0147441
-3 746 575 536 299 0.0147441
-1 797 538 0.0148158
-2 797 796 538 0.0148158
-2 835 797 538 0.0148158
-3 835 797 796 538 0.0148158
-2 797 538 395 0.0148161
-3 797 796 538 395 0.0148161
-1 931 466 0.0148531
-2 931 583 466 0.0148531
-2 931 901 466 0.0148531
-3 931 901 583 466 0.0148531
-1 919 778 0.0149017
-2 919 778 663 0.0149017
-2 919 778 695 0.0149017
-3 919 778 695 663 0.0149017
-1 622 28 0.0149189
-2 622 28 26 0.0149189
-2 659 622 28 0.0149189
-3 659 622 28 26 0.0149189
-2 954 936 29 0.0149376
-3 954 937 936 29 0.0149376
-1 610 54 0.0149868
-2 610 608 54 0.0149868
-2 610 609 54 0.0149868
-3 610 609 608 54 0.0149868
-1 624 622 0.0151796
-2 624 622 28 0.0151796
-2 659 624 622 0.0151796
-3 659 624 622 28 0.0151796
-1 196 104 0.0152239
-2 196 104 62 0.0152239
-2 226 196 104 0.0152239
-3 226 196 104 62 0.0152239
-1 96 8 0.0152525
-2 219 96 8 0.0152525
-2 970 96 8 0.0152525
-3 970 219 96 8 0.0152525
-2 624 622 26 0.0154161
-3 624 622 28 26 0.0154161
-1 813 409 0.0154882
-2 813 411 409 0.0154882
-2 814 813 409 0.0154882
-3 814 813 411 409 0.0154882
-2 872 863 691 0.0155758
-3 872 863 862 691 0.0155758
-2 876 715 490 0.0156581
-3 913 876 715 490 0.0156581
-1 803 9 0.0159296
-2 803 777 9 0.0159296
-2 873 803 9 0.0159296
-3 873 803 777 9 0.0159296
-2 502 496 446 0.015955
-3 520 502 496 446 0.015955
-1 603 82 0.01598
-2 605 603 82 0.01598
-2 923 603 82 0.01598
-3 923 605 603 82 0.01598
-2 196 104 59 0.0161002
-3 196 104 62 59 0.0161002
-2 489 395 394 0.0161964
-3 642 489 395 394 0.0161964
-2 610 438 54 0.0162835
-3 610 608 438 54 0.0162835
-2 813 410 409 0.0163085
-3 813 411 410 409 0.0163085
-2 870 724 629 0.0163126
-3 870 727 724 629 0.0163126
-2 835 715 490 0.0163472
-3 876 835 715 490 0.0163472
-1 863 500 0.0164978
-2 863 691 500 0.0164978
-2 872 863 500 0.0164978
-3 872 863 691 500 0.0164978
-1 228 104 0.0165848
-2 228 226 104 0.0165848
-2 308 228 104 0.0165848
-3 308 228 226 104 0.0165848
-1 562 205 0.0166163
-2 562 205 203 0.0166163
-2 746 562 205 0.0166163
-3 746 562 205 203 0.0166163
-1 992 900 0.016628
-2 992 900 696 0.016628
-2 992 900 891 0.016628
-3 992 900 891 696 0.016628
-1 651 21 0.0168597
-2 651 212 21 0.0168597
-2 651 650 21 0.0168597
-3 651 650 212 21 0.0168597
-1 228 196 0.0168666
-2 228 196 104 0.0168666
-2 228 226 196 0.0168666
-3 228 226 196 104 0.0168666
-1 746 9 0.0169673
-2 746 299 9 0.0169673
-2 746 536 9 0.0169673
-3 746 536 299 9 0.0169673
-1 699 96 0.0169827
-2 699 633 96 0.0169827
-2 737 699 96 0.0169827
-3 737 699 633 96 0.0169827
-1 948 691 0.0170522
-2 948 863 691 0.0170522
-2 981 948 691 0.0170522
-3 981 948 863 691 0.0170522
-1 890 126 0.0171166
-2 890 126 124 0.0171166
-2 890 878 126 0.0171166
-3 890 878 126 124 0.0171166
-2 349 228 196 0.0171311
-3 349 228 226 196 0.0171311
-1 706 82 0.0172349
-2 706 653 82 0.0172349
-2 748 706 82 0.0172349
-3 748 706 653 82 0.0172349
-2 957 714 31 0.0173524
-3 969 957 714 31 0.0173524
-2 803 632 9 0.0177593
-3 803 777 632 9 0.0177593
-1 837 624 0.0177904
-2 837 659 624 0.0177904
-2 839 837 624 0.0177904
-3 839 837 659 624 0.0177904
-1 931 312 0.0180806
-2 931 670 312 0.0180806
-2 931 765 312 0.0180806
-3 931 765 670 312 0.0180806
-2 673 610 54 0.0183491
-3 673 610 609 54 0.0183491
-1 991 624 0.0183806
-2 991 624 549 0.0183806
-2 991 624 551 0.0183806
-3 991 624 551 549 0.0183806
-2 951 931 466 0.018445
-3 951 931 901 466 0.018445
-1 774 81 0.018515
-2 774 365 81 0.018515
-2 774 748 81 0.018515
-3 774 748 365 81 0.018515
-2 991 839 624 0.0185361
-3 991 839 624 551 0.0185361
-2 931 646 312 0.0185507
-3 931 670 646 312 0.0185507
-2 706 605 358 0.0186469
-3 706 605 364 358 0.0186469
-1 842 724 0.0186502
-2 899 842 724 0.0186502
-2 947 842 724 0.0186502
-3 947 899 842 724 0.0186502
-1 308 196 0.0188396
-2 308 196 104 0.0188396
-2 308 228 196 0.0188396
-3 308 228 196 104 0.0188396
-1 706 81 0.0189802
-2 706 82 81 0.0189802
-2 748 706 81 0.0189802
-3 748 706 82 81 0.0189802
-1 575 9 0.0190249
-2 575 536 9 0.0190249
-2 746 575 9 0.0190249
-3 746 575 536 9 0.0190249
-1 944 629 0.019025
-2 944 725 629 0.019025
-2 976 944 629 0.019025
-3 976 944 725 629 0.019025
-2 837 624 622 0.0190764
-3 837 659 624 622 0.0190764
-1 803 8 0.0190958
-2 803 9 8 0.0190958
-2 803 632 8 0.0190958
-3 803 632 9 8 0.0190958
-1 698 54 0.0191073
-2 698 579 54 0.0191073
-2 826 698 54 0.0191073
-3 826 698 579 54 0.0191073
-1 850 54 0.0194633
-2 850 437 54 0.0194633
-2 868 850 54 0.0194633
-3 868 850 437 54 0.0194633
-1 616 190 0.0197047
-2 616 562 190 0.0197047
-2 681 616 190 0.0197047
-3 681 616 562 190 0.0197047
-2 774 706 81 0.0200134
-3 774 748 706 81 0.0200134
-1 671 312 0.020108
-2 671 646 312 0.020108
-2 931 671 312 0.020108
-3 931 671 646 312 0.020108
-2 616 562 205 0.020295
-3 616 562 205 203 0.020295
-1 288 228 0.020822
-2 288 228 227 0.020822
-2 349 288 228 0.020822
-3 349 288 228 227 0.020822
-1 991 629 0.0209843
-2 991 629 549 0.0209843
-2 991 629 624 0.0209843
-3 991 629 624 549 0.0209843
-1 869 54 0.0213889
-2 869 436 54 0.0213889
-2 869 868 54 0.0213889
-3 869 868 436 54 0.0213889
-1 746 10 0.0214595
-2 746 11 10 0.0214595
-2 746 299 10 0.0214595
-3 746 299 11 10 0.0214595
-2 610 436 54 0.0215968
-3 610 438 436 54 0.0215968
-2 954 714 31 0.0217277
-3 957 954 714 31 0.0217277
-1 856 845 0.0219084
-2 856 845 503 0.0219084
-2 856 845 830 0.0219084
-3 856 845 830 503 0.0219084
-2 706 605 82 0.0219951
-3 706 653 605 82 0.0219951
-1 676 433 0.0221051
-2 962 676 433 0.0221051
-2 984 676 433 0.0221051
-3 984 962 676 433 0.0221051
-2 850 678 54 0.0221975
-3 850 678 437 54 0.0221975
-1 788 192 0.0225376
-2 788 192 51 0.0225376
-2 788 787 192 0.0225376
-3 788 787 192 51 0.0225376
-2 869 610 54 0.0225572
-3 869 610 436 54 0.0225572
-1 924 192 0.0227572
-2 924 787 192 0.0227572
-2 924 799 192 0.0227572
-3 924 799 787 192 0.0227572
-1 793 9 0.022892
-2 793 536 9 0.022892
-2 793 575 9 0.022892
-3 793 575 536 9 0.022892
-1 671 82 0.0232114
-2 671 312 82 0.0232114
-2 671 646 82 0.0232114
-3 671 646 312 82 0.0232114
-2 873 793 9 0.0232219
-3 873 793 536 9 0.0232219
-1 669 9 0.0234713
-2 793 669 9 0.0234713
-2 873 669 9 0.0234713
-3 873 793 669 9 0.0234713
-2 923 671 82 0.0235032
-3 923 671 646 82 0.0235032
-1 992 655 0.0238906
-2 992 677 655 0.0238906
-2 992 891 655 0.0238906
-3 992 891 677 655 0.0238906
-2 669 575 9 0.0239703
-3 793 669 575 9 0.0239703
-2 931 846 312 0.024063
-3 931 846 765 312 0.024063
-1 738 219 0.0243851
-2 738 219 4 0.0243851
-2 738 219 96 0.0243851
-3 738 219 96 4 0.0243851
-1 434 349 0.0249561
-2 434 349 240 0.0249561
-2 434 349 288 0.0249561
-3 434 349 288 240 0.0249561
-1 949 629 0.0250982
-2 949 629 549 0.0250982
-2 976 949 629 0.0250982
-3 976 949 629 549 0.0250982
-2 904 734 666 0.0252587
-3 904 854 734 666 0.0252587
-2 949 944 629 0.0254074
-3 976 949 944 629 0.0254074
-1 151 9 0.0256821
-2 803 151 9 0.0256821
-2 873 151 9 0.0256821
-3 873 803 151 9 0.0256821
-1 989 54 0.0258585
-2 989 673 54 0.0258585
-2 989 939 54 0.0258585
-3 989 939 673 54 0.0258585
-2 669 151 9 0.0258938
-3 873 669 151 9 0.0258938
-1 434 228 0.0261508
-2 434 288 228 0.0261508
-2 434 349 228 0.0261508
-3 434 349 288 228 0.0261508
-1 502 233 0.0263748
-2 502 496 233 0.0263748
-2 502 500 233 0.0263748
-3 502 500 496 233 0.0263748
-1 805 31 0.0264662
-2 805 714 31 0.0264662
-2 954 805 31 0.0264662
-3 954 805 714 31 0.0264662
-1 706 365 0.0265452
-2 706 365 81 0.0265452
-2 774 706 365 0.0265452
-3 774 706 365 81 0.0265452
-1 607 54 0.0268121
-2 610 607 54 0.0268121
-2 673 607 54 0.0268121
-3 673 610 607 54 0.0268121
-1 973 29 0.0269806
-2 973 936 29 0.0269806
-2 973 954 29 0.0269806
-3 973 954 936 29 0.0269806
-2 989 936 54 0.027568
-3 989 939 936 54 0.027568
-1 242 196 0.028037
-2 243 242 196 0.028037
-2 349 242 196 0.028037
-3 349 243 242 196 0.028037
-1 826 285 0.0283414
-2 826 285 54 0.0283414
-2 881 826 285 0.0283414
-3 881 826 285 54 0.0283414
-1 240 228 0.0286762
-2 349 240 228 0.0286762
-2 434 240 228 0.0286762
-3 434 349 240 228 0.0286762
-1 973 54 0.0289141
-2 973 936 54 0.0289141
-2 989 973 54 0.0289141
-3 989 973 936 54 0.0289141
-1 946 629 0.0290687
-2 946 629 549 0.0290687
-2 949 946 629 0.0290687
-3 949 946 629 549 0.0290687
-1 671 466 0.0294505
-2 672 671 466 0.0294505
-2 770 671 466 0.0294505
-3 770 672 671 466 0.0294505
-2 973 54 29 0.0294554
-3 973 936 54 29 0.0294554
-2 486 278 277 0.0298534
-3 486 280 278 277 0.0298534
-2 633 96 8 0.0299768
-3 970 633 96 8 0.0299768
-1 831 109 0.0301793
-2 831 111 109 0.0301793
-2 907 831 109 0.0301793
-3 907 831 111 109 0.0301793
-2 831 112 109 0.0307661
-3 831 112 111 109 0.0307661
-1 242 228 0.0312142
-2 242 240 228 0.0312142
-2 349 242 228 0.0312142
-3 349 242 240 228 0.0312142
-2 991 946 629 0.0314983
-3 991 946 629 549 0.0314983
-1 490 228 0.0316431
-2 490 228 227 0.0316431
-2 490 288 228 0.0316431
-3 490 288 228 227 0.0316431
-1 153 9 0.0317836
-2 153 151 9 0.0317836
-2 803 153 9 0.0317836
-3 803 153 151 9 0.0317836
-1 679 54 0.0318059
-2 679 579 54 0.0318059
-2 679 678 54 0.0318059
-3 679 678 579 54 0.0318059
-1 811 96 0.0332701
-2 811 737 96 0.0332701
-2 811 738 96 0.0332701
-3 811 738 737 96 0.0332701
-2 843 517 258 0.0332872
-3 843 812 517 258 0.0332872
-1 797 539 0.0336465
-2 797 539 395 0.0336465
-2 797 539 538 0.0336465
-3 797 539 538 395 0.0336465
-1 490 308 0.0337802
-2 490 308 227 0.0337802
-2 490 308 228 0.0337802
-3 490 308 228 227 0.0337802
-2 959 676 433 0.0339592
-3 984 959 676 433 0.0339592
-2 490 434 228 0.0345262
-3 490 434 288 228 0.0345262
-1 888 480 0.0345748
-2 888 481 480 0.0345748
-2 914 888 480 0.0345748
-3 914 888 481 480 0.0345748
-1 973 53 0.0346245
-2 973 53 29 0.0346245
-2 973 54 53 0.0346245
-3 973 54 53 29 0.0346245
-1 797 490 0.0346647
-2 797 538 490 0.0346647
-2 835 797 490 0.0346647
-3 835 797 538 490 0.0346647
-1 992 720 0.0348206
-2 992 891 720 0.0348206
-2 992 900 720 0.0348206
-3 992 900 891 720 0.0348206
-1 706 604 0.0354448
-2 706 604 358 0.0354448
-2 706 605 604 0.0354448
-3 706 605 604 358 0.0354448
-1 545 281 0.035493
-2 545 283 281 0.035493
-2 545 544 281 0.035493
-3 545 544 283 281 0.035493
-1 583 312 0.0356288
-2 846 583 312 0.0356288
-2 931 583 312 0.0356288
-3 931 846 583 312 0.0356288
-1 311 265 0.035746
-2 311 265 154 0.035746
-2 311 265 155 0.035746
-3 311 265 155 154 0.035746
-2 242 228 196 0.0358138
-3 349 242 228 196 0.0358138
-1 746 669 0.0358182
-2 746 669 9 0.0358182
-2 746 669 575 0.0358182
-3 746 669 575 9 0.0358182
-2 366 196 116 0.0364639
-3 402 366 196 116 0.0364639
-2 671 603 82 0.0366258
-3 923 671 603 82 0.0366258
-2 690 545 281 0.0367757
-3 690 545 544 281 0.0367757
-1 347 233 0.037304
-2 347 233 206 0.037304
-2 446 347 233 0.037304
-3 446 347 233 206 0.037304
-1 770 6 0.037516
-2 770 466 6 0.037516
-2 935 770 6 0.037516
-3 935 770 466 6 0.037516
-1 434 308 0.0375356
-2 434 308 228 0.0375356
-2 490 434 308 0.0375356
-3 490 434 308 228 0.0375356
-1 805 308 0.0379161
-2 805 308 31 0.0379161
-2 805 714 308 0.0379161
-3 805 714 308 31 0.0379161
-1 116 59 0.0379436
-1 116 60 0.0379436
-2 116 60 59 0.0379436
-2 366 116 59 0.0379436
-2 366 116 60 0.0379436
-3 366 116 60 59 0.0379436
-2 196 116 59 0.0379682
-3 366 196 116 59 0.0379682
-2 243 196 116 0.0386471
-3 385 243 196 116 0.0386471
-1 805 490 0.0388049
-2 805 714 490 0.0388049
-2 805 715 490 0.0388049
-3 805 715 714 490 0.0388049
-2 797 715 490 0.0392699
-3 835 797 715 490 0.0392699
-2 434 242 228 0.0395293
-3 434 242 240 228 0.0395293
-2 746 10 9 0.0398337
-3 746 299 10 9 0.0398337
-2 714 490 308 0.0398589
-3 714 490 308 227 0.0398589
-1 814 575 0.0406733
-2 814 575 409 0.0406733
-2 814 577 575 0.0406733
-3 814 577 575 409 0.0406733
-1 690 11 0.040837
-2 690 220 11 0.040837
-2 690 596 11 0.040837
-3 690 596 220 11 0.040837
-1 311 220 0.041369
-2 311 293 220 0.041369
-2 512 311 220 0.041369
-3 512 311 293 220 0.041369
-1 619 347 0.0415989
-2 619 446 347 0.0415989
-2 619 545 347 0.0415989
-3 619 545 446 347 0.0415989
-1 152 9 0.0416238
-2 152 151 9 0.0416238
-2 153 152 9 0.0416238
-3 153 152 151 9 0.0416238
-1 308 59 0.0418111
-2 308 104 59 0.0418111
-2 308 196 59 0.0418111
-3 308 196 104 59 0.0418111
-1 97 60 0.0419116
-2 116 97 60 0.0419116
-2 366 97 60 0.0419116
-3 366 116 97 60 0.0419116
-2 698 679 54 0.0421754
-3 698 679 579 54 0.0421754
-1 890 332 0.042732
-2 890 332 124 0.042732
-2 890 872 332 0.042732
-3 890 872 332 124 0.042732
-1 818 666 0.0432104
-2 818 666 483 0.0432104
-2 819 818 666 0.0432104
-3 819 818 666 483 0.0432104
-1 706 60 0.0433931
-2 706 81 60 0.0433931
-2 706 365 60 0.0433931
-3 706 365 81 60 0.0433931
-1 900 54 0.0435076
-2 900 679 54 0.0435076
-2 900 698 54 0.0435076
-3 900 698 679 54 0.0435076
-1 699 664 0.0439787
-2 699 664 663 0.0439787
-2 700 699 664 0.0439787
-3 700 699 664 663 0.0439787
-1 233 207 0.0444791
-2 233 207 158 0.0444791
-2 233 207 206 0.0444791
-3 233 207 206 158 0.0444791
-1 689 629 0.0450529
-2 689 630 629 0.0450529
-2 689 688 629 0.0450529
-3 689 688 630 629 0.0450529
-2 989 607 54 0.0450681
-3 989 673 607 54 0.0450681
-1 948 500 0.0452679
-2 948 691 500 0.0452679
-2 948 863 500 0.0452679
-3 948 863 691 500 0.0452679
-1 962 112 0.0460171
-2 962 433 112 0.0460171
-2 962 832 112 0.0460171
-3 962 832 433 112 0.0460171
-2 818 689 666 0.0460493
-3 819 818 689 666 0.0460493
-2 805 490 308 0.0460972
-3 805 714 490 308 0.0460972
-2 992 720 655 0.0464081
-3 992 891 720 655 0.0464081
-1 699 8 0.0465684
-2 699 632 8 0.0465684
-2 803 699 8 0.0465684
-3 803 699 632 8 0.0465684
-1 500 235 0.0466372
-2 500 235 233 0.0466372
-2 500 235 234 0.0466372
-3 500 235 234 233 0.0466372
-2 502 446 233 0.0466436
-3 502 496 446 233 0.0466436
-1 488 394 0.0469723
-2 489 488 394 0.0469723
-2 577 488 394 0.0469723
-3 577 489 488 394 0.0469723
-2 365 97 60 0.0471532
-3 366 365 97 60 0.0471532
-2 946 944 629 0.0471676
-3 949 946 944 629 0.0471676
-1 583 287 0.0473646
-2 583 312 287 0.0473646
-2 846 583 287 0.0473646
-3 846 583 312 287 0.0473646
-1 774 60 0.0473862
-2 774 365 60 0.0473862
-2 774 706 60 0.0473862
-3 774 706 365 60 0.0473862
-1 846 285 0.0476577
-2 846 287 285 0.0476577
-2 892 846 285 0.0476577
-3 892 846 287 285 0.0476577
-1 907 285 0.0481241
-2 907 881 285 0.0481241
-2 907 892 285 0.0481241
-3 907 892 881 285 0.0481241
-1 918 54 0.0483735
-2 918 678 54 0.0483735
-2 918 679 54 0.0483735
-3 918 679 678 54 0.0483735
-1 674 281 0.0484333
-2 674 283 281 0.0484333
-2 674 545 281 0.0484333
-3 674 545 283 281 0.0484333
-2 706 82 60 0.0484512
-3 706 82 81 60 0.0484512
-2 918 900 54 0.0493081
-3 918 900 679 54 0.0493081
-1 746 151 0.0494499
-2 746 151 9 0.0494499
-2 746 669 151 0.0494499
-3 746 669 151 9 0.0494499
-1 803 10 0.0494772
-2 803 10 8 0.0494772
-2 803 10 9 0.0494772
-3 803 10 9 8 0.0494772
-1 981 500 0.0498439
-2 981 691 500 0.0498439
-2 981 801 500 0.0498439
-3 981 801 691 500 0.0498439
-2 813 409 205 0.0511506
-3 813 410 409 205 0.0511506
-2 699 633 8 0.0513803
-3 699 633 632 8 0.0513803
-2 797 539 490 0.0523431
-3 797 539 538 490 0.0523431
-1 421 54 0.0527483
-2 678 421 54 0.0527483
-2 850 421 54 0.0527483
-3 850 678 421 54 0.0527483
-1 715 539 0.0531922
-2 715 539 490 0.0531922
-2 797 715 539 0.0531922
-3 797 715 539 490 0.0531922
-1 707 60 0.0539254
-2 707 706 60 0.0539254
-2 774 707 60 0.0539254
-3 774 707 706 60 0.0539254
-2 981 948 500 0.053988
-3 981 948 691 500 0.053988
-2 918 421 54 0.0540937
-3 918 678 421 54 0.0540937
-1 603 312 0.0541707
-2 603 312 82 0.0541707
-2 671 603 312 0.0541707
-3 671 603 312 82 0.0541707
-1 897 60 0.0549945
-2 897 365 60 0.0549945
-2 897 774 60 0.0549945
-3 897 774 365 60 0.0549945
-1 698 285 0.055248
-2 698 285 54 0.055248
-2 826 698 285 0.055248
-3 826 698 285 54 0.055248
-1 840 31 0.0553754
-2 840 805 31 0.0553754
-2 954 840 31 0.0553754
-3 954 840 805 31 0.0553754
-2 981 801 619 0.0556092
-3 981 802 801 619 0.0556092
-2 347 233 207 0.0557203
-3 347 233 207 206 0.0557203
-2 690 281 11 0.0568526
-3 690 596 281 11 0.0568526
-1 840 29 0.0571146
-2 840 31 29 0.0571146
-2 954 840 29 0.0571146
-3 954 840 31 29 0.0571146
-1 833 228 0.0590756
-2 833 242 228 0.0590756
-2 833 434 228 0.0590756
-3 833 434 242 228 0.0590756
-1 575 151 0.060643
-2 669 575 151 0.060643
-2 746 575 151 0.060643
-3 746 669 575 151 0.060643
-1 694 196 0.0608291
-2 694 196 116 0.0608291
-2 694 243 196 0.0608291
-3 694 243 196 116 0.0608291
-1 153 10 0.0608636
-2 153 10 9 0.0608636
-2 803 153 10 0.0608636
-3 803 153 10 9 0.0608636
-2 897 707 60 0.0626643
-3 897 774 707 60 0.0626643
-1 152 10 0.0642908
-2 152 10 9 0.0642908
-2 153 152 10 0.0642908
-3 153 152 10 9 0.0642908
-1 907 112 0.0651962
-2 907 112 109 0.0651962
-2 907 831 112 0.0651962
-3 907 831 112 109 0.0651962
-2 694 242 196 0.0657024
-3 694 243 242 196 0.0657024
-1 868 622 0.0657679
-2 868 838 622 0.0657679
-2 868 850 622 0.0657679
-3 868 850 838 622 0.0657679
-1 738 8 0.066201
-2 738 96 8 0.066201
-2 738 219 8 0.066201
-3 738 219 96 8 0.066201
-1 468 155 0.0672579
-2 468 265 155 0.0672579
-2 636 468 155 0.0672579
-3 636 468 265 155 0.0672579
-1 833 308 0.0677484
-2 833 308 228 0.0677484
-2 833 434 308 0.0677484
-3 833 434 308 228 0.0677484
-1 910 699 0.0681526
-2 910 700 699 0.0681526
-2 910 811 699 0.0681526
-3 910 811 700 699 0.0681526
-2 897 97 60 0.0688895
-3 897 365 97 60 0.0688895
-1 308 242 0.0689377
-2 308 242 228 0.0689377
-2 833 308 242 0.0689377
-3 833 308 242 228 0.0689377
-1 604 82 0.0702756
-2 604 603 82 0.0702756
-2 605 604 82 0.0702756
-3 605 604 603 82 0.0702756
-1 605 60 0.0704713
-2 605 82 60 0.0704713
-2 706 605 60 0.0704713
-3 706 605 82 60 0.0704713
-1 998 629 0.0709057
-2 998 946 629 0.0709057
-2 998 991 629 0.0709057
-3 998 991 946 629 0.0709057
-1 486 395 0.0718989
-2 489 486 395 0.0718989
-2 797 486 395 0.0718989
-3 797 489 486 395 0.0718989
-2 738 8 4 0.072342
-3 738 219 8 4 0.072342
-1 604 6 0.0723857
-2 770 604 6 0.0723857
-2 935 604 6 0.0723857
-3 935 770 604 6 0.0723857
-1 621 26 0.0727064
-2 622 621 26 0.0727064
-2 623 621 26 0.0727064
-3 623 622 621 26 0.0727064
-1 988 500 0.0731123
-2 988 948 500 0.0731123
-2 988 981 500 0.0731123
-3 988 981 948 500 0.0731123
-2 991 837 624 0.0743066
-3 991 839 837 624 0.0743066
-1 814 394 0.0748766
-2 814 488 394 0.0748766
-2 814 577 394 0.0748766
-3 814 577 488 394 0.0748766
-2 973 840 29 0.0748977
-3 973 954 840 29 0.0748977
-1 575 394 0.075581
-2 577 575 394 0.075581
-2 669 575 394 0.075581
-3 669 577 575 394 0.075581
-2 308 242 196 0.0764432
-3 308 242 228 196 0.0764432
-1 604 60 0.0791109
-2 604 82 60 0.0791109
-2 605 604 60 0.0791109
-3 605 604 82 60 0.0791109
-1 488 395 0.0800482
-2 488 395 394 0.0800482
-2 489 488 395 0.0800482
-3 489 488 395 394 0.0800482
-1 801 233 0.0800782
-2 801 446 233 0.0800782
-2 801 502 233 0.0800782
-3 801 502 446 233 0.0800782
-1 694 59 0.08277
-2 694 116 59 0.08277
-2 694 196 59 0.08277
-3 694 196 116 59 0.08277
-1 619 233 0.0844618
-2 619 347 233 0.0844618
-2 619 446 233 0.0844618
-3 619 446 347 233 0.0844618
-1 311 39 0.0845195
-2 311 154 39 0.0845195
-2 311 293 39 0.0845195
-3 311 293 154 39 0.0845195
-1 503 234 0.0867938
-2 503 500 234 0.0867938
-2 845 503 234 0.0867938
-3 845 503 500 234 0.0867938
-1 151 10 0.0868556
-2 151 10 9 0.0868556
-2 152 151 10 0.0868556
-3 152 151 10 9 0.0868556
-1 603 60 0.0871863
-2 603 82 60 0.0871863
-2 604 603 60 0.0871863
-3 604 603 82 60 0.0871863
-2 488 486 395 0.0873082
-3 489 488 486 395 0.0873082
-2 311 265 39 0.0896238
-3 311 265 154 39 0.0896238
-1 583 286 0.089794
-2 583 287 286 0.089794
-2 583 312 286 0.089794
-3 583 312 287 286 0.089794
-1 242 59 0.0899374
-2 242 196 59 0.0899374
-2 694 242 59 0.0899374
-3 694 242 196 59 0.0899374
-1 500 333 0.0907532
-2 863 500 333 0.0907532
-2 872 500 333 0.0907532
-3 872 863 500 333 0.0907532
-2 706 604 60 0.0914612
-3 706 605 604 60 0.0914612
-2 603 312 60 0.0914738
-3 603 312 82 60 0.0914738
-1 357 4 0.0943162
-2 929 357 4 0.0943162
-2 935 357 4 0.0943162
-3 935 929 357 4 0.0943162
-1 746 337 0.0944149
-2 746 342 337 0.0944149
-2 746 562 337 0.0944149
-3 746 562 342 337 0.0944149
-2 801 619 233 0.0968696
-3 801 619 446 233 0.0968696
-2 951 671 466 0.100339
-3 951 672 671 466 0.100339
-2 699 96 8 0.100426
-3 699 633 96 8 0.100426
-2 308 242 59 0.101853
-3 308 242 196 59 0.101853
-1 715 486 0.10235
-2 804 715 486 0.10235
-2 834 715 486 0.10235
-3 834 804 715 486 0.10235
-1 828 285 0.103351
-2 846 828 285 0.103351
-2 892 828 285 0.103351
-3 892 846 828 285 0.103351
-1 947 629 0.103391
-2 947 725 629 0.103391
-2 947 944 629 0.103391
-3 947 944 725 629 0.103391
-2 575 394 151 0.103951
-3 669 575 394 151 0.103951
-1 293 265 0.10732
-2 293 265 39 0.10732
-2 311 293 265 0.10732
-3 311 293 265 39 0.10732
-2 947 724 629 0.109907
-3 947 725 724 629 0.109907
-1 707 604 0.110433
-2 707 604 358 0.110433
-2 707 706 604 0.110433
-3 707 706 604 358 0.110433
-1 293 20 0.114958
-2 293 39 20 0.114958
-2 293 265 20 0.114958
-3 293 265 39 20 0.114958
-1 604 466 0.115453
-2 604 466 6 0.115453
-2 770 604 466 0.115453
-3 770 604 466 6 0.115453
-1 963 433 0.117314
-2 963 882 433 0.117314
-2 963 959 433 0.117314
-3 963 959 882 433 0.117314
-1 414 356 0.120542
-2 707 414 356 0.120542
-2 910 414 356 0.120542
-3 910 707 414 356 0.120542
-1 220 39 0.120883
-2 220 39 5 0.120883
-2 293 220 39 0.120883
-3 293 220 39 5 0.120883
-2 814 575 394 0.12161
-3 814 577 575 394 0.12161
-1 898 832 0.122352
-2 898 832 830 0.122352
-2 898 832 831 0.122352
-3 898 832 831 830 0.122352
-1 220 20 0.122678
-2 220 20 5 0.122678
-2 220 39 20 0.122678
-3 220 39 20 5 0.122678
-2 293 220 20 0.122745
-3 293 220 39 20 0.122745
-1 583 285 0.12404
-2 583 287 285 0.12404
-2 846 583 285 0.12404
-3 846 583 287 285 0.12404
-1 882 285 0.125608
-2 882 826 285 0.125608
-2 882 881 285 0.125608
-3 882 881 826 285 0.125608
-2 811 699 96 0.126346
-3 811 737 699 96 0.126346
-2 828 583 285 0.128547
-3 846 828 583 285 0.128547
-2 746 151 10 0.129024
-3 746 151 10 9 0.129024
-1 621 422 0.130246
-2 621 422 419 0.130246
-2 623 621 422 0.130246
-3 623 621 422 419 0.130246
-1 998 624 0.131614
-2 998 629 624 0.131614
-2 998 991 624 0.131614
-3 998 991 629 624 0.131614
-1 674 11 0.132819
-2 674 283 11 0.132819
-2 746 674 11 0.132819
-3 746 674 283 11 0.132819
-1 311 20 0.133867
-2 311 265 20 0.133867
-2 311 293 20 0.133867
-3 311 293 265 20 0.133867
-2 868 837 622 0.13449
-3 868 838 837 622 0.13449
-1 205 151 0.13631
-2 575 205 151 0.13631
-2 746 205 151 0.13631
-3 746 575 205 151 0.13631
-1 409 394 0.137161
-2 575 409 394 0.137161
-2 814 409 394 0.137161
-3 814 575 409 394 0.137161
-1 419 54 0.137485
-2 421 419 54 0.137485
-2 850 419 54 0.137485
-3 850 421 419 54 0.137485
-1 981 51 0.138708
-2 981 619 51 0.138708
-2 981 788 51 0.138708
-3 981 788 619 51 0.138708
-1 992 960 0.139041
-2 992 960 677 0.139041
-2 992 985 960 0.139041
-3 992 985 960 677 0.139041
-2 674 281 11 0.140328
-3 674 283 281 11 0.140328
-1 690 619 0.141078
-2 690 619 347 0.141078
-2 690 619 545 0.141078
-3 690 619 545 347 0.141078
-1 963 676 0.14135
-2 963 959 676 0.14135
-2 963 960 676 0.14135
-3 963 960 959 676 0.14135
-1 888 486 0.145047
-2 888 486 278 0.145047
-2 888 804 486 0.145047
-3 888 804 486 278 0.145047
-1 833 59 0.146141
-2 833 242 59 0.146141
-2 833 694 59 0.146141
-3 833 694 242 59 0.146141
-2 311 220 20 0.147263
-3 311 293 220 20 0.147263
-2 907 828 285 0.149142
-3 907 892 828 285 0.149142
-2 907 882 285 0.152319
-3 907 882 881 285 0.152319
-1 890 331 0.154398
-2 890 332 331 0.154398
-2 890 872 331 0.154398
-3 890 872 332 331 0.154398
-1 486 394 0.15781
-2 486 395 394 0.15781
-2 488 486 394 0.15781
-3 488 486 395 394 0.15781
-1 265 220 0.162351
-2 265 220 20 0.162351
-2 311 265 220 0.162351
-3 311 265 220 20 0.162351
-1 689 483 0.162706
-2 689 666 483 0.162706
-2 818 689 483 0.162706
-3 818 689 666 483 0.162706
-1 60 21 0.165613
-2 97 60 21 0.165613
-2 897 60 21 0.165613
-3 897 97 60 21 0.165613
-1 409 151 0.172528
-2 409 394 151 0.172528
-2 575 409 151 0.172528
-3 575 409 394 151 0.172528
-1 746 190 0.173871
-2 746 337 190 0.173871
-2 746 562 190 0.173871
-3 746 562 337 190 0.173871
-2 963 676 433 0.182722
-3 963 959 676 433 0.182722
-1 951 312 0.185887
-2 951 671 312 0.185887
-2 951 931 312 0.185887
-3 951 931 671 312 0.185887
-1 539 486 0.186195
-2 539 486 395 0.186195
-2 797 539 486 0.186195
-3 797 539 486 395 0.186195
-1 989 53 0.18808
-2 989 54 53 0.18808
-2 989 973 53 0.18808
-3 989 973 54 53 0.18808
-1 671 60 0.199341
-2 671 312 60 0.199341
-2 671 603 60 0.199341
-3 671 603 312 60 0.199341
-1 664 356 0.203944
-2 664 414 356 0.203944
-2 910 664 356 0.203944
-3 910 664 414 356 0.203944
-2 707 604 60 0.21183
-3 707 706 604 60 0.21183
-2 583 286 285 0.212875
-3 583 287 286 285 0.212875
-2 797 715 486 0.213402
-3 834 797 715 486 0.213402
-1 998 990 0.215661
-2 998 990 972 0.215661
-2 998 991 990 0.215661
-3 998 991 990 972 0.215661
-2 671 604 466 0.222309
-3 770 671 604 466 0.222309
-2 918 419 54 0.224334
-3 918 421 419 54 0.224334
-1 153 8 0.22925
-2 153 10 8 0.22925
-2 803 153 8 0.22925
-3 803 153 10 8 0.22925
-1 841 29 0.230809
-2 841 840 29 0.230809
-2 973 841 29 0.230809
-3 973 841 840 29 0.230809
-1 358 4 0.235271
-2 358 357 4 0.235271
-2 935 358 4 0.235271
-3 935 358 357 4 0.235271
-1 604 4 0.240671
-2 604 6 4 0.240671
-2 935 604 4 0.240671
-3 935 604 6 4 0.240671
-1 904 689 0.240752
-2 904 689 666 0.240752
-2 904 734 689 0.240752
-3 904 734 689 666 0.240752
-2 604 358 4 0.244172
-3 935 604 358 4 0.244172
-1 807 498 0.266588
-2 807 668 498 0.266588
-2 813 807 498 0.266588
-3 813 807 668 498 0.266588
-1 882 676 0.26671
-2 882 676 433 0.26671
-2 963 882 676 0.26671
-3 963 882 676 433 0.26671
-1 358 6 0.267707
-2 358 6 4 0.267707
-2 604 358 6 0.267707
-3 604 358 6 4 0.267707
-1 152 8 0.272045
-2 152 10 8 0.272045
-2 153 152 8 0.272045
-3 153 152 10 8 0.272045
-1 707 664 0.277509
-2 707 664 356 0.277509
-2 707 664 414 0.277509
-3 707 664 414 356 0.277509
-2 690 311 220 0.278225
-3 690 512 311 220 0.278225
-1 778 620 0.28186
-2 778 694 620 0.28186
-2 778 695 620 0.28186
-3 778 695 694 620 0.28186
-2 707 664 651 0.282265
-3 707 664 651 414 0.282265
-2 715 539 486 0.282562
-3 797 715 539 486 0.282562
-1 962 109 0.282739
-2 962 112 109 0.282739
-2 962 433 109 0.282739
-3 962 433 112 109 0.282739
-2 801 500 233 0.291347
-3 801 502 500 233 0.291347
-1 466 312 0.296733
-2 583 466 312 0.296733
-2 931 466 312 0.296733
-3 931 583 466 312 0.296733
-1 734 192 0.300494
-2 734 382 192 0.300494
-2 799 734 192 0.300494
-3 799 734 382 192 0.300494
-1 468 311 0.308604
-2 468 311 155 0.308604
-2 636 468 311 0.308604
-3 636 468 311 155 0.308604
-1 843 127 0.32037
-2 843 264 127 0.32037
-2 878 843 127 0.32037
-3 878 843 264 127 0.32037
-2 951 466 312 0.32972
-3 951 931 466 312 0.32972
-1 907 676 0.330789
-2 907 676 433 0.330789
-2 907 882 676 0.330789
-3 907 882 676 433 0.330789
-1 837 54 0.333414
-2 837 610 54 0.333414
-2 869 837 54 0.333414
-3 869 837 610 54 0.333414
-2 833 308 59 0.333776
-3 833 308 242 59 0.333776
-1 988 51 0.346397
-2 988 788 51 0.346397
-2 988 981 51 0.346397
-3 988 981 788 51 0.346397
-2 409 205 151 0.353777
-3 575 409 205 151 0.353777
-2 992 900 655 0.371001
-3 992 900 720 655 0.371001
-1 358 60 0.377496
-2 604 358 60 0.377496
-2 707 358 60 0.377496
-3 707 604 358 60 0.377496
-1 690 674 0.383536
-2 690 674 281 0.383536
-2 690 674 545 0.383536
-3 690 674 545 281 0.383536
-2 882 698 285 0.389041
-3 882 826 698 285 0.389041
-1 205 190 0.400229
-2 562 205 190 0.400229
-2 616 205 190 0.400229
-3 616 562 205 190 0.400229
-1 842 480 0.415049
-2 842 724 480 0.415049
-2 899 842 480 0.415049
-3 899 842 724 480 0.415049
-2 671 466 312 0.418719
-3 951 671 466 312 0.418719
-1 651 356 0.424504
-2 664 651 356 0.424504
-2 707 651 356 0.424504
-3 707 664 651 356 0.424504
-1 422 54 0.426367
-2 422 419 54 0.426367
-2 918 422 54 0.426367
-3 918 422 419 54 0.426367
-1 348 233 0.430375
-2 348 233 158 0.430375
-2 348 233 207 0.430375
-3 348 233 207 158 0.430375
-1 831 285 0.432462
-2 831 828 285 0.432462
-2 907 831 285 0.432462
-3 907 831 828 285 0.432462
-2 468 311 265 0.433011
-3 468 311 265 155 0.433011
-1 724 630 0.449113
-2 724 630 629 0.449113
-2 870 724 630 0.449113
-3 870 724 630 629 0.449113
-2 868 837 54 0.452747
-3 869 868 837 54 0.452747
-1 619 500 0.453379
-2 619 500 233 0.453379
-2 801 619 500 0.453379
-3 801 619 500 233 0.453379
-1 607 53 0.476739
-2 607 54 53 0.476739
-2 989 607 53 0.476739
-3 989 607 54 53 0.476739
-2 671 604 60 0.482487
-3 671 604 603 60 0.482487
-1 522 8 0.487821
-2 522 8 4 0.487821
-2 738 522 8 0.487821
-3 738 522 8 4 0.487821
-1 621 54 0.496057
-2 621 419 54 0.496057
-2 850 621 54 0.496057
-3 850 621 419 54 0.496057
-1 972 54 0.527759
-2 972 607 54 0.527759
-2 972 610 54 0.527759
-3 972 610 607 54 0.527759
-1 746 192 0.538831
-2 746 192 190 0.538831
-2 746 337 192 0.538831
-3 746 337 192 190 0.538831
-1 890 127 0.541515
-2 890 127 126 0.541515
-2 890 878 127 0.541515
-3 890 878 127 126 0.541515
-1 981 50 0.578893
-2 981 51 50 0.578893
-2 981 619 50 0.578893
-3 981 619 51 50 0.578893
-1 621 36 0.583551
-2 621 36 26 0.583551
-2 623 621 36 0.583551
-3 623 621 36 26 0.583551
-1 803 152 0.597824
-2 803 152 8 0.597824
-2 803 153 152 0.597824
-3 803 153 152 8 0.597824
-2 690 674 11 0.61601
-3 690 674 281 11 0.61601
-2 992 960 698 0.619911
-3 992 985 960 698 0.619911
-2 746 205 190 0.626196
-3 746 562 205 190 0.626196
-2 803 152 150 0.681108
-3 803 153 152 150 0.681108
-1 466 286 0.689684
-2 466 312 286 0.689684
-2 583 466 286 0.689684
-3 583 466 312 286 0.689684
-1 619 207 0.71203
-2 619 233 207 0.71203
-2 619 347 207 0.71203
-3 619 347 233 207 0.71203
-1 676 109 0.73829
-2 676 433 109 0.73829
-2 907 676 109 0.73829
-3 907 676 433 109 0.73829
-1 220 179 0.787655
-2 220 179 5 0.787655
-2 220 179 20 0.787655
-3 220 179 20 5 0.787655
-2 973 607 53 0.792231
-3 989 973 607 53 0.792231
-1 674 337 0.822413
-2 674 342 337 0.822413
-2 746 674 337 0.822413
-3 746 674 342 337 0.822413
-2 674 619 337 0.858851
-3 674 619 342 337 0.858851
-1 696 655 0.861869
-2 900 696 655 0.861869
-2 992 696 655 0.861869
-3 992 900 696 655 0.861869
-1 622 54 0.872435
-2 850 622 54 0.872435
-2 868 622 54 0.872435
-3 868 850 622 54 0.872435
-2 265 220 179 0.925375
-3 265 220 179 20 0.925375
-1 990 54 0.952373
-2 990 610 54 0.952373
-2 990 972 54 0.952373
-3 990 972 610 54 0.952373
-2 689 483 480 0.986733
-3 818 689 483 480 0.986733
-2 690 674 619 1.00825
-3 690 674 619 545 1.00825
-1 811 8 1.04601
-2 811 96 8 1.04601
-2 811 738 8 1.04601
-3 811 738 96 8 1.04601
-2 990 837 54 1.06876
-3 990 837 610 54 1.06876
-2 837 622 54 1.0877
-3 868 837 622 54 1.0877
-1 150 8 1.13234
-2 152 150 8 1.13234
-2 803 150 8 1.13234
-3 803 152 150 8 1.13234
-2 890 332 126 1.14592
-3 890 332 126 124 1.14592
-2 962 676 109 1.23295
-3 962 676 433 109 1.23295
-2 622 621 54 1.33471
-3 850 622 621 54 1.33471
-2 522 357 4 1.36566
-3 929 522 357 4 1.36566
-2 811 699 8 1.366
-3 811 699 96 8 1.366
-1 813 394 1.37117
-2 813 409 394 1.37117
-2 814 813 394 1.37117
-3 814 813 409 394 1.37117
-1 734 191 1.4238
-2 734 382 191 1.4238
-2 904 734 191 1.4238
-3 904 734 382 191 1.4238
-1 837 26 1.47381
-2 837 622 26 1.47381
-2 837 624 26 1.47381
-3 837 624 622 26 1.47381
-1 813 151 1.5427
-2 813 205 151 1.5427
-2 813 409 151 1.5427
-3 813 409 205 151 1.5427
-1 972 53 1.78506
-2 972 54 53 1.78506
-2 972 607 53 1.78506
-3 972 607 54 53 1.78506
-2 813 394 151 1.82116
-3 813 409 394 151 1.82116
-2 724 630 480 1.83868
-3 870 724 630 480 1.83868
-1 963 285 1.86299
-2 963 698 285 1.86299
-2 963 882 285 1.86299
-3 963 882 698 285 1.86299
-1 583 540 1.96063
-2 583 540 285 1.96063
-2 583 540 286 1.96063
-3 583 540 286 285 1.96063
-1 690 337 2.16207
-2 690 619 337 2.16207
-2 690 674 337 2.16207
-3 690 674 619 337 2.16207
-1 940 285 2.16875
-2 940 828 285 2.16875
-2 940 831 285 2.16875
-3 940 831 828 285 2.16875
-1 690 468 2.25245
-2 690 468 311 2.25245
-2 690 636 468 2.25245
-3 690 636 468 311 2.25245
-1 690 348 2.65635
-2 690 348 347 2.65635
-2 690 636 348 2.65635
-3 690 636 348 347 2.65635
-2 973 972 53 2.71032
-3 973 972 607 53 2.71032
-1 746 152 2.75203
-2 746 152 10 2.75203
-2 746 152 151 2.75203
-3 746 152 151 10 2.75203
-2 690 468 348 2.8314
-3 690 636 468 348 2.8314
-1 698 655 2.86807
-2 698 696 655 2.86807
-2 900 698 655 2.86807
-3 900 698 696 655 2.86807
-2 992 698 655 2.9671
-3 992 698 696 655 2.9671
-2 734 192 191 2.99884
-3 734 382 192 191 2.99884
-1 690 207 4.34174
-2 690 347 207 4.34174
-2 690 348 207 4.34174
-3 690 348 347 207 4.34174
-1 690 50 4.4316
-2 690 337 50 4.4316
-2 690 619 50 4.4316
-3 690 619 337 50 4.4316
-2 690 619 207 4.4421
-3 690 619 347 207 4.4421
-1 619 348 4.9058
-2 619 348 207 4.9058
-2 690 619 348 4.9058
-3 690 619 348 207 4.9058
-2 116 60 21 5.10514
-3 116 97 60 21 5.10514
-1 856 234 5.15302
-2 856 503 234 5.15302
-2 856 845 234 5.15302
-3 856 845 503 234 5.15302
-1 988 50 5.39058
-2 988 51 50 5.39058
-2 988 981 50 5.39058
-3 988 981 51 50 5.39058
-2 981 619 500 5.67279
-3 981 801 619 500 5.67279
-1 629 480 5.70938
-2 630 629 480 5.70938
-2 724 629 480 5.70938
-3 724 630 629 480 5.70938
-2 948 500 333 5.7399
-3 948 863 500 333 5.7399
-1 707 21 6.01762
-2 707 650 21 6.01762
-2 897 707 21 6.01762
-3 897 707 650 21 6.01762
-1 900 285 6.83082
-2 900 285 54 6.83082
-2 900 698 285 6.83082
-3 900 698 285 54 6.83082
-2 811 522 8 9.04656
-3 811 738 522 8 9.04656
-1 655 54 9.15594
-2 900 655 54 9.15594
-2 918 655 54 9.15594
-3 918 900 655 54 9.15594
-2 619 348 233 10.1415
-3 619 348 233 207 10.1415
-1 890 234 10.7694
-2 890 503 234 10.7694
-2 890 856 234 10.7694
-3 890 856 503 234 10.7694
-1 606 308 14.7139
-2 606 434 308 14.7139
-2 833 606 308 14.7139
-3 833 606 434 308 14.7139
-2 621 422 36 14.9692
-3 623 621 422 36 14.9692
-1 676 285 17.6937
-2 882 676 285 17.6937
-2 907 676 285 17.6937
-3 907 882 676 285 17.6937
-2 963 676 285 20.5432
-3 963 882 676 285 20.5432
-1 311 179 21.4648
-2 311 220 179 21.4648
-2 311 265 179 21.4648
-3 311 265 220 179 21.4648
-1 466 60 22.1436
-2 466 312 60 22.1436
-2 671 466 60 22.1436
-3 671 466 312 60 22.1436
-1 499 394 29.4244
-2 499 488 394 29.4244
-2 814 499 394 29.4244
-3 814 499 488 394 29.4244
-1 674 50 30.6412
-2 674 337 50 30.6412
-2 690 674 50 30.6412
-3 690 674 337 50 30.6412
-1 804 539 37.6075
-2 804 539 486 37.6075
-2 804 715 539 37.6075
-3 804 715 539 486 37.6075
-1 356 4 71.0347
-2 357 356 4 71.0347
-2 358 356 4 71.0347
-3 358 357 356 4 71.0347
-1 500 348 103.379
-2 500 348 233 103.379
-2 619 500 348 103.379
-3 619 500 348 233 103.379
-2 466 286 60 282.49
-3 466 312 286 60 282.49
-1 998 53 355.521
-2 998 972 53 355.521
-2 998 973 53 355.521
-3 998 973 972 53 355.521
-1 960 285 2457.88
-2 960 676 285 2457.88
-2 963 960 285 2457.88
-3 963 960 676 285 2457.88
-1 890 333 20106
-2 890 333 331 20106
-2 890 872 333 20106
-3 890 872 333 331 20106
-2 778 651 21 41458.6
-3 778 651 212 21 41458.6
-1 910 4 1.28741e+06
-2 910 357 4 1.28741e+06
-2 910 522 4 1.28741e+06
-3 910 522 357 4 1.28741e+06
-
diff --git a/data/points/bunny_5000 b/data/points/bunny_5000.off
index 9e61d42b..12ec0c68 100644
--- a/data/points/bunny_5000
+++ b/data/points/bunny_5000.off
@@ -1,4 +1,5 @@
-5000
+OFF
+5000 0 0
-0.0164722 0.0382453 0.0209318
-0.0641407 0.171114 -0.0471776
0.023086 0.119339 0.0317977
diff --git a/data/points/generator/CMakeLists.txt b/data/points/generator/CMakeLists.txt
index f559610c..88d377a7 100644
--- a/data/points/generator/CMakeLists.txt
+++ b/data/points/generator/CMakeLists.txt
@@ -1,18 +1,15 @@
cmake_minimum_required(VERSION 2.6)
-project(Data_points_generator)
+project(data_points_generator)
-if(CGAL_FOUND)
- if (NOT CGAL_VERSION VERSION_LESS 4.6.0)
- if (EIGEN3_FOUND)
- add_executable ( hypergenerator hypergenerator.cpp )
- target_link_libraries(hypergenerator ${Boost_SYSTEM_LIBRARY})
- add_test(hypergenerator_on_sphere_3000_10_5.0 ${CMAKE_CURRENT_BINARY_DIR}/hypergenerator on sphere onSphere.off 3000 10 5.0)
- add_test(hypergenerator_on_sphere_10000_3 ${CMAKE_CURRENT_BINARY_DIR}/hypergenerator on sphere onSphere.off 10000 3)
- add_test(hypergenerator_in_sphere_7000_12_10.8 ${CMAKE_CURRENT_BINARY_DIR}/hypergenerator in sphere inSphere.off 7000 12 10.8)
- add_test(hypergenerator_in_sphere_50000_2 ${CMAKE_CURRENT_BINARY_DIR}/hypergenerator in sphere inSphere.off 50000 2)
- # on cube is not available in CGAL
- add_test(hypergenerator_in_cube_7000_12_10.8 ${CMAKE_CURRENT_BINARY_DIR}/hypergenerator in cube inCube.off 7000 12 10.8)
- add_test(hypergenerator_in_cube_50000_2 ${CMAKE_CURRENT_BINARY_DIR}/hypergenerator in cube inCube.off 50000 3)
- endif(EIGEN3_FOUND)
- endif(NOT CGAL_VERSION VERSION_LESS 4.6.0)
-endif(CGAL_FOUND)
+if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.6.0)
+ add_executable ( data_points_generator hypergenerator.cpp )
+ target_link_libraries(data_points_generator ${Boost_SYSTEM_LIBRARY})
+ add_test(NAME data_points_generator_on_sphere_1000_3_15.2 COMMAND $<TARGET_FILE:data_points_generator>
+ "on" "sphere" "onSphere.off" "1000" "3" "15.2")
+ add_test(NAME data_points_generator_in_sphere_100_2 COMMAND $<TARGET_FILE:data_points_generator>
+ "in" "sphere" "inSphere.off" "100" "2")
+
+ # on cube is not available in CGAL
+ add_test(NAME data_points_generator_in_cube_10000_3_5.8 COMMAND $<TARGET_FILE:data_points_generator>
+ "in" "cube" "inCube.off" "10000" "3" "5.8")
+endif(NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.6.0)
diff --git a/data/points/generator/README b/data/points/generator/README
index 41cb9165..951bcfe1 100644
--- a/data/points/generator/README
+++ b/data/points/generator/README
@@ -7,21 +7,21 @@ cmake .
cd /path-to-data-generator/
make
-=========================== hypergenerator =====================================
+======================= data_points_generator ==================================
Example of use :
*** Hyper sphere|cube generator
-./hypergenerator on sphere onSphere.off 1000 3 15.2
+./data_points_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
-./hypergenerator in sphere inSphere.off 100 2
+./data_points_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)
-./hypergenerator in cube inCube.off 10000 3 5.8
+./data_points_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
diff --git a/data/points/generator/hypergenerator.cpp b/data/points/generator/hypergenerator.cpp
index 60890b44..5831de18 100644
--- a/data/points/generator/hypergenerator.cpp
+++ b/data/points/generator/hypergenerator.cpp
@@ -29,7 +29,7 @@
#include <iterator>
#include <vector>
#include <fstream> // for std::ofstream
-
+#include <cstdlib>
typedef CGAL::Epick_d< CGAL::Dynamic_dimension_tag > K;
typedef K::Point_d Point;
@@ -47,24 +47,22 @@ int main(int argc, char **argv) {
usage(argv[0]);
}
- int points_number = 0;
- int returnedScanValue = sscanf(argv[4], "%d", &points_number);
- if ((returnedScanValue == EOF) || (points_number <= 0)) {
+ int points_number = atoi(argv[4]);
+ if (points_number <= 0) {
std::cerr << "Error: " << argv[4] << " is not correct" << std::endl;
usage(argv[0]);
}
- int dimension = 0;
- returnedScanValue = sscanf(argv[5], "%d", &dimension);
- if ((returnedScanValue == EOF) || (dimension <= 0)) {
+ int dimension = atoi(argv[5]);
+ if (dimension <= 0) {
std::cerr << "Error: " << argv[5] << " is not correct" << std::endl;
usage(argv[0]);
}
double radius = 1.0;
if (argc == 7) {
- returnedScanValue = sscanf(argv[6], "%lf", &radius);
- if ((returnedScanValue == EOF) || (radius <= 0.0)) {
+ radius = atof(argv[6]);
+ if (radius <= 0.0) {
std::cerr << "Error: " << argv[6] << " is not correct" << std::endl;
usage(argv[0]);
}
diff --git a/data/points/sphere3D_pts_on_grid.off b/data/points/sphere3D_pts_on_grid.off
new file mode 100644
index 00000000..7f562559
--- /dev/null
+++ b/data/points/sphere3D_pts_on_grid.off
@@ -0,0 +1,17286 @@
+OFF
+17284 0 0
+0.44 0.38 0.02
+0.46 0.38 0.02
+0.48 0.38 0.02
+0.5 0.38 0.02
+0.52 0.38 0.02
+0.54 0.38 0.02
+0.56 0.38 0.02
+0.42 0.4 0.02
+0.44 0.4 0.02
+0.46 0.4 0.02
+0.48 0.4 0.02
+0.5 0.4 0.02
+0.52 0.4 0.02
+0.54 0.4 0.02
+0.56 0.4 0.02
+0.58 0.4 0.02
+0.4 0.42 0.02
+0.42 0.42 0.02
+0.44 0.42 0.02
+0.46 0.42 0.02
+0.48 0.42 0.02
+0.5 0.42 0.02
+0.52 0.42 0.02
+0.54 0.42 0.02
+0.56 0.42 0.02
+0.58 0.42 0.02
+0.6 0.42 0.02
+0.38 0.44 0.02
+0.4 0.44 0.02
+0.42 0.44 0.02
+0.44 0.44 0.02
+0.46 0.44 0.02
+0.48 0.44 0.02
+0.5 0.44 0.02
+0.52 0.44 0.02
+0.54 0.44 0.02
+0.56 0.44 0.02
+0.58 0.44 0.02
+0.6 0.44 0.02
+0.62 0.44 0.02
+0.38 0.46 0.02
+0.4 0.46 0.02
+0.42 0.46 0.02
+0.44 0.46 0.02
+0.46 0.46 0.02
+0.48 0.46 0.02
+0.5 0.46 0.02
+0.52 0.46 0.02
+0.54 0.46 0.02
+0.56 0.46 0.02
+0.58 0.46 0.02
+0.6 0.46 0.02
+0.62 0.46 0.02
+0.38 0.48 0.02
+0.4 0.48 0.02
+0.42 0.48 0.02
+0.44 0.48 0.02
+0.46 0.48 0.02
+0.48 0.48 0.02
+0.5 0.48 0.02
+0.52 0.48 0.02
+0.54 0.48 0.02
+0.56 0.48 0.02
+0.58 0.48 0.02
+0.6 0.48 0.02
+0.62 0.48 0.02
+0.38 0.5 0.02
+0.4 0.5 0.02
+0.42 0.5 0.02
+0.44 0.5 0.02
+0.46 0.5 0.02
+0.48 0.5 0.02
+0.5 0.5 0.02
+0.52 0.5 0.02
+0.54 0.5 0.02
+0.56 0.5 0.02
+0.58 0.5 0.02
+0.6 0.5 0.02
+0.62 0.5 0.02
+0.38 0.52 0.02
+0.4 0.52 0.02
+0.42 0.52 0.02
+0.44 0.52 0.02
+0.46 0.52 0.02
+0.48 0.52 0.02
+0.5 0.52 0.02
+0.52 0.52 0.02
+0.54 0.52 0.02
+0.56 0.52 0.02
+0.58 0.52 0.02
+0.6 0.52 0.02
+0.62 0.52 0.02
+0.38 0.54 0.02
+0.4 0.54 0.02
+0.42 0.54 0.02
+0.44 0.54 0.02
+0.46 0.54 0.02
+0.48 0.54 0.02
+0.5 0.54 0.02
+0.52 0.54 0.02
+0.54 0.54 0.02
+0.56 0.54 0.02
+0.58 0.54 0.02
+0.6 0.54 0.02
+0.62 0.54 0.02
+0.38 0.56 0.02
+0.4 0.56 0.02
+0.42 0.56 0.02
+0.44 0.56 0.02
+0.46 0.56 0.02
+0.48 0.56 0.02
+0.5 0.56 0.02
+0.52 0.56 0.02
+0.54 0.56 0.02
+0.56 0.56 0.02
+0.58 0.56 0.02
+0.6 0.56 0.02
+0.62 0.56 0.02
+0.4 0.58 0.02
+0.42 0.58 0.02
+0.44 0.58 0.02
+0.46 0.58 0.02
+0.48 0.58 0.02
+0.5 0.58 0.02
+0.52 0.58 0.02
+0.54 0.58 0.02
+0.56 0.58 0.02
+0.58 0.58 0.02
+0.6 0.58 0.02
+0.42 0.6 0.02
+0.44 0.6 0.02
+0.46 0.6 0.02
+0.48 0.6 0.02
+0.5 0.6 0.02
+0.52 0.6 0.02
+0.54 0.6 0.02
+0.56 0.6 0.02
+0.58 0.6 0.02
+0.44 0.62 0.02
+0.46 0.62 0.02
+0.48 0.62 0.02
+0.5 0.62 0.02
+0.52 0.62 0.02
+0.54 0.62 0.02
+0.56 0.62 0.02
+0.44 0.32 0.04
+0.46 0.32 0.04
+0.48 0.32 0.04
+0.5 0.32 0.04
+0.52 0.32 0.04
+0.54 0.32 0.04
+0.56 0.32 0.04
+0.4 0.34 0.04
+0.42 0.34 0.04
+0.44 0.34 0.04
+0.46 0.34 0.04
+0.48 0.34 0.04
+0.5 0.34 0.04
+0.52 0.34 0.04
+0.54 0.34 0.04
+0.56 0.34 0.04
+0.58 0.34 0.04
+0.6 0.34 0.04
+0.38 0.36 0.04
+0.4 0.36 0.04
+0.42 0.36 0.04
+0.44 0.36 0.04
+0.46 0.36 0.04
+0.48 0.36 0.04
+0.5 0.36 0.04
+0.52 0.36 0.04
+0.54 0.36 0.04
+0.56 0.36 0.04
+0.58 0.36 0.04
+0.6 0.36 0.04
+0.62 0.36 0.04
+0.36 0.38 0.04
+0.38 0.38 0.04
+0.4 0.38 0.04
+0.42 0.38 0.04
+0.44 0.38 0.04
+0.46 0.38 0.04
+0.48 0.38 0.04
+0.5 0.38 0.04
+0.52 0.38 0.04
+0.54 0.38 0.04
+0.56 0.38 0.04
+0.58 0.38 0.04
+0.6 0.38 0.04
+0.62 0.38 0.04
+0.64 0.38 0.04
+0.34 0.4 0.04
+0.36 0.4 0.04
+0.38 0.4 0.04
+0.4 0.4 0.04
+0.42 0.4 0.04
+0.44 0.4 0.04
+0.46 0.4 0.04
+0.48 0.4 0.04
+0.5 0.4 0.04
+0.52 0.4 0.04
+0.54 0.4 0.04
+0.56 0.4 0.04
+0.58 0.4 0.04
+0.6 0.4 0.04
+0.62 0.4 0.04
+0.64 0.4 0.04
+0.66 0.4 0.04
+0.34 0.42 0.04
+0.36 0.42 0.04
+0.38 0.42 0.04
+0.4 0.42 0.04
+0.42 0.42 0.04
+0.44 0.42 0.04
+0.46 0.42 0.04
+0.48 0.42 0.04
+0.5 0.42 0.04
+0.52 0.42 0.04
+0.54 0.42 0.04
+0.56 0.42 0.04
+0.58 0.42 0.04
+0.6 0.42 0.04
+0.62 0.42 0.04
+0.64 0.42 0.04
+0.66 0.42 0.04
+0.32 0.44 0.04
+0.34 0.44 0.04
+0.36 0.44 0.04
+0.38 0.44 0.04
+0.4 0.44 0.04
+0.42 0.44 0.04
+0.44 0.44 0.04
+0.46 0.44 0.04
+0.48 0.44 0.04
+0.5 0.44 0.04
+0.52 0.44 0.04
+0.54 0.44 0.04
+0.56 0.44 0.04
+0.58 0.44 0.04
+0.6 0.44 0.04
+0.62 0.44 0.04
+0.64 0.44 0.04
+0.66 0.44 0.04
+0.68 0.44 0.04
+0.32 0.46 0.04
+0.34 0.46 0.04
+0.36 0.46 0.04
+0.38 0.46 0.04
+0.4 0.46 0.04
+0.42 0.46 0.04
+0.44 0.46 0.04
+0.46 0.46 0.04
+0.48 0.46 0.04
+0.5 0.46 0.04
+0.52 0.46 0.04
+0.54 0.46 0.04
+0.56 0.46 0.04
+0.58 0.46 0.04
+0.6 0.46 0.04
+0.62 0.46 0.04
+0.64 0.46 0.04
+0.66 0.46 0.04
+0.68 0.46 0.04
+0.32 0.48 0.04
+0.34 0.48 0.04
+0.36 0.48 0.04
+0.38 0.48 0.04
+0.4 0.48 0.04
+0.42 0.48 0.04
+0.44 0.48 0.04
+0.46 0.48 0.04
+0.48 0.48 0.04
+0.5 0.48 0.04
+0.52 0.48 0.04
+0.54 0.48 0.04
+0.56 0.48 0.04
+0.58 0.48 0.04
+0.6 0.48 0.04
+0.62 0.48 0.04
+0.64 0.48 0.04
+0.66 0.48 0.04
+0.68 0.48 0.04
+0.32 0.5 0.04
+0.34 0.5 0.04
+0.36 0.5 0.04
+0.38 0.5 0.04
+0.4 0.5 0.04
+0.42 0.5 0.04
+0.44 0.5 0.04
+0.46 0.5 0.04
+0.48 0.5 0.04
+0.5 0.5 0.04
+0.52 0.5 0.04
+0.54 0.5 0.04
+0.56 0.5 0.04
+0.58 0.5 0.04
+0.6 0.5 0.04
+0.62 0.5 0.04
+0.64 0.5 0.04
+0.66 0.5 0.04
+0.68 0.5 0.04
+0.32 0.52 0.04
+0.34 0.52 0.04
+0.36 0.52 0.04
+0.38 0.52 0.04
+0.4 0.52 0.04
+0.42 0.52 0.04
+0.44 0.52 0.04
+0.46 0.52 0.04
+0.48 0.52 0.04
+0.5 0.52 0.04
+0.52 0.52 0.04
+0.54 0.52 0.04
+0.56 0.52 0.04
+0.58 0.52 0.04
+0.6 0.52 0.04
+0.62 0.52 0.04
+0.64 0.52 0.04
+0.66 0.52 0.04
+0.68 0.52 0.04
+0.32 0.54 0.04
+0.34 0.54 0.04
+0.36 0.54 0.04
+0.38 0.54 0.04
+0.4 0.54 0.04
+0.42 0.54 0.04
+0.44 0.54 0.04
+0.46 0.54 0.04
+0.48 0.54 0.04
+0.5 0.54 0.04
+0.52 0.54 0.04
+0.54 0.54 0.04
+0.56 0.54 0.04
+0.58 0.54 0.04
+0.6 0.54 0.04
+0.62 0.54 0.04
+0.64 0.54 0.04
+0.66 0.54 0.04
+0.68 0.54 0.04
+0.32 0.56 0.04
+0.34 0.56 0.04
+0.36 0.56 0.04
+0.38 0.56 0.04
+0.4 0.56 0.04
+0.42 0.56 0.04
+0.44 0.56 0.04
+0.46 0.56 0.04
+0.48 0.56 0.04
+0.5 0.56 0.04
+0.52 0.56 0.04
+0.54 0.56 0.04
+0.56 0.56 0.04
+0.58 0.56 0.04
+0.6 0.56 0.04
+0.62 0.56 0.04
+0.64 0.56 0.04
+0.66 0.56 0.04
+0.68 0.56 0.04
+0.34 0.58 0.04
+0.36 0.58 0.04
+0.38 0.58 0.04
+0.4 0.58 0.04
+0.42 0.58 0.04
+0.44 0.58 0.04
+0.46 0.58 0.04
+0.48 0.58 0.04
+0.5 0.58 0.04
+0.52 0.58 0.04
+0.54 0.58 0.04
+0.56 0.58 0.04
+0.58 0.58 0.04
+0.6 0.58 0.04
+0.62 0.58 0.04
+0.64 0.58 0.04
+0.66 0.58 0.04
+0.34 0.6 0.04
+0.36 0.6 0.04
+0.38 0.6 0.04
+0.4 0.6 0.04
+0.42 0.6 0.04
+0.44 0.6 0.04
+0.46 0.6 0.04
+0.48 0.6 0.04
+0.5 0.6 0.04
+0.52 0.6 0.04
+0.54 0.6 0.04
+0.56 0.6 0.04
+0.58 0.6 0.04
+0.6 0.6 0.04
+0.62 0.6 0.04
+0.64 0.6 0.04
+0.66 0.6 0.04
+0.36 0.62 0.04
+0.38 0.62 0.04
+0.4 0.62 0.04
+0.42 0.62 0.04
+0.44 0.62 0.04
+0.46 0.62 0.04
+0.48 0.62 0.04
+0.5 0.62 0.04
+0.52 0.62 0.04
+0.54 0.62 0.04
+0.56 0.62 0.04
+0.58 0.62 0.04
+0.6 0.62 0.04
+0.62 0.62 0.04
+0.64 0.62 0.04
+0.38 0.64 0.04
+0.4 0.64 0.04
+0.42 0.64 0.04
+0.44 0.64 0.04
+0.46 0.64 0.04
+0.48 0.64 0.04
+0.5 0.64 0.04
+0.52 0.64 0.04
+0.54 0.64 0.04
+0.56 0.64 0.04
+0.58 0.64 0.04
+0.6 0.64 0.04
+0.62 0.64 0.04
+0.4 0.66 0.04
+0.42 0.66 0.04
+0.44 0.66 0.04
+0.46 0.66 0.04
+0.48 0.66 0.04
+0.5 0.66 0.04
+0.52 0.66 0.04
+0.54 0.66 0.04
+0.56 0.66 0.04
+0.58 0.66 0.04
+0.6 0.66 0.04
+0.44 0.68 0.04
+0.46 0.68 0.04
+0.48 0.68 0.04
+0.5 0.68 0.04
+0.52 0.68 0.04
+0.54 0.68 0.04
+0.56 0.68 0.04
+0.42 0.28 0.06
+0.44 0.28 0.06
+0.46 0.28 0.06
+0.48 0.28 0.06
+0.5 0.28 0.06
+0.52 0.28 0.06
+0.54 0.28 0.06
+0.56 0.28 0.06
+0.58 0.28 0.06
+0.38 0.3 0.06
+0.4 0.3 0.06
+0.42 0.3 0.06
+0.44 0.3 0.06
+0.46 0.3 0.06
+0.48 0.3 0.06
+0.5 0.3 0.06
+0.52 0.3 0.06
+0.54 0.3 0.06
+0.56 0.3 0.06
+0.58 0.3 0.06
+0.6 0.3 0.06
+0.62 0.3 0.06
+0.36 0.32 0.06
+0.38 0.32 0.06
+0.4 0.32 0.06
+0.42 0.32 0.06
+0.44 0.32 0.06
+0.46 0.32 0.06
+0.48 0.32 0.06
+0.5 0.32 0.06
+0.52 0.32 0.06
+0.54 0.32 0.06
+0.56 0.32 0.06
+0.58 0.32 0.06
+0.6 0.32 0.06
+0.62 0.32 0.06
+0.64 0.32 0.06
+0.34 0.34 0.06
+0.36 0.34 0.06
+0.38 0.34 0.06
+0.4 0.34 0.06
+0.42 0.34 0.06
+0.44 0.34 0.06
+0.46 0.34 0.06
+0.48 0.34 0.06
+0.5 0.34 0.06
+0.52 0.34 0.06
+0.54 0.34 0.06
+0.56 0.34 0.06
+0.58 0.34 0.06
+0.6 0.34 0.06
+0.62 0.34 0.06
+0.64 0.34 0.06
+0.66 0.34 0.06
+0.32 0.36 0.06
+0.34 0.36 0.06
+0.36 0.36 0.06
+0.38 0.36 0.06
+0.4 0.36 0.06
+0.42 0.36 0.06
+0.44 0.36 0.06
+0.46 0.36 0.06
+0.48 0.36 0.06
+0.5 0.36 0.06
+0.52 0.36 0.06
+0.54 0.36 0.06
+0.56 0.36 0.06
+0.58 0.36 0.06
+0.6 0.36 0.06
+0.62 0.36 0.06
+0.64 0.36 0.06
+0.66 0.36 0.06
+0.68 0.36 0.06
+0.3 0.38 0.06
+0.32 0.38 0.06
+0.34 0.38 0.06
+0.36 0.38 0.06
+0.38 0.38 0.06
+0.4 0.38 0.06
+0.42 0.38 0.06
+0.44 0.38 0.06
+0.46 0.38 0.06
+0.48 0.38 0.06
+0.5 0.38 0.06
+0.52 0.38 0.06
+0.54 0.38 0.06
+0.56 0.38 0.06
+0.58 0.38 0.06
+0.6 0.38 0.06
+0.62 0.38 0.06
+0.64 0.38 0.06
+0.66 0.38 0.06
+0.68 0.38 0.06
+0.7 0.38 0.06
+0.3 0.4 0.06
+0.32 0.4 0.06
+0.34 0.4 0.06
+0.36 0.4 0.06
+0.38 0.4 0.06
+0.4 0.4 0.06
+0.42 0.4 0.06
+0.44 0.4 0.06
+0.46 0.4 0.06
+0.48 0.4 0.06
+0.5 0.4 0.06
+0.52 0.4 0.06
+0.54 0.4 0.06
+0.56 0.4 0.06
+0.58 0.4 0.06
+0.6 0.4 0.06
+0.62 0.4 0.06
+0.64 0.4 0.06
+0.66 0.4 0.06
+0.68 0.4 0.06
+0.7 0.4 0.06
+0.28 0.42 0.06
+0.3 0.42 0.06
+0.32 0.42 0.06
+0.34 0.42 0.06
+0.36 0.42 0.06
+0.38 0.42 0.06
+0.4 0.42 0.06
+0.42 0.42 0.06
+0.44 0.42 0.06
+0.56 0.42 0.06
+0.58 0.42 0.06
+0.6 0.42 0.06
+0.62 0.42 0.06
+0.64 0.42 0.06
+0.66 0.42 0.06
+0.68 0.42 0.06
+0.7 0.42 0.06
+0.72 0.42 0.06
+0.28 0.44 0.06
+0.3 0.44 0.06
+0.32 0.44 0.06
+0.34 0.44 0.06
+0.36 0.44 0.06
+0.38 0.44 0.06
+0.4 0.44 0.06
+0.42 0.44 0.06
+0.58 0.44 0.06
+0.6 0.44 0.06
+0.62 0.44 0.06
+0.64 0.44 0.06
+0.66 0.44 0.06
+0.68 0.44 0.06
+0.7 0.44 0.06
+0.72 0.44 0.06
+0.28 0.46 0.06
+0.3 0.46 0.06
+0.32 0.46 0.06
+0.34 0.46 0.06
+0.36 0.46 0.06
+0.38 0.46 0.06
+0.4 0.46 0.06
+0.6 0.46 0.06
+0.62 0.46 0.06
+0.64 0.46 0.06
+0.66 0.46 0.06
+0.68 0.46 0.06
+0.7 0.46 0.06
+0.72 0.46 0.06
+0.28 0.48 0.06
+0.3 0.48 0.06
+0.32 0.48 0.06
+0.34 0.48 0.06
+0.36 0.48 0.06
+0.38 0.48 0.06
+0.4 0.48 0.06
+0.6 0.48 0.06
+0.62 0.48 0.06
+0.64 0.48 0.06
+0.66 0.48 0.06
+0.68 0.48 0.06
+0.7 0.48 0.06
+0.72 0.48 0.06
+0.28 0.5 0.06
+0.3 0.5 0.06
+0.32 0.5 0.06
+0.34 0.5 0.06
+0.36 0.5 0.06
+0.38 0.5 0.06
+0.4 0.5 0.06
+0.6 0.5 0.06
+0.62 0.5 0.06
+0.64 0.5 0.06
+0.66 0.5 0.06
+0.68 0.5 0.06
+0.7 0.5 0.06
+0.72 0.5 0.06
+0.28 0.52 0.06
+0.3 0.52 0.06
+0.32 0.52 0.06
+0.34 0.52 0.06
+0.36 0.52 0.06
+0.38 0.52 0.06
+0.4 0.52 0.06
+0.6 0.52 0.06
+0.62 0.52 0.06
+0.64 0.52 0.06
+0.66 0.52 0.06
+0.68 0.52 0.06
+0.7 0.52 0.06
+0.72 0.52 0.06
+0.28 0.54 0.06
+0.3 0.54 0.06
+0.32 0.54 0.06
+0.34 0.54 0.06
+0.36 0.54 0.06
+0.38 0.54 0.06
+0.4 0.54 0.06
+0.6 0.54 0.06
+0.62 0.54 0.06
+0.64 0.54 0.06
+0.66 0.54 0.06
+0.68 0.54 0.06
+0.7 0.54 0.06
+0.72 0.54 0.06
+0.28 0.56 0.06
+0.3 0.56 0.06
+0.32 0.56 0.06
+0.34 0.56 0.06
+0.36 0.56 0.06
+0.38 0.56 0.06
+0.4 0.56 0.06
+0.42 0.56 0.06
+0.58 0.56 0.06
+0.6 0.56 0.06
+0.62 0.56 0.06
+0.64 0.56 0.06
+0.66 0.56 0.06
+0.68 0.56 0.06
+0.7 0.56 0.06
+0.72 0.56 0.06
+0.28 0.58 0.06
+0.3 0.58 0.06
+0.32 0.58 0.06
+0.34 0.58 0.06
+0.36 0.58 0.06
+0.38 0.58 0.06
+0.4 0.58 0.06
+0.42 0.58 0.06
+0.44 0.58 0.06
+0.56 0.58 0.06
+0.58 0.58 0.06
+0.6 0.58 0.06
+0.62 0.58 0.06
+0.64 0.58 0.06
+0.66 0.58 0.06
+0.68 0.58 0.06
+0.7 0.58 0.06
+0.72 0.58 0.06
+0.3 0.6 0.06
+0.32 0.6 0.06
+0.34 0.6 0.06
+0.36 0.6 0.06
+0.38 0.6 0.06
+0.4 0.6 0.06
+0.42 0.6 0.06
+0.44 0.6 0.06
+0.46 0.6 0.06
+0.48 0.6 0.06
+0.5 0.6 0.06
+0.52 0.6 0.06
+0.54 0.6 0.06
+0.56 0.6 0.06
+0.58 0.6 0.06
+0.6 0.6 0.06
+0.62 0.6 0.06
+0.64 0.6 0.06
+0.66 0.6 0.06
+0.68 0.6 0.06
+0.7 0.6 0.06
+0.3 0.62 0.06
+0.32 0.62 0.06
+0.34 0.62 0.06
+0.36 0.62 0.06
+0.38 0.62 0.06
+0.4 0.62 0.06
+0.42 0.62 0.06
+0.44 0.62 0.06
+0.46 0.62 0.06
+0.48 0.62 0.06
+0.5 0.62 0.06
+0.52 0.62 0.06
+0.54 0.62 0.06
+0.56 0.62 0.06
+0.58 0.62 0.06
+0.6 0.62 0.06
+0.62 0.62 0.06
+0.64 0.62 0.06
+0.66 0.62 0.06
+0.68 0.62 0.06
+0.7 0.62 0.06
+0.32 0.64 0.06
+0.34 0.64 0.06
+0.36 0.64 0.06
+0.38 0.64 0.06
+0.4 0.64 0.06
+0.42 0.64 0.06
+0.44 0.64 0.06
+0.46 0.64 0.06
+0.48 0.64 0.06
+0.5 0.64 0.06
+0.52 0.64 0.06
+0.54 0.64 0.06
+0.56 0.64 0.06
+0.58 0.64 0.06
+0.6 0.64 0.06
+0.62 0.64 0.06
+0.64 0.64 0.06
+0.66 0.64 0.06
+0.68 0.64 0.06
+0.34 0.66 0.06
+0.36 0.66 0.06
+0.38 0.66 0.06
+0.4 0.66 0.06
+0.42 0.66 0.06
+0.44 0.66 0.06
+0.46 0.66 0.06
+0.48 0.66 0.06
+0.5 0.66 0.06
+0.52 0.66 0.06
+0.54 0.66 0.06
+0.56 0.66 0.06
+0.58 0.66 0.06
+0.6 0.66 0.06
+0.62 0.66 0.06
+0.64 0.66 0.06
+0.66 0.66 0.06
+0.36 0.68 0.06
+0.38 0.68 0.06
+0.4 0.68 0.06
+0.42 0.68 0.06
+0.44 0.68 0.06
+0.46 0.68 0.06
+0.48 0.68 0.06
+0.5 0.68 0.06
+0.52 0.68 0.06
+0.54 0.68 0.06
+0.56 0.68 0.06
+0.58 0.68 0.06
+0.6 0.68 0.06
+0.62 0.68 0.06
+0.64 0.68 0.06
+0.38 0.7 0.06
+0.4 0.7 0.06
+0.42 0.7 0.06
+0.44 0.7 0.06
+0.46 0.7 0.06
+0.48 0.7 0.06
+0.5 0.7 0.06
+0.52 0.7 0.06
+0.54 0.7 0.06
+0.56 0.7 0.06
+0.58 0.7 0.06
+0.6 0.7 0.06
+0.62 0.7 0.06
+0.42 0.72 0.06
+0.44 0.72 0.06
+0.46 0.72 0.06
+0.48 0.72 0.06
+0.5 0.72 0.06
+0.52 0.72 0.06
+0.54 0.72 0.06
+0.56 0.72 0.06
+0.58 0.72 0.06
+0.44 0.24 0.08
+0.46 0.24 0.08
+0.48 0.24 0.08
+0.5 0.24 0.08
+0.52 0.24 0.08
+0.54 0.24 0.08
+0.56 0.24 0.08
+0.38 0.26 0.08
+0.4 0.26 0.08
+0.42 0.26 0.08
+0.44 0.26 0.08
+0.46 0.26 0.08
+0.48 0.26 0.08
+0.5 0.26 0.08
+0.52 0.26 0.08
+0.54 0.26 0.08
+0.56 0.26 0.08
+0.58 0.26 0.08
+0.6 0.26 0.08
+0.62 0.26 0.08
+0.36 0.28 0.08
+0.38 0.28 0.08
+0.4 0.28 0.08
+0.42 0.28 0.08
+0.44 0.28 0.08
+0.46 0.28 0.08
+0.48 0.28 0.08
+0.5 0.28 0.08
+0.52 0.28 0.08
+0.54 0.28 0.08
+0.56 0.28 0.08
+0.58 0.28 0.08
+0.6 0.28 0.08
+0.62 0.28 0.08
+0.64 0.28 0.08
+0.32 0.3 0.08
+0.34 0.3 0.08
+0.36 0.3 0.08
+0.38 0.3 0.08
+0.4 0.3 0.08
+0.42 0.3 0.08
+0.44 0.3 0.08
+0.46 0.3 0.08
+0.48 0.3 0.08
+0.5 0.3 0.08
+0.52 0.3 0.08
+0.54 0.3 0.08
+0.56 0.3 0.08
+0.58 0.3 0.08
+0.6 0.3 0.08
+0.62 0.3 0.08
+0.64 0.3 0.08
+0.66 0.3 0.08
+0.68 0.3 0.08
+0.3 0.32 0.08
+0.32 0.32 0.08
+0.34 0.32 0.08
+0.36 0.32 0.08
+0.38 0.32 0.08
+0.4 0.32 0.08
+0.42 0.32 0.08
+0.44 0.32 0.08
+0.46 0.32 0.08
+0.48 0.32 0.08
+0.5 0.32 0.08
+0.52 0.32 0.08
+0.54 0.32 0.08
+0.56 0.32 0.08
+0.58 0.32 0.08
+0.6 0.32 0.08
+0.62 0.32 0.08
+0.64 0.32 0.08
+0.66 0.32 0.08
+0.68 0.32 0.08
+0.7 0.32 0.08
+0.3 0.34 0.08
+0.32 0.34 0.08
+0.34 0.34 0.08
+0.36 0.34 0.08
+0.38 0.34 0.08
+0.4 0.34 0.08
+0.42 0.34 0.08
+0.44 0.34 0.08
+0.46 0.34 0.08
+0.54 0.34 0.08
+0.56 0.34 0.08
+0.58 0.34 0.08
+0.6 0.34 0.08
+0.62 0.34 0.08
+0.64 0.34 0.08
+0.66 0.34 0.08
+0.68 0.34 0.08
+0.7 0.34 0.08
+0.28 0.36 0.08
+0.3 0.36 0.08
+0.32 0.36 0.08
+0.34 0.36 0.08
+0.36 0.36 0.08
+0.38 0.36 0.08
+0.4 0.36 0.08
+0.6 0.36 0.08
+0.62 0.36 0.08
+0.64 0.36 0.08
+0.66 0.36 0.08
+0.68 0.36 0.08
+0.7 0.36 0.08
+0.72 0.36 0.08
+0.26 0.38 0.08
+0.28 0.38 0.08
+0.3 0.38 0.08
+0.32 0.38 0.08
+0.34 0.38 0.08
+0.36 0.38 0.08
+0.38 0.38 0.08
+0.62 0.38 0.08
+0.64 0.38 0.08
+0.66 0.38 0.08
+0.68 0.38 0.08
+0.7 0.38 0.08
+0.72 0.38 0.08
+0.74 0.38 0.08
+0.26 0.4 0.08
+0.28 0.4 0.08
+0.3 0.4 0.08
+0.32 0.4 0.08
+0.34 0.4 0.08
+0.36 0.4 0.08
+0.64 0.4 0.08
+0.66 0.4 0.08
+0.68 0.4 0.08
+0.7 0.4 0.08
+0.72 0.4 0.08
+0.74 0.4 0.08
+0.26 0.42 0.08
+0.28 0.42 0.08
+0.3 0.42 0.08
+0.32 0.42 0.08
+0.34 0.42 0.08
+0.66 0.42 0.08
+0.68 0.42 0.08
+0.7 0.42 0.08
+0.72 0.42 0.08
+0.74 0.42 0.08
+0.24 0.44 0.08
+0.26 0.44 0.08
+0.28 0.44 0.08
+0.3 0.44 0.08
+0.32 0.44 0.08
+0.34 0.44 0.08
+0.66 0.44 0.08
+0.68 0.44 0.08
+0.7 0.44 0.08
+0.72 0.44 0.08
+0.74 0.44 0.08
+0.76 0.44 0.08
+0.24 0.46 0.08
+0.26 0.46 0.08
+0.28 0.46 0.08
+0.3 0.46 0.08
+0.32 0.46 0.08
+0.34 0.46 0.08
+0.66 0.46 0.08
+0.68 0.46 0.08
+0.7 0.46 0.08
+0.72 0.46 0.08
+0.74 0.46 0.08
+0.76 0.46 0.08
+0.24 0.48 0.08
+0.26 0.48 0.08
+0.28 0.48 0.08
+0.3 0.48 0.08
+0.32 0.48 0.08
+0.68 0.48 0.08
+0.7 0.48 0.08
+0.72 0.48 0.08
+0.74 0.48 0.08
+0.76 0.48 0.08
+0.24 0.5 0.08
+0.26 0.5 0.08
+0.28 0.5 0.08
+0.3 0.5 0.08
+0.32 0.5 0.08
+0.68 0.5 0.08
+0.7 0.5 0.08
+0.72 0.5 0.08
+0.74 0.5 0.08
+0.76 0.5 0.08
+0.24 0.52 0.08
+0.26 0.52 0.08
+0.28 0.52 0.08
+0.3 0.52 0.08
+0.32 0.52 0.08
+0.68 0.52 0.08
+0.7 0.52 0.08
+0.72 0.52 0.08
+0.74 0.52 0.08
+0.76 0.52 0.08
+0.24 0.54 0.08
+0.26 0.54 0.08
+0.28 0.54 0.08
+0.3 0.54 0.08
+0.32 0.54 0.08
+0.34 0.54 0.08
+0.66 0.54 0.08
+0.68 0.54 0.08
+0.7 0.54 0.08
+0.72 0.54 0.08
+0.74 0.54 0.08
+0.76 0.54 0.08
+0.24 0.56 0.08
+0.26 0.56 0.08
+0.28 0.56 0.08
+0.3 0.56 0.08
+0.32 0.56 0.08
+0.34 0.56 0.08
+0.66 0.56 0.08
+0.68 0.56 0.08
+0.7 0.56 0.08
+0.72 0.56 0.08
+0.74 0.56 0.08
+0.76 0.56 0.08
+0.26 0.58 0.08
+0.28 0.58 0.08
+0.3 0.58 0.08
+0.32 0.58 0.08
+0.34 0.58 0.08
+0.66 0.58 0.08
+0.68 0.58 0.08
+0.7 0.58 0.08
+0.72 0.58 0.08
+0.74 0.58 0.08
+0.26 0.6 0.08
+0.28 0.6 0.08
+0.3 0.6 0.08
+0.32 0.6 0.08
+0.34 0.6 0.08
+0.36 0.6 0.08
+0.64 0.6 0.08
+0.66 0.6 0.08
+0.68 0.6 0.08
+0.7 0.6 0.08
+0.72 0.6 0.08
+0.74 0.6 0.08
+0.26 0.62 0.08
+0.28 0.62 0.08
+0.3 0.62 0.08
+0.32 0.62 0.08
+0.34 0.62 0.08
+0.36 0.62 0.08
+0.38 0.62 0.08
+0.62 0.62 0.08
+0.64 0.62 0.08
+0.66 0.62 0.08
+0.68 0.62 0.08
+0.7 0.62 0.08
+0.72 0.62 0.08
+0.74 0.62 0.08
+0.28 0.64 0.08
+0.3 0.64 0.08
+0.32 0.64 0.08
+0.34 0.64 0.08
+0.36 0.64 0.08
+0.38 0.64 0.08
+0.4 0.64 0.08
+0.6 0.64 0.08
+0.62 0.64 0.08
+0.64 0.64 0.08
+0.66 0.64 0.08
+0.68 0.64 0.08
+0.7 0.64 0.08
+0.72 0.64 0.08
+0.3 0.66 0.08
+0.32 0.66 0.08
+0.34 0.66 0.08
+0.36 0.66 0.08
+0.38 0.66 0.08
+0.4 0.66 0.08
+0.42 0.66 0.08
+0.44 0.66 0.08
+0.46 0.66 0.08
+0.54 0.66 0.08
+0.56 0.66 0.08
+0.58 0.66 0.08
+0.6 0.66 0.08
+0.62 0.66 0.08
+0.64 0.66 0.08
+0.66 0.66 0.08
+0.68 0.66 0.08
+0.7 0.66 0.08
+0.3 0.68 0.08
+0.32 0.68 0.08
+0.34 0.68 0.08
+0.36 0.68 0.08
+0.38 0.68 0.08
+0.4 0.68 0.08
+0.42 0.68 0.08
+0.44 0.68 0.08
+0.46 0.68 0.08
+0.48 0.68 0.08
+0.5 0.68 0.08
+0.52 0.68 0.08
+0.54 0.68 0.08
+0.56 0.68 0.08
+0.58 0.68 0.08
+0.6 0.68 0.08
+0.62 0.68 0.08
+0.64 0.68 0.08
+0.66 0.68 0.08
+0.68 0.68 0.08
+0.7 0.68 0.08
+0.32 0.7 0.08
+0.34 0.7 0.08
+0.36 0.7 0.08
+0.38 0.7 0.08
+0.4 0.7 0.08
+0.42 0.7 0.08
+0.44 0.7 0.08
+0.46 0.7 0.08
+0.48 0.7 0.08
+0.5 0.7 0.08
+0.52 0.7 0.08
+0.54 0.7 0.08
+0.56 0.7 0.08
+0.58 0.7 0.08
+0.6 0.7 0.08
+0.62 0.7 0.08
+0.64 0.7 0.08
+0.66 0.7 0.08
+0.68 0.7 0.08
+0.36 0.72 0.08
+0.38 0.72 0.08
+0.4 0.72 0.08
+0.42 0.72 0.08
+0.44 0.72 0.08
+0.46 0.72 0.08
+0.48 0.72 0.08
+0.5 0.72 0.08
+0.52 0.72 0.08
+0.54 0.72 0.08
+0.56 0.72 0.08
+0.58 0.72 0.08
+0.6 0.72 0.08
+0.62 0.72 0.08
+0.64 0.72 0.08
+0.38 0.74 0.08
+0.4 0.74 0.08
+0.42 0.74 0.08
+0.44 0.74 0.08
+0.46 0.74 0.08
+0.48 0.74 0.08
+0.5 0.74 0.08
+0.52 0.74 0.08
+0.54 0.74 0.08
+0.56 0.74 0.08
+0.58 0.74 0.08
+0.6 0.74 0.08
+0.62 0.74 0.08
+0.44 0.76 0.08
+0.46 0.76 0.08
+0.48 0.76 0.08
+0.5 0.76 0.08
+0.52 0.76 0.08
+0.54 0.76 0.08
+0.56 0.76 0.08
+0.4 0.22 0.1
+0.42 0.22 0.1
+0.44 0.22 0.1
+0.46 0.22 0.1
+0.48 0.22 0.1
+0.5 0.22 0.1
+0.52 0.22 0.1
+0.54 0.22 0.1
+0.56 0.22 0.1
+0.58 0.22 0.1
+0.6 0.22 0.1
+0.36 0.24 0.1
+0.38 0.24 0.1
+0.4 0.24 0.1
+0.42 0.24 0.1
+0.44 0.24 0.1
+0.46 0.24 0.1
+0.48 0.24 0.1
+0.5 0.24 0.1
+0.52 0.24 0.1
+0.54 0.24 0.1
+0.56 0.24 0.1
+0.58 0.24 0.1
+0.6 0.24 0.1
+0.62 0.24 0.1
+0.64 0.24 0.1
+0.34 0.26 0.1
+0.36 0.26 0.1
+0.38 0.26 0.1
+0.4 0.26 0.1
+0.42 0.26 0.1
+0.44 0.26 0.1
+0.46 0.26 0.1
+0.48 0.26 0.1
+0.5 0.26 0.1
+0.52 0.26 0.1
+0.54 0.26 0.1
+0.56 0.26 0.1
+0.58 0.26 0.1
+0.6 0.26 0.1
+0.62 0.26 0.1
+0.64 0.26 0.1
+0.66 0.26 0.1
+0.3 0.28 0.1
+0.32 0.28 0.1
+0.34 0.28 0.1
+0.36 0.28 0.1
+0.38 0.28 0.1
+0.4 0.28 0.1
+0.42 0.28 0.1
+0.44 0.28 0.1
+0.46 0.28 0.1
+0.48 0.28 0.1
+0.5 0.28 0.1
+0.52 0.28 0.1
+0.54 0.28 0.1
+0.56 0.28 0.1
+0.58 0.28 0.1
+0.6 0.28 0.1
+0.62 0.28 0.1
+0.64 0.28 0.1
+0.66 0.28 0.1
+0.68 0.28 0.1
+0.7 0.28 0.1
+0.28 0.3 0.1
+0.3 0.3 0.1
+0.32 0.3 0.1
+0.34 0.3 0.1
+0.36 0.3 0.1
+0.38 0.3 0.1
+0.4 0.3 0.1
+0.42 0.3 0.1
+0.44 0.3 0.1
+0.56 0.3 0.1
+0.58 0.3 0.1
+0.6 0.3 0.1
+0.62 0.3 0.1
+0.64 0.3 0.1
+0.66 0.3 0.1
+0.68 0.3 0.1
+0.7 0.3 0.1
+0.72 0.3 0.1
+0.28 0.32 0.1
+0.3 0.32 0.1
+0.32 0.32 0.1
+0.34 0.32 0.1
+0.36 0.32 0.1
+0.38 0.32 0.1
+0.62 0.32 0.1
+0.64 0.32 0.1
+0.66 0.32 0.1
+0.68 0.32 0.1
+0.7 0.32 0.1
+0.72 0.32 0.1
+0.26 0.34 0.1
+0.28 0.34 0.1
+0.3 0.34 0.1
+0.32 0.34 0.1
+0.34 0.34 0.1
+0.36 0.34 0.1
+0.64 0.34 0.1
+0.66 0.34 0.1
+0.68 0.34 0.1
+0.7 0.34 0.1
+0.72 0.34 0.1
+0.74 0.34 0.1
+0.24 0.36 0.1
+0.26 0.36 0.1
+0.28 0.36 0.1
+0.3 0.36 0.1
+0.32 0.36 0.1
+0.34 0.36 0.1
+0.66 0.36 0.1
+0.68 0.36 0.1
+0.7 0.36 0.1
+0.72 0.36 0.1
+0.74 0.36 0.1
+0.76 0.36 0.1
+0.24 0.38 0.1
+0.26 0.38 0.1
+0.28 0.38 0.1
+0.3 0.38 0.1
+0.32 0.38 0.1
+0.68 0.38 0.1
+0.7 0.38 0.1
+0.72 0.38 0.1
+0.74 0.38 0.1
+0.76 0.38 0.1
+0.22 0.4 0.1
+0.24 0.4 0.1
+0.26 0.4 0.1
+0.28 0.4 0.1
+0.3 0.4 0.1
+0.7 0.4 0.1
+0.72 0.4 0.1
+0.74 0.4 0.1
+0.76 0.4 0.1
+0.78 0.4 0.1
+0.22 0.42 0.1
+0.24 0.42 0.1
+0.26 0.42 0.1
+0.28 0.42 0.1
+0.3 0.42 0.1
+0.7 0.42 0.1
+0.72 0.42 0.1
+0.74 0.42 0.1
+0.76 0.42 0.1
+0.78 0.42 0.1
+0.22 0.44 0.1
+0.24 0.44 0.1
+0.26 0.44 0.1
+0.28 0.44 0.1
+0.3 0.44 0.1
+0.7 0.44 0.1
+0.72 0.44 0.1
+0.74 0.44 0.1
+0.76 0.44 0.1
+0.78 0.44 0.1
+0.22 0.46 0.1
+0.24 0.46 0.1
+0.26 0.46 0.1
+0.28 0.46 0.1
+0.72 0.46 0.1
+0.74 0.46 0.1
+0.76 0.46 0.1
+0.78 0.46 0.1
+0.22 0.48 0.1
+0.24 0.48 0.1
+0.26 0.48 0.1
+0.28 0.48 0.1
+0.72 0.48 0.1
+0.74 0.48 0.1
+0.76 0.48 0.1
+0.78 0.48 0.1
+0.22 0.5 0.1
+0.24 0.5 0.1
+0.26 0.5 0.1
+0.28 0.5 0.1
+0.72 0.5 0.1
+0.74 0.5 0.1
+0.76 0.5 0.1
+0.78 0.5 0.1
+0.22 0.52 0.1
+0.24 0.52 0.1
+0.26 0.52 0.1
+0.28 0.52 0.1
+0.72 0.52 0.1
+0.74 0.52 0.1
+0.76 0.52 0.1
+0.78 0.52 0.1
+0.22 0.54 0.1
+0.24 0.54 0.1
+0.26 0.54 0.1
+0.28 0.54 0.1
+0.72 0.54 0.1
+0.74 0.54 0.1
+0.76 0.54 0.1
+0.78 0.54 0.1
+0.22 0.56 0.1
+0.24 0.56 0.1
+0.26 0.56 0.1
+0.28 0.56 0.1
+0.3 0.56 0.1
+0.7 0.56 0.1
+0.72 0.56 0.1
+0.74 0.56 0.1
+0.76 0.56 0.1
+0.78 0.56 0.1
+0.22 0.58 0.1
+0.24 0.58 0.1
+0.26 0.58 0.1
+0.28 0.58 0.1
+0.3 0.58 0.1
+0.7 0.58 0.1
+0.72 0.58 0.1
+0.74 0.58 0.1
+0.76 0.58 0.1
+0.78 0.58 0.1
+0.22 0.6 0.1
+0.24 0.6 0.1
+0.26 0.6 0.1
+0.28 0.6 0.1
+0.3 0.6 0.1
+0.7 0.6 0.1
+0.72 0.6 0.1
+0.74 0.6 0.1
+0.76 0.6 0.1
+0.78 0.6 0.1
+0.24 0.62 0.1
+0.26 0.62 0.1
+0.28 0.62 0.1
+0.3 0.62 0.1
+0.32 0.62 0.1
+0.68 0.62 0.1
+0.7 0.62 0.1
+0.72 0.62 0.1
+0.74 0.62 0.1
+0.76 0.62 0.1
+0.24 0.64 0.1
+0.26 0.64 0.1
+0.28 0.64 0.1
+0.3 0.64 0.1
+0.32 0.64 0.1
+0.34 0.64 0.1
+0.66 0.64 0.1
+0.68 0.64 0.1
+0.7 0.64 0.1
+0.72 0.64 0.1
+0.74 0.64 0.1
+0.76 0.64 0.1
+0.26 0.66 0.1
+0.28 0.66 0.1
+0.3 0.66 0.1
+0.32 0.66 0.1
+0.34 0.66 0.1
+0.36 0.66 0.1
+0.64 0.66 0.1
+0.66 0.66 0.1
+0.68 0.66 0.1
+0.7 0.66 0.1
+0.72 0.66 0.1
+0.74 0.66 0.1
+0.28 0.68 0.1
+0.3 0.68 0.1
+0.32 0.68 0.1
+0.34 0.68 0.1
+0.36 0.68 0.1
+0.38 0.68 0.1
+0.62 0.68 0.1
+0.64 0.68 0.1
+0.66 0.68 0.1
+0.68 0.68 0.1
+0.7 0.68 0.1
+0.72 0.68 0.1
+0.28 0.7 0.1
+0.3 0.7 0.1
+0.32 0.7 0.1
+0.34 0.7 0.1
+0.36 0.7 0.1
+0.38 0.7 0.1
+0.4 0.7 0.1
+0.42 0.7 0.1
+0.44 0.7 0.1
+0.56 0.7 0.1
+0.58 0.7 0.1
+0.6 0.7 0.1
+0.62 0.7 0.1
+0.64 0.7 0.1
+0.66 0.7 0.1
+0.68 0.7 0.1
+0.7 0.7 0.1
+0.72 0.7 0.1
+0.3 0.72 0.1
+0.32 0.72 0.1
+0.34 0.72 0.1
+0.36 0.72 0.1
+0.38 0.72 0.1
+0.4 0.72 0.1
+0.42 0.72 0.1
+0.44 0.72 0.1
+0.46 0.72 0.1
+0.48 0.72 0.1
+0.5 0.72 0.1
+0.52 0.72 0.1
+0.54 0.72 0.1
+0.56 0.72 0.1
+0.58 0.72 0.1
+0.6 0.72 0.1
+0.62 0.72 0.1
+0.64 0.72 0.1
+0.66 0.72 0.1
+0.68 0.72 0.1
+0.7 0.72 0.1
+0.34 0.74 0.1
+0.36 0.74 0.1
+0.38 0.74 0.1
+0.4 0.74 0.1
+0.42 0.74 0.1
+0.44 0.74 0.1
+0.46 0.74 0.1
+0.48 0.74 0.1
+0.5 0.74 0.1
+0.52 0.74 0.1
+0.54 0.74 0.1
+0.56 0.74 0.1
+0.58 0.74 0.1
+0.6 0.74 0.1
+0.62 0.74 0.1
+0.64 0.74 0.1
+0.66 0.74 0.1
+0.36 0.76 0.1
+0.38 0.76 0.1
+0.4 0.76 0.1
+0.42 0.76 0.1
+0.44 0.76 0.1
+0.46 0.76 0.1
+0.48 0.76 0.1
+0.5 0.76 0.1
+0.52 0.76 0.1
+0.54 0.76 0.1
+0.56 0.76 0.1
+0.58 0.76 0.1
+0.6 0.76 0.1
+0.62 0.76 0.1
+0.64 0.76 0.1
+0.4 0.78 0.1
+0.42 0.78 0.1
+0.44 0.78 0.1
+0.46 0.78 0.1
+0.48 0.78 0.1
+0.5 0.78 0.1
+0.52 0.78 0.1
+0.54 0.78 0.1
+0.56 0.78 0.1
+0.58 0.78 0.1
+0.6 0.78 0.1
+0.46 0.18 0.12
+0.48 0.18 0.12
+0.5 0.18 0.12
+0.52 0.18 0.12
+0.54 0.18 0.12
+0.38 0.2 0.12
+0.4 0.2 0.12
+0.42 0.2 0.12
+0.44 0.2 0.12
+0.46 0.2 0.12
+0.48 0.2 0.12
+0.5 0.2 0.12
+0.52 0.2 0.12
+0.54 0.2 0.12
+0.56 0.2 0.12
+0.58 0.2 0.12
+0.6 0.2 0.12
+0.62 0.2 0.12
+0.34 0.22 0.12
+0.36 0.22 0.12
+0.38 0.22 0.12
+0.4 0.22 0.12
+0.42 0.22 0.12
+0.44 0.22 0.12
+0.46 0.22 0.12
+0.48 0.22 0.12
+0.5 0.22 0.12
+0.52 0.22 0.12
+0.54 0.22 0.12
+0.56 0.22 0.12
+0.58 0.22 0.12
+0.6 0.22 0.12
+0.62 0.22 0.12
+0.64 0.22 0.12
+0.66 0.22 0.12
+0.32 0.24 0.12
+0.34 0.24 0.12
+0.36 0.24 0.12
+0.38 0.24 0.12
+0.4 0.24 0.12
+0.42 0.24 0.12
+0.44 0.24 0.12
+0.46 0.24 0.12
+0.48 0.24 0.12
+0.5 0.24 0.12
+0.52 0.24 0.12
+0.54 0.24 0.12
+0.56 0.24 0.12
+0.58 0.24 0.12
+0.6 0.24 0.12
+0.62 0.24 0.12
+0.64 0.24 0.12
+0.66 0.24 0.12
+0.68 0.24 0.12
+0.3 0.26 0.12
+0.32 0.26 0.12
+0.34 0.26 0.12
+0.36 0.26 0.12
+0.38 0.26 0.12
+0.4 0.26 0.12
+0.42 0.26 0.12
+0.44 0.26 0.12
+0.46 0.26 0.12
+0.54 0.26 0.12
+0.56 0.26 0.12
+0.58 0.26 0.12
+0.6 0.26 0.12
+0.62 0.26 0.12
+0.64 0.26 0.12
+0.66 0.26 0.12
+0.68 0.26 0.12
+0.7 0.26 0.12
+0.28 0.28 0.12
+0.3 0.28 0.12
+0.32 0.28 0.12
+0.34 0.28 0.12
+0.36 0.28 0.12
+0.38 0.28 0.12
+0.4 0.28 0.12
+0.6 0.28 0.12
+0.62 0.28 0.12
+0.64 0.28 0.12
+0.66 0.28 0.12
+0.68 0.28 0.12
+0.7 0.28 0.12
+0.72 0.28 0.12
+0.26 0.3 0.12
+0.28 0.3 0.12
+0.3 0.3 0.12
+0.32 0.3 0.12
+0.34 0.3 0.12
+0.36 0.3 0.12
+0.64 0.3 0.12
+0.66 0.3 0.12
+0.68 0.3 0.12
+0.7 0.3 0.12
+0.72 0.3 0.12
+0.74 0.3 0.12
+0.24 0.32 0.12
+0.26 0.32 0.12
+0.28 0.32 0.12
+0.3 0.32 0.12
+0.32 0.32 0.12
+0.68 0.32 0.12
+0.7 0.32 0.12
+0.72 0.32 0.12
+0.74 0.32 0.12
+0.76 0.32 0.12
+0.22 0.34 0.12
+0.24 0.34 0.12
+0.26 0.34 0.12
+0.28 0.34 0.12
+0.3 0.34 0.12
+0.7 0.34 0.12
+0.72 0.34 0.12
+0.74 0.34 0.12
+0.76 0.34 0.12
+0.78 0.34 0.12
+0.22 0.36 0.12
+0.24 0.36 0.12
+0.26 0.36 0.12
+0.28 0.36 0.12
+0.3 0.36 0.12
+0.7 0.36 0.12
+0.72 0.36 0.12
+0.74 0.36 0.12
+0.76 0.36 0.12
+0.78 0.36 0.12
+0.2 0.38 0.12
+0.22 0.38 0.12
+0.24 0.38 0.12
+0.26 0.38 0.12
+0.28 0.38 0.12
+0.72 0.38 0.12
+0.74 0.38 0.12
+0.76 0.38 0.12
+0.78 0.38 0.12
+0.8 0.38 0.12
+0.2 0.4 0.12
+0.22 0.4 0.12
+0.24 0.4 0.12
+0.26 0.4 0.12
+0.28 0.4 0.12
+0.72 0.4 0.12
+0.74 0.4 0.12
+0.76 0.4 0.12
+0.78 0.4 0.12
+0.8 0.4 0.12
+0.2 0.42 0.12
+0.22 0.42 0.12
+0.24 0.42 0.12
+0.26 0.42 0.12
+0.74 0.42 0.12
+0.76 0.42 0.12
+0.78 0.42 0.12
+0.8 0.42 0.12
+0.2 0.44 0.12
+0.22 0.44 0.12
+0.24 0.44 0.12
+0.26 0.44 0.12
+0.74 0.44 0.12
+0.76 0.44 0.12
+0.78 0.44 0.12
+0.8 0.44 0.12
+0.18 0.46 0.12
+0.2 0.46 0.12
+0.22 0.46 0.12
+0.24 0.46 0.12
+0.26 0.46 0.12
+0.74 0.46 0.12
+0.76 0.46 0.12
+0.78 0.46 0.12
+0.8 0.46 0.12
+0.82 0.46 0.12
+0.18 0.48 0.12
+0.2 0.48 0.12
+0.22 0.48 0.12
+0.24 0.48 0.12
+0.76 0.48 0.12
+0.78 0.48 0.12
+0.8 0.48 0.12
+0.82 0.48 0.12
+0.18 0.5 0.12
+0.2 0.5 0.12
+0.22 0.5 0.12
+0.24 0.5 0.12
+0.76 0.5 0.12
+0.78 0.5 0.12
+0.8 0.5 0.12
+0.82 0.5 0.12
+0.18 0.52 0.12
+0.2 0.52 0.12
+0.22 0.52 0.12
+0.24 0.52 0.12
+0.76 0.52 0.12
+0.78 0.52 0.12
+0.8 0.52 0.12
+0.82 0.52 0.12
+0.18 0.54 0.12
+0.2 0.54 0.12
+0.22 0.54 0.12
+0.24 0.54 0.12
+0.26 0.54 0.12
+0.74 0.54 0.12
+0.76 0.54 0.12
+0.78 0.54 0.12
+0.8 0.54 0.12
+0.82 0.54 0.12
+0.2 0.56 0.12
+0.22 0.56 0.12
+0.24 0.56 0.12
+0.26 0.56 0.12
+0.74 0.56 0.12
+0.76 0.56 0.12
+0.78 0.56 0.12
+0.8 0.56 0.12
+0.2 0.58 0.12
+0.22 0.58 0.12
+0.24 0.58 0.12
+0.26 0.58 0.12
+0.74 0.58 0.12
+0.76 0.58 0.12
+0.78 0.58 0.12
+0.8 0.58 0.12
+0.2 0.6 0.12
+0.22 0.6 0.12
+0.24 0.6 0.12
+0.26 0.6 0.12
+0.28 0.6 0.12
+0.72 0.6 0.12
+0.74 0.6 0.12
+0.76 0.6 0.12
+0.78 0.6 0.12
+0.8 0.6 0.12
+0.2 0.62 0.12
+0.22 0.62 0.12
+0.24 0.62 0.12
+0.26 0.62 0.12
+0.28 0.62 0.12
+0.72 0.62 0.12
+0.74 0.62 0.12
+0.76 0.62 0.12
+0.78 0.62 0.12
+0.8 0.62 0.12
+0.22 0.64 0.12
+0.24 0.64 0.12
+0.26 0.64 0.12
+0.28 0.64 0.12
+0.3 0.64 0.12
+0.7 0.64 0.12
+0.72 0.64 0.12
+0.74 0.64 0.12
+0.76 0.64 0.12
+0.78 0.64 0.12
+0.22 0.66 0.12
+0.24 0.66 0.12
+0.26 0.66 0.12
+0.28 0.66 0.12
+0.3 0.66 0.12
+0.7 0.66 0.12
+0.72 0.66 0.12
+0.74 0.66 0.12
+0.76 0.66 0.12
+0.78 0.66 0.12
+0.24 0.68 0.12
+0.26 0.68 0.12
+0.28 0.68 0.12
+0.3 0.68 0.12
+0.32 0.68 0.12
+0.68 0.68 0.12
+0.7 0.68 0.12
+0.72 0.68 0.12
+0.74 0.68 0.12
+0.76 0.68 0.12
+0.26 0.7 0.12
+0.28 0.7 0.12
+0.3 0.7 0.12
+0.32 0.7 0.12
+0.34 0.7 0.12
+0.36 0.7 0.12
+0.64 0.7 0.12
+0.66 0.7 0.12
+0.68 0.7 0.12
+0.7 0.7 0.12
+0.72 0.7 0.12
+0.74 0.7 0.12
+0.28 0.72 0.12
+0.3 0.72 0.12
+0.32 0.72 0.12
+0.34 0.72 0.12
+0.36 0.72 0.12
+0.38 0.72 0.12
+0.4 0.72 0.12
+0.6 0.72 0.12
+0.62 0.72 0.12
+0.64 0.72 0.12
+0.66 0.72 0.12
+0.68 0.72 0.12
+0.7 0.72 0.12
+0.72 0.72 0.12
+0.3 0.74 0.12
+0.32 0.74 0.12
+0.34 0.74 0.12
+0.36 0.74 0.12
+0.38 0.74 0.12
+0.4 0.74 0.12
+0.42 0.74 0.12
+0.44 0.74 0.12
+0.46 0.74 0.12
+0.54 0.74 0.12
+0.56 0.74 0.12
+0.58 0.74 0.12
+0.6 0.74 0.12
+0.62 0.74 0.12
+0.64 0.74 0.12
+0.66 0.74 0.12
+0.68 0.74 0.12
+0.7 0.74 0.12
+0.32 0.76 0.12
+0.34 0.76 0.12
+0.36 0.76 0.12
+0.38 0.76 0.12
+0.4 0.76 0.12
+0.42 0.76 0.12
+0.44 0.76 0.12
+0.46 0.76 0.12
+0.48 0.76 0.12
+0.5 0.76 0.12
+0.52 0.76 0.12
+0.54 0.76 0.12
+0.56 0.76 0.12
+0.58 0.76 0.12
+0.6 0.76 0.12
+0.62 0.76 0.12
+0.64 0.76 0.12
+0.66 0.76 0.12
+0.68 0.76 0.12
+0.34 0.78 0.12
+0.36 0.78 0.12
+0.38 0.78 0.12
+0.4 0.78 0.12
+0.42 0.78 0.12
+0.44 0.78 0.12
+0.46 0.78 0.12
+0.48 0.78 0.12
+0.5 0.78 0.12
+0.52 0.78 0.12
+0.54 0.78 0.12
+0.56 0.78 0.12
+0.58 0.78 0.12
+0.6 0.78 0.12
+0.62 0.78 0.12
+0.64 0.78 0.12
+0.66 0.78 0.12
+0.38 0.8 0.12
+0.4 0.8 0.12
+0.42 0.8 0.12
+0.44 0.8 0.12
+0.46 0.8 0.12
+0.48 0.8 0.12
+0.5 0.8 0.12
+0.52 0.8 0.12
+0.54 0.8 0.12
+0.56 0.8 0.12
+0.58 0.8 0.12
+0.6 0.8 0.12
+0.62 0.8 0.12
+0.46 0.82 0.12
+0.48 0.82 0.12
+0.5 0.82 0.12
+0.52 0.82 0.12
+0.54 0.82 0.12
+0.44 0.16 0.14
+0.46 0.16 0.14
+0.48 0.16 0.14
+0.5 0.16 0.14
+0.52 0.16 0.14
+0.54 0.16 0.14
+0.56 0.16 0.14
+0.38 0.18 0.14
+0.4 0.18 0.14
+0.42 0.18 0.14
+0.44 0.18 0.14
+0.46 0.18 0.14
+0.48 0.18 0.14
+0.5 0.18 0.14
+0.52 0.18 0.14
+0.54 0.18 0.14
+0.56 0.18 0.14
+0.58 0.18 0.14
+0.6 0.18 0.14
+0.62 0.18 0.14
+0.34 0.2 0.14
+0.36 0.2 0.14
+0.38 0.2 0.14
+0.4 0.2 0.14
+0.42 0.2 0.14
+0.44 0.2 0.14
+0.46 0.2 0.14
+0.48 0.2 0.14
+0.5 0.2 0.14
+0.52 0.2 0.14
+0.54 0.2 0.14
+0.56 0.2 0.14
+0.58 0.2 0.14
+0.6 0.2 0.14
+0.62 0.2 0.14
+0.64 0.2 0.14
+0.66 0.2 0.14
+0.3 0.22 0.14
+0.32 0.22 0.14
+0.34 0.22 0.14
+0.36 0.22 0.14
+0.38 0.22 0.14
+0.4 0.22 0.14
+0.42 0.22 0.14
+0.44 0.22 0.14
+0.46 0.22 0.14
+0.48 0.22 0.14
+0.5 0.22 0.14
+0.52 0.22 0.14
+0.54 0.22 0.14
+0.56 0.22 0.14
+0.58 0.22 0.14
+0.6 0.22 0.14
+0.62 0.22 0.14
+0.64 0.22 0.14
+0.66 0.22 0.14
+0.68 0.22 0.14
+0.7 0.22 0.14
+0.28 0.24 0.14
+0.3 0.24 0.14
+0.32 0.24 0.14
+0.34 0.24 0.14
+0.36 0.24 0.14
+0.38 0.24 0.14
+0.4 0.24 0.14
+0.42 0.24 0.14
+0.58 0.24 0.14
+0.6 0.24 0.14
+0.62 0.24 0.14
+0.64 0.24 0.14
+0.66 0.24 0.14
+0.68 0.24 0.14
+0.7 0.24 0.14
+0.72 0.24 0.14
+0.26 0.26 0.14
+0.28 0.26 0.14
+0.3 0.26 0.14
+0.32 0.26 0.14
+0.34 0.26 0.14
+0.36 0.26 0.14
+0.64 0.26 0.14
+0.66 0.26 0.14
+0.68 0.26 0.14
+0.7 0.26 0.14
+0.72 0.26 0.14
+0.74 0.26 0.14
+0.24 0.28 0.14
+0.26 0.28 0.14
+0.28 0.28 0.14
+0.3 0.28 0.14
+0.32 0.28 0.14
+0.34 0.28 0.14
+0.66 0.28 0.14
+0.68 0.28 0.14
+0.7 0.28 0.14
+0.72 0.28 0.14
+0.74 0.28 0.14
+0.76 0.28 0.14
+0.22 0.3 0.14
+0.24 0.3 0.14
+0.26 0.3 0.14
+0.28 0.3 0.14
+0.3 0.3 0.14
+0.7 0.3 0.14
+0.72 0.3 0.14
+0.74 0.3 0.14
+0.76 0.3 0.14
+0.78 0.3 0.14
+0.22 0.32 0.14
+0.24 0.32 0.14
+0.26 0.32 0.14
+0.28 0.32 0.14
+0.72 0.32 0.14
+0.74 0.32 0.14
+0.76 0.32 0.14
+0.78 0.32 0.14
+0.2 0.34 0.14
+0.22 0.34 0.14
+0.24 0.34 0.14
+0.26 0.34 0.14
+0.28 0.34 0.14
+0.72 0.34 0.14
+0.74 0.34 0.14
+0.76 0.34 0.14
+0.78 0.34 0.14
+0.8 0.34 0.14
+0.2 0.36 0.14
+0.22 0.36 0.14
+0.24 0.36 0.14
+0.26 0.36 0.14
+0.74 0.36 0.14
+0.76 0.36 0.14
+0.78 0.36 0.14
+0.8 0.36 0.14
+0.18 0.38 0.14
+0.2 0.38 0.14
+0.22 0.38 0.14
+0.24 0.38 0.14
+0.76 0.38 0.14
+0.78 0.38 0.14
+0.8 0.38 0.14
+0.82 0.38 0.14
+0.18 0.4 0.14
+0.2 0.4 0.14
+0.22 0.4 0.14
+0.24 0.4 0.14
+0.76 0.4 0.14
+0.78 0.4 0.14
+0.8 0.4 0.14
+0.82 0.4 0.14
+0.18 0.42 0.14
+0.2 0.42 0.14
+0.22 0.42 0.14
+0.24 0.42 0.14
+0.76 0.42 0.14
+0.78 0.42 0.14
+0.8 0.42 0.14
+0.82 0.42 0.14
+0.16 0.44 0.14
+0.18 0.44 0.14
+0.2 0.44 0.14
+0.22 0.44 0.14
+0.78 0.44 0.14
+0.8 0.44 0.14
+0.82 0.44 0.14
+0.84 0.44 0.14
+0.16 0.46 0.14
+0.18 0.46 0.14
+0.2 0.46 0.14
+0.22 0.46 0.14
+0.78 0.46 0.14
+0.8 0.46 0.14
+0.82 0.46 0.14
+0.84 0.46 0.14
+0.16 0.48 0.14
+0.18 0.48 0.14
+0.2 0.48 0.14
+0.22 0.48 0.14
+0.78 0.48 0.14
+0.8 0.48 0.14
+0.82 0.48 0.14
+0.84 0.48 0.14
+0.16 0.5 0.14
+0.18 0.5 0.14
+0.2 0.5 0.14
+0.22 0.5 0.14
+0.78 0.5 0.14
+0.8 0.5 0.14
+0.82 0.5 0.14
+0.84 0.5 0.14
+0.16 0.52 0.14
+0.18 0.52 0.14
+0.2 0.52 0.14
+0.22 0.52 0.14
+0.78 0.52 0.14
+0.8 0.52 0.14
+0.82 0.52 0.14
+0.84 0.52 0.14
+0.16 0.54 0.14
+0.18 0.54 0.14
+0.2 0.54 0.14
+0.22 0.54 0.14
+0.78 0.54 0.14
+0.8 0.54 0.14
+0.82 0.54 0.14
+0.84 0.54 0.14
+0.16 0.56 0.14
+0.18 0.56 0.14
+0.2 0.56 0.14
+0.22 0.56 0.14
+0.78 0.56 0.14
+0.8 0.56 0.14
+0.82 0.56 0.14
+0.84 0.56 0.14
+0.18 0.58 0.14
+0.2 0.58 0.14
+0.22 0.58 0.14
+0.24 0.58 0.14
+0.76 0.58 0.14
+0.78 0.58 0.14
+0.8 0.58 0.14
+0.82 0.58 0.14
+0.18 0.6 0.14
+0.2 0.6 0.14
+0.22 0.6 0.14
+0.24 0.6 0.14
+0.76 0.6 0.14
+0.78 0.6 0.14
+0.8 0.6 0.14
+0.82 0.6 0.14
+0.18 0.62 0.14
+0.2 0.62 0.14
+0.22 0.62 0.14
+0.24 0.62 0.14
+0.76 0.62 0.14
+0.78 0.62 0.14
+0.8 0.62 0.14
+0.82 0.62 0.14
+0.2 0.64 0.14
+0.22 0.64 0.14
+0.24 0.64 0.14
+0.26 0.64 0.14
+0.74 0.64 0.14
+0.76 0.64 0.14
+0.78 0.64 0.14
+0.8 0.64 0.14
+0.2 0.66 0.14
+0.22 0.66 0.14
+0.24 0.66 0.14
+0.26 0.66 0.14
+0.28 0.66 0.14
+0.72 0.66 0.14
+0.74 0.66 0.14
+0.76 0.66 0.14
+0.78 0.66 0.14
+0.8 0.66 0.14
+0.22 0.68 0.14
+0.24 0.68 0.14
+0.26 0.68 0.14
+0.28 0.68 0.14
+0.72 0.68 0.14
+0.74 0.68 0.14
+0.76 0.68 0.14
+0.78 0.68 0.14
+0.22 0.7 0.14
+0.24 0.7 0.14
+0.26 0.7 0.14
+0.28 0.7 0.14
+0.3 0.7 0.14
+0.7 0.7 0.14
+0.72 0.7 0.14
+0.74 0.7 0.14
+0.76 0.7 0.14
+0.78 0.7 0.14
+0.24 0.72 0.14
+0.26 0.72 0.14
+0.28 0.72 0.14
+0.3 0.72 0.14
+0.32 0.72 0.14
+0.34 0.72 0.14
+0.66 0.72 0.14
+0.68 0.72 0.14
+0.7 0.72 0.14
+0.72 0.72 0.14
+0.74 0.72 0.14
+0.76 0.72 0.14
+0.26 0.74 0.14
+0.28 0.74 0.14
+0.3 0.74 0.14
+0.32 0.74 0.14
+0.34 0.74 0.14
+0.36 0.74 0.14
+0.64 0.74 0.14
+0.66 0.74 0.14
+0.68 0.74 0.14
+0.7 0.74 0.14
+0.72 0.74 0.14
+0.74 0.74 0.14
+0.28 0.76 0.14
+0.3 0.76 0.14
+0.32 0.76 0.14
+0.34 0.76 0.14
+0.36 0.76 0.14
+0.38 0.76 0.14
+0.4 0.76 0.14
+0.42 0.76 0.14
+0.58 0.76 0.14
+0.6 0.76 0.14
+0.62 0.76 0.14
+0.64 0.76 0.14
+0.66 0.76 0.14
+0.68 0.76 0.14
+0.7 0.76 0.14
+0.72 0.76 0.14
+0.3 0.78 0.14
+0.32 0.78 0.14
+0.34 0.78 0.14
+0.36 0.78 0.14
+0.38 0.78 0.14
+0.4 0.78 0.14
+0.42 0.78 0.14
+0.44 0.78 0.14
+0.46 0.78 0.14
+0.48 0.78 0.14
+0.5 0.78 0.14
+0.52 0.78 0.14
+0.54 0.78 0.14
+0.56 0.78 0.14
+0.58 0.78 0.14
+0.6 0.78 0.14
+0.62 0.78 0.14
+0.64 0.78 0.14
+0.66 0.78 0.14
+0.68 0.78 0.14
+0.7 0.78 0.14
+0.34 0.8 0.14
+0.36 0.8 0.14
+0.38 0.8 0.14
+0.4 0.8 0.14
+0.42 0.8 0.14
+0.44 0.8 0.14
+0.46 0.8 0.14
+0.48 0.8 0.14
+0.5 0.8 0.14
+0.52 0.8 0.14
+0.54 0.8 0.14
+0.56 0.8 0.14
+0.58 0.8 0.14
+0.6 0.8 0.14
+0.62 0.8 0.14
+0.64 0.8 0.14
+0.66 0.8 0.14
+0.38 0.82 0.14
+0.4 0.82 0.14
+0.42 0.82 0.14
+0.44 0.82 0.14
+0.46 0.82 0.14
+0.48 0.82 0.14
+0.5 0.82 0.14
+0.52 0.82 0.14
+0.54 0.82 0.14
+0.56 0.82 0.14
+0.58 0.82 0.14
+0.6 0.82 0.14
+0.62 0.82 0.14
+0.44 0.84 0.14
+0.46 0.84 0.14
+0.48 0.84 0.14
+0.5 0.84 0.14
+0.52 0.84 0.14
+0.54 0.84 0.14
+0.56 0.84 0.14
+0.44 0.14 0.16
+0.46 0.14 0.16
+0.48 0.14 0.16
+0.5 0.14 0.16
+0.52 0.14 0.16
+0.54 0.14 0.16
+0.56 0.14 0.16
+0.38 0.16 0.16
+0.4 0.16 0.16
+0.42 0.16 0.16
+0.44 0.16 0.16
+0.46 0.16 0.16
+0.48 0.16 0.16
+0.5 0.16 0.16
+0.52 0.16 0.16
+0.54 0.16 0.16
+0.56 0.16 0.16
+0.58 0.16 0.16
+0.6 0.16 0.16
+0.62 0.16 0.16
+0.34 0.18 0.16
+0.36 0.18 0.16
+0.38 0.18 0.16
+0.4 0.18 0.16
+0.42 0.18 0.16
+0.44 0.18 0.16
+0.46 0.18 0.16
+0.48 0.18 0.16
+0.5 0.18 0.16
+0.52 0.18 0.16
+0.54 0.18 0.16
+0.56 0.18 0.16
+0.58 0.18 0.16
+0.6 0.18 0.16
+0.62 0.18 0.16
+0.64 0.18 0.16
+0.66 0.18 0.16
+0.3 0.2 0.16
+0.32 0.2 0.16
+0.34 0.2 0.16
+0.36 0.2 0.16
+0.38 0.2 0.16
+0.4 0.2 0.16
+0.42 0.2 0.16
+0.44 0.2 0.16
+0.46 0.2 0.16
+0.48 0.2 0.16
+0.5 0.2 0.16
+0.52 0.2 0.16
+0.54 0.2 0.16
+0.56 0.2 0.16
+0.58 0.2 0.16
+0.6 0.2 0.16
+0.62 0.2 0.16
+0.64 0.2 0.16
+0.66 0.2 0.16
+0.68 0.2 0.16
+0.7 0.2 0.16
+0.28 0.22 0.16
+0.3 0.22 0.16
+0.32 0.22 0.16
+0.34 0.22 0.16
+0.36 0.22 0.16
+0.38 0.22 0.16
+0.4 0.22 0.16
+0.6 0.22 0.16
+0.62 0.22 0.16
+0.64 0.22 0.16
+0.66 0.22 0.16
+0.68 0.22 0.16
+0.7 0.22 0.16
+0.72 0.22 0.16
+0.26 0.24 0.16
+0.28 0.24 0.16
+0.3 0.24 0.16
+0.32 0.24 0.16
+0.34 0.24 0.16
+0.36 0.24 0.16
+0.64 0.24 0.16
+0.66 0.24 0.16
+0.68 0.24 0.16
+0.7 0.24 0.16
+0.72 0.24 0.16
+0.74 0.24 0.16
+0.24 0.26 0.16
+0.26 0.26 0.16
+0.28 0.26 0.16
+0.3 0.26 0.16
+0.32 0.26 0.16
+0.68 0.26 0.16
+0.7 0.26 0.16
+0.72 0.26 0.16
+0.74 0.26 0.16
+0.76 0.26 0.16
+0.22 0.28 0.16
+0.24 0.28 0.16
+0.26 0.28 0.16
+0.28 0.28 0.16
+0.3 0.28 0.16
+0.7 0.28 0.16
+0.72 0.28 0.16
+0.74 0.28 0.16
+0.76 0.28 0.16
+0.78 0.28 0.16
+0.2 0.3 0.16
+0.22 0.3 0.16
+0.24 0.3 0.16
+0.26 0.3 0.16
+0.28 0.3 0.16
+0.72 0.3 0.16
+0.74 0.3 0.16
+0.76 0.3 0.16
+0.78 0.3 0.16
+0.8 0.3 0.16
+0.2 0.32 0.16
+0.22 0.32 0.16
+0.24 0.32 0.16
+0.26 0.32 0.16
+0.74 0.32 0.16
+0.76 0.32 0.16
+0.78 0.32 0.16
+0.8 0.32 0.16
+0.18 0.34 0.16
+0.2 0.34 0.16
+0.22 0.34 0.16
+0.24 0.34 0.16
+0.76 0.34 0.16
+0.78 0.34 0.16
+0.8 0.34 0.16
+0.82 0.34 0.16
+0.18 0.36 0.16
+0.2 0.36 0.16
+0.22 0.36 0.16
+0.24 0.36 0.16
+0.76 0.36 0.16
+0.78 0.36 0.16
+0.8 0.36 0.16
+0.82 0.36 0.16
+0.16 0.38 0.16
+0.18 0.38 0.16
+0.2 0.38 0.16
+0.22 0.38 0.16
+0.78 0.38 0.16
+0.8 0.38 0.16
+0.82 0.38 0.16
+0.84 0.38 0.16
+0.16 0.4 0.16
+0.18 0.4 0.16
+0.2 0.4 0.16
+0.22 0.4 0.16
+0.78 0.4 0.16
+0.8 0.4 0.16
+0.82 0.4 0.16
+0.84 0.4 0.16
+0.16 0.42 0.16
+0.18 0.42 0.16
+0.2 0.42 0.16
+0.8 0.42 0.16
+0.82 0.42 0.16
+0.84 0.42 0.16
+0.14 0.44 0.16
+0.16 0.44 0.16
+0.18 0.44 0.16
+0.2 0.44 0.16
+0.8 0.44 0.16
+0.82 0.44 0.16
+0.84 0.44 0.16
+0.86 0.44 0.16
+0.14 0.46 0.16
+0.16 0.46 0.16
+0.18 0.46 0.16
+0.2 0.46 0.16
+0.8 0.46 0.16
+0.82 0.46 0.16
+0.84 0.46 0.16
+0.86 0.46 0.16
+0.14 0.48 0.16
+0.16 0.48 0.16
+0.18 0.48 0.16
+0.2 0.48 0.16
+0.8 0.48 0.16
+0.82 0.48 0.16
+0.84 0.48 0.16
+0.86 0.48 0.16
+0.14 0.5 0.16
+0.16 0.5 0.16
+0.18 0.5 0.16
+0.2 0.5 0.16
+0.8 0.5 0.16
+0.82 0.5 0.16
+0.84 0.5 0.16
+0.86 0.5 0.16
+0.14 0.52 0.16
+0.16 0.52 0.16
+0.18 0.52 0.16
+0.2 0.52 0.16
+0.8 0.52 0.16
+0.82 0.52 0.16
+0.84 0.52 0.16
+0.86 0.52 0.16
+0.14 0.54 0.16
+0.16 0.54 0.16
+0.18 0.54 0.16
+0.2 0.54 0.16
+0.8 0.54 0.16
+0.82 0.54 0.16
+0.84 0.54 0.16
+0.86 0.54 0.16
+0.14 0.56 0.16
+0.16 0.56 0.16
+0.18 0.56 0.16
+0.2 0.56 0.16
+0.8 0.56 0.16
+0.82 0.56 0.16
+0.84 0.56 0.16
+0.86 0.56 0.16
+0.16 0.58 0.16
+0.18 0.58 0.16
+0.2 0.58 0.16
+0.8 0.58 0.16
+0.82 0.58 0.16
+0.84 0.58 0.16
+0.16 0.6 0.16
+0.18 0.6 0.16
+0.2 0.6 0.16
+0.22 0.6 0.16
+0.78 0.6 0.16
+0.8 0.6 0.16
+0.82 0.6 0.16
+0.84 0.6 0.16
+0.16 0.62 0.16
+0.18 0.62 0.16
+0.2 0.62 0.16
+0.22 0.62 0.16
+0.78 0.62 0.16
+0.8 0.62 0.16
+0.82 0.62 0.16
+0.84 0.62 0.16
+0.18 0.64 0.16
+0.2 0.64 0.16
+0.22 0.64 0.16
+0.24 0.64 0.16
+0.76 0.64 0.16
+0.78 0.64 0.16
+0.8 0.64 0.16
+0.82 0.64 0.16
+0.18 0.66 0.16
+0.2 0.66 0.16
+0.22 0.66 0.16
+0.24 0.66 0.16
+0.76 0.66 0.16
+0.78 0.66 0.16
+0.8 0.66 0.16
+0.82 0.66 0.16
+0.2 0.68 0.16
+0.22 0.68 0.16
+0.24 0.68 0.16
+0.26 0.68 0.16
+0.74 0.68 0.16
+0.76 0.68 0.16
+0.78 0.68 0.16
+0.8 0.68 0.16
+0.2 0.7 0.16
+0.22 0.7 0.16
+0.24 0.7 0.16
+0.26 0.7 0.16
+0.28 0.7 0.16
+0.72 0.7 0.16
+0.74 0.7 0.16
+0.76 0.7 0.16
+0.78 0.7 0.16
+0.8 0.7 0.16
+0.22 0.72 0.16
+0.24 0.72 0.16
+0.26 0.72 0.16
+0.28 0.72 0.16
+0.3 0.72 0.16
+0.7 0.72 0.16
+0.72 0.72 0.16
+0.74 0.72 0.16
+0.76 0.72 0.16
+0.78 0.72 0.16
+0.24 0.74 0.16
+0.26 0.74 0.16
+0.28 0.74 0.16
+0.3 0.74 0.16
+0.32 0.74 0.16
+0.68 0.74 0.16
+0.7 0.74 0.16
+0.72 0.74 0.16
+0.74 0.74 0.16
+0.76 0.74 0.16
+0.26 0.76 0.16
+0.28 0.76 0.16
+0.3 0.76 0.16
+0.32 0.76 0.16
+0.34 0.76 0.16
+0.36 0.76 0.16
+0.64 0.76 0.16
+0.66 0.76 0.16
+0.68 0.76 0.16
+0.7 0.76 0.16
+0.72 0.76 0.16
+0.74 0.76 0.16
+0.28 0.78 0.16
+0.3 0.78 0.16
+0.32 0.78 0.16
+0.34 0.78 0.16
+0.36 0.78 0.16
+0.38 0.78 0.16
+0.4 0.78 0.16
+0.6 0.78 0.16
+0.62 0.78 0.16
+0.64 0.78 0.16
+0.66 0.78 0.16
+0.68 0.78 0.16
+0.7 0.78 0.16
+0.72 0.78 0.16
+0.3 0.8 0.16
+0.32 0.8 0.16
+0.34 0.8 0.16
+0.36 0.8 0.16
+0.38 0.8 0.16
+0.4 0.8 0.16
+0.42 0.8 0.16
+0.44 0.8 0.16
+0.46 0.8 0.16
+0.48 0.8 0.16
+0.5 0.8 0.16
+0.52 0.8 0.16
+0.54 0.8 0.16
+0.56 0.8 0.16
+0.58 0.8 0.16
+0.6 0.8 0.16
+0.62 0.8 0.16
+0.64 0.8 0.16
+0.66 0.8 0.16
+0.68 0.8 0.16
+0.7 0.8 0.16
+0.34 0.82 0.16
+0.36 0.82 0.16
+0.38 0.82 0.16
+0.4 0.82 0.16
+0.42 0.82 0.16
+0.44 0.82 0.16
+0.46 0.82 0.16
+0.48 0.82 0.16
+0.5 0.82 0.16
+0.52 0.82 0.16
+0.54 0.82 0.16
+0.56 0.82 0.16
+0.58 0.82 0.16
+0.6 0.82 0.16
+0.62 0.82 0.16
+0.64 0.82 0.16
+0.66 0.82 0.16
+0.38 0.84 0.16
+0.4 0.84 0.16
+0.42 0.84 0.16
+0.44 0.84 0.16
+0.46 0.84 0.16
+0.48 0.84 0.16
+0.5 0.84 0.16
+0.52 0.84 0.16
+0.54 0.84 0.16
+0.56 0.84 0.16
+0.58 0.84 0.16
+0.6 0.84 0.16
+0.62 0.84 0.16
+0.44 0.86 0.16
+0.46 0.86 0.16
+0.48 0.86 0.16
+0.5 0.86 0.16
+0.52 0.86 0.16
+0.54 0.86 0.16
+0.56 0.86 0.16
+0.46 0.12 0.18
+0.48 0.12 0.18
+0.5 0.12 0.18
+0.52 0.12 0.18
+0.54 0.12 0.18
+0.38 0.14 0.18
+0.4 0.14 0.18
+0.42 0.14 0.18
+0.44 0.14 0.18
+0.46 0.14 0.18
+0.48 0.14 0.18
+0.5 0.14 0.18
+0.52 0.14 0.18
+0.54 0.14 0.18
+0.56 0.14 0.18
+0.58 0.14 0.18
+0.6 0.14 0.18
+0.62 0.14 0.18
+0.34 0.16 0.18
+0.36 0.16 0.18
+0.38 0.16 0.18
+0.4 0.16 0.18
+0.42 0.16 0.18
+0.44 0.16 0.18
+0.46 0.16 0.18
+0.48 0.16 0.18
+0.5 0.16 0.18
+0.52 0.16 0.18
+0.54 0.16 0.18
+0.56 0.16 0.18
+0.58 0.16 0.18
+0.6 0.16 0.18
+0.62 0.16 0.18
+0.64 0.16 0.18
+0.66 0.16 0.18
+0.3 0.18 0.18
+0.32 0.18 0.18
+0.34 0.18 0.18
+0.36 0.18 0.18
+0.38 0.18 0.18
+0.4 0.18 0.18
+0.42 0.18 0.18
+0.44 0.18 0.18
+0.46 0.18 0.18
+0.48 0.18 0.18
+0.5 0.18 0.18
+0.52 0.18 0.18
+0.54 0.18 0.18
+0.56 0.18 0.18
+0.58 0.18 0.18
+0.6 0.18 0.18
+0.62 0.18 0.18
+0.64 0.18 0.18
+0.66 0.18 0.18
+0.68 0.18 0.18
+0.7 0.18 0.18
+0.28 0.2 0.18
+0.3 0.2 0.18
+0.32 0.2 0.18
+0.34 0.2 0.18
+0.36 0.2 0.18
+0.38 0.2 0.18
+0.62 0.2 0.18
+0.64 0.2 0.18
+0.66 0.2 0.18
+0.68 0.2 0.18
+0.7 0.2 0.18
+0.72 0.2 0.18
+0.24 0.22 0.18
+0.26 0.22 0.18
+0.28 0.22 0.18
+0.3 0.22 0.18
+0.32 0.22 0.18
+0.34 0.22 0.18
+0.66 0.22 0.18
+0.68 0.22 0.18
+0.7 0.22 0.18
+0.72 0.22 0.18
+0.74 0.22 0.18
+0.76 0.22 0.18
+0.22 0.24 0.18
+0.24 0.24 0.18
+0.26 0.24 0.18
+0.28 0.24 0.18
+0.3 0.24 0.18
+0.7 0.24 0.18
+0.72 0.24 0.18
+0.74 0.24 0.18
+0.76 0.24 0.18
+0.78 0.24 0.18
+0.22 0.26 0.18
+0.24 0.26 0.18
+0.26 0.26 0.18
+0.28 0.26 0.18
+0.72 0.26 0.18
+0.74 0.26 0.18
+0.76 0.26 0.18
+0.78 0.26 0.18
+0.2 0.28 0.18
+0.22 0.28 0.18
+0.24 0.28 0.18
+0.26 0.28 0.18
+0.74 0.28 0.18
+0.76 0.28 0.18
+0.78 0.28 0.18
+0.8 0.28 0.18
+0.18 0.3 0.18
+0.2 0.3 0.18
+0.22 0.3 0.18
+0.24 0.3 0.18
+0.76 0.3 0.18
+0.78 0.3 0.18
+0.8 0.3 0.18
+0.82 0.3 0.18
+0.18 0.32 0.18
+0.2 0.32 0.18
+0.22 0.32 0.18
+0.78 0.32 0.18
+0.8 0.32 0.18
+0.82 0.32 0.18
+0.16 0.34 0.18
+0.18 0.34 0.18
+0.2 0.34 0.18
+0.22 0.34 0.18
+0.78 0.34 0.18
+0.8 0.34 0.18
+0.82 0.34 0.18
+0.84 0.34 0.18
+0.16 0.36 0.18
+0.18 0.36 0.18
+0.2 0.36 0.18
+0.8 0.36 0.18
+0.82 0.36 0.18
+0.84 0.36 0.18
+0.14 0.38 0.18
+0.16 0.38 0.18
+0.18 0.38 0.18
+0.2 0.38 0.18
+0.8 0.38 0.18
+0.82 0.38 0.18
+0.84 0.38 0.18
+0.86 0.38 0.18
+0.14 0.4 0.18
+0.16 0.4 0.18
+0.18 0.4 0.18
+0.82 0.4 0.18
+0.84 0.4 0.18
+0.86 0.4 0.18
+0.14 0.42 0.18
+0.16 0.42 0.18
+0.18 0.42 0.18
+0.82 0.42 0.18
+0.84 0.42 0.18
+0.86 0.42 0.18
+0.14 0.44 0.18
+0.16 0.44 0.18
+0.18 0.44 0.18
+0.82 0.44 0.18
+0.84 0.44 0.18
+0.86 0.44 0.18
+0.12 0.46 0.18
+0.14 0.46 0.18
+0.16 0.46 0.18
+0.18 0.46 0.18
+0.82 0.46 0.18
+0.84 0.46 0.18
+0.86 0.46 0.18
+0.88 0.46 0.18
+0.12 0.48 0.18
+0.14 0.48 0.18
+0.16 0.48 0.18
+0.18 0.48 0.18
+0.82 0.48 0.18
+0.84 0.48 0.18
+0.86 0.48 0.18
+0.88 0.48 0.18
+0.12 0.5 0.18
+0.14 0.5 0.18
+0.16 0.5 0.18
+0.18 0.5 0.18
+0.82 0.5 0.18
+0.84 0.5 0.18
+0.86 0.5 0.18
+0.88 0.5 0.18
+0.12 0.52 0.18
+0.14 0.52 0.18
+0.16 0.52 0.18
+0.18 0.52 0.18
+0.82 0.52 0.18
+0.84 0.52 0.18
+0.86 0.52 0.18
+0.88 0.52 0.18
+0.12 0.54 0.18
+0.14 0.54 0.18
+0.16 0.54 0.18
+0.18 0.54 0.18
+0.82 0.54 0.18
+0.84 0.54 0.18
+0.86 0.54 0.18
+0.88 0.54 0.18
+0.14 0.56 0.18
+0.16 0.56 0.18
+0.18 0.56 0.18
+0.82 0.56 0.18
+0.84 0.56 0.18
+0.86 0.56 0.18
+0.14 0.58 0.18
+0.16 0.58 0.18
+0.18 0.58 0.18
+0.82 0.58 0.18
+0.84 0.58 0.18
+0.86 0.58 0.18
+0.14 0.6 0.18
+0.16 0.6 0.18
+0.18 0.6 0.18
+0.82 0.6 0.18
+0.84 0.6 0.18
+0.86 0.6 0.18
+0.14 0.62 0.18
+0.16 0.62 0.18
+0.18 0.62 0.18
+0.2 0.62 0.18
+0.8 0.62 0.18
+0.82 0.62 0.18
+0.84 0.62 0.18
+0.86 0.62 0.18
+0.16 0.64 0.18
+0.18 0.64 0.18
+0.2 0.64 0.18
+0.8 0.64 0.18
+0.82 0.64 0.18
+0.84 0.64 0.18
+0.16 0.66 0.18
+0.18 0.66 0.18
+0.2 0.66 0.18
+0.22 0.66 0.18
+0.78 0.66 0.18
+0.8 0.66 0.18
+0.82 0.66 0.18
+0.84 0.66 0.18
+0.18 0.68 0.18
+0.2 0.68 0.18
+0.22 0.68 0.18
+0.78 0.68 0.18
+0.8 0.68 0.18
+0.82 0.68 0.18
+0.18 0.7 0.18
+0.2 0.7 0.18
+0.22 0.7 0.18
+0.24 0.7 0.18
+0.76 0.7 0.18
+0.78 0.7 0.18
+0.8 0.7 0.18
+0.82 0.7 0.18
+0.2 0.72 0.18
+0.22 0.72 0.18
+0.24 0.72 0.18
+0.26 0.72 0.18
+0.74 0.72 0.18
+0.76 0.72 0.18
+0.78 0.72 0.18
+0.8 0.72 0.18
+0.22 0.74 0.18
+0.24 0.74 0.18
+0.26 0.74 0.18
+0.28 0.74 0.18
+0.72 0.74 0.18
+0.74 0.74 0.18
+0.76 0.74 0.18
+0.78 0.74 0.18
+0.22 0.76 0.18
+0.24 0.76 0.18
+0.26 0.76 0.18
+0.28 0.76 0.18
+0.3 0.76 0.18
+0.7 0.76 0.18
+0.72 0.76 0.18
+0.74 0.76 0.18
+0.76 0.76 0.18
+0.78 0.76 0.18
+0.24 0.78 0.18
+0.26 0.78 0.18
+0.28 0.78 0.18
+0.3 0.78 0.18
+0.32 0.78 0.18
+0.34 0.78 0.18
+0.66 0.78 0.18
+0.68 0.78 0.18
+0.7 0.78 0.18
+0.72 0.78 0.18
+0.74 0.78 0.18
+0.76 0.78 0.18
+0.28 0.8 0.18
+0.3 0.8 0.18
+0.32 0.8 0.18
+0.34 0.8 0.18
+0.36 0.8 0.18
+0.38 0.8 0.18
+0.62 0.8 0.18
+0.64 0.8 0.18
+0.66 0.8 0.18
+0.68 0.8 0.18
+0.7 0.8 0.18
+0.72 0.8 0.18
+0.3 0.82 0.18
+0.32 0.82 0.18
+0.34 0.82 0.18
+0.36 0.82 0.18
+0.38 0.82 0.18
+0.4 0.82 0.18
+0.42 0.82 0.18
+0.44 0.82 0.18
+0.46 0.82 0.18
+0.48 0.82 0.18
+0.5 0.82 0.18
+0.52 0.82 0.18
+0.54 0.82 0.18
+0.56 0.82 0.18
+0.58 0.82 0.18
+0.6 0.82 0.18
+0.62 0.82 0.18
+0.64 0.82 0.18
+0.66 0.82 0.18
+0.68 0.82 0.18
+0.7 0.82 0.18
+0.34 0.84 0.18
+0.36 0.84 0.18
+0.38 0.84 0.18
+0.4 0.84 0.18
+0.42 0.84 0.18
+0.44 0.84 0.18
+0.46 0.84 0.18
+0.48 0.84 0.18
+0.5 0.84 0.18
+0.52 0.84 0.18
+0.54 0.84 0.18
+0.56 0.84 0.18
+0.58 0.84 0.18
+0.6 0.84 0.18
+0.62 0.84 0.18
+0.64 0.84 0.18
+0.66 0.84 0.18
+0.38 0.86 0.18
+0.4 0.86 0.18
+0.42 0.86 0.18
+0.44 0.86 0.18
+0.46 0.86 0.18
+0.48 0.86 0.18
+0.5 0.86 0.18
+0.52 0.86 0.18
+0.54 0.86 0.18
+0.56 0.86 0.18
+0.58 0.86 0.18
+0.6 0.86 0.18
+0.62 0.86 0.18
+0.46 0.88 0.18
+0.48 0.88 0.18
+0.5 0.88 0.18
+0.52 0.88 0.18
+0.54 0.88 0.18
+0.38 0.12 0.2
+0.4 0.12 0.2
+0.42 0.12 0.2
+0.44 0.12 0.2
+0.46 0.12 0.2
+0.48 0.12 0.2
+0.5 0.12 0.2
+0.52 0.12 0.2
+0.54 0.12 0.2
+0.56 0.12 0.2
+0.58 0.12 0.2
+0.6 0.12 0.2
+0.62 0.12 0.2
+0.34 0.14 0.2
+0.36 0.14 0.2
+0.38 0.14 0.2
+0.4 0.14 0.2
+0.42 0.14 0.2
+0.44 0.14 0.2
+0.46 0.14 0.2
+0.48 0.14 0.2
+0.5 0.14 0.2
+0.52 0.14 0.2
+0.54 0.14 0.2
+0.56 0.14 0.2
+0.58 0.14 0.2
+0.6 0.14 0.2
+0.62 0.14 0.2
+0.64 0.14 0.2
+0.66 0.14 0.2
+0.3 0.16 0.2
+0.32 0.16 0.2
+0.34 0.16 0.2
+0.36 0.16 0.2
+0.38 0.16 0.2
+0.4 0.16 0.2
+0.42 0.16 0.2
+0.44 0.16 0.2
+0.46 0.16 0.2
+0.48 0.16 0.2
+0.5 0.16 0.2
+0.52 0.16 0.2
+0.54 0.16 0.2
+0.56 0.16 0.2
+0.58 0.16 0.2
+0.6 0.16 0.2
+0.62 0.16 0.2
+0.64 0.16 0.2
+0.66 0.16 0.2
+0.68 0.16 0.2
+0.7 0.16 0.2
+0.28 0.18 0.2
+0.3 0.18 0.2
+0.32 0.18 0.2
+0.34 0.18 0.2
+0.36 0.18 0.2
+0.38 0.18 0.2
+0.62 0.18 0.2
+0.64 0.18 0.2
+0.66 0.18 0.2
+0.68 0.18 0.2
+0.7 0.18 0.2
+0.72 0.18 0.2
+0.24 0.2 0.2
+0.26 0.2 0.2
+0.28 0.2 0.2
+0.3 0.2 0.2
+0.32 0.2 0.2
+0.34 0.2 0.2
+0.66 0.2 0.2
+0.68 0.2 0.2
+0.7 0.2 0.2
+0.72 0.2 0.2
+0.74 0.2 0.2
+0.76 0.2 0.2
+0.22 0.22 0.2
+0.24 0.22 0.2
+0.26 0.22 0.2
+0.28 0.22 0.2
+0.3 0.22 0.2
+0.7 0.22 0.2
+0.72 0.22 0.2
+0.74 0.22 0.2
+0.76 0.22 0.2
+0.78 0.22 0.2
+0.2 0.24 0.2
+0.22 0.24 0.2
+0.24 0.24 0.2
+0.26 0.24 0.2
+0.28 0.24 0.2
+0.72 0.24 0.2
+0.74 0.24 0.2
+0.76 0.24 0.2
+0.78 0.24 0.2
+0.8 0.24 0.2
+0.2 0.26 0.2
+0.22 0.26 0.2
+0.24 0.26 0.2
+0.26 0.26 0.2
+0.74 0.26 0.2
+0.76 0.26 0.2
+0.78 0.26 0.2
+0.8 0.26 0.2
+0.18 0.28 0.2
+0.2 0.28 0.2
+0.22 0.28 0.2
+0.24 0.28 0.2
+0.76 0.28 0.2
+0.78 0.28 0.2
+0.8 0.28 0.2
+0.82 0.28 0.2
+0.16 0.3 0.2
+0.18 0.3 0.2
+0.2 0.3 0.2
+0.22 0.3 0.2
+0.78 0.3 0.2
+0.8 0.3 0.2
+0.82 0.3 0.2
+0.84 0.3 0.2
+0.16 0.32 0.2
+0.18 0.32 0.2
+0.2 0.32 0.2
+0.8 0.32 0.2
+0.82 0.32 0.2
+0.84 0.32 0.2
+0.14 0.34 0.2
+0.16 0.34 0.2
+0.18 0.34 0.2
+0.2 0.34 0.2
+0.8 0.34 0.2
+0.82 0.34 0.2
+0.84 0.34 0.2
+0.86 0.34 0.2
+0.14 0.36 0.2
+0.16 0.36 0.2
+0.18 0.36 0.2
+0.82 0.36 0.2
+0.84 0.36 0.2
+0.86 0.36 0.2
+0.12 0.38 0.2
+0.14 0.38 0.2
+0.16 0.38 0.2
+0.18 0.38 0.2
+0.82 0.38 0.2
+0.84 0.38 0.2
+0.86 0.38 0.2
+0.88 0.38 0.2
+0.12 0.4 0.2
+0.14 0.4 0.2
+0.16 0.4 0.2
+0.84 0.4 0.2
+0.86 0.4 0.2
+0.88 0.4 0.2
+0.12 0.42 0.2
+0.14 0.42 0.2
+0.16 0.42 0.2
+0.84 0.42 0.2
+0.86 0.42 0.2
+0.88 0.42 0.2
+0.12 0.44 0.2
+0.14 0.44 0.2
+0.16 0.44 0.2
+0.84 0.44 0.2
+0.86 0.44 0.2
+0.88 0.44 0.2
+0.12 0.46 0.2
+0.14 0.46 0.2
+0.16 0.46 0.2
+0.84 0.46 0.2
+0.86 0.46 0.2
+0.88 0.46 0.2
+0.12 0.48 0.2
+0.14 0.48 0.2
+0.16 0.48 0.2
+0.84 0.48 0.2
+0.86 0.48 0.2
+0.88 0.48 0.2
+0.12 0.5 0.2
+0.14 0.5 0.2
+0.16 0.5 0.2
+0.84 0.5 0.2
+0.86 0.5 0.2
+0.88 0.5 0.2
+0.12 0.52 0.2
+0.14 0.52 0.2
+0.16 0.52 0.2
+0.84 0.52 0.2
+0.86 0.52 0.2
+0.88 0.52 0.2
+0.12 0.54 0.2
+0.14 0.54 0.2
+0.16 0.54 0.2
+0.84 0.54 0.2
+0.86 0.54 0.2
+0.88 0.54 0.2
+0.12 0.56 0.2
+0.14 0.56 0.2
+0.16 0.56 0.2
+0.84 0.56 0.2
+0.86 0.56 0.2
+0.88 0.56 0.2
+0.12 0.58 0.2
+0.14 0.58 0.2
+0.16 0.58 0.2
+0.84 0.58 0.2
+0.86 0.58 0.2
+0.88 0.58 0.2
+0.12 0.6 0.2
+0.14 0.6 0.2
+0.16 0.6 0.2
+0.84 0.6 0.2
+0.86 0.6 0.2
+0.88 0.6 0.2
+0.12 0.62 0.2
+0.14 0.62 0.2
+0.16 0.62 0.2
+0.18 0.62 0.2
+0.82 0.62 0.2
+0.84 0.62 0.2
+0.86 0.62 0.2
+0.88 0.62 0.2
+0.14 0.64 0.2
+0.16 0.64 0.2
+0.18 0.64 0.2
+0.82 0.64 0.2
+0.84 0.64 0.2
+0.86 0.64 0.2
+0.14 0.66 0.2
+0.16 0.66 0.2
+0.18 0.66 0.2
+0.2 0.66 0.2
+0.8 0.66 0.2
+0.82 0.66 0.2
+0.84 0.66 0.2
+0.86 0.66 0.2
+0.16 0.68 0.2
+0.18 0.68 0.2
+0.2 0.68 0.2
+0.8 0.68 0.2
+0.82 0.68 0.2
+0.84 0.68 0.2
+0.16 0.7 0.2
+0.18 0.7 0.2
+0.2 0.7 0.2
+0.22 0.7 0.2
+0.78 0.7 0.2
+0.8 0.7 0.2
+0.82 0.7 0.2
+0.84 0.7 0.2
+0.18 0.72 0.2
+0.2 0.72 0.2
+0.22 0.72 0.2
+0.24 0.72 0.2
+0.76 0.72 0.2
+0.78 0.72 0.2
+0.8 0.72 0.2
+0.82 0.72 0.2
+0.2 0.74 0.2
+0.22 0.74 0.2
+0.24 0.74 0.2
+0.26 0.74 0.2
+0.74 0.74 0.2
+0.76 0.74 0.2
+0.78 0.74 0.2
+0.8 0.74 0.2
+0.2 0.76 0.2
+0.22 0.76 0.2
+0.24 0.76 0.2
+0.26 0.76 0.2
+0.28 0.76 0.2
+0.72 0.76 0.2
+0.74 0.76 0.2
+0.76 0.76 0.2
+0.78 0.76 0.2
+0.8 0.76 0.2
+0.22 0.78 0.2
+0.24 0.78 0.2
+0.26 0.78 0.2
+0.28 0.78 0.2
+0.3 0.78 0.2
+0.7 0.78 0.2
+0.72 0.78 0.2
+0.74 0.78 0.2
+0.76 0.78 0.2
+0.78 0.78 0.2
+0.24 0.8 0.2
+0.26 0.8 0.2
+0.28 0.8 0.2
+0.3 0.8 0.2
+0.32 0.8 0.2
+0.34 0.8 0.2
+0.66 0.8 0.2
+0.68 0.8 0.2
+0.7 0.8 0.2
+0.72 0.8 0.2
+0.74 0.8 0.2
+0.76 0.8 0.2
+0.28 0.82 0.2
+0.3 0.82 0.2
+0.32 0.82 0.2
+0.34 0.82 0.2
+0.36 0.82 0.2
+0.38 0.82 0.2
+0.62 0.82 0.2
+0.64 0.82 0.2
+0.66 0.82 0.2
+0.68 0.82 0.2
+0.7 0.82 0.2
+0.72 0.82 0.2
+0.3 0.84 0.2
+0.32 0.84 0.2
+0.34 0.84 0.2
+0.36 0.84 0.2
+0.38 0.84 0.2
+0.4 0.84 0.2
+0.42 0.84 0.2
+0.44 0.84 0.2
+0.46 0.84 0.2
+0.48 0.84 0.2
+0.5 0.84 0.2
+0.52 0.84 0.2
+0.54 0.84 0.2
+0.56 0.84 0.2
+0.58 0.84 0.2
+0.6 0.84 0.2
+0.62 0.84 0.2
+0.64 0.84 0.2
+0.66 0.84 0.2
+0.68 0.84 0.2
+0.7 0.84 0.2
+0.34 0.86 0.2
+0.36 0.86 0.2
+0.38 0.86 0.2
+0.4 0.86 0.2
+0.42 0.86 0.2
+0.44 0.86 0.2
+0.46 0.86 0.2
+0.48 0.86 0.2
+0.5 0.86 0.2
+0.52 0.86 0.2
+0.54 0.86 0.2
+0.56 0.86 0.2
+0.58 0.86 0.2
+0.6 0.86 0.2
+0.62 0.86 0.2
+0.64 0.86 0.2
+0.66 0.86 0.2
+0.38 0.88 0.2
+0.4 0.88 0.2
+0.42 0.88 0.2
+0.44 0.88 0.2
+0.46 0.88 0.2
+0.48 0.88 0.2
+0.5 0.88 0.2
+0.52 0.88 0.2
+0.54 0.88 0.2
+0.56 0.88 0.2
+0.58 0.88 0.2
+0.6 0.88 0.2
+0.62 0.88 0.2
+0.4 0.1 0.22
+0.42 0.1 0.22
+0.44 0.1 0.22
+0.46 0.1 0.22
+0.48 0.1 0.22
+0.5 0.1 0.22
+0.52 0.1 0.22
+0.54 0.1 0.22
+0.56 0.1 0.22
+0.58 0.1 0.22
+0.6 0.1 0.22
+0.34 0.12 0.22
+0.36 0.12 0.22
+0.38 0.12 0.22
+0.4 0.12 0.22
+0.42 0.12 0.22
+0.44 0.12 0.22
+0.46 0.12 0.22
+0.48 0.12 0.22
+0.5 0.12 0.22
+0.52 0.12 0.22
+0.54 0.12 0.22
+0.56 0.12 0.22
+0.58 0.12 0.22
+0.6 0.12 0.22
+0.62 0.12 0.22
+0.64 0.12 0.22
+0.66 0.12 0.22
+0.3 0.14 0.22
+0.32 0.14 0.22
+0.34 0.14 0.22
+0.36 0.14 0.22
+0.38 0.14 0.22
+0.4 0.14 0.22
+0.42 0.14 0.22
+0.44 0.14 0.22
+0.46 0.14 0.22
+0.48 0.14 0.22
+0.5 0.14 0.22
+0.52 0.14 0.22
+0.54 0.14 0.22
+0.56 0.14 0.22
+0.58 0.14 0.22
+0.6 0.14 0.22
+0.62 0.14 0.22
+0.64 0.14 0.22
+0.66 0.14 0.22
+0.68 0.14 0.22
+0.7 0.14 0.22
+0.28 0.16 0.22
+0.3 0.16 0.22
+0.32 0.16 0.22
+0.34 0.16 0.22
+0.36 0.16 0.22
+0.38 0.16 0.22
+0.4 0.16 0.22
+0.6 0.16 0.22
+0.62 0.16 0.22
+0.64 0.16 0.22
+0.66 0.16 0.22
+0.68 0.16 0.22
+0.7 0.16 0.22
+0.72 0.16 0.22
+0.24 0.18 0.22
+0.26 0.18 0.22
+0.28 0.18 0.22
+0.3 0.18 0.22
+0.32 0.18 0.22
+0.34 0.18 0.22
+0.66 0.18 0.22
+0.68 0.18 0.22
+0.7 0.18 0.22
+0.72 0.18 0.22
+0.74 0.18 0.22
+0.76 0.18 0.22
+0.22 0.2 0.22
+0.24 0.2 0.22
+0.26 0.2 0.22
+0.28 0.2 0.22
+0.3 0.2 0.22
+0.7 0.2 0.22
+0.72 0.2 0.22
+0.74 0.2 0.22
+0.76 0.2 0.22
+0.78 0.2 0.22
+0.2 0.22 0.22
+0.22 0.22 0.22
+0.24 0.22 0.22
+0.26 0.22 0.22
+0.28 0.22 0.22
+0.72 0.22 0.22
+0.74 0.22 0.22
+0.76 0.22 0.22
+0.78 0.22 0.22
+0.8 0.22 0.22
+0.18 0.24 0.22
+0.2 0.24 0.22
+0.22 0.24 0.22
+0.24 0.24 0.22
+0.26 0.24 0.22
+0.74 0.24 0.22
+0.76 0.24 0.22
+0.78 0.24 0.22
+0.8 0.24 0.22
+0.82 0.24 0.22
+0.18 0.26 0.22
+0.2 0.26 0.22
+0.22 0.26 0.22
+0.24 0.26 0.22
+0.76 0.26 0.22
+0.78 0.26 0.22
+0.8 0.26 0.22
+0.82 0.26 0.22
+0.16 0.28 0.22
+0.18 0.28 0.22
+0.2 0.28 0.22
+0.22 0.28 0.22
+0.78 0.28 0.22
+0.8 0.28 0.22
+0.82 0.28 0.22
+0.84 0.28 0.22
+0.14 0.3 0.22
+0.16 0.3 0.22
+0.18 0.3 0.22
+0.2 0.3 0.22
+0.8 0.3 0.22
+0.82 0.3 0.22
+0.84 0.3 0.22
+0.86 0.3 0.22
+0.14 0.32 0.22
+0.16 0.32 0.22
+0.18 0.32 0.22
+0.82 0.32 0.22
+0.84 0.32 0.22
+0.86 0.32 0.22
+0.12 0.34 0.22
+0.14 0.34 0.22
+0.16 0.34 0.22
+0.18 0.34 0.22
+0.82 0.34 0.22
+0.84 0.34 0.22
+0.86 0.34 0.22
+0.88 0.34 0.22
+0.12 0.36 0.22
+0.14 0.36 0.22
+0.16 0.36 0.22
+0.84 0.36 0.22
+0.86 0.36 0.22
+0.88 0.36 0.22
+0.12 0.38 0.22
+0.14 0.38 0.22
+0.16 0.38 0.22
+0.84 0.38 0.22
+0.86 0.38 0.22
+0.88 0.38 0.22
+0.1 0.4 0.22
+0.12 0.4 0.22
+0.14 0.4 0.22
+0.16 0.4 0.22
+0.84 0.4 0.22
+0.86 0.4 0.22
+0.88 0.4 0.22
+0.9 0.4 0.22
+0.1 0.42 0.22
+0.12 0.42 0.22
+0.14 0.42 0.22
+0.86 0.42 0.22
+0.88 0.42 0.22
+0.9 0.42 0.22
+0.1 0.44 0.22
+0.12 0.44 0.22
+0.14 0.44 0.22
+0.86 0.44 0.22
+0.88 0.44 0.22
+0.9 0.44 0.22
+0.1 0.46 0.22
+0.12 0.46 0.22
+0.14 0.46 0.22
+0.86 0.46 0.22
+0.88 0.46 0.22
+0.9 0.46 0.22
+0.1 0.48 0.22
+0.12 0.48 0.22
+0.14 0.48 0.22
+0.86 0.48 0.22
+0.88 0.48 0.22
+0.9 0.48 0.22
+0.1 0.5 0.22
+0.12 0.5 0.22
+0.14 0.5 0.22
+0.86 0.5 0.22
+0.88 0.5 0.22
+0.9 0.5 0.22
+0.1 0.52 0.22
+0.12 0.52 0.22
+0.14 0.52 0.22
+0.86 0.52 0.22
+0.88 0.52 0.22
+0.9 0.52 0.22
+0.1 0.54 0.22
+0.12 0.54 0.22
+0.14 0.54 0.22
+0.86 0.54 0.22
+0.88 0.54 0.22
+0.9 0.54 0.22
+0.1 0.56 0.22
+0.12 0.56 0.22
+0.14 0.56 0.22
+0.86 0.56 0.22
+0.88 0.56 0.22
+0.9 0.56 0.22
+0.1 0.58 0.22
+0.12 0.58 0.22
+0.14 0.58 0.22
+0.86 0.58 0.22
+0.88 0.58 0.22
+0.9 0.58 0.22
+0.1 0.6 0.22
+0.12 0.6 0.22
+0.14 0.6 0.22
+0.16 0.6 0.22
+0.84 0.6 0.22
+0.86 0.6 0.22
+0.88 0.6 0.22
+0.9 0.6 0.22
+0.12 0.62 0.22
+0.14 0.62 0.22
+0.16 0.62 0.22
+0.84 0.62 0.22
+0.86 0.62 0.22
+0.88 0.62 0.22
+0.12 0.64 0.22
+0.14 0.64 0.22
+0.16 0.64 0.22
+0.84 0.64 0.22
+0.86 0.64 0.22
+0.88 0.64 0.22
+0.12 0.66 0.22
+0.14 0.66 0.22
+0.16 0.66 0.22
+0.18 0.66 0.22
+0.82 0.66 0.22
+0.84 0.66 0.22
+0.86 0.66 0.22
+0.88 0.66 0.22
+0.14 0.68 0.22
+0.16 0.68 0.22
+0.18 0.68 0.22
+0.82 0.68 0.22
+0.84 0.68 0.22
+0.86 0.68 0.22
+0.14 0.7 0.22
+0.16 0.7 0.22
+0.18 0.7 0.22
+0.2 0.7 0.22
+0.8 0.7 0.22
+0.82 0.7 0.22
+0.84 0.7 0.22
+0.86 0.7 0.22
+0.16 0.72 0.22
+0.18 0.72 0.22
+0.2 0.72 0.22
+0.22 0.72 0.22
+0.78 0.72 0.22
+0.8 0.72 0.22
+0.82 0.72 0.22
+0.84 0.72 0.22
+0.18 0.74 0.22
+0.2 0.74 0.22
+0.22 0.74 0.22
+0.24 0.74 0.22
+0.76 0.74 0.22
+0.78 0.74 0.22
+0.8 0.74 0.22
+0.82 0.74 0.22
+0.18 0.76 0.22
+0.2 0.76 0.22
+0.22 0.76 0.22
+0.24 0.76 0.22
+0.26 0.76 0.22
+0.74 0.76 0.22
+0.76 0.76 0.22
+0.78 0.76 0.22
+0.8 0.76 0.22
+0.82 0.76 0.22
+0.2 0.78 0.22
+0.22 0.78 0.22
+0.24 0.78 0.22
+0.26 0.78 0.22
+0.28 0.78 0.22
+0.72 0.78 0.22
+0.74 0.78 0.22
+0.76 0.78 0.22
+0.78 0.78 0.22
+0.8 0.78 0.22
+0.22 0.8 0.22
+0.24 0.8 0.22
+0.26 0.8 0.22
+0.28 0.8 0.22
+0.3 0.8 0.22
+0.7 0.8 0.22
+0.72 0.8 0.22
+0.74 0.8 0.22
+0.76 0.8 0.22
+0.78 0.8 0.22
+0.24 0.82 0.22
+0.26 0.82 0.22
+0.28 0.82 0.22
+0.3 0.82 0.22
+0.32 0.82 0.22
+0.34 0.82 0.22
+0.66 0.82 0.22
+0.68 0.82 0.22
+0.7 0.82 0.22
+0.72 0.82 0.22
+0.74 0.82 0.22
+0.76 0.82 0.22
+0.28 0.84 0.22
+0.3 0.84 0.22
+0.32 0.84 0.22
+0.34 0.84 0.22
+0.36 0.84 0.22
+0.38 0.84 0.22
+0.4 0.84 0.22
+0.6 0.84 0.22
+0.62 0.84 0.22
+0.64 0.84 0.22
+0.66 0.84 0.22
+0.68 0.84 0.22
+0.7 0.84 0.22
+0.72 0.84 0.22
+0.3 0.86 0.22
+0.32 0.86 0.22
+0.34 0.86 0.22
+0.36 0.86 0.22
+0.38 0.86 0.22
+0.4 0.86 0.22
+0.42 0.86 0.22
+0.44 0.86 0.22
+0.46 0.86 0.22
+0.48 0.86 0.22
+0.5 0.86 0.22
+0.52 0.86 0.22
+0.54 0.86 0.22
+0.56 0.86 0.22
+0.58 0.86 0.22
+0.6 0.86 0.22
+0.62 0.86 0.22
+0.64 0.86 0.22
+0.66 0.86 0.22
+0.68 0.86 0.22
+0.7 0.86 0.22
+0.34 0.88 0.22
+0.36 0.88 0.22
+0.38 0.88 0.22
+0.4 0.88 0.22
+0.42 0.88 0.22
+0.44 0.88 0.22
+0.46 0.88 0.22
+0.48 0.88 0.22
+0.5 0.88 0.22
+0.52 0.88 0.22
+0.54 0.88 0.22
+0.56 0.88 0.22
+0.58 0.88 0.22
+0.6 0.88 0.22
+0.62 0.88 0.22
+0.64 0.88 0.22
+0.66 0.88 0.22
+0.4 0.9 0.22
+0.42 0.9 0.22
+0.44 0.9 0.22
+0.46 0.9 0.22
+0.48 0.9 0.22
+0.5 0.9 0.22
+0.52 0.9 0.22
+0.54 0.9 0.22
+0.56 0.9 0.22
+0.58 0.9 0.22
+0.6 0.9 0.22
+0.44 0.08 0.24
+0.46 0.08 0.24
+0.48 0.08 0.24
+0.5 0.08 0.24
+0.52 0.08 0.24
+0.54 0.08 0.24
+0.56 0.08 0.24
+0.36 0.1 0.24
+0.38 0.1 0.24
+0.4 0.1 0.24
+0.42 0.1 0.24
+0.44 0.1 0.24
+0.46 0.1 0.24
+0.48 0.1 0.24
+0.5 0.1 0.24
+0.52 0.1 0.24
+0.54 0.1 0.24
+0.56 0.1 0.24
+0.58 0.1 0.24
+0.6 0.1 0.24
+0.62 0.1 0.24
+0.64 0.1 0.24
+0.32 0.12 0.24
+0.34 0.12 0.24
+0.36 0.12 0.24
+0.38 0.12 0.24
+0.4 0.12 0.24
+0.42 0.12 0.24
+0.44 0.12 0.24
+0.46 0.12 0.24
+0.48 0.12 0.24
+0.5 0.12 0.24
+0.52 0.12 0.24
+0.54 0.12 0.24
+0.56 0.12 0.24
+0.58 0.12 0.24
+0.6 0.12 0.24
+0.62 0.12 0.24
+0.64 0.12 0.24
+0.66 0.12 0.24
+0.68 0.12 0.24
+0.28 0.14 0.24
+0.3 0.14 0.24
+0.32 0.14 0.24
+0.34 0.14 0.24
+0.36 0.14 0.24
+0.38 0.14 0.24
+0.4 0.14 0.24
+0.42 0.14 0.24
+0.58 0.14 0.24
+0.6 0.14 0.24
+0.62 0.14 0.24
+0.64 0.14 0.24
+0.66 0.14 0.24
+0.68 0.14 0.24
+0.7 0.14 0.24
+0.72 0.14 0.24
+0.26 0.16 0.24
+0.28 0.16 0.24
+0.3 0.16 0.24
+0.32 0.16 0.24
+0.34 0.16 0.24
+0.36 0.16 0.24
+0.64 0.16 0.24
+0.66 0.16 0.24
+0.68 0.16 0.24
+0.7 0.16 0.24
+0.72 0.16 0.24
+0.74 0.16 0.24
+0.22 0.18 0.24
+0.24 0.18 0.24
+0.26 0.18 0.24
+0.28 0.18 0.24
+0.3 0.18 0.24
+0.7 0.18 0.24
+0.72 0.18 0.24
+0.74 0.18 0.24
+0.76 0.18 0.24
+0.78 0.18 0.24
+0.2 0.2 0.24
+0.22 0.2 0.24
+0.24 0.2 0.24
+0.26 0.2 0.24
+0.28 0.2 0.24
+0.72 0.2 0.24
+0.74 0.2 0.24
+0.76 0.2 0.24
+0.78 0.2 0.24
+0.8 0.2 0.24
+0.18 0.22 0.24
+0.2 0.22 0.24
+0.22 0.22 0.24
+0.24 0.22 0.24
+0.26 0.22 0.24
+0.74 0.22 0.24
+0.76 0.22 0.24
+0.78 0.22 0.24
+0.8 0.22 0.24
+0.82 0.22 0.24
+0.18 0.24 0.24
+0.2 0.24 0.24
+0.22 0.24 0.24
+0.24 0.24 0.24
+0.76 0.24 0.24
+0.78 0.24 0.24
+0.8 0.24 0.24
+0.82 0.24 0.24
+0.16 0.26 0.24
+0.18 0.26 0.24
+0.2 0.26 0.24
+0.22 0.26 0.24
+0.78 0.26 0.24
+0.8 0.26 0.24
+0.82 0.26 0.24
+0.84 0.26 0.24
+0.14 0.28 0.24
+0.16 0.28 0.24
+0.18 0.28 0.24
+0.2 0.28 0.24
+0.8 0.28 0.24
+0.82 0.28 0.24
+0.84 0.28 0.24
+0.86 0.28 0.24
+0.14 0.3 0.24
+0.16 0.3 0.24
+0.18 0.3 0.24
+0.82 0.3 0.24
+0.84 0.3 0.24
+0.86 0.3 0.24
+0.12 0.32 0.24
+0.14 0.32 0.24
+0.16 0.32 0.24
+0.84 0.32 0.24
+0.86 0.32 0.24
+0.88 0.32 0.24
+0.12 0.34 0.24
+0.14 0.34 0.24
+0.16 0.34 0.24
+0.84 0.34 0.24
+0.86 0.34 0.24
+0.88 0.34 0.24
+0.1 0.36 0.24
+0.12 0.36 0.24
+0.14 0.36 0.24
+0.16 0.36 0.24
+0.84 0.36 0.24
+0.86 0.36 0.24
+0.88 0.36 0.24
+0.9 0.36 0.24
+0.1 0.38 0.24
+0.12 0.38 0.24
+0.14 0.38 0.24
+0.86 0.38 0.24
+0.88 0.38 0.24
+0.9 0.38 0.24
+0.1 0.4 0.24
+0.12 0.4 0.24
+0.14 0.4 0.24
+0.86 0.4 0.24
+0.88 0.4 0.24
+0.9 0.4 0.24
+0.1 0.42 0.24
+0.12 0.42 0.24
+0.14 0.42 0.24
+0.86 0.42 0.24
+0.88 0.42 0.24
+0.9 0.42 0.24
+0.08 0.44 0.24
+0.1 0.44 0.24
+0.12 0.44 0.24
+0.88 0.44 0.24
+0.9 0.44 0.24
+0.92 0.44 0.24
+0.08 0.46 0.24
+0.1 0.46 0.24
+0.12 0.46 0.24
+0.88 0.46 0.24
+0.9 0.46 0.24
+0.92 0.46 0.24
+0.08 0.48 0.24
+0.1 0.48 0.24
+0.12 0.48 0.24
+0.88 0.48 0.24
+0.9 0.48 0.24
+0.92 0.48 0.24
+0.08 0.5 0.24
+0.1 0.5 0.24
+0.12 0.5 0.24
+0.88 0.5 0.24
+0.9 0.5 0.24
+0.92 0.5 0.24
+0.08 0.52 0.24
+0.1 0.52 0.24
+0.12 0.52 0.24
+0.88 0.52 0.24
+0.9 0.52 0.24
+0.92 0.52 0.24
+0.08 0.54 0.24
+0.1 0.54 0.24
+0.12 0.54 0.24
+0.88 0.54 0.24
+0.9 0.54 0.24
+0.92 0.54 0.24
+0.08 0.56 0.24
+0.1 0.56 0.24
+0.12 0.56 0.24
+0.88 0.56 0.24
+0.9 0.56 0.24
+0.92 0.56 0.24
+0.1 0.58 0.24
+0.12 0.58 0.24
+0.14 0.58 0.24
+0.86 0.58 0.24
+0.88 0.58 0.24
+0.9 0.58 0.24
+0.1 0.6 0.24
+0.12 0.6 0.24
+0.14 0.6 0.24
+0.86 0.6 0.24
+0.88 0.6 0.24
+0.9 0.6 0.24
+0.1 0.62 0.24
+0.12 0.62 0.24
+0.14 0.62 0.24
+0.86 0.62 0.24
+0.88 0.62 0.24
+0.9 0.62 0.24
+0.1 0.64 0.24
+0.12 0.64 0.24
+0.14 0.64 0.24
+0.16 0.64 0.24
+0.84 0.64 0.24
+0.86 0.64 0.24
+0.88 0.64 0.24
+0.9 0.64 0.24
+0.12 0.66 0.24
+0.14 0.66 0.24
+0.16 0.66 0.24
+0.84 0.66 0.24
+0.86 0.66 0.24
+0.88 0.66 0.24
+0.12 0.68 0.24
+0.14 0.68 0.24
+0.16 0.68 0.24
+0.84 0.68 0.24
+0.86 0.68 0.24
+0.88 0.68 0.24
+0.14 0.7 0.24
+0.16 0.7 0.24
+0.18 0.7 0.24
+0.82 0.7 0.24
+0.84 0.7 0.24
+0.86 0.7 0.24
+0.14 0.72 0.24
+0.16 0.72 0.24
+0.18 0.72 0.24
+0.2 0.72 0.24
+0.8 0.72 0.24
+0.82 0.72 0.24
+0.84 0.72 0.24
+0.86 0.72 0.24
+0.16 0.74 0.24
+0.18 0.74 0.24
+0.2 0.74 0.24
+0.22 0.74 0.24
+0.78 0.74 0.24
+0.8 0.74 0.24
+0.82 0.74 0.24
+0.84 0.74 0.24
+0.18 0.76 0.24
+0.2 0.76 0.24
+0.22 0.76 0.24
+0.24 0.76 0.24
+0.76 0.76 0.24
+0.78 0.76 0.24
+0.8 0.76 0.24
+0.82 0.76 0.24
+0.18 0.78 0.24
+0.2 0.78 0.24
+0.22 0.78 0.24
+0.24 0.78 0.24
+0.26 0.78 0.24
+0.74 0.78 0.24
+0.76 0.78 0.24
+0.78 0.78 0.24
+0.8 0.78 0.24
+0.82 0.78 0.24
+0.2 0.8 0.24
+0.22 0.8 0.24
+0.24 0.8 0.24
+0.26 0.8 0.24
+0.28 0.8 0.24
+0.72 0.8 0.24
+0.74 0.8 0.24
+0.76 0.8 0.24
+0.78 0.8 0.24
+0.8 0.8 0.24
+0.22 0.82 0.24
+0.24 0.82 0.24
+0.26 0.82 0.24
+0.28 0.82 0.24
+0.3 0.82 0.24
+0.7 0.82 0.24
+0.72 0.82 0.24
+0.74 0.82 0.24
+0.76 0.82 0.24
+0.78 0.82 0.24
+0.26 0.84 0.24
+0.28 0.84 0.24
+0.3 0.84 0.24
+0.32 0.84 0.24
+0.34 0.84 0.24
+0.36 0.84 0.24
+0.64 0.84 0.24
+0.66 0.84 0.24
+0.68 0.84 0.24
+0.7 0.84 0.24
+0.72 0.84 0.24
+0.74 0.84 0.24
+0.28 0.86 0.24
+0.3 0.86 0.24
+0.32 0.86 0.24
+0.34 0.86 0.24
+0.36 0.86 0.24
+0.38 0.86 0.24
+0.4 0.86 0.24
+0.42 0.86 0.24
+0.58 0.86 0.24
+0.6 0.86 0.24
+0.62 0.86 0.24
+0.64 0.86 0.24
+0.66 0.86 0.24
+0.68 0.86 0.24
+0.7 0.86 0.24
+0.72 0.86 0.24
+0.32 0.88 0.24
+0.34 0.88 0.24
+0.36 0.88 0.24
+0.38 0.88 0.24
+0.4 0.88 0.24
+0.42 0.88 0.24
+0.44 0.88 0.24
+0.46 0.88 0.24
+0.48 0.88 0.24
+0.5 0.88 0.24
+0.52 0.88 0.24
+0.54 0.88 0.24
+0.56 0.88 0.24
+0.58 0.88 0.24
+0.6 0.88 0.24
+0.62 0.88 0.24
+0.64 0.88 0.24
+0.66 0.88 0.24
+0.68 0.88 0.24
+0.36 0.9 0.24
+0.38 0.9 0.24
+0.4 0.9 0.24
+0.42 0.9 0.24
+0.44 0.9 0.24
+0.46 0.9 0.24
+0.48 0.9 0.24
+0.5 0.9 0.24
+0.52 0.9 0.24
+0.54 0.9 0.24
+0.56 0.9 0.24
+0.58 0.9 0.24
+0.6 0.9 0.24
+0.62 0.9 0.24
+0.64 0.9 0.24
+0.44 0.92 0.24
+0.46 0.92 0.24
+0.48 0.92 0.24
+0.5 0.92 0.24
+0.52 0.92 0.24
+0.54 0.92 0.24
+0.56 0.92 0.24
+0.38 0.08 0.26
+0.4 0.08 0.26
+0.42 0.08 0.26
+0.44 0.08 0.26
+0.46 0.08 0.26
+0.48 0.08 0.26
+0.5 0.08 0.26
+0.52 0.08 0.26
+0.54 0.08 0.26
+0.56 0.08 0.26
+0.58 0.08 0.26
+0.6 0.08 0.26
+0.62 0.08 0.26
+0.34 0.1 0.26
+0.36 0.1 0.26
+0.38 0.1 0.26
+0.4 0.1 0.26
+0.42 0.1 0.26
+0.44 0.1 0.26
+0.46 0.1 0.26
+0.48 0.1 0.26
+0.5 0.1 0.26
+0.52 0.1 0.26
+0.54 0.1 0.26
+0.56 0.1 0.26
+0.58 0.1 0.26
+0.6 0.1 0.26
+0.62 0.1 0.26
+0.64 0.1 0.26
+0.66 0.1 0.26
+0.3 0.12 0.26
+0.32 0.12 0.26
+0.34 0.12 0.26
+0.36 0.12 0.26
+0.38 0.12 0.26
+0.4 0.12 0.26
+0.42 0.12 0.26
+0.44 0.12 0.26
+0.46 0.12 0.26
+0.54 0.12 0.26
+0.56 0.12 0.26
+0.58 0.12 0.26
+0.6 0.12 0.26
+0.62 0.12 0.26
+0.64 0.12 0.26
+0.66 0.12 0.26
+0.68 0.12 0.26
+0.7 0.12 0.26
+0.26 0.14 0.26
+0.28 0.14 0.26
+0.3 0.14 0.26
+0.32 0.14 0.26
+0.34 0.14 0.26
+0.36 0.14 0.26
+0.64 0.14 0.26
+0.66 0.14 0.26
+0.68 0.14 0.26
+0.7 0.14 0.26
+0.72 0.14 0.26
+0.74 0.14 0.26
+0.24 0.16 0.26
+0.26 0.16 0.26
+0.28 0.16 0.26
+0.3 0.16 0.26
+0.32 0.16 0.26
+0.68 0.16 0.26
+0.7 0.16 0.26
+0.72 0.16 0.26
+0.74 0.16 0.26
+0.76 0.16 0.26
+0.22 0.18 0.26
+0.24 0.18 0.26
+0.26 0.18 0.26
+0.28 0.18 0.26
+0.72 0.18 0.26
+0.74 0.18 0.26
+0.76 0.18 0.26
+0.78 0.18 0.26
+0.2 0.2 0.26
+0.22 0.2 0.26
+0.24 0.2 0.26
+0.26 0.2 0.26
+0.74 0.2 0.26
+0.76 0.2 0.26
+0.78 0.2 0.26
+0.8 0.2 0.26
+0.18 0.22 0.26
+0.2 0.22 0.26
+0.22 0.22 0.26
+0.24 0.22 0.26
+0.76 0.22 0.26
+0.78 0.22 0.26
+0.8 0.22 0.26
+0.82 0.22 0.26
+0.16 0.24 0.26
+0.18 0.24 0.26
+0.2 0.24 0.26
+0.22 0.24 0.26
+0.78 0.24 0.26
+0.8 0.24 0.26
+0.82 0.24 0.26
+0.84 0.24 0.26
+0.14 0.26 0.26
+0.16 0.26 0.26
+0.18 0.26 0.26
+0.2 0.26 0.26
+0.8 0.26 0.26
+0.82 0.26 0.26
+0.84 0.26 0.26
+0.86 0.26 0.26
+0.14 0.28 0.26
+0.16 0.28 0.26
+0.18 0.28 0.26
+0.82 0.28 0.26
+0.84 0.28 0.26
+0.86 0.28 0.26
+0.12 0.3 0.26
+0.14 0.3 0.26
+0.16 0.3 0.26
+0.84 0.3 0.26
+0.86 0.3 0.26
+0.88 0.3 0.26
+0.12 0.32 0.26
+0.14 0.32 0.26
+0.16 0.32 0.26
+0.84 0.32 0.26
+0.86 0.32 0.26
+0.88 0.32 0.26
+0.1 0.34 0.26
+0.12 0.34 0.26
+0.14 0.34 0.26
+0.86 0.34 0.26
+0.88 0.34 0.26
+0.9 0.34 0.26
+0.1 0.36 0.26
+0.12 0.36 0.26
+0.14 0.36 0.26
+0.86 0.36 0.26
+0.88 0.36 0.26
+0.9 0.36 0.26
+0.08 0.38 0.26
+0.1 0.38 0.26
+0.12 0.38 0.26
+0.88 0.38 0.26
+0.9 0.38 0.26
+0.92 0.38 0.26
+0.08 0.4 0.26
+0.1 0.4 0.26
+0.12 0.4 0.26
+0.88 0.4 0.26
+0.9 0.4 0.26
+0.92 0.4 0.26
+0.08 0.42 0.26
+0.1 0.42 0.26
+0.12 0.42 0.26
+0.88 0.42 0.26
+0.9 0.42 0.26
+0.92 0.42 0.26
+0.08 0.44 0.26
+0.1 0.44 0.26
+0.12 0.44 0.26
+0.88 0.44 0.26
+0.9 0.44 0.26
+0.92 0.44 0.26
+0.08 0.46 0.26
+0.1 0.46 0.26
+0.12 0.46 0.26
+0.88 0.46 0.26
+0.9 0.46 0.26
+0.92 0.46 0.26
+0.08 0.48 0.26
+0.1 0.48 0.26
+0.9 0.48 0.26
+0.92 0.48 0.26
+0.08 0.5 0.26
+0.1 0.5 0.26
+0.9 0.5 0.26
+0.92 0.5 0.26
+0.08 0.52 0.26
+0.1 0.52 0.26
+0.9 0.52 0.26
+0.92 0.52 0.26
+0.08 0.54 0.26
+0.1 0.54 0.26
+0.12 0.54 0.26
+0.88 0.54 0.26
+0.9 0.54 0.26
+0.92 0.54 0.26
+0.08 0.56 0.26
+0.1 0.56 0.26
+0.12 0.56 0.26
+0.88 0.56 0.26
+0.9 0.56 0.26
+0.92 0.56 0.26
+0.08 0.58 0.26
+0.1 0.58 0.26
+0.12 0.58 0.26
+0.88 0.58 0.26
+0.9 0.58 0.26
+0.92 0.58 0.26
+0.08 0.6 0.26
+0.1 0.6 0.26
+0.12 0.6 0.26
+0.88 0.6 0.26
+0.9 0.6 0.26
+0.92 0.6 0.26
+0.08 0.62 0.26
+0.1 0.62 0.26
+0.12 0.62 0.26
+0.88 0.62 0.26
+0.9 0.62 0.26
+0.92 0.62 0.26
+0.1 0.64 0.26
+0.12 0.64 0.26
+0.14 0.64 0.26
+0.86 0.64 0.26
+0.88 0.64 0.26
+0.9 0.64 0.26
+0.1 0.66 0.26
+0.12 0.66 0.26
+0.14 0.66 0.26
+0.86 0.66 0.26
+0.88 0.66 0.26
+0.9 0.66 0.26
+0.12 0.68 0.26
+0.14 0.68 0.26
+0.16 0.68 0.26
+0.84 0.68 0.26
+0.86 0.68 0.26
+0.88 0.68 0.26
+0.12 0.7 0.26
+0.14 0.7 0.26
+0.16 0.7 0.26
+0.84 0.7 0.26
+0.86 0.7 0.26
+0.88 0.7 0.26
+0.14 0.72 0.26
+0.16 0.72 0.26
+0.18 0.72 0.26
+0.82 0.72 0.26
+0.84 0.72 0.26
+0.86 0.72 0.26
+0.14 0.74 0.26
+0.16 0.74 0.26
+0.18 0.74 0.26
+0.2 0.74 0.26
+0.8 0.74 0.26
+0.82 0.74 0.26
+0.84 0.74 0.26
+0.86 0.74 0.26
+0.16 0.76 0.26
+0.18 0.76 0.26
+0.2 0.76 0.26
+0.22 0.76 0.26
+0.78 0.76 0.26
+0.8 0.76 0.26
+0.82 0.76 0.26
+0.84 0.76 0.26
+0.18 0.78 0.26
+0.2 0.78 0.26
+0.22 0.78 0.26
+0.24 0.78 0.26
+0.76 0.78 0.26
+0.78 0.78 0.26
+0.8 0.78 0.26
+0.82 0.78 0.26
+0.2 0.8 0.26
+0.22 0.8 0.26
+0.24 0.8 0.26
+0.26 0.8 0.26
+0.74 0.8 0.26
+0.76 0.8 0.26
+0.78 0.8 0.26
+0.8 0.8 0.26
+0.22 0.82 0.26
+0.24 0.82 0.26
+0.26 0.82 0.26
+0.28 0.82 0.26
+0.72 0.82 0.26
+0.74 0.82 0.26
+0.76 0.82 0.26
+0.78 0.82 0.26
+0.24 0.84 0.26
+0.26 0.84 0.26
+0.28 0.84 0.26
+0.3 0.84 0.26
+0.32 0.84 0.26
+0.68 0.84 0.26
+0.7 0.84 0.26
+0.72 0.84 0.26
+0.74 0.84 0.26
+0.76 0.84 0.26
+0.26 0.86 0.26
+0.28 0.86 0.26
+0.3 0.86 0.26
+0.32 0.86 0.26
+0.34 0.86 0.26
+0.36 0.86 0.26
+0.64 0.86 0.26
+0.66 0.86 0.26
+0.68 0.86 0.26
+0.7 0.86 0.26
+0.72 0.86 0.26
+0.74 0.86 0.26
+0.3 0.88 0.26
+0.32 0.88 0.26
+0.34 0.88 0.26
+0.36 0.88 0.26
+0.38 0.88 0.26
+0.4 0.88 0.26
+0.42 0.88 0.26
+0.44 0.88 0.26
+0.46 0.88 0.26
+0.54 0.88 0.26
+0.56 0.88 0.26
+0.58 0.88 0.26
+0.6 0.88 0.26
+0.62 0.88 0.26
+0.64 0.88 0.26
+0.66 0.88 0.26
+0.68 0.88 0.26
+0.7 0.88 0.26
+0.34 0.9 0.26
+0.36 0.9 0.26
+0.38 0.9 0.26
+0.4 0.9 0.26
+0.42 0.9 0.26
+0.44 0.9 0.26
+0.46 0.9 0.26
+0.48 0.9 0.26
+0.5 0.9 0.26
+0.52 0.9 0.26
+0.54 0.9 0.26
+0.56 0.9 0.26
+0.58 0.9 0.26
+0.6 0.9 0.26
+0.62 0.9 0.26
+0.64 0.9 0.26
+0.66 0.9 0.26
+0.38 0.92 0.26
+0.4 0.92 0.26
+0.42 0.92 0.26
+0.44 0.92 0.26
+0.46 0.92 0.26
+0.48 0.92 0.26
+0.5 0.92 0.26
+0.52 0.92 0.26
+0.54 0.92 0.26
+0.56 0.92 0.26
+0.58 0.92 0.26
+0.6 0.92 0.26
+0.62 0.92 0.26
+0.42 0.06 0.28
+0.44 0.06 0.28
+0.46 0.06 0.28
+0.48 0.06 0.28
+0.5 0.06 0.28
+0.52 0.06 0.28
+0.54 0.06 0.28
+0.56 0.06 0.28
+0.58 0.06 0.28
+0.36 0.08 0.28
+0.38 0.08 0.28
+0.4 0.08 0.28
+0.42 0.08 0.28
+0.44 0.08 0.28
+0.46 0.08 0.28
+0.48 0.08 0.28
+0.5 0.08 0.28
+0.52 0.08 0.28
+0.54 0.08 0.28
+0.56 0.08 0.28
+0.58 0.08 0.28
+0.6 0.08 0.28
+0.62 0.08 0.28
+0.64 0.08 0.28
+0.3 0.1 0.28
+0.32 0.1 0.28
+0.34 0.1 0.28
+0.36 0.1 0.28
+0.38 0.1 0.28
+0.4 0.1 0.28
+0.42 0.1 0.28
+0.44 0.1 0.28
+0.46 0.1 0.28
+0.48 0.1 0.28
+0.5 0.1 0.28
+0.52 0.1 0.28
+0.54 0.1 0.28
+0.56 0.1 0.28
+0.58 0.1 0.28
+0.6 0.1 0.28
+0.62 0.1 0.28
+0.64 0.1 0.28
+0.66 0.1 0.28
+0.68 0.1 0.28
+0.7 0.1 0.28
+0.28 0.12 0.28
+0.3 0.12 0.28
+0.32 0.12 0.28
+0.34 0.12 0.28
+0.36 0.12 0.28
+0.38 0.12 0.28
+0.4 0.12 0.28
+0.6 0.12 0.28
+0.62 0.12 0.28
+0.64 0.12 0.28
+0.66 0.12 0.28
+0.68 0.12 0.28
+0.7 0.12 0.28
+0.72 0.12 0.28
+0.24 0.14 0.28
+0.26 0.14 0.28
+0.28 0.14 0.28
+0.3 0.14 0.28
+0.32 0.14 0.28
+0.34 0.14 0.28
+0.66 0.14 0.28
+0.68 0.14 0.28
+0.7 0.14 0.28
+0.72 0.14 0.28
+0.74 0.14 0.28
+0.76 0.14 0.28
+0.22 0.16 0.28
+0.24 0.16 0.28
+0.26 0.16 0.28
+0.28 0.16 0.28
+0.3 0.16 0.28
+0.7 0.16 0.28
+0.72 0.16 0.28
+0.74 0.16 0.28
+0.76 0.16 0.28
+0.78 0.16 0.28
+0.2 0.18 0.28
+0.22 0.18 0.28
+0.24 0.18 0.28
+0.26 0.18 0.28
+0.74 0.18 0.28
+0.76 0.18 0.28
+0.78 0.18 0.28
+0.8 0.18 0.28
+0.18 0.2 0.28
+0.2 0.2 0.28
+0.22 0.2 0.28
+0.24 0.2 0.28
+0.76 0.2 0.28
+0.78 0.2 0.28
+0.8 0.2 0.28
+0.82 0.2 0.28
+0.16 0.22 0.28
+0.18 0.22 0.28
+0.2 0.22 0.28
+0.22 0.22 0.28
+0.78 0.22 0.28
+0.8 0.22 0.28
+0.82 0.22 0.28
+0.84 0.22 0.28
+0.14 0.24 0.28
+0.16 0.24 0.28
+0.18 0.24 0.28
+0.2 0.24 0.28
+0.8 0.24 0.28
+0.82 0.24 0.28
+0.84 0.24 0.28
+0.86 0.24 0.28
+0.14 0.26 0.28
+0.16 0.26 0.28
+0.18 0.26 0.28
+0.82 0.26 0.28
+0.84 0.26 0.28
+0.86 0.26 0.28
+0.12 0.28 0.28
+0.14 0.28 0.28
+0.16 0.28 0.28
+0.84 0.28 0.28
+0.86 0.28 0.28
+0.88 0.28 0.28
+0.1 0.3 0.28
+0.12 0.3 0.28
+0.14 0.3 0.28
+0.16 0.3 0.28
+0.84 0.3 0.28
+0.86 0.3 0.28
+0.88 0.3 0.28
+0.9 0.3 0.28
+0.1 0.32 0.28
+0.12 0.32 0.28
+0.14 0.32 0.28
+0.86 0.32 0.28
+0.88 0.32 0.28
+0.9 0.32 0.28
+0.1 0.34 0.28
+0.12 0.34 0.28
+0.14 0.34 0.28
+0.86 0.34 0.28
+0.88 0.34 0.28
+0.9 0.34 0.28
+0.08 0.36 0.28
+0.1 0.36 0.28
+0.12 0.36 0.28
+0.88 0.36 0.28
+0.9 0.36 0.28
+0.92 0.36 0.28
+0.08 0.38 0.28
+0.1 0.38 0.28
+0.12 0.38 0.28
+0.88 0.38 0.28
+0.9 0.38 0.28
+0.92 0.38 0.28
+0.08 0.4 0.28
+0.1 0.4 0.28
+0.12 0.4 0.28
+0.88 0.4 0.28
+0.9 0.4 0.28
+0.92 0.4 0.28
+0.06 0.42 0.28
+0.08 0.42 0.28
+0.1 0.42 0.28
+0.9 0.42 0.28
+0.92 0.42 0.28
+0.94 0.42 0.28
+0.06 0.44 0.28
+0.08 0.44 0.28
+0.1 0.44 0.28
+0.9 0.44 0.28
+0.92 0.44 0.28
+0.94 0.44 0.28
+0.06 0.46 0.28
+0.08 0.46 0.28
+0.1 0.46 0.28
+0.9 0.46 0.28
+0.92 0.46 0.28
+0.94 0.46 0.28
+0.06 0.48 0.28
+0.08 0.48 0.28
+0.1 0.48 0.28
+0.9 0.48 0.28
+0.92 0.48 0.28
+0.94 0.48 0.28
+0.06 0.5 0.28
+0.08 0.5 0.28
+0.1 0.5 0.28
+0.9 0.5 0.28
+0.92 0.5 0.28
+0.94 0.5 0.28
+0.06 0.52 0.28
+0.08 0.52 0.28
+0.1 0.52 0.28
+0.9 0.52 0.28
+0.92 0.52 0.28
+0.94 0.52 0.28
+0.06 0.54 0.28
+0.08 0.54 0.28
+0.1 0.54 0.28
+0.9 0.54 0.28
+0.92 0.54 0.28
+0.94 0.54 0.28
+0.06 0.56 0.28
+0.08 0.56 0.28
+0.1 0.56 0.28
+0.9 0.56 0.28
+0.92 0.56 0.28
+0.94 0.56 0.28
+0.06 0.58 0.28
+0.08 0.58 0.28
+0.1 0.58 0.28
+0.9 0.58 0.28
+0.92 0.58 0.28
+0.94 0.58 0.28
+0.08 0.6 0.28
+0.1 0.6 0.28
+0.12 0.6 0.28
+0.88 0.6 0.28
+0.9 0.6 0.28
+0.92 0.6 0.28
+0.08 0.62 0.28
+0.1 0.62 0.28
+0.12 0.62 0.28
+0.88 0.62 0.28
+0.9 0.62 0.28
+0.92 0.62 0.28
+0.08 0.64 0.28
+0.1 0.64 0.28
+0.12 0.64 0.28
+0.88 0.64 0.28
+0.9 0.64 0.28
+0.92 0.64 0.28
+0.1 0.66 0.28
+0.12 0.66 0.28
+0.14 0.66 0.28
+0.86 0.66 0.28
+0.88 0.66 0.28
+0.9 0.66 0.28
+0.1 0.68 0.28
+0.12 0.68 0.28
+0.14 0.68 0.28
+0.86 0.68 0.28
+0.88 0.68 0.28
+0.9 0.68 0.28
+0.1 0.7 0.28
+0.12 0.7 0.28
+0.14 0.7 0.28
+0.16 0.7 0.28
+0.84 0.7 0.28
+0.86 0.7 0.28
+0.88 0.7 0.28
+0.9 0.7 0.28
+0.12 0.72 0.28
+0.14 0.72 0.28
+0.16 0.72 0.28
+0.84 0.72 0.28
+0.86 0.72 0.28
+0.88 0.72 0.28
+0.14 0.74 0.28
+0.16 0.74 0.28
+0.18 0.74 0.28
+0.82 0.74 0.28
+0.84 0.74 0.28
+0.86 0.74 0.28
+0.14 0.76 0.28
+0.16 0.76 0.28
+0.18 0.76 0.28
+0.2 0.76 0.28
+0.8 0.76 0.28
+0.82 0.76 0.28
+0.84 0.76 0.28
+0.86 0.76 0.28
+0.16 0.78 0.28
+0.18 0.78 0.28
+0.2 0.78 0.28
+0.22 0.78 0.28
+0.78 0.78 0.28
+0.8 0.78 0.28
+0.82 0.78 0.28
+0.84 0.78 0.28
+0.18 0.8 0.28
+0.2 0.8 0.28
+0.22 0.8 0.28
+0.24 0.8 0.28
+0.76 0.8 0.28
+0.78 0.8 0.28
+0.8 0.8 0.28
+0.82 0.8 0.28
+0.2 0.82 0.28
+0.22 0.82 0.28
+0.24 0.82 0.28
+0.26 0.82 0.28
+0.74 0.82 0.28
+0.76 0.82 0.28
+0.78 0.82 0.28
+0.8 0.82 0.28
+0.22 0.84 0.28
+0.24 0.84 0.28
+0.26 0.84 0.28
+0.28 0.84 0.28
+0.3 0.84 0.28
+0.7 0.84 0.28
+0.72 0.84 0.28
+0.74 0.84 0.28
+0.76 0.84 0.28
+0.78 0.84 0.28
+0.24 0.86 0.28
+0.26 0.86 0.28
+0.28 0.86 0.28
+0.3 0.86 0.28
+0.32 0.86 0.28
+0.34 0.86 0.28
+0.66 0.86 0.28
+0.68 0.86 0.28
+0.7 0.86 0.28
+0.72 0.86 0.28
+0.74 0.86 0.28
+0.76 0.86 0.28
+0.28 0.88 0.28
+0.3 0.88 0.28
+0.32 0.88 0.28
+0.34 0.88 0.28
+0.36 0.88 0.28
+0.38 0.88 0.28
+0.4 0.88 0.28
+0.6 0.88 0.28
+0.62 0.88 0.28
+0.64 0.88 0.28
+0.66 0.88 0.28
+0.68 0.88 0.28
+0.7 0.88 0.28
+0.72 0.88 0.28
+0.3 0.9 0.28
+0.32 0.9 0.28
+0.34 0.9 0.28
+0.36 0.9 0.28
+0.38 0.9 0.28
+0.4 0.9 0.28
+0.42 0.9 0.28
+0.44 0.9 0.28
+0.46 0.9 0.28
+0.48 0.9 0.28
+0.5 0.9 0.28
+0.52 0.9 0.28
+0.54 0.9 0.28
+0.56 0.9 0.28
+0.58 0.9 0.28
+0.6 0.9 0.28
+0.62 0.9 0.28
+0.64 0.9 0.28
+0.66 0.9 0.28
+0.68 0.9 0.28
+0.7 0.9 0.28
+0.36 0.92 0.28
+0.38 0.92 0.28
+0.4 0.92 0.28
+0.42 0.92 0.28
+0.44 0.92 0.28
+0.46 0.92 0.28
+0.48 0.92 0.28
+0.5 0.92 0.28
+0.52 0.92 0.28
+0.54 0.92 0.28
+0.56 0.92 0.28
+0.58 0.92 0.28
+0.6 0.92 0.28
+0.62 0.92 0.28
+0.64 0.92 0.28
+0.42 0.94 0.28
+0.44 0.94 0.28
+0.46 0.94 0.28
+0.48 0.94 0.28
+0.5 0.94 0.28
+0.52 0.94 0.28
+0.54 0.94 0.28
+0.56 0.94 0.28
+0.58 0.94 0.28
+0.38 0.06 0.3
+0.4 0.06 0.3
+0.42 0.06 0.3
+0.44 0.06 0.3
+0.46 0.06 0.3
+0.48 0.06 0.3
+0.5 0.06 0.3
+0.52 0.06 0.3
+0.54 0.06 0.3
+0.56 0.06 0.3
+0.58 0.06 0.3
+0.6 0.06 0.3
+0.62 0.06 0.3
+0.32 0.08 0.3
+0.34 0.08 0.3
+0.36 0.08 0.3
+0.38 0.08 0.3
+0.4 0.08 0.3
+0.42 0.08 0.3
+0.44 0.08 0.3
+0.46 0.08 0.3
+0.48 0.08 0.3
+0.5 0.08 0.3
+0.52 0.08 0.3
+0.54 0.08 0.3
+0.56 0.08 0.3
+0.58 0.08 0.3
+0.6 0.08 0.3
+0.62 0.08 0.3
+0.64 0.08 0.3
+0.66 0.08 0.3
+0.68 0.08 0.3
+0.28 0.1 0.3
+0.3 0.1 0.3
+0.32 0.1 0.3
+0.34 0.1 0.3
+0.36 0.1 0.3
+0.38 0.1 0.3
+0.4 0.1 0.3
+0.42 0.1 0.3
+0.44 0.1 0.3
+0.56 0.1 0.3
+0.58 0.1 0.3
+0.6 0.1 0.3
+0.62 0.1 0.3
+0.64 0.1 0.3
+0.66 0.1 0.3
+0.68 0.1 0.3
+0.7 0.1 0.3
+0.72 0.1 0.3
+0.26 0.12 0.3
+0.28 0.12 0.3
+0.3 0.12 0.3
+0.32 0.12 0.3
+0.34 0.12 0.3
+0.36 0.12 0.3
+0.64 0.12 0.3
+0.66 0.12 0.3
+0.68 0.12 0.3
+0.7 0.12 0.3
+0.72 0.12 0.3
+0.74 0.12 0.3
+0.22 0.14 0.3
+0.24 0.14 0.3
+0.26 0.14 0.3
+0.28 0.14 0.3
+0.3 0.14 0.3
+0.7 0.14 0.3
+0.72 0.14 0.3
+0.74 0.14 0.3
+0.76 0.14 0.3
+0.78 0.14 0.3
+0.2 0.16 0.3
+0.22 0.16 0.3
+0.24 0.16 0.3
+0.26 0.16 0.3
+0.28 0.16 0.3
+0.72 0.16 0.3
+0.74 0.16 0.3
+0.76 0.16 0.3
+0.78 0.16 0.3
+0.8 0.16 0.3
+0.18 0.18 0.3
+0.2 0.18 0.3
+0.22 0.18 0.3
+0.24 0.18 0.3
+0.76 0.18 0.3
+0.78 0.18 0.3
+0.8 0.18 0.3
+0.82 0.18 0.3
+0.16 0.2 0.3
+0.18 0.2 0.3
+0.2 0.2 0.3
+0.22 0.2 0.3
+0.78 0.2 0.3
+0.8 0.2 0.3
+0.82 0.2 0.3
+0.84 0.2 0.3
+0.14 0.22 0.3
+0.16 0.22 0.3
+0.18 0.22 0.3
+0.2 0.22 0.3
+0.8 0.22 0.3
+0.82 0.22 0.3
+0.84 0.22 0.3
+0.86 0.22 0.3
+0.14 0.24 0.3
+0.16 0.24 0.3
+0.18 0.24 0.3
+0.82 0.24 0.3
+0.84 0.24 0.3
+0.86 0.24 0.3
+0.12 0.26 0.3
+0.14 0.26 0.3
+0.16 0.26 0.3
+0.84 0.26 0.3
+0.86 0.26 0.3
+0.88 0.26 0.3
+0.1 0.28 0.3
+0.12 0.28 0.3
+0.14 0.28 0.3
+0.16 0.28 0.3
+0.84 0.28 0.3
+0.86 0.28 0.3
+0.88 0.28 0.3
+0.9 0.28 0.3
+0.1 0.3 0.3
+0.12 0.3 0.3
+0.14 0.3 0.3
+0.86 0.3 0.3
+0.88 0.3 0.3
+0.9 0.3 0.3
+0.08 0.32 0.3
+0.1 0.32 0.3
+0.12 0.32 0.3
+0.88 0.32 0.3
+0.9 0.32 0.3
+0.92 0.32 0.3
+0.08 0.34 0.3
+0.1 0.34 0.3
+0.12 0.34 0.3
+0.88 0.34 0.3
+0.9 0.34 0.3
+0.92 0.34 0.3
+0.08 0.36 0.3
+0.1 0.36 0.3
+0.12 0.36 0.3
+0.88 0.36 0.3
+0.9 0.36 0.3
+0.92 0.36 0.3
+0.06 0.38 0.3
+0.08 0.38 0.3
+0.1 0.38 0.3
+0.9 0.38 0.3
+0.92 0.38 0.3
+0.94 0.38 0.3
+0.06 0.4 0.3
+0.08 0.4 0.3
+0.1 0.4 0.3
+0.9 0.4 0.3
+0.92 0.4 0.3
+0.94 0.4 0.3
+0.06 0.42 0.3
+0.08 0.42 0.3
+0.1 0.42 0.3
+0.9 0.42 0.3
+0.92 0.42 0.3
+0.94 0.42 0.3
+0.06 0.44 0.3
+0.08 0.44 0.3
+0.1 0.44 0.3
+0.9 0.44 0.3
+0.92 0.44 0.3
+0.94 0.44 0.3
+0.06 0.46 0.3
+0.08 0.46 0.3
+0.92 0.46 0.3
+0.94 0.46 0.3
+0.06 0.48 0.3
+0.08 0.48 0.3
+0.92 0.48 0.3
+0.94 0.48 0.3
+0.06 0.5 0.3
+0.08 0.5 0.3
+0.92 0.5 0.3
+0.94 0.5 0.3
+0.06 0.52 0.3
+0.08 0.52 0.3
+0.92 0.52 0.3
+0.94 0.52 0.3
+0.06 0.54 0.3
+0.08 0.54 0.3
+0.92 0.54 0.3
+0.94 0.54 0.3
+0.06 0.56 0.3
+0.08 0.56 0.3
+0.1 0.56 0.3
+0.9 0.56 0.3
+0.92 0.56 0.3
+0.94 0.56 0.3
+0.06 0.58 0.3
+0.08 0.58 0.3
+0.1 0.58 0.3
+0.9 0.58 0.3
+0.92 0.58 0.3
+0.94 0.58 0.3
+0.06 0.6 0.3
+0.08 0.6 0.3
+0.1 0.6 0.3
+0.9 0.6 0.3
+0.92 0.6 0.3
+0.94 0.6 0.3
+0.06 0.62 0.3
+0.08 0.62 0.3
+0.1 0.62 0.3
+0.9 0.62 0.3
+0.92 0.62 0.3
+0.94 0.62 0.3
+0.08 0.64 0.3
+0.1 0.64 0.3
+0.12 0.64 0.3
+0.88 0.64 0.3
+0.9 0.64 0.3
+0.92 0.64 0.3
+0.08 0.66 0.3
+0.1 0.66 0.3
+0.12 0.66 0.3
+0.88 0.66 0.3
+0.9 0.66 0.3
+0.92 0.66 0.3
+0.08 0.68 0.3
+0.1 0.68 0.3
+0.12 0.68 0.3
+0.88 0.68 0.3
+0.9 0.68 0.3
+0.92 0.68 0.3
+0.1 0.7 0.3
+0.12 0.7 0.3
+0.14 0.7 0.3
+0.86 0.7 0.3
+0.88 0.7 0.3
+0.9 0.7 0.3
+0.1 0.72 0.3
+0.12 0.72 0.3
+0.14 0.72 0.3
+0.16 0.72 0.3
+0.84 0.72 0.3
+0.86 0.72 0.3
+0.88 0.72 0.3
+0.9 0.72 0.3
+0.12 0.74 0.3
+0.14 0.74 0.3
+0.16 0.74 0.3
+0.84 0.74 0.3
+0.86 0.74 0.3
+0.88 0.74 0.3
+0.14 0.76 0.3
+0.16 0.76 0.3
+0.18 0.76 0.3
+0.82 0.76 0.3
+0.84 0.76 0.3
+0.86 0.76 0.3
+0.14 0.78 0.3
+0.16 0.78 0.3
+0.18 0.78 0.3
+0.2 0.78 0.3
+0.8 0.78 0.3
+0.82 0.78 0.3
+0.84 0.78 0.3
+0.86 0.78 0.3
+0.16 0.8 0.3
+0.18 0.8 0.3
+0.2 0.8 0.3
+0.22 0.8 0.3
+0.78 0.8 0.3
+0.8 0.8 0.3
+0.82 0.8 0.3
+0.84 0.8 0.3
+0.18 0.82 0.3
+0.2 0.82 0.3
+0.22 0.82 0.3
+0.24 0.82 0.3
+0.76 0.82 0.3
+0.78 0.82 0.3
+0.8 0.82 0.3
+0.82 0.82 0.3
+0.2 0.84 0.3
+0.22 0.84 0.3
+0.24 0.84 0.3
+0.26 0.84 0.3
+0.28 0.84 0.3
+0.72 0.84 0.3
+0.74 0.84 0.3
+0.76 0.84 0.3
+0.78 0.84 0.3
+0.8 0.84 0.3
+0.22 0.86 0.3
+0.24 0.86 0.3
+0.26 0.86 0.3
+0.28 0.86 0.3
+0.3 0.86 0.3
+0.7 0.86 0.3
+0.72 0.86 0.3
+0.74 0.86 0.3
+0.76 0.86 0.3
+0.78 0.86 0.3
+0.26 0.88 0.3
+0.28 0.88 0.3
+0.3 0.88 0.3
+0.32 0.88 0.3
+0.34 0.88 0.3
+0.36 0.88 0.3
+0.64 0.88 0.3
+0.66 0.88 0.3
+0.68 0.88 0.3
+0.7 0.88 0.3
+0.72 0.88 0.3
+0.74 0.88 0.3
+0.28 0.9 0.3
+0.3 0.9 0.3
+0.32 0.9 0.3
+0.34 0.9 0.3
+0.36 0.9 0.3
+0.38 0.9 0.3
+0.4 0.9 0.3
+0.42 0.9 0.3
+0.44 0.9 0.3
+0.56 0.9 0.3
+0.58 0.9 0.3
+0.6 0.9 0.3
+0.62 0.9 0.3
+0.64 0.9 0.3
+0.66 0.9 0.3
+0.68 0.9 0.3
+0.7 0.9 0.3
+0.72 0.9 0.3
+0.32 0.92 0.3
+0.34 0.92 0.3
+0.36 0.92 0.3
+0.38 0.92 0.3
+0.4 0.92 0.3
+0.42 0.92 0.3
+0.44 0.92 0.3
+0.46 0.92 0.3
+0.48 0.92 0.3
+0.5 0.92 0.3
+0.52 0.92 0.3
+0.54 0.92 0.3
+0.56 0.92 0.3
+0.58 0.92 0.3
+0.6 0.92 0.3
+0.62 0.92 0.3
+0.64 0.92 0.3
+0.66 0.92 0.3
+0.68 0.92 0.3
+0.38 0.94 0.3
+0.4 0.94 0.3
+0.42 0.94 0.3
+0.44 0.94 0.3
+0.46 0.94 0.3
+0.48 0.94 0.3
+0.5 0.94 0.3
+0.52 0.94 0.3
+0.54 0.94 0.3
+0.56 0.94 0.3
+0.58 0.94 0.3
+0.6 0.94 0.3
+0.62 0.94 0.3
+0.44 0.04 0.32
+0.46 0.04 0.32
+0.48 0.04 0.32
+0.5 0.04 0.32
+0.52 0.04 0.32
+0.54 0.04 0.32
+0.56 0.04 0.32
+0.36 0.06 0.32
+0.38 0.06 0.32
+0.4 0.06 0.32
+0.42 0.06 0.32
+0.44 0.06 0.32
+0.46 0.06 0.32
+0.48 0.06 0.32
+0.5 0.06 0.32
+0.52 0.06 0.32
+0.54 0.06 0.32
+0.56 0.06 0.32
+0.58 0.06 0.32
+0.6 0.06 0.32
+0.62 0.06 0.32
+0.64 0.06 0.32
+0.3 0.08 0.32
+0.32 0.08 0.32
+0.34 0.08 0.32
+0.36 0.08 0.32
+0.38 0.08 0.32
+0.4 0.08 0.32
+0.42 0.08 0.32
+0.44 0.08 0.32
+0.46 0.08 0.32
+0.48 0.08 0.32
+0.5 0.08 0.32
+0.52 0.08 0.32
+0.54 0.08 0.32
+0.56 0.08 0.32
+0.58 0.08 0.32
+0.6 0.08 0.32
+0.62 0.08 0.32
+0.64 0.08 0.32
+0.66 0.08 0.32
+0.68 0.08 0.32
+0.7 0.08 0.32
+0.28 0.1 0.32
+0.3 0.1 0.32
+0.32 0.1 0.32
+0.34 0.1 0.32
+0.36 0.1 0.32
+0.38 0.1 0.32
+0.62 0.1 0.32
+0.64 0.1 0.32
+0.66 0.1 0.32
+0.68 0.1 0.32
+0.7 0.1 0.32
+0.72 0.1 0.32
+0.24 0.12 0.32
+0.26 0.12 0.32
+0.28 0.12 0.32
+0.3 0.12 0.32
+0.32 0.12 0.32
+0.68 0.12 0.32
+0.7 0.12 0.32
+0.72 0.12 0.32
+0.74 0.12 0.32
+0.76 0.12 0.32
+0.22 0.14 0.32
+0.24 0.14 0.32
+0.26 0.14 0.32
+0.28 0.14 0.32
+0.72 0.14 0.32
+0.74 0.14 0.32
+0.76 0.14 0.32
+0.78 0.14 0.32
+0.2 0.16 0.32
+0.22 0.16 0.32
+0.24 0.16 0.32
+0.26 0.16 0.32
+0.74 0.16 0.32
+0.76 0.16 0.32
+0.78 0.16 0.32
+0.8 0.16 0.32
+0.18 0.18 0.32
+0.2 0.18 0.32
+0.22 0.18 0.32
+0.78 0.18 0.32
+0.8 0.18 0.32
+0.82 0.18 0.32
+0.16 0.2 0.32
+0.18 0.2 0.32
+0.2 0.2 0.32
+0.8 0.2 0.32
+0.82 0.2 0.32
+0.84 0.2 0.32
+0.14 0.22 0.32
+0.16 0.22 0.32
+0.18 0.22 0.32
+0.82 0.22 0.32
+0.84 0.22 0.32
+0.86 0.22 0.32
+0.12 0.24 0.32
+0.14 0.24 0.32
+0.16 0.24 0.32
+0.84 0.24 0.32
+0.86 0.24 0.32
+0.88 0.24 0.32
+0.12 0.26 0.32
+0.14 0.26 0.32
+0.16 0.26 0.32
+0.84 0.26 0.32
+0.86 0.26 0.32
+0.88 0.26 0.32
+0.1 0.28 0.32
+0.12 0.28 0.32
+0.14 0.28 0.32
+0.86 0.28 0.32
+0.88 0.28 0.32
+0.9 0.28 0.32
+0.08 0.3 0.32
+0.1 0.3 0.32
+0.12 0.3 0.32
+0.88 0.3 0.32
+0.9 0.3 0.32
+0.92 0.3 0.32
+0.08 0.32 0.32
+0.1 0.32 0.32
+0.12 0.32 0.32
+0.88 0.32 0.32
+0.9 0.32 0.32
+0.92 0.32 0.32
+0.08 0.34 0.32
+0.1 0.34 0.32
+0.9 0.34 0.32
+0.92 0.34 0.32
+0.06 0.36 0.32
+0.08 0.36 0.32
+0.1 0.36 0.32
+0.9 0.36 0.32
+0.92 0.36 0.32
+0.94 0.36 0.32
+0.06 0.38 0.32
+0.08 0.38 0.32
+0.1 0.38 0.32
+0.9 0.38 0.32
+0.92 0.38 0.32
+0.94 0.38 0.32
+0.06 0.4 0.32
+0.08 0.4 0.32
+0.92 0.4 0.32
+0.94 0.4 0.32
+0.06 0.42 0.32
+0.08 0.42 0.32
+0.92 0.42 0.32
+0.94 0.42 0.32
+0.04 0.44 0.32
+0.06 0.44 0.32
+0.08 0.44 0.32
+0.92 0.44 0.32
+0.94 0.44 0.32
+0.96 0.44 0.32
+0.04 0.46 0.32
+0.06 0.46 0.32
+0.08 0.46 0.32
+0.92 0.46 0.32
+0.94 0.46 0.32
+0.96 0.46 0.32
+0.04 0.48 0.32
+0.06 0.48 0.32
+0.08 0.48 0.32
+0.92 0.48 0.32
+0.94 0.48 0.32
+0.96 0.48 0.32
+0.04 0.5 0.32
+0.06 0.5 0.32
+0.08 0.5 0.32
+0.92 0.5 0.32
+0.94 0.5 0.32
+0.96 0.5 0.32
+0.04 0.52 0.32
+0.06 0.52 0.32
+0.08 0.52 0.32
+0.92 0.52 0.32
+0.94 0.52 0.32
+0.96 0.52 0.32
+0.04 0.54 0.32
+0.06 0.54 0.32
+0.08 0.54 0.32
+0.92 0.54 0.32
+0.94 0.54 0.32
+0.96 0.54 0.32
+0.04 0.56 0.32
+0.06 0.56 0.32
+0.08 0.56 0.32
+0.92 0.56 0.32
+0.94 0.56 0.32
+0.96 0.56 0.32
+0.06 0.58 0.32
+0.08 0.58 0.32
+0.92 0.58 0.32
+0.94 0.58 0.32
+0.06 0.6 0.32
+0.08 0.6 0.32
+0.92 0.6 0.32
+0.94 0.6 0.32
+0.06 0.62 0.32
+0.08 0.62 0.32
+0.1 0.62 0.32
+0.9 0.62 0.32
+0.92 0.62 0.32
+0.94 0.62 0.32
+0.06 0.64 0.32
+0.08 0.64 0.32
+0.1 0.64 0.32
+0.9 0.64 0.32
+0.92 0.64 0.32
+0.94 0.64 0.32
+0.08 0.66 0.32
+0.1 0.66 0.32
+0.9 0.66 0.32
+0.92 0.66 0.32
+0.08 0.68 0.32
+0.1 0.68 0.32
+0.12 0.68 0.32
+0.88 0.68 0.32
+0.9 0.68 0.32
+0.92 0.68 0.32
+0.08 0.7 0.32
+0.1 0.7 0.32
+0.12 0.7 0.32
+0.88 0.7 0.32
+0.9 0.7 0.32
+0.92 0.7 0.32
+0.1 0.72 0.32
+0.12 0.72 0.32
+0.14 0.72 0.32
+0.86 0.72 0.32
+0.88 0.72 0.32
+0.9 0.72 0.32
+0.12 0.74 0.32
+0.14 0.74 0.32
+0.16 0.74 0.32
+0.84 0.74 0.32
+0.86 0.74 0.32
+0.88 0.74 0.32
+0.12 0.76 0.32
+0.14 0.76 0.32
+0.16 0.76 0.32
+0.84 0.76 0.32
+0.86 0.76 0.32
+0.88 0.76 0.32
+0.14 0.78 0.32
+0.16 0.78 0.32
+0.18 0.78 0.32
+0.82 0.78 0.32
+0.84 0.78 0.32
+0.86 0.78 0.32
+0.16 0.8 0.32
+0.18 0.8 0.32
+0.2 0.8 0.32
+0.8 0.8 0.32
+0.82 0.8 0.32
+0.84 0.8 0.32
+0.18 0.82 0.32
+0.2 0.82 0.32
+0.22 0.82 0.32
+0.78 0.82 0.32
+0.8 0.82 0.32
+0.82 0.82 0.32
+0.2 0.84 0.32
+0.22 0.84 0.32
+0.24 0.84 0.32
+0.26 0.84 0.32
+0.74 0.84 0.32
+0.76 0.84 0.32
+0.78 0.84 0.32
+0.8 0.84 0.32
+0.22 0.86 0.32
+0.24 0.86 0.32
+0.26 0.86 0.32
+0.28 0.86 0.32
+0.72 0.86 0.32
+0.74 0.86 0.32
+0.76 0.86 0.32
+0.78 0.86 0.32
+0.24 0.88 0.32
+0.26 0.88 0.32
+0.28 0.88 0.32
+0.3 0.88 0.32
+0.32 0.88 0.32
+0.68 0.88 0.32
+0.7 0.88 0.32
+0.72 0.88 0.32
+0.74 0.88 0.32
+0.76 0.88 0.32
+0.28 0.9 0.32
+0.3 0.9 0.32
+0.32 0.9 0.32
+0.34 0.9 0.32
+0.36 0.9 0.32
+0.38 0.9 0.32
+0.62 0.9 0.32
+0.64 0.9 0.32
+0.66 0.9 0.32
+0.68 0.9 0.32
+0.7 0.9 0.32
+0.72 0.9 0.32
+0.3 0.92 0.32
+0.32 0.92 0.32
+0.34 0.92 0.32
+0.36 0.92 0.32
+0.38 0.92 0.32
+0.4 0.92 0.32
+0.42 0.92 0.32
+0.44 0.92 0.32
+0.46 0.92 0.32
+0.48 0.92 0.32
+0.5 0.92 0.32
+0.52 0.92 0.32
+0.54 0.92 0.32
+0.56 0.92 0.32
+0.58 0.92 0.32
+0.6 0.92 0.32
+0.62 0.92 0.32
+0.64 0.92 0.32
+0.66 0.92 0.32
+0.68 0.92 0.32
+0.7 0.92 0.32
+0.36 0.94 0.32
+0.38 0.94 0.32
+0.4 0.94 0.32
+0.42 0.94 0.32
+0.44 0.94 0.32
+0.46 0.94 0.32
+0.48 0.94 0.32
+0.5 0.94 0.32
+0.52 0.94 0.32
+0.54 0.94 0.32
+0.56 0.94 0.32
+0.58 0.94 0.32
+0.6 0.94 0.32
+0.62 0.94 0.32
+0.64 0.94 0.32
+0.44 0.96 0.32
+0.46 0.96 0.32
+0.48 0.96 0.32
+0.5 0.96 0.32
+0.52 0.96 0.32
+0.54 0.96 0.32
+0.56 0.96 0.32
+0.4 0.04 0.34
+0.42 0.04 0.34
+0.44 0.04 0.34
+0.46 0.04 0.34
+0.48 0.04 0.34
+0.5 0.04 0.34
+0.52 0.04 0.34
+0.54 0.04 0.34
+0.56 0.04 0.34
+0.58 0.04 0.34
+0.6 0.04 0.34
+0.34 0.06 0.34
+0.36 0.06 0.34
+0.38 0.06 0.34
+0.4 0.06 0.34
+0.42 0.06 0.34
+0.44 0.06 0.34
+0.46 0.06 0.34
+0.48 0.06 0.34
+0.5 0.06 0.34
+0.52 0.06 0.34
+0.54 0.06 0.34
+0.56 0.06 0.34
+0.58 0.06 0.34
+0.6 0.06 0.34
+0.62 0.06 0.34
+0.64 0.06 0.34
+0.66 0.06 0.34
+0.3 0.08 0.34
+0.32 0.08 0.34
+0.34 0.08 0.34
+0.36 0.08 0.34
+0.38 0.08 0.34
+0.4 0.08 0.34
+0.42 0.08 0.34
+0.44 0.08 0.34
+0.46 0.08 0.34
+0.54 0.08 0.34
+0.56 0.08 0.34
+0.58 0.08 0.34
+0.6 0.08 0.34
+0.62 0.08 0.34
+0.64 0.08 0.34
+0.66 0.08 0.34
+0.68 0.08 0.34
+0.7 0.08 0.34
+0.26 0.1 0.34
+0.28 0.1 0.34
+0.3 0.1 0.34
+0.32 0.1 0.34
+0.34 0.1 0.34
+0.36 0.1 0.34
+0.64 0.1 0.34
+0.66 0.1 0.34
+0.68 0.1 0.34
+0.7 0.1 0.34
+0.72 0.1 0.34
+0.74 0.1 0.34
+0.22 0.12 0.34
+0.24 0.12 0.34
+0.26 0.12 0.34
+0.28 0.12 0.34
+0.3 0.12 0.34
+0.7 0.12 0.34
+0.72 0.12 0.34
+0.74 0.12 0.34
+0.76 0.12 0.34
+0.78 0.12 0.34
+0.2 0.14 0.34
+0.22 0.14 0.34
+0.24 0.14 0.34
+0.26 0.14 0.34
+0.28 0.14 0.34
+0.72 0.14 0.34
+0.74 0.14 0.34
+0.76 0.14 0.34
+0.78 0.14 0.34
+0.8 0.14 0.34
+0.18 0.16 0.34
+0.2 0.16 0.34
+0.22 0.16 0.34
+0.24 0.16 0.34
+0.76 0.16 0.34
+0.78 0.16 0.34
+0.8 0.16 0.34
+0.82 0.16 0.34
+0.16 0.18 0.34
+0.18 0.18 0.34
+0.2 0.18 0.34
+0.22 0.18 0.34
+0.78 0.18 0.34
+0.8 0.18 0.34
+0.82 0.18 0.34
+0.84 0.18 0.34
+0.14 0.2 0.34
+0.16 0.2 0.34
+0.18 0.2 0.34
+0.2 0.2 0.34
+0.8 0.2 0.34
+0.82 0.2 0.34
+0.84 0.2 0.34
+0.86 0.2 0.34
+0.12 0.22 0.34
+0.14 0.22 0.34
+0.16 0.22 0.34
+0.18 0.22 0.34
+0.82 0.22 0.34
+0.84 0.22 0.34
+0.86 0.22 0.34
+0.88 0.22 0.34
+0.12 0.24 0.34
+0.14 0.24 0.34
+0.16 0.24 0.34
+0.84 0.24 0.34
+0.86 0.24 0.34
+0.88 0.24 0.34
+0.1 0.26 0.34
+0.12 0.26 0.34
+0.14 0.26 0.34
+0.86 0.26 0.34
+0.88 0.26 0.34
+0.9 0.26 0.34
+0.1 0.28 0.34
+0.12 0.28 0.34
+0.14 0.28 0.34
+0.86 0.28 0.34
+0.88 0.28 0.34
+0.9 0.28 0.34
+0.08 0.3 0.34
+0.1 0.3 0.34
+0.12 0.3 0.34
+0.88 0.3 0.34
+0.9 0.3 0.34
+0.92 0.3 0.34
+0.08 0.32 0.34
+0.1 0.32 0.34
+0.9 0.32 0.34
+0.92 0.32 0.34
+0.06 0.34 0.34
+0.08 0.34 0.34
+0.1 0.34 0.34
+0.9 0.34 0.34
+0.92 0.34 0.34
+0.94 0.34 0.34
+0.06 0.36 0.34
+0.08 0.36 0.34
+0.1 0.36 0.34
+0.9 0.36 0.34
+0.92 0.36 0.34
+0.94 0.36 0.34
+0.06 0.38 0.34
+0.08 0.38 0.34
+0.92 0.38 0.34
+0.94 0.38 0.34
+0.04 0.4 0.34
+0.06 0.4 0.34
+0.08 0.4 0.34
+0.92 0.4 0.34
+0.94 0.4 0.34
+0.96 0.4 0.34
+0.04 0.42 0.34
+0.06 0.42 0.34
+0.08 0.42 0.34
+0.92 0.42 0.34
+0.94 0.42 0.34
+0.96 0.42 0.34
+0.04 0.44 0.34
+0.06 0.44 0.34
+0.08 0.44 0.34
+0.92 0.44 0.34
+0.94 0.44 0.34
+0.96 0.44 0.34
+0.04 0.46 0.34
+0.06 0.46 0.34
+0.08 0.46 0.34
+0.92 0.46 0.34
+0.94 0.46 0.34
+0.96 0.46 0.34
+0.04 0.48 0.34
+0.06 0.48 0.34
+0.94 0.48 0.34
+0.96 0.48 0.34
+0.04 0.5 0.34
+0.06 0.5 0.34
+0.94 0.5 0.34
+0.96 0.5 0.34
+0.04 0.52 0.34
+0.06 0.52 0.34
+0.94 0.52 0.34
+0.96 0.52 0.34
+0.04 0.54 0.34
+0.06 0.54 0.34
+0.08 0.54 0.34
+0.92 0.54 0.34
+0.94 0.54 0.34
+0.96 0.54 0.34
+0.04 0.56 0.34
+0.06 0.56 0.34
+0.08 0.56 0.34
+0.92 0.56 0.34
+0.94 0.56 0.34
+0.96 0.56 0.34
+0.04 0.58 0.34
+0.06 0.58 0.34
+0.08 0.58 0.34
+0.92 0.58 0.34
+0.94 0.58 0.34
+0.96 0.58 0.34
+0.04 0.6 0.34
+0.06 0.6 0.34
+0.08 0.6 0.34
+0.92 0.6 0.34
+0.94 0.6 0.34
+0.96 0.6 0.34
+0.06 0.62 0.34
+0.08 0.62 0.34
+0.92 0.62 0.34
+0.94 0.62 0.34
+0.06 0.64 0.34
+0.08 0.64 0.34
+0.1 0.64 0.34
+0.9 0.64 0.34
+0.92 0.64 0.34
+0.94 0.64 0.34
+0.06 0.66 0.34
+0.08 0.66 0.34
+0.1 0.66 0.34
+0.9 0.66 0.34
+0.92 0.66 0.34
+0.94 0.66 0.34
+0.08 0.68 0.34
+0.1 0.68 0.34
+0.9 0.68 0.34
+0.92 0.68 0.34
+0.08 0.7 0.34
+0.1 0.7 0.34
+0.12 0.7 0.34
+0.88 0.7 0.34
+0.9 0.7 0.34
+0.92 0.7 0.34
+0.1 0.72 0.34
+0.12 0.72 0.34
+0.14 0.72 0.34
+0.86 0.72 0.34
+0.88 0.72 0.34
+0.9 0.72 0.34
+0.1 0.74 0.34
+0.12 0.74 0.34
+0.14 0.74 0.34
+0.86 0.74 0.34
+0.88 0.74 0.34
+0.9 0.74 0.34
+0.12 0.76 0.34
+0.14 0.76 0.34
+0.16 0.76 0.34
+0.84 0.76 0.34
+0.86 0.76 0.34
+0.88 0.76 0.34
+0.12 0.78 0.34
+0.14 0.78 0.34
+0.16 0.78 0.34
+0.18 0.78 0.34
+0.82 0.78 0.34
+0.84 0.78 0.34
+0.86 0.78 0.34
+0.88 0.78 0.34
+0.14 0.8 0.34
+0.16 0.8 0.34
+0.18 0.8 0.34
+0.2 0.8 0.34
+0.8 0.8 0.34
+0.82 0.8 0.34
+0.84 0.8 0.34
+0.86 0.8 0.34
+0.16 0.82 0.34
+0.18 0.82 0.34
+0.2 0.82 0.34
+0.22 0.82 0.34
+0.78 0.82 0.34
+0.8 0.82 0.34
+0.82 0.82 0.34
+0.84 0.82 0.34
+0.18 0.84 0.34
+0.2 0.84 0.34
+0.22 0.84 0.34
+0.24 0.84 0.34
+0.76 0.84 0.34
+0.78 0.84 0.34
+0.8 0.84 0.34
+0.82 0.84 0.34
+0.2 0.86 0.34
+0.22 0.86 0.34
+0.24 0.86 0.34
+0.26 0.86 0.34
+0.28 0.86 0.34
+0.72 0.86 0.34
+0.74 0.86 0.34
+0.76 0.86 0.34
+0.78 0.86 0.34
+0.8 0.86 0.34
+0.22 0.88 0.34
+0.24 0.88 0.34
+0.26 0.88 0.34
+0.28 0.88 0.34
+0.3 0.88 0.34
+0.7 0.88 0.34
+0.72 0.88 0.34
+0.74 0.88 0.34
+0.76 0.88 0.34
+0.78 0.88 0.34
+0.26 0.9 0.34
+0.28 0.9 0.34
+0.3 0.9 0.34
+0.32 0.9 0.34
+0.34 0.9 0.34
+0.36 0.9 0.34
+0.64 0.9 0.34
+0.66 0.9 0.34
+0.68 0.9 0.34
+0.7 0.9 0.34
+0.72 0.9 0.34
+0.74 0.9 0.34
+0.3 0.92 0.34
+0.32 0.92 0.34
+0.34 0.92 0.34
+0.36 0.92 0.34
+0.38 0.92 0.34
+0.4 0.92 0.34
+0.42 0.92 0.34
+0.44 0.92 0.34
+0.46 0.92 0.34
+0.54 0.92 0.34
+0.56 0.92 0.34
+0.58 0.92 0.34
+0.6 0.92 0.34
+0.62 0.92 0.34
+0.64 0.92 0.34
+0.66 0.92 0.34
+0.68 0.92 0.34
+0.7 0.92 0.34
+0.34 0.94 0.34
+0.36 0.94 0.34
+0.38 0.94 0.34
+0.4 0.94 0.34
+0.42 0.94 0.34
+0.44 0.94 0.34
+0.46 0.94 0.34
+0.48 0.94 0.34
+0.5 0.94 0.34
+0.52 0.94 0.34
+0.54 0.94 0.34
+0.56 0.94 0.34
+0.58 0.94 0.34
+0.6 0.94 0.34
+0.62 0.94 0.34
+0.64 0.94 0.34
+0.66 0.94 0.34
+0.4 0.96 0.34
+0.42 0.96 0.34
+0.44 0.96 0.34
+0.46 0.96 0.34
+0.48 0.96 0.34
+0.5 0.96 0.34
+0.52 0.96 0.34
+0.54 0.96 0.34
+0.56 0.96 0.34
+0.58 0.96 0.34
+0.6 0.96 0.34
+0.38 0.04 0.36
+0.4 0.04 0.36
+0.42 0.04 0.36
+0.44 0.04 0.36
+0.46 0.04 0.36
+0.48 0.04 0.36
+0.5 0.04 0.36
+0.52 0.04 0.36
+0.54 0.04 0.36
+0.56 0.04 0.36
+0.58 0.04 0.36
+0.6 0.04 0.36
+0.62 0.04 0.36
+0.32 0.06 0.36
+0.34 0.06 0.36
+0.36 0.06 0.36
+0.38 0.06 0.36
+0.4 0.06 0.36
+0.42 0.06 0.36
+0.44 0.06 0.36
+0.46 0.06 0.36
+0.48 0.06 0.36
+0.5 0.06 0.36
+0.52 0.06 0.36
+0.54 0.06 0.36
+0.56 0.06 0.36
+0.58 0.06 0.36
+0.6 0.06 0.36
+0.62 0.06 0.36
+0.64 0.06 0.36
+0.66 0.06 0.36
+0.68 0.06 0.36
+0.28 0.08 0.36
+0.3 0.08 0.36
+0.32 0.08 0.36
+0.34 0.08 0.36
+0.36 0.08 0.36
+0.38 0.08 0.36
+0.4 0.08 0.36
+0.6 0.08 0.36
+0.62 0.08 0.36
+0.64 0.08 0.36
+0.66 0.08 0.36
+0.68 0.08 0.36
+0.7 0.08 0.36
+0.72 0.08 0.36
+0.24 0.1 0.36
+0.26 0.1 0.36
+0.28 0.1 0.36
+0.3 0.1 0.36
+0.32 0.1 0.36
+0.34 0.1 0.36
+0.66 0.1 0.36
+0.68 0.1 0.36
+0.7 0.1 0.36
+0.72 0.1 0.36
+0.74 0.1 0.36
+0.76 0.1 0.36
+0.22 0.12 0.36
+0.24 0.12 0.36
+0.26 0.12 0.36
+0.28 0.12 0.36
+0.3 0.12 0.36
+0.7 0.12 0.36
+0.72 0.12 0.36
+0.74 0.12 0.36
+0.76 0.12 0.36
+0.78 0.12 0.36
+0.2 0.14 0.36
+0.22 0.14 0.36
+0.24 0.14 0.36
+0.26 0.14 0.36
+0.74 0.14 0.36
+0.76 0.14 0.36
+0.78 0.14 0.36
+0.8 0.14 0.36
+0.18 0.16 0.36
+0.2 0.16 0.36
+0.22 0.16 0.36
+0.24 0.16 0.36
+0.76 0.16 0.36
+0.78 0.16 0.36
+0.8 0.16 0.36
+0.82 0.16 0.36
+0.16 0.18 0.36
+0.18 0.18 0.36
+0.2 0.18 0.36
+0.8 0.18 0.36
+0.82 0.18 0.36
+0.84 0.18 0.36
+0.14 0.2 0.36
+0.16 0.2 0.36
+0.18 0.2 0.36
+0.82 0.2 0.36
+0.84 0.2 0.36
+0.86 0.2 0.36
+0.12 0.22 0.36
+0.14 0.22 0.36
+0.16 0.22 0.36
+0.84 0.22 0.36
+0.86 0.22 0.36
+0.88 0.22 0.36
+0.1 0.24 0.36
+0.12 0.24 0.36
+0.14 0.24 0.36
+0.16 0.24 0.36
+0.84 0.24 0.36
+0.86 0.24 0.36
+0.88 0.24 0.36
+0.9 0.24 0.36
+0.1 0.26 0.36
+0.12 0.26 0.36
+0.14 0.26 0.36
+0.86 0.26 0.36
+0.88 0.26 0.36
+0.9 0.26 0.36
+0.08 0.28 0.36
+0.1 0.28 0.36
+0.12 0.28 0.36
+0.88 0.28 0.36
+0.9 0.28 0.36
+0.92 0.28 0.36
+0.08 0.3 0.36
+0.1 0.3 0.36
+0.12 0.3 0.36
+0.88 0.3 0.36
+0.9 0.3 0.36
+0.92 0.3 0.36
+0.06 0.32 0.36
+0.08 0.32 0.36
+0.1 0.32 0.36
+0.9 0.32 0.36
+0.92 0.32 0.36
+0.94 0.32 0.36
+0.06 0.34 0.36
+0.08 0.34 0.36
+0.1 0.34 0.36
+0.9 0.34 0.36
+0.92 0.34 0.36
+0.94 0.34 0.36
+0.06 0.36 0.36
+0.08 0.36 0.36
+0.92 0.36 0.36
+0.94 0.36 0.36
+0.04 0.38 0.36
+0.06 0.38 0.36
+0.08 0.38 0.36
+0.92 0.38 0.36
+0.94 0.38 0.36
+0.96 0.38 0.36
+0.04 0.4 0.36
+0.06 0.4 0.36
+0.08 0.4 0.36
+0.92 0.4 0.36
+0.94 0.4 0.36
+0.96 0.4 0.36
+0.04 0.42 0.36
+0.06 0.42 0.36
+0.94 0.42 0.36
+0.96 0.42 0.36
+0.04 0.44 0.36
+0.06 0.44 0.36
+0.94 0.44 0.36
+0.96 0.44 0.36
+0.04 0.46 0.36
+0.06 0.46 0.36
+0.94 0.46 0.36
+0.96 0.46 0.36
+0.04 0.48 0.36
+0.06 0.48 0.36
+0.94 0.48 0.36
+0.96 0.48 0.36
+0.04 0.5 0.36
+0.06 0.5 0.36
+0.94 0.5 0.36
+0.96 0.5 0.36
+0.04 0.52 0.36
+0.06 0.52 0.36
+0.94 0.52 0.36
+0.96 0.52 0.36
+0.04 0.54 0.36
+0.06 0.54 0.36
+0.94 0.54 0.36
+0.96 0.54 0.36
+0.04 0.56 0.36
+0.06 0.56 0.36
+0.94 0.56 0.36
+0.96 0.56 0.36
+0.04 0.58 0.36
+0.06 0.58 0.36
+0.94 0.58 0.36
+0.96 0.58 0.36
+0.04 0.6 0.36
+0.06 0.6 0.36
+0.08 0.6 0.36
+0.92 0.6 0.36
+0.94 0.6 0.36
+0.96 0.6 0.36
+0.04 0.62 0.36
+0.06 0.62 0.36
+0.08 0.62 0.36
+0.92 0.62 0.36
+0.94 0.62 0.36
+0.96 0.62 0.36
+0.06 0.64 0.36
+0.08 0.64 0.36
+0.92 0.64 0.36
+0.94 0.64 0.36
+0.06 0.66 0.36
+0.08 0.66 0.36
+0.1 0.66 0.36
+0.9 0.66 0.36
+0.92 0.66 0.36
+0.94 0.66 0.36
+0.06 0.68 0.36
+0.08 0.68 0.36
+0.1 0.68 0.36
+0.9 0.68 0.36
+0.92 0.68 0.36
+0.94 0.68 0.36
+0.08 0.7 0.36
+0.1 0.7 0.36
+0.12 0.7 0.36
+0.88 0.7 0.36
+0.9 0.7 0.36
+0.92 0.7 0.36
+0.08 0.72 0.36
+0.1 0.72 0.36
+0.12 0.72 0.36
+0.88 0.72 0.36
+0.9 0.72 0.36
+0.92 0.72 0.36
+0.1 0.74 0.36
+0.12 0.74 0.36
+0.14 0.74 0.36
+0.86 0.74 0.36
+0.88 0.74 0.36
+0.9 0.74 0.36
+0.1 0.76 0.36
+0.12 0.76 0.36
+0.14 0.76 0.36
+0.16 0.76 0.36
+0.84 0.76 0.36
+0.86 0.76 0.36
+0.88 0.76 0.36
+0.9 0.76 0.36
+0.12 0.78 0.36
+0.14 0.78 0.36
+0.16 0.78 0.36
+0.84 0.78 0.36
+0.86 0.78 0.36
+0.88 0.78 0.36
+0.14 0.8 0.36
+0.16 0.8 0.36
+0.18 0.8 0.36
+0.82 0.8 0.36
+0.84 0.8 0.36
+0.86 0.8 0.36
+0.16 0.82 0.36
+0.18 0.82 0.36
+0.2 0.82 0.36
+0.8 0.82 0.36
+0.82 0.82 0.36
+0.84 0.82 0.36
+0.18 0.84 0.36
+0.2 0.84 0.36
+0.22 0.84 0.36
+0.24 0.84 0.36
+0.76 0.84 0.36
+0.78 0.84 0.36
+0.8 0.84 0.36
+0.82 0.84 0.36
+0.2 0.86 0.36
+0.22 0.86 0.36
+0.24 0.86 0.36
+0.26 0.86 0.36
+0.74 0.86 0.36
+0.76 0.86 0.36
+0.78 0.86 0.36
+0.8 0.86 0.36
+0.22 0.88 0.36
+0.24 0.88 0.36
+0.26 0.88 0.36
+0.28 0.88 0.36
+0.3 0.88 0.36
+0.7 0.88 0.36
+0.72 0.88 0.36
+0.74 0.88 0.36
+0.76 0.88 0.36
+0.78 0.88 0.36
+0.24 0.9 0.36
+0.26 0.9 0.36
+0.28 0.9 0.36
+0.3 0.9 0.36
+0.32 0.9 0.36
+0.34 0.9 0.36
+0.66 0.9 0.36
+0.68 0.9 0.36
+0.7 0.9 0.36
+0.72 0.9 0.36
+0.74 0.9 0.36
+0.76 0.9 0.36
+0.28 0.92 0.36
+0.3 0.92 0.36
+0.32 0.92 0.36
+0.34 0.92 0.36
+0.36 0.92 0.36
+0.38 0.92 0.36
+0.4 0.92 0.36
+0.6 0.92 0.36
+0.62 0.92 0.36
+0.64 0.92 0.36
+0.66 0.92 0.36
+0.68 0.92 0.36
+0.7 0.92 0.36
+0.72 0.92 0.36
+0.32 0.94 0.36
+0.34 0.94 0.36
+0.36 0.94 0.36
+0.38 0.94 0.36
+0.4 0.94 0.36
+0.42 0.94 0.36
+0.44 0.94 0.36
+0.46 0.94 0.36
+0.48 0.94 0.36
+0.5 0.94 0.36
+0.52 0.94 0.36
+0.54 0.94 0.36
+0.56 0.94 0.36
+0.58 0.94 0.36
+0.6 0.94 0.36
+0.62 0.94 0.36
+0.64 0.94 0.36
+0.66 0.94 0.36
+0.68 0.94 0.36
+0.38 0.96 0.36
+0.4 0.96 0.36
+0.42 0.96 0.36
+0.44 0.96 0.36
+0.46 0.96 0.36
+0.48 0.96 0.36
+0.5 0.96 0.36
+0.52 0.96 0.36
+0.54 0.96 0.36
+0.56 0.96 0.36
+0.58 0.96 0.36
+0.6 0.96 0.36
+0.62 0.96 0.36
+0.44 0.02 0.38
+0.46 0.02 0.38
+0.48 0.02 0.38
+0.5 0.02 0.38
+0.52 0.02 0.38
+0.54 0.02 0.38
+0.56 0.02 0.38
+0.36 0.04 0.38
+0.38 0.04 0.38
+0.4 0.04 0.38
+0.42 0.04 0.38
+0.44 0.04 0.38
+0.46 0.04 0.38
+0.48 0.04 0.38
+0.5 0.04 0.38
+0.52 0.04 0.38
+0.54 0.04 0.38
+0.56 0.04 0.38
+0.58 0.04 0.38
+0.6 0.04 0.38
+0.62 0.04 0.38
+0.64 0.04 0.38
+0.3 0.06 0.38
+0.32 0.06 0.38
+0.34 0.06 0.38
+0.36 0.06 0.38
+0.38 0.06 0.38
+0.4 0.06 0.38
+0.42 0.06 0.38
+0.44 0.06 0.38
+0.46 0.06 0.38
+0.48 0.06 0.38
+0.5 0.06 0.38
+0.52 0.06 0.38
+0.54 0.06 0.38
+0.56 0.06 0.38
+0.58 0.06 0.38
+0.6 0.06 0.38
+0.62 0.06 0.38
+0.64 0.06 0.38
+0.66 0.06 0.38
+0.68 0.06 0.38
+0.7 0.06 0.38
+0.26 0.08 0.38
+0.28 0.08 0.38
+0.3 0.08 0.38
+0.32 0.08 0.38
+0.34 0.08 0.38
+0.36 0.08 0.38
+0.38 0.08 0.38
+0.62 0.08 0.38
+0.64 0.08 0.38
+0.66 0.08 0.38
+0.68 0.08 0.38
+0.7 0.08 0.38
+0.72 0.08 0.38
+0.74 0.08 0.38
+0.24 0.1 0.38
+0.26 0.1 0.38
+0.28 0.1 0.38
+0.3 0.1 0.38
+0.32 0.1 0.38
+0.68 0.1 0.38
+0.7 0.1 0.38
+0.72 0.1 0.38
+0.74 0.1 0.38
+0.76 0.1 0.38
+0.2 0.12 0.38
+0.22 0.12 0.38
+0.24 0.12 0.38
+0.26 0.12 0.38
+0.28 0.12 0.38
+0.72 0.12 0.38
+0.74 0.12 0.38
+0.76 0.12 0.38
+0.78 0.12 0.38
+0.8 0.12 0.38
+0.18 0.14 0.38
+0.2 0.14 0.38
+0.22 0.14 0.38
+0.24 0.14 0.38
+0.76 0.14 0.38
+0.78 0.14 0.38
+0.8 0.14 0.38
+0.82 0.14 0.38
+0.16 0.16 0.38
+0.18 0.16 0.38
+0.2 0.16 0.38
+0.22 0.16 0.38
+0.78 0.16 0.38
+0.8 0.16 0.38
+0.82 0.16 0.38
+0.84 0.16 0.38
+0.14 0.18 0.38
+0.16 0.18 0.38
+0.18 0.18 0.38
+0.2 0.18 0.38
+0.8 0.18 0.38
+0.82 0.18 0.38
+0.84 0.18 0.38
+0.86 0.18 0.38
+0.12 0.2 0.38
+0.14 0.2 0.38
+0.16 0.2 0.38
+0.18 0.2 0.38
+0.82 0.2 0.38
+0.84 0.2 0.38
+0.86 0.2 0.38
+0.88 0.2 0.38
+0.12 0.22 0.38
+0.14 0.22 0.38
+0.16 0.22 0.38
+0.84 0.22 0.38
+0.86 0.22 0.38
+0.88 0.22 0.38
+0.1 0.24 0.38
+0.12 0.24 0.38
+0.14 0.24 0.38
+0.86 0.24 0.38
+0.88 0.24 0.38
+0.9 0.24 0.38
+0.08 0.26 0.38
+0.1 0.26 0.38
+0.12 0.26 0.38
+0.88 0.26 0.38
+0.9 0.26 0.38
+0.92 0.26 0.38
+0.08 0.28 0.38
+0.1 0.28 0.38
+0.12 0.28 0.38
+0.88 0.28 0.38
+0.9 0.28 0.38
+0.92 0.28 0.38
+0.06 0.3 0.38
+0.08 0.3 0.38
+0.1 0.3 0.38
+0.9 0.3 0.38
+0.92 0.3 0.38
+0.94 0.3 0.38
+0.06 0.32 0.38
+0.08 0.32 0.38
+0.1 0.32 0.38
+0.9 0.32 0.38
+0.92 0.32 0.38
+0.94 0.32 0.38
+0.06 0.34 0.38
+0.08 0.34 0.38
+0.92 0.34 0.38
+0.94 0.34 0.38
+0.04 0.36 0.38
+0.06 0.36 0.38
+0.08 0.36 0.38
+0.92 0.36 0.38
+0.94 0.36 0.38
+0.96 0.36 0.38
+0.04 0.38 0.38
+0.06 0.38 0.38
+0.08 0.38 0.38
+0.92 0.38 0.38
+0.94 0.38 0.38
+0.96 0.38 0.38
+0.04 0.4 0.38
+0.06 0.4 0.38
+0.94 0.4 0.38
+0.96 0.4 0.38
+0.04 0.42 0.38
+0.06 0.42 0.38
+0.94 0.42 0.38
+0.96 0.42 0.38
+0.02 0.44 0.38
+0.04 0.44 0.38
+0.06 0.44 0.38
+0.94 0.44 0.38
+0.96 0.44 0.38
+0.98 0.44 0.38
+0.02 0.46 0.38
+0.04 0.46 0.38
+0.06 0.46 0.38
+0.94 0.46 0.38
+0.96 0.46 0.38
+0.98 0.46 0.38
+0.02 0.48 0.38
+0.04 0.48 0.38
+0.06 0.48 0.38
+0.94 0.48 0.38
+0.96 0.48 0.38
+0.98 0.48 0.38
+0.02 0.5 0.38
+0.04 0.5 0.38
+0.06 0.5 0.38
+0.94 0.5 0.38
+0.96 0.5 0.38
+0.98 0.5 0.38
+0.02 0.52 0.38
+0.04 0.52 0.38
+0.06 0.52 0.38
+0.94 0.52 0.38
+0.96 0.52 0.38
+0.98 0.52 0.38
+0.02 0.54 0.38
+0.04 0.54 0.38
+0.06 0.54 0.38
+0.94 0.54 0.38
+0.96 0.54 0.38
+0.98 0.54 0.38
+0.02 0.56 0.38
+0.04 0.56 0.38
+0.06 0.56 0.38
+0.94 0.56 0.38
+0.96 0.56 0.38
+0.98 0.56 0.38
+0.04 0.58 0.38
+0.06 0.58 0.38
+0.94 0.58 0.38
+0.96 0.58 0.38
+0.04 0.6 0.38
+0.06 0.6 0.38
+0.94 0.6 0.38
+0.96 0.6 0.38
+0.04 0.62 0.38
+0.06 0.62 0.38
+0.08 0.62 0.38
+0.92 0.62 0.38
+0.94 0.62 0.38
+0.96 0.62 0.38
+0.04 0.64 0.38
+0.06 0.64 0.38
+0.08 0.64 0.38
+0.92 0.64 0.38
+0.94 0.64 0.38
+0.96 0.64 0.38
+0.06 0.66 0.38
+0.08 0.66 0.38
+0.92 0.66 0.38
+0.94 0.66 0.38
+0.06 0.68 0.38
+0.08 0.68 0.38
+0.1 0.68 0.38
+0.9 0.68 0.38
+0.92 0.68 0.38
+0.94 0.68 0.38
+0.06 0.7 0.38
+0.08 0.7 0.38
+0.1 0.7 0.38
+0.9 0.7 0.38
+0.92 0.7 0.38
+0.94 0.7 0.38
+0.08 0.72 0.38
+0.1 0.72 0.38
+0.12 0.72 0.38
+0.88 0.72 0.38
+0.9 0.72 0.38
+0.92 0.72 0.38
+0.08 0.74 0.38
+0.1 0.74 0.38
+0.12 0.74 0.38
+0.88 0.74 0.38
+0.9 0.74 0.38
+0.92 0.74 0.38
+0.1 0.76 0.38
+0.12 0.76 0.38
+0.14 0.76 0.38
+0.86 0.76 0.38
+0.88 0.76 0.38
+0.9 0.76 0.38
+0.12 0.78 0.38
+0.14 0.78 0.38
+0.16 0.78 0.38
+0.84 0.78 0.38
+0.86 0.78 0.38
+0.88 0.78 0.38
+0.12 0.8 0.38
+0.14 0.8 0.38
+0.16 0.8 0.38
+0.18 0.8 0.38
+0.82 0.8 0.38
+0.84 0.8 0.38
+0.86 0.8 0.38
+0.88 0.8 0.38
+0.14 0.82 0.38
+0.16 0.82 0.38
+0.18 0.82 0.38
+0.2 0.82 0.38
+0.8 0.82 0.38
+0.82 0.82 0.38
+0.84 0.82 0.38
+0.86 0.82 0.38
+0.16 0.84 0.38
+0.18 0.84 0.38
+0.2 0.84 0.38
+0.22 0.84 0.38
+0.78 0.84 0.38
+0.8 0.84 0.38
+0.82 0.84 0.38
+0.84 0.84 0.38
+0.18 0.86 0.38
+0.2 0.86 0.38
+0.22 0.86 0.38
+0.24 0.86 0.38
+0.76 0.86 0.38
+0.78 0.86 0.38
+0.8 0.86 0.38
+0.82 0.86 0.38
+0.2 0.88 0.38
+0.22 0.88 0.38
+0.24 0.88 0.38
+0.26 0.88 0.38
+0.28 0.88 0.38
+0.72 0.88 0.38
+0.74 0.88 0.38
+0.76 0.88 0.38
+0.78 0.88 0.38
+0.8 0.88 0.38
+0.24 0.9 0.38
+0.26 0.9 0.38
+0.28 0.9 0.38
+0.3 0.9 0.38
+0.32 0.9 0.38
+0.68 0.9 0.38
+0.7 0.9 0.38
+0.72 0.9 0.38
+0.74 0.9 0.38
+0.76 0.9 0.38
+0.26 0.92 0.38
+0.28 0.92 0.38
+0.3 0.92 0.38
+0.32 0.92 0.38
+0.34 0.92 0.38
+0.36 0.92 0.38
+0.38 0.92 0.38
+0.62 0.92 0.38
+0.64 0.92 0.38
+0.66 0.92 0.38
+0.68 0.92 0.38
+0.7 0.92 0.38
+0.72 0.92 0.38
+0.74 0.92 0.38
+0.3 0.94 0.38
+0.32 0.94 0.38
+0.34 0.94 0.38
+0.36 0.94 0.38
+0.38 0.94 0.38
+0.4 0.94 0.38
+0.42 0.94 0.38
+0.44 0.94 0.38
+0.46 0.94 0.38
+0.48 0.94 0.38
+0.5 0.94 0.38
+0.52 0.94 0.38
+0.54 0.94 0.38
+0.56 0.94 0.38
+0.58 0.94 0.38
+0.6 0.94 0.38
+0.62 0.94 0.38
+0.64 0.94 0.38
+0.66 0.94 0.38
+0.68 0.94 0.38
+0.7 0.94 0.38
+0.36 0.96 0.38
+0.38 0.96 0.38
+0.4 0.96 0.38
+0.42 0.96 0.38
+0.44 0.96 0.38
+0.46 0.96 0.38
+0.48 0.96 0.38
+0.5 0.96 0.38
+0.52 0.96 0.38
+0.54 0.96 0.38
+0.56 0.96 0.38
+0.58 0.96 0.38
+0.6 0.96 0.38
+0.62 0.96 0.38
+0.64 0.96 0.38
+0.44 0.98 0.38
+0.46 0.98 0.38
+0.48 0.98 0.38
+0.5 0.98 0.38
+0.52 0.98 0.38
+0.54 0.98 0.38
+0.56 0.98 0.38
+0.42 0.02 0.4
+0.44 0.02 0.4
+0.46 0.02 0.4
+0.48 0.02 0.4
+0.5 0.02 0.4
+0.52 0.02 0.4
+0.54 0.02 0.4
+0.56 0.02 0.4
+0.58 0.02 0.4
+0.34 0.04 0.4
+0.36 0.04 0.4
+0.38 0.04 0.4
+0.4 0.04 0.4
+0.42 0.04 0.4
+0.44 0.04 0.4
+0.46 0.04 0.4
+0.48 0.04 0.4
+0.5 0.04 0.4
+0.52 0.04 0.4
+0.54 0.04 0.4
+0.56 0.04 0.4
+0.58 0.04 0.4
+0.6 0.04 0.4
+0.62 0.04 0.4
+0.64 0.04 0.4
+0.66 0.04 0.4
+0.3 0.06 0.4
+0.32 0.06 0.4
+0.34 0.06 0.4
+0.36 0.06 0.4
+0.38 0.06 0.4
+0.4 0.06 0.4
+0.42 0.06 0.4
+0.44 0.06 0.4
+0.46 0.06 0.4
+0.48 0.06 0.4
+0.5 0.06 0.4
+0.52 0.06 0.4
+0.54 0.06 0.4
+0.56 0.06 0.4
+0.58 0.06 0.4
+0.6 0.06 0.4
+0.62 0.06 0.4
+0.64 0.06 0.4
+0.66 0.06 0.4
+0.68 0.06 0.4
+0.7 0.06 0.4
+0.26 0.08 0.4
+0.28 0.08 0.4
+0.3 0.08 0.4
+0.32 0.08 0.4
+0.34 0.08 0.4
+0.36 0.08 0.4
+0.64 0.08 0.4
+0.66 0.08 0.4
+0.68 0.08 0.4
+0.7 0.08 0.4
+0.72 0.08 0.4
+0.74 0.08 0.4
+0.22 0.1 0.4
+0.24 0.1 0.4
+0.26 0.1 0.4
+0.28 0.1 0.4
+0.3 0.1 0.4
+0.7 0.1 0.4
+0.72 0.1 0.4
+0.74 0.1 0.4
+0.76 0.1 0.4
+0.78 0.1 0.4
+0.2 0.12 0.4
+0.22 0.12 0.4
+0.24 0.12 0.4
+0.26 0.12 0.4
+0.28 0.12 0.4
+0.72 0.12 0.4
+0.74 0.12 0.4
+0.76 0.12 0.4
+0.78 0.12 0.4
+0.8 0.12 0.4
+0.18 0.14 0.4
+0.2 0.14 0.4
+0.22 0.14 0.4
+0.24 0.14 0.4
+0.76 0.14 0.4
+0.78 0.14 0.4
+0.8 0.14 0.4
+0.82 0.14 0.4
+0.16 0.16 0.4
+0.18 0.16 0.4
+0.2 0.16 0.4
+0.22 0.16 0.4
+0.78 0.16 0.4
+0.8 0.16 0.4
+0.82 0.16 0.4
+0.84 0.16 0.4
+0.14 0.18 0.4
+0.16 0.18 0.4
+0.18 0.18 0.4
+0.82 0.18 0.4
+0.84 0.18 0.4
+0.86 0.18 0.4
+0.12 0.2 0.4
+0.14 0.2 0.4
+0.16 0.2 0.4
+0.84 0.2 0.4
+0.86 0.2 0.4
+0.88 0.2 0.4
+0.1 0.22 0.4
+0.12 0.22 0.4
+0.14 0.22 0.4
+0.16 0.22 0.4
+0.84 0.22 0.4
+0.86 0.22 0.4
+0.88 0.22 0.4
+0.9 0.22 0.4
+0.1 0.24 0.4
+0.12 0.24 0.4
+0.14 0.24 0.4
+0.86 0.24 0.4
+0.88 0.24 0.4
+0.9 0.24 0.4
+0.08 0.26 0.4
+0.1 0.26 0.4
+0.12 0.26 0.4
+0.88 0.26 0.4
+0.9 0.26 0.4
+0.92 0.26 0.4
+0.08 0.28 0.4
+0.1 0.28 0.4
+0.12 0.28 0.4
+0.88 0.28 0.4
+0.9 0.28 0.4
+0.92 0.28 0.4
+0.06 0.3 0.4
+0.08 0.3 0.4
+0.1 0.3 0.4
+0.9 0.3 0.4
+0.92 0.3 0.4
+0.94 0.3 0.4
+0.06 0.32 0.4
+0.08 0.32 0.4
+0.92 0.32 0.4
+0.94 0.32 0.4
+0.04 0.34 0.4
+0.06 0.34 0.4
+0.08 0.34 0.4
+0.92 0.34 0.4
+0.94 0.34 0.4
+0.96 0.34 0.4
+0.04 0.36 0.4
+0.06 0.36 0.4
+0.08 0.36 0.4
+0.92 0.36 0.4
+0.94 0.36 0.4
+0.96 0.36 0.4
+0.04 0.38 0.4
+0.06 0.38 0.4
+0.94 0.38 0.4
+0.96 0.38 0.4
+0.04 0.4 0.4
+0.06 0.4 0.4
+0.94 0.4 0.4
+0.96 0.4 0.4
+0.02 0.42 0.4
+0.04 0.42 0.4
+0.06 0.42 0.4
+0.94 0.42 0.4
+0.96 0.42 0.4
+0.98 0.42 0.4
+0.02 0.44 0.4
+0.04 0.44 0.4
+0.06 0.44 0.4
+0.94 0.44 0.4
+0.96 0.44 0.4
+0.98 0.44 0.4
+0.02 0.46 0.4
+0.04 0.46 0.4
+0.06 0.46 0.4
+0.94 0.46 0.4
+0.96 0.46 0.4
+0.98 0.46 0.4
+0.02 0.48 0.4
+0.04 0.48 0.4
+0.06 0.48 0.4
+0.94 0.48 0.4
+0.96 0.48 0.4
+0.98 0.48 0.4
+0.02 0.5 0.4
+0.04 0.5 0.4
+0.06 0.5 0.4
+0.94 0.5 0.4
+0.96 0.5 0.4
+0.98 0.5 0.4
+0.02 0.52 0.4
+0.04 0.52 0.4
+0.06 0.52 0.4
+0.94 0.52 0.4
+0.96 0.52 0.4
+0.98 0.52 0.4
+0.02 0.54 0.4
+0.04 0.54 0.4
+0.06 0.54 0.4
+0.94 0.54 0.4
+0.96 0.54 0.4
+0.98 0.54 0.4
+0.02 0.56 0.4
+0.04 0.56 0.4
+0.06 0.56 0.4
+0.94 0.56 0.4
+0.96 0.56 0.4
+0.98 0.56 0.4
+0.02 0.58 0.4
+0.04 0.58 0.4
+0.06 0.58 0.4
+0.94 0.58 0.4
+0.96 0.58 0.4
+0.98 0.58 0.4
+0.04 0.6 0.4
+0.06 0.6 0.4
+0.94 0.6 0.4
+0.96 0.6 0.4
+0.04 0.62 0.4
+0.06 0.62 0.4
+0.94 0.62 0.4
+0.96 0.62 0.4
+0.04 0.64 0.4
+0.06 0.64 0.4
+0.08 0.64 0.4
+0.92 0.64 0.4
+0.94 0.64 0.4
+0.96 0.64 0.4
+0.04 0.66 0.4
+0.06 0.66 0.4
+0.08 0.66 0.4
+0.92 0.66 0.4
+0.94 0.66 0.4
+0.96 0.66 0.4
+0.06 0.68 0.4
+0.08 0.68 0.4
+0.92 0.68 0.4
+0.94 0.68 0.4
+0.06 0.7 0.4
+0.08 0.7 0.4
+0.1 0.7 0.4
+0.9 0.7 0.4
+0.92 0.7 0.4
+0.94 0.7 0.4
+0.08 0.72 0.4
+0.1 0.72 0.4
+0.12 0.72 0.4
+0.88 0.72 0.4
+0.9 0.72 0.4
+0.92 0.72 0.4
+0.08 0.74 0.4
+0.1 0.74 0.4
+0.12 0.74 0.4
+0.88 0.74 0.4
+0.9 0.74 0.4
+0.92 0.74 0.4
+0.1 0.76 0.4
+0.12 0.76 0.4
+0.14 0.76 0.4
+0.86 0.76 0.4
+0.88 0.76 0.4
+0.9 0.76 0.4
+0.1 0.78 0.4
+0.12 0.78 0.4
+0.14 0.78 0.4
+0.16 0.78 0.4
+0.84 0.78 0.4
+0.86 0.78 0.4
+0.88 0.78 0.4
+0.9 0.78 0.4
+0.12 0.8 0.4
+0.14 0.8 0.4
+0.16 0.8 0.4
+0.84 0.8 0.4
+0.86 0.8 0.4
+0.88 0.8 0.4
+0.14 0.82 0.4
+0.16 0.82 0.4
+0.18 0.82 0.4
+0.82 0.82 0.4
+0.84 0.82 0.4
+0.86 0.82 0.4
+0.16 0.84 0.4
+0.18 0.84 0.4
+0.2 0.84 0.4
+0.22 0.84 0.4
+0.78 0.84 0.4
+0.8 0.84 0.4
+0.82 0.84 0.4
+0.84 0.84 0.4
+0.18 0.86 0.4
+0.2 0.86 0.4
+0.22 0.86 0.4
+0.24 0.86 0.4
+0.76 0.86 0.4
+0.78 0.86 0.4
+0.8 0.86 0.4
+0.82 0.86 0.4
+0.2 0.88 0.4
+0.22 0.88 0.4
+0.24 0.88 0.4
+0.26 0.88 0.4
+0.28 0.88 0.4
+0.72 0.88 0.4
+0.74 0.88 0.4
+0.76 0.88 0.4
+0.78 0.88 0.4
+0.8 0.88 0.4
+0.22 0.9 0.4
+0.24 0.9 0.4
+0.26 0.9 0.4
+0.28 0.9 0.4
+0.3 0.9 0.4
+0.7 0.9 0.4
+0.72 0.9 0.4
+0.74 0.9 0.4
+0.76 0.9 0.4
+0.78 0.9 0.4
+0.26 0.92 0.4
+0.28 0.92 0.4
+0.3 0.92 0.4
+0.32 0.92 0.4
+0.34 0.92 0.4
+0.36 0.92 0.4
+0.64 0.92 0.4
+0.66 0.92 0.4
+0.68 0.92 0.4
+0.7 0.92 0.4
+0.72 0.92 0.4
+0.74 0.92 0.4
+0.3 0.94 0.4
+0.32 0.94 0.4
+0.34 0.94 0.4
+0.36 0.94 0.4
+0.38 0.94 0.4
+0.4 0.94 0.4
+0.42 0.94 0.4
+0.44 0.94 0.4
+0.46 0.94 0.4
+0.48 0.94 0.4
+0.5 0.94 0.4
+0.52 0.94 0.4
+0.54 0.94 0.4
+0.56 0.94 0.4
+0.58 0.94 0.4
+0.6 0.94 0.4
+0.62 0.94 0.4
+0.64 0.94 0.4
+0.66 0.94 0.4
+0.68 0.94 0.4
+0.7 0.94 0.4
+0.34 0.96 0.4
+0.36 0.96 0.4
+0.38 0.96 0.4
+0.4 0.96 0.4
+0.42 0.96 0.4
+0.44 0.96 0.4
+0.46 0.96 0.4
+0.48 0.96 0.4
+0.5 0.96 0.4
+0.52 0.96 0.4
+0.54 0.96 0.4
+0.56 0.96 0.4
+0.58 0.96 0.4
+0.6 0.96 0.4
+0.62 0.96 0.4
+0.64 0.96 0.4
+0.66 0.96 0.4
+0.42 0.98 0.4
+0.44 0.98 0.4
+0.46 0.98 0.4
+0.48 0.98 0.4
+0.5 0.98 0.4
+0.52 0.98 0.4
+0.54 0.98 0.4
+0.56 0.98 0.4
+0.58 0.98 0.4
+0.4 0.02 0.42
+0.42 0.02 0.42
+0.44 0.02 0.42
+0.46 0.02 0.42
+0.48 0.02 0.42
+0.5 0.02 0.42
+0.52 0.02 0.42
+0.54 0.02 0.42
+0.56 0.02 0.42
+0.58 0.02 0.42
+0.6 0.02 0.42
+0.34 0.04 0.42
+0.36 0.04 0.42
+0.38 0.04 0.42
+0.4 0.04 0.42
+0.42 0.04 0.42
+0.44 0.04 0.42
+0.46 0.04 0.42
+0.48 0.04 0.42
+0.5 0.04 0.42
+0.52 0.04 0.42
+0.54 0.04 0.42
+0.56 0.04 0.42
+0.58 0.04 0.42
+0.6 0.04 0.42
+0.62 0.04 0.42
+0.64 0.04 0.42
+0.66 0.04 0.42
+0.28 0.06 0.42
+0.3 0.06 0.42
+0.32 0.06 0.42
+0.34 0.06 0.42
+0.36 0.06 0.42
+0.38 0.06 0.42
+0.4 0.06 0.42
+0.42 0.06 0.42
+0.44 0.06 0.42
+0.56 0.06 0.42
+0.58 0.06 0.42
+0.6 0.06 0.42
+0.62 0.06 0.42
+0.64 0.06 0.42
+0.66 0.06 0.42
+0.68 0.06 0.42
+0.7 0.06 0.42
+0.72 0.06 0.42
+0.26 0.08 0.42
+0.28 0.08 0.42
+0.3 0.08 0.42
+0.32 0.08 0.42
+0.34 0.08 0.42
+0.66 0.08 0.42
+0.68 0.08 0.42
+0.7 0.08 0.42
+0.72 0.08 0.42
+0.74 0.08 0.42
+0.22 0.1 0.42
+0.24 0.1 0.42
+0.26 0.1 0.42
+0.28 0.1 0.42
+0.3 0.1 0.42
+0.7 0.1 0.42
+0.72 0.1 0.42
+0.74 0.1 0.42
+0.76 0.1 0.42
+0.78 0.1 0.42
+0.2 0.12 0.42
+0.22 0.12 0.42
+0.24 0.12 0.42
+0.26 0.12 0.42
+0.74 0.12 0.42
+0.76 0.12 0.42
+0.78 0.12 0.42
+0.8 0.12 0.42
+0.18 0.14 0.42
+0.2 0.14 0.42
+0.22 0.14 0.42
+0.24 0.14 0.42
+0.76 0.14 0.42
+0.78 0.14 0.42
+0.8 0.14 0.42
+0.82 0.14 0.42
+0.16 0.16 0.42
+0.18 0.16 0.42
+0.2 0.16 0.42
+0.8 0.16 0.42
+0.82 0.16 0.42
+0.84 0.16 0.42
+0.14 0.18 0.42
+0.16 0.18 0.42
+0.18 0.18 0.42
+0.82 0.18 0.42
+0.84 0.18 0.42
+0.86 0.18 0.42
+0.12 0.2 0.42
+0.14 0.2 0.42
+0.16 0.2 0.42
+0.84 0.2 0.42
+0.86 0.2 0.42
+0.88 0.2 0.42
+0.1 0.22 0.42
+0.12 0.22 0.42
+0.14 0.22 0.42
+0.86 0.22 0.42
+0.88 0.22 0.42
+0.9 0.22 0.42
+0.1 0.24 0.42
+0.12 0.24 0.42
+0.14 0.24 0.42
+0.86 0.24 0.42
+0.88 0.24 0.42
+0.9 0.24 0.42
+0.08 0.26 0.42
+0.1 0.26 0.42
+0.12 0.26 0.42
+0.88 0.26 0.42
+0.9 0.26 0.42
+0.92 0.26 0.42
+0.06 0.28 0.42
+0.08 0.28 0.42
+0.1 0.28 0.42
+0.9 0.28 0.42
+0.92 0.28 0.42
+0.94 0.28 0.42
+0.06 0.3 0.42
+0.08 0.3 0.42
+0.1 0.3 0.42
+0.9 0.3 0.42
+0.92 0.3 0.42
+0.94 0.3 0.42
+0.06 0.32 0.42
+0.08 0.32 0.42
+0.92 0.32 0.42
+0.94 0.32 0.42
+0.04 0.34 0.42
+0.06 0.34 0.42
+0.08 0.34 0.42
+0.92 0.34 0.42
+0.94 0.34 0.42
+0.96 0.34 0.42
+0.04 0.36 0.42
+0.06 0.36 0.42
+0.94 0.36 0.42
+0.96 0.36 0.42
+0.04 0.38 0.42
+0.06 0.38 0.42
+0.94 0.38 0.42
+0.96 0.38 0.42
+0.02 0.4 0.42
+0.04 0.4 0.42
+0.06 0.4 0.42
+0.94 0.4 0.42
+0.96 0.4 0.42
+0.98 0.4 0.42
+0.02 0.42 0.42
+0.04 0.42 0.42
+0.06 0.42 0.42
+0.94 0.42 0.42
+0.96 0.42 0.42
+0.98 0.42 0.42
+0.02 0.44 0.42
+0.04 0.44 0.42
+0.06 0.44 0.42
+0.94 0.44 0.42
+0.96 0.44 0.42
+0.98 0.44 0.42
+0.02 0.46 0.42
+0.04 0.46 0.42
+0.96 0.46 0.42
+0.98 0.46 0.42
+0.02 0.48 0.42
+0.04 0.48 0.42
+0.96 0.48 0.42
+0.98 0.48 0.42
+0.02 0.5 0.42
+0.04 0.5 0.42
+0.96 0.5 0.42
+0.98 0.5 0.42
+0.02 0.52 0.42
+0.04 0.52 0.42
+0.96 0.52 0.42
+0.98 0.52 0.42
+0.02 0.54 0.42
+0.04 0.54 0.42
+0.96 0.54 0.42
+0.98 0.54 0.42
+0.02 0.56 0.42
+0.04 0.56 0.42
+0.06 0.56 0.42
+0.94 0.56 0.42
+0.96 0.56 0.42
+0.98 0.56 0.42
+0.02 0.58 0.42
+0.04 0.58 0.42
+0.06 0.58 0.42
+0.94 0.58 0.42
+0.96 0.58 0.42
+0.98 0.58 0.42
+0.02 0.6 0.42
+0.04 0.6 0.42
+0.06 0.6 0.42
+0.94 0.6 0.42
+0.96 0.6 0.42
+0.98 0.6 0.42
+0.04 0.62 0.42
+0.06 0.62 0.42
+0.94 0.62 0.42
+0.96 0.62 0.42
+0.04 0.64 0.42
+0.06 0.64 0.42
+0.94 0.64 0.42
+0.96 0.64 0.42
+0.04 0.66 0.42
+0.06 0.66 0.42
+0.08 0.66 0.42
+0.92 0.66 0.42
+0.94 0.66 0.42
+0.96 0.66 0.42
+0.06 0.68 0.42
+0.08 0.68 0.42
+0.92 0.68 0.42
+0.94 0.68 0.42
+0.06 0.7 0.42
+0.08 0.7 0.42
+0.1 0.7 0.42
+0.9 0.7 0.42
+0.92 0.7 0.42
+0.94 0.7 0.42
+0.06 0.72 0.42
+0.08 0.72 0.42
+0.1 0.72 0.42
+0.9 0.72 0.42
+0.92 0.72 0.42
+0.94 0.72 0.42
+0.08 0.74 0.42
+0.1 0.74 0.42
+0.12 0.74 0.42
+0.88 0.74 0.42
+0.9 0.74 0.42
+0.92 0.74 0.42
+0.1 0.76 0.42
+0.12 0.76 0.42
+0.14 0.76 0.42
+0.86 0.76 0.42
+0.88 0.76 0.42
+0.9 0.76 0.42
+0.1 0.78 0.42
+0.12 0.78 0.42
+0.14 0.78 0.42
+0.86 0.78 0.42
+0.88 0.78 0.42
+0.9 0.78 0.42
+0.12 0.8 0.42
+0.14 0.8 0.42
+0.16 0.8 0.42
+0.84 0.8 0.42
+0.86 0.8 0.42
+0.88 0.8 0.42
+0.14 0.82 0.42
+0.16 0.82 0.42
+0.18 0.82 0.42
+0.82 0.82 0.42
+0.84 0.82 0.42
+0.86 0.82 0.42
+0.16 0.84 0.42
+0.18 0.84 0.42
+0.2 0.84 0.42
+0.8 0.84 0.42
+0.82 0.84 0.42
+0.84 0.84 0.42
+0.18 0.86 0.42
+0.2 0.86 0.42
+0.22 0.86 0.42
+0.24 0.86 0.42
+0.76 0.86 0.42
+0.78 0.86 0.42
+0.8 0.86 0.42
+0.82 0.86 0.42
+0.2 0.88 0.42
+0.22 0.88 0.42
+0.24 0.88 0.42
+0.26 0.88 0.42
+0.74 0.88 0.42
+0.76 0.88 0.42
+0.78 0.88 0.42
+0.8 0.88 0.42
+0.22 0.9 0.42
+0.24 0.9 0.42
+0.26 0.9 0.42
+0.28 0.9 0.42
+0.3 0.9 0.42
+0.7 0.9 0.42
+0.72 0.9 0.42
+0.74 0.9 0.42
+0.76 0.9 0.42
+0.78 0.9 0.42
+0.26 0.92 0.42
+0.28 0.92 0.42
+0.3 0.92 0.42
+0.32 0.92 0.42
+0.34 0.92 0.42
+0.66 0.92 0.42
+0.68 0.92 0.42
+0.7 0.92 0.42
+0.72 0.92 0.42
+0.74 0.92 0.42
+0.28 0.94 0.42
+0.3 0.94 0.42
+0.32 0.94 0.42
+0.34 0.94 0.42
+0.36 0.94 0.42
+0.38 0.94 0.42
+0.4 0.94 0.42
+0.42 0.94 0.42
+0.44 0.94 0.42
+0.56 0.94 0.42
+0.58 0.94 0.42
+0.6 0.94 0.42
+0.62 0.94 0.42
+0.64 0.94 0.42
+0.66 0.94 0.42
+0.68 0.94 0.42
+0.7 0.94 0.42
+0.72 0.94 0.42
+0.34 0.96 0.42
+0.36 0.96 0.42
+0.38 0.96 0.42
+0.4 0.96 0.42
+0.42 0.96 0.42
+0.44 0.96 0.42
+0.46 0.96 0.42
+0.48 0.96 0.42
+0.5 0.96 0.42
+0.52 0.96 0.42
+0.54 0.96 0.42
+0.56 0.96 0.42
+0.58 0.96 0.42
+0.6 0.96 0.42
+0.62 0.96 0.42
+0.64 0.96 0.42
+0.66 0.96 0.42
+0.4 0.98 0.42
+0.42 0.98 0.42
+0.44 0.98 0.42
+0.46 0.98 0.42
+0.48 0.98 0.42
+0.5 0.98 0.42
+0.52 0.98 0.42
+0.54 0.98 0.42
+0.56 0.98 0.42
+0.58 0.98 0.42
+0.6 0.98 0.42
+0.38 0.02 0.44
+0.4 0.02 0.44
+0.42 0.02 0.44
+0.44 0.02 0.44
+0.46 0.02 0.44
+0.48 0.02 0.44
+0.5 0.02 0.44
+0.52 0.02 0.44
+0.54 0.02 0.44
+0.56 0.02 0.44
+0.58 0.02 0.44
+0.6 0.02 0.44
+0.62 0.02 0.44
+0.32 0.04 0.44
+0.34 0.04 0.44
+0.36 0.04 0.44
+0.38 0.04 0.44
+0.4 0.04 0.44
+0.42 0.04 0.44
+0.44 0.04 0.44
+0.46 0.04 0.44
+0.48 0.04 0.44
+0.5 0.04 0.44
+0.52 0.04 0.44
+0.54 0.04 0.44
+0.56 0.04 0.44
+0.58 0.04 0.44
+0.6 0.04 0.44
+0.62 0.04 0.44
+0.64 0.04 0.44
+0.66 0.04 0.44
+0.68 0.04 0.44
+0.28 0.06 0.44
+0.3 0.06 0.44
+0.32 0.06 0.44
+0.34 0.06 0.44
+0.36 0.06 0.44
+0.38 0.06 0.44
+0.4 0.06 0.44
+0.42 0.06 0.44
+0.58 0.06 0.44
+0.6 0.06 0.44
+0.62 0.06 0.44
+0.64 0.06 0.44
+0.66 0.06 0.44
+0.68 0.06 0.44
+0.7 0.06 0.44
+0.72 0.06 0.44
+0.24 0.08 0.44
+0.26 0.08 0.44
+0.28 0.08 0.44
+0.3 0.08 0.44
+0.32 0.08 0.44
+0.34 0.08 0.44
+0.66 0.08 0.44
+0.68 0.08 0.44
+0.7 0.08 0.44
+0.72 0.08 0.44
+0.74 0.08 0.44
+0.76 0.08 0.44
+0.22 0.1 0.44
+0.24 0.1 0.44
+0.26 0.1 0.44
+0.28 0.1 0.44
+0.3 0.1 0.44
+0.7 0.1 0.44
+0.72 0.1 0.44
+0.74 0.1 0.44
+0.76 0.1 0.44
+0.78 0.1 0.44
+0.2 0.12 0.44
+0.22 0.12 0.44
+0.24 0.12 0.44
+0.26 0.12 0.44
+0.74 0.12 0.44
+0.76 0.12 0.44
+0.78 0.12 0.44
+0.8 0.12 0.44
+0.16 0.14 0.44
+0.18 0.14 0.44
+0.2 0.14 0.44
+0.22 0.14 0.44
+0.78 0.14 0.44
+0.8 0.14 0.44
+0.82 0.14 0.44
+0.84 0.14 0.44
+0.14 0.16 0.44
+0.16 0.16 0.44
+0.18 0.16 0.44
+0.2 0.16 0.44
+0.8 0.16 0.44
+0.82 0.16 0.44
+0.84 0.16 0.44
+0.86 0.16 0.44
+0.14 0.18 0.44
+0.16 0.18 0.44
+0.18 0.18 0.44
+0.82 0.18 0.44
+0.84 0.18 0.44
+0.86 0.18 0.44
+0.12 0.2 0.44
+0.14 0.2 0.44
+0.16 0.2 0.44
+0.84 0.2 0.44
+0.86 0.2 0.44
+0.88 0.2 0.44
+0.1 0.22 0.44
+0.12 0.22 0.44
+0.14 0.22 0.44
+0.86 0.22 0.44
+0.88 0.22 0.44
+0.9 0.22 0.44
+0.08 0.24 0.44
+0.1 0.24 0.44
+0.12 0.24 0.44
+0.88 0.24 0.44
+0.9 0.24 0.44
+0.92 0.24 0.44
+0.08 0.26 0.44
+0.1 0.26 0.44
+0.12 0.26 0.44
+0.88 0.26 0.44
+0.9 0.26 0.44
+0.92 0.26 0.44
+0.06 0.28 0.44
+0.08 0.28 0.44
+0.1 0.28 0.44
+0.9 0.28 0.44
+0.92 0.28 0.44
+0.94 0.28 0.44
+0.06 0.3 0.44
+0.08 0.3 0.44
+0.1 0.3 0.44
+0.9 0.3 0.44
+0.92 0.3 0.44
+0.94 0.3 0.44
+0.04 0.32 0.44
+0.06 0.32 0.44
+0.08 0.32 0.44
+0.92 0.32 0.44
+0.94 0.32 0.44
+0.96 0.32 0.44
+0.04 0.34 0.44
+0.06 0.34 0.44
+0.08 0.34 0.44
+0.92 0.34 0.44
+0.94 0.34 0.44
+0.96 0.34 0.44
+0.04 0.36 0.44
+0.06 0.36 0.44
+0.94 0.36 0.44
+0.96 0.36 0.44
+0.02 0.38 0.44
+0.04 0.38 0.44
+0.06 0.38 0.44
+0.94 0.38 0.44
+0.96 0.38 0.44
+0.98 0.38 0.44
+0.02 0.4 0.44
+0.04 0.4 0.44
+0.06 0.4 0.44
+0.94 0.4 0.44
+0.96 0.4 0.44
+0.98 0.4 0.44
+0.02 0.42 0.44
+0.04 0.42 0.44
+0.06 0.42 0.44
+0.94 0.42 0.44
+0.96 0.42 0.44
+0.98 0.42 0.44
+0.02 0.44 0.44
+0.04 0.44 0.44
+0.96 0.44 0.44
+0.98 0.44 0.44
+0.02 0.46 0.44
+0.04 0.46 0.44
+0.96 0.46 0.44
+0.98 0.46 0.44
+0.02 0.48 0.44
+0.04 0.48 0.44
+0.96 0.48 0.44
+0.98 0.48 0.44
+0.02 0.5 0.44
+0.04 0.5 0.44
+0.96 0.5 0.44
+0.98 0.5 0.44
+0.02 0.52 0.44
+0.04 0.52 0.44
+0.96 0.52 0.44
+0.98 0.52 0.44
+0.02 0.54 0.44
+0.04 0.54 0.44
+0.96 0.54 0.44
+0.98 0.54 0.44
+0.02 0.56 0.44
+0.04 0.56 0.44
+0.96 0.56 0.44
+0.98 0.56 0.44
+0.02 0.58 0.44
+0.04 0.58 0.44
+0.06 0.58 0.44
+0.94 0.58 0.44
+0.96 0.58 0.44
+0.98 0.58 0.44
+0.02 0.6 0.44
+0.04 0.6 0.44
+0.06 0.6 0.44
+0.94 0.6 0.44
+0.96 0.6 0.44
+0.98 0.6 0.44
+0.02 0.62 0.44
+0.04 0.62 0.44
+0.06 0.62 0.44
+0.94 0.62 0.44
+0.96 0.62 0.44
+0.98 0.62 0.44
+0.04 0.64 0.44
+0.06 0.64 0.44
+0.94 0.64 0.44
+0.96 0.64 0.44
+0.04 0.66 0.44
+0.06 0.66 0.44
+0.08 0.66 0.44
+0.92 0.66 0.44
+0.94 0.66 0.44
+0.96 0.66 0.44
+0.04 0.68 0.44
+0.06 0.68 0.44
+0.08 0.68 0.44
+0.92 0.68 0.44
+0.94 0.68 0.44
+0.96 0.68 0.44
+0.06 0.7 0.44
+0.08 0.7 0.44
+0.1 0.7 0.44
+0.9 0.7 0.44
+0.92 0.7 0.44
+0.94 0.7 0.44
+0.06 0.72 0.44
+0.08 0.72 0.44
+0.1 0.72 0.44
+0.9 0.72 0.44
+0.92 0.72 0.44
+0.94 0.72 0.44
+0.08 0.74 0.44
+0.1 0.74 0.44
+0.12 0.74 0.44
+0.88 0.74 0.44
+0.9 0.74 0.44
+0.92 0.74 0.44
+0.08 0.76 0.44
+0.1 0.76 0.44
+0.12 0.76 0.44
+0.88 0.76 0.44
+0.9 0.76 0.44
+0.92 0.76 0.44
+0.1 0.78 0.44
+0.12 0.78 0.44
+0.14 0.78 0.44
+0.86 0.78 0.44
+0.88 0.78 0.44
+0.9 0.78 0.44
+0.12 0.8 0.44
+0.14 0.8 0.44
+0.16 0.8 0.44
+0.84 0.8 0.44
+0.86 0.8 0.44
+0.88 0.8 0.44
+0.14 0.82 0.44
+0.16 0.82 0.44
+0.18 0.82 0.44
+0.82 0.82 0.44
+0.84 0.82 0.44
+0.86 0.82 0.44
+0.14 0.84 0.44
+0.16 0.84 0.44
+0.18 0.84 0.44
+0.2 0.84 0.44
+0.8 0.84 0.44
+0.82 0.84 0.44
+0.84 0.84 0.44
+0.86 0.84 0.44
+0.16 0.86 0.44
+0.18 0.86 0.44
+0.2 0.86 0.44
+0.22 0.86 0.44
+0.78 0.86 0.44
+0.8 0.86 0.44
+0.82 0.86 0.44
+0.84 0.86 0.44
+0.2 0.88 0.44
+0.22 0.88 0.44
+0.24 0.88 0.44
+0.26 0.88 0.44
+0.74 0.88 0.44
+0.76 0.88 0.44
+0.78 0.88 0.44
+0.8 0.88 0.44
+0.22 0.9 0.44
+0.24 0.9 0.44
+0.26 0.9 0.44
+0.28 0.9 0.44
+0.3 0.9 0.44
+0.7 0.9 0.44
+0.72 0.9 0.44
+0.74 0.9 0.44
+0.76 0.9 0.44
+0.78 0.9 0.44
+0.24 0.92 0.44
+0.26 0.92 0.44
+0.28 0.92 0.44
+0.3 0.92 0.44
+0.32 0.92 0.44
+0.34 0.92 0.44
+0.66 0.92 0.44
+0.68 0.92 0.44
+0.7 0.92 0.44
+0.72 0.92 0.44
+0.74 0.92 0.44
+0.76 0.92 0.44
+0.28 0.94 0.44
+0.3 0.94 0.44
+0.32 0.94 0.44
+0.34 0.94 0.44
+0.36 0.94 0.44
+0.38 0.94 0.44
+0.4 0.94 0.44
+0.42 0.94 0.44
+0.58 0.94 0.44
+0.6 0.94 0.44
+0.62 0.94 0.44
+0.64 0.94 0.44
+0.66 0.94 0.44
+0.68 0.94 0.44
+0.7 0.94 0.44
+0.72 0.94 0.44
+0.32 0.96 0.44
+0.34 0.96 0.44
+0.36 0.96 0.44
+0.38 0.96 0.44
+0.4 0.96 0.44
+0.42 0.96 0.44
+0.44 0.96 0.44
+0.46 0.96 0.44
+0.48 0.96 0.44
+0.5 0.96 0.44
+0.52 0.96 0.44
+0.54 0.96 0.44
+0.56 0.96 0.44
+0.58 0.96 0.44
+0.6 0.96 0.44
+0.62 0.96 0.44
+0.64 0.96 0.44
+0.66 0.96 0.44
+0.68 0.96 0.44
+0.38 0.98 0.44
+0.4 0.98 0.44
+0.42 0.98 0.44
+0.44 0.98 0.44
+0.46 0.98 0.44
+0.48 0.98 0.44
+0.5 0.98 0.44
+0.52 0.98 0.44
+0.54 0.98 0.44
+0.56 0.98 0.44
+0.58 0.98 0.44
+0.6 0.98 0.44
+0.62 0.98 0.44
+0.38 0.02 0.46
+0.4 0.02 0.46
+0.42 0.02 0.46
+0.44 0.02 0.46
+0.46 0.02 0.46
+0.48 0.02 0.46
+0.5 0.02 0.46
+0.52 0.02 0.46
+0.54 0.02 0.46
+0.56 0.02 0.46
+0.58 0.02 0.46
+0.6 0.02 0.46
+0.62 0.02 0.46
+0.32 0.04 0.46
+0.34 0.04 0.46
+0.36 0.04 0.46
+0.38 0.04 0.46
+0.4 0.04 0.46
+0.42 0.04 0.46
+0.44 0.04 0.46
+0.46 0.04 0.46
+0.48 0.04 0.46
+0.5 0.04 0.46
+0.52 0.04 0.46
+0.54 0.04 0.46
+0.56 0.04 0.46
+0.58 0.04 0.46
+0.6 0.04 0.46
+0.62 0.04 0.46
+0.64 0.04 0.46
+0.66 0.04 0.46
+0.68 0.04 0.46
+0.28 0.06 0.46
+0.3 0.06 0.46
+0.32 0.06 0.46
+0.34 0.06 0.46
+0.36 0.06 0.46
+0.38 0.06 0.46
+0.4 0.06 0.46
+0.6 0.06 0.46
+0.62 0.06 0.46
+0.64 0.06 0.46
+0.66 0.06 0.46
+0.68 0.06 0.46
+0.7 0.06 0.46
+0.72 0.06 0.46
+0.24 0.08 0.46
+0.26 0.08 0.46
+0.28 0.08 0.46
+0.3 0.08 0.46
+0.32 0.08 0.46
+0.34 0.08 0.46
+0.66 0.08 0.46
+0.68 0.08 0.46
+0.7 0.08 0.46
+0.72 0.08 0.46
+0.74 0.08 0.46
+0.76 0.08 0.46
+0.22 0.1 0.46
+0.24 0.1 0.46
+0.26 0.1 0.46
+0.28 0.1 0.46
+0.72 0.1 0.46
+0.74 0.1 0.46
+0.76 0.1 0.46
+0.78 0.1 0.46
+0.18 0.12 0.46
+0.2 0.12 0.46
+0.22 0.12 0.46
+0.24 0.12 0.46
+0.26 0.12 0.46
+0.74 0.12 0.46
+0.76 0.12 0.46
+0.78 0.12 0.46
+0.8 0.12 0.46
+0.82 0.12 0.46
+0.16 0.14 0.46
+0.18 0.14 0.46
+0.2 0.14 0.46
+0.22 0.14 0.46
+0.78 0.14 0.46
+0.8 0.14 0.46
+0.82 0.14 0.46
+0.84 0.14 0.46
+0.14 0.16 0.46
+0.16 0.16 0.46
+0.18 0.16 0.46
+0.2 0.16 0.46
+0.8 0.16 0.46
+0.82 0.16 0.46
+0.84 0.16 0.46
+0.86 0.16 0.46
+0.12 0.18 0.46
+0.14 0.18 0.46
+0.16 0.18 0.46
+0.18 0.18 0.46
+0.82 0.18 0.46
+0.84 0.18 0.46
+0.86 0.18 0.46
+0.88 0.18 0.46
+0.12 0.2 0.46
+0.14 0.2 0.46
+0.16 0.2 0.46
+0.84 0.2 0.46
+0.86 0.2 0.46
+0.88 0.2 0.46
+0.1 0.22 0.46
+0.12 0.22 0.46
+0.14 0.22 0.46
+0.86 0.22 0.46
+0.88 0.22 0.46
+0.9 0.22 0.46
+0.08 0.24 0.46
+0.1 0.24 0.46
+0.12 0.24 0.46
+0.88 0.24 0.46
+0.9 0.24 0.46
+0.92 0.24 0.46
+0.08 0.26 0.46
+0.1 0.26 0.46
+0.12 0.26 0.46
+0.88 0.26 0.46
+0.9 0.26 0.46
+0.92 0.26 0.46
+0.06 0.28 0.46
+0.08 0.28 0.46
+0.1 0.28 0.46
+0.9 0.28 0.46
+0.92 0.28 0.46
+0.94 0.28 0.46
+0.06 0.3 0.46
+0.08 0.3 0.46
+0.92 0.3 0.46
+0.94 0.3 0.46
+0.04 0.32 0.46
+0.06 0.32 0.46
+0.08 0.32 0.46
+0.92 0.32 0.46
+0.94 0.32 0.46
+0.96 0.32 0.46
+0.04 0.34 0.46
+0.06 0.34 0.46
+0.08 0.34 0.46
+0.92 0.34 0.46
+0.94 0.34 0.46
+0.96 0.34 0.46
+0.04 0.36 0.46
+0.06 0.36 0.46
+0.94 0.36 0.46
+0.96 0.36 0.46
+0.02 0.38 0.46
+0.04 0.38 0.46
+0.06 0.38 0.46
+0.94 0.38 0.46
+0.96 0.38 0.46
+0.98 0.38 0.46
+0.02 0.4 0.46
+0.04 0.4 0.46
+0.06 0.4 0.46
+0.94 0.4 0.46
+0.96 0.4 0.46
+0.98 0.4 0.46
+0.02 0.42 0.46
+0.04 0.42 0.46
+0.96 0.42 0.46
+0.98 0.42 0.46
+0.02 0.44 0.46
+0.04 0.44 0.46
+0.96 0.44 0.46
+0.98 0.44 0.46
+0.02 0.46 0.46
+0.04 0.46 0.46
+0.96 0.46 0.46
+0.98 0.46 0.46
+0.02 0.48 0.46
+0.04 0.48 0.46
+0.96 0.48 0.46
+0.98 0.48 0.46
+0.02 0.5 0.46
+0.04 0.5 0.46
+0.96 0.5 0.46
+0.98 0.5 0.46
+0.02 0.52 0.46
+0.04 0.52 0.46
+0.96 0.52 0.46
+0.98 0.52 0.46
+0.02 0.54 0.46
+0.04 0.54 0.46
+0.96 0.54 0.46
+0.98 0.54 0.46
+0.02 0.56 0.46
+0.04 0.56 0.46
+0.96 0.56 0.46
+0.98 0.56 0.46
+0.02 0.58 0.46
+0.04 0.58 0.46
+0.96 0.58 0.46
+0.98 0.58 0.46
+0.02 0.6 0.46
+0.04 0.6 0.46
+0.06 0.6 0.46
+0.94 0.6 0.46
+0.96 0.6 0.46
+0.98 0.6 0.46
+0.02 0.62 0.46
+0.04 0.62 0.46
+0.06 0.62 0.46
+0.94 0.62 0.46
+0.96 0.62 0.46
+0.98 0.62 0.46
+0.04 0.64 0.46
+0.06 0.64 0.46
+0.94 0.64 0.46
+0.96 0.64 0.46
+0.04 0.66 0.46
+0.06 0.66 0.46
+0.08 0.66 0.46
+0.92 0.66 0.46
+0.94 0.66 0.46
+0.96 0.66 0.46
+0.04 0.68 0.46
+0.06 0.68 0.46
+0.08 0.68 0.46
+0.92 0.68 0.46
+0.94 0.68 0.46
+0.96 0.68 0.46
+0.06 0.7 0.46
+0.08 0.7 0.46
+0.92 0.7 0.46
+0.94 0.7 0.46
+0.06 0.72 0.46
+0.08 0.72 0.46
+0.1 0.72 0.46
+0.9 0.72 0.46
+0.92 0.72 0.46
+0.94 0.72 0.46
+0.08 0.74 0.46
+0.1 0.74 0.46
+0.12 0.74 0.46
+0.88 0.74 0.46
+0.9 0.74 0.46
+0.92 0.74 0.46
+0.08 0.76 0.46
+0.1 0.76 0.46
+0.12 0.76 0.46
+0.88 0.76 0.46
+0.9 0.76 0.46
+0.92 0.76 0.46
+0.1 0.78 0.46
+0.12 0.78 0.46
+0.14 0.78 0.46
+0.86 0.78 0.46
+0.88 0.78 0.46
+0.9 0.78 0.46
+0.12 0.8 0.46
+0.14 0.8 0.46
+0.16 0.8 0.46
+0.84 0.8 0.46
+0.86 0.8 0.46
+0.88 0.8 0.46
+0.12 0.82 0.46
+0.14 0.82 0.46
+0.16 0.82 0.46
+0.18 0.82 0.46
+0.82 0.82 0.46
+0.84 0.82 0.46
+0.86 0.82 0.46
+0.88 0.82 0.46
+0.14 0.84 0.46
+0.16 0.84 0.46
+0.18 0.84 0.46
+0.2 0.84 0.46
+0.8 0.84 0.46
+0.82 0.84 0.46
+0.84 0.84 0.46
+0.86 0.84 0.46
+0.16 0.86 0.46
+0.18 0.86 0.46
+0.2 0.86 0.46
+0.22 0.86 0.46
+0.78 0.86 0.46
+0.8 0.86 0.46
+0.82 0.86 0.46
+0.84 0.86 0.46
+0.18 0.88 0.46
+0.2 0.88 0.46
+0.22 0.88 0.46
+0.24 0.88 0.46
+0.26 0.88 0.46
+0.74 0.88 0.46
+0.76 0.88 0.46
+0.78 0.88 0.46
+0.8 0.88 0.46
+0.82 0.88 0.46
+0.22 0.9 0.46
+0.24 0.9 0.46
+0.26 0.9 0.46
+0.28 0.9 0.46
+0.72 0.9 0.46
+0.74 0.9 0.46
+0.76 0.9 0.46
+0.78 0.9 0.46
+0.24 0.92 0.46
+0.26 0.92 0.46
+0.28 0.92 0.46
+0.3 0.92 0.46
+0.32 0.92 0.46
+0.34 0.92 0.46
+0.66 0.92 0.46
+0.68 0.92 0.46
+0.7 0.92 0.46
+0.72 0.92 0.46
+0.74 0.92 0.46
+0.76 0.92 0.46
+0.28 0.94 0.46
+0.3 0.94 0.46
+0.32 0.94 0.46
+0.34 0.94 0.46
+0.36 0.94 0.46
+0.38 0.94 0.46
+0.4 0.94 0.46
+0.6 0.94 0.46
+0.62 0.94 0.46
+0.64 0.94 0.46
+0.66 0.94 0.46
+0.68 0.94 0.46
+0.7 0.94 0.46
+0.72 0.94 0.46
+0.32 0.96 0.46
+0.34 0.96 0.46
+0.36 0.96 0.46
+0.38 0.96 0.46
+0.4 0.96 0.46
+0.42 0.96 0.46
+0.44 0.96 0.46
+0.46 0.96 0.46
+0.48 0.96 0.46
+0.5 0.96 0.46
+0.52 0.96 0.46
+0.54 0.96 0.46
+0.56 0.96 0.46
+0.58 0.96 0.46
+0.6 0.96 0.46
+0.62 0.96 0.46
+0.64 0.96 0.46
+0.66 0.96 0.46
+0.68 0.96 0.46
+0.38 0.98 0.46
+0.4 0.98 0.46
+0.42 0.98 0.46
+0.44 0.98 0.46
+0.46 0.98 0.46
+0.48 0.98 0.46
+0.5 0.98 0.46
+0.52 0.98 0.46
+0.54 0.98 0.46
+0.56 0.98 0.46
+0.58 0.98 0.46
+0.6 0.98 0.46
+0.62 0.98 0.46
+0.38 0.02 0.48
+0.4 0.02 0.48
+0.42 0.02 0.48
+0.44 0.02 0.48
+0.46 0.02 0.48
+0.48 0.02 0.48
+0.5 0.02 0.48
+0.52 0.02 0.48
+0.54 0.02 0.48
+0.56 0.02 0.48
+0.58 0.02 0.48
+0.6 0.02 0.48
+0.62 0.02 0.48
+0.32 0.04 0.48
+0.34 0.04 0.48
+0.36 0.04 0.48
+0.38 0.04 0.48
+0.4 0.04 0.48
+0.42 0.04 0.48
+0.44 0.04 0.48
+0.46 0.04 0.48
+0.48 0.04 0.48
+0.5 0.04 0.48
+0.52 0.04 0.48
+0.54 0.04 0.48
+0.56 0.04 0.48
+0.58 0.04 0.48
+0.6 0.04 0.48
+0.62 0.04 0.48
+0.64 0.04 0.48
+0.66 0.04 0.48
+0.68 0.04 0.48
+0.28 0.06 0.48
+0.3 0.06 0.48
+0.32 0.06 0.48
+0.34 0.06 0.48
+0.36 0.06 0.48
+0.38 0.06 0.48
+0.4 0.06 0.48
+0.6 0.06 0.48
+0.62 0.06 0.48
+0.64 0.06 0.48
+0.66 0.06 0.48
+0.68 0.06 0.48
+0.7 0.06 0.48
+0.72 0.06 0.48
+0.24 0.08 0.48
+0.26 0.08 0.48
+0.28 0.08 0.48
+0.3 0.08 0.48
+0.32 0.08 0.48
+0.68 0.08 0.48
+0.7 0.08 0.48
+0.72 0.08 0.48
+0.74 0.08 0.48
+0.76 0.08 0.48
+0.22 0.1 0.48
+0.24 0.1 0.48
+0.26 0.1 0.48
+0.28 0.1 0.48
+0.72 0.1 0.48
+0.74 0.1 0.48
+0.76 0.1 0.48
+0.78 0.1 0.48
+0.18 0.12 0.48
+0.2 0.12 0.48
+0.22 0.12 0.48
+0.24 0.12 0.48
+0.76 0.12 0.48
+0.78 0.12 0.48
+0.8 0.12 0.48
+0.82 0.12 0.48
+0.16 0.14 0.48
+0.18 0.14 0.48
+0.2 0.14 0.48
+0.22 0.14 0.48
+0.78 0.14 0.48
+0.8 0.14 0.48
+0.82 0.14 0.48
+0.84 0.14 0.48
+0.14 0.16 0.48
+0.16 0.16 0.48
+0.18 0.16 0.48
+0.2 0.16 0.48
+0.8 0.16 0.48
+0.82 0.16 0.48
+0.84 0.16 0.48
+0.86 0.16 0.48
+0.12 0.18 0.48
+0.14 0.18 0.48
+0.16 0.18 0.48
+0.18 0.18 0.48
+0.82 0.18 0.48
+0.84 0.18 0.48
+0.86 0.18 0.48
+0.88 0.18 0.48
+0.12 0.2 0.48
+0.14 0.2 0.48
+0.16 0.2 0.48
+0.84 0.2 0.48
+0.86 0.2 0.48
+0.88 0.2 0.48
+0.1 0.22 0.48
+0.12 0.22 0.48
+0.14 0.22 0.48
+0.86 0.22 0.48
+0.88 0.22 0.48
+0.9 0.22 0.48
+0.08 0.24 0.48
+0.1 0.24 0.48
+0.12 0.24 0.48
+0.88 0.24 0.48
+0.9 0.24 0.48
+0.92 0.24 0.48
+0.08 0.26 0.48
+0.1 0.26 0.48
+0.9 0.26 0.48
+0.92 0.26 0.48
+0.06 0.28 0.48
+0.08 0.28 0.48
+0.1 0.28 0.48
+0.9 0.28 0.48
+0.92 0.28 0.48
+0.94 0.28 0.48
+0.06 0.3 0.48
+0.08 0.3 0.48
+0.92 0.3 0.48
+0.94 0.3 0.48
+0.04 0.32 0.48
+0.06 0.32 0.48
+0.08 0.32 0.48
+0.92 0.32 0.48
+0.94 0.32 0.48
+0.96 0.32 0.48
+0.04 0.34 0.48
+0.06 0.34 0.48
+0.94 0.34 0.48
+0.96 0.34 0.48
+0.04 0.36 0.48
+0.06 0.36 0.48
+0.94 0.36 0.48
+0.96 0.36 0.48
+0.02 0.38 0.48
+0.04 0.38 0.48
+0.06 0.38 0.48
+0.94 0.38 0.48
+0.96 0.38 0.48
+0.98 0.38 0.48
+0.02 0.4 0.48
+0.04 0.4 0.48
+0.06 0.4 0.48
+0.94 0.4 0.48
+0.96 0.4 0.48
+0.98 0.4 0.48
+0.02 0.42 0.48
+0.04 0.42 0.48
+0.96 0.42 0.48
+0.98 0.42 0.48
+0.02 0.44 0.48
+0.04 0.44 0.48
+0.96 0.44 0.48
+0.98 0.44 0.48
+0.02 0.46 0.48
+0.04 0.46 0.48
+0.96 0.46 0.48
+0.98 0.46 0.48
+0.02 0.48 0.48
+0.04 0.48 0.48
+0.96 0.48 0.48
+0.98 0.48 0.48
+0.02 0.5 0.48
+0.04 0.5 0.48
+0.96 0.5 0.48
+0.98 0.5 0.48
+0.02 0.52 0.48
+0.04 0.52 0.48
+0.96 0.52 0.48
+0.98 0.52 0.48
+0.02 0.54 0.48
+0.04 0.54 0.48
+0.96 0.54 0.48
+0.98 0.54 0.48
+0.02 0.56 0.48
+0.04 0.56 0.48
+0.96 0.56 0.48
+0.98 0.56 0.48
+0.02 0.58 0.48
+0.04 0.58 0.48
+0.96 0.58 0.48
+0.98 0.58 0.48
+0.02 0.6 0.48
+0.04 0.6 0.48
+0.06 0.6 0.48
+0.94 0.6 0.48
+0.96 0.6 0.48
+0.98 0.6 0.48
+0.02 0.62 0.48
+0.04 0.62 0.48
+0.06 0.62 0.48
+0.94 0.62 0.48
+0.96 0.62 0.48
+0.98 0.62 0.48
+0.04 0.64 0.48
+0.06 0.64 0.48
+0.94 0.64 0.48
+0.96 0.64 0.48
+0.04 0.66 0.48
+0.06 0.66 0.48
+0.94 0.66 0.48
+0.96 0.66 0.48
+0.04 0.68 0.48
+0.06 0.68 0.48
+0.08 0.68 0.48
+0.92 0.68 0.48
+0.94 0.68 0.48
+0.96 0.68 0.48
+0.06 0.7 0.48
+0.08 0.7 0.48
+0.92 0.7 0.48
+0.94 0.7 0.48
+0.06 0.72 0.48
+0.08 0.72 0.48
+0.1 0.72 0.48
+0.9 0.72 0.48
+0.92 0.72 0.48
+0.94 0.72 0.48
+0.08 0.74 0.48
+0.1 0.74 0.48
+0.9 0.74 0.48
+0.92 0.74 0.48
+0.08 0.76 0.48
+0.1 0.76 0.48
+0.12 0.76 0.48
+0.88 0.76 0.48
+0.9 0.76 0.48
+0.92 0.76 0.48
+0.1 0.78 0.48
+0.12 0.78 0.48
+0.14 0.78 0.48
+0.86 0.78 0.48
+0.88 0.78 0.48
+0.9 0.78 0.48
+0.12 0.8 0.48
+0.14 0.8 0.48
+0.16 0.8 0.48
+0.84 0.8 0.48
+0.86 0.8 0.48
+0.88 0.8 0.48
+0.12 0.82 0.48
+0.14 0.82 0.48
+0.16 0.82 0.48
+0.18 0.82 0.48
+0.82 0.82 0.48
+0.84 0.82 0.48
+0.86 0.82 0.48
+0.88 0.82 0.48
+0.14 0.84 0.48
+0.16 0.84 0.48
+0.18 0.84 0.48
+0.2 0.84 0.48
+0.8 0.84 0.48
+0.82 0.84 0.48
+0.84 0.84 0.48
+0.86 0.84 0.48
+0.16 0.86 0.48
+0.18 0.86 0.48
+0.2 0.86 0.48
+0.22 0.86 0.48
+0.78 0.86 0.48
+0.8 0.86 0.48
+0.82 0.86 0.48
+0.84 0.86 0.48
+0.18 0.88 0.48
+0.2 0.88 0.48
+0.22 0.88 0.48
+0.24 0.88 0.48
+0.76 0.88 0.48
+0.78 0.88 0.48
+0.8 0.88 0.48
+0.82 0.88 0.48
+0.22 0.9 0.48
+0.24 0.9 0.48
+0.26 0.9 0.48
+0.28 0.9 0.48
+0.72 0.9 0.48
+0.74 0.9 0.48
+0.76 0.9 0.48
+0.78 0.9 0.48
+0.24 0.92 0.48
+0.26 0.92 0.48
+0.28 0.92 0.48
+0.3 0.92 0.48
+0.32 0.92 0.48
+0.68 0.92 0.48
+0.7 0.92 0.48
+0.72 0.92 0.48
+0.74 0.92 0.48
+0.76 0.92 0.48
+0.28 0.94 0.48
+0.3 0.94 0.48
+0.32 0.94 0.48
+0.34 0.94 0.48
+0.36 0.94 0.48
+0.38 0.94 0.48
+0.4 0.94 0.48
+0.6 0.94 0.48
+0.62 0.94 0.48
+0.64 0.94 0.48
+0.66 0.94 0.48
+0.68 0.94 0.48
+0.7 0.94 0.48
+0.72 0.94 0.48
+0.32 0.96 0.48
+0.34 0.96 0.48
+0.36 0.96 0.48
+0.38 0.96 0.48
+0.4 0.96 0.48
+0.42 0.96 0.48
+0.44 0.96 0.48
+0.46 0.96 0.48
+0.48 0.96 0.48
+0.5 0.96 0.48
+0.52 0.96 0.48
+0.54 0.96 0.48
+0.56 0.96 0.48
+0.58 0.96 0.48
+0.6 0.96 0.48
+0.62 0.96 0.48
+0.64 0.96 0.48
+0.66 0.96 0.48
+0.68 0.96 0.48
+0.38 0.98 0.48
+0.4 0.98 0.48
+0.42 0.98 0.48
+0.44 0.98 0.48
+0.46 0.98 0.48
+0.48 0.98 0.48
+0.5 0.98 0.48
+0.52 0.98 0.48
+0.54 0.98 0.48
+0.56 0.98 0.48
+0.58 0.98 0.48
+0.6 0.98 0.48
+0.62 0.98 0.48
+0.38 0.02 0.5
+0.4 0.02 0.5
+0.42 0.02 0.5
+0.44 0.02 0.5
+0.46 0.02 0.5
+0.48 0.02 0.5
+0.5 0.02 0.5
+0.52 0.02 0.5
+0.54 0.02 0.5
+0.56 0.02 0.5
+0.58 0.02 0.5
+0.6 0.02 0.5
+0.62 0.02 0.5
+0.32 0.04 0.5
+0.34 0.04 0.5
+0.36 0.04 0.5
+0.38 0.04 0.5
+0.4 0.04 0.5
+0.42 0.04 0.5
+0.44 0.04 0.5
+0.46 0.04 0.5
+0.48 0.04 0.5
+0.5 0.04 0.5
+0.52 0.04 0.5
+0.54 0.04 0.5
+0.56 0.04 0.5
+0.58 0.04 0.5
+0.6 0.04 0.5
+0.62 0.04 0.5
+0.64 0.04 0.5
+0.66 0.04 0.5
+0.68 0.04 0.5
+0.28 0.06 0.5
+0.3 0.06 0.5
+0.32 0.06 0.5
+0.34 0.06 0.5
+0.36 0.06 0.5
+0.38 0.06 0.5
+0.4 0.06 0.5
+0.6 0.06 0.5
+0.62 0.06 0.5
+0.64 0.06 0.5
+0.66 0.06 0.5
+0.68 0.06 0.5
+0.7 0.06 0.5
+0.72 0.06 0.5
+0.24 0.08 0.5
+0.26 0.08 0.5
+0.28 0.08 0.5
+0.3 0.08 0.5
+0.32 0.08 0.5
+0.68 0.08 0.5
+0.7 0.08 0.5
+0.72 0.08 0.5
+0.74 0.08 0.5
+0.76 0.08 0.5
+0.22 0.1 0.5
+0.24 0.1 0.5
+0.26 0.1 0.5
+0.28 0.1 0.5
+0.72 0.1 0.5
+0.74 0.1 0.5
+0.76 0.1 0.5
+0.78 0.1 0.5
+0.18 0.12 0.5
+0.2 0.12 0.5
+0.22 0.12 0.5
+0.24 0.12 0.5
+0.76 0.12 0.5
+0.78 0.12 0.5
+0.8 0.12 0.5
+0.82 0.12 0.5
+0.16 0.14 0.5
+0.18 0.14 0.5
+0.2 0.14 0.5
+0.22 0.14 0.5
+0.78 0.14 0.5
+0.8 0.14 0.5
+0.82 0.14 0.5
+0.84 0.14 0.5
+0.14 0.16 0.5
+0.16 0.16 0.5
+0.18 0.16 0.5
+0.2 0.16 0.5
+0.8 0.16 0.5
+0.82 0.16 0.5
+0.84 0.16 0.5
+0.86 0.16 0.5
+0.12 0.18 0.5
+0.14 0.18 0.5
+0.16 0.18 0.5
+0.18 0.18 0.5
+0.82 0.18 0.5
+0.84 0.18 0.5
+0.86 0.18 0.5
+0.88 0.18 0.5
+0.12 0.2 0.5
+0.14 0.2 0.5
+0.16 0.2 0.5
+0.84 0.2 0.5
+0.86 0.2 0.5
+0.88 0.2 0.5
+0.1 0.22 0.5
+0.12 0.22 0.5
+0.14 0.22 0.5
+0.86 0.22 0.5
+0.88 0.22 0.5
+0.9 0.22 0.5
+0.08 0.24 0.5
+0.1 0.24 0.5
+0.12 0.24 0.5
+0.88 0.24 0.5
+0.9 0.24 0.5
+0.92 0.24 0.5
+0.08 0.26 0.5
+0.1 0.26 0.5
+0.9 0.26 0.5
+0.92 0.26 0.5
+0.06 0.28 0.5
+0.08 0.28 0.5
+0.1 0.28 0.5
+0.9 0.28 0.5
+0.92 0.28 0.5
+0.94 0.28 0.5
+0.06 0.3 0.5
+0.08 0.3 0.5
+0.92 0.3 0.5
+0.94 0.3 0.5
+0.04 0.32 0.5
+0.06 0.32 0.5
+0.08 0.32 0.5
+0.92 0.32 0.5
+0.94 0.32 0.5
+0.96 0.32 0.5
+0.04 0.34 0.5
+0.06 0.34 0.5
+0.94 0.34 0.5
+0.96 0.34 0.5
+0.04 0.36 0.5
+0.06 0.36 0.5
+0.94 0.36 0.5
+0.96 0.36 0.5
+0.02 0.38 0.5
+0.04 0.38 0.5
+0.06 0.38 0.5
+0.94 0.38 0.5
+0.96 0.38 0.5
+0.98 0.38 0.5
+0.02 0.4 0.5
+0.04 0.4 0.5
+0.06 0.4 0.5
+0.94 0.4 0.5
+0.96 0.4 0.5
+0.98 0.4 0.5
+0.02 0.42 0.5
+0.04 0.42 0.5
+0.96 0.42 0.5
+0.98 0.42 0.5
+0.02 0.44 0.5
+0.04 0.44 0.5
+0.96 0.44 0.5
+0.98 0.44 0.5
+0.02 0.46 0.5
+0.04 0.46 0.5
+0.96 0.46 0.5
+0.98 0.46 0.5
+0.02 0.48 0.5
+0.04 0.48 0.5
+0.96 0.48 0.5
+0.98 0.48 0.5
+0.02 0.5 0.5
+0.04 0.5 0.5
+0.96 0.5 0.5
+0.98 0.5 0.5
+0.02 0.52 0.5
+0.04 0.52 0.5
+0.96 0.52 0.5
+0.98 0.52 0.5
+0.02 0.54 0.5
+0.04 0.54 0.5
+0.96 0.54 0.5
+0.98 0.54 0.5
+0.02 0.56 0.5
+0.04 0.56 0.5
+0.96 0.56 0.5
+0.98 0.56 0.5
+0.02 0.58 0.5
+0.04 0.58 0.5
+0.96 0.58 0.5
+0.98 0.58 0.5
+0.02 0.6 0.5
+0.04 0.6 0.5
+0.06 0.6 0.5
+0.94 0.6 0.5
+0.96 0.6 0.5
+0.98 0.6 0.5
+0.02 0.62 0.5
+0.04 0.62 0.5
+0.06 0.62 0.5
+0.94 0.62 0.5
+0.96 0.62 0.5
+0.98 0.62 0.5
+0.04 0.64 0.5
+0.06 0.64 0.5
+0.94 0.64 0.5
+0.96 0.64 0.5
+0.04 0.66 0.5
+0.06 0.66 0.5
+0.94 0.66 0.5
+0.96 0.66 0.5
+0.04 0.68 0.5
+0.06 0.68 0.5
+0.08 0.68 0.5
+0.92 0.68 0.5
+0.94 0.68 0.5
+0.96 0.68 0.5
+0.06 0.7 0.5
+0.08 0.7 0.5
+0.92 0.7 0.5
+0.94 0.7 0.5
+0.06 0.72 0.5
+0.08 0.72 0.5
+0.1 0.72 0.5
+0.9 0.72 0.5
+0.92 0.72 0.5
+0.94 0.72 0.5
+0.08 0.74 0.5
+0.1 0.74 0.5
+0.9 0.74 0.5
+0.92 0.74 0.5
+0.08 0.76 0.5
+0.1 0.76 0.5
+0.12 0.76 0.5
+0.88 0.76 0.5
+0.9 0.76 0.5
+0.92 0.76 0.5
+0.1 0.78 0.5
+0.12 0.78 0.5
+0.14 0.78 0.5
+0.86 0.78 0.5
+0.88 0.78 0.5
+0.9 0.78 0.5
+0.12 0.8 0.5
+0.14 0.8 0.5
+0.16 0.8 0.5
+0.84 0.8 0.5
+0.86 0.8 0.5
+0.88 0.8 0.5
+0.12 0.82 0.5
+0.14 0.82 0.5
+0.16 0.82 0.5
+0.18 0.82 0.5
+0.82 0.82 0.5
+0.84 0.82 0.5
+0.86 0.82 0.5
+0.88 0.82 0.5
+0.14 0.84 0.5
+0.16 0.84 0.5
+0.18 0.84 0.5
+0.2 0.84 0.5
+0.8 0.84 0.5
+0.82 0.84 0.5
+0.84 0.84 0.5
+0.86 0.84 0.5
+0.16 0.86 0.5
+0.18 0.86 0.5
+0.2 0.86 0.5
+0.22 0.86 0.5
+0.78 0.86 0.5
+0.8 0.86 0.5
+0.82 0.86 0.5
+0.84 0.86 0.5
+0.18 0.88 0.5
+0.2 0.88 0.5
+0.22 0.88 0.5
+0.24 0.88 0.5
+0.76 0.88 0.5
+0.78 0.88 0.5
+0.8 0.88 0.5
+0.82 0.88 0.5
+0.22 0.9 0.5
+0.24 0.9 0.5
+0.26 0.9 0.5
+0.28 0.9 0.5
+0.72 0.9 0.5
+0.74 0.9 0.5
+0.76 0.9 0.5
+0.78 0.9 0.5
+0.24 0.92 0.5
+0.26 0.92 0.5
+0.28 0.92 0.5
+0.3 0.92 0.5
+0.32 0.92 0.5
+0.68 0.92 0.5
+0.7 0.92 0.5
+0.72 0.92 0.5
+0.74 0.92 0.5
+0.76 0.92 0.5
+0.28 0.94 0.5
+0.3 0.94 0.5
+0.32 0.94 0.5
+0.34 0.94 0.5
+0.36 0.94 0.5
+0.38 0.94 0.5
+0.4 0.94 0.5
+0.6 0.94 0.5
+0.62 0.94 0.5
+0.64 0.94 0.5
+0.66 0.94 0.5
+0.68 0.94 0.5
+0.7 0.94 0.5
+0.72 0.94 0.5
+0.32 0.96 0.5
+0.34 0.96 0.5
+0.36 0.96 0.5
+0.38 0.96 0.5
+0.4 0.96 0.5
+0.42 0.96 0.5
+0.44 0.96 0.5
+0.46 0.96 0.5
+0.48 0.96 0.5
+0.5 0.96 0.5
+0.52 0.96 0.5
+0.54 0.96 0.5
+0.56 0.96 0.5
+0.58 0.96 0.5
+0.6 0.96 0.5
+0.62 0.96 0.5
+0.64 0.96 0.5
+0.66 0.96 0.5
+0.68 0.96 0.5
+0.38 0.98 0.5
+0.4 0.98 0.5
+0.42 0.98 0.5
+0.44 0.98 0.5
+0.46 0.98 0.5
+0.48 0.98 0.5
+0.5 0.98 0.5
+0.52 0.98 0.5
+0.54 0.98 0.5
+0.56 0.98 0.5
+0.58 0.98 0.5
+0.6 0.98 0.5
+0.62 0.98 0.5
+0.38 0.02 0.52
+0.4 0.02 0.52
+0.42 0.02 0.52
+0.44 0.02 0.52
+0.46 0.02 0.52
+0.48 0.02 0.52
+0.5 0.02 0.52
+0.52 0.02 0.52
+0.54 0.02 0.52
+0.56 0.02 0.52
+0.58 0.02 0.52
+0.6 0.02 0.52
+0.62 0.02 0.52
+0.32 0.04 0.52
+0.34 0.04 0.52
+0.36 0.04 0.52
+0.38 0.04 0.52
+0.4 0.04 0.52
+0.42 0.04 0.52
+0.44 0.04 0.52
+0.46 0.04 0.52
+0.48 0.04 0.52
+0.5 0.04 0.52
+0.52 0.04 0.52
+0.54 0.04 0.52
+0.56 0.04 0.52
+0.58 0.04 0.52
+0.6 0.04 0.52
+0.62 0.04 0.52
+0.64 0.04 0.52
+0.66 0.04 0.52
+0.68 0.04 0.52
+0.28 0.06 0.52
+0.3 0.06 0.52
+0.32 0.06 0.52
+0.34 0.06 0.52
+0.36 0.06 0.52
+0.38 0.06 0.52
+0.4 0.06 0.52
+0.6 0.06 0.52
+0.62 0.06 0.52
+0.64 0.06 0.52
+0.66 0.06 0.52
+0.68 0.06 0.52
+0.7 0.06 0.52
+0.72 0.06 0.52
+0.24 0.08 0.52
+0.26 0.08 0.52
+0.28 0.08 0.52
+0.3 0.08 0.52
+0.32 0.08 0.52
+0.68 0.08 0.52
+0.7 0.08 0.52
+0.72 0.08 0.52
+0.74 0.08 0.52
+0.76 0.08 0.52
+0.22 0.1 0.52
+0.24 0.1 0.52
+0.26 0.1 0.52
+0.28 0.1 0.52
+0.72 0.1 0.52
+0.74 0.1 0.52
+0.76 0.1 0.52
+0.78 0.1 0.52
+0.18 0.12 0.52
+0.2 0.12 0.52
+0.22 0.12 0.52
+0.24 0.12 0.52
+0.76 0.12 0.52
+0.78 0.12 0.52
+0.8 0.12 0.52
+0.82 0.12 0.52
+0.16 0.14 0.52
+0.18 0.14 0.52
+0.2 0.14 0.52
+0.22 0.14 0.52
+0.78 0.14 0.52
+0.8 0.14 0.52
+0.82 0.14 0.52
+0.84 0.14 0.52
+0.14 0.16 0.52
+0.16 0.16 0.52
+0.18 0.16 0.52
+0.2 0.16 0.52
+0.8 0.16 0.52
+0.82 0.16 0.52
+0.84 0.16 0.52
+0.86 0.16 0.52
+0.12 0.18 0.52
+0.14 0.18 0.52
+0.16 0.18 0.52
+0.18 0.18 0.52
+0.82 0.18 0.52
+0.84 0.18 0.52
+0.86 0.18 0.52
+0.88 0.18 0.52
+0.12 0.2 0.52
+0.14 0.2 0.52
+0.16 0.2 0.52
+0.84 0.2 0.52
+0.86 0.2 0.52
+0.88 0.2 0.52
+0.1 0.22 0.52
+0.12 0.22 0.52
+0.14 0.22 0.52
+0.86 0.22 0.52
+0.88 0.22 0.52
+0.9 0.22 0.52
+0.08 0.24 0.52
+0.1 0.24 0.52
+0.12 0.24 0.52
+0.88 0.24 0.52
+0.9 0.24 0.52
+0.92 0.24 0.52
+0.08 0.26 0.52
+0.1 0.26 0.52
+0.9 0.26 0.52
+0.92 0.26 0.52
+0.06 0.28 0.52
+0.08 0.28 0.52
+0.1 0.28 0.52
+0.9 0.28 0.52
+0.92 0.28 0.52
+0.94 0.28 0.52
+0.06 0.3 0.52
+0.08 0.3 0.52
+0.92 0.3 0.52
+0.94 0.3 0.52
+0.04 0.32 0.52
+0.06 0.32 0.52
+0.08 0.32 0.52
+0.92 0.32 0.52
+0.94 0.32 0.52
+0.96 0.32 0.52
+0.04 0.34 0.52
+0.06 0.34 0.52
+0.94 0.34 0.52
+0.96 0.34 0.52
+0.04 0.36 0.52
+0.06 0.36 0.52
+0.94 0.36 0.52
+0.96 0.36 0.52
+0.02 0.38 0.52
+0.04 0.38 0.52
+0.06 0.38 0.52
+0.94 0.38 0.52
+0.96 0.38 0.52
+0.98 0.38 0.52
+0.02 0.4 0.52
+0.04 0.4 0.52
+0.06 0.4 0.52
+0.94 0.4 0.52
+0.96 0.4 0.52
+0.98 0.4 0.52
+0.02 0.42 0.52
+0.04 0.42 0.52
+0.96 0.42 0.52
+0.98 0.42 0.52
+0.02 0.44 0.52
+0.04 0.44 0.52
+0.96 0.44 0.52
+0.98 0.44 0.52
+0.02 0.46 0.52
+0.04 0.46 0.52
+0.96 0.46 0.52
+0.98 0.46 0.52
+0.02 0.48 0.52
+0.04 0.48 0.52
+0.96 0.48 0.52
+0.98 0.48 0.52
+0.02 0.5 0.52
+0.04 0.5 0.52
+0.96 0.5 0.52
+0.98 0.5 0.52
+0.02 0.52 0.52
+0.04 0.52 0.52
+0.96 0.52 0.52
+0.98 0.52 0.52
+0.02 0.54 0.52
+0.04 0.54 0.52
+0.96 0.54 0.52
+0.98 0.54 0.52
+0.02 0.56 0.52
+0.04 0.56 0.52
+0.96 0.56 0.52
+0.98 0.56 0.52
+0.02 0.58 0.52
+0.04 0.58 0.52
+0.96 0.58 0.52
+0.98 0.58 0.52
+0.02 0.6 0.52
+0.04 0.6 0.52
+0.06 0.6 0.52
+0.94 0.6 0.52
+0.96 0.6 0.52
+0.98 0.6 0.52
+0.02 0.62 0.52
+0.04 0.62 0.52
+0.06 0.62 0.52
+0.94 0.62 0.52
+0.96 0.62 0.52
+0.98 0.62 0.52
+0.04 0.64 0.52
+0.06 0.64 0.52
+0.94 0.64 0.52
+0.96 0.64 0.52
+0.04 0.66 0.52
+0.06 0.66 0.52
+0.94 0.66 0.52
+0.96 0.66 0.52
+0.04 0.68 0.52
+0.06 0.68 0.52
+0.08 0.68 0.52
+0.92 0.68 0.52
+0.94 0.68 0.52
+0.96 0.68 0.52
+0.06 0.7 0.52
+0.08 0.7 0.52
+0.92 0.7 0.52
+0.94 0.7 0.52
+0.06 0.72 0.52
+0.08 0.72 0.52
+0.1 0.72 0.52
+0.9 0.72 0.52
+0.92 0.72 0.52
+0.94 0.72 0.52
+0.08 0.74 0.52
+0.1 0.74 0.52
+0.9 0.74 0.52
+0.92 0.74 0.52
+0.08 0.76 0.52
+0.1 0.76 0.52
+0.12 0.76 0.52
+0.88 0.76 0.52
+0.9 0.76 0.52
+0.92 0.76 0.52
+0.1 0.78 0.52
+0.12 0.78 0.52
+0.14 0.78 0.52
+0.86 0.78 0.52
+0.88 0.78 0.52
+0.9 0.78 0.52
+0.12 0.8 0.52
+0.14 0.8 0.52
+0.16 0.8 0.52
+0.84 0.8 0.52
+0.86 0.8 0.52
+0.88 0.8 0.52
+0.12 0.82 0.52
+0.14 0.82 0.52
+0.16 0.82 0.52
+0.18 0.82 0.52
+0.82 0.82 0.52
+0.84 0.82 0.52
+0.86 0.82 0.52
+0.88 0.82 0.52
+0.14 0.84 0.52
+0.16 0.84 0.52
+0.18 0.84 0.52
+0.2 0.84 0.52
+0.8 0.84 0.52
+0.82 0.84 0.52
+0.84 0.84 0.52
+0.86 0.84 0.52
+0.16 0.86 0.52
+0.18 0.86 0.52
+0.2 0.86 0.52
+0.22 0.86 0.52
+0.78 0.86 0.52
+0.8 0.86 0.52
+0.82 0.86 0.52
+0.84 0.86 0.52
+0.18 0.88 0.52
+0.2 0.88 0.52
+0.22 0.88 0.52
+0.24 0.88 0.52
+0.76 0.88 0.52
+0.78 0.88 0.52
+0.8 0.88 0.52
+0.82 0.88 0.52
+0.22 0.9 0.52
+0.24 0.9 0.52
+0.26 0.9 0.52
+0.28 0.9 0.52
+0.72 0.9 0.52
+0.74 0.9 0.52
+0.76 0.9 0.52
+0.78 0.9 0.52
+0.24 0.92 0.52
+0.26 0.92 0.52
+0.28 0.92 0.52
+0.3 0.92 0.52
+0.32 0.92 0.52
+0.68 0.92 0.52
+0.7 0.92 0.52
+0.72 0.92 0.52
+0.74 0.92 0.52
+0.76 0.92 0.52
+0.28 0.94 0.52
+0.3 0.94 0.52
+0.32 0.94 0.52
+0.34 0.94 0.52
+0.36 0.94 0.52
+0.38 0.94 0.52
+0.4 0.94 0.52
+0.6 0.94 0.52
+0.62 0.94 0.52
+0.64 0.94 0.52
+0.66 0.94 0.52
+0.68 0.94 0.52
+0.7 0.94 0.52
+0.72 0.94 0.52
+0.32 0.96 0.52
+0.34 0.96 0.52
+0.36 0.96 0.52
+0.38 0.96 0.52
+0.4 0.96 0.52
+0.42 0.96 0.52
+0.44 0.96 0.52
+0.46 0.96 0.52
+0.48 0.96 0.52
+0.5 0.96 0.52
+0.52 0.96 0.52
+0.54 0.96 0.52
+0.56 0.96 0.52
+0.58 0.96 0.52
+0.6 0.96 0.52
+0.62 0.96 0.52
+0.64 0.96 0.52
+0.66 0.96 0.52
+0.68 0.96 0.52
+0.38 0.98 0.52
+0.4 0.98 0.52
+0.42 0.98 0.52
+0.44 0.98 0.52
+0.46 0.98 0.52
+0.48 0.98 0.52
+0.5 0.98 0.52
+0.52 0.98 0.52
+0.54 0.98 0.52
+0.56 0.98 0.52
+0.58 0.98 0.52
+0.6 0.98 0.52
+0.62 0.98 0.52
+0.38 0.02 0.54
+0.4 0.02 0.54
+0.42 0.02 0.54
+0.44 0.02 0.54
+0.46 0.02 0.54
+0.48 0.02 0.54
+0.5 0.02 0.54
+0.52 0.02 0.54
+0.54 0.02 0.54
+0.56 0.02 0.54
+0.58 0.02 0.54
+0.6 0.02 0.54
+0.62 0.02 0.54
+0.32 0.04 0.54
+0.34 0.04 0.54
+0.36 0.04 0.54
+0.38 0.04 0.54
+0.4 0.04 0.54
+0.42 0.04 0.54
+0.44 0.04 0.54
+0.46 0.04 0.54
+0.48 0.04 0.54
+0.5 0.04 0.54
+0.52 0.04 0.54
+0.54 0.04 0.54
+0.56 0.04 0.54
+0.58 0.04 0.54
+0.6 0.04 0.54
+0.62 0.04 0.54
+0.64 0.04 0.54
+0.66 0.04 0.54
+0.68 0.04 0.54
+0.28 0.06 0.54
+0.3 0.06 0.54
+0.32 0.06 0.54
+0.34 0.06 0.54
+0.36 0.06 0.54
+0.38 0.06 0.54
+0.4 0.06 0.54
+0.6 0.06 0.54
+0.62 0.06 0.54
+0.64 0.06 0.54
+0.66 0.06 0.54
+0.68 0.06 0.54
+0.7 0.06 0.54
+0.72 0.06 0.54
+0.24 0.08 0.54
+0.26 0.08 0.54
+0.28 0.08 0.54
+0.3 0.08 0.54
+0.32 0.08 0.54
+0.34 0.08 0.54
+0.66 0.08 0.54
+0.68 0.08 0.54
+0.7 0.08 0.54
+0.72 0.08 0.54
+0.74 0.08 0.54
+0.76 0.08 0.54
+0.22 0.1 0.54
+0.24 0.1 0.54
+0.26 0.1 0.54
+0.28 0.1 0.54
+0.72 0.1 0.54
+0.74 0.1 0.54
+0.76 0.1 0.54
+0.78 0.1 0.54
+0.18 0.12 0.54
+0.2 0.12 0.54
+0.22 0.12 0.54
+0.24 0.12 0.54
+0.26 0.12 0.54
+0.74 0.12 0.54
+0.76 0.12 0.54
+0.78 0.12 0.54
+0.8 0.12 0.54
+0.82 0.12 0.54
+0.16 0.14 0.54
+0.18 0.14 0.54
+0.2 0.14 0.54
+0.22 0.14 0.54
+0.78 0.14 0.54
+0.8 0.14 0.54
+0.82 0.14 0.54
+0.84 0.14 0.54
+0.14 0.16 0.54
+0.16 0.16 0.54
+0.18 0.16 0.54
+0.2 0.16 0.54
+0.8 0.16 0.54
+0.82 0.16 0.54
+0.84 0.16 0.54
+0.86 0.16 0.54
+0.12 0.18 0.54
+0.14 0.18 0.54
+0.16 0.18 0.54
+0.18 0.18 0.54
+0.82 0.18 0.54
+0.84 0.18 0.54
+0.86 0.18 0.54
+0.88 0.18 0.54
+0.12 0.2 0.54
+0.14 0.2 0.54
+0.16 0.2 0.54
+0.84 0.2 0.54
+0.86 0.2 0.54
+0.88 0.2 0.54
+0.1 0.22 0.54
+0.12 0.22 0.54
+0.14 0.22 0.54
+0.86 0.22 0.54
+0.88 0.22 0.54
+0.9 0.22 0.54
+0.08 0.24 0.54
+0.1 0.24 0.54
+0.12 0.24 0.54
+0.88 0.24 0.54
+0.9 0.24 0.54
+0.92 0.24 0.54
+0.08 0.26 0.54
+0.1 0.26 0.54
+0.12 0.26 0.54
+0.88 0.26 0.54
+0.9 0.26 0.54
+0.92 0.26 0.54
+0.06 0.28 0.54
+0.08 0.28 0.54
+0.1 0.28 0.54
+0.9 0.28 0.54
+0.92 0.28 0.54
+0.94 0.28 0.54
+0.06 0.3 0.54
+0.08 0.3 0.54
+0.92 0.3 0.54
+0.94 0.3 0.54
+0.04 0.32 0.54
+0.06 0.32 0.54
+0.08 0.32 0.54
+0.92 0.32 0.54
+0.94 0.32 0.54
+0.96 0.32 0.54
+0.04 0.34 0.54
+0.06 0.34 0.54
+0.08 0.34 0.54
+0.92 0.34 0.54
+0.94 0.34 0.54
+0.96 0.34 0.54
+0.04 0.36 0.54
+0.06 0.36 0.54
+0.94 0.36 0.54
+0.96 0.36 0.54
+0.02 0.38 0.54
+0.04 0.38 0.54
+0.06 0.38 0.54
+0.94 0.38 0.54
+0.96 0.38 0.54
+0.98 0.38 0.54
+0.02 0.4 0.54
+0.04 0.4 0.54
+0.06 0.4 0.54
+0.94 0.4 0.54
+0.96 0.4 0.54
+0.98 0.4 0.54
+0.02 0.42 0.54
+0.04 0.42 0.54
+0.96 0.42 0.54
+0.98 0.42 0.54
+0.02 0.44 0.54
+0.04 0.44 0.54
+0.96 0.44 0.54
+0.98 0.44 0.54
+0.02 0.46 0.54
+0.04 0.46 0.54
+0.96 0.46 0.54
+0.98 0.46 0.54
+0.02 0.48 0.54
+0.04 0.48 0.54
+0.96 0.48 0.54
+0.98 0.48 0.54
+0.02 0.5 0.54
+0.04 0.5 0.54
+0.96 0.5 0.54
+0.98 0.5 0.54
+0.02 0.52 0.54
+0.04 0.52 0.54
+0.96 0.52 0.54
+0.98 0.52 0.54
+0.02 0.54 0.54
+0.04 0.54 0.54
+0.96 0.54 0.54
+0.98 0.54 0.54
+0.02 0.56 0.54
+0.04 0.56 0.54
+0.96 0.56 0.54
+0.98 0.56 0.54
+0.02 0.58 0.54
+0.04 0.58 0.54
+0.96 0.58 0.54
+0.98 0.58 0.54
+0.02 0.6 0.54
+0.04 0.6 0.54
+0.06 0.6 0.54
+0.94 0.6 0.54
+0.96 0.6 0.54
+0.98 0.6 0.54
+0.02 0.62 0.54
+0.04 0.62 0.54
+0.06 0.62 0.54
+0.94 0.62 0.54
+0.96 0.62 0.54
+0.98 0.62 0.54
+0.04 0.64 0.54
+0.06 0.64 0.54
+0.94 0.64 0.54
+0.96 0.64 0.54
+0.04 0.66 0.54
+0.06 0.66 0.54
+0.08 0.66 0.54
+0.92 0.66 0.54
+0.94 0.66 0.54
+0.96 0.66 0.54
+0.04 0.68 0.54
+0.06 0.68 0.54
+0.08 0.68 0.54
+0.92 0.68 0.54
+0.94 0.68 0.54
+0.96 0.68 0.54
+0.06 0.7 0.54
+0.08 0.7 0.54
+0.92 0.7 0.54
+0.94 0.7 0.54
+0.06 0.72 0.54
+0.08 0.72 0.54
+0.1 0.72 0.54
+0.9 0.72 0.54
+0.92 0.72 0.54
+0.94 0.72 0.54
+0.08 0.74 0.54
+0.1 0.74 0.54
+0.12 0.74 0.54
+0.88 0.74 0.54
+0.9 0.74 0.54
+0.92 0.74 0.54
+0.08 0.76 0.54
+0.1 0.76 0.54
+0.12 0.76 0.54
+0.88 0.76 0.54
+0.9 0.76 0.54
+0.92 0.76 0.54
+0.1 0.78 0.54
+0.12 0.78 0.54
+0.14 0.78 0.54
+0.86 0.78 0.54
+0.88 0.78 0.54
+0.9 0.78 0.54
+0.12 0.8 0.54
+0.14 0.8 0.54
+0.16 0.8 0.54
+0.84 0.8 0.54
+0.86 0.8 0.54
+0.88 0.8 0.54
+0.12 0.82 0.54
+0.14 0.82 0.54
+0.16 0.82 0.54
+0.18 0.82 0.54
+0.82 0.82 0.54
+0.84 0.82 0.54
+0.86 0.82 0.54
+0.88 0.82 0.54
+0.14 0.84 0.54
+0.16 0.84 0.54
+0.18 0.84 0.54
+0.2 0.84 0.54
+0.8 0.84 0.54
+0.82 0.84 0.54
+0.84 0.84 0.54
+0.86 0.84 0.54
+0.16 0.86 0.54
+0.18 0.86 0.54
+0.2 0.86 0.54
+0.22 0.86 0.54
+0.78 0.86 0.54
+0.8 0.86 0.54
+0.82 0.86 0.54
+0.84 0.86 0.54
+0.18 0.88 0.54
+0.2 0.88 0.54
+0.22 0.88 0.54
+0.24 0.88 0.54
+0.26 0.88 0.54
+0.74 0.88 0.54
+0.76 0.88 0.54
+0.78 0.88 0.54
+0.8 0.88 0.54
+0.82 0.88 0.54
+0.22 0.9 0.54
+0.24 0.9 0.54
+0.26 0.9 0.54
+0.28 0.9 0.54
+0.72 0.9 0.54
+0.74 0.9 0.54
+0.76 0.9 0.54
+0.78 0.9 0.54
+0.24 0.92 0.54
+0.26 0.92 0.54
+0.28 0.92 0.54
+0.3 0.92 0.54
+0.32 0.92 0.54
+0.34 0.92 0.54
+0.66 0.92 0.54
+0.68 0.92 0.54
+0.7 0.92 0.54
+0.72 0.92 0.54
+0.74 0.92 0.54
+0.76 0.92 0.54
+0.28 0.94 0.54
+0.3 0.94 0.54
+0.32 0.94 0.54
+0.34 0.94 0.54
+0.36 0.94 0.54
+0.38 0.94 0.54
+0.4 0.94 0.54
+0.6 0.94 0.54
+0.62 0.94 0.54
+0.64 0.94 0.54
+0.66 0.94 0.54
+0.68 0.94 0.54
+0.7 0.94 0.54
+0.72 0.94 0.54
+0.32 0.96 0.54
+0.34 0.96 0.54
+0.36 0.96 0.54
+0.38 0.96 0.54
+0.4 0.96 0.54
+0.42 0.96 0.54
+0.44 0.96 0.54
+0.46 0.96 0.54
+0.48 0.96 0.54
+0.5 0.96 0.54
+0.52 0.96 0.54
+0.54 0.96 0.54
+0.56 0.96 0.54
+0.58 0.96 0.54
+0.6 0.96 0.54
+0.62 0.96 0.54
+0.64 0.96 0.54
+0.66 0.96 0.54
+0.68 0.96 0.54
+0.38 0.98 0.54
+0.4 0.98 0.54
+0.42 0.98 0.54
+0.44 0.98 0.54
+0.46 0.98 0.54
+0.48 0.98 0.54
+0.5 0.98 0.54
+0.52 0.98 0.54
+0.54 0.98 0.54
+0.56 0.98 0.54
+0.58 0.98 0.54
+0.6 0.98 0.54
+0.62 0.98 0.54
+0.38 0.02 0.56
+0.4 0.02 0.56
+0.42 0.02 0.56
+0.44 0.02 0.56
+0.46 0.02 0.56
+0.48 0.02 0.56
+0.5 0.02 0.56
+0.52 0.02 0.56
+0.54 0.02 0.56
+0.56 0.02 0.56
+0.58 0.02 0.56
+0.6 0.02 0.56
+0.62 0.02 0.56
+0.32 0.04 0.56
+0.34 0.04 0.56
+0.36 0.04 0.56
+0.38 0.04 0.56
+0.4 0.04 0.56
+0.42 0.04 0.56
+0.44 0.04 0.56
+0.46 0.04 0.56
+0.48 0.04 0.56
+0.5 0.04 0.56
+0.52 0.04 0.56
+0.54 0.04 0.56
+0.56 0.04 0.56
+0.58 0.04 0.56
+0.6 0.04 0.56
+0.62 0.04 0.56
+0.64 0.04 0.56
+0.66 0.04 0.56
+0.68 0.04 0.56
+0.28 0.06 0.56
+0.3 0.06 0.56
+0.32 0.06 0.56
+0.34 0.06 0.56
+0.36 0.06 0.56
+0.38 0.06 0.56
+0.4 0.06 0.56
+0.42 0.06 0.56
+0.58 0.06 0.56
+0.6 0.06 0.56
+0.62 0.06 0.56
+0.64 0.06 0.56
+0.66 0.06 0.56
+0.68 0.06 0.56
+0.7 0.06 0.56
+0.72 0.06 0.56
+0.24 0.08 0.56
+0.26 0.08 0.56
+0.28 0.08 0.56
+0.3 0.08 0.56
+0.32 0.08 0.56
+0.34 0.08 0.56
+0.66 0.08 0.56
+0.68 0.08 0.56
+0.7 0.08 0.56
+0.72 0.08 0.56
+0.74 0.08 0.56
+0.76 0.08 0.56
+0.22 0.1 0.56
+0.24 0.1 0.56
+0.26 0.1 0.56
+0.28 0.1 0.56
+0.3 0.1 0.56
+0.7 0.1 0.56
+0.72 0.1 0.56
+0.74 0.1 0.56
+0.76 0.1 0.56
+0.78 0.1 0.56
+0.2 0.12 0.56
+0.22 0.12 0.56
+0.24 0.12 0.56
+0.26 0.12 0.56
+0.74 0.12 0.56
+0.76 0.12 0.56
+0.78 0.12 0.56
+0.8 0.12 0.56
+0.16 0.14 0.56
+0.18 0.14 0.56
+0.2 0.14 0.56
+0.22 0.14 0.56
+0.78 0.14 0.56
+0.8 0.14 0.56
+0.82 0.14 0.56
+0.84 0.14 0.56
+0.14 0.16 0.56
+0.16 0.16 0.56
+0.18 0.16 0.56
+0.2 0.16 0.56
+0.8 0.16 0.56
+0.82 0.16 0.56
+0.84 0.16 0.56
+0.86 0.16 0.56
+0.14 0.18 0.56
+0.16 0.18 0.56
+0.18 0.18 0.56
+0.82 0.18 0.56
+0.84 0.18 0.56
+0.86 0.18 0.56
+0.12 0.2 0.56
+0.14 0.2 0.56
+0.16 0.2 0.56
+0.84 0.2 0.56
+0.86 0.2 0.56
+0.88 0.2 0.56
+0.1 0.22 0.56
+0.12 0.22 0.56
+0.14 0.22 0.56
+0.86 0.22 0.56
+0.88 0.22 0.56
+0.9 0.22 0.56
+0.08 0.24 0.56
+0.1 0.24 0.56
+0.12 0.24 0.56
+0.88 0.24 0.56
+0.9 0.24 0.56
+0.92 0.24 0.56
+0.08 0.26 0.56
+0.1 0.26 0.56
+0.12 0.26 0.56
+0.88 0.26 0.56
+0.9 0.26 0.56
+0.92 0.26 0.56
+0.06 0.28 0.56
+0.08 0.28 0.56
+0.1 0.28 0.56
+0.9 0.28 0.56
+0.92 0.28 0.56
+0.94 0.28 0.56
+0.06 0.3 0.56
+0.08 0.3 0.56
+0.1 0.3 0.56
+0.9 0.3 0.56
+0.92 0.3 0.56
+0.94 0.3 0.56
+0.04 0.32 0.56
+0.06 0.32 0.56
+0.08 0.32 0.56
+0.92 0.32 0.56
+0.94 0.32 0.56
+0.96 0.32 0.56
+0.04 0.34 0.56
+0.06 0.34 0.56
+0.08 0.34 0.56
+0.92 0.34 0.56
+0.94 0.34 0.56
+0.96 0.34 0.56
+0.04 0.36 0.56
+0.06 0.36 0.56
+0.94 0.36 0.56
+0.96 0.36 0.56
+0.02 0.38 0.56
+0.04 0.38 0.56
+0.06 0.38 0.56
+0.94 0.38 0.56
+0.96 0.38 0.56
+0.98 0.38 0.56
+0.02 0.4 0.56
+0.04 0.4 0.56
+0.06 0.4 0.56
+0.94 0.4 0.56
+0.96 0.4 0.56
+0.98 0.4 0.56
+0.02 0.42 0.56
+0.04 0.42 0.56
+0.06 0.42 0.56
+0.94 0.42 0.56
+0.96 0.42 0.56
+0.98 0.42 0.56
+0.02 0.44 0.56
+0.04 0.44 0.56
+0.96 0.44 0.56
+0.98 0.44 0.56
+0.02 0.46 0.56
+0.04 0.46 0.56
+0.96 0.46 0.56
+0.98 0.46 0.56
+0.02 0.48 0.56
+0.04 0.48 0.56
+0.96 0.48 0.56
+0.98 0.48 0.56
+0.02 0.5 0.56
+0.04 0.5 0.56
+0.96 0.5 0.56
+0.98 0.5 0.56
+0.02 0.52 0.56
+0.04 0.52 0.56
+0.96 0.52 0.56
+0.98 0.52 0.56
+0.02 0.54 0.56
+0.04 0.54 0.56
+0.96 0.54 0.56
+0.98 0.54 0.56
+0.02 0.56 0.56
+0.04 0.56 0.56
+0.96 0.56 0.56
+0.98 0.56 0.56
+0.02 0.58 0.56
+0.04 0.58 0.56
+0.06 0.58 0.56
+0.94 0.58 0.56
+0.96 0.58 0.56
+0.98 0.58 0.56
+0.02 0.6 0.56
+0.04 0.6 0.56
+0.06 0.6 0.56
+0.94 0.6 0.56
+0.96 0.6 0.56
+0.98 0.6 0.56
+0.02 0.62 0.56
+0.04 0.62 0.56
+0.06 0.62 0.56
+0.94 0.62 0.56
+0.96 0.62 0.56
+0.98 0.62 0.56
+0.04 0.64 0.56
+0.06 0.64 0.56
+0.94 0.64 0.56
+0.96 0.64 0.56
+0.04 0.66 0.56
+0.06 0.66 0.56
+0.08 0.66 0.56
+0.92 0.66 0.56
+0.94 0.66 0.56
+0.96 0.66 0.56
+0.04 0.68 0.56
+0.06 0.68 0.56
+0.08 0.68 0.56
+0.92 0.68 0.56
+0.94 0.68 0.56
+0.96 0.68 0.56
+0.06 0.7 0.56
+0.08 0.7 0.56
+0.1 0.7 0.56
+0.9 0.7 0.56
+0.92 0.7 0.56
+0.94 0.7 0.56
+0.06 0.72 0.56
+0.08 0.72 0.56
+0.1 0.72 0.56
+0.9 0.72 0.56
+0.92 0.72 0.56
+0.94 0.72 0.56
+0.08 0.74 0.56
+0.1 0.74 0.56
+0.12 0.74 0.56
+0.88 0.74 0.56
+0.9 0.74 0.56
+0.92 0.74 0.56
+0.08 0.76 0.56
+0.1 0.76 0.56
+0.12 0.76 0.56
+0.88 0.76 0.56
+0.9 0.76 0.56
+0.92 0.76 0.56
+0.1 0.78 0.56
+0.12 0.78 0.56
+0.14 0.78 0.56
+0.86 0.78 0.56
+0.88 0.78 0.56
+0.9 0.78 0.56
+0.12 0.8 0.56
+0.14 0.8 0.56
+0.16 0.8 0.56
+0.84 0.8 0.56
+0.86 0.8 0.56
+0.88 0.8 0.56
+0.14 0.82 0.56
+0.16 0.82 0.56
+0.18 0.82 0.56
+0.82 0.82 0.56
+0.84 0.82 0.56
+0.86 0.82 0.56
+0.14 0.84 0.56
+0.16 0.84 0.56
+0.18 0.84 0.56
+0.2 0.84 0.56
+0.8 0.84 0.56
+0.82 0.84 0.56
+0.84 0.84 0.56
+0.86 0.84 0.56
+0.16 0.86 0.56
+0.18 0.86 0.56
+0.2 0.86 0.56
+0.22 0.86 0.56
+0.78 0.86 0.56
+0.8 0.86 0.56
+0.82 0.86 0.56
+0.84 0.86 0.56
+0.2 0.88 0.56
+0.22 0.88 0.56
+0.24 0.88 0.56
+0.26 0.88 0.56
+0.74 0.88 0.56
+0.76 0.88 0.56
+0.78 0.88 0.56
+0.8 0.88 0.56
+0.22 0.9 0.56
+0.24 0.9 0.56
+0.26 0.9 0.56
+0.28 0.9 0.56
+0.3 0.9 0.56
+0.7 0.9 0.56
+0.72 0.9 0.56
+0.74 0.9 0.56
+0.76 0.9 0.56
+0.78 0.9 0.56
+0.24 0.92 0.56
+0.26 0.92 0.56
+0.28 0.92 0.56
+0.3 0.92 0.56
+0.32 0.92 0.56
+0.34 0.92 0.56
+0.66 0.92 0.56
+0.68 0.92 0.56
+0.7 0.92 0.56
+0.72 0.92 0.56
+0.74 0.92 0.56
+0.76 0.92 0.56
+0.28 0.94 0.56
+0.3 0.94 0.56
+0.32 0.94 0.56
+0.34 0.94 0.56
+0.36 0.94 0.56
+0.38 0.94 0.56
+0.4 0.94 0.56
+0.42 0.94 0.56
+0.58 0.94 0.56
+0.6 0.94 0.56
+0.62 0.94 0.56
+0.64 0.94 0.56
+0.66 0.94 0.56
+0.68 0.94 0.56
+0.7 0.94 0.56
+0.72 0.94 0.56
+0.32 0.96 0.56
+0.34 0.96 0.56
+0.36 0.96 0.56
+0.38 0.96 0.56
+0.4 0.96 0.56
+0.42 0.96 0.56
+0.44 0.96 0.56
+0.46 0.96 0.56
+0.48 0.96 0.56
+0.5 0.96 0.56
+0.52 0.96 0.56
+0.54 0.96 0.56
+0.56 0.96 0.56
+0.58 0.96 0.56
+0.6 0.96 0.56
+0.62 0.96 0.56
+0.64 0.96 0.56
+0.66 0.96 0.56
+0.68 0.96 0.56
+0.38 0.98 0.56
+0.4 0.98 0.56
+0.42 0.98 0.56
+0.44 0.98 0.56
+0.46 0.98 0.56
+0.48 0.98 0.56
+0.5 0.98 0.56
+0.52 0.98 0.56
+0.54 0.98 0.56
+0.56 0.98 0.56
+0.58 0.98 0.56
+0.6 0.98 0.56
+0.62 0.98 0.56
+0.4 0.02 0.58
+0.42 0.02 0.58
+0.44 0.02 0.58
+0.46 0.02 0.58
+0.48 0.02 0.58
+0.5 0.02 0.58
+0.52 0.02 0.58
+0.54 0.02 0.58
+0.56 0.02 0.58
+0.58 0.02 0.58
+0.6 0.02 0.58
+0.34 0.04 0.58
+0.36 0.04 0.58
+0.38 0.04 0.58
+0.4 0.04 0.58
+0.42 0.04 0.58
+0.44 0.04 0.58
+0.46 0.04 0.58
+0.48 0.04 0.58
+0.5 0.04 0.58
+0.52 0.04 0.58
+0.54 0.04 0.58
+0.56 0.04 0.58
+0.58 0.04 0.58
+0.6 0.04 0.58
+0.62 0.04 0.58
+0.64 0.04 0.58
+0.66 0.04 0.58
+0.28 0.06 0.58
+0.3 0.06 0.58
+0.32 0.06 0.58
+0.34 0.06 0.58
+0.36 0.06 0.58
+0.38 0.06 0.58
+0.4 0.06 0.58
+0.42 0.06 0.58
+0.44 0.06 0.58
+0.56 0.06 0.58
+0.58 0.06 0.58
+0.6 0.06 0.58
+0.62 0.06 0.58
+0.64 0.06 0.58
+0.66 0.06 0.58
+0.68 0.06 0.58
+0.7 0.06 0.58
+0.72 0.06 0.58
+0.26 0.08 0.58
+0.28 0.08 0.58
+0.3 0.08 0.58
+0.32 0.08 0.58
+0.34 0.08 0.58
+0.66 0.08 0.58
+0.68 0.08 0.58
+0.7 0.08 0.58
+0.72 0.08 0.58
+0.74 0.08 0.58
+0.22 0.1 0.58
+0.24 0.1 0.58
+0.26 0.1 0.58
+0.28 0.1 0.58
+0.3 0.1 0.58
+0.7 0.1 0.58
+0.72 0.1 0.58
+0.74 0.1 0.58
+0.76 0.1 0.58
+0.78 0.1 0.58
+0.2 0.12 0.58
+0.22 0.12 0.58
+0.24 0.12 0.58
+0.26 0.12 0.58
+0.74 0.12 0.58
+0.76 0.12 0.58
+0.78 0.12 0.58
+0.8 0.12 0.58
+0.18 0.14 0.58
+0.2 0.14 0.58
+0.22 0.14 0.58
+0.24 0.14 0.58
+0.76 0.14 0.58
+0.78 0.14 0.58
+0.8 0.14 0.58
+0.82 0.14 0.58
+0.16 0.16 0.58
+0.18 0.16 0.58
+0.2 0.16 0.58
+0.8 0.16 0.58
+0.82 0.16 0.58
+0.84 0.16 0.58
+0.14 0.18 0.58
+0.16 0.18 0.58
+0.18 0.18 0.58
+0.82 0.18 0.58
+0.84 0.18 0.58
+0.86 0.18 0.58
+0.12 0.2 0.58
+0.14 0.2 0.58
+0.16 0.2 0.58
+0.84 0.2 0.58
+0.86 0.2 0.58
+0.88 0.2 0.58
+0.1 0.22 0.58
+0.12 0.22 0.58
+0.14 0.22 0.58
+0.86 0.22 0.58
+0.88 0.22 0.58
+0.9 0.22 0.58
+0.1 0.24 0.58
+0.12 0.24 0.58
+0.14 0.24 0.58
+0.86 0.24 0.58
+0.88 0.24 0.58
+0.9 0.24 0.58
+0.08 0.26 0.58
+0.1 0.26 0.58
+0.12 0.26 0.58
+0.88 0.26 0.58
+0.9 0.26 0.58
+0.92 0.26 0.58
+0.06 0.28 0.58
+0.08 0.28 0.58
+0.1 0.28 0.58
+0.9 0.28 0.58
+0.92 0.28 0.58
+0.94 0.28 0.58
+0.06 0.3 0.58
+0.08 0.3 0.58
+0.1 0.3 0.58
+0.9 0.3 0.58
+0.92 0.3 0.58
+0.94 0.3 0.58
+0.06 0.32 0.58
+0.08 0.32 0.58
+0.92 0.32 0.58
+0.94 0.32 0.58
+0.04 0.34 0.58
+0.06 0.34 0.58
+0.08 0.34 0.58
+0.92 0.34 0.58
+0.94 0.34 0.58
+0.96 0.34 0.58
+0.04 0.36 0.58
+0.06 0.36 0.58
+0.94 0.36 0.58
+0.96 0.36 0.58
+0.04 0.38 0.58
+0.06 0.38 0.58
+0.94 0.38 0.58
+0.96 0.38 0.58
+0.02 0.4 0.58
+0.04 0.4 0.58
+0.06 0.4 0.58
+0.94 0.4 0.58
+0.96 0.4 0.58
+0.98 0.4 0.58
+0.02 0.42 0.58
+0.04 0.42 0.58
+0.06 0.42 0.58
+0.94 0.42 0.58
+0.96 0.42 0.58
+0.98 0.42 0.58
+0.02 0.44 0.58
+0.04 0.44 0.58
+0.06 0.44 0.58
+0.94 0.44 0.58
+0.96 0.44 0.58
+0.98 0.44 0.58
+0.02 0.46 0.58
+0.04 0.46 0.58
+0.96 0.46 0.58
+0.98 0.46 0.58
+0.02 0.48 0.58
+0.04 0.48 0.58
+0.96 0.48 0.58
+0.98 0.48 0.58
+0.02 0.5 0.58
+0.04 0.5 0.58
+0.96 0.5 0.58
+0.98 0.5 0.58
+0.02 0.52 0.58
+0.04 0.52 0.58
+0.96 0.52 0.58
+0.98 0.52 0.58
+0.02 0.54 0.58
+0.04 0.54 0.58
+0.96 0.54 0.58
+0.98 0.54 0.58
+0.02 0.56 0.58
+0.04 0.56 0.58
+0.06 0.56 0.58
+0.94 0.56 0.58
+0.96 0.56 0.58
+0.98 0.56 0.58
+0.02 0.58 0.58
+0.04 0.58 0.58
+0.06 0.58 0.58
+0.94 0.58 0.58
+0.96 0.58 0.58
+0.98 0.58 0.58
+0.02 0.6 0.58
+0.04 0.6 0.58
+0.06 0.6 0.58
+0.94 0.6 0.58
+0.96 0.6 0.58
+0.98 0.6 0.58
+0.04 0.62 0.58
+0.06 0.62 0.58
+0.94 0.62 0.58
+0.96 0.62 0.58
+0.04 0.64 0.58
+0.06 0.64 0.58
+0.94 0.64 0.58
+0.96 0.64 0.58
+0.04 0.66 0.58
+0.06 0.66 0.58
+0.08 0.66 0.58
+0.92 0.66 0.58
+0.94 0.66 0.58
+0.96 0.66 0.58
+0.06 0.68 0.58
+0.08 0.68 0.58
+0.92 0.68 0.58
+0.94 0.68 0.58
+0.06 0.7 0.58
+0.08 0.7 0.58
+0.1 0.7 0.58
+0.9 0.7 0.58
+0.92 0.7 0.58
+0.94 0.7 0.58
+0.06 0.72 0.58
+0.08 0.72 0.58
+0.1 0.72 0.58
+0.9 0.72 0.58
+0.92 0.72 0.58
+0.94 0.72 0.58
+0.08 0.74 0.58
+0.1 0.74 0.58
+0.12 0.74 0.58
+0.88 0.74 0.58
+0.9 0.74 0.58
+0.92 0.74 0.58
+0.1 0.76 0.58
+0.12 0.76 0.58
+0.14 0.76 0.58
+0.86 0.76 0.58
+0.88 0.76 0.58
+0.9 0.76 0.58
+0.1 0.78 0.58
+0.12 0.78 0.58
+0.14 0.78 0.58
+0.86 0.78 0.58
+0.88 0.78 0.58
+0.9 0.78 0.58
+0.12 0.8 0.58
+0.14 0.8 0.58
+0.16 0.8 0.58
+0.84 0.8 0.58
+0.86 0.8 0.58
+0.88 0.8 0.58
+0.14 0.82 0.58
+0.16 0.82 0.58
+0.18 0.82 0.58
+0.82 0.82 0.58
+0.84 0.82 0.58
+0.86 0.82 0.58
+0.16 0.84 0.58
+0.18 0.84 0.58
+0.2 0.84 0.58
+0.8 0.84 0.58
+0.82 0.84 0.58
+0.84 0.84 0.58
+0.18 0.86 0.58
+0.2 0.86 0.58
+0.22 0.86 0.58
+0.24 0.86 0.58
+0.76 0.86 0.58
+0.78 0.86 0.58
+0.8 0.86 0.58
+0.82 0.86 0.58
+0.2 0.88 0.58
+0.22 0.88 0.58
+0.24 0.88 0.58
+0.26 0.88 0.58
+0.74 0.88 0.58
+0.76 0.88 0.58
+0.78 0.88 0.58
+0.8 0.88 0.58
+0.22 0.9 0.58
+0.24 0.9 0.58
+0.26 0.9 0.58
+0.28 0.9 0.58
+0.3 0.9 0.58
+0.7 0.9 0.58
+0.72 0.9 0.58
+0.74 0.9 0.58
+0.76 0.9 0.58
+0.78 0.9 0.58
+0.26 0.92 0.58
+0.28 0.92 0.58
+0.3 0.92 0.58
+0.32 0.92 0.58
+0.34 0.92 0.58
+0.66 0.92 0.58
+0.68 0.92 0.58
+0.7 0.92 0.58
+0.72 0.92 0.58
+0.74 0.92 0.58
+0.28 0.94 0.58
+0.3 0.94 0.58
+0.32 0.94 0.58
+0.34 0.94 0.58
+0.36 0.94 0.58
+0.38 0.94 0.58
+0.4 0.94 0.58
+0.42 0.94 0.58
+0.44 0.94 0.58
+0.56 0.94 0.58
+0.58 0.94 0.58
+0.6 0.94 0.58
+0.62 0.94 0.58
+0.64 0.94 0.58
+0.66 0.94 0.58
+0.68 0.94 0.58
+0.7 0.94 0.58
+0.72 0.94 0.58
+0.34 0.96 0.58
+0.36 0.96 0.58
+0.38 0.96 0.58
+0.4 0.96 0.58
+0.42 0.96 0.58
+0.44 0.96 0.58
+0.46 0.96 0.58
+0.48 0.96 0.58
+0.5 0.96 0.58
+0.52 0.96 0.58
+0.54 0.96 0.58
+0.56 0.96 0.58
+0.58 0.96 0.58
+0.6 0.96 0.58
+0.62 0.96 0.58
+0.64 0.96 0.58
+0.66 0.96 0.58
+0.4 0.98 0.58
+0.42 0.98 0.58
+0.44 0.98 0.58
+0.46 0.98 0.58
+0.48 0.98 0.58
+0.5 0.98 0.58
+0.52 0.98 0.58
+0.54 0.98 0.58
+0.56 0.98 0.58
+0.58 0.98 0.58
+0.6 0.98 0.58
+0.42 0.02 0.6
+0.44 0.02 0.6
+0.46 0.02 0.6
+0.48 0.02 0.6
+0.5 0.02 0.6
+0.52 0.02 0.6
+0.54 0.02 0.6
+0.56 0.02 0.6
+0.58 0.02 0.6
+0.34 0.04 0.6
+0.36 0.04 0.6
+0.38 0.04 0.6
+0.4 0.04 0.6
+0.42 0.04 0.6
+0.44 0.04 0.6
+0.46 0.04 0.6
+0.48 0.04 0.6
+0.5 0.04 0.6
+0.52 0.04 0.6
+0.54 0.04 0.6
+0.56 0.04 0.6
+0.58 0.04 0.6
+0.6 0.04 0.6
+0.62 0.04 0.6
+0.64 0.04 0.6
+0.66 0.04 0.6
+0.3 0.06 0.6
+0.32 0.06 0.6
+0.34 0.06 0.6
+0.36 0.06 0.6
+0.38 0.06 0.6
+0.4 0.06 0.6
+0.42 0.06 0.6
+0.44 0.06 0.6
+0.46 0.06 0.6
+0.48 0.06 0.6
+0.5 0.06 0.6
+0.52 0.06 0.6
+0.54 0.06 0.6
+0.56 0.06 0.6
+0.58 0.06 0.6
+0.6 0.06 0.6
+0.62 0.06 0.6
+0.64 0.06 0.6
+0.66 0.06 0.6
+0.68 0.06 0.6
+0.7 0.06 0.6
+0.26 0.08 0.6
+0.28 0.08 0.6
+0.3 0.08 0.6
+0.32 0.08 0.6
+0.34 0.08 0.6
+0.36 0.08 0.6
+0.64 0.08 0.6
+0.66 0.08 0.6
+0.68 0.08 0.6
+0.7 0.08 0.6
+0.72 0.08 0.6
+0.74 0.08 0.6
+0.22 0.1 0.6
+0.24 0.1 0.6
+0.26 0.1 0.6
+0.28 0.1 0.6
+0.3 0.1 0.6
+0.7 0.1 0.6
+0.72 0.1 0.6
+0.74 0.1 0.6
+0.76 0.1 0.6
+0.78 0.1 0.6
+0.2 0.12 0.6
+0.22 0.12 0.6
+0.24 0.12 0.6
+0.26 0.12 0.6
+0.28 0.12 0.6
+0.72 0.12 0.6
+0.74 0.12 0.6
+0.76 0.12 0.6
+0.78 0.12 0.6
+0.8 0.12 0.6
+0.18 0.14 0.6
+0.2 0.14 0.6
+0.22 0.14 0.6
+0.24 0.14 0.6
+0.76 0.14 0.6
+0.78 0.14 0.6
+0.8 0.14 0.6
+0.82 0.14 0.6
+0.16 0.16 0.6
+0.18 0.16 0.6
+0.2 0.16 0.6
+0.22 0.16 0.6
+0.78 0.16 0.6
+0.8 0.16 0.6
+0.82 0.16 0.6
+0.84 0.16 0.6
+0.14 0.18 0.6
+0.16 0.18 0.6
+0.18 0.18 0.6
+0.82 0.18 0.6
+0.84 0.18 0.6
+0.86 0.18 0.6
+0.12 0.2 0.6
+0.14 0.2 0.6
+0.16 0.2 0.6
+0.84 0.2 0.6
+0.86 0.2 0.6
+0.88 0.2 0.6
+0.1 0.22 0.6
+0.12 0.22 0.6
+0.14 0.22 0.6
+0.16 0.22 0.6
+0.84 0.22 0.6
+0.86 0.22 0.6
+0.88 0.22 0.6
+0.9 0.22 0.6
+0.1 0.24 0.6
+0.12 0.24 0.6
+0.14 0.24 0.6
+0.86 0.24 0.6
+0.88 0.24 0.6
+0.9 0.24 0.6
+0.08 0.26 0.6
+0.1 0.26 0.6
+0.12 0.26 0.6
+0.88 0.26 0.6
+0.9 0.26 0.6
+0.92 0.26 0.6
+0.08 0.28 0.6
+0.1 0.28 0.6
+0.12 0.28 0.6
+0.88 0.28 0.6
+0.9 0.28 0.6
+0.92 0.28 0.6
+0.06 0.3 0.6
+0.08 0.3 0.6
+0.1 0.3 0.6
+0.9 0.3 0.6
+0.92 0.3 0.6
+0.94 0.3 0.6
+0.06 0.32 0.6
+0.08 0.32 0.6
+0.92 0.32 0.6
+0.94 0.32 0.6
+0.04 0.34 0.6
+0.06 0.34 0.6
+0.08 0.34 0.6
+0.92 0.34 0.6
+0.94 0.34 0.6
+0.96 0.34 0.6
+0.04 0.36 0.6
+0.06 0.36 0.6
+0.08 0.36 0.6
+0.92 0.36 0.6
+0.94 0.36 0.6
+0.96 0.36 0.6
+0.04 0.38 0.6
+0.06 0.38 0.6
+0.94 0.38 0.6
+0.96 0.38 0.6
+0.04 0.4 0.6
+0.06 0.4 0.6
+0.94 0.4 0.6
+0.96 0.4 0.6
+0.02 0.42 0.6
+0.04 0.42 0.6
+0.06 0.42 0.6
+0.94 0.42 0.6
+0.96 0.42 0.6
+0.98 0.42 0.6
+0.02 0.44 0.6
+0.04 0.44 0.6
+0.06 0.44 0.6
+0.94 0.44 0.6
+0.96 0.44 0.6
+0.98 0.44 0.6
+0.02 0.46 0.6
+0.04 0.46 0.6
+0.06 0.46 0.6
+0.94 0.46 0.6
+0.96 0.46 0.6
+0.98 0.46 0.6
+0.02 0.48 0.6
+0.04 0.48 0.6
+0.06 0.48 0.6
+0.94 0.48 0.6
+0.96 0.48 0.6
+0.98 0.48 0.6
+0.02 0.5 0.6
+0.04 0.5 0.6
+0.06 0.5 0.6
+0.94 0.5 0.6
+0.96 0.5 0.6
+0.98 0.5 0.6
+0.02 0.52 0.6
+0.04 0.52 0.6
+0.06 0.52 0.6
+0.94 0.52 0.6
+0.96 0.52 0.6
+0.98 0.52 0.6
+0.02 0.54 0.6
+0.04 0.54 0.6
+0.06 0.54 0.6
+0.94 0.54 0.6
+0.96 0.54 0.6
+0.98 0.54 0.6
+0.02 0.56 0.6
+0.04 0.56 0.6
+0.06 0.56 0.6
+0.94 0.56 0.6
+0.96 0.56 0.6
+0.98 0.56 0.6
+0.02 0.58 0.6
+0.04 0.58 0.6
+0.06 0.58 0.6
+0.94 0.58 0.6
+0.96 0.58 0.6
+0.98 0.58 0.6
+0.04 0.6 0.6
+0.06 0.6 0.6
+0.94 0.6 0.6
+0.96 0.6 0.6
+0.04 0.62 0.6
+0.06 0.62 0.6
+0.94 0.62 0.6
+0.96 0.62 0.6
+0.04 0.64 0.6
+0.06 0.64 0.6
+0.08 0.64 0.6
+0.92 0.64 0.6
+0.94 0.64 0.6
+0.96 0.64 0.6
+0.04 0.66 0.6
+0.06 0.66 0.6
+0.08 0.66 0.6
+0.92 0.66 0.6
+0.94 0.66 0.6
+0.96 0.66 0.6
+0.06 0.68 0.6
+0.08 0.68 0.6
+0.92 0.68 0.6
+0.94 0.68 0.6
+0.06 0.7 0.6
+0.08 0.7 0.6
+0.1 0.7 0.6
+0.9 0.7 0.6
+0.92 0.7 0.6
+0.94 0.7 0.6
+0.08 0.72 0.6
+0.1 0.72 0.6
+0.12 0.72 0.6
+0.88 0.72 0.6
+0.9 0.72 0.6
+0.92 0.72 0.6
+0.08 0.74 0.6
+0.1 0.74 0.6
+0.12 0.74 0.6
+0.88 0.74 0.6
+0.9 0.74 0.6
+0.92 0.74 0.6
+0.1 0.76 0.6
+0.12 0.76 0.6
+0.14 0.76 0.6
+0.86 0.76 0.6
+0.88 0.76 0.6
+0.9 0.76 0.6
+0.1 0.78 0.6
+0.12 0.78 0.6
+0.14 0.78 0.6
+0.16 0.78 0.6
+0.84 0.78 0.6
+0.86 0.78 0.6
+0.88 0.78 0.6
+0.9 0.78 0.6
+0.12 0.8 0.6
+0.14 0.8 0.6
+0.16 0.8 0.6
+0.84 0.8 0.6
+0.86 0.8 0.6
+0.88 0.8 0.6
+0.14 0.82 0.6
+0.16 0.82 0.6
+0.18 0.82 0.6
+0.82 0.82 0.6
+0.84 0.82 0.6
+0.86 0.82 0.6
+0.16 0.84 0.6
+0.18 0.84 0.6
+0.2 0.84 0.6
+0.22 0.84 0.6
+0.78 0.84 0.6
+0.8 0.84 0.6
+0.82 0.84 0.6
+0.84 0.84 0.6
+0.18 0.86 0.6
+0.2 0.86 0.6
+0.22 0.86 0.6
+0.24 0.86 0.6
+0.76 0.86 0.6
+0.78 0.86 0.6
+0.8 0.86 0.6
+0.82 0.86 0.6
+0.2 0.88 0.6
+0.22 0.88 0.6
+0.24 0.88 0.6
+0.26 0.88 0.6
+0.28 0.88 0.6
+0.72 0.88 0.6
+0.74 0.88 0.6
+0.76 0.88 0.6
+0.78 0.88 0.6
+0.8 0.88 0.6
+0.22 0.9 0.6
+0.24 0.9 0.6
+0.26 0.9 0.6
+0.28 0.9 0.6
+0.3 0.9 0.6
+0.7 0.9 0.6
+0.72 0.9 0.6
+0.74 0.9 0.6
+0.76 0.9 0.6
+0.78 0.9 0.6
+0.26 0.92 0.6
+0.28 0.92 0.6
+0.3 0.92 0.6
+0.32 0.92 0.6
+0.34 0.92 0.6
+0.36 0.92 0.6
+0.64 0.92 0.6
+0.66 0.92 0.6
+0.68 0.92 0.6
+0.7 0.92 0.6
+0.72 0.92 0.6
+0.74 0.92 0.6
+0.3 0.94 0.6
+0.32 0.94 0.6
+0.34 0.94 0.6
+0.36 0.94 0.6
+0.38 0.94 0.6
+0.4 0.94 0.6
+0.42 0.94 0.6
+0.44 0.94 0.6
+0.46 0.94 0.6
+0.48 0.94 0.6
+0.5 0.94 0.6
+0.52 0.94 0.6
+0.54 0.94 0.6
+0.56 0.94 0.6
+0.58 0.94 0.6
+0.6 0.94 0.6
+0.62 0.94 0.6
+0.64 0.94 0.6
+0.66 0.94 0.6
+0.68 0.94 0.6
+0.7 0.94 0.6
+0.34 0.96 0.6
+0.36 0.96 0.6
+0.38 0.96 0.6
+0.4 0.96 0.6
+0.42 0.96 0.6
+0.44 0.96 0.6
+0.46 0.96 0.6
+0.48 0.96 0.6
+0.5 0.96 0.6
+0.52 0.96 0.6
+0.54 0.96 0.6
+0.56 0.96 0.6
+0.58 0.96 0.6
+0.6 0.96 0.6
+0.62 0.96 0.6
+0.64 0.96 0.6
+0.66 0.96 0.6
+0.42 0.98 0.6
+0.44 0.98 0.6
+0.46 0.98 0.6
+0.48 0.98 0.6
+0.5 0.98 0.6
+0.52 0.98 0.6
+0.54 0.98 0.6
+0.56 0.98 0.6
+0.58 0.98 0.6
+0.44 0.02 0.62
+0.46 0.02 0.62
+0.48 0.02 0.62
+0.5 0.02 0.62
+0.52 0.02 0.62
+0.54 0.02 0.62
+0.56 0.02 0.62
+0.36 0.04 0.62
+0.38 0.04 0.62
+0.4 0.04 0.62
+0.42 0.04 0.62
+0.44 0.04 0.62
+0.46 0.04 0.62
+0.48 0.04 0.62
+0.5 0.04 0.62
+0.52 0.04 0.62
+0.54 0.04 0.62
+0.56 0.04 0.62
+0.58 0.04 0.62
+0.6 0.04 0.62
+0.62 0.04 0.62
+0.64 0.04 0.62
+0.3 0.06 0.62
+0.32 0.06 0.62
+0.34 0.06 0.62
+0.36 0.06 0.62
+0.38 0.06 0.62
+0.4 0.06 0.62
+0.42 0.06 0.62
+0.44 0.06 0.62
+0.46 0.06 0.62
+0.48 0.06 0.62
+0.5 0.06 0.62
+0.52 0.06 0.62
+0.54 0.06 0.62
+0.56 0.06 0.62
+0.58 0.06 0.62
+0.6 0.06 0.62
+0.62 0.06 0.62
+0.64 0.06 0.62
+0.66 0.06 0.62
+0.68 0.06 0.62
+0.7 0.06 0.62
+0.26 0.08 0.62
+0.28 0.08 0.62
+0.3 0.08 0.62
+0.32 0.08 0.62
+0.34 0.08 0.62
+0.36 0.08 0.62
+0.38 0.08 0.62
+0.62 0.08 0.62
+0.64 0.08 0.62
+0.66 0.08 0.62
+0.68 0.08 0.62
+0.7 0.08 0.62
+0.72 0.08 0.62
+0.74 0.08 0.62
+0.24 0.1 0.62
+0.26 0.1 0.62
+0.28 0.1 0.62
+0.3 0.1 0.62
+0.32 0.1 0.62
+0.68 0.1 0.62
+0.7 0.1 0.62
+0.72 0.1 0.62
+0.74 0.1 0.62
+0.76 0.1 0.62
+0.2 0.12 0.62
+0.22 0.12 0.62
+0.24 0.12 0.62
+0.26 0.12 0.62
+0.28 0.12 0.62
+0.72 0.12 0.62
+0.74 0.12 0.62
+0.76 0.12 0.62
+0.78 0.12 0.62
+0.8 0.12 0.62
+0.18 0.14 0.62
+0.2 0.14 0.62
+0.22 0.14 0.62
+0.24 0.14 0.62
+0.76 0.14 0.62
+0.78 0.14 0.62
+0.8 0.14 0.62
+0.82 0.14 0.62
+0.16 0.16 0.62
+0.18 0.16 0.62
+0.2 0.16 0.62
+0.22 0.16 0.62
+0.78 0.16 0.62
+0.8 0.16 0.62
+0.82 0.16 0.62
+0.84 0.16 0.62
+0.14 0.18 0.62
+0.16 0.18 0.62
+0.18 0.18 0.62
+0.2 0.18 0.62
+0.8 0.18 0.62
+0.82 0.18 0.62
+0.84 0.18 0.62
+0.86 0.18 0.62
+0.12 0.2 0.62
+0.14 0.2 0.62
+0.16 0.2 0.62
+0.18 0.2 0.62
+0.82 0.2 0.62
+0.84 0.2 0.62
+0.86 0.2 0.62
+0.88 0.2 0.62
+0.12 0.22 0.62
+0.14 0.22 0.62
+0.16 0.22 0.62
+0.84 0.22 0.62
+0.86 0.22 0.62
+0.88 0.22 0.62
+0.1 0.24 0.62
+0.12 0.24 0.62
+0.14 0.24 0.62
+0.86 0.24 0.62
+0.88 0.24 0.62
+0.9 0.24 0.62
+0.08 0.26 0.62
+0.1 0.26 0.62
+0.12 0.26 0.62
+0.88 0.26 0.62
+0.9 0.26 0.62
+0.92 0.26 0.62
+0.08 0.28 0.62
+0.1 0.28 0.62
+0.12 0.28 0.62
+0.88 0.28 0.62
+0.9 0.28 0.62
+0.92 0.28 0.62
+0.06 0.3 0.62
+0.08 0.3 0.62
+0.1 0.3 0.62
+0.9 0.3 0.62
+0.92 0.3 0.62
+0.94 0.3 0.62
+0.06 0.32 0.62
+0.08 0.32 0.62
+0.1 0.32 0.62
+0.9 0.32 0.62
+0.92 0.32 0.62
+0.94 0.32 0.62
+0.06 0.34 0.62
+0.08 0.34 0.62
+0.92 0.34 0.62
+0.94 0.34 0.62
+0.04 0.36 0.62
+0.06 0.36 0.62
+0.08 0.36 0.62
+0.92 0.36 0.62
+0.94 0.36 0.62
+0.96 0.36 0.62
+0.04 0.38 0.62
+0.06 0.38 0.62
+0.08 0.38 0.62
+0.92 0.38 0.62
+0.94 0.38 0.62
+0.96 0.38 0.62
+0.04 0.4 0.62
+0.06 0.4 0.62
+0.94 0.4 0.62
+0.96 0.4 0.62
+0.04 0.42 0.62
+0.06 0.42 0.62
+0.94 0.42 0.62
+0.96 0.42 0.62
+0.02 0.44 0.62
+0.04 0.44 0.62
+0.06 0.44 0.62
+0.94 0.44 0.62
+0.96 0.44 0.62
+0.98 0.44 0.62
+0.02 0.46 0.62
+0.04 0.46 0.62
+0.06 0.46 0.62
+0.94 0.46 0.62
+0.96 0.46 0.62
+0.98 0.46 0.62
+0.02 0.48 0.62
+0.04 0.48 0.62
+0.06 0.48 0.62
+0.94 0.48 0.62
+0.96 0.48 0.62
+0.98 0.48 0.62
+0.02 0.5 0.62
+0.04 0.5 0.62
+0.06 0.5 0.62
+0.94 0.5 0.62
+0.96 0.5 0.62
+0.98 0.5 0.62
+0.02 0.52 0.62
+0.04 0.52 0.62
+0.06 0.52 0.62
+0.94 0.52 0.62
+0.96 0.52 0.62
+0.98 0.52 0.62
+0.02 0.54 0.62
+0.04 0.54 0.62
+0.06 0.54 0.62
+0.94 0.54 0.62
+0.96 0.54 0.62
+0.98 0.54 0.62
+0.02 0.56 0.62
+0.04 0.56 0.62
+0.06 0.56 0.62
+0.94 0.56 0.62
+0.96 0.56 0.62
+0.98 0.56 0.62
+0.04 0.58 0.62
+0.06 0.58 0.62
+0.94 0.58 0.62
+0.96 0.58 0.62
+0.04 0.6 0.62
+0.06 0.6 0.62
+0.94 0.6 0.62
+0.96 0.6 0.62
+0.04 0.62 0.62
+0.06 0.62 0.62
+0.08 0.62 0.62
+0.92 0.62 0.62
+0.94 0.62 0.62
+0.96 0.62 0.62
+0.04 0.64 0.62
+0.06 0.64 0.62
+0.08 0.64 0.62
+0.92 0.64 0.62
+0.94 0.64 0.62
+0.96 0.64 0.62
+0.06 0.66 0.62
+0.08 0.66 0.62
+0.92 0.66 0.62
+0.94 0.66 0.62
+0.06 0.68 0.62
+0.08 0.68 0.62
+0.1 0.68 0.62
+0.9 0.68 0.62
+0.92 0.68 0.62
+0.94 0.68 0.62
+0.06 0.7 0.62
+0.08 0.7 0.62
+0.1 0.7 0.62
+0.9 0.7 0.62
+0.92 0.7 0.62
+0.94 0.7 0.62
+0.08 0.72 0.62
+0.1 0.72 0.62
+0.12 0.72 0.62
+0.88 0.72 0.62
+0.9 0.72 0.62
+0.92 0.72 0.62
+0.08 0.74 0.62
+0.1 0.74 0.62
+0.12 0.74 0.62
+0.88 0.74 0.62
+0.9 0.74 0.62
+0.92 0.74 0.62
+0.1 0.76 0.62
+0.12 0.76 0.62
+0.14 0.76 0.62
+0.86 0.76 0.62
+0.88 0.76 0.62
+0.9 0.76 0.62
+0.12 0.78 0.62
+0.14 0.78 0.62
+0.16 0.78 0.62
+0.84 0.78 0.62
+0.86 0.78 0.62
+0.88 0.78 0.62
+0.12 0.8 0.62
+0.14 0.8 0.62
+0.16 0.8 0.62
+0.18 0.8 0.62
+0.82 0.8 0.62
+0.84 0.8 0.62
+0.86 0.8 0.62
+0.88 0.8 0.62
+0.14 0.82 0.62
+0.16 0.82 0.62
+0.18 0.82 0.62
+0.2 0.82 0.62
+0.8 0.82 0.62
+0.82 0.82 0.62
+0.84 0.82 0.62
+0.86 0.82 0.62
+0.16 0.84 0.62
+0.18 0.84 0.62
+0.2 0.84 0.62
+0.22 0.84 0.62
+0.78 0.84 0.62
+0.8 0.84 0.62
+0.82 0.84 0.62
+0.84 0.84 0.62
+0.18 0.86 0.62
+0.2 0.86 0.62
+0.22 0.86 0.62
+0.24 0.86 0.62
+0.76 0.86 0.62
+0.78 0.86 0.62
+0.8 0.86 0.62
+0.82 0.86 0.62
+0.2 0.88 0.62
+0.22 0.88 0.62
+0.24 0.88 0.62
+0.26 0.88 0.62
+0.28 0.88 0.62
+0.72 0.88 0.62
+0.74 0.88 0.62
+0.76 0.88 0.62
+0.78 0.88 0.62
+0.8 0.88 0.62
+0.24 0.9 0.62
+0.26 0.9 0.62
+0.28 0.9 0.62
+0.3 0.9 0.62
+0.32 0.9 0.62
+0.68 0.9 0.62
+0.7 0.9 0.62
+0.72 0.9 0.62
+0.74 0.9 0.62
+0.76 0.9 0.62
+0.26 0.92 0.62
+0.28 0.92 0.62
+0.3 0.92 0.62
+0.32 0.92 0.62
+0.34 0.92 0.62
+0.36 0.92 0.62
+0.38 0.92 0.62
+0.62 0.92 0.62
+0.64 0.92 0.62
+0.66 0.92 0.62
+0.68 0.92 0.62
+0.7 0.92 0.62
+0.72 0.92 0.62
+0.74 0.92 0.62
+0.3 0.94 0.62
+0.32 0.94 0.62
+0.34 0.94 0.62
+0.36 0.94 0.62
+0.38 0.94 0.62
+0.4 0.94 0.62
+0.42 0.94 0.62
+0.44 0.94 0.62
+0.46 0.94 0.62
+0.48 0.94 0.62
+0.5 0.94 0.62
+0.52 0.94 0.62
+0.54 0.94 0.62
+0.56 0.94 0.62
+0.58 0.94 0.62
+0.6 0.94 0.62
+0.62 0.94 0.62
+0.64 0.94 0.62
+0.66 0.94 0.62
+0.68 0.94 0.62
+0.7 0.94 0.62
+0.36 0.96 0.62
+0.38 0.96 0.62
+0.4 0.96 0.62
+0.42 0.96 0.62
+0.44 0.96 0.62
+0.46 0.96 0.62
+0.48 0.96 0.62
+0.5 0.96 0.62
+0.52 0.96 0.62
+0.54 0.96 0.62
+0.56 0.96 0.62
+0.58 0.96 0.62
+0.6 0.96 0.62
+0.62 0.96 0.62
+0.64 0.96 0.62
+0.44 0.98 0.62
+0.46 0.98 0.62
+0.48 0.98 0.62
+0.5 0.98 0.62
+0.52 0.98 0.62
+0.54 0.98 0.62
+0.56 0.98 0.62
+0.38 0.04 0.64
+0.4 0.04 0.64
+0.42 0.04 0.64
+0.44 0.04 0.64
+0.46 0.04 0.64
+0.48 0.04 0.64
+0.5 0.04 0.64
+0.52 0.04 0.64
+0.54 0.04 0.64
+0.56 0.04 0.64
+0.58 0.04 0.64
+0.6 0.04 0.64
+0.62 0.04 0.64
+0.32 0.06 0.64
+0.34 0.06 0.64
+0.36 0.06 0.64
+0.38 0.06 0.64
+0.4 0.06 0.64
+0.42 0.06 0.64
+0.44 0.06 0.64
+0.46 0.06 0.64
+0.48 0.06 0.64
+0.5 0.06 0.64
+0.52 0.06 0.64
+0.54 0.06 0.64
+0.56 0.06 0.64
+0.58 0.06 0.64
+0.6 0.06 0.64
+0.62 0.06 0.64
+0.64 0.06 0.64
+0.66 0.06 0.64
+0.68 0.06 0.64
+0.28 0.08 0.64
+0.3 0.08 0.64
+0.32 0.08 0.64
+0.34 0.08 0.64
+0.36 0.08 0.64
+0.38 0.08 0.64
+0.4 0.08 0.64
+0.6 0.08 0.64
+0.62 0.08 0.64
+0.64 0.08 0.64
+0.66 0.08 0.64
+0.68 0.08 0.64
+0.7 0.08 0.64
+0.72 0.08 0.64
+0.24 0.1 0.64
+0.26 0.1 0.64
+0.28 0.1 0.64
+0.3 0.1 0.64
+0.32 0.1 0.64
+0.34 0.1 0.64
+0.66 0.1 0.64
+0.68 0.1 0.64
+0.7 0.1 0.64
+0.72 0.1 0.64
+0.74 0.1 0.64
+0.76 0.1 0.64
+0.22 0.12 0.64
+0.24 0.12 0.64
+0.26 0.12 0.64
+0.28 0.12 0.64
+0.3 0.12 0.64
+0.7 0.12 0.64
+0.72 0.12 0.64
+0.74 0.12 0.64
+0.76 0.12 0.64
+0.78 0.12 0.64
+0.2 0.14 0.64
+0.22 0.14 0.64
+0.24 0.14 0.64
+0.26 0.14 0.64
+0.74 0.14 0.64
+0.76 0.14 0.64
+0.78 0.14 0.64
+0.8 0.14 0.64
+0.18 0.16 0.64
+0.2 0.16 0.64
+0.22 0.16 0.64
+0.24 0.16 0.64
+0.76 0.16 0.64
+0.78 0.16 0.64
+0.8 0.16 0.64
+0.82 0.16 0.64
+0.16 0.18 0.64
+0.18 0.18 0.64
+0.2 0.18 0.64
+0.8 0.18 0.64
+0.82 0.18 0.64
+0.84 0.18 0.64
+0.14 0.2 0.64
+0.16 0.2 0.64
+0.18 0.2 0.64
+0.82 0.2 0.64
+0.84 0.2 0.64
+0.86 0.2 0.64
+0.12 0.22 0.64
+0.14 0.22 0.64
+0.16 0.22 0.64
+0.84 0.22 0.64
+0.86 0.22 0.64
+0.88 0.22 0.64
+0.1 0.24 0.64
+0.12 0.24 0.64
+0.14 0.24 0.64
+0.16 0.24 0.64
+0.84 0.24 0.64
+0.86 0.24 0.64
+0.88 0.24 0.64
+0.9 0.24 0.64
+0.1 0.26 0.64
+0.12 0.26 0.64
+0.14 0.26 0.64
+0.86 0.26 0.64
+0.88 0.26 0.64
+0.9 0.26 0.64
+0.08 0.28 0.64
+0.1 0.28 0.64
+0.12 0.28 0.64
+0.88 0.28 0.64
+0.9 0.28 0.64
+0.92 0.28 0.64
+0.08 0.3 0.64
+0.1 0.3 0.64
+0.12 0.3 0.64
+0.88 0.3 0.64
+0.9 0.3 0.64
+0.92 0.3 0.64
+0.06 0.32 0.64
+0.08 0.32 0.64
+0.1 0.32 0.64
+0.9 0.32 0.64
+0.92 0.32 0.64
+0.94 0.32 0.64
+0.06 0.34 0.64
+0.08 0.34 0.64
+0.1 0.34 0.64
+0.9 0.34 0.64
+0.92 0.34 0.64
+0.94 0.34 0.64
+0.06 0.36 0.64
+0.08 0.36 0.64
+0.92 0.36 0.64
+0.94 0.36 0.64
+0.04 0.38 0.64
+0.06 0.38 0.64
+0.08 0.38 0.64
+0.92 0.38 0.64
+0.94 0.38 0.64
+0.96 0.38 0.64
+0.04 0.4 0.64
+0.06 0.4 0.64
+0.08 0.4 0.64
+0.92 0.4 0.64
+0.94 0.4 0.64
+0.96 0.4 0.64
+0.04 0.42 0.64
+0.06 0.42 0.64
+0.94 0.42 0.64
+0.96 0.42 0.64
+0.04 0.44 0.64
+0.06 0.44 0.64
+0.94 0.44 0.64
+0.96 0.44 0.64
+0.04 0.46 0.64
+0.06 0.46 0.64
+0.94 0.46 0.64
+0.96 0.46 0.64
+0.04 0.48 0.64
+0.06 0.48 0.64
+0.94 0.48 0.64
+0.96 0.48 0.64
+0.04 0.5 0.64
+0.06 0.5 0.64
+0.94 0.5 0.64
+0.96 0.5 0.64
+0.04 0.52 0.64
+0.06 0.52 0.64
+0.94 0.52 0.64
+0.96 0.52 0.64
+0.04 0.54 0.64
+0.06 0.54 0.64
+0.94 0.54 0.64
+0.96 0.54 0.64
+0.04 0.56 0.64
+0.06 0.56 0.64
+0.94 0.56 0.64
+0.96 0.56 0.64
+0.04 0.58 0.64
+0.06 0.58 0.64
+0.94 0.58 0.64
+0.96 0.58 0.64
+0.04 0.6 0.64
+0.06 0.6 0.64
+0.08 0.6 0.64
+0.92 0.6 0.64
+0.94 0.6 0.64
+0.96 0.6 0.64
+0.04 0.62 0.64
+0.06 0.62 0.64
+0.08 0.62 0.64
+0.92 0.62 0.64
+0.94 0.62 0.64
+0.96 0.62 0.64
+0.06 0.64 0.64
+0.08 0.64 0.64
+0.92 0.64 0.64
+0.94 0.64 0.64
+0.06 0.66 0.64
+0.08 0.66 0.64
+0.1 0.66 0.64
+0.9 0.66 0.64
+0.92 0.66 0.64
+0.94 0.66 0.64
+0.06 0.68 0.64
+0.08 0.68 0.64
+0.1 0.68 0.64
+0.9 0.68 0.64
+0.92 0.68 0.64
+0.94 0.68 0.64
+0.08 0.7 0.64
+0.1 0.7 0.64
+0.12 0.7 0.64
+0.88 0.7 0.64
+0.9 0.7 0.64
+0.92 0.7 0.64
+0.08 0.72 0.64
+0.1 0.72 0.64
+0.12 0.72 0.64
+0.88 0.72 0.64
+0.9 0.72 0.64
+0.92 0.72 0.64
+0.1 0.74 0.64
+0.12 0.74 0.64
+0.14 0.74 0.64
+0.86 0.74 0.64
+0.88 0.74 0.64
+0.9 0.74 0.64
+0.1 0.76 0.64
+0.12 0.76 0.64
+0.14 0.76 0.64
+0.16 0.76 0.64
+0.84 0.76 0.64
+0.86 0.76 0.64
+0.88 0.76 0.64
+0.9 0.76 0.64
+0.12 0.78 0.64
+0.14 0.78 0.64
+0.16 0.78 0.64
+0.84 0.78 0.64
+0.86 0.78 0.64
+0.88 0.78 0.64
+0.14 0.8 0.64
+0.16 0.8 0.64
+0.18 0.8 0.64
+0.82 0.8 0.64
+0.84 0.8 0.64
+0.86 0.8 0.64
+0.16 0.82 0.64
+0.18 0.82 0.64
+0.2 0.82 0.64
+0.8 0.82 0.64
+0.82 0.82 0.64
+0.84 0.82 0.64
+0.18 0.84 0.64
+0.2 0.84 0.64
+0.22 0.84 0.64
+0.24 0.84 0.64
+0.76 0.84 0.64
+0.78 0.84 0.64
+0.8 0.84 0.64
+0.82 0.84 0.64
+0.2 0.86 0.64
+0.22 0.86 0.64
+0.24 0.86 0.64
+0.26 0.86 0.64
+0.74 0.86 0.64
+0.76 0.86 0.64
+0.78 0.86 0.64
+0.8 0.86 0.64
+0.22 0.88 0.64
+0.24 0.88 0.64
+0.26 0.88 0.64
+0.28 0.88 0.64
+0.3 0.88 0.64
+0.7 0.88 0.64
+0.72 0.88 0.64
+0.74 0.88 0.64
+0.76 0.88 0.64
+0.78 0.88 0.64
+0.24 0.9 0.64
+0.26 0.9 0.64
+0.28 0.9 0.64
+0.3 0.9 0.64
+0.32 0.9 0.64
+0.34 0.9 0.64
+0.66 0.9 0.64
+0.68 0.9 0.64
+0.7 0.9 0.64
+0.72 0.9 0.64
+0.74 0.9 0.64
+0.76 0.9 0.64
+0.28 0.92 0.64
+0.3 0.92 0.64
+0.32 0.92 0.64
+0.34 0.92 0.64
+0.36 0.92 0.64
+0.38 0.92 0.64
+0.4 0.92 0.64
+0.6 0.92 0.64
+0.62 0.92 0.64
+0.64 0.92 0.64
+0.66 0.92 0.64
+0.68 0.92 0.64
+0.7 0.92 0.64
+0.72 0.92 0.64
+0.32 0.94 0.64
+0.34 0.94 0.64
+0.36 0.94 0.64
+0.38 0.94 0.64
+0.4 0.94 0.64
+0.42 0.94 0.64
+0.44 0.94 0.64
+0.46 0.94 0.64
+0.48 0.94 0.64
+0.5 0.94 0.64
+0.52 0.94 0.64
+0.54 0.94 0.64
+0.56 0.94 0.64
+0.58 0.94 0.64
+0.6 0.94 0.64
+0.62 0.94 0.64
+0.64 0.94 0.64
+0.66 0.94 0.64
+0.68 0.94 0.64
+0.38 0.96 0.64
+0.4 0.96 0.64
+0.42 0.96 0.64
+0.44 0.96 0.64
+0.46 0.96 0.64
+0.48 0.96 0.64
+0.5 0.96 0.64
+0.52 0.96 0.64
+0.54 0.96 0.64
+0.56 0.96 0.64
+0.58 0.96 0.64
+0.6 0.96 0.64
+0.62 0.96 0.64
+0.4 0.04 0.66
+0.42 0.04 0.66
+0.44 0.04 0.66
+0.46 0.04 0.66
+0.48 0.04 0.66
+0.5 0.04 0.66
+0.52 0.04 0.66
+0.54 0.04 0.66
+0.56 0.04 0.66
+0.58 0.04 0.66
+0.6 0.04 0.66
+0.34 0.06 0.66
+0.36 0.06 0.66
+0.38 0.06 0.66
+0.4 0.06 0.66
+0.42 0.06 0.66
+0.44 0.06 0.66
+0.46 0.06 0.66
+0.48 0.06 0.66
+0.5 0.06 0.66
+0.52 0.06 0.66
+0.54 0.06 0.66
+0.56 0.06 0.66
+0.58 0.06 0.66
+0.6 0.06 0.66
+0.62 0.06 0.66
+0.64 0.06 0.66
+0.66 0.06 0.66
+0.3 0.08 0.66
+0.32 0.08 0.66
+0.34 0.08 0.66
+0.36 0.08 0.66
+0.38 0.08 0.66
+0.4 0.08 0.66
+0.42 0.08 0.66
+0.44 0.08 0.66
+0.46 0.08 0.66
+0.54 0.08 0.66
+0.56 0.08 0.66
+0.58 0.08 0.66
+0.6 0.08 0.66
+0.62 0.08 0.66
+0.64 0.08 0.66
+0.66 0.08 0.66
+0.68 0.08 0.66
+0.7 0.08 0.66
+0.26 0.1 0.66
+0.28 0.1 0.66
+0.3 0.1 0.66
+0.32 0.1 0.66
+0.34 0.1 0.66
+0.36 0.1 0.66
+0.64 0.1 0.66
+0.66 0.1 0.66
+0.68 0.1 0.66
+0.7 0.1 0.66
+0.72 0.1 0.66
+0.74 0.1 0.66
+0.22 0.12 0.66
+0.24 0.12 0.66
+0.26 0.12 0.66
+0.28 0.12 0.66
+0.3 0.12 0.66
+0.7 0.12 0.66
+0.72 0.12 0.66
+0.74 0.12 0.66
+0.76 0.12 0.66
+0.78 0.12 0.66
+0.2 0.14 0.66
+0.22 0.14 0.66
+0.24 0.14 0.66
+0.26 0.14 0.66
+0.28 0.14 0.66
+0.72 0.14 0.66
+0.74 0.14 0.66
+0.76 0.14 0.66
+0.78 0.14 0.66
+0.8 0.14 0.66
+0.18 0.16 0.66
+0.2 0.16 0.66
+0.22 0.16 0.66
+0.24 0.16 0.66
+0.76 0.16 0.66
+0.78 0.16 0.66
+0.8 0.16 0.66
+0.82 0.16 0.66
+0.16 0.18 0.66
+0.18 0.18 0.66
+0.2 0.18 0.66
+0.22 0.18 0.66
+0.78 0.18 0.66
+0.8 0.18 0.66
+0.82 0.18 0.66
+0.84 0.18 0.66
+0.14 0.2 0.66
+0.16 0.2 0.66
+0.18 0.2 0.66
+0.2 0.2 0.66
+0.8 0.2 0.66
+0.82 0.2 0.66
+0.84 0.2 0.66
+0.86 0.2 0.66
+0.12 0.22 0.66
+0.14 0.22 0.66
+0.16 0.22 0.66
+0.18 0.22 0.66
+0.82 0.22 0.66
+0.84 0.22 0.66
+0.86 0.22 0.66
+0.88 0.22 0.66
+0.12 0.24 0.66
+0.14 0.24 0.66
+0.16 0.24 0.66
+0.84 0.24 0.66
+0.86 0.24 0.66
+0.88 0.24 0.66
+0.1 0.26 0.66
+0.12 0.26 0.66
+0.14 0.26 0.66
+0.86 0.26 0.66
+0.88 0.26 0.66
+0.9 0.26 0.66
+0.1 0.28 0.66
+0.12 0.28 0.66
+0.14 0.28 0.66
+0.86 0.28 0.66
+0.88 0.28 0.66
+0.9 0.28 0.66
+0.08 0.3 0.66
+0.1 0.3 0.66
+0.12 0.3 0.66
+0.88 0.3 0.66
+0.9 0.3 0.66
+0.92 0.3 0.66
+0.08 0.32 0.66
+0.1 0.32 0.66
+0.9 0.32 0.66
+0.92 0.32 0.66
+0.06 0.34 0.66
+0.08 0.34 0.66
+0.1 0.34 0.66
+0.9 0.34 0.66
+0.92 0.34 0.66
+0.94 0.34 0.66
+0.06 0.36 0.66
+0.08 0.36 0.66
+0.1 0.36 0.66
+0.9 0.36 0.66
+0.92 0.36 0.66
+0.94 0.36 0.66
+0.06 0.38 0.66
+0.08 0.38 0.66
+0.92 0.38 0.66
+0.94 0.38 0.66
+0.04 0.4 0.66
+0.06 0.4 0.66
+0.08 0.4 0.66
+0.92 0.4 0.66
+0.94 0.4 0.66
+0.96 0.4 0.66
+0.04 0.42 0.66
+0.06 0.42 0.66
+0.08 0.42 0.66
+0.92 0.42 0.66
+0.94 0.42 0.66
+0.96 0.42 0.66
+0.04 0.44 0.66
+0.06 0.44 0.66
+0.08 0.44 0.66
+0.92 0.44 0.66
+0.94 0.44 0.66
+0.96 0.44 0.66
+0.04 0.46 0.66
+0.06 0.46 0.66
+0.08 0.46 0.66
+0.92 0.46 0.66
+0.94 0.46 0.66
+0.96 0.46 0.66
+0.04 0.48 0.66
+0.06 0.48 0.66
+0.94 0.48 0.66
+0.96 0.48 0.66
+0.04 0.5 0.66
+0.06 0.5 0.66
+0.94 0.5 0.66
+0.96 0.5 0.66
+0.04 0.52 0.66
+0.06 0.52 0.66
+0.94 0.52 0.66
+0.96 0.52 0.66
+0.04 0.54 0.66
+0.06 0.54 0.66
+0.08 0.54 0.66
+0.92 0.54 0.66
+0.94 0.54 0.66
+0.96 0.54 0.66
+0.04 0.56 0.66
+0.06 0.56 0.66
+0.08 0.56 0.66
+0.92 0.56 0.66
+0.94 0.56 0.66
+0.96 0.56 0.66
+0.04 0.58 0.66
+0.06 0.58 0.66
+0.08 0.58 0.66
+0.92 0.58 0.66
+0.94 0.58 0.66
+0.96 0.58 0.66
+0.04 0.6 0.66
+0.06 0.6 0.66
+0.08 0.6 0.66
+0.92 0.6 0.66
+0.94 0.6 0.66
+0.96 0.6 0.66
+0.06 0.62 0.66
+0.08 0.62 0.66
+0.92 0.62 0.66
+0.94 0.62 0.66
+0.06 0.64 0.66
+0.08 0.64 0.66
+0.1 0.64 0.66
+0.9 0.64 0.66
+0.92 0.64 0.66
+0.94 0.64 0.66
+0.06 0.66 0.66
+0.08 0.66 0.66
+0.1 0.66 0.66
+0.9 0.66 0.66
+0.92 0.66 0.66
+0.94 0.66 0.66
+0.08 0.68 0.66
+0.1 0.68 0.66
+0.9 0.68 0.66
+0.92 0.68 0.66
+0.08 0.7 0.66
+0.1 0.7 0.66
+0.12 0.7 0.66
+0.88 0.7 0.66
+0.9 0.7 0.66
+0.92 0.7 0.66
+0.1 0.72 0.66
+0.12 0.72 0.66
+0.14 0.72 0.66
+0.86 0.72 0.66
+0.88 0.72 0.66
+0.9 0.72 0.66
+0.1 0.74 0.66
+0.12 0.74 0.66
+0.14 0.74 0.66
+0.86 0.74 0.66
+0.88 0.74 0.66
+0.9 0.74 0.66
+0.12 0.76 0.66
+0.14 0.76 0.66
+0.16 0.76 0.66
+0.84 0.76 0.66
+0.86 0.76 0.66
+0.88 0.76 0.66
+0.12 0.78 0.66
+0.14 0.78 0.66
+0.16 0.78 0.66
+0.18 0.78 0.66
+0.82 0.78 0.66
+0.84 0.78 0.66
+0.86 0.78 0.66
+0.88 0.78 0.66
+0.14 0.8 0.66
+0.16 0.8 0.66
+0.18 0.8 0.66
+0.2 0.8 0.66
+0.8 0.8 0.66
+0.82 0.8 0.66
+0.84 0.8 0.66
+0.86 0.8 0.66
+0.16 0.82 0.66
+0.18 0.82 0.66
+0.2 0.82 0.66
+0.22 0.82 0.66
+0.78 0.82 0.66
+0.8 0.82 0.66
+0.82 0.82 0.66
+0.84 0.82 0.66
+0.18 0.84 0.66
+0.2 0.84 0.66
+0.22 0.84 0.66
+0.24 0.84 0.66
+0.76 0.84 0.66
+0.78 0.84 0.66
+0.8 0.84 0.66
+0.82 0.84 0.66
+0.2 0.86 0.66
+0.22 0.86 0.66
+0.24 0.86 0.66
+0.26 0.86 0.66
+0.28 0.86 0.66
+0.72 0.86 0.66
+0.74 0.86 0.66
+0.76 0.86 0.66
+0.78 0.86 0.66
+0.8 0.86 0.66
+0.22 0.88 0.66
+0.24 0.88 0.66
+0.26 0.88 0.66
+0.28 0.88 0.66
+0.3 0.88 0.66
+0.7 0.88 0.66
+0.72 0.88 0.66
+0.74 0.88 0.66
+0.76 0.88 0.66
+0.78 0.88 0.66
+0.26 0.9 0.66
+0.28 0.9 0.66
+0.3 0.9 0.66
+0.32 0.9 0.66
+0.34 0.9 0.66
+0.36 0.9 0.66
+0.64 0.9 0.66
+0.66 0.9 0.66
+0.68 0.9 0.66
+0.7 0.9 0.66
+0.72 0.9 0.66
+0.74 0.9 0.66
+0.3 0.92 0.66
+0.32 0.92 0.66
+0.34 0.92 0.66
+0.36 0.92 0.66
+0.38 0.92 0.66
+0.4 0.92 0.66
+0.42 0.92 0.66
+0.44 0.92 0.66
+0.46 0.92 0.66
+0.54 0.92 0.66
+0.56 0.92 0.66
+0.58 0.92 0.66
+0.6 0.92 0.66
+0.62 0.92 0.66
+0.64 0.92 0.66
+0.66 0.92 0.66
+0.68 0.92 0.66
+0.7 0.92 0.66
+0.34 0.94 0.66
+0.36 0.94 0.66
+0.38 0.94 0.66
+0.4 0.94 0.66
+0.42 0.94 0.66
+0.44 0.94 0.66
+0.46 0.94 0.66
+0.48 0.94 0.66
+0.5 0.94 0.66
+0.52 0.94 0.66
+0.54 0.94 0.66
+0.56 0.94 0.66
+0.58 0.94 0.66
+0.6 0.94 0.66
+0.62 0.94 0.66
+0.64 0.94 0.66
+0.66 0.94 0.66
+0.4 0.96 0.66
+0.42 0.96 0.66
+0.44 0.96 0.66
+0.46 0.96 0.66
+0.48 0.96 0.66
+0.5 0.96 0.66
+0.52 0.96 0.66
+0.54 0.96 0.66
+0.56 0.96 0.66
+0.58 0.96 0.66
+0.6 0.96 0.66
+0.44 0.04 0.68
+0.46 0.04 0.68
+0.48 0.04 0.68
+0.5 0.04 0.68
+0.52 0.04 0.68
+0.54 0.04 0.68
+0.56 0.04 0.68
+0.36 0.06 0.68
+0.38 0.06 0.68
+0.4 0.06 0.68
+0.42 0.06 0.68
+0.44 0.06 0.68
+0.46 0.06 0.68
+0.48 0.06 0.68
+0.5 0.06 0.68
+0.52 0.06 0.68
+0.54 0.06 0.68
+0.56 0.06 0.68
+0.58 0.06 0.68
+0.6 0.06 0.68
+0.62 0.06 0.68
+0.64 0.06 0.68
+0.3 0.08 0.68
+0.32 0.08 0.68
+0.34 0.08 0.68
+0.36 0.08 0.68
+0.38 0.08 0.68
+0.4 0.08 0.68
+0.42 0.08 0.68
+0.44 0.08 0.68
+0.46 0.08 0.68
+0.48 0.08 0.68
+0.5 0.08 0.68
+0.52 0.08 0.68
+0.54 0.08 0.68
+0.56 0.08 0.68
+0.58 0.08 0.68
+0.6 0.08 0.68
+0.62 0.08 0.68
+0.64 0.08 0.68
+0.66 0.08 0.68
+0.68 0.08 0.68
+0.7 0.08 0.68
+0.28 0.1 0.68
+0.3 0.1 0.68
+0.32 0.1 0.68
+0.34 0.1 0.68
+0.36 0.1 0.68
+0.38 0.1 0.68
+0.62 0.1 0.68
+0.64 0.1 0.68
+0.66 0.1 0.68
+0.68 0.1 0.68
+0.7 0.1 0.68
+0.72 0.1 0.68
+0.24 0.12 0.68
+0.26 0.12 0.68
+0.28 0.12 0.68
+0.3 0.12 0.68
+0.32 0.12 0.68
+0.68 0.12 0.68
+0.7 0.12 0.68
+0.72 0.12 0.68
+0.74 0.12 0.68
+0.76 0.12 0.68
+0.22 0.14 0.68
+0.24 0.14 0.68
+0.26 0.14 0.68
+0.28 0.14 0.68
+0.72 0.14 0.68
+0.74 0.14 0.68
+0.76 0.14 0.68
+0.78 0.14 0.68
+0.2 0.16 0.68
+0.22 0.16 0.68
+0.24 0.16 0.68
+0.26 0.16 0.68
+0.74 0.16 0.68
+0.76 0.16 0.68
+0.78 0.16 0.68
+0.8 0.16 0.68
+0.18 0.18 0.68
+0.2 0.18 0.68
+0.22 0.18 0.68
+0.78 0.18 0.68
+0.8 0.18 0.68
+0.82 0.18 0.68
+0.16 0.2 0.68
+0.18 0.2 0.68
+0.2 0.2 0.68
+0.8 0.2 0.68
+0.82 0.2 0.68
+0.84 0.2 0.68
+0.14 0.22 0.68
+0.16 0.22 0.68
+0.18 0.22 0.68
+0.82 0.22 0.68
+0.84 0.22 0.68
+0.86 0.22 0.68
+0.12 0.24 0.68
+0.14 0.24 0.68
+0.16 0.24 0.68
+0.84 0.24 0.68
+0.86 0.24 0.68
+0.88 0.24 0.68
+0.12 0.26 0.68
+0.14 0.26 0.68
+0.16 0.26 0.68
+0.84 0.26 0.68
+0.86 0.26 0.68
+0.88 0.26 0.68
+0.1 0.28 0.68
+0.12 0.28 0.68
+0.14 0.28 0.68
+0.86 0.28 0.68
+0.88 0.28 0.68
+0.9 0.28 0.68
+0.08 0.3 0.68
+0.1 0.3 0.68
+0.12 0.3 0.68
+0.88 0.3 0.68
+0.9 0.3 0.68
+0.92 0.3 0.68
+0.08 0.32 0.68
+0.1 0.32 0.68
+0.12 0.32 0.68
+0.88 0.32 0.68
+0.9 0.32 0.68
+0.92 0.32 0.68
+0.08 0.34 0.68
+0.1 0.34 0.68
+0.9 0.34 0.68
+0.92 0.34 0.68
+0.06 0.36 0.68
+0.08 0.36 0.68
+0.1 0.36 0.68
+0.9 0.36 0.68
+0.92 0.36 0.68
+0.94 0.36 0.68
+0.06 0.38 0.68
+0.08 0.38 0.68
+0.1 0.38 0.68
+0.9 0.38 0.68
+0.92 0.38 0.68
+0.94 0.38 0.68
+0.06 0.4 0.68
+0.08 0.4 0.68
+0.92 0.4 0.68
+0.94 0.4 0.68
+0.06 0.42 0.68
+0.08 0.42 0.68
+0.92 0.42 0.68
+0.94 0.42 0.68
+0.04 0.44 0.68
+0.06 0.44 0.68
+0.08 0.44 0.68
+0.92 0.44 0.68
+0.94 0.44 0.68
+0.96 0.44 0.68
+0.04 0.46 0.68
+0.06 0.46 0.68
+0.08 0.46 0.68
+0.92 0.46 0.68
+0.94 0.46 0.68
+0.96 0.46 0.68
+0.04 0.48 0.68
+0.06 0.48 0.68
+0.08 0.48 0.68
+0.92 0.48 0.68
+0.94 0.48 0.68
+0.96 0.48 0.68
+0.04 0.5 0.68
+0.06 0.5 0.68
+0.08 0.5 0.68
+0.92 0.5 0.68
+0.94 0.5 0.68
+0.96 0.5 0.68
+0.04 0.52 0.68
+0.06 0.52 0.68
+0.08 0.52 0.68
+0.92 0.52 0.68
+0.94 0.52 0.68
+0.96 0.52 0.68
+0.04 0.54 0.68
+0.06 0.54 0.68
+0.08 0.54 0.68
+0.92 0.54 0.68
+0.94 0.54 0.68
+0.96 0.54 0.68
+0.04 0.56 0.68
+0.06 0.56 0.68
+0.08 0.56 0.68
+0.92 0.56 0.68
+0.94 0.56 0.68
+0.96 0.56 0.68
+0.06 0.58 0.68
+0.08 0.58 0.68
+0.92 0.58 0.68
+0.94 0.58 0.68
+0.06 0.6 0.68
+0.08 0.6 0.68
+0.92 0.6 0.68
+0.94 0.6 0.68
+0.06 0.62 0.68
+0.08 0.62 0.68
+0.1 0.62 0.68
+0.9 0.62 0.68
+0.92 0.62 0.68
+0.94 0.62 0.68
+0.06 0.64 0.68
+0.08 0.64 0.68
+0.1 0.64 0.68
+0.9 0.64 0.68
+0.92 0.64 0.68
+0.94 0.64 0.68
+0.08 0.66 0.68
+0.1 0.66 0.68
+0.9 0.66 0.68
+0.92 0.66 0.68
+0.08 0.68 0.68
+0.1 0.68 0.68
+0.12 0.68 0.68
+0.88 0.68 0.68
+0.9 0.68 0.68
+0.92 0.68 0.68
+0.08 0.7 0.68
+0.1 0.7 0.68
+0.12 0.7 0.68
+0.88 0.7 0.68
+0.9 0.7 0.68
+0.92 0.7 0.68
+0.1 0.72 0.68
+0.12 0.72 0.68
+0.14 0.72 0.68
+0.86 0.72 0.68
+0.88 0.72 0.68
+0.9 0.72 0.68
+0.12 0.74 0.68
+0.14 0.74 0.68
+0.16 0.74 0.68
+0.84 0.74 0.68
+0.86 0.74 0.68
+0.88 0.74 0.68
+0.12 0.76 0.68
+0.14 0.76 0.68
+0.16 0.76 0.68
+0.84 0.76 0.68
+0.86 0.76 0.68
+0.88 0.76 0.68
+0.14 0.78 0.68
+0.16 0.78 0.68
+0.18 0.78 0.68
+0.82 0.78 0.68
+0.84 0.78 0.68
+0.86 0.78 0.68
+0.16 0.8 0.68
+0.18 0.8 0.68
+0.2 0.8 0.68
+0.8 0.8 0.68
+0.82 0.8 0.68
+0.84 0.8 0.68
+0.18 0.82 0.68
+0.2 0.82 0.68
+0.22 0.82 0.68
+0.78 0.82 0.68
+0.8 0.82 0.68
+0.82 0.82 0.68
+0.2 0.84 0.68
+0.22 0.84 0.68
+0.24 0.84 0.68
+0.26 0.84 0.68
+0.74 0.84 0.68
+0.76 0.84 0.68
+0.78 0.84 0.68
+0.8 0.84 0.68
+0.22 0.86 0.68
+0.24 0.86 0.68
+0.26 0.86 0.68
+0.28 0.86 0.68
+0.72 0.86 0.68
+0.74 0.86 0.68
+0.76 0.86 0.68
+0.78 0.86 0.68
+0.24 0.88 0.68
+0.26 0.88 0.68
+0.28 0.88 0.68
+0.3 0.88 0.68
+0.32 0.88 0.68
+0.68 0.88 0.68
+0.7 0.88 0.68
+0.72 0.88 0.68
+0.74 0.88 0.68
+0.76 0.88 0.68
+0.28 0.9 0.68
+0.3 0.9 0.68
+0.32 0.9 0.68
+0.34 0.9 0.68
+0.36 0.9 0.68
+0.38 0.9 0.68
+0.62 0.9 0.68
+0.64 0.9 0.68
+0.66 0.9 0.68
+0.68 0.9 0.68
+0.7 0.9 0.68
+0.72 0.9 0.68
+0.3 0.92 0.68
+0.32 0.92 0.68
+0.34 0.92 0.68
+0.36 0.92 0.68
+0.38 0.92 0.68
+0.4 0.92 0.68
+0.42 0.92 0.68
+0.44 0.92 0.68
+0.46 0.92 0.68
+0.48 0.92 0.68
+0.5 0.92 0.68
+0.52 0.92 0.68
+0.54 0.92 0.68
+0.56 0.92 0.68
+0.58 0.92 0.68
+0.6 0.92 0.68
+0.62 0.92 0.68
+0.64 0.92 0.68
+0.66 0.92 0.68
+0.68 0.92 0.68
+0.7 0.92 0.68
+0.36 0.94 0.68
+0.38 0.94 0.68
+0.4 0.94 0.68
+0.42 0.94 0.68
+0.44 0.94 0.68
+0.46 0.94 0.68
+0.48 0.94 0.68
+0.5 0.94 0.68
+0.52 0.94 0.68
+0.54 0.94 0.68
+0.56 0.94 0.68
+0.58 0.94 0.68
+0.6 0.94 0.68
+0.62 0.94 0.68
+0.64 0.94 0.68
+0.44 0.96 0.68
+0.46 0.96 0.68
+0.48 0.96 0.68
+0.5 0.96 0.68
+0.52 0.96 0.68
+0.54 0.96 0.68
+0.56 0.96 0.68
+0.38 0.06 0.7
+0.4 0.06 0.7
+0.42 0.06 0.7
+0.44 0.06 0.7
+0.46 0.06 0.7
+0.48 0.06 0.7
+0.5 0.06 0.7
+0.52 0.06 0.7
+0.54 0.06 0.7
+0.56 0.06 0.7
+0.58 0.06 0.7
+0.6 0.06 0.7
+0.62 0.06 0.7
+0.32 0.08 0.7
+0.34 0.08 0.7
+0.36 0.08 0.7
+0.38 0.08 0.7
+0.4 0.08 0.7
+0.42 0.08 0.7
+0.44 0.08 0.7
+0.46 0.08 0.7
+0.48 0.08 0.7
+0.5 0.08 0.7
+0.52 0.08 0.7
+0.54 0.08 0.7
+0.56 0.08 0.7
+0.58 0.08 0.7
+0.6 0.08 0.7
+0.62 0.08 0.7
+0.64 0.08 0.7
+0.66 0.08 0.7
+0.68 0.08 0.7
+0.28 0.1 0.7
+0.3 0.1 0.7
+0.32 0.1 0.7
+0.34 0.1 0.7
+0.36 0.1 0.7
+0.38 0.1 0.7
+0.4 0.1 0.7
+0.42 0.1 0.7
+0.44 0.1 0.7
+0.56 0.1 0.7
+0.58 0.1 0.7
+0.6 0.1 0.7
+0.62 0.1 0.7
+0.64 0.1 0.7
+0.66 0.1 0.7
+0.68 0.1 0.7
+0.7 0.1 0.7
+0.72 0.1 0.7
+0.26 0.12 0.7
+0.28 0.12 0.7
+0.3 0.12 0.7
+0.32 0.12 0.7
+0.34 0.12 0.7
+0.36 0.12 0.7
+0.64 0.12 0.7
+0.66 0.12 0.7
+0.68 0.12 0.7
+0.7 0.12 0.7
+0.72 0.12 0.7
+0.74 0.12 0.7
+0.22 0.14 0.7
+0.24 0.14 0.7
+0.26 0.14 0.7
+0.28 0.14 0.7
+0.3 0.14 0.7
+0.7 0.14 0.7
+0.72 0.14 0.7
+0.74 0.14 0.7
+0.76 0.14 0.7
+0.78 0.14 0.7
+0.2 0.16 0.7
+0.22 0.16 0.7
+0.24 0.16 0.7
+0.26 0.16 0.7
+0.28 0.16 0.7
+0.72 0.16 0.7
+0.74 0.16 0.7
+0.76 0.16 0.7
+0.78 0.16 0.7
+0.8 0.16 0.7
+0.18 0.18 0.7
+0.2 0.18 0.7
+0.22 0.18 0.7
+0.24 0.18 0.7
+0.76 0.18 0.7
+0.78 0.18 0.7
+0.8 0.18 0.7
+0.82 0.18 0.7
+0.16 0.2 0.7
+0.18 0.2 0.7
+0.2 0.2 0.7
+0.22 0.2 0.7
+0.78 0.2 0.7
+0.8 0.2 0.7
+0.82 0.2 0.7
+0.84 0.2 0.7
+0.14 0.22 0.7
+0.16 0.22 0.7
+0.18 0.22 0.7
+0.2 0.22 0.7
+0.8 0.22 0.7
+0.82 0.22 0.7
+0.84 0.22 0.7
+0.86 0.22 0.7
+0.14 0.24 0.7
+0.16 0.24 0.7
+0.18 0.24 0.7
+0.82 0.24 0.7
+0.84 0.24 0.7
+0.86 0.24 0.7
+0.12 0.26 0.7
+0.14 0.26 0.7
+0.16 0.26 0.7
+0.84 0.26 0.7
+0.86 0.26 0.7
+0.88 0.26 0.7
+0.1 0.28 0.7
+0.12 0.28 0.7
+0.14 0.28 0.7
+0.16 0.28 0.7
+0.84 0.28 0.7
+0.86 0.28 0.7
+0.88 0.28 0.7
+0.9 0.28 0.7
+0.1 0.3 0.7
+0.12 0.3 0.7
+0.14 0.3 0.7
+0.86 0.3 0.7
+0.88 0.3 0.7
+0.9 0.3 0.7
+0.08 0.32 0.7
+0.1 0.32 0.7
+0.12 0.32 0.7
+0.88 0.32 0.7
+0.9 0.32 0.7
+0.92 0.32 0.7
+0.08 0.34 0.7
+0.1 0.34 0.7
+0.12 0.34 0.7
+0.88 0.34 0.7
+0.9 0.34 0.7
+0.92 0.34 0.7
+0.08 0.36 0.7
+0.1 0.36 0.7
+0.12 0.36 0.7
+0.88 0.36 0.7
+0.9 0.36 0.7
+0.92 0.36 0.7
+0.06 0.38 0.7
+0.08 0.38 0.7
+0.1 0.38 0.7
+0.9 0.38 0.7
+0.92 0.38 0.7
+0.94 0.38 0.7
+0.06 0.4 0.7
+0.08 0.4 0.7
+0.1 0.4 0.7
+0.9 0.4 0.7
+0.92 0.4 0.7
+0.94 0.4 0.7
+0.06 0.42 0.7
+0.08 0.42 0.7
+0.1 0.42 0.7
+0.9 0.42 0.7
+0.92 0.42 0.7
+0.94 0.42 0.7
+0.06 0.44 0.7
+0.08 0.44 0.7
+0.1 0.44 0.7
+0.9 0.44 0.7
+0.92 0.44 0.7
+0.94 0.44 0.7
+0.06 0.46 0.7
+0.08 0.46 0.7
+0.92 0.46 0.7
+0.94 0.46 0.7
+0.06 0.48 0.7
+0.08 0.48 0.7
+0.92 0.48 0.7
+0.94 0.48 0.7
+0.06 0.5 0.7
+0.08 0.5 0.7
+0.92 0.5 0.7
+0.94 0.5 0.7
+0.06 0.52 0.7
+0.08 0.52 0.7
+0.92 0.52 0.7
+0.94 0.52 0.7
+0.06 0.54 0.7
+0.08 0.54 0.7
+0.92 0.54 0.7
+0.94 0.54 0.7
+0.06 0.56 0.7
+0.08 0.56 0.7
+0.1 0.56 0.7
+0.9 0.56 0.7
+0.92 0.56 0.7
+0.94 0.56 0.7
+0.06 0.58 0.7
+0.08 0.58 0.7
+0.1 0.58 0.7
+0.9 0.58 0.7
+0.92 0.58 0.7
+0.94 0.58 0.7
+0.06 0.6 0.7
+0.08 0.6 0.7
+0.1 0.6 0.7
+0.9 0.6 0.7
+0.92 0.6 0.7
+0.94 0.6 0.7
+0.06 0.62 0.7
+0.08 0.62 0.7
+0.1 0.62 0.7
+0.9 0.62 0.7
+0.92 0.62 0.7
+0.94 0.62 0.7
+0.08 0.64 0.7
+0.1 0.64 0.7
+0.12 0.64 0.7
+0.88 0.64 0.7
+0.9 0.64 0.7
+0.92 0.64 0.7
+0.08 0.66 0.7
+0.1 0.66 0.7
+0.12 0.66 0.7
+0.88 0.66 0.7
+0.9 0.66 0.7
+0.92 0.66 0.7
+0.08 0.68 0.7
+0.1 0.68 0.7
+0.12 0.68 0.7
+0.88 0.68 0.7
+0.9 0.68 0.7
+0.92 0.68 0.7
+0.1 0.7 0.7
+0.12 0.7 0.7
+0.14 0.7 0.7
+0.86 0.7 0.7
+0.88 0.7 0.7
+0.9 0.7 0.7
+0.1 0.72 0.7
+0.12 0.72 0.7
+0.14 0.72 0.7
+0.16 0.72 0.7
+0.84 0.72 0.7
+0.86 0.72 0.7
+0.88 0.72 0.7
+0.9 0.72 0.7
+0.12 0.74 0.7
+0.14 0.74 0.7
+0.16 0.74 0.7
+0.84 0.74 0.7
+0.86 0.74 0.7
+0.88 0.74 0.7
+0.14 0.76 0.7
+0.16 0.76 0.7
+0.18 0.76 0.7
+0.82 0.76 0.7
+0.84 0.76 0.7
+0.86 0.76 0.7
+0.14 0.78 0.7
+0.16 0.78 0.7
+0.18 0.78 0.7
+0.2 0.78 0.7
+0.8 0.78 0.7
+0.82 0.78 0.7
+0.84 0.78 0.7
+0.86 0.78 0.7
+0.16 0.8 0.7
+0.18 0.8 0.7
+0.2 0.8 0.7
+0.22 0.8 0.7
+0.78 0.8 0.7
+0.8 0.8 0.7
+0.82 0.8 0.7
+0.84 0.8 0.7
+0.18 0.82 0.7
+0.2 0.82 0.7
+0.22 0.82 0.7
+0.24 0.82 0.7
+0.76 0.82 0.7
+0.78 0.82 0.7
+0.8 0.82 0.7
+0.82 0.82 0.7
+0.2 0.84 0.7
+0.22 0.84 0.7
+0.24 0.84 0.7
+0.26 0.84 0.7
+0.28 0.84 0.7
+0.72 0.84 0.7
+0.74 0.84 0.7
+0.76 0.84 0.7
+0.78 0.84 0.7
+0.8 0.84 0.7
+0.22 0.86 0.7
+0.24 0.86 0.7
+0.26 0.86 0.7
+0.28 0.86 0.7
+0.3 0.86 0.7
+0.7 0.86 0.7
+0.72 0.86 0.7
+0.74 0.86 0.7
+0.76 0.86 0.7
+0.78 0.86 0.7
+0.26 0.88 0.7
+0.28 0.88 0.7
+0.3 0.88 0.7
+0.32 0.88 0.7
+0.34 0.88 0.7
+0.36 0.88 0.7
+0.64 0.88 0.7
+0.66 0.88 0.7
+0.68 0.88 0.7
+0.7 0.88 0.7
+0.72 0.88 0.7
+0.74 0.88 0.7
+0.28 0.9 0.7
+0.3 0.9 0.7
+0.32 0.9 0.7
+0.34 0.9 0.7
+0.36 0.9 0.7
+0.38 0.9 0.7
+0.4 0.9 0.7
+0.42 0.9 0.7
+0.44 0.9 0.7
+0.56 0.9 0.7
+0.58 0.9 0.7
+0.6 0.9 0.7
+0.62 0.9 0.7
+0.64 0.9 0.7
+0.66 0.9 0.7
+0.68 0.9 0.7
+0.7 0.9 0.7
+0.72 0.9 0.7
+0.32 0.92 0.7
+0.34 0.92 0.7
+0.36 0.92 0.7
+0.38 0.92 0.7
+0.4 0.92 0.7
+0.42 0.92 0.7
+0.44 0.92 0.7
+0.46 0.92 0.7
+0.48 0.92 0.7
+0.5 0.92 0.7
+0.52 0.92 0.7
+0.54 0.92 0.7
+0.56 0.92 0.7
+0.58 0.92 0.7
+0.6 0.92 0.7
+0.62 0.92 0.7
+0.64 0.92 0.7
+0.66 0.92 0.7
+0.68 0.92 0.7
+0.38 0.94 0.7
+0.4 0.94 0.7
+0.42 0.94 0.7
+0.44 0.94 0.7
+0.46 0.94 0.7
+0.48 0.94 0.7
+0.5 0.94 0.7
+0.52 0.94 0.7
+0.54 0.94 0.7
+0.56 0.94 0.7
+0.58 0.94 0.7
+0.6 0.94 0.7
+0.62 0.94 0.7
+0.42 0.06 0.72
+0.44 0.06 0.72
+0.46 0.06 0.72
+0.48 0.06 0.72
+0.5 0.06 0.72
+0.52 0.06 0.72
+0.54 0.06 0.72
+0.56 0.06 0.72
+0.58 0.06 0.72
+0.36 0.08 0.72
+0.38 0.08 0.72
+0.4 0.08 0.72
+0.42 0.08 0.72
+0.44 0.08 0.72
+0.46 0.08 0.72
+0.48 0.08 0.72
+0.5 0.08 0.72
+0.52 0.08 0.72
+0.54 0.08 0.72
+0.56 0.08 0.72
+0.58 0.08 0.72
+0.6 0.08 0.72
+0.62 0.08 0.72
+0.64 0.08 0.72
+0.3 0.1 0.72
+0.32 0.1 0.72
+0.34 0.1 0.72
+0.36 0.1 0.72
+0.38 0.1 0.72
+0.4 0.1 0.72
+0.42 0.1 0.72
+0.44 0.1 0.72
+0.46 0.1 0.72
+0.48 0.1 0.72
+0.5 0.1 0.72
+0.52 0.1 0.72
+0.54 0.1 0.72
+0.56 0.1 0.72
+0.58 0.1 0.72
+0.6 0.1 0.72
+0.62 0.1 0.72
+0.64 0.1 0.72
+0.66 0.1 0.72
+0.68 0.1 0.72
+0.7 0.1 0.72
+0.28 0.12 0.72
+0.3 0.12 0.72
+0.32 0.12 0.72
+0.34 0.12 0.72
+0.36 0.12 0.72
+0.38 0.12 0.72
+0.4 0.12 0.72
+0.6 0.12 0.72
+0.62 0.12 0.72
+0.64 0.12 0.72
+0.66 0.12 0.72
+0.68 0.12 0.72
+0.7 0.12 0.72
+0.72 0.12 0.72
+0.24 0.14 0.72
+0.26 0.14 0.72
+0.28 0.14 0.72
+0.3 0.14 0.72
+0.32 0.14 0.72
+0.34 0.14 0.72
+0.66 0.14 0.72
+0.68 0.14 0.72
+0.7 0.14 0.72
+0.72 0.14 0.72
+0.74 0.14 0.72
+0.76 0.14 0.72
+0.22 0.16 0.72
+0.24 0.16 0.72
+0.26 0.16 0.72
+0.28 0.16 0.72
+0.3 0.16 0.72
+0.7 0.16 0.72
+0.72 0.16 0.72
+0.74 0.16 0.72
+0.76 0.16 0.72
+0.78 0.16 0.72
+0.2 0.18 0.72
+0.22 0.18 0.72
+0.24 0.18 0.72
+0.26 0.18 0.72
+0.74 0.18 0.72
+0.76 0.18 0.72
+0.78 0.18 0.72
+0.8 0.18 0.72
+0.18 0.2 0.72
+0.2 0.2 0.72
+0.22 0.2 0.72
+0.24 0.2 0.72
+0.76 0.2 0.72
+0.78 0.2 0.72
+0.8 0.2 0.72
+0.82 0.2 0.72
+0.16 0.22 0.72
+0.18 0.22 0.72
+0.2 0.22 0.72
+0.22 0.22 0.72
+0.78 0.22 0.72
+0.8 0.22 0.72
+0.82 0.22 0.72
+0.84 0.22 0.72
+0.14 0.24 0.72
+0.16 0.24 0.72
+0.18 0.24 0.72
+0.2 0.24 0.72
+0.8 0.24 0.72
+0.82 0.24 0.72
+0.84 0.24 0.72
+0.86 0.24 0.72
+0.14 0.26 0.72
+0.16 0.26 0.72
+0.18 0.26 0.72
+0.82 0.26 0.72
+0.84 0.26 0.72
+0.86 0.26 0.72
+0.12 0.28 0.72
+0.14 0.28 0.72
+0.16 0.28 0.72
+0.84 0.28 0.72
+0.86 0.28 0.72
+0.88 0.28 0.72
+0.1 0.3 0.72
+0.12 0.3 0.72
+0.14 0.3 0.72
+0.16 0.3 0.72
+0.84 0.3 0.72
+0.86 0.3 0.72
+0.88 0.3 0.72
+0.9 0.3 0.72
+0.1 0.32 0.72
+0.12 0.32 0.72
+0.14 0.32 0.72
+0.86 0.32 0.72
+0.88 0.32 0.72
+0.9 0.32 0.72
+0.1 0.34 0.72
+0.12 0.34 0.72
+0.14 0.34 0.72
+0.86 0.34 0.72
+0.88 0.34 0.72
+0.9 0.34 0.72
+0.08 0.36 0.72
+0.1 0.36 0.72
+0.12 0.36 0.72
+0.88 0.36 0.72
+0.9 0.36 0.72
+0.92 0.36 0.72
+0.08 0.38 0.72
+0.1 0.38 0.72
+0.12 0.38 0.72
+0.88 0.38 0.72
+0.9 0.38 0.72
+0.92 0.38 0.72
+0.08 0.4 0.72
+0.1 0.4 0.72
+0.12 0.4 0.72
+0.88 0.4 0.72
+0.9 0.4 0.72
+0.92 0.4 0.72
+0.06 0.42 0.72
+0.08 0.42 0.72
+0.1 0.42 0.72
+0.9 0.42 0.72
+0.92 0.42 0.72
+0.94 0.42 0.72
+0.06 0.44 0.72
+0.08 0.44 0.72
+0.1 0.44 0.72
+0.9 0.44 0.72
+0.92 0.44 0.72
+0.94 0.44 0.72
+0.06 0.46 0.72
+0.08 0.46 0.72
+0.1 0.46 0.72
+0.9 0.46 0.72
+0.92 0.46 0.72
+0.94 0.46 0.72
+0.06 0.48 0.72
+0.08 0.48 0.72
+0.1 0.48 0.72
+0.9 0.48 0.72
+0.92 0.48 0.72
+0.94 0.48 0.72
+0.06 0.5 0.72
+0.08 0.5 0.72
+0.1 0.5 0.72
+0.9 0.5 0.72
+0.92 0.5 0.72
+0.94 0.5 0.72
+0.06 0.52 0.72
+0.08 0.52 0.72
+0.1 0.52 0.72
+0.9 0.52 0.72
+0.92 0.52 0.72
+0.94 0.52 0.72
+0.06 0.54 0.72
+0.08 0.54 0.72
+0.1 0.54 0.72
+0.9 0.54 0.72
+0.92 0.54 0.72
+0.94 0.54 0.72
+0.06 0.56 0.72
+0.08 0.56 0.72
+0.1 0.56 0.72
+0.9 0.56 0.72
+0.92 0.56 0.72
+0.94 0.56 0.72
+0.06 0.58 0.72
+0.08 0.58 0.72
+0.1 0.58 0.72
+0.9 0.58 0.72
+0.92 0.58 0.72
+0.94 0.58 0.72
+0.08 0.6 0.72
+0.1 0.6 0.72
+0.12 0.6 0.72
+0.88 0.6 0.72
+0.9 0.6 0.72
+0.92 0.6 0.72
+0.08 0.62 0.72
+0.1 0.62 0.72
+0.12 0.62 0.72
+0.88 0.62 0.72
+0.9 0.62 0.72
+0.92 0.62 0.72
+0.08 0.64 0.72
+0.1 0.64 0.72
+0.12 0.64 0.72
+0.88 0.64 0.72
+0.9 0.64 0.72
+0.92 0.64 0.72
+0.1 0.66 0.72
+0.12 0.66 0.72
+0.14 0.66 0.72
+0.86 0.66 0.72
+0.88 0.66 0.72
+0.9 0.66 0.72
+0.1 0.68 0.72
+0.12 0.68 0.72
+0.14 0.68 0.72
+0.86 0.68 0.72
+0.88 0.68 0.72
+0.9 0.68 0.72
+0.1 0.7 0.72
+0.12 0.7 0.72
+0.14 0.7 0.72
+0.16 0.7 0.72
+0.84 0.7 0.72
+0.86 0.7 0.72
+0.88 0.7 0.72
+0.9 0.7 0.72
+0.12 0.72 0.72
+0.14 0.72 0.72
+0.16 0.72 0.72
+0.84 0.72 0.72
+0.86 0.72 0.72
+0.88 0.72 0.72
+0.14 0.74 0.72
+0.16 0.74 0.72
+0.18 0.74 0.72
+0.82 0.74 0.72
+0.84 0.74 0.72
+0.86 0.74 0.72
+0.14 0.76 0.72
+0.16 0.76 0.72
+0.18 0.76 0.72
+0.2 0.76 0.72
+0.8 0.76 0.72
+0.82 0.76 0.72
+0.84 0.76 0.72
+0.86 0.76 0.72
+0.16 0.78 0.72
+0.18 0.78 0.72
+0.2 0.78 0.72
+0.22 0.78 0.72
+0.78 0.78 0.72
+0.8 0.78 0.72
+0.82 0.78 0.72
+0.84 0.78 0.72
+0.18 0.8 0.72
+0.2 0.8 0.72
+0.22 0.8 0.72
+0.24 0.8 0.72
+0.76 0.8 0.72
+0.78 0.8 0.72
+0.8 0.8 0.72
+0.82 0.8 0.72
+0.2 0.82 0.72
+0.22 0.82 0.72
+0.24 0.82 0.72
+0.26 0.82 0.72
+0.74 0.82 0.72
+0.76 0.82 0.72
+0.78 0.82 0.72
+0.8 0.82 0.72
+0.22 0.84 0.72
+0.24 0.84 0.72
+0.26 0.84 0.72
+0.28 0.84 0.72
+0.3 0.84 0.72
+0.7 0.84 0.72
+0.72 0.84 0.72
+0.74 0.84 0.72
+0.76 0.84 0.72
+0.78 0.84 0.72
+0.24 0.86 0.72
+0.26 0.86 0.72
+0.28 0.86 0.72
+0.3 0.86 0.72
+0.32 0.86 0.72
+0.34 0.86 0.72
+0.66 0.86 0.72
+0.68 0.86 0.72
+0.7 0.86 0.72
+0.72 0.86 0.72
+0.74 0.86 0.72
+0.76 0.86 0.72
+0.28 0.88 0.72
+0.3 0.88 0.72
+0.32 0.88 0.72
+0.34 0.88 0.72
+0.36 0.88 0.72
+0.38 0.88 0.72
+0.4 0.88 0.72
+0.6 0.88 0.72
+0.62 0.88 0.72
+0.64 0.88 0.72
+0.66 0.88 0.72
+0.68 0.88 0.72
+0.7 0.88 0.72
+0.72 0.88 0.72
+0.3 0.9 0.72
+0.32 0.9 0.72
+0.34 0.9 0.72
+0.36 0.9 0.72
+0.38 0.9 0.72
+0.4 0.9 0.72
+0.42 0.9 0.72
+0.44 0.9 0.72
+0.46 0.9 0.72
+0.48 0.9 0.72
+0.5 0.9 0.72
+0.52 0.9 0.72
+0.54 0.9 0.72
+0.56 0.9 0.72
+0.58 0.9 0.72
+0.6 0.9 0.72
+0.62 0.9 0.72
+0.64 0.9 0.72
+0.66 0.9 0.72
+0.68 0.9 0.72
+0.7 0.9 0.72
+0.36 0.92 0.72
+0.38 0.92 0.72
+0.4 0.92 0.72
+0.42 0.92 0.72
+0.44 0.92 0.72
+0.46 0.92 0.72
+0.48 0.92 0.72
+0.5 0.92 0.72
+0.52 0.92 0.72
+0.54 0.92 0.72
+0.56 0.92 0.72
+0.58 0.92 0.72
+0.6 0.92 0.72
+0.62 0.92 0.72
+0.64 0.92 0.72
+0.42 0.94 0.72
+0.44 0.94 0.72
+0.46 0.94 0.72
+0.48 0.94 0.72
+0.5 0.94 0.72
+0.52 0.94 0.72
+0.54 0.94 0.72
+0.56 0.94 0.72
+0.58 0.94 0.72
+0.38 0.08 0.74
+0.4 0.08 0.74
+0.42 0.08 0.74
+0.44 0.08 0.74
+0.46 0.08 0.74
+0.48 0.08 0.74
+0.5 0.08 0.74
+0.52 0.08 0.74
+0.54 0.08 0.74
+0.56 0.08 0.74
+0.58 0.08 0.74
+0.6 0.08 0.74
+0.62 0.08 0.74
+0.34 0.1 0.74
+0.36 0.1 0.74
+0.38 0.1 0.74
+0.4 0.1 0.74
+0.42 0.1 0.74
+0.44 0.1 0.74
+0.46 0.1 0.74
+0.48 0.1 0.74
+0.5 0.1 0.74
+0.52 0.1 0.74
+0.54 0.1 0.74
+0.56 0.1 0.74
+0.58 0.1 0.74
+0.6 0.1 0.74
+0.62 0.1 0.74
+0.64 0.1 0.74
+0.66 0.1 0.74
+0.3 0.12 0.74
+0.32 0.12 0.74
+0.34 0.12 0.74
+0.36 0.12 0.74
+0.38 0.12 0.74
+0.4 0.12 0.74
+0.42 0.12 0.74
+0.44 0.12 0.74
+0.46 0.12 0.74
+0.54 0.12 0.74
+0.56 0.12 0.74
+0.58 0.12 0.74
+0.6 0.12 0.74
+0.62 0.12 0.74
+0.64 0.12 0.74
+0.66 0.12 0.74
+0.68 0.12 0.74
+0.7 0.12 0.74
+0.26 0.14 0.74
+0.28 0.14 0.74
+0.3 0.14 0.74
+0.32 0.14 0.74
+0.34 0.14 0.74
+0.36 0.14 0.74
+0.64 0.14 0.74
+0.66 0.14 0.74
+0.68 0.14 0.74
+0.7 0.14 0.74
+0.72 0.14 0.74
+0.74 0.14 0.74
+0.24 0.16 0.74
+0.26 0.16 0.74
+0.28 0.16 0.74
+0.3 0.16 0.74
+0.32 0.16 0.74
+0.68 0.16 0.74
+0.7 0.16 0.74
+0.72 0.16 0.74
+0.74 0.16 0.74
+0.76 0.16 0.74
+0.22 0.18 0.74
+0.24 0.18 0.74
+0.26 0.18 0.74
+0.28 0.18 0.74
+0.72 0.18 0.74
+0.74 0.18 0.74
+0.76 0.18 0.74
+0.78 0.18 0.74
+0.2 0.2 0.74
+0.22 0.2 0.74
+0.24 0.2 0.74
+0.26 0.2 0.74
+0.74 0.2 0.74
+0.76 0.2 0.74
+0.78 0.2 0.74
+0.8 0.2 0.74
+0.18 0.22 0.74
+0.2 0.22 0.74
+0.22 0.22 0.74
+0.24 0.22 0.74
+0.76 0.22 0.74
+0.78 0.22 0.74
+0.8 0.22 0.74
+0.82 0.22 0.74
+0.16 0.24 0.74
+0.18 0.24 0.74
+0.2 0.24 0.74
+0.22 0.24 0.74
+0.78 0.24 0.74
+0.8 0.24 0.74
+0.82 0.24 0.74
+0.84 0.24 0.74
+0.14 0.26 0.74
+0.16 0.26 0.74
+0.18 0.26 0.74
+0.2 0.26 0.74
+0.8 0.26 0.74
+0.82 0.26 0.74
+0.84 0.26 0.74
+0.86 0.26 0.74
+0.14 0.28 0.74
+0.16 0.28 0.74
+0.18 0.28 0.74
+0.82 0.28 0.74
+0.84 0.28 0.74
+0.86 0.28 0.74
+0.12 0.3 0.74
+0.14 0.3 0.74
+0.16 0.3 0.74
+0.84 0.3 0.74
+0.86 0.3 0.74
+0.88 0.3 0.74
+0.12 0.32 0.74
+0.14 0.32 0.74
+0.16 0.32 0.74
+0.84 0.32 0.74
+0.86 0.32 0.74
+0.88 0.32 0.74
+0.1 0.34 0.74
+0.12 0.34 0.74
+0.14 0.34 0.74
+0.86 0.34 0.74
+0.88 0.34 0.74
+0.9 0.34 0.74
+0.1 0.36 0.74
+0.12 0.36 0.74
+0.14 0.36 0.74
+0.86 0.36 0.74
+0.88 0.36 0.74
+0.9 0.36 0.74
+0.08 0.38 0.74
+0.1 0.38 0.74
+0.12 0.38 0.74
+0.88 0.38 0.74
+0.9 0.38 0.74
+0.92 0.38 0.74
+0.08 0.4 0.74
+0.1 0.4 0.74
+0.12 0.4 0.74
+0.88 0.4 0.74
+0.9 0.4 0.74
+0.92 0.4 0.74
+0.08 0.42 0.74
+0.1 0.42 0.74
+0.12 0.42 0.74
+0.88 0.42 0.74
+0.9 0.42 0.74
+0.92 0.42 0.74
+0.08 0.44 0.74
+0.1 0.44 0.74
+0.12 0.44 0.74
+0.88 0.44 0.74
+0.9 0.44 0.74
+0.92 0.44 0.74
+0.08 0.46 0.74
+0.1 0.46 0.74
+0.12 0.46 0.74
+0.88 0.46 0.74
+0.9 0.46 0.74
+0.92 0.46 0.74
+0.08 0.48 0.74
+0.1 0.48 0.74
+0.9 0.48 0.74
+0.92 0.48 0.74
+0.08 0.5 0.74
+0.1 0.5 0.74
+0.9 0.5 0.74
+0.92 0.5 0.74
+0.08 0.52 0.74
+0.1 0.52 0.74
+0.9 0.52 0.74
+0.92 0.52 0.74
+0.08 0.54 0.74
+0.1 0.54 0.74
+0.12 0.54 0.74
+0.88 0.54 0.74
+0.9 0.54 0.74
+0.92 0.54 0.74
+0.08 0.56 0.74
+0.1 0.56 0.74
+0.12 0.56 0.74
+0.88 0.56 0.74
+0.9 0.56 0.74
+0.92 0.56 0.74
+0.08 0.58 0.74
+0.1 0.58 0.74
+0.12 0.58 0.74
+0.88 0.58 0.74
+0.9 0.58 0.74
+0.92 0.58 0.74
+0.08 0.6 0.74
+0.1 0.6 0.74
+0.12 0.6 0.74
+0.88 0.6 0.74
+0.9 0.6 0.74
+0.92 0.6 0.74
+0.08 0.62 0.74
+0.1 0.62 0.74
+0.12 0.62 0.74
+0.88 0.62 0.74
+0.9 0.62 0.74
+0.92 0.62 0.74
+0.1 0.64 0.74
+0.12 0.64 0.74
+0.14 0.64 0.74
+0.86 0.64 0.74
+0.88 0.64 0.74
+0.9 0.64 0.74
+0.1 0.66 0.74
+0.12 0.66 0.74
+0.14 0.66 0.74
+0.86 0.66 0.74
+0.88 0.66 0.74
+0.9 0.66 0.74
+0.12 0.68 0.74
+0.14 0.68 0.74
+0.16 0.68 0.74
+0.84 0.68 0.74
+0.86 0.68 0.74
+0.88 0.68 0.74
+0.12 0.7 0.74
+0.14 0.7 0.74
+0.16 0.7 0.74
+0.84 0.7 0.74
+0.86 0.7 0.74
+0.88 0.7 0.74
+0.14 0.72 0.74
+0.16 0.72 0.74
+0.18 0.72 0.74
+0.82 0.72 0.74
+0.84 0.72 0.74
+0.86 0.72 0.74
+0.14 0.74 0.74
+0.16 0.74 0.74
+0.18 0.74 0.74
+0.2 0.74 0.74
+0.8 0.74 0.74
+0.82 0.74 0.74
+0.84 0.74 0.74
+0.86 0.74 0.74
+0.16 0.76 0.74
+0.18 0.76 0.74
+0.2 0.76 0.74
+0.22 0.76 0.74
+0.78 0.76 0.74
+0.8 0.76 0.74
+0.82 0.76 0.74
+0.84 0.76 0.74
+0.18 0.78 0.74
+0.2 0.78 0.74
+0.22 0.78 0.74
+0.24 0.78 0.74
+0.76 0.78 0.74
+0.78 0.78 0.74
+0.8 0.78 0.74
+0.82 0.78 0.74
+0.2 0.8 0.74
+0.22 0.8 0.74
+0.24 0.8 0.74
+0.26 0.8 0.74
+0.74 0.8 0.74
+0.76 0.8 0.74
+0.78 0.8 0.74
+0.8 0.8 0.74
+0.22 0.82 0.74
+0.24 0.82 0.74
+0.26 0.82 0.74
+0.28 0.82 0.74
+0.72 0.82 0.74
+0.74 0.82 0.74
+0.76 0.82 0.74
+0.78 0.82 0.74
+0.24 0.84 0.74
+0.26 0.84 0.74
+0.28 0.84 0.74
+0.3 0.84 0.74
+0.32 0.84 0.74
+0.68 0.84 0.74
+0.7 0.84 0.74
+0.72 0.84 0.74
+0.74 0.84 0.74
+0.76 0.84 0.74
+0.26 0.86 0.74
+0.28 0.86 0.74
+0.3 0.86 0.74
+0.32 0.86 0.74
+0.34 0.86 0.74
+0.36 0.86 0.74
+0.64 0.86 0.74
+0.66 0.86 0.74
+0.68 0.86 0.74
+0.7 0.86 0.74
+0.72 0.86 0.74
+0.74 0.86 0.74
+0.3 0.88 0.74
+0.32 0.88 0.74
+0.34 0.88 0.74
+0.36 0.88 0.74
+0.38 0.88 0.74
+0.4 0.88 0.74
+0.42 0.88 0.74
+0.44 0.88 0.74
+0.46 0.88 0.74
+0.54 0.88 0.74
+0.56 0.88 0.74
+0.58 0.88 0.74
+0.6 0.88 0.74
+0.62 0.88 0.74
+0.64 0.88 0.74
+0.66 0.88 0.74
+0.68 0.88 0.74
+0.7 0.88 0.74
+0.34 0.9 0.74
+0.36 0.9 0.74
+0.38 0.9 0.74
+0.4 0.9 0.74
+0.42 0.9 0.74
+0.44 0.9 0.74
+0.46 0.9 0.74
+0.48 0.9 0.74
+0.5 0.9 0.74
+0.52 0.9 0.74
+0.54 0.9 0.74
+0.56 0.9 0.74
+0.58 0.9 0.74
+0.6 0.9 0.74
+0.62 0.9 0.74
+0.64 0.9 0.74
+0.66 0.9 0.74
+0.38 0.92 0.74
+0.4 0.92 0.74
+0.42 0.92 0.74
+0.44 0.92 0.74
+0.46 0.92 0.74
+0.48 0.92 0.74
+0.5 0.92 0.74
+0.52 0.92 0.74
+0.54 0.92 0.74
+0.56 0.92 0.74
+0.58 0.92 0.74
+0.6 0.92 0.74
+0.62 0.92 0.74
+0.44 0.08 0.76
+0.46 0.08 0.76
+0.48 0.08 0.76
+0.5 0.08 0.76
+0.52 0.08 0.76
+0.54 0.08 0.76
+0.56 0.08 0.76
+0.36 0.1 0.76
+0.38 0.1 0.76
+0.4 0.1 0.76
+0.42 0.1 0.76
+0.44 0.1 0.76
+0.46 0.1 0.76
+0.48 0.1 0.76
+0.5 0.1 0.76
+0.52 0.1 0.76
+0.54 0.1 0.76
+0.56 0.1 0.76
+0.58 0.1 0.76
+0.6 0.1 0.76
+0.62 0.1 0.76
+0.64 0.1 0.76
+0.32 0.12 0.76
+0.34 0.12 0.76
+0.36 0.12 0.76
+0.38 0.12 0.76
+0.4 0.12 0.76
+0.42 0.12 0.76
+0.44 0.12 0.76
+0.46 0.12 0.76
+0.48 0.12 0.76
+0.5 0.12 0.76
+0.52 0.12 0.76
+0.54 0.12 0.76
+0.56 0.12 0.76
+0.58 0.12 0.76
+0.6 0.12 0.76
+0.62 0.12 0.76
+0.64 0.12 0.76
+0.66 0.12 0.76
+0.68 0.12 0.76
+0.28 0.14 0.76
+0.3 0.14 0.76
+0.32 0.14 0.76
+0.34 0.14 0.76
+0.36 0.14 0.76
+0.38 0.14 0.76
+0.4 0.14 0.76
+0.42 0.14 0.76
+0.58 0.14 0.76
+0.6 0.14 0.76
+0.62 0.14 0.76
+0.64 0.14 0.76
+0.66 0.14 0.76
+0.68 0.14 0.76
+0.7 0.14 0.76
+0.72 0.14 0.76
+0.26 0.16 0.76
+0.28 0.16 0.76
+0.3 0.16 0.76
+0.32 0.16 0.76
+0.34 0.16 0.76
+0.36 0.16 0.76
+0.64 0.16 0.76
+0.66 0.16 0.76
+0.68 0.16 0.76
+0.7 0.16 0.76
+0.72 0.16 0.76
+0.74 0.16 0.76
+0.22 0.18 0.76
+0.24 0.18 0.76
+0.26 0.18 0.76
+0.28 0.18 0.76
+0.3 0.18 0.76
+0.7 0.18 0.76
+0.72 0.18 0.76
+0.74 0.18 0.76
+0.76 0.18 0.76
+0.78 0.18 0.76
+0.2 0.2 0.76
+0.22 0.2 0.76
+0.24 0.2 0.76
+0.26 0.2 0.76
+0.28 0.2 0.76
+0.72 0.2 0.76
+0.74 0.2 0.76
+0.76 0.2 0.76
+0.78 0.2 0.76
+0.8 0.2 0.76
+0.18 0.22 0.76
+0.2 0.22 0.76
+0.22 0.22 0.76
+0.24 0.22 0.76
+0.26 0.22 0.76
+0.74 0.22 0.76
+0.76 0.22 0.76
+0.78 0.22 0.76
+0.8 0.22 0.76
+0.82 0.22 0.76
+0.18 0.24 0.76
+0.2 0.24 0.76
+0.22 0.24 0.76
+0.24 0.24 0.76
+0.76 0.24 0.76
+0.78 0.24 0.76
+0.8 0.24 0.76
+0.82 0.24 0.76
+0.16 0.26 0.76
+0.18 0.26 0.76
+0.2 0.26 0.76
+0.22 0.26 0.76
+0.78 0.26 0.76
+0.8 0.26 0.76
+0.82 0.26 0.76
+0.84 0.26 0.76
+0.14 0.28 0.76
+0.16 0.28 0.76
+0.18 0.28 0.76
+0.2 0.28 0.76
+0.8 0.28 0.76
+0.82 0.28 0.76
+0.84 0.28 0.76
+0.86 0.28 0.76
+0.14 0.3 0.76
+0.16 0.3 0.76
+0.18 0.3 0.76
+0.82 0.3 0.76
+0.84 0.3 0.76
+0.86 0.3 0.76
+0.12 0.32 0.76
+0.14 0.32 0.76
+0.16 0.32 0.76
+0.84 0.32 0.76
+0.86 0.32 0.76
+0.88 0.32 0.76
+0.12 0.34 0.76
+0.14 0.34 0.76
+0.16 0.34 0.76
+0.84 0.34 0.76
+0.86 0.34 0.76
+0.88 0.34 0.76
+0.1 0.36 0.76
+0.12 0.36 0.76
+0.14 0.36 0.76
+0.16 0.36 0.76
+0.84 0.36 0.76
+0.86 0.36 0.76
+0.88 0.36 0.76
+0.9 0.36 0.76
+0.1 0.38 0.76
+0.12 0.38 0.76
+0.14 0.38 0.76
+0.86 0.38 0.76
+0.88 0.38 0.76
+0.9 0.38 0.76
+0.1 0.4 0.76
+0.12 0.4 0.76
+0.14 0.4 0.76
+0.86 0.4 0.76
+0.88 0.4 0.76
+0.9 0.4 0.76
+0.1 0.42 0.76
+0.12 0.42 0.76
+0.14 0.42 0.76
+0.86 0.42 0.76
+0.88 0.42 0.76
+0.9 0.42 0.76
+0.08 0.44 0.76
+0.1 0.44 0.76
+0.12 0.44 0.76
+0.88 0.44 0.76
+0.9 0.44 0.76
+0.92 0.44 0.76
+0.08 0.46 0.76
+0.1 0.46 0.76
+0.12 0.46 0.76
+0.88 0.46 0.76
+0.9 0.46 0.76
+0.92 0.46 0.76
+0.08 0.48 0.76
+0.1 0.48 0.76
+0.12 0.48 0.76
+0.88 0.48 0.76
+0.9 0.48 0.76
+0.92 0.48 0.76
+0.08 0.5 0.76
+0.1 0.5 0.76
+0.12 0.5 0.76
+0.88 0.5 0.76
+0.9 0.5 0.76
+0.92 0.5 0.76
+0.08 0.52 0.76
+0.1 0.52 0.76
+0.12 0.52 0.76
+0.88 0.52 0.76
+0.9 0.52 0.76
+0.92 0.52 0.76
+0.08 0.54 0.76
+0.1 0.54 0.76
+0.12 0.54 0.76
+0.88 0.54 0.76
+0.9 0.54 0.76
+0.92 0.54 0.76
+0.08 0.56 0.76
+0.1 0.56 0.76
+0.12 0.56 0.76
+0.88 0.56 0.76
+0.9 0.56 0.76
+0.92 0.56 0.76
+0.1 0.58 0.76
+0.12 0.58 0.76
+0.14 0.58 0.76
+0.86 0.58 0.76
+0.88 0.58 0.76
+0.9 0.58 0.76
+0.1 0.6 0.76
+0.12 0.6 0.76
+0.14 0.6 0.76
+0.86 0.6 0.76
+0.88 0.6 0.76
+0.9 0.6 0.76
+0.1 0.62 0.76
+0.12 0.62 0.76
+0.14 0.62 0.76
+0.86 0.62 0.76
+0.88 0.62 0.76
+0.9 0.62 0.76
+0.1 0.64 0.76
+0.12 0.64 0.76
+0.14 0.64 0.76
+0.16 0.64 0.76
+0.84 0.64 0.76
+0.86 0.64 0.76
+0.88 0.64 0.76
+0.9 0.64 0.76
+0.12 0.66 0.76
+0.14 0.66 0.76
+0.16 0.66 0.76
+0.84 0.66 0.76
+0.86 0.66 0.76
+0.88 0.66 0.76
+0.12 0.68 0.76
+0.14 0.68 0.76
+0.16 0.68 0.76
+0.84 0.68 0.76
+0.86 0.68 0.76
+0.88 0.68 0.76
+0.14 0.7 0.76
+0.16 0.7 0.76
+0.18 0.7 0.76
+0.82 0.7 0.76
+0.84 0.7 0.76
+0.86 0.7 0.76
+0.14 0.72 0.76
+0.16 0.72 0.76
+0.18 0.72 0.76
+0.2 0.72 0.76
+0.8 0.72 0.76
+0.82 0.72 0.76
+0.84 0.72 0.76
+0.86 0.72 0.76
+0.16 0.74 0.76
+0.18 0.74 0.76
+0.2 0.74 0.76
+0.22 0.74 0.76
+0.78 0.74 0.76
+0.8 0.74 0.76
+0.82 0.74 0.76
+0.84 0.74 0.76
+0.18 0.76 0.76
+0.2 0.76 0.76
+0.22 0.76 0.76
+0.24 0.76 0.76
+0.76 0.76 0.76
+0.78 0.76 0.76
+0.8 0.76 0.76
+0.82 0.76 0.76
+0.18 0.78 0.76
+0.2 0.78 0.76
+0.22 0.78 0.76
+0.24 0.78 0.76
+0.26 0.78 0.76
+0.74 0.78 0.76
+0.76 0.78 0.76
+0.78 0.78 0.76
+0.8 0.78 0.76
+0.82 0.78 0.76
+0.2 0.8 0.76
+0.22 0.8 0.76
+0.24 0.8 0.76
+0.26 0.8 0.76
+0.28 0.8 0.76
+0.72 0.8 0.76
+0.74 0.8 0.76
+0.76 0.8 0.76
+0.78 0.8 0.76
+0.8 0.8 0.76
+0.22 0.82 0.76
+0.24 0.82 0.76
+0.26 0.82 0.76
+0.28 0.82 0.76
+0.3 0.82 0.76
+0.7 0.82 0.76
+0.72 0.82 0.76
+0.74 0.82 0.76
+0.76 0.82 0.76
+0.78 0.82 0.76
+0.26 0.84 0.76
+0.28 0.84 0.76
+0.3 0.84 0.76
+0.32 0.84 0.76
+0.34 0.84 0.76
+0.36 0.84 0.76
+0.64 0.84 0.76
+0.66 0.84 0.76
+0.68 0.84 0.76
+0.7 0.84 0.76
+0.72 0.84 0.76
+0.74 0.84 0.76
+0.28 0.86 0.76
+0.3 0.86 0.76
+0.32 0.86 0.76
+0.34 0.86 0.76
+0.36 0.86 0.76
+0.38 0.86 0.76
+0.4 0.86 0.76
+0.42 0.86 0.76
+0.58 0.86 0.76
+0.6 0.86 0.76
+0.62 0.86 0.76
+0.64 0.86 0.76
+0.66 0.86 0.76
+0.68 0.86 0.76
+0.7 0.86 0.76
+0.72 0.86 0.76
+0.32 0.88 0.76
+0.34 0.88 0.76
+0.36 0.88 0.76
+0.38 0.88 0.76
+0.4 0.88 0.76
+0.42 0.88 0.76
+0.44 0.88 0.76
+0.46 0.88 0.76
+0.48 0.88 0.76
+0.5 0.88 0.76
+0.52 0.88 0.76
+0.54 0.88 0.76
+0.56 0.88 0.76
+0.58 0.88 0.76
+0.6 0.88 0.76
+0.62 0.88 0.76
+0.64 0.88 0.76
+0.66 0.88 0.76
+0.68 0.88 0.76
+0.36 0.9 0.76
+0.38 0.9 0.76
+0.4 0.9 0.76
+0.42 0.9 0.76
+0.44 0.9 0.76
+0.46 0.9 0.76
+0.48 0.9 0.76
+0.5 0.9 0.76
+0.52 0.9 0.76
+0.54 0.9 0.76
+0.56 0.9 0.76
+0.58 0.9 0.76
+0.6 0.9 0.76
+0.62 0.9 0.76
+0.64 0.9 0.76
+0.44 0.92 0.76
+0.46 0.92 0.76
+0.48 0.92 0.76
+0.5 0.92 0.76
+0.52 0.92 0.76
+0.54 0.92 0.76
+0.56 0.92 0.76
+0.4 0.1 0.78
+0.42 0.1 0.78
+0.44 0.1 0.78
+0.46 0.1 0.78
+0.48 0.1 0.78
+0.5 0.1 0.78
+0.52 0.1 0.78
+0.54 0.1 0.78
+0.56 0.1 0.78
+0.58 0.1 0.78
+0.6 0.1 0.78
+0.34 0.12 0.78
+0.36 0.12 0.78
+0.38 0.12 0.78
+0.4 0.12 0.78
+0.42 0.12 0.78
+0.44 0.12 0.78
+0.46 0.12 0.78
+0.48 0.12 0.78
+0.5 0.12 0.78
+0.52 0.12 0.78
+0.54 0.12 0.78
+0.56 0.12 0.78
+0.58 0.12 0.78
+0.6 0.12 0.78
+0.62 0.12 0.78
+0.64 0.12 0.78
+0.66 0.12 0.78
+0.3 0.14 0.78
+0.32 0.14 0.78
+0.34 0.14 0.78
+0.36 0.14 0.78
+0.38 0.14 0.78
+0.4 0.14 0.78
+0.42 0.14 0.78
+0.44 0.14 0.78
+0.46 0.14 0.78
+0.48 0.14 0.78
+0.5 0.14 0.78
+0.52 0.14 0.78
+0.54 0.14 0.78
+0.56 0.14 0.78
+0.58 0.14 0.78
+0.6 0.14 0.78
+0.62 0.14 0.78
+0.64 0.14 0.78
+0.66 0.14 0.78
+0.68 0.14 0.78
+0.7 0.14 0.78
+0.28 0.16 0.78
+0.3 0.16 0.78
+0.32 0.16 0.78
+0.34 0.16 0.78
+0.36 0.16 0.78
+0.38 0.16 0.78
+0.4 0.16 0.78
+0.6 0.16 0.78
+0.62 0.16 0.78
+0.64 0.16 0.78
+0.66 0.16 0.78
+0.68 0.16 0.78
+0.7 0.16 0.78
+0.72 0.16 0.78
+0.24 0.18 0.78
+0.26 0.18 0.78
+0.28 0.18 0.78
+0.3 0.18 0.78
+0.32 0.18 0.78
+0.34 0.18 0.78
+0.66 0.18 0.78
+0.68 0.18 0.78
+0.7 0.18 0.78
+0.72 0.18 0.78
+0.74 0.18 0.78
+0.76 0.18 0.78
+0.22 0.2 0.78
+0.24 0.2 0.78
+0.26 0.2 0.78
+0.28 0.2 0.78
+0.3 0.2 0.78
+0.7 0.2 0.78
+0.72 0.2 0.78
+0.74 0.2 0.78
+0.76 0.2 0.78
+0.78 0.2 0.78
+0.2 0.22 0.78
+0.22 0.22 0.78
+0.24 0.22 0.78
+0.26 0.22 0.78
+0.28 0.22 0.78
+0.72 0.22 0.78
+0.74 0.22 0.78
+0.76 0.22 0.78
+0.78 0.22 0.78
+0.8 0.22 0.78
+0.18 0.24 0.78
+0.2 0.24 0.78
+0.22 0.24 0.78
+0.24 0.24 0.78
+0.26 0.24 0.78
+0.74 0.24 0.78
+0.76 0.24 0.78
+0.78 0.24 0.78
+0.8 0.24 0.78
+0.82 0.24 0.78
+0.18 0.26 0.78
+0.2 0.26 0.78
+0.22 0.26 0.78
+0.24 0.26 0.78
+0.76 0.26 0.78
+0.78 0.26 0.78
+0.8 0.26 0.78
+0.82 0.26 0.78
+0.16 0.28 0.78
+0.18 0.28 0.78
+0.2 0.28 0.78
+0.22 0.28 0.78
+0.78 0.28 0.78
+0.8 0.28 0.78
+0.82 0.28 0.78
+0.84 0.28 0.78
+0.14 0.3 0.78
+0.16 0.3 0.78
+0.18 0.3 0.78
+0.2 0.3 0.78
+0.8 0.3 0.78
+0.82 0.3 0.78
+0.84 0.3 0.78
+0.86 0.3 0.78
+0.14 0.32 0.78
+0.16 0.32 0.78
+0.18 0.32 0.78
+0.82 0.32 0.78
+0.84 0.32 0.78
+0.86 0.32 0.78
+0.12 0.34 0.78
+0.14 0.34 0.78
+0.16 0.34 0.78
+0.18 0.34 0.78
+0.82 0.34 0.78
+0.84 0.34 0.78
+0.86 0.34 0.78
+0.88 0.34 0.78
+0.12 0.36 0.78
+0.14 0.36 0.78
+0.16 0.36 0.78
+0.84 0.36 0.78
+0.86 0.36 0.78
+0.88 0.36 0.78
+0.12 0.38 0.78
+0.14 0.38 0.78
+0.16 0.38 0.78
+0.84 0.38 0.78
+0.86 0.38 0.78
+0.88 0.38 0.78
+0.1 0.4 0.78
+0.12 0.4 0.78
+0.14 0.4 0.78
+0.16 0.4 0.78
+0.84 0.4 0.78
+0.86 0.4 0.78
+0.88 0.4 0.78
+0.9 0.4 0.78
+0.1 0.42 0.78
+0.12 0.42 0.78
+0.14 0.42 0.78
+0.86 0.42 0.78
+0.88 0.42 0.78
+0.9 0.42 0.78
+0.1 0.44 0.78
+0.12 0.44 0.78
+0.14 0.44 0.78
+0.86 0.44 0.78
+0.88 0.44 0.78
+0.9 0.44 0.78
+0.1 0.46 0.78
+0.12 0.46 0.78
+0.14 0.46 0.78
+0.86 0.46 0.78
+0.88 0.46 0.78
+0.9 0.46 0.78
+0.1 0.48 0.78
+0.12 0.48 0.78
+0.14 0.48 0.78
+0.86 0.48 0.78
+0.88 0.48 0.78
+0.9 0.48 0.78
+0.1 0.5 0.78
+0.12 0.5 0.78
+0.14 0.5 0.78
+0.86 0.5 0.78
+0.88 0.5 0.78
+0.9 0.5 0.78
+0.1 0.52 0.78
+0.12 0.52 0.78
+0.14 0.52 0.78
+0.86 0.52 0.78
+0.88 0.52 0.78
+0.9 0.52 0.78
+0.1 0.54 0.78
+0.12 0.54 0.78
+0.14 0.54 0.78
+0.86 0.54 0.78
+0.88 0.54 0.78
+0.9 0.54 0.78
+0.1 0.56 0.78
+0.12 0.56 0.78
+0.14 0.56 0.78
+0.86 0.56 0.78
+0.88 0.56 0.78
+0.9 0.56 0.78
+0.1 0.58 0.78
+0.12 0.58 0.78
+0.14 0.58 0.78
+0.86 0.58 0.78
+0.88 0.58 0.78
+0.9 0.58 0.78
+0.1 0.6 0.78
+0.12 0.6 0.78
+0.14 0.6 0.78
+0.16 0.6 0.78
+0.84 0.6 0.78
+0.86 0.6 0.78
+0.88 0.6 0.78
+0.9 0.6 0.78
+0.12 0.62 0.78
+0.14 0.62 0.78
+0.16 0.62 0.78
+0.84 0.62 0.78
+0.86 0.62 0.78
+0.88 0.62 0.78
+0.12 0.64 0.78
+0.14 0.64 0.78
+0.16 0.64 0.78
+0.84 0.64 0.78
+0.86 0.64 0.78
+0.88 0.64 0.78
+0.12 0.66 0.78
+0.14 0.66 0.78
+0.16 0.66 0.78
+0.18 0.66 0.78
+0.82 0.66 0.78
+0.84 0.66 0.78
+0.86 0.66 0.78
+0.88 0.66 0.78
+0.14 0.68 0.78
+0.16 0.68 0.78
+0.18 0.68 0.78
+0.82 0.68 0.78
+0.84 0.68 0.78
+0.86 0.68 0.78
+0.14 0.7 0.78
+0.16 0.7 0.78
+0.18 0.7 0.78
+0.2 0.7 0.78
+0.8 0.7 0.78
+0.82 0.7 0.78
+0.84 0.7 0.78
+0.86 0.7 0.78
+0.16 0.72 0.78
+0.18 0.72 0.78
+0.2 0.72 0.78
+0.22 0.72 0.78
+0.78 0.72 0.78
+0.8 0.72 0.78
+0.82 0.72 0.78
+0.84 0.72 0.78
+0.18 0.74 0.78
+0.2 0.74 0.78
+0.22 0.74 0.78
+0.24 0.74 0.78
+0.76 0.74 0.78
+0.78 0.74 0.78
+0.8 0.74 0.78
+0.82 0.74 0.78
+0.18 0.76 0.78
+0.2 0.76 0.78
+0.22 0.76 0.78
+0.24 0.76 0.78
+0.26 0.76 0.78
+0.74 0.76 0.78
+0.76 0.76 0.78
+0.78 0.76 0.78
+0.8 0.76 0.78
+0.82 0.76 0.78
+0.2 0.78 0.78
+0.22 0.78 0.78
+0.24 0.78 0.78
+0.26 0.78 0.78
+0.28 0.78 0.78
+0.72 0.78 0.78
+0.74 0.78 0.78
+0.76 0.78 0.78
+0.78 0.78 0.78
+0.8 0.78 0.78
+0.22 0.8 0.78
+0.24 0.8 0.78
+0.26 0.8 0.78
+0.28 0.8 0.78
+0.3 0.8 0.78
+0.7 0.8 0.78
+0.72 0.8 0.78
+0.74 0.8 0.78
+0.76 0.8 0.78
+0.78 0.8 0.78
+0.24 0.82 0.78
+0.26 0.82 0.78
+0.28 0.82 0.78
+0.3 0.82 0.78
+0.32 0.82 0.78
+0.34 0.82 0.78
+0.66 0.82 0.78
+0.68 0.82 0.78
+0.7 0.82 0.78
+0.72 0.82 0.78
+0.74 0.82 0.78
+0.76 0.82 0.78
+0.28 0.84 0.78
+0.3 0.84 0.78
+0.32 0.84 0.78
+0.34 0.84 0.78
+0.36 0.84 0.78
+0.38 0.84 0.78
+0.4 0.84 0.78
+0.6 0.84 0.78
+0.62 0.84 0.78
+0.64 0.84 0.78
+0.66 0.84 0.78
+0.68 0.84 0.78
+0.7 0.84 0.78
+0.72 0.84 0.78
+0.3 0.86 0.78
+0.32 0.86 0.78
+0.34 0.86 0.78
+0.36 0.86 0.78
+0.38 0.86 0.78
+0.4 0.86 0.78
+0.42 0.86 0.78
+0.44 0.86 0.78
+0.46 0.86 0.78
+0.48 0.86 0.78
+0.5 0.86 0.78
+0.52 0.86 0.78
+0.54 0.86 0.78
+0.56 0.86 0.78
+0.58 0.86 0.78
+0.6 0.86 0.78
+0.62 0.86 0.78
+0.64 0.86 0.78
+0.66 0.86 0.78
+0.68 0.86 0.78
+0.7 0.86 0.78
+0.34 0.88 0.78
+0.36 0.88 0.78
+0.38 0.88 0.78
+0.4 0.88 0.78
+0.42 0.88 0.78
+0.44 0.88 0.78
+0.46 0.88 0.78
+0.48 0.88 0.78
+0.5 0.88 0.78
+0.52 0.88 0.78
+0.54 0.88 0.78
+0.56 0.88 0.78
+0.58 0.88 0.78
+0.6 0.88 0.78
+0.62 0.88 0.78
+0.64 0.88 0.78
+0.66 0.88 0.78
+0.4 0.9 0.78
+0.42 0.9 0.78
+0.44 0.9 0.78
+0.46 0.9 0.78
+0.48 0.9 0.78
+0.5 0.9 0.78
+0.52 0.9 0.78
+0.54 0.9 0.78
+0.56 0.9 0.78
+0.58 0.9 0.78
+0.6 0.9 0.78
+0.38 0.12 0.8
+0.4 0.12 0.8
+0.42 0.12 0.8
+0.44 0.12 0.8
+0.46 0.12 0.8
+0.48 0.12 0.8
+0.5 0.12 0.8
+0.52 0.12 0.8
+0.54 0.12 0.8
+0.56 0.12 0.8
+0.58 0.12 0.8
+0.6 0.12 0.8
+0.62 0.12 0.8
+0.34 0.14 0.8
+0.36 0.14 0.8
+0.38 0.14 0.8
+0.4 0.14 0.8
+0.42 0.14 0.8
+0.44 0.14 0.8
+0.46 0.14 0.8
+0.48 0.14 0.8
+0.5 0.14 0.8
+0.52 0.14 0.8
+0.54 0.14 0.8
+0.56 0.14 0.8
+0.58 0.14 0.8
+0.6 0.14 0.8
+0.62 0.14 0.8
+0.64 0.14 0.8
+0.66 0.14 0.8
+0.3 0.16 0.8
+0.32 0.16 0.8
+0.34 0.16 0.8
+0.36 0.16 0.8
+0.38 0.16 0.8
+0.4 0.16 0.8
+0.42 0.16 0.8
+0.44 0.16 0.8
+0.46 0.16 0.8
+0.48 0.16 0.8
+0.5 0.16 0.8
+0.52 0.16 0.8
+0.54 0.16 0.8
+0.56 0.16 0.8
+0.58 0.16 0.8
+0.6 0.16 0.8
+0.62 0.16 0.8
+0.64 0.16 0.8
+0.66 0.16 0.8
+0.68 0.16 0.8
+0.7 0.16 0.8
+0.28 0.18 0.8
+0.3 0.18 0.8
+0.32 0.18 0.8
+0.34 0.18 0.8
+0.36 0.18 0.8
+0.38 0.18 0.8
+0.62 0.18 0.8
+0.64 0.18 0.8
+0.66 0.18 0.8
+0.68 0.18 0.8
+0.7 0.18 0.8
+0.72 0.18 0.8
+0.24 0.2 0.8
+0.26 0.2 0.8
+0.28 0.2 0.8
+0.3 0.2 0.8
+0.32 0.2 0.8
+0.34 0.2 0.8
+0.66 0.2 0.8
+0.68 0.2 0.8
+0.7 0.2 0.8
+0.72 0.2 0.8
+0.74 0.2 0.8
+0.76 0.2 0.8
+0.22 0.22 0.8
+0.24 0.22 0.8
+0.26 0.22 0.8
+0.28 0.22 0.8
+0.3 0.22 0.8
+0.7 0.22 0.8
+0.72 0.22 0.8
+0.74 0.22 0.8
+0.76 0.22 0.8
+0.78 0.22 0.8
+0.2 0.24 0.8
+0.22 0.24 0.8
+0.24 0.24 0.8
+0.26 0.24 0.8
+0.28 0.24 0.8
+0.72 0.24 0.8
+0.74 0.24 0.8
+0.76 0.24 0.8
+0.78 0.24 0.8
+0.8 0.24 0.8
+0.2 0.26 0.8
+0.22 0.26 0.8
+0.24 0.26 0.8
+0.26 0.26 0.8
+0.74 0.26 0.8
+0.76 0.26 0.8
+0.78 0.26 0.8
+0.8 0.26 0.8
+0.18 0.28 0.8
+0.2 0.28 0.8
+0.22 0.28 0.8
+0.24 0.28 0.8
+0.76 0.28 0.8
+0.78 0.28 0.8
+0.8 0.28 0.8
+0.82 0.28 0.8
+0.16 0.3 0.8
+0.18 0.3 0.8
+0.2 0.3 0.8
+0.22 0.3 0.8
+0.78 0.3 0.8
+0.8 0.3 0.8
+0.82 0.3 0.8
+0.84 0.3 0.8
+0.16 0.32 0.8
+0.18 0.32 0.8
+0.2 0.32 0.8
+0.8 0.32 0.8
+0.82 0.32 0.8
+0.84 0.32 0.8
+0.14 0.34 0.8
+0.16 0.34 0.8
+0.18 0.34 0.8
+0.2 0.34 0.8
+0.8 0.34 0.8
+0.82 0.34 0.8
+0.84 0.34 0.8
+0.86 0.34 0.8
+0.14 0.36 0.8
+0.16 0.36 0.8
+0.18 0.36 0.8
+0.82 0.36 0.8
+0.84 0.36 0.8
+0.86 0.36 0.8
+0.12 0.38 0.8
+0.14 0.38 0.8
+0.16 0.38 0.8
+0.18 0.38 0.8
+0.82 0.38 0.8
+0.84 0.38 0.8
+0.86 0.38 0.8
+0.88 0.38 0.8
+0.12 0.4 0.8
+0.14 0.4 0.8
+0.16 0.4 0.8
+0.84 0.4 0.8
+0.86 0.4 0.8
+0.88 0.4 0.8
+0.12 0.42 0.8
+0.14 0.42 0.8
+0.16 0.42 0.8
+0.84 0.42 0.8
+0.86 0.42 0.8
+0.88 0.42 0.8
+0.12 0.44 0.8
+0.14 0.44 0.8
+0.16 0.44 0.8
+0.84 0.44 0.8
+0.86 0.44 0.8
+0.88 0.44 0.8
+0.12 0.46 0.8
+0.14 0.46 0.8
+0.16 0.46 0.8
+0.84 0.46 0.8
+0.86 0.46 0.8
+0.88 0.46 0.8
+0.12 0.48 0.8
+0.14 0.48 0.8
+0.16 0.48 0.8
+0.84 0.48 0.8
+0.86 0.48 0.8
+0.88 0.48 0.8
+0.12 0.5 0.8
+0.14 0.5 0.8
+0.16 0.5 0.8
+0.84 0.5 0.8
+0.86 0.5 0.8
+0.88 0.5 0.8
+0.12 0.52 0.8
+0.14 0.52 0.8
+0.16 0.52 0.8
+0.84 0.52 0.8
+0.86 0.52 0.8
+0.88 0.52 0.8
+0.12 0.54 0.8
+0.14 0.54 0.8
+0.16 0.54 0.8
+0.84 0.54 0.8
+0.86 0.54 0.8
+0.88 0.54 0.8
+0.12 0.56 0.8
+0.14 0.56 0.8
+0.16 0.56 0.8
+0.84 0.56 0.8
+0.86 0.56 0.8
+0.88 0.56 0.8
+0.12 0.58 0.8
+0.14 0.58 0.8
+0.16 0.58 0.8
+0.84 0.58 0.8
+0.86 0.58 0.8
+0.88 0.58 0.8
+0.12 0.6 0.8
+0.14 0.6 0.8
+0.16 0.6 0.8
+0.84 0.6 0.8
+0.86 0.6 0.8
+0.88 0.6 0.8
+0.12 0.62 0.8
+0.14 0.62 0.8
+0.16 0.62 0.8
+0.18 0.62 0.8
+0.82 0.62 0.8
+0.84 0.62 0.8
+0.86 0.62 0.8
+0.88 0.62 0.8
+0.14 0.64 0.8
+0.16 0.64 0.8
+0.18 0.64 0.8
+0.82 0.64 0.8
+0.84 0.64 0.8
+0.86 0.64 0.8
+0.14 0.66 0.8
+0.16 0.66 0.8
+0.18 0.66 0.8
+0.2 0.66 0.8
+0.8 0.66 0.8
+0.82 0.66 0.8
+0.84 0.66 0.8
+0.86 0.66 0.8
+0.16 0.68 0.8
+0.18 0.68 0.8
+0.2 0.68 0.8
+0.8 0.68 0.8
+0.82 0.68 0.8
+0.84 0.68 0.8
+0.16 0.7 0.8
+0.18 0.7 0.8
+0.2 0.7 0.8
+0.22 0.7 0.8
+0.78 0.7 0.8
+0.8 0.7 0.8
+0.82 0.7 0.8
+0.84 0.7 0.8
+0.18 0.72 0.8
+0.2 0.72 0.8
+0.22 0.72 0.8
+0.24 0.72 0.8
+0.76 0.72 0.8
+0.78 0.72 0.8
+0.8 0.72 0.8
+0.82 0.72 0.8
+0.2 0.74 0.8
+0.22 0.74 0.8
+0.24 0.74 0.8
+0.26 0.74 0.8
+0.74 0.74 0.8
+0.76 0.74 0.8
+0.78 0.74 0.8
+0.8 0.74 0.8
+0.2 0.76 0.8
+0.22 0.76 0.8
+0.24 0.76 0.8
+0.26 0.76 0.8
+0.28 0.76 0.8
+0.72 0.76 0.8
+0.74 0.76 0.8
+0.76 0.76 0.8
+0.78 0.76 0.8
+0.8 0.76 0.8
+0.22 0.78 0.8
+0.24 0.78 0.8
+0.26 0.78 0.8
+0.28 0.78 0.8
+0.3 0.78 0.8
+0.7 0.78 0.8
+0.72 0.78 0.8
+0.74 0.78 0.8
+0.76 0.78 0.8
+0.78 0.78 0.8
+0.24 0.8 0.8
+0.26 0.8 0.8
+0.28 0.8 0.8
+0.3 0.8 0.8
+0.32 0.8 0.8
+0.34 0.8 0.8
+0.66 0.8 0.8
+0.68 0.8 0.8
+0.7 0.8 0.8
+0.72 0.8 0.8
+0.74 0.8 0.8
+0.76 0.8 0.8
+0.28 0.82 0.8
+0.3 0.82 0.8
+0.32 0.82 0.8
+0.34 0.82 0.8
+0.36 0.82 0.8
+0.38 0.82 0.8
+0.62 0.82 0.8
+0.64 0.82 0.8
+0.66 0.82 0.8
+0.68 0.82 0.8
+0.7 0.82 0.8
+0.72 0.82 0.8
+0.3 0.84 0.8
+0.32 0.84 0.8
+0.34 0.84 0.8
+0.36 0.84 0.8
+0.38 0.84 0.8
+0.4 0.84 0.8
+0.42 0.84 0.8
+0.44 0.84 0.8
+0.46 0.84 0.8
+0.48 0.84 0.8
+0.5 0.84 0.8
+0.52 0.84 0.8
+0.54 0.84 0.8
+0.56 0.84 0.8
+0.58 0.84 0.8
+0.6 0.84 0.8
+0.62 0.84 0.8
+0.64 0.84 0.8
+0.66 0.84 0.8
+0.68 0.84 0.8
+0.7 0.84 0.8
+0.34 0.86 0.8
+0.36 0.86 0.8
+0.38 0.86 0.8
+0.4 0.86 0.8
+0.42 0.86 0.8
+0.44 0.86 0.8
+0.46 0.86 0.8
+0.48 0.86 0.8
+0.5 0.86 0.8
+0.52 0.86 0.8
+0.54 0.86 0.8
+0.56 0.86 0.8
+0.58 0.86 0.8
+0.6 0.86 0.8
+0.62 0.86 0.8
+0.64 0.86 0.8
+0.66 0.86 0.8
+0.38 0.88 0.8
+0.4 0.88 0.8
+0.42 0.88 0.8
+0.44 0.88 0.8
+0.46 0.88 0.8
+0.48 0.88 0.8
+0.5 0.88 0.8
+0.52 0.88 0.8
+0.54 0.88 0.8
+0.56 0.88 0.8
+0.58 0.88 0.8
+0.6 0.88 0.8
+0.62 0.88 0.8
+0.46 0.12 0.82
+0.48 0.12 0.82
+0.5 0.12 0.82
+0.52 0.12 0.82
+0.54 0.12 0.82
+0.38 0.14 0.82
+0.4 0.14 0.82
+0.42 0.14 0.82
+0.44 0.14 0.82
+0.46 0.14 0.82
+0.48 0.14 0.82
+0.5 0.14 0.82
+0.52 0.14 0.82
+0.54 0.14 0.82
+0.56 0.14 0.82
+0.58 0.14 0.82
+0.6 0.14 0.82
+0.62 0.14 0.82
+0.34 0.16 0.82
+0.36 0.16 0.82
+0.38 0.16 0.82
+0.4 0.16 0.82
+0.42 0.16 0.82
+0.44 0.16 0.82
+0.46 0.16 0.82
+0.48 0.16 0.82
+0.5 0.16 0.82
+0.52 0.16 0.82
+0.54 0.16 0.82
+0.56 0.16 0.82
+0.58 0.16 0.82
+0.6 0.16 0.82
+0.62 0.16 0.82
+0.64 0.16 0.82
+0.66 0.16 0.82
+0.3 0.18 0.82
+0.32 0.18 0.82
+0.34 0.18 0.82
+0.36 0.18 0.82
+0.38 0.18 0.82
+0.4 0.18 0.82
+0.42 0.18 0.82
+0.44 0.18 0.82
+0.46 0.18 0.82
+0.48 0.18 0.82
+0.5 0.18 0.82
+0.52 0.18 0.82
+0.54 0.18 0.82
+0.56 0.18 0.82
+0.58 0.18 0.82
+0.6 0.18 0.82
+0.62 0.18 0.82
+0.64 0.18 0.82
+0.66 0.18 0.82
+0.68 0.18 0.82
+0.7 0.18 0.82
+0.28 0.2 0.82
+0.3 0.2 0.82
+0.32 0.2 0.82
+0.34 0.2 0.82
+0.36 0.2 0.82
+0.38 0.2 0.82
+0.62 0.2 0.82
+0.64 0.2 0.82
+0.66 0.2 0.82
+0.68 0.2 0.82
+0.7 0.2 0.82
+0.72 0.2 0.82
+0.24 0.22 0.82
+0.26 0.22 0.82
+0.28 0.22 0.82
+0.3 0.22 0.82
+0.32 0.22 0.82
+0.34 0.22 0.82
+0.66 0.22 0.82
+0.68 0.22 0.82
+0.7 0.22 0.82
+0.72 0.22 0.82
+0.74 0.22 0.82
+0.76 0.22 0.82
+0.22 0.24 0.82
+0.24 0.24 0.82
+0.26 0.24 0.82
+0.28 0.24 0.82
+0.3 0.24 0.82
+0.7 0.24 0.82
+0.72 0.24 0.82
+0.74 0.24 0.82
+0.76 0.24 0.82
+0.78 0.24 0.82
+0.22 0.26 0.82
+0.24 0.26 0.82
+0.26 0.26 0.82
+0.28 0.26 0.82
+0.72 0.26 0.82
+0.74 0.26 0.82
+0.76 0.26 0.82
+0.78 0.26 0.82
+0.2 0.28 0.82
+0.22 0.28 0.82
+0.24 0.28 0.82
+0.26 0.28 0.82
+0.74 0.28 0.82
+0.76 0.28 0.82
+0.78 0.28 0.82
+0.8 0.28 0.82
+0.18 0.3 0.82
+0.2 0.3 0.82
+0.22 0.3 0.82
+0.24 0.3 0.82
+0.76 0.3 0.82
+0.78 0.3 0.82
+0.8 0.3 0.82
+0.82 0.3 0.82
+0.18 0.32 0.82
+0.2 0.32 0.82
+0.22 0.32 0.82
+0.78 0.32 0.82
+0.8 0.32 0.82
+0.82 0.32 0.82
+0.16 0.34 0.82
+0.18 0.34 0.82
+0.2 0.34 0.82
+0.22 0.34 0.82
+0.78 0.34 0.82
+0.8 0.34 0.82
+0.82 0.34 0.82
+0.84 0.34 0.82
+0.16 0.36 0.82
+0.18 0.36 0.82
+0.2 0.36 0.82
+0.8 0.36 0.82
+0.82 0.36 0.82
+0.84 0.36 0.82
+0.14 0.38 0.82
+0.16 0.38 0.82
+0.18 0.38 0.82
+0.2 0.38 0.82
+0.8 0.38 0.82
+0.82 0.38 0.82
+0.84 0.38 0.82
+0.86 0.38 0.82
+0.14 0.4 0.82
+0.16 0.4 0.82
+0.18 0.4 0.82
+0.82 0.4 0.82
+0.84 0.4 0.82
+0.86 0.4 0.82
+0.14 0.42 0.82
+0.16 0.42 0.82
+0.18 0.42 0.82
+0.82 0.42 0.82
+0.84 0.42 0.82
+0.86 0.42 0.82
+0.14 0.44 0.82
+0.16 0.44 0.82
+0.18 0.44 0.82
+0.82 0.44 0.82
+0.84 0.44 0.82
+0.86 0.44 0.82
+0.12 0.46 0.82
+0.14 0.46 0.82
+0.16 0.46 0.82
+0.18 0.46 0.82
+0.82 0.46 0.82
+0.84 0.46 0.82
+0.86 0.46 0.82
+0.88 0.46 0.82
+0.12 0.48 0.82
+0.14 0.48 0.82
+0.16 0.48 0.82
+0.18 0.48 0.82
+0.82 0.48 0.82
+0.84 0.48 0.82
+0.86 0.48 0.82
+0.88 0.48 0.82
+0.12 0.5 0.82
+0.14 0.5 0.82
+0.16 0.5 0.82
+0.18 0.5 0.82
+0.82 0.5 0.82
+0.84 0.5 0.82
+0.86 0.5 0.82
+0.88 0.5 0.82
+0.12 0.52 0.82
+0.14 0.52 0.82
+0.16 0.52 0.82
+0.18 0.52 0.82
+0.82 0.52 0.82
+0.84 0.52 0.82
+0.86 0.52 0.82
+0.88 0.52 0.82
+0.12 0.54 0.82
+0.14 0.54 0.82
+0.16 0.54 0.82
+0.18 0.54 0.82
+0.82 0.54 0.82
+0.84 0.54 0.82
+0.86 0.54 0.82
+0.88 0.54 0.82
+0.14 0.56 0.82
+0.16 0.56 0.82
+0.18 0.56 0.82
+0.82 0.56 0.82
+0.84 0.56 0.82
+0.86 0.56 0.82
+0.14 0.58 0.82
+0.16 0.58 0.82
+0.18 0.58 0.82
+0.82 0.58 0.82
+0.84 0.58 0.82
+0.86 0.58 0.82
+0.14 0.6 0.82
+0.16 0.6 0.82
+0.18 0.6 0.82
+0.82 0.6 0.82
+0.84 0.6 0.82
+0.86 0.6 0.82
+0.14 0.62 0.82
+0.16 0.62 0.82
+0.18 0.62 0.82
+0.2 0.62 0.82
+0.8 0.62 0.82
+0.82 0.62 0.82
+0.84 0.62 0.82
+0.86 0.62 0.82
+0.16 0.64 0.82
+0.18 0.64 0.82
+0.2 0.64 0.82
+0.8 0.64 0.82
+0.82 0.64 0.82
+0.84 0.64 0.82
+0.16 0.66 0.82
+0.18 0.66 0.82
+0.2 0.66 0.82
+0.22 0.66 0.82
+0.78 0.66 0.82
+0.8 0.66 0.82
+0.82 0.66 0.82
+0.84 0.66 0.82
+0.18 0.68 0.82
+0.2 0.68 0.82
+0.22 0.68 0.82
+0.78 0.68 0.82
+0.8 0.68 0.82
+0.82 0.68 0.82
+0.18 0.7 0.82
+0.2 0.7 0.82
+0.22 0.7 0.82
+0.24 0.7 0.82
+0.76 0.7 0.82
+0.78 0.7 0.82
+0.8 0.7 0.82
+0.82 0.7 0.82
+0.2 0.72 0.82
+0.22 0.72 0.82
+0.24 0.72 0.82
+0.26 0.72 0.82
+0.74 0.72 0.82
+0.76 0.72 0.82
+0.78 0.72 0.82
+0.8 0.72 0.82
+0.22 0.74 0.82
+0.24 0.74 0.82
+0.26 0.74 0.82
+0.28 0.74 0.82
+0.72 0.74 0.82
+0.74 0.74 0.82
+0.76 0.74 0.82
+0.78 0.74 0.82
+0.22 0.76 0.82
+0.24 0.76 0.82
+0.26 0.76 0.82
+0.28 0.76 0.82
+0.3 0.76 0.82
+0.7 0.76 0.82
+0.72 0.76 0.82
+0.74 0.76 0.82
+0.76 0.76 0.82
+0.78 0.76 0.82
+0.24 0.78 0.82
+0.26 0.78 0.82
+0.28 0.78 0.82
+0.3 0.78 0.82
+0.32 0.78 0.82
+0.34 0.78 0.82
+0.66 0.78 0.82
+0.68 0.78 0.82
+0.7 0.78 0.82
+0.72 0.78 0.82
+0.74 0.78 0.82
+0.76 0.78 0.82
+0.28 0.8 0.82
+0.3 0.8 0.82
+0.32 0.8 0.82
+0.34 0.8 0.82
+0.36 0.8 0.82
+0.38 0.8 0.82
+0.62 0.8 0.82
+0.64 0.8 0.82
+0.66 0.8 0.82
+0.68 0.8 0.82
+0.7 0.8 0.82
+0.72 0.8 0.82
+0.3 0.82 0.82
+0.32 0.82 0.82
+0.34 0.82 0.82
+0.36 0.82 0.82
+0.38 0.82 0.82
+0.4 0.82 0.82
+0.42 0.82 0.82
+0.44 0.82 0.82
+0.46 0.82 0.82
+0.48 0.82 0.82
+0.5 0.82 0.82
+0.52 0.82 0.82
+0.54 0.82 0.82
+0.56 0.82 0.82
+0.58 0.82 0.82
+0.6 0.82 0.82
+0.62 0.82 0.82
+0.64 0.82 0.82
+0.66 0.82 0.82
+0.68 0.82 0.82
+0.7 0.82 0.82
+0.34 0.84 0.82
+0.36 0.84 0.82
+0.38 0.84 0.82
+0.4 0.84 0.82
+0.42 0.84 0.82
+0.44 0.84 0.82
+0.46 0.84 0.82
+0.48 0.84 0.82
+0.5 0.84 0.82
+0.52 0.84 0.82
+0.54 0.84 0.82
+0.56 0.84 0.82
+0.58 0.84 0.82
+0.6 0.84 0.82
+0.62 0.84 0.82
+0.64 0.84 0.82
+0.66 0.84 0.82
+0.38 0.86 0.82
+0.4 0.86 0.82
+0.42 0.86 0.82
+0.44 0.86 0.82
+0.46 0.86 0.82
+0.48 0.86 0.82
+0.5 0.86 0.82
+0.52 0.86 0.82
+0.54 0.86 0.82
+0.56 0.86 0.82
+0.58 0.86 0.82
+0.6 0.86 0.82
+0.62 0.86 0.82
+0.46 0.88 0.82
+0.48 0.88 0.82
+0.5 0.88 0.82
+0.52 0.88 0.82
+0.54 0.88 0.82
+0.44 0.14 0.84
+0.46 0.14 0.84
+0.48 0.14 0.84
+0.5 0.14 0.84
+0.52 0.14 0.84
+0.54 0.14 0.84
+0.56 0.14 0.84
+0.38 0.16 0.84
+0.4 0.16 0.84
+0.42 0.16 0.84
+0.44 0.16 0.84
+0.46 0.16 0.84
+0.48 0.16 0.84
+0.5 0.16 0.84
+0.52 0.16 0.84
+0.54 0.16 0.84
+0.56 0.16 0.84
+0.58 0.16 0.84
+0.6 0.16 0.84
+0.62 0.16 0.84
+0.34 0.18 0.84
+0.36 0.18 0.84
+0.38 0.18 0.84
+0.4 0.18 0.84
+0.42 0.18 0.84
+0.44 0.18 0.84
+0.46 0.18 0.84
+0.48 0.18 0.84
+0.5 0.18 0.84
+0.52 0.18 0.84
+0.54 0.18 0.84
+0.56 0.18 0.84
+0.58 0.18 0.84
+0.6 0.18 0.84
+0.62 0.18 0.84
+0.64 0.18 0.84
+0.66 0.18 0.84
+0.3 0.2 0.84
+0.32 0.2 0.84
+0.34 0.2 0.84
+0.36 0.2 0.84
+0.38 0.2 0.84
+0.4 0.2 0.84
+0.42 0.2 0.84
+0.44 0.2 0.84
+0.46 0.2 0.84
+0.48 0.2 0.84
+0.5 0.2 0.84
+0.52 0.2 0.84
+0.54 0.2 0.84
+0.56 0.2 0.84
+0.58 0.2 0.84
+0.6 0.2 0.84
+0.62 0.2 0.84
+0.64 0.2 0.84
+0.66 0.2 0.84
+0.68 0.2 0.84
+0.7 0.2 0.84
+0.28 0.22 0.84
+0.3 0.22 0.84
+0.32 0.22 0.84
+0.34 0.22 0.84
+0.36 0.22 0.84
+0.38 0.22 0.84
+0.4 0.22 0.84
+0.6 0.22 0.84
+0.62 0.22 0.84
+0.64 0.22 0.84
+0.66 0.22 0.84
+0.68 0.22 0.84
+0.7 0.22 0.84
+0.72 0.22 0.84
+0.26 0.24 0.84
+0.28 0.24 0.84
+0.3 0.24 0.84
+0.32 0.24 0.84
+0.34 0.24 0.84
+0.36 0.24 0.84
+0.64 0.24 0.84
+0.66 0.24 0.84
+0.68 0.24 0.84
+0.7 0.24 0.84
+0.72 0.24 0.84
+0.74 0.24 0.84
+0.24 0.26 0.84
+0.26 0.26 0.84
+0.28 0.26 0.84
+0.3 0.26 0.84
+0.32 0.26 0.84
+0.68 0.26 0.84
+0.7 0.26 0.84
+0.72 0.26 0.84
+0.74 0.26 0.84
+0.76 0.26 0.84
+0.22 0.28 0.84
+0.24 0.28 0.84
+0.26 0.28 0.84
+0.28 0.28 0.84
+0.3 0.28 0.84
+0.7 0.28 0.84
+0.72 0.28 0.84
+0.74 0.28 0.84
+0.76 0.28 0.84
+0.78 0.28 0.84
+0.2 0.3 0.84
+0.22 0.3 0.84
+0.24 0.3 0.84
+0.26 0.3 0.84
+0.28 0.3 0.84
+0.72 0.3 0.84
+0.74 0.3 0.84
+0.76 0.3 0.84
+0.78 0.3 0.84
+0.8 0.3 0.84
+0.2 0.32 0.84
+0.22 0.32 0.84
+0.24 0.32 0.84
+0.26 0.32 0.84
+0.74 0.32 0.84
+0.76 0.32 0.84
+0.78 0.32 0.84
+0.8 0.32 0.84
+0.18 0.34 0.84
+0.2 0.34 0.84
+0.22 0.34 0.84
+0.24 0.34 0.84
+0.76 0.34 0.84
+0.78 0.34 0.84
+0.8 0.34 0.84
+0.82 0.34 0.84
+0.18 0.36 0.84
+0.2 0.36 0.84
+0.22 0.36 0.84
+0.24 0.36 0.84
+0.76 0.36 0.84
+0.78 0.36 0.84
+0.8 0.36 0.84
+0.82 0.36 0.84
+0.16 0.38 0.84
+0.18 0.38 0.84
+0.2 0.38 0.84
+0.22 0.38 0.84
+0.78 0.38 0.84
+0.8 0.38 0.84
+0.82 0.38 0.84
+0.84 0.38 0.84
+0.16 0.4 0.84
+0.18 0.4 0.84
+0.2 0.4 0.84
+0.22 0.4 0.84
+0.78 0.4 0.84
+0.8 0.4 0.84
+0.82 0.4 0.84
+0.84 0.4 0.84
+0.16 0.42 0.84
+0.18 0.42 0.84
+0.2 0.42 0.84
+0.8 0.42 0.84
+0.82 0.42 0.84
+0.84 0.42 0.84
+0.14 0.44 0.84
+0.16 0.44 0.84
+0.18 0.44 0.84
+0.2 0.44 0.84
+0.8 0.44 0.84
+0.82 0.44 0.84
+0.84 0.44 0.84
+0.86 0.44 0.84
+0.14 0.46 0.84
+0.16 0.46 0.84
+0.18 0.46 0.84
+0.2 0.46 0.84
+0.8 0.46 0.84
+0.82 0.46 0.84
+0.84 0.46 0.84
+0.86 0.46 0.84
+0.14 0.48 0.84
+0.16 0.48 0.84
+0.18 0.48 0.84
+0.2 0.48 0.84
+0.8 0.48 0.84
+0.82 0.48 0.84
+0.84 0.48 0.84
+0.86 0.48 0.84
+0.14 0.5 0.84
+0.16 0.5 0.84
+0.18 0.5 0.84
+0.2 0.5 0.84
+0.8 0.5 0.84
+0.82 0.5 0.84
+0.84 0.5 0.84
+0.86 0.5 0.84
+0.14 0.52 0.84
+0.16 0.52 0.84
+0.18 0.52 0.84
+0.2 0.52 0.84
+0.8 0.52 0.84
+0.82 0.52 0.84
+0.84 0.52 0.84
+0.86 0.52 0.84
+0.14 0.54 0.84
+0.16 0.54 0.84
+0.18 0.54 0.84
+0.2 0.54 0.84
+0.8 0.54 0.84
+0.82 0.54 0.84
+0.84 0.54 0.84
+0.86 0.54 0.84
+0.14 0.56 0.84
+0.16 0.56 0.84
+0.18 0.56 0.84
+0.2 0.56 0.84
+0.8 0.56 0.84
+0.82 0.56 0.84
+0.84 0.56 0.84
+0.86 0.56 0.84
+0.16 0.58 0.84
+0.18 0.58 0.84
+0.2 0.58 0.84
+0.8 0.58 0.84
+0.82 0.58 0.84
+0.84 0.58 0.84
+0.16 0.6 0.84
+0.18 0.6 0.84
+0.2 0.6 0.84
+0.22 0.6 0.84
+0.78 0.6 0.84
+0.8 0.6 0.84
+0.82 0.6 0.84
+0.84 0.6 0.84
+0.16 0.62 0.84
+0.18 0.62 0.84
+0.2 0.62 0.84
+0.22 0.62 0.84
+0.78 0.62 0.84
+0.8 0.62 0.84
+0.82 0.62 0.84
+0.84 0.62 0.84
+0.18 0.64 0.84
+0.2 0.64 0.84
+0.22 0.64 0.84
+0.24 0.64 0.84
+0.76 0.64 0.84
+0.78 0.64 0.84
+0.8 0.64 0.84
+0.82 0.64 0.84
+0.18 0.66 0.84
+0.2 0.66 0.84
+0.22 0.66 0.84
+0.24 0.66 0.84
+0.76 0.66 0.84
+0.78 0.66 0.84
+0.8 0.66 0.84
+0.82 0.66 0.84
+0.2 0.68 0.84
+0.22 0.68 0.84
+0.24 0.68 0.84
+0.26 0.68 0.84
+0.74 0.68 0.84
+0.76 0.68 0.84
+0.78 0.68 0.84
+0.8 0.68 0.84
+0.2 0.7 0.84
+0.22 0.7 0.84
+0.24 0.7 0.84
+0.26 0.7 0.84
+0.28 0.7 0.84
+0.72 0.7 0.84
+0.74 0.7 0.84
+0.76 0.7 0.84
+0.78 0.7 0.84
+0.8 0.7 0.84
+0.22 0.72 0.84
+0.24 0.72 0.84
+0.26 0.72 0.84
+0.28 0.72 0.84
+0.3 0.72 0.84
+0.7 0.72 0.84
+0.72 0.72 0.84
+0.74 0.72 0.84
+0.76 0.72 0.84
+0.78 0.72 0.84
+0.24 0.74 0.84
+0.26 0.74 0.84
+0.28 0.74 0.84
+0.3 0.74 0.84
+0.32 0.74 0.84
+0.68 0.74 0.84
+0.7 0.74 0.84
+0.72 0.74 0.84
+0.74 0.74 0.84
+0.76 0.74 0.84
+0.26 0.76 0.84
+0.28 0.76 0.84
+0.3 0.76 0.84
+0.32 0.76 0.84
+0.34 0.76 0.84
+0.36 0.76 0.84
+0.64 0.76 0.84
+0.66 0.76 0.84
+0.68 0.76 0.84
+0.7 0.76 0.84
+0.72 0.76 0.84
+0.74 0.76 0.84
+0.28 0.78 0.84
+0.3 0.78 0.84
+0.32 0.78 0.84
+0.34 0.78 0.84
+0.36 0.78 0.84
+0.38 0.78 0.84
+0.4 0.78 0.84
+0.6 0.78 0.84
+0.62 0.78 0.84
+0.64 0.78 0.84
+0.66 0.78 0.84
+0.68 0.78 0.84
+0.7 0.78 0.84
+0.72 0.78 0.84
+0.3 0.8 0.84
+0.32 0.8 0.84
+0.34 0.8 0.84
+0.36 0.8 0.84
+0.38 0.8 0.84
+0.4 0.8 0.84
+0.42 0.8 0.84
+0.44 0.8 0.84
+0.46 0.8 0.84
+0.48 0.8 0.84
+0.5 0.8 0.84
+0.52 0.8 0.84
+0.54 0.8 0.84
+0.56 0.8 0.84
+0.58 0.8 0.84
+0.6 0.8 0.84
+0.62 0.8 0.84
+0.64 0.8 0.84
+0.66 0.8 0.84
+0.68 0.8 0.84
+0.7 0.8 0.84
+0.34 0.82 0.84
+0.36 0.82 0.84
+0.38 0.82 0.84
+0.4 0.82 0.84
+0.42 0.82 0.84
+0.44 0.82 0.84
+0.46 0.82 0.84
+0.48 0.82 0.84
+0.5 0.82 0.84
+0.52 0.82 0.84
+0.54 0.82 0.84
+0.56 0.82 0.84
+0.58 0.82 0.84
+0.6 0.82 0.84
+0.62 0.82 0.84
+0.64 0.82 0.84
+0.66 0.82 0.84
+0.38 0.84 0.84
+0.4 0.84 0.84
+0.42 0.84 0.84
+0.44 0.84 0.84
+0.46 0.84 0.84
+0.48 0.84 0.84
+0.5 0.84 0.84
+0.52 0.84 0.84
+0.54 0.84 0.84
+0.56 0.84 0.84
+0.58 0.84 0.84
+0.6 0.84 0.84
+0.62 0.84 0.84
+0.44 0.86 0.84
+0.46 0.86 0.84
+0.48 0.86 0.84
+0.5 0.86 0.84
+0.52 0.86 0.84
+0.54 0.86 0.84
+0.56 0.86 0.84
+0.44 0.16 0.86
+0.46 0.16 0.86
+0.48 0.16 0.86
+0.5 0.16 0.86
+0.52 0.16 0.86
+0.54 0.16 0.86
+0.56 0.16 0.86
+0.38 0.18 0.86
+0.4 0.18 0.86
+0.42 0.18 0.86
+0.44 0.18 0.86
+0.46 0.18 0.86
+0.48 0.18 0.86
+0.5 0.18 0.86
+0.52 0.18 0.86
+0.54 0.18 0.86
+0.56 0.18 0.86
+0.58 0.18 0.86
+0.6 0.18 0.86
+0.62 0.18 0.86
+0.34 0.2 0.86
+0.36 0.2 0.86
+0.38 0.2 0.86
+0.4 0.2 0.86
+0.42 0.2 0.86
+0.44 0.2 0.86
+0.46 0.2 0.86
+0.48 0.2 0.86
+0.5 0.2 0.86
+0.52 0.2 0.86
+0.54 0.2 0.86
+0.56 0.2 0.86
+0.58 0.2 0.86
+0.6 0.2 0.86
+0.62 0.2 0.86
+0.64 0.2 0.86
+0.66 0.2 0.86
+0.3 0.22 0.86
+0.32 0.22 0.86
+0.34 0.22 0.86
+0.36 0.22 0.86
+0.38 0.22 0.86
+0.4 0.22 0.86
+0.42 0.22 0.86
+0.44 0.22 0.86
+0.46 0.22 0.86
+0.48 0.22 0.86
+0.5 0.22 0.86
+0.52 0.22 0.86
+0.54 0.22 0.86
+0.56 0.22 0.86
+0.58 0.22 0.86
+0.6 0.22 0.86
+0.62 0.22 0.86
+0.64 0.22 0.86
+0.66 0.22 0.86
+0.68 0.22 0.86
+0.7 0.22 0.86
+0.28 0.24 0.86
+0.3 0.24 0.86
+0.32 0.24 0.86
+0.34 0.24 0.86
+0.36 0.24 0.86
+0.38 0.24 0.86
+0.4 0.24 0.86
+0.42 0.24 0.86
+0.58 0.24 0.86
+0.6 0.24 0.86
+0.62 0.24 0.86
+0.64 0.24 0.86
+0.66 0.24 0.86
+0.68 0.24 0.86
+0.7 0.24 0.86
+0.72 0.24 0.86
+0.26 0.26 0.86
+0.28 0.26 0.86
+0.3 0.26 0.86
+0.32 0.26 0.86
+0.34 0.26 0.86
+0.36 0.26 0.86
+0.64 0.26 0.86
+0.66 0.26 0.86
+0.68 0.26 0.86
+0.7 0.26 0.86
+0.72 0.26 0.86
+0.74 0.26 0.86
+0.24 0.28 0.86
+0.26 0.28 0.86
+0.28 0.28 0.86
+0.3 0.28 0.86
+0.32 0.28 0.86
+0.34 0.28 0.86
+0.66 0.28 0.86
+0.68 0.28 0.86
+0.7 0.28 0.86
+0.72 0.28 0.86
+0.74 0.28 0.86
+0.76 0.28 0.86
+0.22 0.3 0.86
+0.24 0.3 0.86
+0.26 0.3 0.86
+0.28 0.3 0.86
+0.3 0.3 0.86
+0.7 0.3 0.86
+0.72 0.3 0.86
+0.74 0.3 0.86
+0.76 0.3 0.86
+0.78 0.3 0.86
+0.22 0.32 0.86
+0.24 0.32 0.86
+0.26 0.32 0.86
+0.28 0.32 0.86
+0.72 0.32 0.86
+0.74 0.32 0.86
+0.76 0.32 0.86
+0.78 0.32 0.86
+0.2 0.34 0.86
+0.22 0.34 0.86
+0.24 0.34 0.86
+0.26 0.34 0.86
+0.28 0.34 0.86
+0.72 0.34 0.86
+0.74 0.34 0.86
+0.76 0.34 0.86
+0.78 0.34 0.86
+0.8 0.34 0.86
+0.2 0.36 0.86
+0.22 0.36 0.86
+0.24 0.36 0.86
+0.26 0.36 0.86
+0.74 0.36 0.86
+0.76 0.36 0.86
+0.78 0.36 0.86
+0.8 0.36 0.86
+0.18 0.38 0.86
+0.2 0.38 0.86
+0.22 0.38 0.86
+0.24 0.38 0.86
+0.76 0.38 0.86
+0.78 0.38 0.86
+0.8 0.38 0.86
+0.82 0.38 0.86
+0.18 0.4 0.86
+0.2 0.4 0.86
+0.22 0.4 0.86
+0.24 0.4 0.86
+0.76 0.4 0.86
+0.78 0.4 0.86
+0.8 0.4 0.86
+0.82 0.4 0.86
+0.18 0.42 0.86
+0.2 0.42 0.86
+0.22 0.42 0.86
+0.24 0.42 0.86
+0.76 0.42 0.86
+0.78 0.42 0.86
+0.8 0.42 0.86
+0.82 0.42 0.86
+0.16 0.44 0.86
+0.18 0.44 0.86
+0.2 0.44 0.86
+0.22 0.44 0.86
+0.78 0.44 0.86
+0.8 0.44 0.86
+0.82 0.44 0.86
+0.84 0.44 0.86
+0.16 0.46 0.86
+0.18 0.46 0.86
+0.2 0.46 0.86
+0.22 0.46 0.86
+0.78 0.46 0.86
+0.8 0.46 0.86
+0.82 0.46 0.86
+0.84 0.46 0.86
+0.16 0.48 0.86
+0.18 0.48 0.86
+0.2 0.48 0.86
+0.22 0.48 0.86
+0.78 0.48 0.86
+0.8 0.48 0.86
+0.82 0.48 0.86
+0.84 0.48 0.86
+0.16 0.5 0.86
+0.18 0.5 0.86
+0.2 0.5 0.86
+0.22 0.5 0.86
+0.78 0.5 0.86
+0.8 0.5 0.86
+0.82 0.5 0.86
+0.84 0.5 0.86
+0.16 0.52 0.86
+0.18 0.52 0.86
+0.2 0.52 0.86
+0.22 0.52 0.86
+0.78 0.52 0.86
+0.8 0.52 0.86
+0.82 0.52 0.86
+0.84 0.52 0.86
+0.16 0.54 0.86
+0.18 0.54 0.86
+0.2 0.54 0.86
+0.22 0.54 0.86
+0.78 0.54 0.86
+0.8 0.54 0.86
+0.82 0.54 0.86
+0.84 0.54 0.86
+0.16 0.56 0.86
+0.18 0.56 0.86
+0.2 0.56 0.86
+0.22 0.56 0.86
+0.78 0.56 0.86
+0.8 0.56 0.86
+0.82 0.56 0.86
+0.84 0.56 0.86
+0.18 0.58 0.86
+0.2 0.58 0.86
+0.22 0.58 0.86
+0.24 0.58 0.86
+0.76 0.58 0.86
+0.78 0.58 0.86
+0.8 0.58 0.86
+0.82 0.58 0.86
+0.18 0.6 0.86
+0.2 0.6 0.86
+0.22 0.6 0.86
+0.24 0.6 0.86
+0.76 0.6 0.86
+0.78 0.6 0.86
+0.8 0.6 0.86
+0.82 0.6 0.86
+0.18 0.62 0.86
+0.2 0.62 0.86
+0.22 0.62 0.86
+0.24 0.62 0.86
+0.76 0.62 0.86
+0.78 0.62 0.86
+0.8 0.62 0.86
+0.82 0.62 0.86
+0.2 0.64 0.86
+0.22 0.64 0.86
+0.24 0.64 0.86
+0.26 0.64 0.86
+0.74 0.64 0.86
+0.76 0.64 0.86
+0.78 0.64 0.86
+0.8 0.64 0.86
+0.2 0.66 0.86
+0.22 0.66 0.86
+0.24 0.66 0.86
+0.26 0.66 0.86
+0.28 0.66 0.86
+0.72 0.66 0.86
+0.74 0.66 0.86
+0.76 0.66 0.86
+0.78 0.66 0.86
+0.8 0.66 0.86
+0.22 0.68 0.86
+0.24 0.68 0.86
+0.26 0.68 0.86
+0.28 0.68 0.86
+0.72 0.68 0.86
+0.74 0.68 0.86
+0.76 0.68 0.86
+0.78 0.68 0.86
+0.22 0.7 0.86
+0.24 0.7 0.86
+0.26 0.7 0.86
+0.28 0.7 0.86
+0.3 0.7 0.86
+0.7 0.7 0.86
+0.72 0.7 0.86
+0.74 0.7 0.86
+0.76 0.7 0.86
+0.78 0.7 0.86
+0.24 0.72 0.86
+0.26 0.72 0.86
+0.28 0.72 0.86
+0.3 0.72 0.86
+0.32 0.72 0.86
+0.34 0.72 0.86
+0.66 0.72 0.86
+0.68 0.72 0.86
+0.7 0.72 0.86
+0.72 0.72 0.86
+0.74 0.72 0.86
+0.76 0.72 0.86
+0.26 0.74 0.86
+0.28 0.74 0.86
+0.3 0.74 0.86
+0.32 0.74 0.86
+0.34 0.74 0.86
+0.36 0.74 0.86
+0.64 0.74 0.86
+0.66 0.74 0.86
+0.68 0.74 0.86
+0.7 0.74 0.86
+0.72 0.74 0.86
+0.74 0.74 0.86
+0.28 0.76 0.86
+0.3 0.76 0.86
+0.32 0.76 0.86
+0.34 0.76 0.86
+0.36 0.76 0.86
+0.38 0.76 0.86
+0.4 0.76 0.86
+0.42 0.76 0.86
+0.58 0.76 0.86
+0.6 0.76 0.86
+0.62 0.76 0.86
+0.64 0.76 0.86
+0.66 0.76 0.86
+0.68 0.76 0.86
+0.7 0.76 0.86
+0.72 0.76 0.86
+0.3 0.78 0.86
+0.32 0.78 0.86
+0.34 0.78 0.86
+0.36 0.78 0.86
+0.38 0.78 0.86
+0.4 0.78 0.86
+0.42 0.78 0.86
+0.44 0.78 0.86
+0.46 0.78 0.86
+0.48 0.78 0.86
+0.5 0.78 0.86
+0.52 0.78 0.86
+0.54 0.78 0.86
+0.56 0.78 0.86
+0.58 0.78 0.86
+0.6 0.78 0.86
+0.62 0.78 0.86
+0.64 0.78 0.86
+0.66 0.78 0.86
+0.68 0.78 0.86
+0.7 0.78 0.86
+0.34 0.8 0.86
+0.36 0.8 0.86
+0.38 0.8 0.86
+0.4 0.8 0.86
+0.42 0.8 0.86
+0.44 0.8 0.86
+0.46 0.8 0.86
+0.48 0.8 0.86
+0.5 0.8 0.86
+0.52 0.8 0.86
+0.54 0.8 0.86
+0.56 0.8 0.86
+0.58 0.8 0.86
+0.6 0.8 0.86
+0.62 0.8 0.86
+0.64 0.8 0.86
+0.66 0.8 0.86
+0.38 0.82 0.86
+0.4 0.82 0.86
+0.42 0.82 0.86
+0.44 0.82 0.86
+0.46 0.82 0.86
+0.48 0.82 0.86
+0.5 0.82 0.86
+0.52 0.82 0.86
+0.54 0.82 0.86
+0.56 0.82 0.86
+0.58 0.82 0.86
+0.6 0.82 0.86
+0.62 0.82 0.86
+0.44 0.84 0.86
+0.46 0.84 0.86
+0.48 0.84 0.86
+0.5 0.84 0.86
+0.52 0.84 0.86
+0.54 0.84 0.86
+0.56 0.84 0.86
+0.46 0.18 0.88
+0.48 0.18 0.88
+0.5 0.18 0.88
+0.52 0.18 0.88
+0.54 0.18 0.88
+0.38 0.2 0.88
+0.4 0.2 0.88
+0.42 0.2 0.88
+0.44 0.2 0.88
+0.46 0.2 0.88
+0.48 0.2 0.88
+0.5 0.2 0.88
+0.52 0.2 0.88
+0.54 0.2 0.88
+0.56 0.2 0.88
+0.58 0.2 0.88
+0.6 0.2 0.88
+0.62 0.2 0.88
+0.34 0.22 0.88
+0.36 0.22 0.88
+0.38 0.22 0.88
+0.4 0.22 0.88
+0.42 0.22 0.88
+0.44 0.22 0.88
+0.46 0.22 0.88
+0.48 0.22 0.88
+0.5 0.22 0.88
+0.52 0.22 0.88
+0.54 0.22 0.88
+0.56 0.22 0.88
+0.58 0.22 0.88
+0.6 0.22 0.88
+0.62 0.22 0.88
+0.64 0.22 0.88
+0.66 0.22 0.88
+0.32 0.24 0.88
+0.34 0.24 0.88
+0.36 0.24 0.88
+0.38 0.24 0.88
+0.4 0.24 0.88
+0.42 0.24 0.88
+0.44 0.24 0.88
+0.46 0.24 0.88
+0.48 0.24 0.88
+0.5 0.24 0.88
+0.52 0.24 0.88
+0.54 0.24 0.88
+0.56 0.24 0.88
+0.58 0.24 0.88
+0.6 0.24 0.88
+0.62 0.24 0.88
+0.64 0.24 0.88
+0.66 0.24 0.88
+0.68 0.24 0.88
+0.3 0.26 0.88
+0.32 0.26 0.88
+0.34 0.26 0.88
+0.36 0.26 0.88
+0.38 0.26 0.88
+0.4 0.26 0.88
+0.42 0.26 0.88
+0.44 0.26 0.88
+0.46 0.26 0.88
+0.54 0.26 0.88
+0.56 0.26 0.88
+0.58 0.26 0.88
+0.6 0.26 0.88
+0.62 0.26 0.88
+0.64 0.26 0.88
+0.66 0.26 0.88
+0.68 0.26 0.88
+0.7 0.26 0.88
+0.28 0.28 0.88
+0.3 0.28 0.88
+0.32 0.28 0.88
+0.34 0.28 0.88
+0.36 0.28 0.88
+0.38 0.28 0.88
+0.4 0.28 0.88
+0.6 0.28 0.88
+0.62 0.28 0.88
+0.64 0.28 0.88
+0.66 0.28 0.88
+0.68 0.28 0.88
+0.7 0.28 0.88
+0.72 0.28 0.88
+0.26 0.3 0.88
+0.28 0.3 0.88
+0.3 0.3 0.88
+0.32 0.3 0.88
+0.34 0.3 0.88
+0.36 0.3 0.88
+0.64 0.3 0.88
+0.66 0.3 0.88
+0.68 0.3 0.88
+0.7 0.3 0.88
+0.72 0.3 0.88
+0.74 0.3 0.88
+0.24 0.32 0.88
+0.26 0.32 0.88
+0.28 0.32 0.88
+0.3 0.32 0.88
+0.32 0.32 0.88
+0.68 0.32 0.88
+0.7 0.32 0.88
+0.72 0.32 0.88
+0.74 0.32 0.88
+0.76 0.32 0.88
+0.22 0.34 0.88
+0.24 0.34 0.88
+0.26 0.34 0.88
+0.28 0.34 0.88
+0.3 0.34 0.88
+0.7 0.34 0.88
+0.72 0.34 0.88
+0.74 0.34 0.88
+0.76 0.34 0.88
+0.78 0.34 0.88
+0.22 0.36 0.88
+0.24 0.36 0.88
+0.26 0.36 0.88
+0.28 0.36 0.88
+0.3 0.36 0.88
+0.7 0.36 0.88
+0.72 0.36 0.88
+0.74 0.36 0.88
+0.76 0.36 0.88
+0.78 0.36 0.88
+0.2 0.38 0.88
+0.22 0.38 0.88
+0.24 0.38 0.88
+0.26 0.38 0.88
+0.28 0.38 0.88
+0.72 0.38 0.88
+0.74 0.38 0.88
+0.76 0.38 0.88
+0.78 0.38 0.88
+0.8 0.38 0.88
+0.2 0.4 0.88
+0.22 0.4 0.88
+0.24 0.4 0.88
+0.26 0.4 0.88
+0.28 0.4 0.88
+0.72 0.4 0.88
+0.74 0.4 0.88
+0.76 0.4 0.88
+0.78 0.4 0.88
+0.8 0.4 0.88
+0.2 0.42 0.88
+0.22 0.42 0.88
+0.24 0.42 0.88
+0.26 0.42 0.88
+0.74 0.42 0.88
+0.76 0.42 0.88
+0.78 0.42 0.88
+0.8 0.42 0.88
+0.2 0.44 0.88
+0.22 0.44 0.88
+0.24 0.44 0.88
+0.26 0.44 0.88
+0.74 0.44 0.88
+0.76 0.44 0.88
+0.78 0.44 0.88
+0.8 0.44 0.88
+0.18 0.46 0.88
+0.2 0.46 0.88
+0.22 0.46 0.88
+0.24 0.46 0.88
+0.26 0.46 0.88
+0.74 0.46 0.88
+0.76 0.46 0.88
+0.78 0.46 0.88
+0.8 0.46 0.88
+0.82 0.46 0.88
+0.18 0.48 0.88
+0.2 0.48 0.88
+0.22 0.48 0.88
+0.24 0.48 0.88
+0.76 0.48 0.88
+0.78 0.48 0.88
+0.8 0.48 0.88
+0.82 0.48 0.88
+0.18 0.5 0.88
+0.2 0.5 0.88
+0.22 0.5 0.88
+0.24 0.5 0.88
+0.76 0.5 0.88
+0.78 0.5 0.88
+0.8 0.5 0.88
+0.82 0.5 0.88
+0.18 0.52 0.88
+0.2 0.52 0.88
+0.22 0.52 0.88
+0.24 0.52 0.88
+0.76 0.52 0.88
+0.78 0.52 0.88
+0.8 0.52 0.88
+0.82 0.52 0.88
+0.18 0.54 0.88
+0.2 0.54 0.88
+0.22 0.54 0.88
+0.24 0.54 0.88
+0.26 0.54 0.88
+0.74 0.54 0.88
+0.76 0.54 0.88
+0.78 0.54 0.88
+0.8 0.54 0.88
+0.82 0.54 0.88
+0.2 0.56 0.88
+0.22 0.56 0.88
+0.24 0.56 0.88
+0.26 0.56 0.88
+0.74 0.56 0.88
+0.76 0.56 0.88
+0.78 0.56 0.88
+0.8 0.56 0.88
+0.2 0.58 0.88
+0.22 0.58 0.88
+0.24 0.58 0.88
+0.26 0.58 0.88
+0.74 0.58 0.88
+0.76 0.58 0.88
+0.78 0.58 0.88
+0.8 0.58 0.88
+0.2 0.6 0.88
+0.22 0.6 0.88
+0.24 0.6 0.88
+0.26 0.6 0.88
+0.28 0.6 0.88
+0.72 0.6 0.88
+0.74 0.6 0.88
+0.76 0.6 0.88
+0.78 0.6 0.88
+0.8 0.6 0.88
+0.2 0.62 0.88
+0.22 0.62 0.88
+0.24 0.62 0.88
+0.26 0.62 0.88
+0.28 0.62 0.88
+0.72 0.62 0.88
+0.74 0.62 0.88
+0.76 0.62 0.88
+0.78 0.62 0.88
+0.8 0.62 0.88
+0.22 0.64 0.88
+0.24 0.64 0.88
+0.26 0.64 0.88
+0.28 0.64 0.88
+0.3 0.64 0.88
+0.7 0.64 0.88
+0.72 0.64 0.88
+0.74 0.64 0.88
+0.76 0.64 0.88
+0.78 0.64 0.88
+0.22 0.66 0.88
+0.24 0.66 0.88
+0.26 0.66 0.88
+0.28 0.66 0.88
+0.3 0.66 0.88
+0.7 0.66 0.88
+0.72 0.66 0.88
+0.74 0.66 0.88
+0.76 0.66 0.88
+0.78 0.66 0.88
+0.24 0.68 0.88
+0.26 0.68 0.88
+0.28 0.68 0.88
+0.3 0.68 0.88
+0.32 0.68 0.88
+0.68 0.68 0.88
+0.7 0.68 0.88
+0.72 0.68 0.88
+0.74 0.68 0.88
+0.76 0.68 0.88
+0.26 0.7 0.88
+0.28 0.7 0.88
+0.3 0.7 0.88
+0.32 0.7 0.88
+0.34 0.7 0.88
+0.36 0.7 0.88
+0.64 0.7 0.88
+0.66 0.7 0.88
+0.68 0.7 0.88
+0.7 0.7 0.88
+0.72 0.7 0.88
+0.74 0.7 0.88
+0.28 0.72 0.88
+0.3 0.72 0.88
+0.32 0.72 0.88
+0.34 0.72 0.88
+0.36 0.72 0.88
+0.38 0.72 0.88
+0.4 0.72 0.88
+0.6 0.72 0.88
+0.62 0.72 0.88
+0.64 0.72 0.88
+0.66 0.72 0.88
+0.68 0.72 0.88
+0.7 0.72 0.88
+0.72 0.72 0.88
+0.3 0.74 0.88
+0.32 0.74 0.88
+0.34 0.74 0.88
+0.36 0.74 0.88
+0.38 0.74 0.88
+0.4 0.74 0.88
+0.42 0.74 0.88
+0.44 0.74 0.88
+0.46 0.74 0.88
+0.54 0.74 0.88
+0.56 0.74 0.88
+0.58 0.74 0.88
+0.6 0.74 0.88
+0.62 0.74 0.88
+0.64 0.74 0.88
+0.66 0.74 0.88
+0.68 0.74 0.88
+0.7 0.74 0.88
+0.32 0.76 0.88
+0.34 0.76 0.88
+0.36 0.76 0.88
+0.38 0.76 0.88
+0.4 0.76 0.88
+0.42 0.76 0.88
+0.44 0.76 0.88
+0.46 0.76 0.88
+0.48 0.76 0.88
+0.5 0.76 0.88
+0.52 0.76 0.88
+0.54 0.76 0.88
+0.56 0.76 0.88
+0.58 0.76 0.88
+0.6 0.76 0.88
+0.62 0.76 0.88
+0.64 0.76 0.88
+0.66 0.76 0.88
+0.68 0.76 0.88
+0.34 0.78 0.88
+0.36 0.78 0.88
+0.38 0.78 0.88
+0.4 0.78 0.88
+0.42 0.78 0.88
+0.44 0.78 0.88
+0.46 0.78 0.88
+0.48 0.78 0.88
+0.5 0.78 0.88
+0.52 0.78 0.88
+0.54 0.78 0.88
+0.56 0.78 0.88
+0.58 0.78 0.88
+0.6 0.78 0.88
+0.62 0.78 0.88
+0.64 0.78 0.88
+0.66 0.78 0.88
+0.38 0.8 0.88
+0.4 0.8 0.88
+0.42 0.8 0.88
+0.44 0.8 0.88
+0.46 0.8 0.88
+0.48 0.8 0.88
+0.5 0.8 0.88
+0.52 0.8 0.88
+0.54 0.8 0.88
+0.56 0.8 0.88
+0.58 0.8 0.88
+0.6 0.8 0.88
+0.62 0.8 0.88
+0.46 0.82 0.88
+0.48 0.82 0.88
+0.5 0.82 0.88
+0.52 0.82 0.88
+0.54 0.82 0.88
+0.4 0.22 0.9
+0.42 0.22 0.9
+0.44 0.22 0.9
+0.46 0.22 0.9
+0.48 0.22 0.9
+0.5 0.22 0.9
+0.52 0.22 0.9
+0.54 0.22 0.9
+0.56 0.22 0.9
+0.58 0.22 0.9
+0.6 0.22 0.9
+0.36 0.24 0.9
+0.38 0.24 0.9
+0.4 0.24 0.9
+0.42 0.24 0.9
+0.44 0.24 0.9
+0.46 0.24 0.9
+0.48 0.24 0.9
+0.5 0.24 0.9
+0.52 0.24 0.9
+0.54 0.24 0.9
+0.56 0.24 0.9
+0.58 0.24 0.9
+0.6 0.24 0.9
+0.62 0.24 0.9
+0.64 0.24 0.9
+0.34 0.26 0.9
+0.36 0.26 0.9
+0.38 0.26 0.9
+0.4 0.26 0.9
+0.42 0.26 0.9
+0.44 0.26 0.9
+0.46 0.26 0.9
+0.48 0.26 0.9
+0.5 0.26 0.9
+0.52 0.26 0.9
+0.54 0.26 0.9
+0.56 0.26 0.9
+0.58 0.26 0.9
+0.6 0.26 0.9
+0.62 0.26 0.9
+0.64 0.26 0.9
+0.66 0.26 0.9
+0.3 0.28 0.9
+0.32 0.28 0.9
+0.34 0.28 0.9
+0.36 0.28 0.9
+0.38 0.28 0.9
+0.4 0.28 0.9
+0.42 0.28 0.9
+0.44 0.28 0.9
+0.46 0.28 0.9
+0.48 0.28 0.9
+0.5 0.28 0.9
+0.52 0.28 0.9
+0.54 0.28 0.9
+0.56 0.28 0.9
+0.58 0.28 0.9
+0.6 0.28 0.9
+0.62 0.28 0.9
+0.64 0.28 0.9
+0.66 0.28 0.9
+0.68 0.28 0.9
+0.7 0.28 0.9
+0.28 0.3 0.9
+0.3 0.3 0.9
+0.32 0.3 0.9
+0.34 0.3 0.9
+0.36 0.3 0.9
+0.38 0.3 0.9
+0.4 0.3 0.9
+0.42 0.3 0.9
+0.44 0.3 0.9
+0.56 0.3 0.9
+0.58 0.3 0.9
+0.6 0.3 0.9
+0.62 0.3 0.9
+0.64 0.3 0.9
+0.66 0.3 0.9
+0.68 0.3 0.9
+0.7 0.3 0.9
+0.72 0.3 0.9
+0.28 0.32 0.9
+0.3 0.32 0.9
+0.32 0.32 0.9
+0.34 0.32 0.9
+0.36 0.32 0.9
+0.38 0.32 0.9
+0.62 0.32 0.9
+0.64 0.32 0.9
+0.66 0.32 0.9
+0.68 0.32 0.9
+0.7 0.32 0.9
+0.72 0.32 0.9
+0.26 0.34 0.9
+0.28 0.34 0.9
+0.3 0.34 0.9
+0.32 0.34 0.9
+0.34 0.34 0.9
+0.36 0.34 0.9
+0.64 0.34 0.9
+0.66 0.34 0.9
+0.68 0.34 0.9
+0.7 0.34 0.9
+0.72 0.34 0.9
+0.74 0.34 0.9
+0.24 0.36 0.9
+0.26 0.36 0.9
+0.28 0.36 0.9
+0.3 0.36 0.9
+0.32 0.36 0.9
+0.34 0.36 0.9
+0.66 0.36 0.9
+0.68 0.36 0.9
+0.7 0.36 0.9
+0.72 0.36 0.9
+0.74 0.36 0.9
+0.76 0.36 0.9
+0.24 0.38 0.9
+0.26 0.38 0.9
+0.28 0.38 0.9
+0.3 0.38 0.9
+0.32 0.38 0.9
+0.68 0.38 0.9
+0.7 0.38 0.9
+0.72 0.38 0.9
+0.74 0.38 0.9
+0.76 0.38 0.9
+0.22 0.4 0.9
+0.24 0.4 0.9
+0.26 0.4 0.9
+0.28 0.4 0.9
+0.3 0.4 0.9
+0.7 0.4 0.9
+0.72 0.4 0.9
+0.74 0.4 0.9
+0.76 0.4 0.9
+0.78 0.4 0.9
+0.22 0.42 0.9
+0.24 0.42 0.9
+0.26 0.42 0.9
+0.28 0.42 0.9
+0.3 0.42 0.9
+0.7 0.42 0.9
+0.72 0.42 0.9
+0.74 0.42 0.9
+0.76 0.42 0.9
+0.78 0.42 0.9
+0.22 0.44 0.9
+0.24 0.44 0.9
+0.26 0.44 0.9
+0.28 0.44 0.9
+0.3 0.44 0.9
+0.7 0.44 0.9
+0.72 0.44 0.9
+0.74 0.44 0.9
+0.76 0.44 0.9
+0.78 0.44 0.9
+0.22 0.46 0.9
+0.24 0.46 0.9
+0.26 0.46 0.9
+0.28 0.46 0.9
+0.72 0.46 0.9
+0.74 0.46 0.9
+0.76 0.46 0.9
+0.78 0.46 0.9
+0.22 0.48 0.9
+0.24 0.48 0.9
+0.26 0.48 0.9
+0.28 0.48 0.9
+0.72 0.48 0.9
+0.74 0.48 0.9
+0.76 0.48 0.9
+0.78 0.48 0.9
+0.22 0.5 0.9
+0.24 0.5 0.9
+0.26 0.5 0.9
+0.28 0.5 0.9
+0.72 0.5 0.9
+0.74 0.5 0.9
+0.76 0.5 0.9
+0.78 0.5 0.9
+0.22 0.52 0.9
+0.24 0.52 0.9
+0.26 0.52 0.9
+0.28 0.52 0.9
+0.72 0.52 0.9
+0.74 0.52 0.9
+0.76 0.52 0.9
+0.78 0.52 0.9
+0.22 0.54 0.9
+0.24 0.54 0.9
+0.26 0.54 0.9
+0.28 0.54 0.9
+0.72 0.54 0.9
+0.74 0.54 0.9
+0.76 0.54 0.9
+0.78 0.54 0.9
+0.22 0.56 0.9
+0.24 0.56 0.9
+0.26 0.56 0.9
+0.28 0.56 0.9
+0.3 0.56 0.9
+0.7 0.56 0.9
+0.72 0.56 0.9
+0.74 0.56 0.9
+0.76 0.56 0.9
+0.78 0.56 0.9
+0.22 0.58 0.9
+0.24 0.58 0.9
+0.26 0.58 0.9
+0.28 0.58 0.9
+0.3 0.58 0.9
+0.7 0.58 0.9
+0.72 0.58 0.9
+0.74 0.58 0.9
+0.76 0.58 0.9
+0.78 0.58 0.9
+0.22 0.6 0.9
+0.24 0.6 0.9
+0.26 0.6 0.9
+0.28 0.6 0.9
+0.3 0.6 0.9
+0.7 0.6 0.9
+0.72 0.6 0.9
+0.74 0.6 0.9
+0.76 0.6 0.9
+0.78 0.6 0.9
+0.24 0.62 0.9
+0.26 0.62 0.9
+0.28 0.62 0.9
+0.3 0.62 0.9
+0.32 0.62 0.9
+0.68 0.62 0.9
+0.7 0.62 0.9
+0.72 0.62 0.9
+0.74 0.62 0.9
+0.76 0.62 0.9
+0.24 0.64 0.9
+0.26 0.64 0.9
+0.28 0.64 0.9
+0.3 0.64 0.9
+0.32 0.64 0.9
+0.34 0.64 0.9
+0.66 0.64 0.9
+0.68 0.64 0.9
+0.7 0.64 0.9
+0.72 0.64 0.9
+0.74 0.64 0.9
+0.76 0.64 0.9
+0.26 0.66 0.9
+0.28 0.66 0.9
+0.3 0.66 0.9
+0.32 0.66 0.9
+0.34 0.66 0.9
+0.36 0.66 0.9
+0.64 0.66 0.9
+0.66 0.66 0.9
+0.68 0.66 0.9
+0.7 0.66 0.9
+0.72 0.66 0.9
+0.74 0.66 0.9
+0.28 0.68 0.9
+0.3 0.68 0.9
+0.32 0.68 0.9
+0.34 0.68 0.9
+0.36 0.68 0.9
+0.38 0.68 0.9
+0.62 0.68 0.9
+0.64 0.68 0.9
+0.66 0.68 0.9
+0.68 0.68 0.9
+0.7 0.68 0.9
+0.72 0.68 0.9
+0.28 0.7 0.9
+0.3 0.7 0.9
+0.32 0.7 0.9
+0.34 0.7 0.9
+0.36 0.7 0.9
+0.38 0.7 0.9
+0.4 0.7 0.9
+0.42 0.7 0.9
+0.44 0.7 0.9
+0.56 0.7 0.9
+0.58 0.7 0.9
+0.6 0.7 0.9
+0.62 0.7 0.9
+0.64 0.7 0.9
+0.66 0.7 0.9
+0.68 0.7 0.9
+0.7 0.7 0.9
+0.72 0.7 0.9
+0.3 0.72 0.9
+0.32 0.72 0.9
+0.34 0.72 0.9
+0.36 0.72 0.9
+0.38 0.72 0.9
+0.4 0.72 0.9
+0.42 0.72 0.9
+0.44 0.72 0.9
+0.46 0.72 0.9
+0.48 0.72 0.9
+0.5 0.72 0.9
+0.52 0.72 0.9
+0.54 0.72 0.9
+0.56 0.72 0.9
+0.58 0.72 0.9
+0.6 0.72 0.9
+0.62 0.72 0.9
+0.64 0.72 0.9
+0.66 0.72 0.9
+0.68 0.72 0.9
+0.7 0.72 0.9
+0.34 0.74 0.9
+0.36 0.74 0.9
+0.38 0.74 0.9
+0.4 0.74 0.9
+0.42 0.74 0.9
+0.44 0.74 0.9
+0.46 0.74 0.9
+0.48 0.74 0.9
+0.5 0.74 0.9
+0.52 0.74 0.9
+0.54 0.74 0.9
+0.56 0.74 0.9
+0.58 0.74 0.9
+0.6 0.74 0.9
+0.62 0.74 0.9
+0.64 0.74 0.9
+0.66 0.74 0.9
+0.36 0.76 0.9
+0.38 0.76 0.9
+0.4 0.76 0.9
+0.42 0.76 0.9
+0.44 0.76 0.9
+0.46 0.76 0.9
+0.48 0.76 0.9
+0.5 0.76 0.9
+0.52 0.76 0.9
+0.54 0.76 0.9
+0.56 0.76 0.9
+0.58 0.76 0.9
+0.6 0.76 0.9
+0.62 0.76 0.9
+0.64 0.76 0.9
+0.4 0.78 0.9
+0.42 0.78 0.9
+0.44 0.78 0.9
+0.46 0.78 0.9
+0.48 0.78 0.9
+0.5 0.78 0.9
+0.52 0.78 0.9
+0.54 0.78 0.9
+0.56 0.78 0.9
+0.58 0.78 0.9
+0.6 0.78 0.9
+0.44 0.24 0.92
+0.46 0.24 0.92
+0.48 0.24 0.92
+0.5 0.24 0.92
+0.52 0.24 0.92
+0.54 0.24 0.92
+0.56 0.24 0.92
+0.38 0.26 0.92
+0.4 0.26 0.92
+0.42 0.26 0.92
+0.44 0.26 0.92
+0.46 0.26 0.92
+0.48 0.26 0.92
+0.5 0.26 0.92
+0.52 0.26 0.92
+0.54 0.26 0.92
+0.56 0.26 0.92
+0.58 0.26 0.92
+0.6 0.26 0.92
+0.62 0.26 0.92
+0.36 0.28 0.92
+0.38 0.28 0.92
+0.4 0.28 0.92
+0.42 0.28 0.92
+0.44 0.28 0.92
+0.46 0.28 0.92
+0.48 0.28 0.92
+0.5 0.28 0.92
+0.52 0.28 0.92
+0.54 0.28 0.92
+0.56 0.28 0.92
+0.58 0.28 0.92
+0.6 0.28 0.92
+0.62 0.28 0.92
+0.64 0.28 0.92
+0.32 0.3 0.92
+0.34 0.3 0.92
+0.36 0.3 0.92
+0.38 0.3 0.92
+0.4 0.3 0.92
+0.42 0.3 0.92
+0.44 0.3 0.92
+0.46 0.3 0.92
+0.48 0.3 0.92
+0.5 0.3 0.92
+0.52 0.3 0.92
+0.54 0.3 0.92
+0.56 0.3 0.92
+0.58 0.3 0.92
+0.6 0.3 0.92
+0.62 0.3 0.92
+0.64 0.3 0.92
+0.66 0.3 0.92
+0.68 0.3 0.92
+0.3 0.32 0.92
+0.32 0.32 0.92
+0.34 0.32 0.92
+0.36 0.32 0.92
+0.38 0.32 0.92
+0.4 0.32 0.92
+0.42 0.32 0.92
+0.44 0.32 0.92
+0.46 0.32 0.92
+0.48 0.32 0.92
+0.5 0.32 0.92
+0.52 0.32 0.92
+0.54 0.32 0.92
+0.56 0.32 0.92
+0.58 0.32 0.92
+0.6 0.32 0.92
+0.62 0.32 0.92
+0.64 0.32 0.92
+0.66 0.32 0.92
+0.68 0.32 0.92
+0.7 0.32 0.92
+0.3 0.34 0.92
+0.32 0.34 0.92
+0.34 0.34 0.92
+0.36 0.34 0.92
+0.38 0.34 0.92
+0.4 0.34 0.92
+0.42 0.34 0.92
+0.44 0.34 0.92
+0.46 0.34 0.92
+0.54 0.34 0.92
+0.56 0.34 0.92
+0.58 0.34 0.92
+0.6 0.34 0.92
+0.62 0.34 0.92
+0.64 0.34 0.92
+0.66 0.34 0.92
+0.68 0.34 0.92
+0.7 0.34 0.92
+0.28 0.36 0.92
+0.3 0.36 0.92
+0.32 0.36 0.92
+0.34 0.36 0.92
+0.36 0.36 0.92
+0.38 0.36 0.92
+0.4 0.36 0.92
+0.6 0.36 0.92
+0.62 0.36 0.92
+0.64 0.36 0.92
+0.66 0.36 0.92
+0.68 0.36 0.92
+0.7 0.36 0.92
+0.72 0.36 0.92
+0.26 0.38 0.92
+0.28 0.38 0.92
+0.3 0.38 0.92
+0.32 0.38 0.92
+0.34 0.38 0.92
+0.36 0.38 0.92
+0.38 0.38 0.92
+0.62 0.38 0.92
+0.64 0.38 0.92
+0.66 0.38 0.92
+0.68 0.38 0.92
+0.7 0.38 0.92
+0.72 0.38 0.92
+0.74 0.38 0.92
+0.26 0.4 0.92
+0.28 0.4 0.92
+0.3 0.4 0.92
+0.32 0.4 0.92
+0.34 0.4 0.92
+0.36 0.4 0.92
+0.64 0.4 0.92
+0.66 0.4 0.92
+0.68 0.4 0.92
+0.7 0.4 0.92
+0.72 0.4 0.92
+0.74 0.4 0.92
+0.26 0.42 0.92
+0.28 0.42 0.92
+0.3 0.42 0.92
+0.32 0.42 0.92
+0.34 0.42 0.92
+0.66 0.42 0.92
+0.68 0.42 0.92
+0.7 0.42 0.92
+0.72 0.42 0.92
+0.74 0.42 0.92
+0.24 0.44 0.92
+0.26 0.44 0.92
+0.28 0.44 0.92
+0.3 0.44 0.92
+0.32 0.44 0.92
+0.34 0.44 0.92
+0.66 0.44 0.92
+0.68 0.44 0.92
+0.7 0.44 0.92
+0.72 0.44 0.92
+0.74 0.44 0.92
+0.76 0.44 0.92
+0.24 0.46 0.92
+0.26 0.46 0.92
+0.28 0.46 0.92
+0.3 0.46 0.92
+0.32 0.46 0.92
+0.34 0.46 0.92
+0.66 0.46 0.92
+0.68 0.46 0.92
+0.7 0.46 0.92
+0.72 0.46 0.92
+0.74 0.46 0.92
+0.76 0.46 0.92
+0.24 0.48 0.92
+0.26 0.48 0.92
+0.28 0.48 0.92
+0.3 0.48 0.92
+0.32 0.48 0.92
+0.68 0.48 0.92
+0.7 0.48 0.92
+0.72 0.48 0.92
+0.74 0.48 0.92
+0.76 0.48 0.92
+0.24 0.5 0.92
+0.26 0.5 0.92
+0.28 0.5 0.92
+0.3 0.5 0.92
+0.32 0.5 0.92
+0.68 0.5 0.92
+0.7 0.5 0.92
+0.72 0.5 0.92
+0.74 0.5 0.92
+0.76 0.5 0.92
+0.24 0.52 0.92
+0.26 0.52 0.92
+0.28 0.52 0.92
+0.3 0.52 0.92
+0.32 0.52 0.92
+0.68 0.52 0.92
+0.7 0.52 0.92
+0.72 0.52 0.92
+0.74 0.52 0.92
+0.76 0.52 0.92
+0.24 0.54 0.92
+0.26 0.54 0.92
+0.28 0.54 0.92
+0.3 0.54 0.92
+0.32 0.54 0.92
+0.34 0.54 0.92
+0.66 0.54 0.92
+0.68 0.54 0.92
+0.7 0.54 0.92
+0.72 0.54 0.92
+0.74 0.54 0.92
+0.76 0.54 0.92
+0.24 0.56 0.92
+0.26 0.56 0.92
+0.28 0.56 0.92
+0.3 0.56 0.92
+0.32 0.56 0.92
+0.34 0.56 0.92
+0.66 0.56 0.92
+0.68 0.56 0.92
+0.7 0.56 0.92
+0.72 0.56 0.92
+0.74 0.56 0.92
+0.76 0.56 0.92
+0.26 0.58 0.92
+0.28 0.58 0.92
+0.3 0.58 0.92
+0.32 0.58 0.92
+0.34 0.58 0.92
+0.66 0.58 0.92
+0.68 0.58 0.92
+0.7 0.58 0.92
+0.72 0.58 0.92
+0.74 0.58 0.92
+0.26 0.6 0.92
+0.28 0.6 0.92
+0.3 0.6 0.92
+0.32 0.6 0.92
+0.34 0.6 0.92
+0.36 0.6 0.92
+0.64 0.6 0.92
+0.66 0.6 0.92
+0.68 0.6 0.92
+0.7 0.6 0.92
+0.72 0.6 0.92
+0.74 0.6 0.92
+0.26 0.62 0.92
+0.28 0.62 0.92
+0.3 0.62 0.92
+0.32 0.62 0.92
+0.34 0.62 0.92
+0.36 0.62 0.92
+0.38 0.62 0.92
+0.62 0.62 0.92
+0.64 0.62 0.92
+0.66 0.62 0.92
+0.68 0.62 0.92
+0.7 0.62 0.92
+0.72 0.62 0.92
+0.74 0.62 0.92
+0.28 0.64 0.92
+0.3 0.64 0.92
+0.32 0.64 0.92
+0.34 0.64 0.92
+0.36 0.64 0.92
+0.38 0.64 0.92
+0.4 0.64 0.92
+0.6 0.64 0.92
+0.62 0.64 0.92
+0.64 0.64 0.92
+0.66 0.64 0.92
+0.68 0.64 0.92
+0.7 0.64 0.92
+0.72 0.64 0.92
+0.3 0.66 0.92
+0.32 0.66 0.92
+0.34 0.66 0.92
+0.36 0.66 0.92
+0.38 0.66 0.92
+0.4 0.66 0.92
+0.42 0.66 0.92
+0.44 0.66 0.92
+0.46 0.66 0.92
+0.54 0.66 0.92
+0.56 0.66 0.92
+0.58 0.66 0.92
+0.6 0.66 0.92
+0.62 0.66 0.92
+0.64 0.66 0.92
+0.66 0.66 0.92
+0.68 0.66 0.92
+0.7 0.66 0.92
+0.3 0.68 0.92
+0.32 0.68 0.92
+0.34 0.68 0.92
+0.36 0.68 0.92
+0.38 0.68 0.92
+0.4 0.68 0.92
+0.42 0.68 0.92
+0.44 0.68 0.92
+0.46 0.68 0.92
+0.48 0.68 0.92
+0.5 0.68 0.92
+0.52 0.68 0.92
+0.54 0.68 0.92
+0.56 0.68 0.92
+0.58 0.68 0.92
+0.6 0.68 0.92
+0.62 0.68 0.92
+0.64 0.68 0.92
+0.66 0.68 0.92
+0.68 0.68 0.92
+0.7 0.68 0.92
+0.32 0.7 0.92
+0.34 0.7 0.92
+0.36 0.7 0.92
+0.38 0.7 0.92
+0.4 0.7 0.92
+0.42 0.7 0.92
+0.44 0.7 0.92
+0.46 0.7 0.92
+0.48 0.7 0.92
+0.5 0.7 0.92
+0.52 0.7 0.92
+0.54 0.7 0.92
+0.56 0.7 0.92
+0.58 0.7 0.92
+0.6 0.7 0.92
+0.62 0.7 0.92
+0.64 0.7 0.92
+0.66 0.7 0.92
+0.68 0.7 0.92
+0.36 0.72 0.92
+0.38 0.72 0.92
+0.4 0.72 0.92
+0.42 0.72 0.92
+0.44 0.72 0.92
+0.46 0.72 0.92
+0.48 0.72 0.92
+0.5 0.72 0.92
+0.52 0.72 0.92
+0.54 0.72 0.92
+0.56 0.72 0.92
+0.58 0.72 0.92
+0.6 0.72 0.92
+0.62 0.72 0.92
+0.64 0.72 0.92
+0.38 0.74 0.92
+0.4 0.74 0.92
+0.42 0.74 0.92
+0.44 0.74 0.92
+0.46 0.74 0.92
+0.48 0.74 0.92
+0.5 0.74 0.92
+0.52 0.74 0.92
+0.54 0.74 0.92
+0.56 0.74 0.92
+0.58 0.74 0.92
+0.6 0.74 0.92
+0.62 0.74 0.92
+0.44 0.76 0.92
+0.46 0.76 0.92
+0.48 0.76 0.92
+0.5 0.76 0.92
+0.52 0.76 0.92
+0.54 0.76 0.92
+0.56 0.76 0.92
+0.42 0.28 0.94
+0.44 0.28 0.94
+0.46 0.28 0.94
+0.48 0.28 0.94
+0.5 0.28 0.94
+0.52 0.28 0.94
+0.54 0.28 0.94
+0.56 0.28 0.94
+0.58 0.28 0.94
+0.38 0.3 0.94
+0.4 0.3 0.94
+0.42 0.3 0.94
+0.44 0.3 0.94
+0.46 0.3 0.94
+0.48 0.3 0.94
+0.5 0.3 0.94
+0.52 0.3 0.94
+0.54 0.3 0.94
+0.56 0.3 0.94
+0.58 0.3 0.94
+0.6 0.3 0.94
+0.62 0.3 0.94
+0.36 0.32 0.94
+0.38 0.32 0.94
+0.4 0.32 0.94
+0.42 0.32 0.94
+0.44 0.32 0.94
+0.46 0.32 0.94
+0.48 0.32 0.94
+0.5 0.32 0.94
+0.52 0.32 0.94
+0.54 0.32 0.94
+0.56 0.32 0.94
+0.58 0.32 0.94
+0.6 0.32 0.94
+0.62 0.32 0.94
+0.64 0.32 0.94
+0.34 0.34 0.94
+0.36 0.34 0.94
+0.38 0.34 0.94
+0.4 0.34 0.94
+0.42 0.34 0.94
+0.44 0.34 0.94
+0.46 0.34 0.94
+0.48 0.34 0.94
+0.5 0.34 0.94
+0.52 0.34 0.94
+0.54 0.34 0.94
+0.56 0.34 0.94
+0.58 0.34 0.94
+0.6 0.34 0.94
+0.62 0.34 0.94
+0.64 0.34 0.94
+0.66 0.34 0.94
+0.32 0.36 0.94
+0.34 0.36 0.94
+0.36 0.36 0.94
+0.38 0.36 0.94
+0.4 0.36 0.94
+0.42 0.36 0.94
+0.44 0.36 0.94
+0.46 0.36 0.94
+0.48 0.36 0.94
+0.5 0.36 0.94
+0.52 0.36 0.94
+0.54 0.36 0.94
+0.56 0.36 0.94
+0.58 0.36 0.94
+0.6 0.36 0.94
+0.62 0.36 0.94
+0.64 0.36 0.94
+0.66 0.36 0.94
+0.68 0.36 0.94
+0.3 0.38 0.94
+0.32 0.38 0.94
+0.34 0.38 0.94
+0.36 0.38 0.94
+0.38 0.38 0.94
+0.4 0.38 0.94
+0.42 0.38 0.94
+0.44 0.38 0.94
+0.46 0.38 0.94
+0.48 0.38 0.94
+0.5 0.38 0.94
+0.52 0.38 0.94
+0.54 0.38 0.94
+0.56 0.38 0.94
+0.58 0.38 0.94
+0.6 0.38 0.94
+0.62 0.38 0.94
+0.64 0.38 0.94
+0.66 0.38 0.94
+0.68 0.38 0.94
+0.7 0.38 0.94
+0.3 0.4 0.94
+0.32 0.4 0.94
+0.34 0.4 0.94
+0.36 0.4 0.94
+0.38 0.4 0.94
+0.4 0.4 0.94
+0.42 0.4 0.94
+0.44 0.4 0.94
+0.46 0.4 0.94
+0.48 0.4 0.94
+0.5 0.4 0.94
+0.52 0.4 0.94
+0.54 0.4 0.94
+0.56 0.4 0.94
+0.58 0.4 0.94
+0.6 0.4 0.94
+0.62 0.4 0.94
+0.64 0.4 0.94
+0.66 0.4 0.94
+0.68 0.4 0.94
+0.7 0.4 0.94
+0.28 0.42 0.94
+0.3 0.42 0.94
+0.32 0.42 0.94
+0.34 0.42 0.94
+0.36 0.42 0.94
+0.38 0.42 0.94
+0.4 0.42 0.94
+0.42 0.42 0.94
+0.44 0.42 0.94
+0.56 0.42 0.94
+0.58 0.42 0.94
+0.6 0.42 0.94
+0.62 0.42 0.94
+0.64 0.42 0.94
+0.66 0.42 0.94
+0.68 0.42 0.94
+0.7 0.42 0.94
+0.72 0.42 0.94
+0.28 0.44 0.94
+0.3 0.44 0.94
+0.32 0.44 0.94
+0.34 0.44 0.94
+0.36 0.44 0.94
+0.38 0.44 0.94
+0.4 0.44 0.94
+0.42 0.44 0.94
+0.58 0.44 0.94
+0.6 0.44 0.94
+0.62 0.44 0.94
+0.64 0.44 0.94
+0.66 0.44 0.94
+0.68 0.44 0.94
+0.7 0.44 0.94
+0.72 0.44 0.94
+0.28 0.46 0.94
+0.3 0.46 0.94
+0.32 0.46 0.94
+0.34 0.46 0.94
+0.36 0.46 0.94
+0.38 0.46 0.94
+0.4 0.46 0.94
+0.6 0.46 0.94
+0.62 0.46 0.94
+0.64 0.46 0.94
+0.66 0.46 0.94
+0.68 0.46 0.94
+0.7 0.46 0.94
+0.72 0.46 0.94
+0.28 0.48 0.94
+0.3 0.48 0.94
+0.32 0.48 0.94
+0.34 0.48 0.94
+0.36 0.48 0.94
+0.38 0.48 0.94
+0.4 0.48 0.94
+0.6 0.48 0.94
+0.62 0.48 0.94
+0.64 0.48 0.94
+0.66 0.48 0.94
+0.68 0.48 0.94
+0.7 0.48 0.94
+0.72 0.48 0.94
+0.28 0.5 0.94
+0.3 0.5 0.94
+0.32 0.5 0.94
+0.34 0.5 0.94
+0.36 0.5 0.94
+0.38 0.5 0.94
+0.4 0.5 0.94
+0.6 0.5 0.94
+0.62 0.5 0.94
+0.64 0.5 0.94
+0.66 0.5 0.94
+0.68 0.5 0.94
+0.7 0.5 0.94
+0.72 0.5 0.94
+0.28 0.52 0.94
+0.3 0.52 0.94
+0.32 0.52 0.94
+0.34 0.52 0.94
+0.36 0.52 0.94
+0.38 0.52 0.94
+0.4 0.52 0.94
+0.6 0.52 0.94
+0.62 0.52 0.94
+0.64 0.52 0.94
+0.66 0.52 0.94
+0.68 0.52 0.94
+0.7 0.52 0.94
+0.72 0.52 0.94
+0.28 0.54 0.94
+0.3 0.54 0.94
+0.32 0.54 0.94
+0.34 0.54 0.94
+0.36 0.54 0.94
+0.38 0.54 0.94
+0.4 0.54 0.94
+0.6 0.54 0.94
+0.62 0.54 0.94
+0.64 0.54 0.94
+0.66 0.54 0.94
+0.68 0.54 0.94
+0.7 0.54 0.94
+0.72 0.54 0.94
+0.28 0.56 0.94
+0.3 0.56 0.94
+0.32 0.56 0.94
+0.34 0.56 0.94
+0.36 0.56 0.94
+0.38 0.56 0.94
+0.4 0.56 0.94
+0.42 0.56 0.94
+0.58 0.56 0.94
+0.6 0.56 0.94
+0.62 0.56 0.94
+0.64 0.56 0.94
+0.66 0.56 0.94
+0.68 0.56 0.94
+0.7 0.56 0.94
+0.72 0.56 0.94
+0.28 0.58 0.94
+0.3 0.58 0.94
+0.32 0.58 0.94
+0.34 0.58 0.94
+0.36 0.58 0.94
+0.38 0.58 0.94
+0.4 0.58 0.94
+0.42 0.58 0.94
+0.44 0.58 0.94
+0.56 0.58 0.94
+0.58 0.58 0.94
+0.6 0.58 0.94
+0.62 0.58 0.94
+0.64 0.58 0.94
+0.66 0.58 0.94
+0.68 0.58 0.94
+0.7 0.58 0.94
+0.72 0.58 0.94
+0.3 0.6 0.94
+0.32 0.6 0.94
+0.34 0.6 0.94
+0.36 0.6 0.94
+0.38 0.6 0.94
+0.4 0.6 0.94
+0.42 0.6 0.94
+0.44 0.6 0.94
+0.46 0.6 0.94
+0.48 0.6 0.94
+0.5 0.6 0.94
+0.52 0.6 0.94
+0.54 0.6 0.94
+0.56 0.6 0.94
+0.58 0.6 0.94
+0.6 0.6 0.94
+0.62 0.6 0.94
+0.64 0.6 0.94
+0.66 0.6 0.94
+0.68 0.6 0.94
+0.7 0.6 0.94
+0.3 0.62 0.94
+0.32 0.62 0.94
+0.34 0.62 0.94
+0.36 0.62 0.94
+0.38 0.62 0.94
+0.4 0.62 0.94
+0.42 0.62 0.94
+0.44 0.62 0.94
+0.46 0.62 0.94
+0.48 0.62 0.94
+0.5 0.62 0.94
+0.52 0.62 0.94
+0.54 0.62 0.94
+0.56 0.62 0.94
+0.58 0.62 0.94
+0.6 0.62 0.94
+0.62 0.62 0.94
+0.64 0.62 0.94
+0.66 0.62 0.94
+0.68 0.62 0.94
+0.7 0.62 0.94
+0.32 0.64 0.94
+0.34 0.64 0.94
+0.36 0.64 0.94
+0.38 0.64 0.94
+0.4 0.64 0.94
+0.42 0.64 0.94
+0.44 0.64 0.94
+0.46 0.64 0.94
+0.48 0.64 0.94
+0.5 0.64 0.94
+0.52 0.64 0.94
+0.54 0.64 0.94
+0.56 0.64 0.94
+0.58 0.64 0.94
+0.6 0.64 0.94
+0.62 0.64 0.94
+0.64 0.64 0.94
+0.66 0.64 0.94
+0.68 0.64 0.94
+0.34 0.66 0.94
+0.36 0.66 0.94
+0.38 0.66 0.94
+0.4 0.66 0.94
+0.42 0.66 0.94
+0.44 0.66 0.94
+0.46 0.66 0.94
+0.48 0.66 0.94
+0.5 0.66 0.94
+0.52 0.66 0.94
+0.54 0.66 0.94
+0.56 0.66 0.94
+0.58 0.66 0.94
+0.6 0.66 0.94
+0.62 0.66 0.94
+0.64 0.66 0.94
+0.66 0.66 0.94
+0.36 0.68 0.94
+0.38 0.68 0.94
+0.4 0.68 0.94
+0.42 0.68 0.94
+0.44 0.68 0.94
+0.46 0.68 0.94
+0.48 0.68 0.94
+0.5 0.68 0.94
+0.52 0.68 0.94
+0.54 0.68 0.94
+0.56 0.68 0.94
+0.58 0.68 0.94
+0.6 0.68 0.94
+0.62 0.68 0.94
+0.64 0.68 0.94
+0.38 0.7 0.94
+0.4 0.7 0.94
+0.42 0.7 0.94
+0.44 0.7 0.94
+0.46 0.7 0.94
+0.48 0.7 0.94
+0.5 0.7 0.94
+0.52 0.7 0.94
+0.54 0.7 0.94
+0.56 0.7 0.94
+0.58 0.7 0.94
+0.6 0.7 0.94
+0.62 0.7 0.94
+0.42 0.72 0.94
+0.44 0.72 0.94
+0.46 0.72 0.94
+0.48 0.72 0.94
+0.5 0.72 0.94
+0.52 0.72 0.94
+0.54 0.72 0.94
+0.56 0.72 0.94
+0.58 0.72 0.94
+0.44 0.32 0.96
+0.46 0.32 0.96
+0.48 0.32 0.96
+0.5 0.32 0.96
+0.52 0.32 0.96
+0.54 0.32 0.96
+0.56 0.32 0.96
+0.4 0.34 0.96
+0.42 0.34 0.96
+0.44 0.34 0.96
+0.46 0.34 0.96
+0.48 0.34 0.96
+0.5 0.34 0.96
+0.52 0.34 0.96
+0.54 0.34 0.96
+0.56 0.34 0.96
+0.58 0.34 0.96
+0.6 0.34 0.96
+0.38 0.36 0.96
+0.4 0.36 0.96
+0.42 0.36 0.96
+0.44 0.36 0.96
+0.46 0.36 0.96
+0.48 0.36 0.96
+0.5 0.36 0.96
+0.52 0.36 0.96
+0.54 0.36 0.96
+0.56 0.36 0.96
+0.58 0.36 0.96
+0.6 0.36 0.96
+0.62 0.36 0.96
+0.36 0.38 0.96
+0.38 0.38 0.96
+0.4 0.38 0.96
+0.42 0.38 0.96
+0.44 0.38 0.96
+0.46 0.38 0.96
+0.48 0.38 0.96
+0.5 0.38 0.96
+0.52 0.38 0.96
+0.54 0.38 0.96
+0.56 0.38 0.96
+0.58 0.38 0.96
+0.6 0.38 0.96
+0.62 0.38 0.96
+0.64 0.38 0.96
+0.34 0.4 0.96
+0.36 0.4 0.96
+0.38 0.4 0.96
+0.4 0.4 0.96
+0.42 0.4 0.96
+0.44 0.4 0.96
+0.46 0.4 0.96
+0.48 0.4 0.96
+0.5 0.4 0.96
+0.52 0.4 0.96
+0.54 0.4 0.96
+0.56 0.4 0.96
+0.58 0.4 0.96
+0.6 0.4 0.96
+0.62 0.4 0.96
+0.64 0.4 0.96
+0.66 0.4 0.96
+0.34 0.42 0.96
+0.36 0.42 0.96
+0.38 0.42 0.96
+0.4 0.42 0.96
+0.42 0.42 0.96
+0.44 0.42 0.96
+0.46 0.42 0.96
+0.48 0.42 0.96
+0.5 0.42 0.96
+0.52 0.42 0.96
+0.54 0.42 0.96
+0.56 0.42 0.96
+0.58 0.42 0.96
+0.6 0.42 0.96
+0.62 0.42 0.96
+0.64 0.42 0.96
+0.66 0.42 0.96
+0.32 0.44 0.96
+0.34 0.44 0.96
+0.36 0.44 0.96
+0.38 0.44 0.96
+0.4 0.44 0.96
+0.42 0.44 0.96
+0.44 0.44 0.96
+0.46 0.44 0.96
+0.48 0.44 0.96
+0.5 0.44 0.96
+0.52 0.44 0.96
+0.54 0.44 0.96
+0.56 0.44 0.96
+0.58 0.44 0.96
+0.6 0.44 0.96
+0.62 0.44 0.96
+0.64 0.44 0.96
+0.66 0.44 0.96
+0.68 0.44 0.96
+0.32 0.46 0.96
+0.34 0.46 0.96
+0.36 0.46 0.96
+0.38 0.46 0.96
+0.4 0.46 0.96
+0.42 0.46 0.96
+0.44 0.46 0.96
+0.46 0.46 0.96
+0.48 0.46 0.96
+0.5 0.46 0.96
+0.52 0.46 0.96
+0.54 0.46 0.96
+0.56 0.46 0.96
+0.58 0.46 0.96
+0.6 0.46 0.96
+0.62 0.46 0.96
+0.64 0.46 0.96
+0.66 0.46 0.96
+0.68 0.46 0.96
+0.32 0.48 0.96
+0.34 0.48 0.96
+0.36 0.48 0.96
+0.38 0.48 0.96
+0.4 0.48 0.96
+0.42 0.48 0.96
+0.44 0.48 0.96
+0.46 0.48 0.96
+0.48 0.48 0.96
+0.5 0.48 0.96
+0.52 0.48 0.96
+0.54 0.48 0.96
+0.56 0.48 0.96
+0.58 0.48 0.96
+0.6 0.48 0.96
+0.62 0.48 0.96
+0.64 0.48 0.96
+0.66 0.48 0.96
+0.68 0.48 0.96
+0.32 0.5 0.96
+0.34 0.5 0.96
+0.36 0.5 0.96
+0.38 0.5 0.96
+0.4 0.5 0.96
+0.42 0.5 0.96
+0.44 0.5 0.96
+0.46 0.5 0.96
+0.48 0.5 0.96
+0.5 0.5 0.96
+0.52 0.5 0.96
+0.54 0.5 0.96
+0.56 0.5 0.96
+0.58 0.5 0.96
+0.6 0.5 0.96
+0.62 0.5 0.96
+0.64 0.5 0.96
+0.66 0.5 0.96
+0.68 0.5 0.96
+0.32 0.52 0.96
+0.34 0.52 0.96
+0.36 0.52 0.96
+0.38 0.52 0.96
+0.4 0.52 0.96
+0.42 0.52 0.96
+0.44 0.52 0.96
+0.46 0.52 0.96
+0.48 0.52 0.96
+0.5 0.52 0.96
+0.52 0.52 0.96
+0.54 0.52 0.96
+0.56 0.52 0.96
+0.58 0.52 0.96
+0.6 0.52 0.96
+0.62 0.52 0.96
+0.64 0.52 0.96
+0.66 0.52 0.96
+0.68 0.52 0.96
+0.32 0.54 0.96
+0.34 0.54 0.96
+0.36 0.54 0.96
+0.38 0.54 0.96
+0.4 0.54 0.96
+0.42 0.54 0.96
+0.44 0.54 0.96
+0.46 0.54 0.96
+0.48 0.54 0.96
+0.5 0.54 0.96
+0.52 0.54 0.96
+0.54 0.54 0.96
+0.56 0.54 0.96
+0.58 0.54 0.96
+0.6 0.54 0.96
+0.62 0.54 0.96
+0.64 0.54 0.96
+0.66 0.54 0.96
+0.68 0.54 0.96
+0.32 0.56 0.96
+0.34 0.56 0.96
+0.36 0.56 0.96
+0.38 0.56 0.96
+0.4 0.56 0.96
+0.42 0.56 0.96
+0.44 0.56 0.96
+0.46 0.56 0.96
+0.48 0.56 0.96
+0.5 0.56 0.96
+0.52 0.56 0.96
+0.54 0.56 0.96
+0.56 0.56 0.96
+0.58 0.56 0.96
+0.6 0.56 0.96
+0.62 0.56 0.96
+0.64 0.56 0.96
+0.66 0.56 0.96
+0.68 0.56 0.96
+0.34 0.58 0.96
+0.36 0.58 0.96
+0.38 0.58 0.96
+0.4 0.58 0.96
+0.42 0.58 0.96
+0.44 0.58 0.96
+0.46 0.58 0.96
+0.48 0.58 0.96
+0.5 0.58 0.96
+0.52 0.58 0.96
+0.54 0.58 0.96
+0.56 0.58 0.96
+0.58 0.58 0.96
+0.6 0.58 0.96
+0.62 0.58 0.96
+0.64 0.58 0.96
+0.66 0.58 0.96
+0.34 0.6 0.96
+0.36 0.6 0.96
+0.38 0.6 0.96
+0.4 0.6 0.96
+0.42 0.6 0.96
+0.44 0.6 0.96
+0.46 0.6 0.96
+0.48 0.6 0.96
+0.5 0.6 0.96
+0.52 0.6 0.96
+0.54 0.6 0.96
+0.56 0.6 0.96
+0.58 0.6 0.96
+0.6 0.6 0.96
+0.62 0.6 0.96
+0.64 0.6 0.96
+0.66 0.6 0.96
+0.36 0.62 0.96
+0.38 0.62 0.96
+0.4 0.62 0.96
+0.42 0.62 0.96
+0.44 0.62 0.96
+0.46 0.62 0.96
+0.48 0.62 0.96
+0.5 0.62 0.96
+0.52 0.62 0.96
+0.54 0.62 0.96
+0.56 0.62 0.96
+0.58 0.62 0.96
+0.6 0.62 0.96
+0.62 0.62 0.96
+0.64 0.62 0.96
+0.38 0.64 0.96
+0.4 0.64 0.96
+0.42 0.64 0.96
+0.44 0.64 0.96
+0.46 0.64 0.96
+0.48 0.64 0.96
+0.5 0.64 0.96
+0.52 0.64 0.96
+0.54 0.64 0.96
+0.56 0.64 0.96
+0.58 0.64 0.96
+0.6 0.64 0.96
+0.62 0.64 0.96
+0.4 0.66 0.96
+0.42 0.66 0.96
+0.44 0.66 0.96
+0.46 0.66 0.96
+0.48 0.66 0.96
+0.5 0.66 0.96
+0.52 0.66 0.96
+0.54 0.66 0.96
+0.56 0.66 0.96
+0.58 0.66 0.96
+0.6 0.66 0.96
+0.44 0.68 0.96
+0.46 0.68 0.96
+0.48 0.68 0.96
+0.5 0.68 0.96
+0.52 0.68 0.96
+0.54 0.68 0.96
+0.56 0.68 0.96
+0.44 0.38 0.98
+0.46 0.38 0.98
+0.48 0.38 0.98
+0.5 0.38 0.98
+0.52 0.38 0.98
+0.54 0.38 0.98
+0.56 0.38 0.98
+0.42 0.4 0.98
+0.44 0.4 0.98
+0.46 0.4 0.98
+0.48 0.4 0.98
+0.5 0.4 0.98
+0.52 0.4 0.98
+0.54 0.4 0.98
+0.56 0.4 0.98
+0.58 0.4 0.98
+0.4 0.42 0.98
+0.42 0.42 0.98
+0.44 0.42 0.98
+0.46 0.42 0.98
+0.48 0.42 0.98
+0.5 0.42 0.98
+0.52 0.42 0.98
+0.54 0.42 0.98
+0.56 0.42 0.98
+0.58 0.42 0.98
+0.6 0.42 0.98
+0.38 0.44 0.98
+0.4 0.44 0.98
+0.42 0.44 0.98
+0.44 0.44 0.98
+0.46 0.44 0.98
+0.48 0.44 0.98
+0.5 0.44 0.98
+0.52 0.44 0.98
+0.54 0.44 0.98
+0.56 0.44 0.98
+0.58 0.44 0.98
+0.6 0.44 0.98
+0.62 0.44 0.98
+0.38 0.46 0.98
+0.4 0.46 0.98
+0.42 0.46 0.98
+0.44 0.46 0.98
+0.46 0.46 0.98
+0.48 0.46 0.98
+0.5 0.46 0.98
+0.52 0.46 0.98
+0.54 0.46 0.98
+0.56 0.46 0.98
+0.58 0.46 0.98
+0.6 0.46 0.98
+0.62 0.46 0.98
+0.38 0.48 0.98
+0.4 0.48 0.98
+0.42 0.48 0.98
+0.44 0.48 0.98
+0.46 0.48 0.98
+0.48 0.48 0.98
+0.5 0.48 0.98
+0.52 0.48 0.98
+0.54 0.48 0.98
+0.56 0.48 0.98
+0.58 0.48 0.98
+0.6 0.48 0.98
+0.62 0.48 0.98
+0.38 0.5 0.98
+0.4 0.5 0.98
+0.42 0.5 0.98
+0.44 0.5 0.98
+0.46 0.5 0.98
+0.48 0.5 0.98
+0.5 0.5 0.98
+0.52 0.5 0.98
+0.54 0.5 0.98
+0.56 0.5 0.98
+0.58 0.5 0.98
+0.6 0.5 0.98
+0.62 0.5 0.98
+0.38 0.52 0.98
+0.4 0.52 0.98
+0.42 0.52 0.98
+0.44 0.52 0.98
+0.46 0.52 0.98
+0.48 0.52 0.98
+0.5 0.52 0.98
+0.52 0.52 0.98
+0.54 0.52 0.98
+0.56 0.52 0.98
+0.58 0.52 0.98
+0.6 0.52 0.98
+0.62 0.52 0.98
+0.38 0.54 0.98
+0.4 0.54 0.98
+0.42 0.54 0.98
+0.44 0.54 0.98
+0.46 0.54 0.98
+0.48 0.54 0.98
+0.5 0.54 0.98
+0.52 0.54 0.98
+0.54 0.54 0.98
+0.56 0.54 0.98
+0.58 0.54 0.98
+0.6 0.54 0.98
+0.62 0.54 0.98
+0.38 0.56 0.98
+0.4 0.56 0.98
+0.42 0.56 0.98
+0.44 0.56 0.98
+0.46 0.56 0.98
+0.48 0.56 0.98
+0.5 0.56 0.98
+0.52 0.56 0.98
+0.54 0.56 0.98
+0.56 0.56 0.98
+0.58 0.56 0.98
+0.6 0.56 0.98
+0.62 0.56 0.98
+0.4 0.58 0.98
+0.42 0.58 0.98
+0.44 0.58 0.98
+0.46 0.58 0.98
+0.48 0.58 0.98
+0.5 0.58 0.98
+0.52 0.58 0.98
+0.54 0.58 0.98
+0.56 0.58 0.98
+0.58 0.58 0.98
+0.6 0.58 0.98
+0.42 0.6 0.98
+0.44 0.6 0.98
+0.46 0.6 0.98
+0.48 0.6 0.98
+0.5 0.6 0.98
+0.52 0.6 0.98
+0.54 0.6 0.98
+0.56 0.6 0.98
+0.58 0.6 0.98
+0.44 0.62 0.98
+0.46 0.62 0.98
+0.48 0.62 0.98
+0.5 0.62 0.98
+0.52 0.62 0.98
+0.54 0.62 0.98
+0.56 0.62 0.98
diff --git a/data/points/tore3D_1307.txt b/data/points/tore3D_1307.txt
deleted file mode 100644
index 7a1b9e60..00000000
--- a/data/points/tore3D_1307.txt
+++ /dev/null
@@ -1,1307 +0,0 @@
--1.081352 -0.451815 0.237511
--1.062873 -0.492063 -0.246058
--0.490280 -0.890039 0.299674
--1.094597 -0.620156 0.153419
--0.517128 -1.189962 -0.039580
-1.152877 0.300175 -0.231559
-0.502337 1.174528 0.114471
--0.299269 -1.235308 -0.128350
-0.559591 1.172809 -0.019004
-0.184193 -0.676264 -0.024016
--0.888412 0.748820 -0.252659
--0.859062 -0.581840 0.297612
-0.293395 -1.216582 -0.163670
-0.393949 -1.126922 -0.228892
-0.441284 -1.075139 -0.252409
--0.658443 0.286084 0.102036
--0.770782 -0.787327 -0.282279
--0.406644 1.191333 -0.151820
-0.421148 0.751386 0.266188
--0.337991 -1.233999 0.109125
--0.576506 0.405645 -0.054051
-0.359474 0.613240 0.079974
--0.455484 -0.568690 -0.127880
-0.702136 -0.235409 -0.150928
-0.091056 -0.696011 0.037399
--0.064213 -1.043207 -0.296606
--0.066480 -0.708601 -0.083866
--0.866010 -0.584473 -0.296793
-0.476020 0.521113 0.058829
-0.470937 0.518518 -0.020041
-0.436955 0.578033 0.118941
-0.510216 0.479447 0.010043
-0.552069 0.434267 -0.037525
-0.570514 0.483559 0.162698
-0.520778 0.488742 0.091457
-0.007764 -1.064538 0.292870
--0.050586 -1.121647 0.273674
-0.055839 -1.248122 0.166563
--0.032797 -1.208186 0.215517
--0.111026 -1.277187 0.102083
--0.108199 -1.228175 0.189078
--0.130166 -1.089441 0.283875
--0.152281 -0.988000 0.299890
--0.257364 -1.167207 0.227592
--0.171612 -1.165220 0.241502
--1.162998 0.381345 -0.199780
--1.118806 0.446593 -0.219113
--0.969520 0.369639 -0.297369
--1.015149 0.442441 -0.279944
--0.945706 0.502039 -0.291395
--0.907852 0.668109 -0.271495
--0.989109 0.583976 -0.260348
--1.151615 0.505514 -0.153644
--1.207510 0.471993 -0.044521
--1.104315 0.650680 -0.102654
--1.092710 0.584417 -0.180772
--0.520165 0.523045 0.145339
--0.908993 0.242970 0.293971
--0.810558 0.265720 0.261300
--0.897194 0.450947 0.299838
--0.801677 0.368615 0.275680
--0.618631 0.339910 -0.058175
--0.745800 0.194272 0.193649
--0.764778 0.089444 0.192796
--0.677218 0.179465 -0.017122
--0.951381 0.107469 -0.296882
--1.044006 0.122763 -0.295486
--1.130206 0.327437 -0.242377
--1.039272 0.319024 -0.286828
--1.006740 0.250370 -0.297517
--1.074288 0.196042 -0.285418
--1.179201 0.271080 -0.214486
--1.159801 0.205309 -0.241580
--1.262356 0.149537 -0.128957
--1.209803 0.141532 -0.206239
--1.103598 0.056448 -0.281019
--1.069017 -0.026030 -0.291850
--1.230492 -0.003439 -0.192273
--1.186921 0.066026 -0.233374
--1.239215 0.383964 -0.040221
--1.221544 0.353027 -0.127998
--1.231122 0.282629 -0.144722
--1.265581 0.224586 -0.093610
--1.278661 0.235723 -0.002121
--1.258566 0.316739 0.036060
--1.142814 0.618337 0.016377
--1.186973 0.519848 0.048538
--1.002081 0.324515 0.294944
--0.998092 0.428671 0.287072
--1.081725 0.504658 0.228721
--1.161877 0.464839 0.162892
--1.228669 0.307236 0.137309
--1.223687 0.221595 0.175255
--1.094190 0.299505 0.267834
--1.172804 0.362343 0.194898
--1.287785 0.080944 -0.076717
--1.278902 0.004250 -0.110779
--1.296965 0.086769 0.015989
--1.290442 0.014796 0.076047
--1.257240 0.161846 0.135908
--1.285433 0.163110 0.051651
--0.886853 0.152690 -0.282767
--0.904457 0.223940 -0.291991
--0.853657 0.340015 -0.288701
--0.662561 0.323217 -0.144815
--0.688153 0.235729 -0.124945
--0.746102 0.209917 -0.198615
--0.825513 0.260841 -0.268220
--0.814460 0.106161 -0.241124
--0.751881 0.125125 -0.182955
--0.694463 0.087754 -0.002227
--0.718096 0.030274 0.104055
--0.725588 -0.037936 -0.124016
--0.715162 0.057103 -0.100962
--0.589244 0.833226 -0.299481
--0.698686 0.797210 -0.293987
--0.724145 0.963727 -0.218762
--0.772661 0.863564 -0.254443
--0.952389 0.746095 -0.214405
--1.037783 0.734366 -0.127409
--0.906947 0.888998 -0.130794
--0.879694 0.826349 -0.216987
--0.708976 0.691352 -0.299681
--0.795825 0.632666 -0.299354
--1.094557 0.205733 0.277474
--1.166956 0.180982 0.239452
--1.235100 0.093251 0.182145
--1.252852 0.020112 0.161546
--1.122616 0.045423 0.273322
--1.176019 0.104304 0.239683
--0.831534 0.028847 -0.248610
--0.784800 -0.051320 -0.210683
--0.970175 -0.039735 -0.298404
--0.915801 0.031759 -0.287960
--1.017315 0.133847 0.298781
--1.040809 0.053958 0.296991
--0.850253 0.061846 0.261250
--0.922621 0.144598 0.292551
--1.205576 -0.083392 -0.215756
--1.127676 -0.097664 -0.269488
--1.218875 -0.228370 -0.179640
--1.241479 -0.151333 -0.164511
--1.281008 -0.141697 -0.081100
--1.282725 -0.207501 -0.019002
--1.295404 -0.061623 0.045226
--1.294057 -0.065990 -0.051164
--1.266583 -0.280977 -0.040054
--1.240056 -0.292948 -0.121946
--1.272968 -0.133906 0.108272
--1.274739 -0.205619 0.072097
--1.254749 -0.331515 0.036391
--1.230958 -0.414312 0.026169
--1.188467 -0.290913 0.199876
--1.247215 -0.280317 0.111825
--0.714306 -0.076055 0.102946
--0.722893 -0.247937 0.185450
--0.755066 -0.146639 0.191478
--0.892565 -0.032108 0.280205
--0.993747 -0.023773 0.299917
--0.848739 -0.126278 0.264223
--1.137674 -0.030533 0.266157
--1.209182 -0.047928 0.214183
--1.221441 -0.129173 0.194550
--1.160987 -0.202671 0.240867
--1.069850 -0.172552 0.288004
--1.063790 -0.080596 0.292372
--1.158039 -0.249717 -0.236406
--1.100040 -0.186683 -0.276695
--1.150286 -0.337789 -0.224600
--1.074319 -0.379918 -0.265438
--1.211559 -0.436746 -0.083952
--1.207229 -0.363808 -0.148360
--0.931978 -0.130288 -0.293972
--0.829416 -0.140227 -0.254308
--0.987281 -0.311755 -0.297765
--1.005930 -0.209775 -0.298601
--0.521727 0.765192 -0.290775
--1.148019 -0.386210 0.212818
--1.190078 -0.459193 0.118044
--1.158436 -0.559820 0.087646
--1.167821 -0.516767 -0.114878
--1.096278 -0.674600 -0.086267
--1.155066 -0.591214 -0.036592
--0.771608 1.005459 -0.135935
--0.852825 0.959308 -0.097955
--0.814246 1.007568 0.052984
--0.869887 0.966193 -0.005886
--0.965682 0.863491 -0.052417
--1.028122 0.791500 -0.038978
--0.927269 0.875414 0.119585
--0.930881 0.906369 0.024163
--0.566961 0.990224 0.264677
--0.534303 1.091724 0.208631
--0.718230 1.074222 -0.067833
--0.745807 1.063247 0.028303
--0.691291 1.076225 0.109998
--0.602869 1.125480 0.115647
--0.618246 1.129229 -0.085232
--0.561684 1.171822 0.013519
--0.450125 1.218907 0.016890
--0.427083 1.134526 0.212045
--0.271294 1.244331 0.122793
--0.387285 1.213311 0.122658
--1.094776 0.667045 0.101590
--1.058368 0.607909 0.203007
--0.978607 0.795203 0.147752
--1.045755 0.757303 0.071993
--0.801245 0.978278 0.141861
--0.848741 0.906595 0.177594
--0.668853 0.960921 0.246697
--0.722169 1.011591 0.176481
--0.480102 0.515515 0.050987
--0.713545 -0.254054 -0.176596
--0.686648 -0.346332 -0.191457
--0.878900 -0.326981 -0.293245
--0.797228 -0.236768 -0.248167
--0.935677 0.734226 0.232423
--0.967497 0.636933 0.254631
--0.888477 0.555640 0.296089
--0.791078 0.572816 0.298952
--0.705808 0.865927 0.276371
--0.802219 0.847107 0.249569
--0.839916 0.754886 0.270695
--0.771240 0.672138 0.299109
--0.613878 0.599194 0.264134
--0.530763 0.595344 0.221167
--0.640168 0.780483 0.299749
--0.673841 0.682444 0.297213
--1.049085 -0.401913 0.273442
--1.018454 -0.506904 0.266417
--0.767742 -0.615905 0.299286
--0.927725 -0.790117 0.205312
--0.963772 -0.701033 0.230404
--0.397985 0.701026 -0.229017
--0.429407 0.774740 -0.277375
--0.243658 0.752702 -0.215316
--0.314726 0.693460 -0.182081
--0.309573 0.643825 -0.091955
--0.232485 0.661107 -0.021837
--0.406312 0.572607 0.034624
--0.391149 0.590737 -0.071491
--0.551266 -0.809351 0.299338
--0.687239 -0.975305 0.229314
--0.536247 0.795816 0.297073
--0.376939 0.918504 0.299808
--0.494239 0.903007 0.298412
--0.347646 0.634621 0.116610
--0.251386 0.667185 0.087247
--0.585533 -0.668753 0.278789
--0.515444 -0.720691 0.277880
--0.584628 -0.577694 0.241249
--0.675393 -0.440771 0.228850
--0.671482 -0.539889 0.265697
--0.853291 -0.420036 -0.295950
--0.751319 -0.421284 -0.266151
--0.730875 -0.506183 -0.278896
--0.790705 -0.568691 -0.299425
--1.040254 -0.658033 -0.191569
--0.916951 -0.512416 -0.295830
--0.810410 -0.638033 -0.298556
--0.748693 -0.696571 -0.299261
--0.953502 -0.699942 -0.237685
--0.889123 -0.651913 -0.282308
-0.962416 0.841972 -0.111265
-0.913452 0.821515 -0.194271
-0.810323 0.959205 -0.157265
-0.825787 0.882616 -0.215781
-0.654429 0.921109 -0.270355
-0.740022 0.854310 -0.270155
-0.617250 0.707515 -0.293668
-0.729631 0.755312 -0.295664
-0.929579 0.731572 -0.237493
-1.025178 0.659435 -0.204964
-0.815022 0.609543 -0.299435
-0.829173 0.699676 -0.287674
--0.954822 -0.852912 0.106773
--0.920233 -0.786312 -0.213849
--0.888107 -0.920442 -0.110019
--0.950851 -0.845548 -0.125402
--0.204577 1.197671 0.209135
--0.047190 1.054470 0.294865
--0.140538 0.995875 0.299919
--0.183526 0.717846 0.151647
--0.028992 0.841029 0.254906
--0.131597 0.885679 0.281198
--0.893964 -0.927064 0.084480
--0.872584 -0.962902 -0.015965
--0.757646 -1.003637 0.153780
--0.825670 -0.941871 0.162142
--0.562879 1.104166 -0.180672
--0.545627 0.937180 -0.287941
--0.612412 1.007909 -0.240620
--0.617710 -0.377137 -0.116819
--0.280120 -0.643123 0.027697
--0.362574 -0.598874 0.004105
--0.641128 -0.520733 -0.244197
--0.583385 -0.459863 -0.154090
--0.508969 -0.499792 -0.087955
--0.217732 1.280782 0.020568
--0.044103 1.290446 -0.071942
--0.103040 1.295146 0.019918
--0.092171 1.215808 0.204421
--0.026018 1.151911 0.258433
-0.071646 1.277176 0.109400
--0.042088 1.275636 0.116383
--0.428680 0.956160 -0.296166
--0.365528 1.061240 -0.273915
--0.271612 0.843132 -0.277322
--0.375317 0.857960 -0.293228
--0.200079 0.918983 -0.294116
--0.178178 1.215719 -0.194119
--0.075228 1.249002 -0.163810
--0.051371 1.064720 -0.292426
--0.749268 -1.055549 0.055744
--0.800770 -1.021747 -0.030796
--0.810673 -0.939807 -0.178594
--0.676875 -1.042950 -0.174886
--0.764002 -1.010285 -0.137011
--0.607360 -0.978326 -0.258591
--0.639279 -0.869686 -0.289246
--0.099286 0.882593 -0.278219
--0.026016 0.952109 -0.296002
--0.075059 0.785864 -0.213491
-0.022346 0.754006 -0.172106
--0.147283 0.691698 -0.065795
--0.152610 0.736776 -0.169325
--0.378927 -1.218959 -0.116129
--0.460774 -1.212046 -0.046903
--0.673535 -1.110549 0.021351
--0.641230 -1.110616 -0.100066
--0.552196 -1.145175 -0.127541
--0.478087 -1.206587 0.038229
--0.426464 -1.201374 0.120116
--0.602509 -1.137404 0.087065
--0.542556 -1.180242 0.029905
--0.562520 -1.097531 0.188483
--0.460930 -1.132398 0.201171
--0.595745 -1.009843 0.245200
-0.018426 -0.699933 0.003927
--0.220857 -0.669403 -0.053967
--0.136855 -0.687966 -0.029266
--0.039762 -0.737462 -0.147506
-0.013375 -0.765153 -0.187063
--0.161318 -0.763629 -0.204449
--0.102092 -0.735829 -0.155003
--0.501991 -1.011704 -0.270374
--0.385708 -1.151435 -0.209805
--0.481519 -1.109550 -0.214688
--0.084473 -0.912505 0.287939
--0.009384 -0.954155 0.296280
--0.235834 -0.958771 0.299674
--0.264772 -0.680387 0.130846
--0.343569 -0.823271 0.280057
--0.251071 -0.852290 0.278391
--0.090018 -0.814576 0.239527
--0.013113 -0.763248 0.184274
--0.028831 -0.712816 0.088689
--0.115013 -0.698739 0.069244
--0.182891 -0.715992 0.147883
--0.173557 -0.786385 0.228326
--0.299909 -1.096421 -0.266587
--0.140175 -1.059353 -0.292189
--0.198818 -1.124595 -0.263882
--0.182305 -1.281469 0.057550
--0.312375 -1.255560 -0.061168
--0.156831 -1.204198 -0.209697
--0.040651 -1.198621 -0.224542
--0.154841 -1.287160 -0.046290
--0.219968 -1.256120 -0.119186
--0.065222 0.696920 -0.002844
-0.026516 0.706518 -0.064130
--0.007319 0.755929 0.174347
--0.083290 0.717101 0.112792
-0.027699 1.128169 -0.270914
-0.014769 1.214505 -0.209679
-0.061354 1.289607 -0.072153
-0.123107 1.293828 0.011937
-0.194987 1.222109 -0.182960
-0.095568 1.249916 -0.160038
-0.005081 -1.109260 -0.279505
--0.126805 -0.982559 -0.299961
--0.185024 -0.908465 -0.290877
--0.134344 -0.830990 -0.254870
--0.030626 -0.832050 -0.249210
-0.009648 -0.910269 -0.286484
--0.050433 -0.969471 -0.298845
-0.041177 1.007630 0.300057
-0.054442 0.902242 0.284235
-0.113508 1.077381 0.288041
-0.208155 1.053604 0.290424
-0.129841 1.227050 0.187522
-0.075815 1.162148 0.250734
-0.240147 1.215023 0.181620
-0.279879 1.132062 0.249544
-0.457600 1.159578 0.170861
-0.382487 1.106421 0.246255
-0.483023 0.975561 0.286352
-0.398800 1.001107 0.289444
-0.230786 0.939193 0.298007
-0.153231 0.861608 0.272702
-0.326097 0.914284 0.298337
-0.300457 1.251699 0.085600
-0.426068 1.218448 0.073121
-0.274212 1.248636 -0.111198
-0.236083 1.278119 -0.004401
--0.058656 -1.291853 -0.064397
-0.007691 -1.257719 -0.154006
-0.059179 -1.292552 0.059443
--0.033167 -1.297935 0.031239
-0.524254 -1.172829 -0.093831
-0.680024 -1.036405 -0.180477
-0.588607 -1.019811 -0.241688
-0.688092 -0.861809 -0.281993
-0.588081 -0.921022 -0.285347
-0.545699 -0.717525 -0.283527
-0.104077 -1.060046 -0.293005
-0.103169 -0.939224 -0.294890
-0.190046 -0.865922 -0.277689
-0.358496 -1.182321 -0.186063
-0.195163 -1.103773 -0.274883
-0.139164 -1.291090 -0.027577
-0.114294 -1.259480 -0.141230
-0.201509 -1.200514 -0.206958
-0.365868 -1.225732 -0.110196
-0.438981 -1.219682 -0.045834
-0.240009 -1.277322 -0.010875
-0.293495 -1.253573 -0.086921
-0.275945 -0.973380 0.299654
-0.057305 -0.799652 0.224755
-0.052788 -0.894999 0.281478
-0.122150 -0.936773 0.294861
-0.128478 1.083846 -0.285647
-0.211785 1.139038 -0.254607
-0.308977 0.989490 -0.297975
-0.307056 1.090644 -0.268967
-0.381529 1.208847 -0.134663
-0.472080 1.207292 -0.045157
-0.487524 1.067336 -0.244599
-0.395848 1.131245 -0.224775
-0.384004 0.927480 -0.300089
-0.476426 0.961494 -0.290944
-0.554536 0.885807 -0.296415
-0.528181 0.772403 -0.292877
-0.099619 0.801283 -0.229813
-0.072511 0.906825 -0.285850
-0.145019 0.974900 -0.299572
-0.234103 0.933480 -0.297689
-0.356271 0.829250 -0.283622
-0.423502 0.747092 -0.264788
-0.202947 0.768384 -0.218615
-0.262419 0.835079 -0.272805
-0.288495 -1.255384 0.083645
-0.402270 -1.228877 0.063658
-0.232743 -1.215498 0.182993
-0.284587 -1.141892 0.242286
-0.235422 -1.056762 0.288326
-0.148416 -1.038004 0.295980
-0.093182 -1.108653 0.277987
-0.127978 -1.204079 0.213226
-0.247820 0.694114 -0.144552
-0.279902 0.717162 0.192782
-0.175906 0.762650 0.206597
-0.096975 0.728765 0.141098
-0.554793 1.119556 0.166533
-0.557149 1.031838 0.245398
-0.707704 0.981963 0.214120
-0.621770 0.975174 0.255932
-0.499888 0.883087 0.299571
-0.633511 0.819251 0.297640
-0.585835 0.888221 0.292755
-0.382817 -1.129194 0.230101
-0.450111 -1.177304 0.148434
-0.554877 -1.062688 0.224601
-0.547087 -1.134743 0.149614
-0.616089 -1.141655 -0.038338
-0.690686 -1.084182 -0.091947
-0.713191 -1.060448 0.112490
-0.626418 -1.127788 0.075791
-0.622131 -1.005820 0.238017
-0.704955 -1.003844 0.196622
-0.372015 -0.868978 0.294789
-0.353677 -0.965625 0.298543
-0.409685 -1.040978 0.275379
-0.488880 -1.017382 0.270835
-0.592248 -0.930935 0.281773
-0.636318 -0.857503 0.292346
-0.454105 -0.849356 0.297671
-0.509796 -0.931635 0.293481
-0.100362 -0.733003 -0.149052
-0.106011 -0.694022 -0.035885
-0.186966 -0.762933 -0.209494
-0.264656 -0.648763 -0.020676
-0.171153 -0.682499 0.048323
-0.644979 1.109511 0.098613
-0.723575 1.042383 0.133371
-0.643327 1.129261 -0.012966
-0.731125 1.066529 -0.063191
-0.735769 1.021555 -0.151593
-0.661112 1.016580 -0.211551
-0.577174 1.089469 -0.188525
-0.569973 1.153206 -0.089037
-0.496925 0.607536 0.209207
-0.582530 0.553639 0.226988
-0.600442 0.730008 0.294883
-0.499216 0.692742 0.261996
-0.497070 -0.760675 0.285834
-0.595361 -0.774001 0.299140
-0.462269 -0.669636 0.235124
-0.543659 -0.590459 0.226011
-0.366772 -0.666334 0.180901
-0.462710 -0.543362 -0.089479
-0.541941 -0.471227 -0.103146
-0.518095 -0.634633 -0.239425
-0.443382 -0.612238 -0.173940
-0.770376 0.902477 0.234897
-0.728863 0.828294 0.281473
-0.682704 0.684132 0.298120
-0.677508 0.589203 0.282142
-0.867906 0.716179 0.272504
-0.765689 0.743942 0.292183
-0.791940 -1.024801 0.052917
-0.774972 -1.039592 -0.044206
-0.763018 -0.975194 -0.182386
-0.773694 -0.897213 -0.236617
-0.904634 -0.917168 -0.082862
-0.822859 -0.981979 -0.104505
-0.700611 -0.764893 -0.297920
-0.632368 -0.707732 -0.295909
-0.585191 -0.575751 -0.240822
-0.595841 -0.488753 -0.193600
-0.717391 -0.584984 -0.290581
-0.647996 -0.619303 -0.281588
-0.613023 0.606343 -0.266521
-0.711991 0.567597 -0.286250
-0.576003 0.461515 -0.146199
-0.542279 0.550486 -0.195749
-0.800811 1.023281 -0.019748
-0.804401 1.009700 0.073645
-0.920616 0.910473 -0.056411
-0.852528 0.967320 -0.079500
-0.646476 -0.611121 0.278777
-0.665480 -0.711019 0.298794
-0.726785 -0.852133 0.275179
-0.769212 -0.921322 0.223643
-0.854869 -0.722552 0.275257
-0.754953 -0.761594 0.291154
-0.929233 -0.848637 -0.152528
-0.859708 -0.837695 -0.223687
-0.784008 -0.718281 -0.293370
-0.783025 -0.630882 -0.299905
-0.926067 -0.692431 -0.256085
-0.860366 -0.753068 -0.263737
-0.863227 0.882869 0.186969
-0.925960 0.787953 0.208249
-0.939989 0.895718 0.032622
-0.876337 0.936474 0.101820
-0.872470 -0.946356 0.086184
-0.939219 -0.897996 0.014703
-0.921253 -0.791732 0.209547
-0.861473 -0.893730 0.178149
-1.011950 -0.754854 0.145024
-1.015580 -0.807465 0.037848
-0.742315 -0.551148 0.290009
-0.858941 -0.609519 0.294990
-0.934448 -0.430807 0.298546
-0.954522 -0.543808 0.283316
-1.154398 -0.594227 0.030710
-1.146413 -0.433385 0.197503
-1.161911 0.448906 0.172005
-0.882196 0.608502 0.291139
-0.774028 0.543762 0.294907
-0.958682 0.438441 0.295091
-0.976412 0.550518 0.274661
-1.029955 0.785386 -0.052364
-1.008879 0.815541 0.040295
-1.014120 0.759855 0.136049
-0.676848 -0.179346 -0.010685
-0.690110 -0.190866 -0.097051
-0.669004 -0.306090 -0.142069
-0.724850 -0.173534 -0.158843
-0.744120 -0.102561 -0.167415
-0.808341 -0.257098 -0.258833
-0.748255 -0.224531 -0.205765
-0.742118 0.090151 -0.161946
-0.676606 0.180382 0.011167
-0.655121 -0.254165 0.040569
-0.625228 -0.321331 -0.041687
-0.573020 -0.403162 -0.021541
-0.735876 -0.441472 0.264158
-0.831858 -0.387813 0.288421
-0.684045 -0.281952 0.149830
-0.660509 -0.387710 0.187547
-0.858557 0.392168 0.294688
-0.768042 0.439061 0.277044
-0.612020 0.413813 0.147531
-0.591019 0.379264 0.035168
-0.627978 0.309341 0.001827
-0.662612 0.251153 0.072768
-0.701323 0.280691 0.174432
-0.687070 0.380323 0.210031
-1.118092 -0.651290 -0.059560
-1.055819 -0.750298 -0.053264
-1.001667 -0.771773 -0.141811
-0.995520 -0.699458 -0.207720
-1.108977 -0.585948 -0.159087
-1.038365 -0.615304 -0.217255
-0.917814 -0.606493 -0.282803
-0.845411 -0.577835 -0.299133
-0.987525 -0.557775 -0.268346
-0.889943 0.542554 -0.297015
-1.222820 0.415983 0.069436
-1.217593 0.305147 -0.156870
-1.144438 -0.478794 -0.179068
-1.208277 -0.427621 -0.102134
-1.235958 -0.306822 -0.122413
-1.215422 -0.406665 0.102329
-1.206357 -0.483060 0.010549
-1.185614 -0.245192 -0.213354
-0.871611 -0.192130 -0.280159
-0.818725 -0.097645 -0.243261
-1.025984 -0.096418 -0.298406
-0.980099 -0.197894 -0.299969
-0.863848 -0.413479 -0.297150
-0.817636 -0.496759 -0.296888
-0.733302 -0.504268 -0.279179
-0.674549 -0.446113 -0.231166
-0.705405 -0.364418 -0.218107
-0.799773 -0.342705 -0.270286
-1.122262 0.352151 0.242808
-1.021343 0.354050 0.288929
-0.860115 0.286518 0.285114
-0.777918 0.224508 0.231974
-0.959504 0.261832 0.299707
-0.762268 -0.219779 0.217501
-0.839147 -0.280112 0.276984
-1.001574 -0.341729 0.294266
-1.105292 -0.335866 0.256625
-0.980311 -0.132138 0.299837
-0.940644 -0.246220 0.298701
-1.165480 0.233322 -0.232930
-0.656768 0.422261 -0.204497
-0.726403 0.481505 -0.270911
-0.832377 0.463625 -0.296040
-0.863536 0.370322 -0.293756
-0.962370 0.164539 -0.298955
-1.016050 0.073361 -0.299309
-0.963117 -0.010756 -0.297558
-0.859511 -0.010374 -0.264817
-0.814212 0.075072 -0.238101
-0.858030 0.158883 -0.271600
-1.115317 0.045633 -0.276695
-1.185542 0.113619 -0.231393
-1.195818 -0.124843 -0.221636
-1.120924 -0.063365 -0.273934
-0.782512 0.114529 0.215037
-0.775154 -0.108192 0.206922
-1.164754 0.237906 0.233001
-1.094081 -0.111437 0.282761
-1.154254 -0.216724 0.243831
-1.233599 0.006519 0.188448
-1.143764 0.000654 0.263208
-1.265412 -0.086944 0.134226
-1.236869 -0.198568 0.161288
-1.256210 -0.286906 0.080777
-1.275136 -0.241531 -0.032615
-1.259630 -0.062482 -0.147524
-1.256014 0.059308 -0.153941
-1.296757 -0.052817 0.036629
-1.290030 -0.119559 -0.050287
-0.709465 -0.047610 -0.080018
-0.693844 -0.095693 0.017962
-0.723811 -0.052492 0.122263
-0.725727 0.056212 0.127028
-0.694529 0.095815 0.027164
-0.708872 0.042114 -0.076576
-1.270438 0.246598 -0.058191
-1.259910 0.298051 0.055014
-1.242345 0.212671 0.148578
-1.266931 0.099039 0.129284
-1.296990 0.060790 0.031381
-1.287049 0.123373 -0.063715
-0.789145 0.216251 -0.238613
-0.728162 0.172093 -0.163104
-0.682332 0.208230 -0.088440
-0.656445 0.285993 -0.096871
-0.687970 0.335464 -0.186786
-0.780751 0.303558 -0.252109
-0.135508 -0.782976 0.218312
-0.169909 -0.866128 0.275945
-0.243915 -0.884224 0.288209
-0.302182 -0.818153 0.271380
-0.287490 -0.731087 0.209549
-0.192495 -0.720849 0.159476
-0.370903 -1.033939 -0.283443
-0.277237 -1.023820 -0.293778
-0.273185 -0.916310 -0.296699
--0.796540 -0.878001 0.235911
--0.708436 -0.889039 0.267125
--0.646483 -0.815647 0.297459
--0.667236 -0.730681 0.299898
--0.759885 -0.717053 0.296493
--0.834289 -0.799007 0.256798
--0.612888 0.534769 -0.234888
--0.617458 0.636376 -0.277816
--0.538548 0.680382 -0.269273
--0.465081 0.646712 -0.220646
--0.464578 0.578950 -0.153904
--0.542161 0.512962 -0.160492
--0.649026 0.356285 0.149854
--0.592371 0.407559 0.104765
--0.579940 0.472056 0.162251
--0.635487 0.515446 0.238547
--0.711330 0.492828 0.267841
--0.714295 0.398239 0.237973
--0.685261 0.484037 -0.253085
--0.701891 0.392885 -0.227738
--0.790928 0.394196 -0.276596
--0.834396 0.477478 -0.297499
--0.768501 0.533539 -0.293094
--0.762294 -0.319516 0.245107
--0.835549 -0.341110 0.284045
--0.821897 -0.425285 0.290792
--0.745804 -0.402675 0.258445
-0.370568 -0.661759 -0.177739
-0.350364 -0.725302 -0.228616
-0.269312 -0.716197 -0.186586
-0.296292 -0.662405 -0.121866
--0.389697 -0.594860 -0.081527
--0.394159 -0.631719 -0.157238
--0.468058 -0.614941 -0.196464
-1.054329 0.592118 0.215565
-1.118434 0.550900 0.170789
-1.119161 0.626165 0.101492
-1.065042 0.672237 0.150358
-1.202716 0.412027 -0.127709
-1.155164 0.478490 -0.165348
-1.212313 0.466093 -0.026041
-1.057486 -0.660840 0.170278
-1.114889 -0.610178 0.129444
-1.103640 -0.536177 0.196273
-1.038992 -0.580559 0.232303
-0.302600 0.659550 0.122060
-0.285892 0.642011 0.041481
-0.346889 0.607680 -0.000538
-0.413031 -0.929655 -0.299561
-0.356975 -0.871187 -0.294306
-0.397431 -0.787875 -0.276079
-0.491573 -0.790195 -0.292010
-0.503099 -0.880806 -0.299861
--0.230347 1.037901 0.293338
--0.252574 1.115751 0.263669
--0.346938 1.086762 0.265383
--0.325746 1.006858 0.294464
--0.983754 -0.314178 0.298579
--0.900572 -0.294456 0.295570
--0.909603 -0.206607 0.292661
--0.994319 -0.224547 0.299606
--0.565330 0.413696 0.020050
--0.547525 0.461399 -0.098082
--0.527867 0.460442 -0.019763
--0.280076 1.262025 -0.066755
--0.261959 1.232560 -0.149640
--0.386260 1.232627 -0.069757
--0.259011 -1.259173 0.092090
--0.281130 -1.219505 0.163988
--0.312092 -1.260466 0.031755
--0.583252 -0.403921 0.074423
--0.608341 -0.345944 -0.011131
--0.647202 -0.269335 0.026117
--0.662918 -0.289520 0.116611
--0.630989 -0.380907 0.144753
-0.441252 0.822211 0.292631
-0.361679 0.821086 0.282074
-0.339515 0.749680 0.242679
--0.310323 -1.101878 0.262833
--0.301766 -1.024790 0.292255
--0.383030 -1.016220 0.287557
--0.392581 -1.088534 0.255606
--1.010324 -0.812112 -0.047781
--1.008865 -0.815856 0.039056
--1.058848 -0.746022 0.054108
--1.065420 -0.742579 -0.029529
--0.395237 1.137124 -0.220310
--0.471595 1.140205 -0.188323
--0.338405 1.194313 -0.178527
--0.699800 -0.109455 -0.070765
--0.689467 -0.120599 0.010743
--0.671033 -0.199956 -0.014290
--0.688217 -0.191421 -0.092680
-0.408102 0.663417 -0.203096
-0.466253 0.585630 -0.163718
-0.441485 0.557009 -0.079492
-0.377190 0.599405 -0.069782
-0.341626 0.653908 -0.145644
--0.523619 -0.644705 -0.247708
--0.511240 -0.750521 -0.285482
--0.596144 -0.773469 -0.299212
--0.656851 -0.683275 -0.295784
--0.612259 -0.606882 -0.266568
--0.473594 0.725633 0.268886
--0.475706 0.654965 0.231692
--0.393511 0.666313 0.197441
--0.386707 0.728519 0.243539
--0.226713 0.769971 0.226267
--0.213057 0.836123 0.266821
--0.309151 0.845991 0.283220
--0.317285 0.776245 0.252873
--0.213294 1.021565 -0.296975
--0.267976 1.076045 -0.279727
--0.196093 1.141235 -0.255162
--0.146277 1.086413 -0.284270
--0.839221 -0.808840 -0.250598
--0.718594 -0.852266 -0.277379
--0.786471 -0.873174 -0.243957
-0.503781 -0.508397 0.096169
-0.540943 -0.516324 0.162880
-0.590295 -0.440457 0.143772
-0.556546 -0.438798 0.070722
-1.084562 0.281819 -0.274968
-1.002617 0.250258 -0.298497
-0.963113 0.338957 -0.299498
-1.037546 0.369298 -0.282492
--0.532627 -0.474451 0.087948
--0.518299 -0.543742 0.167953
--0.443480 -0.591791 0.149136
--0.424565 -0.565344 0.064974
--0.489497 -0.501100 0.020071
--0.326613 -0.988326 -0.297219
--0.423097 -0.944084 -0.297997
--0.432796 -0.826832 -0.292235
--0.345999 -0.809039 -0.274921
--0.279305 -0.905123 -0.295123
-0.515979 -1.070956 -0.233456
-0.487322 -1.130354 -0.191475
--0.925013 -0.626671 0.276302
--0.865072 -0.495252 0.300282
--0.935223 -0.536835 0.289813
--0.694036 0.225684 0.130812
--0.667444 0.225671 0.053514
--0.638271 0.289192 0.023586
--1.071978 -0.687841 0.123612
--1.033204 -0.671857 0.189812
--1.059406 -0.587136 0.213413
--1.108029 -0.518786 -0.200463
--1.005976 -0.519367 -0.269572
--1.051147 -0.573816 -0.226187
--0.256151 -0.689419 -0.141839
--0.237598 -0.737223 -0.197979
--0.317606 -0.741037 -0.229220
--0.332805 -0.682788 -0.179335
--0.434458 -0.956063 0.295992
--0.418513 -0.880376 0.299329
--0.520850 -0.950210 0.288273
--0.406629 -0.654765 0.193769
--0.435712 -0.703126 0.245543
--0.365948 -0.743199 0.246380
--0.335779 -0.691988 0.191801
-0.845940 -0.044368 0.258445
-0.920449 -0.047701 0.289810
-0.924185 0.051448 0.290867
-0.850188 0.054180 0.261087
-1.002923 0.179360 0.299276
-0.988118 0.102835 0.300023
-1.085193 0.084243 0.286641
-1.098530 0.165028 0.278701
-1.096941 0.491263 -0.222004
-1.047839 0.454144 -0.264349
-0.986637 0.533674 -0.274259
-1.038420 0.573741 -0.235162
-0.345377 -0.609810 0.022919
-0.373212 -0.611043 0.096142
-0.439669 -0.553656 0.065038
-0.418793 -0.561034 -0.005764
-0.197046 0.678459 -0.061239
-0.214682 0.666422 0.011519
-0.131791 0.691916 0.050055
-0.108886 0.692463 -0.025146
-0.959843 -0.396427 -0.297619
-1.020302 -0.294707 -0.293721
-1.106118 -0.311297 -0.260537
-1.092619 -0.419161 -0.247120
-1.008918 -0.464677 -0.278913
-1.149537 0.561453 -0.109365
-1.091539 0.650928 -0.129086
-1.087481 0.700464 -0.061449
-1.136442 0.630776 0.011438
-1.174761 0.553075 -0.030822
-1.133565 0.623716 -0.062652
-1.038339 -0.377038 -0.281436
-0.162973 0.680410 -0.005997
-0.392771 -0.583099 0.044769
-1.046037 0.514975 -0.250228
-1.042142 0.131698 0.296308
-0.887198 0.005667 0.278026
--0.385225 -0.697638 0.220953
--0.287247 -0.712424 -0.190682
--0.361292 -0.892823 -0.298239
--0.480323 -0.532860 0.101348
-1.021875 0.310137 -0.291827
-0.547213 -0.474621 0.119170
--0.208484 1.085819 -0.281035
--0.265340 0.807132 0.259915
--0.432875 0.692462 0.237538
--0.579202 -0.687890 -0.282278
-0.408028 0.608769 -0.136862
--0.685228 -0.154704 -0.040935
--1.038974 -0.782102 0.003329
--0.345953 -1.058978 0.277886
--0.622988 -0.336168 0.068561
--0.333663 1.228897 -0.124423
--0.946411 -0.259107 0.299701
--0.288648 1.060153 0.283369
-0.435763 -0.849970 -0.296752
-1.080817 -0.600194 0.185898
-1.187064 0.491222 -0.095295
-1.092250 0.614291 0.162193
-0.321060 -0.689488 -0.180002
--0.790436 -0.372131 0.272004
--0.750981 0.453802 -0.274045
--0.641491 0.433991 0.198160
--0.538569 0.594090 -0.225269
--0.738466 -0.806338 0.284981
-0.335689 -0.955376 -0.300047
-0.219879 -0.794505 0.243485
-0.714547 0.251899 -0.176459
-1.284759 0.177475 0.041395
-0.701976 -0.000094 0.025814
-1.293667 0.001496 -0.060971
-1.283623 -0.167662 0.057339
-1.196388 -0.100567 0.222714
-1.188741 0.115287 0.227322
-0.781304 0.003527 0.205291
-1.197613 -0.005335 -0.224563
-0.910174 0.076370 -0.287542
-0.754686 0.394175 -0.260221
-1.080500 0.163865 -0.284556
-1.049075 -0.230342 0.290757
-0.863443 -0.156463 0.273149
-0.886441 0.162727 0.283041
-1.065795 0.255608 0.284282
-0.765245 -0.425605 -0.272580
-0.919351 -0.101886 -0.290301
-1.097663 -0.188737 -0.276717
-1.248133 -0.364149 -0.011244
-1.170256 -0.364441 -0.197203
-1.243852 0.364273 -0.044454
-1.133731 0.378613 -0.226953
-0.950037 0.445355 -0.295828
-0.913630 -0.503915 -0.296384
-1.066848 -0.520520 -0.234196
-1.061512 -0.683630 -0.143390
-0.640481 0.333956 0.111468
-0.770423 0.333989 0.252824
-0.745613 -0.331928 0.237063
-0.616144 -0.353610 0.078030
-0.697696 0.128961 -0.076097
-0.656083 0.245281 -0.019514
-0.782450 0.143255 -0.219342
-0.783315 -0.174863 -0.224851
-0.735358 -0.287864 -0.213594
-0.663794 -0.246043 -0.068058
-0.700057 -0.130073 -0.084843
-1.078931 0.719457 0.042099
-0.872559 0.497771 0.299897
-1.064970 0.471428 0.248964
-1.174830 0.533671 0.073146
-1.165577 -0.517894 0.117455
-1.046029 -0.459347 0.263552
-0.843475 -0.495601 0.299050
-1.087216 -0.700345 0.058688
-0.947530 -0.855401 0.116531
-0.946399 0.851423 0.121924
-0.854614 -0.665396 -0.288293
-0.933853 -0.771911 -0.211684
-0.821348 -0.826783 0.249217
-0.755945 -0.660166 0.299903
-0.870917 0.964023 0.010052
-0.630665 0.511276 -0.234018
-0.656377 -0.532049 -0.256787
-0.711577 -0.672076 -0.299239
-0.847823 -0.914921 -0.168488
-0.858428 -0.976098 -0.011968
-0.778314 0.647835 0.299678
-0.825945 0.814106 0.254337
-0.520044 -0.550086 -0.175867
-0.499485 -0.490291 0.002695
-0.454858 -0.586310 0.153266
-0.564152 -0.681757 0.276917
-0.587484 0.639916 0.269631
-0.659302 1.089643 -0.122970
-0.729996 1.073118 0.036291
-0.280777 -0.661310 0.102565
-0.196742 -0.690763 -0.102394
-0.545238 -0.849572 0.299153
-0.430846 -0.945793 0.297467
-0.678016 -0.933021 0.256883
-0.706615 -1.090987 0.012267
-0.631560 -1.075420 0.170197
-0.474461 -1.102604 0.223018
-0.524459 0.792483 0.295663
-0.677042 0.903799 0.271064
-0.638259 1.051658 0.190681
-0.209779 0.689675 0.109820
-0.290751 0.642813 -0.056385
-0.186576 -1.136193 0.258473
-0.342557 -1.203144 0.163966
-0.317527 0.737031 -0.225710
-0.167898 0.865240 -0.275581
-0.452548 0.850725 -0.297566
-0.484132 1.156008 -0.161150
-0.395626 1.031177 -0.280414
-0.222405 1.037605 -0.292985
-0.106590 -0.851849 0.264438
-0.198043 -0.961127 0.299476
-0.309138 -0.900195 0.296481
-0.341555 -1.253686 -0.018260
-0.213467 -1.260160 -0.111836
-0.296387 -1.130088 -0.247429
-0.192045 -0.986292 -0.299564
-0.288130 -0.801942 -0.261039
-0.446086 -0.702796 -0.248639
-0.595047 -0.807409 -0.299158
-0.680988 -0.956747 -0.244088
-0.592480 -1.104059 -0.159214
-0.433448 -1.183813 -0.148564
-0.039850 -1.294161 -0.053755
-0.349873 1.251193 -0.025144
-0.263298 0.817737 0.264375
-0.415561 0.897538 0.299856
-0.477293 1.073650 0.243567
-0.351666 1.193906 0.172983
-0.176656 1.151739 0.250687
-0.134091 0.972600 0.299294
--0.087780 -0.904717 -0.286028
-0.020739 -1.006647 -0.299486
-0.166393 1.275452 -0.089359
-0.113207 1.179685 -0.236258
-0.025541 0.705468 0.058925
--0.103112 -1.258094 -0.143523
--0.243233 -1.276510 -0.006395
--0.220601 -1.012859 -0.297423
--0.096562 -1.128849 -0.269241
--0.097820 -0.741547 0.162203
--0.269248 -0.752295 0.222120
--0.335014 -0.930542 0.299118
--0.014468 -0.848928 0.259489
--0.399618 -1.054522 -0.271504
--0.075808 -0.774613 -0.202316
--0.166639 -0.709791 -0.127486
--0.064692 -0.696862 0.003664
-0.022457 -0.717398 -0.100987
--0.483929 -1.037551 0.262555
--0.516662 -1.164995 0.118062
--0.596990 -1.153686 -0.024490
--0.466923 -1.177271 -0.135536
--0.392522 -1.238452 0.011467
--0.062508 0.720967 -0.116611
-0.000283 0.841427 -0.254475
--0.527635 -0.881717 -0.298495
--0.715712 -0.946184 -0.233992
--0.725448 -1.071146 -0.062676
--0.085621 1.167435 -0.246122
--0.124362 0.990962 -0.299777
--0.306633 0.961511 -0.298678
-0.019507 1.228251 0.194642
-0.010721 1.299333 0.020677
--0.164692 1.274488 -0.090192
--0.542117 -0.550397 -0.195481
--0.354184 -0.629887 0.113838
--0.314622 -0.639677 -0.086426
--0.418548 -0.705238 -0.239834
--0.555494 -0.429030 -0.027770
--0.485255 1.054094 -0.252320
--0.824014 -0.994260 0.072133
--0.120315 0.783749 0.216169
--0.043365 0.945925 0.294151
--0.140639 1.115889 0.272260
--0.868483 -0.866283 -0.195326
--0.949294 -0.887371 -0.012285
-0.934768 0.629323 -0.271342
-0.716838 0.657872 -0.297925
-0.637481 0.815215 -0.298063
-0.741681 0.945776 -0.220741
-0.886355 0.900773 -0.141404
-1.011776 0.749745 -0.150310
--0.849358 -0.722809 -0.276476
--0.963078 -0.604729 -0.266292
--0.820903 -0.503451 -0.296998
--0.715608 -0.600052 -0.291700
--0.591372 -0.476112 0.178584
--0.496234 -0.631264 0.225554
--0.295122 0.706965 0.187750
--0.417277 0.810449 0.286567
--0.758337 -0.941245 0.215972
--0.606537 -0.905749 0.285800
--0.592261 -0.747008 0.295486
--0.319623 0.622724 0.011634
--0.336120 0.766622 -0.251861
--0.230614 0.690614 -0.126746
--1.011110 -0.762588 0.137434
--0.866564 -0.696891 0.277708
--0.768817 -0.504952 0.288830
--0.926781 -0.414174 0.298443
--0.566321 0.687500 0.279264
--0.740593 0.769341 0.291323
--0.869486 0.657424 0.286230
--0.773690 -0.332442 -0.254055
--0.654199 -0.281884 -0.082753
--0.477093 0.522429 -0.063321
--0.761076 0.932961 0.219033
--1.023409 0.705858 0.176122
--0.316669 1.171607 0.208738
--0.333856 1.255383 0.022199
--0.498825 1.182537 -0.097484
--0.662063 1.118218 0.018235
--0.634137 1.050324 0.194884
--0.444113 1.021245 0.276952
--0.989021 0.836556 0.046266
--0.871789 0.945475 0.088068
--0.800765 1.019591 -0.041067
--1.111179 -0.593964 -0.148119
--1.113799 -0.663495 0.041517
--1.113335 -0.501697 0.201047
--0.470258 0.711833 -0.261737
--0.901328 -0.227061 -0.291633
--1.150844 -0.434771 -0.191904
--1.082069 -0.281890 -0.275609
--1.146876 -0.112645 0.258782
--0.965621 -0.122543 0.298437
--0.815534 -0.235538 0.258090
--0.688630 -0.187247 0.089101
--1.218876 -0.364691 0.125998
--1.234556 -0.209229 0.162613
--1.243078 -0.358125 -0.056401
--1.291799 -0.135678 0.012645
--1.179781 -0.165963 -0.231119
--1.262744 -0.217687 -0.104573
--0.948766 0.054904 0.296129
--0.871901 -0.050292 -0.272258
--1.193823 0.030164 0.228481
--1.103530 0.121596 0.278886
--0.695327 0.585352 -0.285173
--0.969277 0.814429 -0.138299
--0.823344 0.923277 -0.183927
--0.660499 0.902212 -0.274850
--0.614177 0.735157 -0.296825
--0.700365 -0.021777 -0.009941
--0.763507 0.038492 -0.185001
--0.744164 0.304834 -0.225524
--0.815437 0.181977 -0.250976
--1.277097 0.090381 0.105103
--1.298741 0.010112 -0.018292
--1.170109 0.266349 0.223723
--1.093022 0.400462 0.251565
--1.134482 0.568923 0.133131
--1.257375 0.301626 -0.061501
--1.263764 0.237232 0.091195
--1.157995 -0.013609 -0.253936
--1.249421 0.073709 -0.162266
--1.224630 0.213093 -0.174756
--1.102260 0.263601 -0.269010
--0.978337 0.179315 -0.300004
--1.009465 0.043444 -0.300077
--0.702293 0.143041 0.097832
--0.652204 0.262211 -0.041095
--0.799087 0.471327 0.290908
--0.901325 0.345953 0.298035
--0.827719 0.162785 0.255674
--0.573771 0.537543 0.210402
--0.608195 0.352016 0.040296
--0.539532 0.459420 0.071839
--1.161672 0.562918 -0.071742
--1.022200 0.663911 -0.205014
--0.873140 0.565987 -0.297309
--0.899071 0.420435 -0.299924
--1.077667 0.384472 -0.263383
--1.194517 0.427458 -0.132809
--0.221954 -1.074123 0.283686
--0.197812 -1.236929 0.161346
--0.027199 -1.269649 0.131024
-0.033153 -1.167080 0.248574
--0.071734 -1.020248 0.299181
-0.553785 0.441919 0.070900
-0.509938 0.535755 0.148952
-0.415637 0.563573 0.011890
-0.504684 0.506203 -0.092321
--0.100478 -1.165557 0.247145
--1.059598 0.514116 -0.241154
--0.716764 0.297246 0.199604
--1.134249 0.133226 -0.264320
--1.223679 0.409124 0.075771
--1.286767 0.157405 -0.040141
--0.931157 0.296156 -0.299125
--0.703442 0.148197 -0.105304
--1.190109 0.324692 -0.187302
--0.816138 0.749402 -0.280168
--1.215038 0.153564 0.197816
--0.876619 0.088736 -0.275358
--1.006467 0.225050 0.298517
--1.262985 -0.073425 -0.140711
--1.271486 -0.262955 0.033891
--0.783521 -0.029131 0.207660
--1.071746 -0.007821 0.291655
--1.199206 -0.295942 -0.186709
--1.264506 -0.056967 0.136794
--1.034512 -0.114702 -0.297369
--1.199315 -0.501852 0.000603
--0.911068 0.920378 -0.055649
--0.499617 1.172257 0.120120
--1.088676 0.709305 -0.014877
--0.758306 1.032974 0.104410
--0.614517 0.425404 -0.161404
--0.739086 -0.145185 -0.170103
--0.699324 0.587635 0.287443
--0.987609 0.533904 0.273485
--0.993118 -0.606965 0.251690
--1.087055 -0.285907 0.272603
--0.388057 0.637913 -0.159614
--0.604151 0.883993 0.291897
--0.446252 0.589326 0.147701
--0.671295 -0.638783 0.291060
-0.832245 0.794109 -0.260058
--1.016082 -0.753739 -0.139099
--0.894835 0.824646 0.207504
--0.247091 0.930871 0.297818
--0.880746 -0.870640 0.179956
--0.672892 1.055080 -0.163345
--0.692494 -0.344178 0.196723
--0.437475 -0.548657 -0.031920
--0.972922 -0.422594 -0.293486
--0.156200 1.264978 0.120963
--0.481776 0.854096 -0.299669
--0.288375 1.159083 -0.228295
--0.831926 -0.977799 -0.098569
--0.685803 -0.773099 -0.298065
--0.172297 0.816041 -0.249909
--0.662959 -0.434336 -0.216522
--0.669757 -1.066680 0.150107
--0.580343 -1.074976 -0.202341
--0.164271 -0.881216 0.281444
--0.280485 -1.197167 -0.193463
--0.157734 0.686583 0.046142
-0.010477 1.266321 -0.139080
--0.197007 -0.676013 0.049491
-0.031927 1.093881 0.285191
--0.241454 -0.811989 -0.258068
-0.305172 1.026459 0.291551
-0.185417 1.269667 0.099601
--0.109657 -1.295002 0.016156
--0.354647 -1.170912 0.199913
-0.482117 -0.991245 -0.281734
-0.296864 1.182822 -0.204655
-0.308390 0.901747 -0.296522
-0.164858 -1.271650 0.100107
-0.129654 0.719653 -0.133167
-0.550309 0.952475 0.283317
-0.522361 -1.187875 0.038151
-0.554652 -0.992806 0.267233
-0.066576 -1.001324 0.299941
-0.084642 -0.823150 -0.243917
-0.078487 -0.720663 0.119464
-0.546613 1.173373 0.054810
-0.048774 1.020560 -0.299526
-0.572081 0.994658 -0.261348
-0.086106 -1.178953 -0.236369
-0.389068 0.664193 0.190664
-0.324206 -1.056296 0.281174
-0.387759 -0.759751 0.261106
-0.368951 -0.608104 -0.081707
-0.682709 0.762105 0.299490
-0.750020 -1.029661 -0.123713
-0.585383 -0.652051 -0.272713
-0.507029 0.656832 -0.246647
-0.790019 1.012750 -0.096791
-0.676726 -0.791754 0.297507
-0.780244 -0.808226 -0.272429
-0.072286 0.802450 0.228718
--0.445675 -0.791086 0.284580
-0.794911 0.966254 0.162237
-0.791395 -0.982968 0.146609
-0.966902 -0.670928 0.241519
-0.979615 0.675052 0.231564
-0.630714 -0.501266 0.228137
-0.664544 0.483615 0.240031
-0.975127 -0.635308 -0.251803
-1.103024 0.571856 -0.176418
-1.168994 -0.543437 -0.080376
-0.907130 -0.302976 -0.296636
-0.931345 0.345940 0.300500
-0.909958 -0.338604 0.298790
-0.889916 0.259396 -0.290507
-0.611543 0.370879 -0.094045
-0.619942 -0.394671 -0.138017
-0.978067 0.854318 -0.032130
-0.983555 -0.839775 -0.064698
-1.050455 -0.009957 -0.296278
-1.019182 -0.004924 0.298903
-1.252915 -0.184549 -0.138450
-0.778990 -0.558492 -0.297438
-0.761885 -0.007291 -0.182637
-0.795919 0.534301 -0.297579
-1.242510 0.182706 -0.157288
-1.196213 -0.316951 0.183497
-0.703267 -0.168386 0.112542
-0.710297 0.170562 0.129136
-1.207701 0.332450 0.162218
-1.279836 0.005212 0.106332
diff --git a/data/points/tore3D_300.weights b/data/points/tore3D_300.weights
new file mode 100644
index 00000000..8087721d
--- /dev/null
+++ b/data/points/tore3D_300.weights
@@ -0,0 +1,300 @@
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644
index 32b3f6f9..00000000
--- a/debian/changelog
+++ /dev/null
@@ -1,5 +0,0 @@
-gudhi (1.3.0-1) unstable; urgency=low
-
- * Initial release.
-
- -- Marc Glisse <marc.glisse@inria.fr> Sat, 26 Mar 2016 10:51:01 +0100
diff --git a/debian/compat b/debian/compat
deleted file mode 100644
index ec635144..00000000
--- a/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-9
diff --git a/debian/control b/debian/control
deleted file mode 100644
index 838234a9..00000000
--- a/debian/control
+++ /dev/null
@@ -1,26 +0,0 @@
-Source: gudhi
-Priority: optional
-Maintainer: Marc Glisse <marc.glisse@normalesup.org>
-Build-Depends: debhelper (>= 9), cmake, libboost-dev
-Standards-Version: 3.9.6
-Section: libs
-Homepage: http://gudhi.gforge.inria.fr/
-#Vcs-Git: git://anonscm.debian.org/collab-maint/gudhi.git
-#Vcs-Browser: https://anonscm.debian.org/gitweb/?p=collab-maint/gudhi.git;a=summary
-
-Package: libgudhi-dev
-Section: libdevel
-Architecture: all
-Depends: libboost-dev, ${misc:Depends}
-Recommends: libcgal-dev
-Description: Gudhi library for topological data analysis
- The Gudhi library (Geometric Understanding in Higher Dimensions) is a generic
- open source C++ library for Computational Topology and Topological Data
- Analysis (TDA).
- .
- The current release of the GUDHI library includes:
- * Data structures to represent, construct and manipulate simplicial and
- cubical complexes, including alpha-complex, witness complex, Rips complex.
- * Algorithms to compute persistent homology and multi-field persistent
- homology.
- * Simplication of simplicial complexes by edge contraction.
diff --git a/debian/copyright b/debian/copyright
deleted file mode 100644
index 2e1f88cd..00000000
--- a/debian/copyright
+++ /dev/null
@@ -1,28 +0,0 @@
-Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
-Upstream-Name: gudhi
-Upstream-Contact: gudhi-users@lists.gforge.inria.fr
-Source: <url://http://gudhi.gforge.inria.fr/>
-
-Files: *
-Copyright: 2014-2016 Inria Sophia Antipolis-Méditerranée
- 2014-2016 Inria Saclay - Ile de France
- 2014-2016 Université Nice Sophia Antipolis
-License: GPL-3.0+
-
-License: GPL-3.0+
- 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 package 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 <https://www.gnu.org/licenses/>.
- .
- On Debian systems, the complete text of the GNU General
- Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
-
diff --git a/debian/docs b/debian/docs
deleted file mode 100644
index 878a2ba1..00000000
--- a/debian/docs
+++ /dev/null
@@ -1,2 +0,0 @@
-Conventions.txt
-README
diff --git a/debian/rules b/debian/rules
deleted file mode 100755
index c9b049af..00000000
--- a/debian/rules
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/make -f
-# See debhelper(7) (uncomment to enable)
-# output every command that modifies files on the build system.
-#export DH_VERBOSE = 1
-
-# see EXAMPLES in dpkg-buildflags(1) and read /usr/share/dpkg/*
-DPKG_EXPORT_BUILDFLAGS = 1
-include /usr/share/dpkg/default.mk
-
-# see FEATURE AREAS in dpkg-buildflags(1)
-#export DEB_BUILD_MAINT_OPTIONS = hardening=+all
-
-# see ENVIRONMENT in dpkg-buildflags(1)
-# package maintainers to append CFLAGS
-#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
-# package maintainers to append LDFLAGS
-#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
-
-
-# main packaging script based on dh7 syntax
-%:
- dh $@
-
-# dh_make generated override targets
-# This is example for Cmake (See https://bugs.debian.org/641051 )
-#override_dh_auto_configure:
-# dh_auto_configure -- \
-# -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH)
diff --git a/debian/source/format b/debian/source/format
deleted file mode 100644
index 163aaf8d..00000000
--- a/debian/source/format
+++ /dev/null
@@ -1 +0,0 @@
-3.0 (quilt)
diff --git a/doc/Alpha_complex/COPYRIGHT b/doc/Alpha_complex/COPYRIGHT
new file mode 100644
index 00000000..dbad2380
--- /dev/null
+++ b/doc/Alpha_complex/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): Vincent Rouvreau
+
+Copyright (C) 2015 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/Alpha_complex/Intro_alpha_complex.h b/doc/Alpha_complex/Intro_alpha_complex.h
index f3126169..69959fc5 100644
--- a/doc/Alpha_complex/Intro_alpha_complex.h
+++ b/doc/Alpha_complex/Intro_alpha_complex.h
@@ -4,7 +4,7 @@
*
* Author(s): Vincent Rouvreau
*
- * Copyright (C) 2015 INRIA Saclay (France)
+ * Copyright (C) 2015 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
@@ -39,7 +39,8 @@ namespace alpha_complex {
* Alpha_complex is a <a target="_blank" href="https://en.wikipedia.org/wiki/Simplicial_complex">simplicial complex</a>
* constructed from the finite cells of a Delaunay Triangulation.
*
- * The filtration value of each simplex is computed as the square of the circumradius of the simplex if the circumsphere is empty (the simplex is then said to be Gabriel), and as the minimum of the filtration
+ * The filtration value of each simplex is computed as the square of the circumradius of the simplex if the
+ * circumsphere is empty (the simplex is then said to be Gabriel), and as the minimum of the filtration
* values of the codimension 1 cofaces that make it not Gabriel otherwise.
*
* All simplices that have a filtration value strictly greater than a given alpha squared value are not inserted into
@@ -47,42 +48,45 @@ namespace alpha_complex {
*
* \image html "alpha_complex_representation.png" "Alpha-complex representation"
*
- * Alpha_complex is constructing a `Simplex_tree` using <a target="_blank"
+ * Alpha_complex is constructing a <a target="_blank"
* href="http://doc.cgal.org/latest/Triangulation/index.html#Chapter_Triangulations">Delaunay Triangulation</a>
* \cite cgal:hdj-t-15b from <a target="_blank" href="http://www.cgal.org/">CGAL</a> (the Computational Geometry
- * Algorithms Library \cite cgal:eb-15b).
+ * Algorithms Library \cite cgal:eb-15b) and is able to create a `SimplicialComplexForAlpha`.
*
* The complex is a template class requiring an Epick_d <a target="_blank"
* href="http://doc.cgal.org/latest/Kernel_d/index.html#Chapter_dD_Geometry_Kernel">dD Geometry Kernel</a>
* \cite cgal:s-gkd-15b from CGAL as template parameter.
*
- * \remark When Alpha_complex is constructed with an infinite value of alpha, the complex is a Delaunay complex.
+ * \remark When the simplicial complex is constructed with an infinite value of alpha, the complex is a Delaunay
+ * complex.
*
* \section pointsexample Example from points
*
- * This example builds the Delaunay triangulation from the given points in a 2D static kernel, and initializes the
- * alpha complex with it.
+ * This example builds the Delaunay triangulation from the given points in a 2D static kernel, and creates a
+ * `Simplex_tree` with it.
*
- * Then, it is asked to display information about the alpha complex.
+ * Then, it is asked to display information about the simplicial complex.
*
* \include Alpha_complex/Alpha_complex_from_points.cpp
*
* When launching:
*
- * \code $> ./alphapoints
+ * \code $> ./Alpha_complex_example_from_points
* \endcode
*
* the program output is:
*
* \include Alpha_complex/alphaoffreader_for_doc_60.txt
*
- * \section algorithm Algorithm
+ * \section createcomplexalgorithm Create complex algorithm
*
* \subsection datastructure Data structure
*
- * In order to build the alpha complex, first, a Simplex tree is built from the cells of a Delaunay Triangulation.
- * (The filtration value is set to NaN, which stands for unknown value):
- * \image html "alpha_complex_doc.png" "Simplex tree structure construction example"
+ * In order to create the simplicial complex, first, it is built from the cells of the Delaunay Triangulation.
+ * The filtration values are set to NaN, which stands for unknown value.
+ *
+ * In example, :
+ * \image html "alpha_complex_doc.png" "Simplicial complex structure construction example"
*
* \subsection filtrationcomputation Filtration value computation algorithm
*
@@ -129,12 +133,14 @@ namespace alpha_complex {
*
* \subsubsection nondecreasing Non decreasing filtration values
*
- * As the squared radii computed by CGAL are an approximation, it might happen that these alpha squared values do not quite define a proper filtration (i.e. non-decreasing with respect to inclusion).
- * We fix that up by calling `Simplex_tree::make_filtration_non_decreasing()`.
+ * As the squared radii computed by CGAL are an approximation, it might happen that these alpha squared values do not
+ * quite define a proper filtration (i.e. non-decreasing with respect to inclusion).
+ * We fix that up by calling `SimplicialComplexForAlpha::make_filtration_non_decreasing()`.
*
* \subsubsection pruneabove Prune above given filtration value
*
- * The simplex tree is pruned from the given maximum alpha squared value (cf. `Simplex_tree::prune_above_filtration()`).
+ * The simplex tree is pruned from the given maximum alpha squared value (cf.
+ * `SimplicialComplexForAlpha::prune_above_filtration()`).
* In the following example, the value is given by the user as argument of the program.
*
*
@@ -149,7 +155,7 @@ namespace alpha_complex {
*
* When launching:
*
- * \code $> ./alphaoffreader ../../data/points/alphacomplexdoc.off 32.0
+ * \code $> ./Alpha_complex_example_from_off ../../data/points/alphacomplexdoc.off 32.0
* \endcode
*
* the program output is:
diff --git a/doc/Alpha_complex/alpha_complex_doc.ipe b/doc/Alpha_complex/alpha_complex_doc.ipe
index baf0d26a..71e5ce6c 100644
--- a/doc/Alpha_complex/alpha_complex_doc.ipe
+++ b/doc/Alpha_complex/alpha_complex_doc.ipe
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<!DOCTYPE ipe SYSTEM "ipe.dtd">
<ipe version="70107" creator="Ipe 7.1.10">
-<info created="D:20150603143945" modified="D:20160406112209"/>
+<info created="D:20150603143945" modified="D:20160921180211"/>
<ipestyle name="basic">
<symbol name="arrow/arc(spx)">
<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
@@ -278,35 +278,7 @@ h
320 580 l
280 660 l
</path>
-<path matrix="1 0 0 1 104.05 -60.1773" stroke="black">
-4 0 0 4 320 704 e
-</path>
-<path matrix="1 0 0 1 104.05 -60.1773" stroke="black">
-322.919 706.788 m
-317.189 701.058 l
-317.189 701.203 l
-</path>
-<path matrix="1 0 0 1 104.05 -60.1773" stroke="black">
-317.551 706.934 m
-322.629 701.058 l
-</path>
-<path matrix="1 0 0 1 50 0" stroke="black">
-240 620 m
-220 600 l
-</path>
-<path matrix="1 0 0 1 50 0" stroke="black">
-240 620 m
-220 640 l
-</path>
-<text transformations="translations" pos="180 620" stroke="black" type="label" width="97.274" height="6.926" depth="1.93" valign="baseline">Simplex tree structure</text>
-<path stroke="black">
-280 630 m
-170 630 l
-</path>
-<path stroke="black">
-280 610 m
-170 610 l
-</path>
+<text matrix="1 0 0 1 76 36" transformations="translations" pos="180 620" stroke="black" type="label" width="153.148" height="6.926" depth="1.93" valign="baseline">Simplicial complex data structure :</text>
<use matrix="1 0 0 1 -239.3 -10.1537" name="mark/fdisk(sfx)" pos="300 720" size="normal" stroke="black" fill="white"/>
<use matrix="1 0 0 1 -240 0" name="mark/fdisk(sfx)" pos="370 690" size="normal" stroke="black" fill="white"/>
<use matrix="1 0 0 1 -240 0" name="mark/fdisk(sfx)" pos="280 660" size="normal" stroke="black" fill="white"/>
@@ -314,282 +286,11 @@ h
<use matrix="1 0 0 1 -240 0" name="mark/fdisk(sfx)" pos="370 580" size="normal" stroke="black" fill="white"/>
<use matrix="1 0 0 1 -240 0" name="mark/fdisk(sfx)" pos="350 520" size="normal" stroke="black" fill="white"/>
<use matrix="1 0 0 1 -240 0" name="mark/fdisk(sfx)" pos="290 530" size="normal" stroke="black" fill="white"/>
-<text matrix="1 0 0 1 4 -96" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
-<path matrix="1 0 0 1 4 -96" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<text matrix="1 0 0 1 24 -76" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
-<path matrix="1 0 0 1 36 -76" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<path matrix="1 0 0 1 24 -76" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<text matrix="1 0 0 1 24 -76" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
-<text matrix="1 0 0 1 12 -76" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
-<path matrix="1 0 0 1 12 -76" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<path matrix="1 0 0 1 24 -96" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<text matrix="1 0 0 1 12 -96" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
-<text matrix="1 0 0 1 64 -76" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
-<path matrix="1 0 0 1 64 -76" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<text matrix="1 0 0 1 52 -76" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
-<path matrix="1 0 0 1 52 -76" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<path matrix="1 0 0 1 48 -96" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<text matrix="1 0 0 1 36 -96" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
-<text matrix="1 0 0 1 104 -76" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
-<path matrix="1 0 0 1 104 -76" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<text matrix="1 0 0 1 92 -76" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
-<path matrix="1 0 0 1 92 -76" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<path matrix="1 0 0 1 96 -96" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<text matrix="1 0 0 1 84 -96" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
-<text matrix="1 0 0 1 148 -76" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
-<path matrix="1 0 0 1 148 -76" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<text matrix="1 0 0 1 136 -76" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
-<path matrix="1 0 0 1 136 -76" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<path matrix="1 0 0 1 120 -76" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<text matrix="1 0 0 1 108 -76" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
-<path matrix="1 0 0 1 120 -76" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<text matrix="1 0 0 1 108 -76" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
-<path matrix="1 0 0 1 48 -96" stroke="black">
-292 716 m
-292 728 l
-316 728 l
-316 716 l
-h
-</path>
-<path matrix="1 0 0 1 48 -96" stroke="black">
-316 716 m
-316 728 l
-340 728 l
-340 716 l
-h
-</path>
-<path matrix="1 0 0 1 48 -96" stroke="black">
-340 716 m
-340 728 l
-364 728 l
-364 716 l
-h
-</path>
-<path matrix="1 0 0 1 48 -96" stroke="black">
-364 716 m
-364 728 l
-388 728 l
-388 716 l
-h
-</path>
-<path matrix="1 0 0 1 48 -96" stroke="black">
-388 716 m
-388 728 l
-412 728 l
-412 716 l
-h
-</path>
-<path matrix="1 0 0 1 48 -96" stroke="black">
-412 716 m
-412 728 l
-436 728 l
-436 716 l
-h
-</path>
-<path matrix="1 0 0 1 48 -96" stroke="black">
-436 716 m
-436 728 l
-460 728 l
-460 716 l
-h
-</path>
-<text matrix="1 0 0 1 48 -96" transformations="translations" pos="304 720" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">0</text>
-<text matrix="1 0 0 1 48 -96" transformations="translations" pos="328 720" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
-<text matrix="1 0 0 1 48 -96" transformations="translations" pos="352 720" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
-<text matrix="1 0 0 1 48 -96" transformations="translations" pos="376 720" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
-<text matrix="1 0 0 1 48 -96" transformations="translations" pos="400 720" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
-<text matrix="1 0 0 1 48 -96" transformations="translations" pos="424 720" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
-<text matrix="1 0 0 1 48 -96" transformations="translations" pos="448 720" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
-<path matrix="1 0 0 1 -12 -96" stroke="black">
-436 708 m
-436 716 l
-</path>
-<path matrix="1 0 0 1 28 -96" stroke="black">
-364 708 m
-364 716 l
-</path>
-<path matrix="1 0 0 1 36 -96" stroke="black">
-364 688 m
-364 696 l
-</path>
-<path matrix="1 0 0 1 36 -96" stroke="black">
-320 688 m
-320 696 l
-</path>
-<path matrix="1 0 0 1 36 -96" stroke="black">
-296 708 m
-308 716 l
-308 716 l
-</path>
-<path matrix="1 0 0 1 48 -96" stroke="black">
-264 688 m
-268 696 l
-</path>
-<path matrix="1 0 0 1 40 -96" stroke="black">
-292 688 m
-292 696 l
-</path>
-<path matrix="1 0 0 1 36 -96" stroke="black">
-388 736 m
-388 728 l
-</path>
-<path stroke="black">
-372 612 m
-376 620 l
-</path>
-<path stroke="black">
-448 612 m
-448 620 l
-</path>
-<text matrix="1 0 0 1 80 -76" transformations="translations" pos="304 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
-<path matrix="1 0 0 1 80 -76" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<path matrix="1 0 0 1 80 -96" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<text matrix="1 0 0 1 68 -96" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
-<path matrix="1 0 0 1 24 -96" stroke="black">
-364 688 m
-364 696 l
-</path>
-<path matrix="1 0 0 1 136 -96" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<text matrix="1 0 0 1 124 -96" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
-<path matrix="1 0 0 1 136 -96" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<text matrix="1 0 0 1 124 -96" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
-<path matrix="1 0 0 1 4 -116" stroke="black">
-436 708 m
-436 716 l
-</path>
-<path matrix="1 0 0 1 168 -76" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<text matrix="1 0 0 1 156 -76" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
-<path matrix="1 0 0 1 168 -76" stroke="black">
-300 688 m
-300 676 l
-312 676 l
-312 688 l
-h
-</path>
-<text matrix="1 0 0 1 156 -76" transformations="translations" pos="316 680" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
-<path matrix="1 0 0 1 36 -96" stroke="black">
-436 708 m
-436 716 l
-</path>
+<text matrix="1 0 0 1 -20 -32" transformations="translations" pos="288 672" stroke="black" type="label" width="148.582" height="7.473" depth="2.49" valign="baseline">insert simplex and subfaces [0,1,2]</text>
+<text matrix="1 0 0 1 -20 -56" transformations="translations" pos="288 672" stroke="black" type="label" width="148.582" height="7.473" depth="2.49" valign="baseline">insert simplex and subfaces [1,2,3]</text>
+<text matrix="1 0 0 1 -20 -44" transformations="translations" pos="288 672" stroke="black" type="label" width="148.582" height="7.473" depth="2.49" valign="baseline">insert simplex and subfaces [0,2,4]</text>
+<text matrix="1 0 0 1 -20 -68" transformations="translations" pos="288 672" stroke="black" type="label" width="148.582" height="7.473" depth="2.49" valign="baseline">insert simplex and subfaces [2,3,6]</text>
+<text matrix="1 0 0 1 -20 -80" transformations="translations" pos="288 672" stroke="black" type="label" width="148.582" height="7.473" depth="2.49" valign="baseline">insert simplex and subfaces [2,4,6]</text>
+<text matrix="1 0 0 1 -20 -92" transformations="translations" pos="288 672" stroke="black" type="label" width="148.582" height="7.473" depth="2.49" valign="baseline">insert simplex and subfaces [4,5,6]</text>
</page>
</ipe>
diff --git a/doc/Alpha_complex/alpha_complex_doc.png b/doc/Alpha_complex/alpha_complex_doc.png
index 0b6201da..170bae80 100644
--- a/doc/Alpha_complex/alpha_complex_doc.png
+++ b/doc/Alpha_complex/alpha_complex_doc.png
Binary files differ
diff --git a/doc/Bitmap_cubical_complex/COPYRIGHT b/doc/Bitmap_cubical_complex/COPYRIGHT
new file mode 100644
index 00000000..bcd46b23
--- /dev/null
+++ b/doc/Bitmap_cubical_complex/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): Pawel Dlotko
+
+Copyright (C) 2015 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/Bitmap_cubical_complex/Gudhi_Cubical_Complex_doc.h b/doc/Bitmap_cubical_complex/Gudhi_Cubical_Complex_doc.h
index 4c9c04d9..5963caa3 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 datastructure 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
diff --git a/doc/Bottleneck_distance/COPYRIGHT b/doc/Bottleneck_distance/COPYRIGHT
new file mode 100644
index 00000000..179740a6
--- /dev/null
+++ b/doc/Bottleneck_distance/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): François Godi
+
+Copyright (C) 2015 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/Bottleneck_distance/Intro_bottleneck_distance.h b/doc/Bottleneck_distance/Intro_bottleneck_distance.h
new file mode 100644
index 00000000..3998fe8d
--- /dev/null
+++ b/doc/Bottleneck_distance/Intro_bottleneck_distance.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: François Godi
+ *
+ * Copyright (C) 2015 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_BOTTLENECK_DISTANCE_INTRO_BOTTLENECK_DISTANCE_H_
+#define DOC_BOTTLENECK_DISTANCE_INTRO_BOTTLENECK_DISTANCE_H_
+
+// needs namespace for Doxygen to link on classes
+namespace Gudhi {
+// needs namespace for Doxygen to link on classes
+namespace persistence_diagram {
+
+/** \defgroup bottleneck_distance Bottleneck distance
+ *
+ * \author Fran&ccedil;ois Godi
+ * @{
+ *
+ * \section bottleneckdefinition Definition
+ *
+ * The bottleneck distance measures the similarity between two persistence diagrams. It is the shortest distance b for
+ * which there exists a perfect matching between the points of the two diagrams (completed with all the points on the
+ * diagonal in order to ignore cardinality mismatchs) such that any couple of matched points are at distance at most b.
+ *
+ * \image html perturb_pd.png On this picture, the red edges represent the matching. The bottleneck distance is the length of the longest edge.
+ *
+ */
+/** @} */ // end defgroup bottleneck_distance
+
+} // namespace persistence_diagram
+
+} // namespace Gudhi
+
+#endif // DOC_BOTTLENECK_DISTANCE_INTRO_BOTTLENECK_DISTANCE_H_
diff --git a/doc/Bottleneck_distance/perturb_pd.png b/doc/Bottleneck_distance/perturb_pd.png
new file mode 100644
index 00000000..be638de0
--- /dev/null
+++ b/doc/Bottleneck_distance/perturb_pd.png
Binary files differ
diff --git a/doc/Contraction/COPYRIGHT b/doc/Contraction/COPYRIGHT
new file mode 100644
index 00000000..1de850d7
--- /dev/null
+++ b/doc/Contraction/COPYRIGHT
@@ -0,0 +1,18 @@
+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): David Salinas
+Copyright (C) 2015 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/Persistent_cohomology/COPYRIGHT b/doc/Persistent_cohomology/COPYRIGHT
new file mode 100644
index 00000000..34345bef
--- /dev/null
+++ b/doc/Persistent_cohomology/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): Clément Maria
+
+Copyright (C) 2015 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/Persistent_cohomology/Intro_persistent_cohomology.h b/doc/Persistent_cohomology/Intro_persistent_cohomology.h
index 0cba6361..e17e5926 100644
--- a/doc/Persistent_cohomology/Intro_persistent_cohomology.h
+++ b/doc/Persistent_cohomology/Intro_persistent_cohomology.h
@@ -139,22 +139,28 @@ namespace persistent_cohomology {
by increasing filtration values (breaking ties so as a simplex appears after
its subsimplices of same filtration value) provides an indexing scheme.
-\section Examples
+\section pcohexamples Examples
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 its persistence diagram.
+Persistent_cohomology/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
+ and has dimension 3
+3 0 0 inf
+3 1 0.0983494 inf
+3 1 0.104347 inf
+3 2 0.138335 inf \endcode
\li <a href="_persistent_cohomology_2rips_multifield_persistence_8cpp-example.html">
-Persistent_cohomology/rips_multifield_persistence.cpp</a> computes the Rips complex of a point cloud and its
+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_2performance_rips_persistence_8cpp-example.html">
-Persistent_cohomology/performance_rips_persistence.cpp</a> provides timings for the construction of the Rips complex
-on a set of points sampling a Klein bottle in \f$\mathbb{R}^5\f$ with a simplex tree, its conversion to a
-Hasse diagram and the computation of persistent homology and multi-field persistent homology for the
-different representations.
+\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
+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
@@ -166,6 +172,28 @@ Persistent_cohomology/alpha_complex_3d_persistence.cpp</a> computes the persiste
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
+\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 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
+\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
+\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_2alpha_complex_persistence_8cpp-example.html">
Persistent_cohomology/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.
diff --git a/doc/Rips_complex/COPYRIGHT b/doc/Rips_complex/COPYRIGHT
new file mode 100644
index 00000000..594b7d03
--- /dev/null
+++ b/doc/Rips_complex/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): Clément Maria, Pawel Dlotko, Vincent Rouvreau
+
+Copyright (C) 2015 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/Rips_complex/Intro_rips_complex.h b/doc/Rips_complex/Intro_rips_complex.h
new file mode 100644
index 00000000..124dfec9
--- /dev/null
+++ b/doc/Rips_complex/Intro_rips_complex.h
@@ -0,0 +1,158 @@
+/* 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, Pawel Dlotko, Vincent Rouvreau
+ *
+ * Copyright (C) 2016 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_RIPS_COMPLEX_INTRO_RIPS_COMPLEX_H_
+#define DOC_RIPS_COMPLEX_INTRO_RIPS_COMPLEX_H_
+
+namespace Gudhi {
+
+namespace rips_complex {
+
+/** \defgroup rips_complex Rips complex
+ *
+ * \author Clément Maria, Pawel Dlotko, Vincent Rouvreau
+ *
+ * @{
+ *
+ * \section ripsdefinition Rips complex definition
+ *
+ * Rips_complex
+ * <a target="_blank" href="https://en.wikipedia.org/wiki/Vietoris%E2%80%93Rips_complex">(Wikipedia)</a> is a
+ * one skeleton graph that allows to construct a
+ * <a target="_blank" href="https://en.wikipedia.org/wiki/Simplicial_complex">simplicial complex</a>
+ * from it.
+ * The input can be a point cloud with a given distance function, or a distance matrix.
+ *
+ * The filtration value of each edge is computed from a user-given distance function, or directly from the distance
+ * matrix.
+ *
+ * All edges that have a filtration value strictly greater than a given threshold value are not inserted into
+ * the complex.
+ *
+ * When creating a simplicial complex from this one skeleton graph, Rips inserts the one skeleton graph into the data
+ * structure, and then expands the simplicial complex when required.
+ *
+ * Vertex name correspond to the index of the point in the given range (aka. the point cloud).
+ *
+ * \image html "rips_complex_representation.png" "Rips-complex one skeleton graph representation"
+ *
+ * On this example, as edges (4,5), (4,6) and (5,6) are in the complex, simplex (4,5,6) is added with the filtration
+ * value set with \f$max(filtration(4,5), filtration(4,6), filtration(5,6))\f$.
+ * And so on for simplex (0,1,2,3).
+ *
+ * If the Rips_complex interfaces are not detailed enough for your need, please refer to
+ * <a href="_persistent_cohomology_2rips_persistence_step_by_step_8cpp-example.html">
+ * rips_persistence_step_by_step.cpp</a> example, where the graph construction over the Simplex_tree is more detailed.
+ *
+ * \section ripspointsdistance Point cloud and distance function
+ *
+ * \subsection ripspointscloudexample Example from a point cloud and a distance function
+ *
+ * This example builds the one skeleton graph from the given points, threshold value, and distance function.
+ * Then it creates a `Simplex_tree` with it.
+ *
+ * Then, it is asked to display information about the simplicial complex.
+ *
+ * \include Rips_complex/example_one_skeleton_rips_from_points.cpp
+ *
+ * When launching (Rips maximal distance between 2 points is 12.0, is expanded until dimension 1 - one skeleton graph
+ * in other words):
+ *
+ * \code $> ./Rips_complex_example_one_skeleton_from_points
+ * \endcode
+ *
+ * the program output is:
+ *
+ * \include Rips_complex/one_skeleton_rips_for_doc.txt
+ *
+ * \subsection ripsoffexample Example from OFF file
+ *
+ * This example builds the Rips_complex from the given points in an OFF file, threshold value, and distance
+ * function.
+ * Then it creates a `Simplex_tree` with it.
+ *
+ *
+ * Then, it is asked to display information about the Rips complex.
+ *
+ * \include Rips_complex/example_rips_complex_from_off_file.cpp
+ *
+ * When launching:
+ *
+ * \code $> ./Rips_complex_example_from_off ../../data/points/alphacomplexdoc.off 12.0 3
+ * \endcode
+ *
+ * the program output is:
+ *
+ * \include Rips_complex/full_skeleton_rips_for_doc.txt
+ *
+ *
+ *
+ * \section ripsdistancematrix Distance matrix
+ *
+ * \subsection ripsdistancematrixexample Example from a distance matrix
+ *
+ * This example builds the one skeleton graph from the given distance matrix and threshold value.
+ * Then it creates a `Simplex_tree` with it.
+ *
+ * Then, it is asked to display information about the simplicial complex.
+ *
+ * \include Rips_complex/example_one_skeleton_rips_from_distance_matrix.cpp
+ *
+ * When launching (Rips maximal distance between 2 points is 1.0, is expanded until dimension 1 - one skeleton graph
+ * with other words):
+ *
+ * \code $> ./Rips_complex_example_one_skeleton_from_distance_matrix
+ * \endcode
+ *
+ * the program output is:
+ *
+ * \include Rips_complex/one_skeleton_rips_for_doc.txt
+ *
+ * \subsection ripscsvdistanceexample Example from a distance matrix read in a csv file
+ *
+ * This example builds the one skeleton graph from the given distance matrix read in a csv file and threshold value.
+ * Then it creates a `Simplex_tree` with it.
+ *
+ *
+ * Then, it is asked to display information about the Rips complex.
+ *
+ * \include Rips_complex/example_rips_complex_from_csv_distance_matrix_file.cpp
+ *
+ * When launching:
+ *
+ * \code $> ./Rips_complex_example_from_csv_distance_matrix ../../data/distance_matrix/full_square_distance_matrix.csv 1.0 3
+ * \endcode
+ *
+ * the program output is:
+ *
+ * \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
+
+} // namespace rips_complex
+
+} // namespace Gudhi
+
+#endif // DOC_RIPS_COMPLEX_INTRO_RIPS_COMPLEX_H_
diff --git a/doc/Rips_complex/rips_complex_representation.ipe b/doc/Rips_complex/rips_complex_representation.ipe
new file mode 100644
index 00000000..7f6028f4
--- /dev/null
+++ b/doc/Rips_complex/rips_complex_representation.ipe
@@ -0,0 +1,326 @@
+<?xml version="1.0"?>
+<!DOCTYPE ipe SYSTEM "ipe.dtd">
+<ipe version="70107" creator="Ipe 7.1.10">
+<info created="D:20150603143945" modified="D:20160928121844"/>
+<ipestyle name="basic">
+<symbol name="arrow/arc(spx)">
+<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="arrow/farc(spx)">
+<path stroke="sym-stroke" fill="white" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="mark/circle(sx)" transformations="translations">
+<path fill="sym-stroke">
+0.6 0 0 0.6 0 0 e
+0.4 0 0 0.4 0 0 e
+</path>
+</symbol>
+<symbol name="mark/disk(sx)" transformations="translations">
+<path fill="sym-stroke">
+0.6 0 0 0.6 0 0 e
+</path>
+</symbol>
+<symbol name="mark/fdisk(sfx)" transformations="translations">
+<group>
+<path fill="sym-fill">
+0.5 0 0 0.5 0 0 e
+</path>
+<path fill="sym-stroke" fillrule="eofill">
+0.6 0 0 0.6 0 0 e
+0.4 0 0 0.4 0 0 e
+</path>
+</group>
+</symbol>
+<symbol name="mark/box(sx)" transformations="translations">
+<path fill="sym-stroke" fillrule="eofill">
+-0.6 -0.6 m
+0.6 -0.6 l
+0.6 0.6 l
+-0.6 0.6 l
+h
+-0.4 -0.4 m
+0.4 -0.4 l
+0.4 0.4 l
+-0.4 0.4 l
+h
+</path>
+</symbol>
+<symbol name="mark/square(sx)" transformations="translations">
+<path fill="sym-stroke">
+-0.6 -0.6 m
+0.6 -0.6 l
+0.6 0.6 l
+-0.6 0.6 l
+h
+</path>
+</symbol>
+<symbol name="mark/fsquare(sfx)" transformations="translations">
+<group>
+<path fill="sym-fill">
+-0.5 -0.5 m
+0.5 -0.5 l
+0.5 0.5 l
+-0.5 0.5 l
+h
+</path>
+<path fill="sym-stroke" fillrule="eofill">
+-0.6 -0.6 m
+0.6 -0.6 l
+0.6 0.6 l
+-0.6 0.6 l
+h
+-0.4 -0.4 m
+0.4 -0.4 l
+0.4 0.4 l
+-0.4 0.4 l
+h
+</path>
+</group>
+</symbol>
+<symbol name="mark/cross(sx)" transformations="translations">
+<group>
+<path fill="sym-stroke">
+-0.43 -0.57 m
+0.57 0.43 l
+0.43 0.57 l
+-0.57 -0.43 l
+h
+</path>
+<path fill="sym-stroke">
+-0.43 0.57 m
+0.57 -0.43 l
+0.43 -0.57 l
+-0.57 0.43 l
+h
+</path>
+</group>
+</symbol>
+<symbol name="arrow/fnormal(spx)">
+<path stroke="sym-stroke" fill="white" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="arrow/pointed(spx)">
+<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-0.8 0 l
+-1 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="arrow/fpointed(spx)">
+<path stroke="sym-stroke" fill="white" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-0.8 0 l
+-1 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="arrow/linear(spx)">
+<path stroke="sym-stroke" pen="sym-pen">
+-1 0.333 m
+0 0 l
+-1 -0.333 l
+</path>
+</symbol>
+<symbol name="arrow/fdouble(spx)">
+<path stroke="sym-stroke" fill="white" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+-1 0 m
+-2 0.333 l
+-2 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="arrow/double(spx)">
+<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+-1 0 m
+-2 0.333 l
+-2 -0.333 l
+h
+</path>
+</symbol>
+<pen name="heavier" value="0.8"/>
+<pen name="fat" value="1.2"/>
+<pen name="ultrafat" value="2"/>
+<symbolsize name="large" value="5"/>
+<symbolsize name="small" value="2"/>
+<symbolsize name="tiny" value="1.1"/>
+<arrowsize name="large" value="10"/>
+<arrowsize name="small" value="5"/>
+<arrowsize name="tiny" value="3"/>
+<color name="red" value="1 0 0"/>
+<color name="green" value="0 1 0"/>
+<color name="blue" value="0 0 1"/>
+<color name="yellow" value="1 1 0"/>
+<color name="orange" value="1 0.647 0"/>
+<color name="gold" value="1 0.843 0"/>
+<color name="purple" value="0.627 0.125 0.941"/>
+<color name="gray" value="0.745"/>
+<color name="brown" value="0.647 0.165 0.165"/>
+<color name="navy" value="0 0 0.502"/>
+<color name="pink" value="1 0.753 0.796"/>
+<color name="seagreen" value="0.18 0.545 0.341"/>
+<color name="turquoise" value="0.251 0.878 0.816"/>
+<color name="violet" value="0.933 0.51 0.933"/>
+<color name="darkblue" value="0 0 0.545"/>
+<color name="darkcyan" value="0 0.545 0.545"/>
+<color name="darkgray" value="0.663"/>
+<color name="darkgreen" value="0 0.392 0"/>
+<color name="darkmagenta" value="0.545 0 0.545"/>
+<color name="darkorange" value="1 0.549 0"/>
+<color name="darkred" value="0.545 0 0"/>
+<color name="lightblue" value="0.678 0.847 0.902"/>
+<color name="lightcyan" value="0.878 1 1"/>
+<color name="lightgray" value="0.827"/>
+<color name="lightgreen" value="0.565 0.933 0.565"/>
+<color name="lightyellow" value="1 1 0.878"/>
+<dashstyle name="dashed" value="[4] 0"/>
+<dashstyle name="dotted" value="[1 3] 0"/>
+<dashstyle name="dash dotted" value="[4 2 1 2] 0"/>
+<dashstyle name="dash dot dotted" value="[4 2 1 2 1 2] 0"/>
+<textsize name="large" value="\large"/>
+<textsize name="small" value="\small"/>
+<textsize name="tiny" value="\tiny"/>
+<textsize name="Large" value="\Large"/>
+<textsize name="LARGE" value="\LARGE"/>
+<textsize name="huge" value="\huge"/>
+<textsize name="Huge" value="\Huge"/>
+<textsize name="footnote" value="\footnotesize"/>
+<textstyle name="center" begin="\begin{center}" end="\end{center}"/>
+<textstyle name="itemize" begin="\begin{itemize}" end="\end{itemize}"/>
+<textstyle name="item" begin="\begin{itemize}\item{}" end="\end{itemize}"/>
+<gridsize name="4 pts" value="4"/>
+<gridsize name="8 pts (~3 mm)" value="8"/>
+<gridsize name="16 pts (~6 mm)" value="16"/>
+<gridsize name="32 pts (~12 mm)" value="32"/>
+<gridsize name="10 pts (~3.5 mm)" value="10"/>
+<gridsize name="20 pts (~7 mm)" value="20"/>
+<gridsize name="14 pts (~5 mm)" value="14"/>
+<gridsize name="28 pts (~10 mm)" value="28"/>
+<gridsize name="56 pts (~20 mm)" value="56"/>
+<anglesize name="90 deg" value="90"/>
+<anglesize name="60 deg" value="60"/>
+<anglesize name="45 deg" value="45"/>
+<anglesize name="30 deg" value="30"/>
+<anglesize name="22.5 deg" value="22.5"/>
+<tiling name="falling" angle="-60" step="4" width="1"/>
+<tiling name="rising" angle="30" step="4" width="1"/>
+</ipestyle>
+<page>
+<layer name="alpha"/>
+<view layers="alpha" active="alpha"/>
+<path layer="alpha" matrix="1 0 0 1 0 -8" fill="darkblue">
+109.771 601.912 m
+159.595 601.797 l
+140.058 541.915 l
+h
+</path>
+<path matrix="1 0 0 1 0 -8" fill="darkblue">
+79.8776 552.169 m
+109.756 601.699 l
+139.812 542.209 l
+h
+</path>
+<path matrix="1 0 0 1 0 -8" fill="lightblue">
+69.8453 682.419 m
+159.925 712.208 l
+90.12 732.039 l
+h
+</path>
+<text matrix="1 0 0 1 -230.178 14.1775" transformations="translations" pos="380 530" stroke="seagreen" type="label" width="68.836" height="8.307" depth="2.32" valign="baseline" size="large">Rips complex</text>
+<text matrix="1 0 0 1 -212.333 10.6762" transformations="translations" pos="282.952 524.893" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">0</text>
+<text matrix="1 0 0 1 -210.178 14.1775" transformations="translations" pos="352.708 510.349" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
+<text matrix="1 0 0 1 -210.178 14.1775" transformations="translations" pos="310.693 578.759" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
+<text matrix="1 0 0 1 -210.178 14.1775" transformations="translations" pos="375.332 578.49" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
+<text matrix="1 0 0 1 -210.178 14.1775" transformations="translations" pos="272.179 660.635" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
+<text matrix="1 0 0 1 -209.478 4.0238" transformations="translations" pos="296.419 724.197" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
+<text matrix="1 0 0 1 -210.178 14.1775" transformations="translations" pos="375.332 689.453" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
+<path matrix="1 0 0 1 29.8225 14.1775" stroke="black" pen="heavier">
+60 710 m
+40 660 l
+</path>
+<path matrix="1 0 0 1 29.8225 14.1775" stroke="black" pen="heavier">
+40 660 m
+130 690 l
+</path>
+<path matrix="1 0 0 1 29.8225 14.1775" stroke="black" pen="heavier">
+130 690 m
+60 710 l
+</path>
+<path matrix="1 0 0 1 29.8225 14.1775" stroke="black" pen="heavier">
+40 660 m
+80 580 l
+</path>
+<path matrix="1 0 0 1 29.8225 14.1775" stroke="black" pen="heavier">
+80 580 m
+130 580 l
+130 580 l
+</path>
+<path matrix="1 0 0 1 29.8225 14.1775" stroke="black" pen="heavier">
+130 580 m
+110 520 l
+</path>
+<path matrix="1 0 0 1 29.8225 14.1775" stroke="black" pen="heavier">
+110 520 m
+50 530 l
+50 530 l
+50 530 l
+</path>
+<path matrix="1 0 0 1 29.8225 14.1775" stroke="black" pen="heavier">
+50 530 m
+80 580 l
+</path>
+<path matrix="1 0 0 1 29.8225 14.1775" stroke="black" pen="heavier">
+130 580 m
+130 690 l
+</path>
+<use matrix="1 0 0 1 -209.478 4.0238" name="mark/fdisk(sfx)" pos="300 720" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -210.178 14.1775" name="mark/fdisk(sfx)" pos="280 660" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -210.178 14.1775" name="mark/fdisk(sfx)" pos="370 690" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -210.178 14.1775" name="mark/fdisk(sfx)" pos="370 580" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -210.178 14.1775" name="mark/fdisk(sfx)" pos="290 530" size="normal" stroke="black" fill="white"/>
+<path matrix="1 0 0 1 -40 -16" stroke="black" pen="heavier">
+150.038 609.9 m
+179.929 549.727 l
+</path>
+<use matrix="1 0 0 1 -210.178 14.1775" name="mark/fdisk(sfx)" pos="320 580" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -210.178 14.1775" name="mark/fdisk(sfx)" pos="350 520" size="normal" stroke="black" fill="white"/>
+<path stroke="black" pen="heavier">
+158.7 593.269 m
+81.4925 544.805 l
+</path>
+<path matrix="1 0 0 1 -17.9662 -17.9662" stroke="gray">
+256.324 639.958 m
+370.055 639.958 l
+</path>
+<path matrix="1 0 0 1 -17.9662 -17.9662" stroke="gray">
+56.8567 0 0 56.8567 313.217 639.756 e
+</path>
+<use matrix="1 0 0 1 52.1387 -98.0941" name="mark/fdisk(sfx)" pos="300 720" size="normal" stroke="gray" fill="white"/>
+<use matrix="1 0 0 1 -61.4926 -98.0942" name="mark/fdisk(sfx)" pos="300 720" size="normal" stroke="gray" fill="white"/>
+<text matrix="1 0 0 1 -26.6167 -33.2708" transformations="translations" pos="295.735 657.944" stroke="gray" type="label" width="63.374" height="6.926" depth="1.93" valign="baseline">Rips threshold</text>
+</page>
+</ipe>
diff --git a/doc/Rips_complex/rips_complex_representation.png b/doc/Rips_complex/rips_complex_representation.png
new file mode 100644
index 00000000..e901d92e
--- /dev/null
+++ b/doc/Rips_complex/rips_complex_representation.png
Binary files differ
diff --git a/doc/Rips_complex/rips_one_skeleton.ipe b/doc/Rips_complex/rips_one_skeleton.ipe
new file mode 100644
index 00000000..3a35970c
--- /dev/null
+++ b/doc/Rips_complex/rips_one_skeleton.ipe
@@ -0,0 +1,326 @@
+<?xml version="1.0"?>
+<!DOCTYPE ipe SYSTEM "ipe.dtd">
+<ipe version="70107" creator="Ipe 7.1.10">
+<info created="D:20150603143945" modified="D:20160928130224"/>
+<ipestyle name="basic">
+<symbol name="arrow/arc(spx)">
+<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="arrow/farc(spx)">
+<path stroke="sym-stroke" fill="white" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="mark/circle(sx)" transformations="translations">
+<path fill="sym-stroke">
+0.6 0 0 0.6 0 0 e
+0.4 0 0 0.4 0 0 e
+</path>
+</symbol>
+<symbol name="mark/disk(sx)" transformations="translations">
+<path fill="sym-stroke">
+0.6 0 0 0.6 0 0 e
+</path>
+</symbol>
+<symbol name="mark/fdisk(sfx)" transformations="translations">
+<group>
+<path fill="sym-fill">
+0.5 0 0 0.5 0 0 e
+</path>
+<path fill="sym-stroke" fillrule="eofill">
+0.6 0 0 0.6 0 0 e
+0.4 0 0 0.4 0 0 e
+</path>
+</group>
+</symbol>
+<symbol name="mark/box(sx)" transformations="translations">
+<path fill="sym-stroke" fillrule="eofill">
+-0.6 -0.6 m
+0.6 -0.6 l
+0.6 0.6 l
+-0.6 0.6 l
+h
+-0.4 -0.4 m
+0.4 -0.4 l
+0.4 0.4 l
+-0.4 0.4 l
+h
+</path>
+</symbol>
+<symbol name="mark/square(sx)" transformations="translations">
+<path fill="sym-stroke">
+-0.6 -0.6 m
+0.6 -0.6 l
+0.6 0.6 l
+-0.6 0.6 l
+h
+</path>
+</symbol>
+<symbol name="mark/fsquare(sfx)" transformations="translations">
+<group>
+<path fill="sym-fill">
+-0.5 -0.5 m
+0.5 -0.5 l
+0.5 0.5 l
+-0.5 0.5 l
+h
+</path>
+<path fill="sym-stroke" fillrule="eofill">
+-0.6 -0.6 m
+0.6 -0.6 l
+0.6 0.6 l
+-0.6 0.6 l
+h
+-0.4 -0.4 m
+0.4 -0.4 l
+0.4 0.4 l
+-0.4 0.4 l
+h
+</path>
+</group>
+</symbol>
+<symbol name="mark/cross(sx)" transformations="translations">
+<group>
+<path fill="sym-stroke">
+-0.43 -0.57 m
+0.57 0.43 l
+0.43 0.57 l
+-0.57 -0.43 l
+h
+</path>
+<path fill="sym-stroke">
+-0.43 0.57 m
+0.57 -0.43 l
+0.43 -0.57 l
+-0.57 0.43 l
+h
+</path>
+</group>
+</symbol>
+<symbol name="arrow/fnormal(spx)">
+<path stroke="sym-stroke" fill="white" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="arrow/pointed(spx)">
+<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-0.8 0 l
+-1 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="arrow/fpointed(spx)">
+<path stroke="sym-stroke" fill="white" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-0.8 0 l
+-1 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="arrow/linear(spx)">
+<path stroke="sym-stroke" pen="sym-pen">
+-1 0.333 m
+0 0 l
+-1 -0.333 l
+</path>
+</symbol>
+<symbol name="arrow/fdouble(spx)">
+<path stroke="sym-stroke" fill="white" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+-1 0 m
+-2 0.333 l
+-2 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="arrow/double(spx)">
+<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+-1 0 m
+-2 0.333 l
+-2 -0.333 l
+h
+</path>
+</symbol>
+<pen name="heavier" value="0.8"/>
+<pen name="fat" value="1.2"/>
+<pen name="ultrafat" value="2"/>
+<symbolsize name="large" value="5"/>
+<symbolsize name="small" value="2"/>
+<symbolsize name="tiny" value="1.1"/>
+<arrowsize name="large" value="10"/>
+<arrowsize name="small" value="5"/>
+<arrowsize name="tiny" value="3"/>
+<color name="red" value="1 0 0"/>
+<color name="green" value="0 1 0"/>
+<color name="blue" value="0 0 1"/>
+<color name="yellow" value="1 1 0"/>
+<color name="orange" value="1 0.647 0"/>
+<color name="gold" value="1 0.843 0"/>
+<color name="purple" value="0.627 0.125 0.941"/>
+<color name="gray" value="0.745"/>
+<color name="brown" value="0.647 0.165 0.165"/>
+<color name="navy" value="0 0 0.502"/>
+<color name="pink" value="1 0.753 0.796"/>
+<color name="seagreen" value="0.18 0.545 0.341"/>
+<color name="turquoise" value="0.251 0.878 0.816"/>
+<color name="violet" value="0.933 0.51 0.933"/>
+<color name="darkblue" value="0 0 0.545"/>
+<color name="darkcyan" value="0 0.545 0.545"/>
+<color name="darkgray" value="0.663"/>
+<color name="darkgreen" value="0 0.392 0"/>
+<color name="darkmagenta" value="0.545 0 0.545"/>
+<color name="darkorange" value="1 0.549 0"/>
+<color name="darkred" value="0.545 0 0"/>
+<color name="lightblue" value="0.678 0.847 0.902"/>
+<color name="lightcyan" value="0.878 1 1"/>
+<color name="lightgray" value="0.827"/>
+<color name="lightgreen" value="0.565 0.933 0.565"/>
+<color name="lightyellow" value="1 1 0.878"/>
+<dashstyle name="dashed" value="[4] 0"/>
+<dashstyle name="dotted" value="[1 3] 0"/>
+<dashstyle name="dash dotted" value="[4 2 1 2] 0"/>
+<dashstyle name="dash dot dotted" value="[4 2 1 2 1 2] 0"/>
+<textsize name="large" value="\large"/>
+<textsize name="small" value="\small"/>
+<textsize name="tiny" value="\tiny"/>
+<textsize name="Large" value="\Large"/>
+<textsize name="LARGE" value="\LARGE"/>
+<textsize name="huge" value="\huge"/>
+<textsize name="Huge" value="\Huge"/>
+<textsize name="footnote" value="\footnotesize"/>
+<textstyle name="center" begin="\begin{center}" end="\end{center}"/>
+<textstyle name="itemize" begin="\begin{itemize}" end="\end{itemize}"/>
+<textstyle name="item" begin="\begin{itemize}\item{}" end="\end{itemize}"/>
+<gridsize name="4 pts" value="4"/>
+<gridsize name="8 pts (~3 mm)" value="8"/>
+<gridsize name="16 pts (~6 mm)" value="16"/>
+<gridsize name="32 pts (~12 mm)" value="32"/>
+<gridsize name="10 pts (~3.5 mm)" value="10"/>
+<gridsize name="20 pts (~7 mm)" value="20"/>
+<gridsize name="14 pts (~5 mm)" value="14"/>
+<gridsize name="28 pts (~10 mm)" value="28"/>
+<gridsize name="56 pts (~20 mm)" value="56"/>
+<anglesize name="90 deg" value="90"/>
+<anglesize name="60 deg" value="60"/>
+<anglesize name="45 deg" value="45"/>
+<anglesize name="30 deg" value="30"/>
+<anglesize name="22.5 deg" value="22.5"/>
+<tiling name="falling" angle="-60" step="4" width="1"/>
+<tiling name="rising" angle="30" step="4" width="1"/>
+</ipestyle>
+<page>
+<layer name="alpha"/>
+<view layers="alpha" active="alpha"/>
+<path layer="alpha" matrix="1 0 0 1 0 -8" stroke="0">
+109.771 601.912 m
+159.595 601.797 l
+140.058 541.915 l
+h
+</path>
+<path matrix="1 0 0 1 0 -8" stroke="0">
+79.8776 552.169 m
+109.756 601.699 l
+139.812 542.209 l
+h
+</path>
+<path matrix="1 0 0 1 0.665417 -8.66542" stroke="0">
+69.8453 682.419 m
+159.925 712.208 l
+90.12 732.039 l
+h
+</path>
+<text matrix="1 0 0 1 -230.178 14.1775" transformations="translations" pos="380 530" stroke="seagreen" type="label" width="98.916" height="8.307" depth="2.32" valign="baseline" size="large">One skeleton graph</text>
+<text matrix="1 0 0 1 -212.333 10.6762" transformations="translations" pos="282.952 524.893" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">0</text>
+<text matrix="1 0 0 1 -210.178 14.1775" transformations="translations" pos="352.708 510.349" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
+<text matrix="1 0 0 1 -210.178 14.1775" transformations="translations" pos="310.693 578.759" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
+<text matrix="1 0 0 1 -210.178 14.1775" transformations="translations" pos="375.332 578.49" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
+<text matrix="1 0 0 1 -210.178 14.1775" transformations="translations" pos="272.179 660.635" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
+<text matrix="1 0 0 1 -209.478 4.0238" transformations="translations" pos="296.419 724.197" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
+<text matrix="1 0 0 1 -210.178 14.1775" transformations="translations" pos="375.332 689.453" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
+<path matrix="1 0 0 1 30.6497 14.0396" stroke="black" pen="heavier">
+60 710 m
+40 660 l
+</path>
+<path matrix="1 0 0 1 30.3739 13.9018" stroke="black" pen="heavier">
+40 660 m
+130 690 l
+</path>
+<path matrix="1 0 0 1 29.8225 14.1775" stroke="black" pen="heavier">
+130 690 m
+60 710 l
+</path>
+<path matrix="1 0 0 1 29.8225 14.1775" stroke="black" pen="heavier">
+40 660 m
+80 580 l
+</path>
+<path matrix="1 0 0 1 29.8225 14.1775" stroke="black" pen="heavier">
+80 580 m
+130 580 l
+130 580 l
+</path>
+<path matrix="1 0 0 1 29.8225 14.1775" stroke="black" pen="heavier">
+130 580 m
+110 520 l
+</path>
+<path matrix="1 0 0 1 29.8225 14.1775" stroke="black" pen="heavier">
+110 520 m
+50 530 l
+50 530 l
+50 530 l
+</path>
+<path matrix="1 0 0 1 29.8225 14.1775" stroke="black" pen="heavier">
+50 530 m
+80 580 l
+</path>
+<path matrix="1 0 0 1 29.8225 14.1775" stroke="black" pen="heavier">
+130 580 m
+130 690 l
+</path>
+<use matrix="1 0 0 1 -209.478 4.0238" name="mark/fdisk(sfx)" pos="300 720" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -210.178 14.1775" name="mark/fdisk(sfx)" pos="280 660" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -210.178 14.1775" name="mark/fdisk(sfx)" pos="370 690" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -210.178 14.1775" name="mark/fdisk(sfx)" pos="370 580" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -210.178 14.1775" name="mark/fdisk(sfx)" pos="290 530" size="normal" stroke="black" fill="white"/>
+<path matrix="1 0 0 1 -40 -16" stroke="black" pen="heavier">
+150.038 609.9 m
+179.929 549.727 l
+</path>
+<use matrix="1 0 0 1 -210.178 14.1775" name="mark/fdisk(sfx)" pos="320 580" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -210.178 14.1775" name="mark/fdisk(sfx)" pos="350 520" size="normal" stroke="black" fill="white"/>
+<path stroke="black" pen="heavier">
+158.7 593.269 m
+81.4925 544.805 l
+</path>
+<path matrix="1 0 0 1 -17.9662 -17.9662" stroke="gray">
+256.324 639.958 m
+370.055 639.958 l
+</path>
+<path matrix="1 0 0 1 -17.9662 -17.9662" stroke="gray">
+56.8567 0 0 56.8567 313.217 639.756 e
+</path>
+<use matrix="1 0 0 1 52.1387 -98.0941" name="mark/fdisk(sfx)" pos="300 720" size="normal" stroke="gray" fill="white"/>
+<use matrix="1 0 0 1 -61.4926 -98.0942" name="mark/fdisk(sfx)" pos="300 720" size="normal" stroke="gray" fill="white"/>
+<text matrix="1 0 0 1 -26.6167 -33.2708" transformations="translations" pos="295.735 657.944" stroke="gray" type="label" width="63.374" height="6.926" depth="1.93" valign="baseline">Rips threshold</text>
+</page>
+</ipe>
diff --git a/doc/Rips_complex/rips_one_skeleton.png b/doc/Rips_complex/rips_one_skeleton.png
new file mode 100644
index 00000000..1028770e
--- /dev/null
+++ b/doc/Rips_complex/rips_one_skeleton.png
Binary files differ
diff --git a/doc/Simplex_tree/COPYRIGHT b/doc/Simplex_tree/COPYRIGHT
new file mode 100644
index 00000000..34345bef
--- /dev/null
+++ b/doc/Simplex_tree/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): Clément Maria
+
+Copyright (C) 2015 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/Simplex_tree/Intro_simplex_tree.h b/doc/Simplex_tree/Intro_simplex_tree.h
index ddf9ad22..940dd694 100644
--- a/doc/Simplex_tree/Intro_simplex_tree.h
+++ b/doc/Simplex_tree/Intro_simplex_tree.h
@@ -28,6 +28,7 @@ namespace Gudhi {
/** \defgroup simplex_tree Filtered Complexes
+ * @{
* \author Cl&eacute;ment Maria
*
* A simplicial complex \f$\mathbf{K}\f$ on a set of vertices \f$V = \{1, \cdots ,|V|\}\f$ is a collection of
@@ -65,8 +66,8 @@ Expand the simplex tree in 3.8e-05 s.
Information of the Simplex Tree:
Number of vertices = 10 Number of simplices = 98 \endcode
*
- * \li <a href="_simplex_tree_2simplex_tree_from_alpha_shapes_3_8cpp-example.html">
- * Simplex_tree/simplex_tree_from_alpha_shapes_3.cpp</a> - Simplex tree is computed and displayed from a 3D alpha
+ * \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)
*
*
@@ -76,7 +77,7 @@ Number of vertices = 10 Number of simplices = 98 \endcode
* compact and harder to construct from scratch.
*
* \copyright GNU General Public License v3.
- * @{
+ * @}
*/
} // namespace Gudhi
diff --git a/doc/Skeleton_blocker/COPYRIGHT b/doc/Skeleton_blocker/COPYRIGHT
new file mode 100644
index 00000000..1de850d7
--- /dev/null
+++ b/doc/Skeleton_blocker/COPYRIGHT
@@ -0,0 +1,18 @@
+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): David Salinas
+Copyright (C) 2015 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/Spatial_searching/Intro_spatial_searching.h b/doc/Spatial_searching/Intro_spatial_searching.h
new file mode 100644
index 00000000..23705378
--- /dev/null
+++ b/doc/Spatial_searching/Intro_spatial_searching.h
@@ -0,0 +1,62 @@
+/* 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): Clement Jamin
+ *
+ * Copyright (C) 2016 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_SPATIAL_SEARCHING_INTRO_SPATIAL_SEARCHING_H_
+#define DOC_SPATIAL_SEARCHING_INTRO_SPATIAL_SEARCHING_H_
+
+// needs namespaces for Doxygen to link on classes
+namespace Gudhi {
+namespace spatial_searching {
+
+/** \defgroup spatial_searching Spatial_searching
+ *
+ * \author Cl&eacute;ment Jamin
+ *
+ * @{
+ *
+ * \section introduction Introduction
+ *
+ * This Gudhi component is a wrapper around
+ * <a target="_blank" href="http://doc.cgal.org/latest/Spatial_searching/index.html">CGAL dD spatial searching algorithms</a>.
+ * It provides a simplified API to perform (approximate) neighbor searches. Contrary to CGAL default behavior, the tree
+ * does not store the points themselves, but stores indices.
+ *
+ * For more details about the data structure or the algorithms, or for more advanced usages, reading
+ * <a target="_blank" href="http://doc.cgal.org/latest/Spatial_searching/index.html">CGAL documentation</a>
+ * is highly recommended.
+ *
+ * \section spatial_searching_examples Example
+ *
+ * This example generates 500 random points, then performs queries for nearest and farthest points using different methods.
+ *
+ * \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
+
+} // namespace spatial_searching
+
+} // namespace Gudhi
+
+#endif // DOC_SPATIAL_SEARCHING_INTRO_SPATIAL_SEARCHING_H_
diff --git a/doc/Subsampling/Intro_subsampling.h b/doc/Subsampling/Intro_subsampling.h
new file mode 100644
index 00000000..c84616dd
--- /dev/null
+++ b/doc/Subsampling/Intro_subsampling.h
@@ -0,0 +1,70 @@
+/* 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): Clement Jamin
+ *
+ * Copyright (C) 2016 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_SUBSAMPLING_INTRO_SUBSAMPLING_H_
+#define DOC_SUBSAMPLING_INTRO_SUBSAMPLING_H_
+
+// needs namespace for Doxygen to link on classes
+namespace Gudhi {
+// needs namespace for Doxygen to link on classes
+namespace subsampling {
+
+/** \defgroup subsampling Subsampling
+ *
+ * \author Cl&eacute;ment Jamin, Siargey Kachanovich
+ *
+ * @{
+ *
+ * \section subsamplingintroduction Introduction
+ *
+ * This Gudhi component offers methods to subsample a set of points.
+ *
+ * \section sparsifyexamples Example: sparsify_point_set
+ *
+ * This example outputs a subset of the input points so that the
+ * squared distance between any two points
+ * is greater than or equal to 0.4.
+ *
+ * \include Subsampling/example_sparsify_point_set.cpp
+ *
+ * \section farthestpointexamples Example: choose_n_farthest_points
+ *
+ * This example outputs a subset of 100 points obtained by Gonz&aacute;lez algorithm,
+ * starting with a random point.
+ *
+ * \include Subsampling/example_choose_n_farthest_points.cpp
+ *
+ * \section randompointexamples Example: pick_n_random_points
+ *
+ * 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
+
+} // namespace subsampling
+
+} // namespace Gudhi
+
+#endif // DOC_SUBSAMPLING_INTRO_SUBSAMPLING_H_
diff --git a/doc/Tangential_complex/COPYRIGHT b/doc/Tangential_complex/COPYRIGHT
new file mode 100644
index 00000000..c4df0f64
--- /dev/null
+++ b/doc/Tangential_complex/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): Clement Jamin
+
+Copyright (C) 2015 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/Tangential_complex/Intro_tangential_complex.h b/doc/Tangential_complex/Intro_tangential_complex.h
new file mode 100644
index 00000000..3d687c1d
--- /dev/null
+++ b/doc/Tangential_complex/Intro_tangential_complex.h
@@ -0,0 +1,119 @@
+/* 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): Clement Jamin
+ *
+ * Copyright (C) 2016 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_TANGENTIAL_COMPLEX_INTRO_TANGENTIAL_COMPLEX_H_
+#define DOC_TANGENTIAL_COMPLEX_INTRO_TANGENTIAL_COMPLEX_H_
+
+// needs namespaces for Doxygen to link on classes
+namespace Gudhi {
+namespace tangential_complex {
+
+/** \defgroup tangential_complex Tangential complex
+
+\author Cl&eacute;ment Jamin
+
+@{
+
+\section tangentialdefinition Definition
+
+A Tangential Delaunay complex is a <a target="_blank" href="https://en.wikipedia.org/wiki/Simplicial_complex">simplicial complex</a>
+designed to reconstruct a \f$k\f$-dimensional smooth manifold embedded in \f$d\f$-dimensional Euclidean space.
+The input is a point sample coming from an unknown manifold, which means that the points lie close to a structure of "small" intrinsic dimension.
+The running time depends only linearly on the extrinsic dimension \f$ d \f$
+and exponentially on the intrinsic dimension \f$ k \f$.
+
+An extensive description of the Tangential complex can be found in \cite tangentialcomplex2014.
+
+\subsection whatisthetc What is a Tangential Complex?
+
+Let us start with the description of the Tangential complex of a simple example, with \f$ k=1 \f$ and \f$ d=2 \f$.
+The input data is 4 points \f$ P \f$ located on a curve embedded in 2D.
+\image html "tc_example_01.png" "The input"
+For each point \f$ p \f$, estimate its tangent subspace \f$ T_p \f$ (e.g. using PCA).
+\image html "tc_example_02.png" "The estimated normals"
+Let us add the Voronoi diagram of the points in orange. For each point \f$ p \f$, construct its star in the Delaunay triangulation of \f$ P \f$ restricted to \f$ T_p \f$.
+\image html "tc_example_03.png" "The Voronoi diagram"
+The Tangential Delaunay complex is the union of those stars.
+
+In practice, neither the ambient Voronoi diagram nor the ambient Delaunay triangulation is computed.
+Instead, local \f$ k \f$-dimensional regular triangulations are computed with a limited number of points as we only need the star of each point.
+More details can be found in \cite tangentialcomplex2014.
+
+\subsection inconsistencies Inconsistencies
+
+Inconsistencies between the stars can occur.
+An inconsistency occurs when a simplex is not in the star of all its vertices.
+
+Let us take the same example.
+\image html "tc_example_07_before.png" "Before"
+Let us slightly move the tangent subspace \f$ T_q \f$
+\image html "tc_example_07_after.png" "After"
+Now, the star of \f$ Q \f$ contains \f$ QP \f$, but the star of \f$ P \f$ does not contain \f$ QP \f$. We have an inconsistency.
+\image html "tc_example_08.png" "After"
+
+One way to solve inconsistencies is to randomly perturb the positions of the points involved in an inconsistency.
+In the current implementation, this perturbation is done in the tangent subspace of each point.
+The maximum perturbation radius is given as a parameter to the constructor.
+
+In most cases, we recommend to provide a point set where the minimum distance between any two points
+is not too small. This can be achieved using the functions provided by the Subsampling module. Then, a good value to start with for
+the maximum perturbation radius would be around half the minimum distance between any two points.
+The \ref example_with_perturb below shows an example of such a process.
+
+In most cases, this process is able to dramatically reduce the number of inconsistencies, but is not guaranteed to succeed.
+
+\subsection output Output
+
+The result of the computation is exported as a `Simplex_tree`. It is the union of the stars of all the input points.
+A vertex in the Simplex Tree is the index of the point in the range provided by the user.
+The point corresponding to a vertex can also be obtained through the `Tangential_complex::get_point` function.
+Note that even if the positions of the points are perturbed, their original positions are kept (e.g. `Tangential_complex::get_point` returns the original position of the point).
+
+The result can be obtained after the computation of the Tangential complex itself and/or after the perturbation process.
+
+\section simple_example Simple example
+
+This example builds the Tangential complex of point set.
+Note that the dimension of the kernel here is dynamic, which is slower, but more flexible:
+the intrinsic and ambient dimensions does not have to be known at compile-time.
+
+\include Tangential_complex/example_basic.cpp
+
+\section example_with_perturb Example with perturbation
+
+This example builds the Tangential complex of a point set, then tries to solve inconsistencies
+by perturbing the positions of points involved in inconsistent simplices.
+Note that the dimension of the kernel here is static, which is the best choice when the
+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
+
+} // namespace tangential_complex
+
+} // namespace Gudhi
+
+#endif // DOC_TANGENTIAL_COMPLEX_INTRO_TANGENTIAL_COMPLEX_H_
diff --git a/doc/Tangential_complex/tc_example_01.png b/doc/Tangential_complex/tc_example_01.png
new file mode 100644
index 00000000..8afe6198
--- /dev/null
+++ b/doc/Tangential_complex/tc_example_01.png
Binary files differ
diff --git a/doc/Tangential_complex/tc_example_02.png b/doc/Tangential_complex/tc_example_02.png
new file mode 100644
index 00000000..01591c1d
--- /dev/null
+++ b/doc/Tangential_complex/tc_example_02.png
Binary files differ
diff --git a/doc/Tangential_complex/tc_example_03.png b/doc/Tangential_complex/tc_example_03.png
new file mode 100644
index 00000000..5de04e01
--- /dev/null
+++ b/doc/Tangential_complex/tc_example_03.png
Binary files differ
diff --git a/doc/Tangential_complex/tc_example_05.png b/doc/Tangential_complex/tc_example_05.png
new file mode 100644
index 00000000..fdd5e5fa
--- /dev/null
+++ b/doc/Tangential_complex/tc_example_05.png
Binary files differ
diff --git a/doc/Tangential_complex/tc_example_06.png b/doc/Tangential_complex/tc_example_06.png
new file mode 100644
index 00000000..31ad3c43
--- /dev/null
+++ b/doc/Tangential_complex/tc_example_06.png
Binary files differ
diff --git a/doc/Tangential_complex/tc_example_07.png b/doc/Tangential_complex/tc_example_07.png
new file mode 100644
index 00000000..47e34de7
--- /dev/null
+++ b/doc/Tangential_complex/tc_example_07.png
Binary files differ
diff --git a/doc/Tangential_complex/tc_example_07_after.png b/doc/Tangential_complex/tc_example_07_after.png
new file mode 100644
index 00000000..981350d2
--- /dev/null
+++ b/doc/Tangential_complex/tc_example_07_after.png
Binary files differ
diff --git a/doc/Tangential_complex/tc_example_07_before.png b/doc/Tangential_complex/tc_example_07_before.png
new file mode 100644
index 00000000..ddc6bc7b
--- /dev/null
+++ b/doc/Tangential_complex/tc_example_07_before.png
Binary files differ
diff --git a/doc/Tangential_complex/tc_example_08.png b/doc/Tangential_complex/tc_example_08.png
new file mode 100644
index 00000000..119a87de
--- /dev/null
+++ b/doc/Tangential_complex/tc_example_08.png
Binary files differ
diff --git a/doc/Tangential_complex/tc_example_09.png b/doc/Tangential_complex/tc_example_09.png
new file mode 100644
index 00000000..31bac1e0
--- /dev/null
+++ b/doc/Tangential_complex/tc_example_09.png
Binary files differ
diff --git a/doc/Tangential_complex/tc_examples.png b/doc/Tangential_complex/tc_examples.png
new file mode 100644
index 00000000..b6544afe
--- /dev/null
+++ b/doc/Tangential_complex/tc_examples.png
Binary files differ
diff --git a/doc/Witness_complex/COPYRIGHT b/doc/Witness_complex/COPYRIGHT
new file mode 100644
index 00000000..7d032c87
--- /dev/null
+++ b/doc/Witness_complex/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): Siargey Kachanovich
+
+Copyright (C) 2015 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/Witness_complex/Witness_complex_doc.h b/doc/Witness_complex/Witness_complex_doc.h
index 60dfd27b..171a185f 100644
--- a/doc/Witness_complex/Witness_complex_doc.h
+++ b/doc/Witness_complex/Witness_complex_doc.h
@@ -8,31 +8,106 @@
\image html "Witness_complex_representation.png" "Witness complex representation"
- \section Definitions
+ \section witnessdefinitions Definitions
- Witness complex \f$ Wit(W,L) \f$ is a simplicial complex defined on two sets of points in \f$\mathbb{R}^D\f$:
+ Witness complex is a simplicial complex defined on two sets of points in \f$\mathbb{R}^D\f$:
\li \f$W\f$ set of **witnesses** and
- \li \f$L \subseteq W\f$ set of **landmarks**.
+ \li \f$L\f$ set of **landmarks**.
- The simplices are based on landmarks
- and a simplex belongs to the witness complex if and only if it is witnessed, that is:
+ Even though often the set of landmarks \f$L\f$ is a subset of the set of witnesses \f$ W\f$, it is not a requirement for the current implementation.
- \f$ \sigma \subset L \f$ is witnessed if there exists a point \f$w \in W\f$ such that
- w is closer to the vertices of \f$ \sigma \f$ than other points in \f$ L \f$ and all of its faces are witnessed as well.
-
- The data structure is described in \cite boissonnatmariasimplextreealgorithmica .
+ Landmarks are the vertices of the simplicial complex
+ and witnesses help to decide on which simplices are inserted via a predicate "is witnessed".
- \section Implementation
+ De Silva and Carlsson in their paper \cite de2004topological differentiate **weak witnessing** and **strong witnessing**:
- The principal class of this module is Gudhi::Witness_complex.
+ - *weak*: \f$ \sigma \subset L \f$ is witnessed by \f$ w \in W\f$ if \f$ \forall l \in \sigma,\ \forall l' \in \mathbf{L \setminus \sigma},\ d(w,l) \leq d(w,l') \f$
+ - *strong*: \f$ \sigma \subset L \f$ is witnessed by \f$ w \in W\f$ if \f$ \forall l \in \sigma,\ \forall l' \in \mathbf{L},\ d(w,l) \leq d(w,l') \f$
- In both cases, the constructor for this class takes a {witness}x{closest_landmarks} table, where each row represents a witness and consists of landmarks sorted by distance to this witness.
- This table can be constructed by two additional classes Landmark_choice_by_furthest_point and Landmark_choice_by_random_point also included in the module.
+ where \f$ d(.,.) \f$ is a distance function.
- *\image html "bench_Cy8.png" "Running time as function on number of landmarks" width=10cm
- *\image html "bench_sphere.png" "Running time as function on number of witnesses for |L|=300" width=10cm
+ Both definitions can be relaxed by a real value \f$\alpha\f$:
+
+ - *weak*: \f$ \sigma \subset L \f$ is \f$\alpha\f$-witnessed by \f$ w \in W\f$ if \f$ \forall l \in \sigma,\ \forall l' \in \mathbf{L \setminus \sigma},\ d(w,l)^2 \leq d(w,l')^2 + \alpha^2 \f$
+ - *strong*: \f$ \sigma \subset L \f$ is \f$\alpha\f$-witnessed by \f$ w \in W\f$ if \f$ \forall l \in \sigma,\ \forall l' \in \mathbf{L},\ d(w,l)^2 \leq d(w,l')^2 + \alpha^2 \f$
+
+ which leads to definitions of **weak relaxed witness complex** (or just relaxed witness complex for short) and **strong relaxed witness complex** respectively.
+
+ \image html "swit.svg" "Strongly witnessed simplex"
+
+ In particular case of 0-relaxation, weak complex corresponds to **witness complex** introduced in \cite de2004topological, whereas 0-relaxed strong witness complex consists of just vertices and is not very interesting.
+ Hence for small relaxation weak version is preferable.
+ However, to capture the homotopy type (for example using Gudhi::persistent_cohomology::Persistent_cohomology) it is often necessary to work with higher filtration values. In this case strong relaxed witness complex is faster to compute and offers similar results.
+
+ \section witnessimplementation Implementation
+ The two complexes described above are implemented in the corresponding classes
+ - Gudhi::witness_complex::Witness_complex
+ - Gudhi::witness_complex::Euclidean_witness_complex
+ - Gudhi::witness_complex::Strong_witness_complex
+ - Gudhi::witness_complex::Euclidean_strong_witness_complex
+
+ The construction of the Euclidean versions of complexes follow the same scheme:
+ 1. Construct a search tree on landmarks (for that Gudhi::spatial_searching::Kd_tree_search is used internally).
+ 2. Construct lists of nearest landmarks for each witness (special structure Gudhi::witness_complex::Active_witness is used internally).
+ 3. Construct the witness complex for nearest landmark lists.
+
+ In the non-Euclidean classes, the lists of nearest landmarks are supposed to be given as input.
+
+ The constructors take on the steps 1 and 2, while the function 'create_complex' executes the step 3.
+
+ \section witnessexample1 Example 1: Constructing weak relaxed witness complex from an off file
+
+ Let's start with a simple example, which reads an off point file and computes a weak witness complex.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp}
+
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/Euclidean_witness_complex.h>
+#include <gudhi/pick_n_random_points.h>
+#include <gudhi/Points_off_io.h>
+
+#include <CGAL/Epick_d.h>
+
+#include <string>
+#include <vector>
+
+typedef CGAL::Epick_d<CGAL::Dynamic_dimension_tag> K;
+typedef typename K::Point_d Point_d;
+typedef typename Gudhi::witness_complex::Euclidean_witness_complex<K> Witness_complex;
+typedef std::vector< Vertex_handle > typeVectorVertex;
+typedef std::vector< Point_d > Point_vector;
+
+int main(int argc, char * const argv[]) {
+ std::string file_name = argv[1];
+ int nbL = atoi(argv[2]), lim_dim = atoi(argv[4]);
+ double alpha2 = atof(argv[3]);
+ Gudhi::Simplex_tree<> simplex_tree;
+
+ // Read the point file
+ Point_vector point_vector, landmarks;
+ 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));
+
+ // Compute witness complex
+ Witness_complex witness_complex(landmarks,
+ point_vector);
+
+ witness_complex.create_complex(simplex_tree, alpha2, lim_dim);
+}
+
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ \section witnessexample2 Example2: Computing persistence using strong relaxed witness complex
+
+ Here is an example of constructing a strong witness complex filtration and computing persistence on it:
+
+ \include Witness_complex/example_strong_witness_persistence.cpp
\copyright GNU General Public License v3.
diff --git a/doc/Witness_complex/Witness_complex_representation.ipe b/doc/Witness_complex/Witness_complex_representation.ipe
new file mode 100644
index 00000000..f9c45d5d
--- /dev/null
+++ b/doc/Witness_complex/Witness_complex_representation.ipe
@@ -0,0 +1,280 @@
+<?xml version="1.0"?>
+<!DOCTYPE ipe SYSTEM "ipe.dtd">
+<ipe version="70107" creator="Ipe 7.1.10">
+<info created="D:20161010162425" modified="D:20161010162828"/>
+<ipestyle name="basic">
+<symbol name="arrow/arc(spx)">
+<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="arrow/farc(spx)">
+<path stroke="sym-stroke" fill="white" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="arrow/ptarc(spx)">
+<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-0.8 0 l
+-1 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="arrow/fptarc(spx)">
+<path stroke="sym-stroke" fill="white" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-0.8 0 l
+-1 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="mark/circle(sx)" transformations="translations">
+<path fill="sym-stroke">
+0.6 0 0 0.6 0 0 e
+0.4 0 0 0.4 0 0 e
+</path>
+</symbol>
+<symbol name="mark/disk(sx)" transformations="translations">
+<path fill="sym-stroke">
+0.6 0 0 0.6 0 0 e
+</path>
+</symbol>
+<symbol name="mark/fdisk(sfx)" transformations="translations">
+<group>
+<path fill="sym-fill">
+0.5 0 0 0.5 0 0 e
+</path>
+<path fill="sym-stroke" fillrule="eofill">
+0.6 0 0 0.6 0 0 e
+0.4 0 0 0.4 0 0 e
+</path>
+</group>
+</symbol>
+<symbol name="mark/box(sx)" transformations="translations">
+<path fill="sym-stroke" fillrule="eofill">
+-0.6 -0.6 m
+0.6 -0.6 l
+0.6 0.6 l
+-0.6 0.6 l
+h
+-0.4 -0.4 m
+0.4 -0.4 l
+0.4 0.4 l
+-0.4 0.4 l
+h
+</path>
+</symbol>
+<symbol name="mark/square(sx)" transformations="translations">
+<path fill="sym-stroke">
+-0.6 -0.6 m
+0.6 -0.6 l
+0.6 0.6 l
+-0.6 0.6 l
+h
+</path>
+</symbol>
+<symbol name="mark/fsquare(sfx)" transformations="translations">
+<group>
+<path fill="sym-fill">
+-0.5 -0.5 m
+0.5 -0.5 l
+0.5 0.5 l
+-0.5 0.5 l
+h
+</path>
+<path fill="sym-stroke" fillrule="eofill">
+-0.6 -0.6 m
+0.6 -0.6 l
+0.6 0.6 l
+-0.6 0.6 l
+h
+-0.4 -0.4 m
+0.4 -0.4 l
+0.4 0.4 l
+-0.4 0.4 l
+h
+</path>
+</group>
+</symbol>
+<symbol name="mark/cross(sx)" transformations="translations">
+<group>
+<path fill="sym-stroke">
+-0.43 -0.57 m
+0.57 0.43 l
+0.43 0.57 l
+-0.57 -0.43 l
+h
+</path>
+<path fill="sym-stroke">
+-0.43 0.57 m
+0.57 -0.43 l
+0.43 -0.57 l
+-0.57 0.43 l
+h
+</path>
+</group>
+</symbol>
+<symbol name="arrow/fnormal(spx)">
+<path stroke="sym-stroke" fill="white" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="arrow/pointed(spx)">
+<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-0.8 0 l
+-1 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="arrow/fpointed(spx)">
+<path stroke="sym-stroke" fill="white" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-0.8 0 l
+-1 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="arrow/linear(spx)">
+<path stroke="sym-stroke" pen="sym-pen">
+-1 0.333 m
+0 0 l
+-1 -0.333 l
+</path>
+</symbol>
+<symbol name="arrow/fdouble(spx)">
+<path stroke="sym-stroke" fill="white" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+-1 0 m
+-2 0.333 l
+-2 -0.333 l
+h
+</path>
+</symbol>
+<symbol name="arrow/double(spx)">
+<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
+0 0 m
+-1 0.333 l
+-1 -0.333 l
+h
+-1 0 m
+-2 0.333 l
+-2 -0.333 l
+h
+</path>
+</symbol>
+<pen name="heavier" value="0.8"/>
+<pen name="fat" value="1.2"/>
+<pen name="ultrafat" value="2"/>
+<symbolsize name="large" value="5"/>
+<symbolsize name="small" value="2"/>
+<symbolsize name="tiny" value="1.1"/>
+<arrowsize name="large" value="10"/>
+<arrowsize name="small" value="5"/>
+<arrowsize name="tiny" value="3"/>
+<color name="red" value="1 0 0"/>
+<color name="green" value="0 1 0"/>
+<color name="blue" value="0 0 1"/>
+<color name="yellow" value="1 1 0"/>
+<color name="orange" value="1 0.647 0"/>
+<color name="gold" value="1 0.843 0"/>
+<color name="purple" value="0.627 0.125 0.941"/>
+<color name="gray" value="0.745"/>
+<color name="brown" value="0.647 0.165 0.165"/>
+<color name="navy" value="0 0 0.502"/>
+<color name="pink" value="1 0.753 0.796"/>
+<color name="seagreen" value="0.18 0.545 0.341"/>
+<color name="turquoise" value="0.251 0.878 0.816"/>
+<color name="violet" value="0.933 0.51 0.933"/>
+<color name="darkblue" value="0 0 0.545"/>
+<color name="darkcyan" value="0 0.545 0.545"/>
+<color name="darkgray" value="0.663"/>
+<color name="darkgreen" value="0 0.392 0"/>
+<color name="darkmagenta" value="0.545 0 0.545"/>
+<color name="darkorange" value="1 0.549 0"/>
+<color name="darkred" value="0.545 0 0"/>
+<color name="lightblue" value="0.678 0.847 0.902"/>
+<color name="lightcyan" value="0.878 1 1"/>
+<color name="lightgray" value="0.827"/>
+<color name="lightgreen" value="0.565 0.933 0.565"/>
+<color name="lightyellow" value="1 1 0.878"/>
+<dashstyle name="dashed" value="[4] 0"/>
+<dashstyle name="dotted" value="[1 3] 0"/>
+<dashstyle name="dash dotted" value="[4 2 1 2] 0"/>
+<dashstyle name="dash dot dotted" value="[4 2 1 2 1 2] 0"/>
+<textsize name="large" value="\large"/>
+<textsize name="Large" value="\Large"/>
+<textsize name="LARGE" value="\LARGE"/>
+<textsize name="huge" value="\huge"/>
+<textsize name="Huge" value="\Huge"/>
+<textsize name="small" value="\small"/>
+<textsize name="footnote" value="\footnotesize"/>
+<textsize name="tiny" value="\tiny"/>
+<textstyle name="center" begin="\begin{center}" end="\end{center}"/>
+<textstyle name="itemize" begin="\begin{itemize}" end="\end{itemize}"/>
+<textstyle name="item" begin="\begin{itemize}\item{}" end="\end{itemize}"/>
+<gridsize name="4 pts" value="4"/>
+<gridsize name="8 pts (~3 mm)" value="8"/>
+<gridsize name="16 pts (~6 mm)" value="16"/>
+<gridsize name="32 pts (~12 mm)" value="32"/>
+<gridsize name="10 pts (~3.5 mm)" value="10"/>
+<gridsize name="20 pts (~7 mm)" value="20"/>
+<gridsize name="14 pts (~5 mm)" value="14"/>
+<gridsize name="28 pts (~10 mm)" value="28"/>
+<gridsize name="56 pts (~20 mm)" value="56"/>
+<anglesize name="90 deg" value="90"/>
+<anglesize name="60 deg" value="60"/>
+<anglesize name="45 deg" value="45"/>
+<anglesize name="30 deg" value="30"/>
+<anglesize name="22.5 deg" value="22.5"/>
+<opacity name="10%" value="0.1"/>
+<opacity name="30%" value="0.3"/>
+<opacity name="50%" value="0.5"/>
+<opacity name="75%" value="0.75"/>
+<tiling name="falling" angle="-60" step="4" width="1"/>
+<tiling name="rising" angle="30" step="4" width="1"/>
+</ipestyle>
+<page>
+<layer name="alpha"/>
+<view layers="alpha" active="alpha"/>
+<use layer="alpha" name="mark/fdisk(sfx)" pos="288 672" size="normal" stroke="darkblue" fill="white"/>
+<path stroke="darkblue">
+48.8262 0 0 48.8262 288 672 e
+</path>
+<text transformations="translations" pos="292 676" stroke="darkblue" type="label" width="6.559" height="4.289" depth="0" valign="baseline">$\omega$</text>
+<path stroke="black">
+284 720 m
+280 624 l
+268 648 l
+h
+</path>
+<use name="mark/fdisk(sfx)" pos="284 720" size="normal" stroke="black" fill="white"/>
+<use name="mark/fdisk(sfx)" pos="268 648" size="normal" stroke="black" fill="white"/>
+<use name="mark/fdisk(sfx)" pos="280 624" size="normal" stroke="black" fill="white"/>
+<text matrix="1 0 0 1 0 8" transformations="translations" pos="268 672" stroke="black" type="label" width="6.05" height="4.289" depth="0" valign="baseline">$\sigma$</text>
+<use name="mark/fdisk(sfx)" pos="344 672" size="normal" stroke="black" fill="white"/>
+<use name="mark/fdisk(sfx)" pos="356 716" size="normal" stroke="black" fill="white"/>
+<use name="mark/fdisk(sfx)" pos="364 628" size="normal" stroke="black" fill="white"/>
+<use name="mark/fdisk(sfx)" pos="244 708" size="normal" stroke="black" fill="white"/>
+<use name="mark/fdisk(sfx)" pos="196 632" size="normal" stroke="black" fill="white"/>
+<use name="mark/fdisk(sfx)" pos="200 696" size="normal" stroke="black" fill="white"/>
+<use name="mark/fdisk(sfx)" pos="168 716" size="normal" stroke="black" fill="white"/>
+</page>
+</ipe>
diff --git a/doc/Witness_complex/Witness_complex_representation.png b/doc/Witness_complex/Witness_complex_representation.png
index 1d31a490..16e0504e 100644
--- a/doc/Witness_complex/Witness_complex_representation.png
+++ b/doc/Witness_complex/Witness_complex_representation.png
Binary files differ
diff --git a/doc/Witness_complex/swit.svg b/doc/Witness_complex/swit.svg
new file mode 100644
index 00000000..6ffb5fff
--- /dev/null
+++ b/doc/Witness_complex/swit.svg
@@ -0,0 +1,1303 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:ns0="http://www.iki.fi/pav/software/textext/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="113.73116mm"
+ height="84.14254mm"
+ viewBox="0 0 402.98441 298.14286"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="swit.svg">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.98994949"
+ inkscape:cx="402.72174"
+ inkscape:cy="258.46971"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1366"
+ inkscape:window-height="704"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" />
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5009"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ style="fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-8"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5009-5"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ style="fill:#000080;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(-130.29351,-300.82484)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="148.57143"
+ cy="449.89627"
+ cx="338.71756"
+ id="path4136"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 318.19805,571.02449 0,-94.95433 -64.64976,-92.42896 164.14979,-30.80966 42.4264,120.71323 -141.92643,3.03046 100.0051,-123.23861 z"
+ id="path4301"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 318.70313,571.52957 -65.65992,-187.3833 206.5762,88.89343 z"
+ id="path4303"
+ inkscape:connector-curvature="0" />
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="450.05875"
+ cx="338.13837"
+ id="path4138"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <g
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ id="g4147"
+ ns0:preamble="/home/siarzhuk/GitDrive/2015Gudhi/Aid/preamble.ini"
+ ns0:text="$w$"
+ transform="matrix(2.7020226,0,0,2.7020226,-261.85036,103.80999)"
+ style="fill:#000080">
+ <defs
+ id="defs4149">
+ <g
+ id="g4151">
+ <symbol
+ id="textext-20f8880a-0"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path4154"
+ d=""
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-20f8880a-1"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path4157"
+ d="M 4.609375,-3.375 C 4.65625,-3.59375 4.75,-3.96875 4.75,-4.03125 c 0,-0.171875 -0.140625,-0.265625 -0.28125,-0.265625 -0.125,0 -0.296875,0.078125 -0.375,0.28125 -0.03125,0.0625 -0.5,1.96875 -0.5625,2.234375 C 3.453125,-1.484375 3.4375,-1.3125 3.4375,-1.125 c 0,0.109375 0,0.125 0.015625,0.171875 -0.234375,0.53125 -0.53125,0.84375 -0.921875,0.84375 -0.796875,0 -0.796875,-0.734375 -0.796875,-0.90625 0,-0.3125 0.046875,-0.703125 0.515625,-1.9375 0.109375,-0.296875 0.171875,-0.4375 0.171875,-0.640625 0,-0.4375 -0.328125,-0.8125 -0.8125,-0.8125 -0.953125,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 C 0.84375,-3.875 1.21875,-4.1875 1.578125,-4.1875 c 0.09375,0 0.25,0.015625 0.25,0.328125 0,0.25 -0.109375,0.53125 -0.1875,0.703125 -0.4375,1.171875 -0.546875,1.625 -0.546875,2.015625 0,0.90625 0.65625,1.25 1.40625,1.25 0.171875,0 0.640625,0 1.03125,-0.703125 0.265625,0.640625 0.953125,0.703125 1.25,0.703125 0.75,0 1.1875,-0.625 1.453125,-1.21875 0.328125,-0.78125 0.65625,-2.125 0.65625,-2.59375 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.0625,0.1875 0.140625,0.265625 0.109375,0.109375 0.359375,0.359375 0.359375,0.84375 0,0.34375 -0.28125,1.3125 -0.546875,1.828125 -0.25,0.53125 -0.609375,0.875 -1.09375,0.875 -0.46875,0 -0.734375,-0.296875 -0.734375,-0.875 0,-0.265625 0.0625,-0.578125 0.109375,-0.71875 z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ </g>
+ </defs>
+ <g
+ id="textext-20f8880a-2"
+ style="fill:#000080">
+ <g
+ id="g4160"
+ style="fill:#000080;fill-opacity:1">
+ <use
+ id="use4162"
+ y="134.765"
+ x="223.43201"
+ xlink:href="#textext-20f8880a-1"
+ width="100%"
+ height="100%"
+ style="fill:#000080" />
+ </g>
+ </g>
+ </g>
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="383.79077"
+ cx="252.85715"
+ id="path4138-3"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="353.07648"
+ cx="418.57144"
+ id="path4138-3-7"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="475.93362"
+ cx="317.85715"
+ id="path4138-3-0"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="570.21936"
+ cx="317.85715"
+ id="path4138-3-9"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="473.07648"
+ cx="459.28571"
+ id="path4138-3-3"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="478.07648"
+ cx="133.57143"
+ id="path4138-3-6"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="320.21936"
+ cx="155.71428"
+ id="path4138-3-06"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="340.73929"
+ cx="490.7774"
+ id="path4138-3-2"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="559.76758"
+ cx="490.60406"
+ id="path4138-3-61"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <g
+ id="g4147-8"
+ ns0:preamble="/home/siarzhuk/GitDrive/2015Gudhi/Aid/preamble.ini"
+ ns0:text="$w$"
+ transform="matrix(2.7020226,0,0,2.7020226,-152.29409,72.785446)"
+ style="fill:#000000">
+ <defs
+ id="defs4149-7">
+ <g
+ id="g4151-9">
+ <symbol
+ id="textext-20f8880a-0-2"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path4154-0"
+ d=""
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-20f8880a-1-2"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path4157-3"
+ d="M 4.609375,-3.375 C 4.65625,-3.59375 4.75,-3.96875 4.75,-4.03125 c 0,-0.171875 -0.140625,-0.265625 -0.28125,-0.265625 -0.125,0 -0.296875,0.078125 -0.375,0.28125 -0.03125,0.0625 -0.5,1.96875 -0.5625,2.234375 C 3.453125,-1.484375 3.4375,-1.3125 3.4375,-1.125 c 0,0.109375 0,0.125 0.015625,0.171875 -0.234375,0.53125 -0.53125,0.84375 -0.921875,0.84375 -0.796875,0 -0.796875,-0.734375 -0.796875,-0.90625 0,-0.3125 0.046875,-0.703125 0.515625,-1.9375 0.109375,-0.296875 0.171875,-0.4375 0.171875,-0.640625 0,-0.4375 -0.328125,-0.8125 -0.8125,-0.8125 -0.953125,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 C 0.84375,-3.875 1.21875,-4.1875 1.578125,-4.1875 c 0.09375,0 0.25,0.015625 0.25,0.328125 0,0.25 -0.109375,0.53125 -0.1875,0.703125 -0.4375,1.171875 -0.546875,1.625 -0.546875,2.015625 0,0.90625 0.65625,1.25 1.40625,1.25 0.171875,0 0.640625,0 1.03125,-0.703125 0.265625,0.640625 0.953125,0.703125 1.25,0.703125 0.75,0 1.1875,-0.625 1.453125,-1.21875 0.328125,-0.78125 0.65625,-2.125 0.65625,-2.59375 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.0625,0.1875 0.140625,0.265625 0.109375,0.109375 0.359375,0.359375 0.359375,0.84375 0,0.34375 -0.28125,1.3125 -0.546875,1.828125 -0.25,0.53125 -0.609375,0.875 -1.09375,0.875 -0.46875,0 -0.734375,-0.296875 -0.734375,-0.875 0,-0.265625 0.0625,-0.578125 0.109375,-0.71875 z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ </g>
+ </defs>
+ <g
+ id="textext-20f8880a-2-7"
+ style="fill:#000000" />
+ </g>
+ <g
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ id="g4558"
+ style="fill:#000080"
+ transform="matrix(2.7020226,0,0,2.7020226,-254.3195,202.59004)"
+ ns0:preamble="/home/siarzhuk/GitDrive/2015Gudhi/Aid/preamble.ini"
+ ns0:text="$\\sigma \\subset L$">
+ <defs
+ id="defs4560">
+ <g
+ id="g4562">
+ <symbol
+ id="textext-b73c230a-0"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path4565"
+ d=""
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-b73c230a-1"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path4568"
+ d="m 5.15625,-3.71875 c 0.140625,0 0.5,0 0.5,-0.34375 0,-0.234375 -0.21875,-0.234375 -0.390625,-0.234375 l -2.28125,0 c -1.5,0 -2.609375,1.640625 -2.609375,2.828125 0,0.875 0.59375,1.578125 1.5,1.578125 1.171875,0 2.5,-1.203125 2.5,-2.734375 0,-0.171875 0,-0.65625 -0.3125,-1.09375 z M 1.890625,-0.109375 C 1.390625,-0.109375 1,-0.46875 1,-1.1875 c 0,-0.296875 0.109375,-1.109375 0.46875,-1.703125 0.421875,-0.6875 1.015625,-0.828125 1.359375,-0.828125 0.828125,0 0.90625,0.65625 0.90625,0.96875 0,0.46875 -0.203125,1.28125 -0.53125,1.796875 -0.390625,0.578125 -0.9375,0.84375 -1.3125,0.84375 z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-b73c230a-2"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path4571"
+ d="M 3.734375,-6.03125 C 3.8125,-6.390625 3.84375,-6.5 4.78125,-6.5 c 0.296875,0 0.375,0 0.375,-0.1875 0,-0.125 -0.109375,-0.125 -0.15625,-0.125 -0.328125,0 -1.140625,0.03125 -1.46875,0.03125 -0.296875,0 -1.03125,-0.03125 -1.328125,-0.03125 -0.0625,0 -0.1875,0 -0.1875,0.203125 0,0.109375 0.09375,0.109375 0.28125,0.109375 0.015625,0 0.203125,0 0.375,0.015625 0.171875,0.03125 0.265625,0.03125 0.265625,0.171875 0,0.03125 0,0.0625 -0.03125,0.1875 L 1.5625,-0.78125 c -0.09375,0.390625 -0.109375,0.46875 -0.90625,0.46875 -0.171875,0 -0.265625,0 -0.265625,0.203125 C 0.390625,0 0.484375,0 0.65625,0 l 4.625,0 C 5.515625,0 5.515625,0 5.578125,-0.171875 L 6.375,-2.328125 c 0.03125,-0.109375 0.03125,-0.125 0.03125,-0.140625 0,-0.03125 -0.03125,-0.109375 -0.109375,-0.109375 -0.09375,0 -0.109375,0.0625 -0.171875,0.21875 -0.34375,0.90625 -0.78125,2.046875 -2.5,2.046875 l -0.9375,0 c -0.140625,0 -0.171875,0 -0.21875,0 -0.109375,-0.015625 -0.140625,-0.03125 -0.140625,-0.109375 0,-0.03125 0,-0.046875 0.046875,-0.21875 z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-b73c230a-3"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path4574"
+ d=""
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-b73c230a-4"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path4577"
+ d="m 6.5625,-4.984375 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.203125 -0.1875,-0.203125 -0.359375,-0.203125 l -2.671875,0 c -1.703125,0 -3.0625,1.296875 -3.0625,2.890625 0,1.609375 1.359375,2.90625 3.0625,2.90625 l 2.671875,0 c 0.171875,0 0.359375,0 0.359375,-0.203125 C 6.921875,0 6.734375,0 6.5625,0 L 3.90625,0 c -1.546875,0 -2.6875,-1.15625 -2.6875,-2.5 0,-1.328125 1.140625,-2.484375 2.6875,-2.484375 z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ </g>
+ </defs>
+ <g
+ id="textext-b73c230a-5">
+ <g
+ id="g4580"
+ style="fill:#000000;fill-opacity:1">
+ <use
+ id="use4582"
+ y="134.765"
+ x="223.43201"
+ xlink:href="#textext-b73c230a-1"
+ width="100%"
+ height="100%" />
+ </g>
+ <g
+ id="g4584"
+ style="fill:#000000;fill-opacity:1">
+ <use
+ id="use4586"
+ y="134.765"
+ x="232.25"
+ xlink:href="#textext-b73c230a-4"
+ width="100%"
+ height="100%" />
+ </g>
+ <g
+ id="g4588"
+ style="fill:#000000;fill-opacity:1">
+ <use
+ id="use4590"
+ y="134.765"
+ x="242.76601"
+ xlink:href="#textext-b73c230a-2"
+ width="100%"
+ height="100%" />
+ </g>
+ </g>
+ </g>
+ <path
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ style="fill:#000080;fill-rule:evenodd;stroke:#000080;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+ d="m 337.85714,449.50504 148.57143,-8.57143"
+ id="path5000"
+ inkscape:connector-curvature="0" />
+ <g
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ ns0:text="$\\sqrt{d(w,L)^2 + \\alpha^2}$"
+ ns0:preamble="/home/siarzhuk/GitDrive/2015Gudhi/Aid/preamble.ini"
+ transform="matrix(1.3935573,-0.10159094,0.10159094,1.3935573,55.220877,276.38005)"
+ style="fill:#000080;stroke:#000080"
+ id="g5407">
+ <defs
+ id="defs5409">
+ <g
+ id="g5411">
+ <symbol
+ style="overflow:visible"
+ overflow="visible"
+ id="textext-da5ef958-0">
+ <path
+ inkscape:connector-curvature="0"
+ style="stroke:none"
+ d=""
+ id="path5414" />
+ </symbol>
+ <symbol
+ style="overflow:visible"
+ overflow="visible"
+ id="textext-da5ef958-1">
+ <path
+ inkscape:connector-curvature="0"
+ style="stroke:none"
+ d="m 4.234375,11.5625 c 0.296875,0 0.3125,-0.01563 0.40625,-0.203125 l 5.453125,-11.375 c 0.07813,-0.140625 0.07813,-0.15625 0.07813,-0.1875 0,-0.109375 -0.07813,-0.203125 -0.203125,-0.203125 -0.125,0 -0.171875,0.09375 -0.21875,0.203125 L 4.609375,10.53125 2.484375,5.578125 1.09375,6.65625 1.25,6.8125 1.953125,6.265625 Z m 0,0"
+ id="path5417" />
+ </symbol>
+ <symbol
+ style="overflow:visible"
+ overflow="visible"
+ id="textext-da5ef958-2">
+ <path
+ inkscape:connector-curvature="0"
+ style="stroke:none"
+ d=""
+ id="path5420" />
+ </symbol>
+ <symbol
+ style="overflow:visible"
+ overflow="visible"
+ id="textext-da5ef958-3">
+ <path
+ inkscape:connector-curvature="0"
+ style="stroke:none"
+ d="m 5.140625,-6.8125 c 0,0 0,-0.109375 -0.125,-0.109375 -0.15625,0 -1.09375,0.09375 -1.265625,0.109375 -0.078125,0.015625 -0.140625,0.0625 -0.140625,0.1875 0,0.125 0.09375,0.125 0.234375,0.125 0.484375,0 0.5,0.0625 0.5,0.171875 L 4.3125,-6.125 3.71875,-3.765625 C 3.53125,-4.140625 3.25,-4.40625 2.796875,-4.40625 c -1.15625,0 -2.390625,1.46875 -2.390625,2.921875 0,0.9375 0.546875,1.59375 1.3125,1.59375 0.203125,0 0.703125,-0.046875 1.296875,-0.75 0.078125,0.421875 0.4375,0.75 0.90625,0.75 0.359375,0 0.578125,-0.234375 0.75,-0.546875 0.15625,-0.359375 0.296875,-0.96875 0.296875,-0.984375 0,-0.109375 -0.09375,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.046875 -0.140625,0.1875 -0.171875,0.640625 -0.34375,1.234375 -0.75,1.234375 -0.28125,0 -0.296875,-0.265625 -0.296875,-0.453125 0,-0.25 0.015625,-0.3125 0.046875,-0.484375 z m -2.0625,5.625 C 3.015625,-1 3.015625,-0.984375 2.875,-0.8125 2.4375,-0.265625 2.03125,-0.109375 1.75,-0.109375 c -0.5,0 -0.640625,-0.546875 -0.640625,-0.9375 0,-0.5 0.3125,-1.71875 0.546875,-2.1875 0.3125,-0.578125 0.75,-0.953125 1.15625,-0.953125 0.640625,0 0.78125,0.8125 0.78125,0.875 0,0.0625 -0.015625,0.125 -0.03125,0.171875 z m 0,0"
+ id="path5423" />
+ </symbol>
+ <symbol
+ style="overflow:visible"
+ overflow="visible"
+ id="textext-da5ef958-4">
+ <path
+ inkscape:connector-curvature="0"
+ style="stroke:none"
+ d="M 4.609375,-3.375 C 4.65625,-3.59375 4.75,-3.96875 4.75,-4.03125 c 0,-0.171875 -0.140625,-0.265625 -0.28125,-0.265625 -0.125,0 -0.296875,0.078125 -0.375,0.28125 -0.03125,0.0625 -0.5,1.96875 -0.5625,2.234375 C 3.453125,-1.484375 3.4375,-1.3125 3.4375,-1.125 c 0,0.109375 0,0.125 0.015625,0.171875 -0.234375,0.53125 -0.53125,0.84375 -0.921875,0.84375 -0.796875,0 -0.796875,-0.734375 -0.796875,-0.90625 0,-0.3125 0.046875,-0.703125 0.515625,-1.9375 0.109375,-0.296875 0.171875,-0.4375 0.171875,-0.640625 0,-0.4375 -0.328125,-0.8125 -0.8125,-0.8125 -0.953125,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 C 0.84375,-3.875 1.21875,-4.1875 1.578125,-4.1875 c 0.09375,0 0.25,0.015625 0.25,0.328125 0,0.25 -0.109375,0.53125 -0.1875,0.703125 -0.4375,1.171875 -0.546875,1.625 -0.546875,2.015625 0,0.90625 0.65625,1.25 1.40625,1.25 0.171875,0 0.640625,0 1.03125,-0.703125 0.265625,0.640625 0.953125,0.703125 1.25,0.703125 0.75,0 1.1875,-0.625 1.453125,-1.21875 0.328125,-0.78125 0.65625,-2.125 0.65625,-2.59375 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.0625,0.1875 0.140625,0.265625 0.109375,0.109375 0.359375,0.359375 0.359375,0.84375 0,0.34375 -0.28125,1.3125 -0.546875,1.828125 -0.25,0.53125 -0.609375,0.875 -1.09375,0.875 -0.46875,0 -0.734375,-0.296875 -0.734375,-0.875 0,-0.265625 0.0625,-0.578125 0.109375,-0.71875 z m 0,0"
+ id="path5426" />
+ </symbol>
+ <symbol
+ style="overflow:visible"
+ overflow="visible"
+ id="textext-da5ef958-5">
+ <path
+ inkscape:connector-curvature="0"
+ style="stroke:none"
+ d="m 2.03125,-0.015625 c 0,-0.65625 -0.25,-1.046875 -0.640625,-1.046875 -0.328125,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.265625 1.0625,0 1.390625,0 1.5,0 1.640625,-0.046875 1.734375,-0.125 1.765625,-0.15625 1.78125,-0.15625 1.78125,-0.15625 c 0.015625,0 0.015625,0 0.015625,0.140625 0,0.75 -0.34375,1.34375 -0.671875,1.671875 -0.109375,0.109375 -0.109375,0.125 -0.109375,0.15625 0,0.078125 0.046875,0.109375 0.09375,0.109375 0.109375,0 0.921875,-0.765625 0.921875,-1.9375 z m 0,0"
+ id="path5429" />
+ </symbol>
+ <symbol
+ style="overflow:visible"
+ overflow="visible"
+ id="textext-da5ef958-6">
+ <path
+ inkscape:connector-curvature="0"
+ style="stroke:none"
+ d="M 3.734375,-6.03125 C 3.8125,-6.390625 3.84375,-6.5 4.78125,-6.5 c 0.296875,0 0.375,0 0.375,-0.1875 0,-0.125 -0.109375,-0.125 -0.15625,-0.125 -0.328125,0 -1.140625,0.03125 -1.46875,0.03125 -0.296875,0 -1.03125,-0.03125 -1.328125,-0.03125 -0.0625,0 -0.1875,0 -0.1875,0.203125 0,0.109375 0.09375,0.109375 0.28125,0.109375 0.015625,0 0.203125,0 0.375,0.015625 0.171875,0.03125 0.265625,0.03125 0.265625,0.171875 0,0.03125 0,0.0625 -0.03125,0.1875 L 1.5625,-0.78125 c -0.09375,0.390625 -0.109375,0.46875 -0.90625,0.46875 -0.171875,0 -0.265625,0 -0.265625,0.203125 C 0.390625,0 0.484375,0 0.65625,0 l 4.625,0 C 5.515625,0 5.515625,0 5.578125,-0.171875 L 6.375,-2.328125 c 0.03125,-0.109375 0.03125,-0.125 0.03125,-0.140625 0,-0.03125 -0.03125,-0.109375 -0.109375,-0.109375 -0.09375,0 -0.109375,0.0625 -0.171875,0.21875 -0.34375,0.90625 -0.78125,2.046875 -2.5,2.046875 l -0.9375,0 c -0.140625,0 -0.171875,0 -0.21875,0 -0.109375,-0.015625 -0.140625,-0.03125 -0.140625,-0.109375 0,-0.03125 0,-0.046875 0.046875,-0.21875 z m 0,0"
+ id="path5432" />
+ </symbol>
+ <symbol
+ style="overflow:visible"
+ overflow="visible"
+ id="textext-da5ef958-7">
+ <path
+ inkscape:connector-curvature="0"
+ style="stroke:none"
+ d="m 4.75,-2.359375 c 0,-1.5625 -0.921875,-2.046875 -1.65625,-2.046875 -1.375,0 -2.6875,1.421875 -2.6875,2.828125 0,0.9375 0.59375,1.6875 1.625,1.6875 0.625,0 1.34375,-0.234375 2.09375,-0.84375 0.125,0.53125 0.453125,0.84375 0.90625,0.84375 0.53125,0 0.84375,-0.546875 0.84375,-0.703125 0,-0.078125 -0.0625,-0.109375 -0.125,-0.109375 -0.0625,0 -0.09375,0.03125 -0.125,0.109375 -0.1875,0.484375 -0.546875,0.484375 -0.5625,0.484375 -0.3125,0 -0.3125,-0.78125 -0.3125,-1.015625 0,-0.203125 0,-0.234375 0.109375,-0.34375 C 5.796875,-2.65625 6,-3.8125 6,-3.8125 6,-3.84375 5.984375,-3.921875 5.875,-3.921875 c -0.09375,0 -0.09375,0.03125 -0.140625,0.21875 -0.1875,0.625 -0.515625,1.375 -0.984375,1.96875 z m -0.65625,1.375 c -0.890625,0.765625 -1.65625,0.875 -2.046875,0.875 -0.59375,0 -0.90625,-0.453125 -0.90625,-1.09375 0,-0.484375 0.265625,-1.5625 0.578125,-2.0625 C 2.1875,-4 2.734375,-4.1875 3.078125,-4.1875 c 0.984375,0 0.984375,1.3125 0.984375,2.078125 0,0.375 0,0.953125 0.03125,1.125 z m 0,0"
+ id="path5435" />
+ </symbol>
+ <symbol
+ style="overflow:visible"
+ overflow="visible"
+ id="textext-da5ef958-8">
+ <path
+ inkscape:connector-curvature="0"
+ style="stroke:none"
+ d=""
+ id="path5438" />
+ </symbol>
+ <symbol
+ style="overflow:visible"
+ overflow="visible"
+ id="textext-da5ef958-9">
+ <path
+ inkscape:connector-curvature="0"
+ style="stroke:none"
+ d="m 3.296875,2.390625 c 0,-0.03125 0,-0.046875 -0.171875,-0.21875 C 1.890625,0.921875 1.5625,-0.96875 1.5625,-2.5 c 0,-1.734375 0.375,-3.46875 1.609375,-4.703125 0.125,-0.125 0.125,-0.140625 0.125,-0.171875 0,-0.078125 -0.03125,-0.109375 -0.09375,-0.109375 -0.109375,0 -1,0.6875 -1.59375,1.953125 -0.5,1.09375 -0.625,2.203125 -0.625,3.03125 0,0.78125 0.109375,1.984375 0.65625,3.125 C 2.25,1.84375 3.09375,2.5 3.203125,2.5 c 0.0625,0 0.09375,-0.03125 0.09375,-0.109375 z m 0,0"
+ id="path5441" />
+ </symbol>
+ <symbol
+ style="overflow:visible"
+ overflow="visible"
+ id="textext-da5ef958-10">
+ <path
+ inkscape:connector-curvature="0"
+ style="stroke:none"
+ d="m 2.875,-2.5 c 0,-0.765625 -0.109375,-1.96875 -0.65625,-3.109375 -0.59375,-1.21875 -1.453125,-1.875 -1.546875,-1.875 -0.0625,0 -0.109375,0.046875 -0.109375,0.109375 0,0.03125 0,0.046875 0.1875,0.234375 0.984375,0.984375 1.546875,2.5625 1.546875,4.640625 0,1.71875 -0.359375,3.46875 -1.59375,4.71875 C 0.5625,2.34375 0.5625,2.359375 0.5625,2.390625 0.5625,2.453125 0.609375,2.5 0.671875,2.5 0.765625,2.5 1.671875,1.8125 2.25,0.546875 2.765625,-0.546875 2.875,-1.65625 2.875,-2.5 Z m 0,0"
+ id="path5444" />
+ </symbol>
+ <symbol
+ style="overflow:visible"
+ overflow="visible"
+ id="textext-da5ef958-11">
+ <path
+ inkscape:connector-curvature="0"
+ style="stroke:none"
+ d="m 4.078125,-2.296875 2.78125,0 C 7,-2.296875 7.1875,-2.296875 7.1875,-2.5 7.1875,-2.6875 7,-2.6875 6.859375,-2.6875 l -2.78125,0 0,-2.796875 c 0,-0.140625 0,-0.328125 -0.203125,-0.328125 -0.203125,0 -0.203125,0.1875 -0.203125,0.328125 l 0,2.796875 -2.78125,0 c -0.140625,0 -0.328125,0 -0.328125,0.1875 0,0.203125 0.1875,0.203125 0.328125,0.203125 l 2.78125,0 0,2.796875 c 0,0.140625 0,0.328125 0.203125,0.328125 0.203125,0 0.203125,-0.1875 0.203125,-0.328125 z m 0,0"
+ id="path5447" />
+ </symbol>
+ <symbol
+ style="overflow:visible"
+ overflow="visible"
+ id="textext-da5ef958-12">
+ <path
+ inkscape:connector-curvature="0"
+ style="stroke:none"
+ d=""
+ id="path5450" />
+ </symbol>
+ <symbol
+ style="overflow:visible"
+ overflow="visible"
+ id="textext-da5ef958-13">
+ <path
+ inkscape:connector-curvature="0"
+ style="stroke:none"
+ d="m 3.515625,-1.265625 -0.234375,0 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 -0.046875,0.046875 -0.578125,0.046875 -0.6875,0.046875 l -1.28125,0 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 l 2.875,0 z m 0,0"
+ id="path5453" />
+ </symbol>
+ </g>
+ </defs>
+ <g
+ style="fill:#000080;stroke:#000080"
+ id="textext-da5ef958-14">
+ <g
+ style="fill:#000080;fill-opacity:1;stroke:#000080"
+ id="g5456">
+ <use
+ style="fill:#000080;stroke:#000080"
+ height="100%"
+ width="100%"
+ xlink:href="#textext-da5ef958-1"
+ x="223.43201"
+ y="126.247"
+ id="use5458" />
+ </g>
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#000080;stroke:#000080;stroke-width:0.398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
+ d="m -4.6875e-4,0.001125 59.07031275,0"
+ transform="matrix(1,0,0,-1,233.395,126.048)"
+ id="path5460" />
+ <g
+ style="fill:#000080;fill-opacity:1;stroke:#000080"
+ id="g5462">
+ <use
+ style="fill:#000080;stroke:#000080"
+ height="100%"
+ width="100%"
+ xlink:href="#textext-da5ef958-3"
+ x="233.395"
+ y="134.765"
+ id="use5464" />
+ </g>
+ <g
+ style="fill:#000080;fill-opacity:1;stroke:#000080"
+ id="g5466">
+ <use
+ style="fill:#000080;stroke:#000080"
+ height="100%"
+ width="100%"
+ xlink:href="#textext-da5ef958-9"
+ x="238.58"
+ y="134.765"
+ id="use5468" />
+ </g>
+ <g
+ style="fill:#000080;fill-opacity:1;stroke:#000080"
+ id="g5470">
+ <use
+ style="fill:#000080;stroke:#000080"
+ height="100%"
+ width="100%"
+ xlink:href="#textext-da5ef958-4"
+ x="242.455"
+ y="134.765"
+ id="use5472" />
+ </g>
+ <g
+ style="fill:#000080;fill-opacity:1;stroke:#000080"
+ id="g5474">
+ <use
+ style="fill:#000080;stroke:#000080"
+ height="100%"
+ width="100%"
+ xlink:href="#textext-da5ef958-5"
+ x="249.85622"
+ y="134.765"
+ id="use5476" />
+ </g>
+ <g
+ style="fill:#000080;fill-opacity:1;stroke:#000080"
+ id="g5478">
+ <use
+ style="fill:#000080;stroke:#000080"
+ height="100%"
+ width="100%"
+ xlink:href="#textext-da5ef958-6"
+ x="254.28758"
+ y="134.765"
+ id="use5480" />
+ </g>
+ <g
+ style="fill:#000080;fill-opacity:1;stroke:#000080"
+ id="g5482">
+ <use
+ style="fill:#000080;stroke:#000080"
+ height="100%"
+ width="100%"
+ xlink:href="#textext-da5ef958-10"
+ x="261.06299"
+ y="134.765"
+ id="use5484" />
+ </g>
+ <g
+ style="fill:#000080;fill-opacity:1;stroke:#000080"
+ id="g5486">
+ <use
+ style="fill:#000080;stroke:#000080"
+ height="100%"
+ width="100%"
+ xlink:href="#textext-da5ef958-13"
+ x="264.93701"
+ y="131.88699"
+ id="use5488" />
+ </g>
+ <g
+ style="fill:#000080;fill-opacity:1;stroke:#000080"
+ id="g5490">
+ <use
+ style="fill:#000080;stroke:#000080"
+ height="100%"
+ width="100%"
+ xlink:href="#textext-da5ef958-11"
+ x="271.621"
+ y="134.765"
+ id="use5492" />
+ </g>
+ <g
+ style="fill:#000080;fill-opacity:1;stroke:#000080"
+ id="g5494">
+ <use
+ style="fill:#000080;stroke:#000080"
+ height="100%"
+ width="100%"
+ xlink:href="#textext-da5ef958-7"
+ x="281.58301"
+ y="134.765"
+ id="use5496" />
+ </g>
+ <g
+ style="fill:#000080;fill-opacity:1;stroke:#000080"
+ id="g5498">
+ <use
+ style="fill:#000080;stroke:#000080"
+ height="100%"
+ width="100%"
+ xlink:href="#textext-da5ef958-13"
+ x="287.99301"
+ y="131.88699"
+ id="use5500" />
+ </g>
+ </g>
+ </g>
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="148.57143"
+ cy="449.89627"
+ cx="738.71753"
+ id="path4136-7"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="450.05875"
+ cx="738.13837"
+ id="path4138-8"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <g
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ id="g4147-5"
+ ns0:preamble="/home/siarzhuk/GitDrive/2015Gudhi/Aid/preamble.ini"
+ ns0:text="$w$"
+ transform="matrix(2.7020226,0,0,2.7020226,138.14964,103.80999)"
+ style="fill:#000080">
+ <defs
+ id="defs4149-9">
+ <g
+ id="g4151-7">
+ <symbol
+ id="textext-20f8880a-0-5"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path4154-3"
+ d=""
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-20f8880a-1-8"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path4157-8"
+ d="M 4.609375,-3.375 C 4.65625,-3.59375 4.75,-3.96875 4.75,-4.03125 c 0,-0.171875 -0.140625,-0.265625 -0.28125,-0.265625 -0.125,0 -0.296875,0.078125 -0.375,0.28125 -0.03125,0.0625 -0.5,1.96875 -0.5625,2.234375 C 3.453125,-1.484375 3.4375,-1.3125 3.4375,-1.125 c 0,0.109375 0,0.125 0.015625,0.171875 -0.234375,0.53125 -0.53125,0.84375 -0.921875,0.84375 -0.796875,0 -0.796875,-0.734375 -0.796875,-0.90625 0,-0.3125 0.046875,-0.703125 0.515625,-1.9375 0.109375,-0.296875 0.171875,-0.4375 0.171875,-0.640625 0,-0.4375 -0.328125,-0.8125 -0.8125,-0.8125 -0.953125,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 C 0.84375,-3.875 1.21875,-4.1875 1.578125,-4.1875 c 0.09375,0 0.25,0.015625 0.25,0.328125 0,0.25 -0.109375,0.53125 -0.1875,0.703125 -0.4375,1.171875 -0.546875,1.625 -0.546875,2.015625 0,0.90625 0.65625,1.25 1.40625,1.25 0.171875,0 0.640625,0 1.03125,-0.703125 0.265625,0.640625 0.953125,0.703125 1.25,0.703125 0.75,0 1.1875,-0.625 1.453125,-1.21875 0.328125,-0.78125 0.65625,-2.125 0.65625,-2.59375 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.0625,0.1875 0.140625,0.265625 0.109375,0.109375 0.359375,0.359375 0.359375,0.84375 0,0.34375 -0.28125,1.3125 -0.546875,1.828125 -0.25,0.53125 -0.609375,0.875 -1.09375,0.875 -0.46875,0 -0.734375,-0.296875 -0.734375,-0.875 0,-0.265625 0.0625,-0.578125 0.109375,-0.71875 z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ </g>
+ </defs>
+ <g
+ id="textext-20f8880a-2-3"
+ style="fill:#000080">
+ <g
+ id="g4160-1"
+ style="fill:#000080;fill-opacity:1">
+ <use
+ id="use4162-8"
+ y="134.765"
+ x="223.43201"
+ xlink:href="#textext-20f8880a-1-8"
+ width="100%"
+ height="100%"
+ style="fill:#000080" />
+ </g>
+ </g>
+ </g>
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="342.37451"
+ cx="681.14148"
+ id="path4138-3-96"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="353.07648"
+ cx="818.57141"
+ id="path4138-3-7-4"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="492.09607"
+ cx="668.35968"
+ id="path4138-3-0-3"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="570.21936"
+ cx="717.85718"
+ id="path4138-3-9-3"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="473.07648"
+ cx="859.28564"
+ id="path4138-3-3-3"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="478.07648"
+ cx="533.57141"
+ id="path4138-3-6-8"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="350.52393"
+ cx="594.1001"
+ id="path4138-3-06-6"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="331.64792"
+ cx="927.14288"
+ id="path4138-3-2-0"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <circle
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ r="2.7779195"
+ cy="505.21936"
+ cx="930"
+ id="path4138-3-61-4"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <g
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ id="g4558-8"
+ style="fill:#000080"
+ transform="matrix(2.7020226,0,0,2.7020226,145.6805,202.59004)"
+ ns0:preamble="/home/siarzhuk/GitDrive/2015Gudhi/Aid/preamble.ini"
+ ns0:text="$\\sigma \\subset L$">
+ <defs
+ id="defs4560-8">
+ <g
+ id="g4562-8">
+ <symbol
+ id="textext-b73c230a-0-9"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path4565-7"
+ d=""
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-b73c230a-1-7"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path4568-6"
+ d="m 5.15625,-3.71875 c 0.140625,0 0.5,0 0.5,-0.34375 0,-0.234375 -0.21875,-0.234375 -0.390625,-0.234375 l -2.28125,0 c -1.5,0 -2.609375,1.640625 -2.609375,2.828125 0,0.875 0.59375,1.578125 1.5,1.578125 1.171875,0 2.5,-1.203125 2.5,-2.734375 0,-0.171875 0,-0.65625 -0.3125,-1.09375 z M 1.890625,-0.109375 C 1.390625,-0.109375 1,-0.46875 1,-1.1875 c 0,-0.296875 0.109375,-1.109375 0.46875,-1.703125 0.421875,-0.6875 1.015625,-0.828125 1.359375,-0.828125 0.828125,0 0.90625,0.65625 0.90625,0.96875 0,0.46875 -0.203125,1.28125 -0.53125,1.796875 -0.390625,0.578125 -0.9375,0.84375 -1.3125,0.84375 z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-b73c230a-2-4"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path4571-3"
+ d="M 3.734375,-6.03125 C 3.8125,-6.390625 3.84375,-6.5 4.78125,-6.5 c 0.296875,0 0.375,0 0.375,-0.1875 0,-0.125 -0.109375,-0.125 -0.15625,-0.125 -0.328125,0 -1.140625,0.03125 -1.46875,0.03125 -0.296875,0 -1.03125,-0.03125 -1.328125,-0.03125 -0.0625,0 -0.1875,0 -0.1875,0.203125 0,0.109375 0.09375,0.109375 0.28125,0.109375 0.015625,0 0.203125,0 0.375,0.015625 0.171875,0.03125 0.265625,0.03125 0.265625,0.171875 0,0.03125 0,0.0625 -0.03125,0.1875 L 1.5625,-0.78125 c -0.09375,0.390625 -0.109375,0.46875 -0.90625,0.46875 -0.171875,0 -0.265625,0 -0.265625,0.203125 C 0.390625,0 0.484375,0 0.65625,0 l 4.625,0 C 5.515625,0 5.515625,0 5.578125,-0.171875 L 6.375,-2.328125 c 0.03125,-0.109375 0.03125,-0.125 0.03125,-0.140625 0,-0.03125 -0.03125,-0.109375 -0.109375,-0.109375 -0.09375,0 -0.109375,0.0625 -0.171875,0.21875 -0.34375,0.90625 -0.78125,2.046875 -2.5,2.046875 l -0.9375,0 c -0.140625,0 -0.171875,0 -0.21875,0 -0.109375,-0.015625 -0.140625,-0.03125 -0.140625,-0.109375 0,-0.03125 0,-0.046875 0.046875,-0.21875 z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-b73c230a-3-0"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path4574-3"
+ d=""
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-b73c230a-4-0"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path4577-9"
+ d="m 6.5625,-4.984375 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.203125 -0.1875,-0.203125 -0.359375,-0.203125 l -2.671875,0 c -1.703125,0 -3.0625,1.296875 -3.0625,2.890625 0,1.609375 1.359375,2.90625 3.0625,2.90625 l 2.671875,0 c 0.171875,0 0.359375,0 0.359375,-0.203125 C 6.921875,0 6.734375,0 6.5625,0 L 3.90625,0 c -1.546875,0 -2.6875,-1.15625 -2.6875,-2.5 0,-1.328125 1.140625,-2.484375 2.6875,-2.484375 z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ </g>
+ </defs>
+ <g
+ id="textext-b73c230a-5-2">
+ <g
+ id="g4580-5"
+ style="fill:#000000;fill-opacity:1">
+ <use
+ id="use4582-4"
+ y="134.765"
+ x="223.43201"
+ xlink:href="#textext-b73c230a-1-7"
+ width="100%"
+ height="100%" />
+ </g>
+ <g
+ id="g4584-0"
+ style="fill:#000000;fill-opacity:1">
+ <use
+ id="use4586-5"
+ y="134.765"
+ x="232.25"
+ xlink:href="#textext-b73c230a-4-0"
+ width="100%"
+ height="100%" />
+ </g>
+ <g
+ id="g4588-9"
+ style="fill:#000000;fill-opacity:1">
+ <use
+ id="use4590-4"
+ y="134.765"
+ x="242.76601"
+ xlink:href="#textext-b73c230a-2-4"
+ width="100%"
+ height="100%" />
+ </g>
+ </g>
+ </g>
+ <path
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ style="fill:#000080;fill-rule:evenodd;stroke:#000080;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-8)"
+ d="m 737.85714,449.50504 148.57143,-8.57143"
+ id="path5000-6"
+ inkscape:connector-curvature="0" />
+ <circle
+ r="80.779091"
+ cy="449.46512"
+ cx="737.3952"
+ id="path6334"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.98999999;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:1.06622958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.19868871, 3.19868871;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <g
+ id="g6495"
+ style="fill:#000080;stroke:#000080"
+ transform="matrix(1.3952558,-0.07472613,0.07472613,1.3952558,431.03302,272.05923)"
+ ns0:preamble="/home/siarzhuk/GitDrive/2015Gudhi/Aid/preamble.ini"
+ ns0:text="$\\sqrt{d(w,L \\setminus \\sigma)^2 + \\alpha^2}$">
+ <defs
+ id="defs6497">
+ <g
+ id="g6499">
+ <symbol
+ id="textext-c0d6e8dc-0"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path6502"
+ d=""
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-c0d6e8dc-1"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path6505"
+ d="m 4.234375,11.5625 c 0.296875,0 0.3125,-0.01563 0.40625,-0.203125 l 5.453125,-11.375 c 0.07813,-0.140625 0.07813,-0.15625 0.07813,-0.1875 0,-0.109375 -0.07813,-0.203125 -0.203125,-0.203125 -0.125,0 -0.171875,0.09375 -0.21875,0.203125 L 4.609375,10.53125 2.484375,5.578125 1.09375,6.65625 1.25,6.8125 1.953125,6.265625 Z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-c0d6e8dc-2"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path6508"
+ d=""
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-c0d6e8dc-3"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path6511"
+ d="m 5.140625,-6.8125 c 0,0 0,-0.109375 -0.125,-0.109375 -0.15625,0 -1.09375,0.09375 -1.265625,0.109375 -0.078125,0.015625 -0.140625,0.0625 -0.140625,0.1875 0,0.125 0.09375,0.125 0.234375,0.125 0.484375,0 0.5,0.0625 0.5,0.171875 L 4.3125,-6.125 3.71875,-3.765625 C 3.53125,-4.140625 3.25,-4.40625 2.796875,-4.40625 c -1.15625,0 -2.390625,1.46875 -2.390625,2.921875 0,0.9375 0.546875,1.59375 1.3125,1.59375 0.203125,0 0.703125,-0.046875 1.296875,-0.75 0.078125,0.421875 0.4375,0.75 0.90625,0.75 0.359375,0 0.578125,-0.234375 0.75,-0.546875 0.15625,-0.359375 0.296875,-0.96875 0.296875,-0.984375 0,-0.109375 -0.09375,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.046875 -0.140625,0.1875 -0.171875,0.640625 -0.34375,1.234375 -0.75,1.234375 -0.28125,0 -0.296875,-0.265625 -0.296875,-0.453125 0,-0.25 0.015625,-0.3125 0.046875,-0.484375 z m -2.0625,5.625 C 3.015625,-1 3.015625,-0.984375 2.875,-0.8125 2.4375,-0.265625 2.03125,-0.109375 1.75,-0.109375 c -0.5,0 -0.640625,-0.546875 -0.640625,-0.9375 0,-0.5 0.3125,-1.71875 0.546875,-2.1875 0.3125,-0.578125 0.75,-0.953125 1.15625,-0.953125 0.640625,0 0.78125,0.8125 0.78125,0.875 0,0.0625 -0.015625,0.125 -0.03125,0.171875 z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-c0d6e8dc-4"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path6514"
+ d="M 4.609375,-3.375 C 4.65625,-3.59375 4.75,-3.96875 4.75,-4.03125 c 0,-0.171875 -0.140625,-0.265625 -0.28125,-0.265625 -0.125,0 -0.296875,0.078125 -0.375,0.28125 -0.03125,0.0625 -0.5,1.96875 -0.5625,2.234375 C 3.453125,-1.484375 3.4375,-1.3125 3.4375,-1.125 c 0,0.109375 0,0.125 0.015625,0.171875 -0.234375,0.53125 -0.53125,0.84375 -0.921875,0.84375 -0.796875,0 -0.796875,-0.734375 -0.796875,-0.90625 0,-0.3125 0.046875,-0.703125 0.515625,-1.9375 0.109375,-0.296875 0.171875,-0.4375 0.171875,-0.640625 0,-0.4375 -0.328125,-0.8125 -0.8125,-0.8125 -0.953125,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 C 0.84375,-3.875 1.21875,-4.1875 1.578125,-4.1875 c 0.09375,0 0.25,0.015625 0.25,0.328125 0,0.25 -0.109375,0.53125 -0.1875,0.703125 -0.4375,1.171875 -0.546875,1.625 -0.546875,2.015625 0,0.90625 0.65625,1.25 1.40625,1.25 0.171875,0 0.640625,0 1.03125,-0.703125 0.265625,0.640625 0.953125,0.703125 1.25,0.703125 0.75,0 1.1875,-0.625 1.453125,-1.21875 0.328125,-0.78125 0.65625,-2.125 0.65625,-2.59375 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.0625,0.1875 0.140625,0.265625 0.109375,0.109375 0.359375,0.359375 0.359375,0.84375 0,0.34375 -0.28125,1.3125 -0.546875,1.828125 -0.25,0.53125 -0.609375,0.875 -1.09375,0.875 -0.46875,0 -0.734375,-0.296875 -0.734375,-0.875 0,-0.265625 0.0625,-0.578125 0.109375,-0.71875 z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-c0d6e8dc-5"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path6517"
+ d="m 2.03125,-0.015625 c 0,-0.65625 -0.25,-1.046875 -0.640625,-1.046875 -0.328125,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.265625 1.0625,0 1.390625,0 1.5,0 1.640625,-0.046875 1.734375,-0.125 1.765625,-0.15625 1.78125,-0.15625 1.78125,-0.15625 c 0.015625,0 0.015625,0 0.015625,0.140625 0,0.75 -0.34375,1.34375 -0.671875,1.671875 -0.109375,0.109375 -0.109375,0.125 -0.109375,0.15625 0,0.078125 0.046875,0.109375 0.09375,0.109375 0.109375,0 0.921875,-0.765625 0.921875,-1.9375 z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-c0d6e8dc-6"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path6520"
+ d="M 3.734375,-6.03125 C 3.8125,-6.390625 3.84375,-6.5 4.78125,-6.5 c 0.296875,0 0.375,0 0.375,-0.1875 0,-0.125 -0.109375,-0.125 -0.15625,-0.125 -0.328125,0 -1.140625,0.03125 -1.46875,0.03125 -0.296875,0 -1.03125,-0.03125 -1.328125,-0.03125 -0.0625,0 -0.1875,0 -0.1875,0.203125 0,0.109375 0.09375,0.109375 0.28125,0.109375 0.015625,0 0.203125,0 0.375,0.015625 0.171875,0.03125 0.265625,0.03125 0.265625,0.171875 0,0.03125 0,0.0625 -0.03125,0.1875 L 1.5625,-0.78125 c -0.09375,0.390625 -0.109375,0.46875 -0.90625,0.46875 -0.171875,0 -0.265625,0 -0.265625,0.203125 C 0.390625,0 0.484375,0 0.65625,0 l 4.625,0 C 5.515625,0 5.515625,0 5.578125,-0.171875 L 6.375,-2.328125 c 0.03125,-0.109375 0.03125,-0.125 0.03125,-0.140625 0,-0.03125 -0.03125,-0.109375 -0.109375,-0.109375 -0.09375,0 -0.109375,0.0625 -0.171875,0.21875 -0.34375,0.90625 -0.78125,2.046875 -2.5,2.046875 l -0.9375,0 c -0.140625,0 -0.171875,0 -0.21875,0 -0.109375,-0.015625 -0.140625,-0.03125 -0.140625,-0.109375 0,-0.03125 0,-0.046875 0.046875,-0.21875 z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-c0d6e8dc-7"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path6523"
+ d="m 5.15625,-3.71875 c 0.140625,0 0.5,0 0.5,-0.34375 0,-0.234375 -0.21875,-0.234375 -0.390625,-0.234375 l -2.28125,0 c -1.5,0 -2.609375,1.640625 -2.609375,2.828125 0,0.875 0.59375,1.578125 1.5,1.578125 1.171875,0 2.5,-1.203125 2.5,-2.734375 0,-0.171875 0,-0.65625 -0.3125,-1.09375 z M 1.890625,-0.109375 C 1.390625,-0.109375 1,-0.46875 1,-1.1875 c 0,-0.296875 0.109375,-1.109375 0.46875,-1.703125 0.421875,-0.6875 1.015625,-0.828125 1.359375,-0.828125 0.828125,0 0.90625,0.65625 0.90625,0.96875 0,0.46875 -0.203125,1.28125 -0.53125,1.796875 -0.390625,0.578125 -0.9375,0.84375 -1.3125,0.84375 z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-c0d6e8dc-8"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path6526"
+ d="m 4.75,-2.359375 c 0,-1.5625 -0.921875,-2.046875 -1.65625,-2.046875 -1.375,0 -2.6875,1.421875 -2.6875,2.828125 0,0.9375 0.59375,1.6875 1.625,1.6875 0.625,0 1.34375,-0.234375 2.09375,-0.84375 0.125,0.53125 0.453125,0.84375 0.90625,0.84375 0.53125,0 0.84375,-0.546875 0.84375,-0.703125 0,-0.078125 -0.0625,-0.109375 -0.125,-0.109375 -0.0625,0 -0.09375,0.03125 -0.125,0.109375 -0.1875,0.484375 -0.546875,0.484375 -0.5625,0.484375 -0.3125,0 -0.3125,-0.78125 -0.3125,-1.015625 0,-0.203125 0,-0.234375 0.109375,-0.34375 C 5.796875,-2.65625 6,-3.8125 6,-3.8125 6,-3.84375 5.984375,-3.921875 5.875,-3.921875 c -0.09375,0 -0.09375,0.03125 -0.140625,0.21875 -0.1875,0.625 -0.515625,1.375 -0.984375,1.96875 z m -0.65625,1.375 c -0.890625,0.765625 -1.65625,0.875 -2.046875,0.875 -0.59375,0 -0.90625,-0.453125 -0.90625,-1.09375 0,-0.484375 0.265625,-1.5625 0.578125,-2.0625 C 2.1875,-4 2.734375,-4.1875 3.078125,-4.1875 c 0.984375,0 0.984375,1.3125 0.984375,2.078125 0,0.375 0,0.953125 0.03125,1.125 z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-c0d6e8dc-9"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path6529"
+ d=""
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-c0d6e8dc-10"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path6532"
+ d="m 3.296875,2.390625 c 0,-0.03125 0,-0.046875 -0.171875,-0.21875 C 1.890625,0.921875 1.5625,-0.96875 1.5625,-2.5 c 0,-1.734375 0.375,-3.46875 1.609375,-4.703125 0.125,-0.125 0.125,-0.140625 0.125,-0.171875 0,-0.078125 -0.03125,-0.109375 -0.09375,-0.109375 -0.109375,0 -1,0.6875 -1.59375,1.953125 -0.5,1.09375 -0.625,2.203125 -0.625,3.03125 0,0.78125 0.109375,1.984375 0.65625,3.125 C 2.25,1.84375 3.09375,2.5 3.203125,2.5 c 0.0625,0 0.09375,-0.03125 0.09375,-0.109375 z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-c0d6e8dc-11"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path6535"
+ d="m 2.875,-2.5 c 0,-0.765625 -0.109375,-1.96875 -0.65625,-3.109375 -0.59375,-1.21875 -1.453125,-1.875 -1.546875,-1.875 -0.0625,0 -0.109375,0.046875 -0.109375,0.109375 0,0.03125 0,0.046875 0.1875,0.234375 0.984375,0.984375 1.546875,2.5625 1.546875,4.640625 0,1.71875 -0.359375,3.46875 -1.59375,4.71875 C 0.5625,2.34375 0.5625,2.359375 0.5625,2.390625 0.5625,2.453125 0.609375,2.5 0.671875,2.5 0.765625,2.5 1.671875,1.8125 2.25,0.546875 2.765625,-0.546875 2.875,-1.65625 2.875,-2.5 Z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-c0d6e8dc-12"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path6538"
+ d="m 4.078125,-2.296875 2.78125,0 C 7,-2.296875 7.1875,-2.296875 7.1875,-2.5 7.1875,-2.6875 7,-2.6875 6.859375,-2.6875 l -2.78125,0 0,-2.796875 c 0,-0.140625 0,-0.328125 -0.203125,-0.328125 -0.203125,0 -0.203125,0.1875 -0.203125,0.328125 l 0,2.796875 -2.78125,0 c -0.140625,0 -0.328125,0 -0.328125,0.1875 0,0.203125 0.1875,0.203125 0.328125,0.203125 l 2.78125,0 0,2.796875 c 0,0.140625 0,0.328125 0.203125,0.328125 0.203125,0 0.203125,-0.1875 0.203125,-0.328125 z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-c0d6e8dc-13"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path6541"
+ d=""
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-c0d6e8dc-14"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path6544"
+ d="m 4,2.25 c 0.046875,0.140625 0.09375,0.25 0.234375,0.25 0.109375,0 0.1875,-0.09375 0.1875,-0.203125 0,-0.03125 0,-0.046875 -0.046875,-0.15625 l -3.40625,-9.375 c -0.0625,-0.171875 -0.09375,-0.25 -0.21875,-0.25 -0.109375,0 -0.203125,0.09375 -0.203125,0.203125 0,0.03125 0,0.046875 0.046875,0.15625 z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-c0d6e8dc-15"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path6547"
+ d=""
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ <symbol
+ id="textext-c0d6e8dc-16"
+ overflow="visible"
+ style="overflow:visible">
+ <path
+ id="path6550"
+ d="m 3.515625,-1.265625 -0.234375,0 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 -0.046875,0.046875 -0.578125,0.046875 -0.6875,0.046875 l -1.28125,0 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 l 2.875,0 z m 0,0"
+ style="stroke:none"
+ inkscape:connector-curvature="0" />
+ </symbol>
+ </g>
+ </defs>
+ <g
+ id="textext-c0d6e8dc-17"
+ style="fill:#000080;stroke:#000080">
+ <g
+ id="g6553"
+ style="fill:#000080;fill-opacity:1;stroke:#000080">
+ <use
+ id="use6555"
+ y="126.247"
+ x="223.43201"
+ xlink:href="#textext-c0d6e8dc-1"
+ width="100%"
+ height="100%"
+ style="fill:#000080;stroke:#000080" />
+ </g>
+ <path
+ id="path6557"
+ transform="matrix(1,0,0,-1,233.395,126.048)"
+ d="m -4.6875e-4,0.001125 74.52734375,0"
+ style="fill:#000080;stroke:#000080;stroke-width:0.398;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g6559"
+ style="fill:#000080;fill-opacity:1;stroke:#000080">
+ <use
+ id="use6561"
+ y="134.765"
+ x="233.395"
+ xlink:href="#textext-c0d6e8dc-3"
+ width="100%"
+ height="100%"
+ style="fill:#000080;stroke:#000080" />
+ </g>
+ <g
+ id="g6563"
+ style="fill:#000080;fill-opacity:1;stroke:#000080">
+ <use
+ id="use6565"
+ y="134.765"
+ x="238.58"
+ xlink:href="#textext-c0d6e8dc-10"
+ width="100%"
+ height="100%"
+ style="fill:#000080;stroke:#000080" />
+ </g>
+ <g
+ id="g6567"
+ style="fill:#000080;fill-opacity:1;stroke:#000080">
+ <use
+ id="use6569"
+ y="134.765"
+ x="242.455"
+ xlink:href="#textext-c0d6e8dc-4"
+ width="100%"
+ height="100%"
+ style="fill:#000080;stroke:#000080" />
+ </g>
+ <g
+ id="g6571"
+ style="fill:#000080;fill-opacity:1;stroke:#000080">
+ <use
+ id="use6573"
+ y="134.765"
+ x="249.85622"
+ xlink:href="#textext-c0d6e8dc-5"
+ width="100%"
+ height="100%"
+ style="fill:#000080;stroke:#000080" />
+ </g>
+ <g
+ id="g6575"
+ style="fill:#000080;fill-opacity:1;stroke:#000080">
+ <use
+ id="use6577"
+ y="134.765"
+ x="254.28758"
+ xlink:href="#textext-c0d6e8dc-6"
+ width="100%"
+ height="100%"
+ style="fill:#000080;stroke:#000080" />
+ </g>
+ <g
+ id="g6579"
+ style="fill:#000080;fill-opacity:1;stroke:#000080">
+ <use
+ id="use6581"
+ y="134.765"
+ x="263.27701"
+ xlink:href="#textext-c0d6e8dc-14"
+ width="100%"
+ height="100%"
+ style="fill:#000080;stroke:#000080" />
+ </g>
+ <g
+ id="g6583"
+ style="fill:#000080;fill-opacity:1;stroke:#000080">
+ <use
+ id="use6585"
+ y="134.765"
+ x="270.47198"
+ xlink:href="#textext-c0d6e8dc-7"
+ width="100%"
+ height="100%"
+ style="fill:#000080;stroke:#000080" />
+ </g>
+ <g
+ id="g6587"
+ style="fill:#000080;fill-opacity:1;stroke:#000080">
+ <use
+ id="use6589"
+ y="134.765"
+ x="276.522"
+ xlink:href="#textext-c0d6e8dc-11"
+ width="100%"
+ height="100%"
+ style="fill:#000080;stroke:#000080" />
+ </g>
+ <g
+ id="g6591"
+ style="fill:#000080;fill-opacity:1;stroke:#000080">
+ <use
+ id="use6593"
+ y="131.88699"
+ x="280.397"
+ xlink:href="#textext-c0d6e8dc-16"
+ width="100%"
+ height="100%"
+ style="fill:#000080;stroke:#000080" />
+ </g>
+ <g
+ id="g6595"
+ style="fill:#000080;fill-opacity:1;stroke:#000080">
+ <use
+ id="use6597"
+ y="134.765"
+ x="287.07999"
+ xlink:href="#textext-c0d6e8dc-12"
+ width="100%"
+ height="100%"
+ style="fill:#000080;stroke:#000080" />
+ </g>
+ <g
+ id="g6599"
+ style="fill:#000080;fill-opacity:1;stroke:#000080">
+ <use
+ id="use6601"
+ y="134.765"
+ x="297.043"
+ xlink:href="#textext-c0d6e8dc-8"
+ width="100%"
+ height="100%"
+ style="fill:#000080;stroke:#000080" />
+ </g>
+ <g
+ id="g6603"
+ style="fill:#000080;fill-opacity:1;stroke:#000080">
+ <use
+ id="use6605"
+ y="131.88699"
+ x="303.453"
+ xlink:href="#textext-c0d6e8dc-16"
+ width="100%"
+ height="100%"
+ style="fill:#000080;stroke:#000080" />
+ </g>
+ </g>
+ </g>
+ </g>
+ <g
+ transform="translate(-130.29351,-300.82484)"
+ style="display:none"
+ inkscape:label="Layer 2"
+ id="layer2"
+ inkscape:groupmode="layer">
+ <circle
+ r="32.857143"
+ cy="448.79074"
+ cx="337.85715"
+ id="path5639"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.98999999;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+</svg>
diff --git a/doc/common/header.html b/doc/common/header.html
index a6f3ed9c..53b5c0a2 100644
--- a/doc/common/header.html
+++ b/doc/common/header.html
@@ -9,7 +9,7 @@
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
<!-- GUDHI website css for header BEGIN -->
-<link rel="stylesheet" type="text/css" href="http://gudhi.gforge.inria.fr/assets/css/styles_feeling_responsive.css" />
+<link rel="stylesheet" type="text/css" href="http://pages.saclay.inria.fr/vincent.rouvreau/gudhi/gudhi-doc-2.0.0/assets/css/styles_feeling_responsive.css" />
<!-- GUDHI website css for header END -->
<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="$relpath^jquery.js"></script>
@@ -25,6 +25,13 @@ $extrastylesheet
<!-- GUDHI website header BEGIN -->
<div id="navigation" class="sticky">
<nav class="top-bar" role="navigation" data-topbar>
+ <ul class="title-area">
+ <li class="name">
+ <h1 class="show-for-small-only"><a href="http://gudhi.gforge.inria.fr" class="icon-tree"> GUDHI C++ library</a></h1>
+ </li>
+ <!-- Remove the class "menu-icon" to get rid of menu icon. Take out "Menu" to just have icon alone -->
+ <li class="toggle-topbar menu-icon"><a href="#"><span>Navigation</span></a></li>
+ </ul>
<section class="top-bar-section">
<ul class="right">
<li class="divider"></li>
@@ -37,7 +44,7 @@ $extrastylesheet
<a href="#">Project</a>
<ul class="dropdown">
<li><a href="http://gudhi.gforge.inria.fr/people/">People</a></li>
- <li><a href="http://gudhi.gforge.inria.fr/getinvolved/">Get involved</a></li>
+ <li><a href="http://gudhi.gforge.inria.fr/keepintouch/">Keep in touch</a></li>
<li><a href="http://gudhi.gforge.inria.fr/partners/">Partners and Funding</a></li>
<li><a href="http://gudhi.gforge.inria.fr/relatedprojects/">Related projects</a></li>
<li><a href="http://gudhi.gforge.inria.fr/theyaretalkingaboutus/">They are talking about us</a></li>
@@ -49,11 +56,18 @@ $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="http://gudhi.gforge.inria.fr/doc/latest/installation.html">Installation manual</a></li>
</ul>
</li>
<li class="divider"></li>
- <li><a href="http://gudhi.gforge.inria.fr/doc/latest/">Documentation</a></li>
+ <li class="has-dropdown">
+ <a href="#">Documentation</a>
+ <ul class="dropdown">
+ <li><a href="http://gudhi.gforge.inria.fr/doc/latest/">C++ documentation</a></li>
+ <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>
+ </ul>
+ </li>
<li class="divider"></li>
<li><a href="http://gudhi.gforge.inria.fr/interfaces/">Interfaces</a></li>
<li class="divider"></li>
@@ -62,7 +76,7 @@ $extrastylesheet
</nav>
</div><!-- /#navigation -->
<!-- GUDHI website header BEGIN -->
-
+
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<!--BEGIN TITLEAREA-->
diff --git a/doc/common/main_page.h b/doc/common/main_page.h
index 0983051d..2e45e5aa 100644
--- a/doc/common/main_page.h
+++ b/doc/common/main_page.h
@@ -3,7 +3,9 @@
* \image html "Gudhi_banner.png" "" width=20cm
*
* \section Introduction Introduction
- * The Gudhi library (Geometry Understanding in Higher Dimensions) is a generic open source C++ library for
+ * The GUDHI library (Geometry Understanding in Higher Dimensions) is a generic open source
+ * <a class="el" target="_blank" href="http://gudhi.gforge.inria.fr/doc/latest/">C++ library</a>, with a
+ * <a class="el" target="_blank" href="http://gudhi.gforge.inria.fr/python/latest/">Python interface</a>, for
* Computational Topology and Topological Data Analysis
* (<a class="el" target="_blank" href="https://en.wikipedia.org/wiki/Topological_data_analysis">TDA</a>).
* The GUDHI library intends to help the development of new algorithmic solutions in TDA and their transfer to
@@ -28,6 +30,7 @@
<b>Author:</b> Vincent Rouvreau<br>
<b>Introduced in:</b> GUDHI 1.3.0<br>
<b>Copyright:</b> GPL v3<br>
+ <b>Requires:</b> \ref cgal &ge; 4.7.0 and \ref eigen3
</td>
<td width="75%">
Alpha_complex is a simplicial complex constructed from the finite cells of a Delaunay Triangulation.<br>
@@ -55,6 +58,24 @@
<b>User manual:</b> \ref cubical_complex - <b>Reference manual:</b> Gudhi::cubical_complex::Bitmap_cubical_complex
</td>
</tr>
+ \subsection RipsComplexDataStructure Rips complex
+ \image html "rips_complex_representation.png" "Rips complex representation"
+<table border="0">
+ <tr>
+ <td width="25%">
+ <b>Author:</b> Cl&eacute;ment Maria, Pawel Dlotko, Vincent Rouvreau<br>
+ <b>Introduced in:</b> GUDHI 2.0.0<br>
+ <b>Copyright:</b> GPL v3<br>
+ </td>
+ <td width="75%">
+ Rips_complex is a simplicial complex constructed from a one skeleton graph.<br>
+ The filtration value of each edge is computed from a user-given distance function and is inserted until a
+ user-given threshold value.<br>
+ This complex can be built from a point cloud and a distance function, or from a distance matrix.<br>
+ <b>User manual:</b> \ref rips_complex - <b>Reference manual:</b> Gudhi::rips_complex::Rips_complex
+ </td>
+ </tr>
+</table>
</table>
\subsection SimplexTreeDataStructure Simplex tree
\image html "Simplex_tree_representation.png" "Simplex tree representation"
@@ -93,6 +114,26 @@
</td>
</tr>
</table>
+ \subsection TangentialComplexDataStructure Tangential complex
+ \image html "tc_examples.png" "Tangential complex representation"
+<table border="0">
+ <tr>
+ <td width="25%">
+ <b>Author:</b> Cl&eacute;ment Jamin<br>
+ <b>Introduced in:</b> GUDHI 2.0.0<br>
+ <b>Copyright:</b> GPL v3<br>
+ <b>Requires:</b> \ref cgal &ge; 4.8.1 and \ref eigen3
+ </td>
+ <td width="75%">
+ A Tangential Delaunay complex is a <a target="_blank" href="https://en.wikipedia.org/wiki/Simplicial_complex">simplicial complex</a>
+ designed to reconstruct a \f$ k \f$-dimensional manifold embedded in \f$ d \f$-dimensional Euclidean space.
+ The input is a point sample coming from an unknown manifold.
+ The running time depends only linearly on the extrinsic dimension \f$ d \f$
+ and exponentially on the intrinsic dimension \f$ k \f$.<br>
+ <b>User manual:</b> \ref tangential_complex - <b>Reference manual:</b> Gudhi::tangential_complex::Tangential_complex
+ </td>
+ </tr>
+</table>
\subsection WitnessComplexDataStructure Witness complex
\image html "Witness_complex_representation.png" "Witness complex representation"
<table border="0">
@@ -101,6 +142,7 @@
<b>Author:</b> Siargey Kachanovich<br>
<b>Introduced in:</b> GUDHI 1.3.0<br>
<b>Copyright:</b> GPL v3<br>
+ <b>Euclidean version requires:</b> \ref cgal &ge; 4.6.0 and \ref eigen3
</td>
<td width="75%">
Witness complex \f$ Wit(W,L) \f$ is a simplicial complex defined on two sets of points in \f$\mathbb{R}^D\f$.
@@ -111,6 +153,26 @@
</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">
+ <tr>
+ <td width="25%">
+ <b>Author:</b> Fran&ccedil;ois Godi<br>
+ <b>Introduced in:</b> GUDHI 2.0.0<br>
+ <b>Copyright:</b> GPL v3<br>
+ <b>Requires:</b> \ref cgal &ge; 4.8.1 and \ref eigen3
+ </td>
+ <td width="75%">
+ Bottleneck distance measures the similarity between two persistence diagrams.
+ It's the shortest distance b for which there exists a perfect matching between
+ the points of the two diagrams (+ all the diagonal points) such that
+ any couple of matched points are at distance at most b.
+ <br>
+ <b>User manual:</b> \ref bottleneck_distance
+ </td>
+ </tr>
+</table>
\subsection ContractionToolbox Contraction
\image html "sphere_contraction_representation.png" "Sphere contraction example"
<table border="0">
@@ -153,11 +215,11 @@
</table>
*/
-/*! \page installation Gudhi installation
+/*! \page installation GUDHI installation
* \tableofcontents
- * As Gudhi is a header only library, there is no need to install the library.
+ * 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.
+ * 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
@@ -176,39 +238,54 @@ make \endverbatim
* 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:
+ * \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_2performance_rips_persistence_8cpp-example.html">
- * Persistent_cohomology/performance_rips_persistence.cpp</a>
* \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 and few examples requires CGAL, which is a C++ library which provides easy
- * access to efficient and reliable geometric algorithms.
+ * \subsection cgal CGAL
+ * The \ref alpha_complex data structure, \ref bottleneck_distance, and few examples requires CGAL, which is a C++
+ * library which provides easy access to efficient and reliable geometric algorithms.
+ *
+ * \note There is no need to install CGAL, you can just <CODE>cmake . && make</CODE> CGAL (or even
+ * <CODE>cmake -DCGAL_HEADER_ONLY=ON .</CODE> for CGAL version &ge; 4.8.0), thereafter you will be able to compile
+ * GUDHI by calling <CODE>cmake -DCGAL_DIR=/your/path/to/CGAL-X.Y .. && make</CODE>
*
- * Having CGAL version 4.4 or higher installed is recommended. The procedure to install this library according to
+ * 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="_simplex_tree_2simplex_tree_from_alpha_shapes_3_8cpp-example.html">
- * Simplex_tree/simplex_tree_from_alpha_shapes_3.cpp</a>
+ * \li <a href="_persistent_cohomology_2exact_alpha_complex_3d_persistence_8cpp-example.html">
+ * Persistent_cohomology/exact_alpha_complex_3d_persistence.cpp</a>
+ * \li <a href="_persistent_cohomology_2weighted_alpha_complex_3d_persistence_8cpp-example.html">
+ * Persistent_cohomology/weighted_alpha_complex_3d_persistence.cpp</a>
+ * \li <a href="_simplex_tree_2example_alpha_shapes_3_simplex_tree_from_off_file_8cpp-example.html">
+ * Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp</a>
*
- * The following example requires CGAL version &ge; 4.6:
+ * The following example requires CGAL version &ge; 4.6.0:
* \li <a href="_witness_complex_2witness_complex_sphere_8cpp-example.html">
* Witness_complex/witness_complex_sphere.cpp</a>
*
- * The following example requires CGAL version &ge; 4.7:
+ * The following example requires CGAL version &ge; 4.7.0:
* \li <a href="_alpha_complex_2_alpha_complex_from_off_8cpp-example.html">
* Alpha_complex/Alpha_complex_from_off.cpp</a>
* \li <a href="_alpha_complex_2_alpha_complex_from_points_8cpp-example.html">
@@ -220,7 +297,29 @@ make \endverbatim
* \li <a href="_persistent_cohomology_2custom_persistence_sort_8cpp-example.html">
* Persistent_cohomology/custom_persistence_sort.cpp</a>
*
- * \subsection eigen3 Eigen3:
+ * The following example requires CGAL version &ge; 4.8.1:
+ * \li <a href="_bottleneck_distance_2alpha_rips_persistence_bottleneck_distance_8cpp-example.html">
+ * Bottleneck_distance/alpha_rips_persistence_bottleneck_distance.cpp.cpp</a>
+ * \li <a href="_bottleneck_distance_2bottleneck_basic_example_8cpp-example.html">
+ * Bottleneck_distance/bottleneck_basic_example.cpp</a>
+ * \li <a href="_bottleneck_distance_2bottleneck_read_file_example_8cpp-example.html">
+ * Bottleneck_distance/bottleneck_read_file_example.cpp</a>
+ * \li <a href="_spatial_searching_2example_spatial_searching_8cpp-example.html">
+ * Spatial_searching/example_spatial_searching.cpp</a>
+ * \li <a href="_subsampling_2example_choose_n_farthest_points_8cpp-example.html">
+ * Subsampling/example_choose_n_farthest_points.cpp</a>
+ * \li <a href="_subsampling_2example_custom_kernel_8cpp-example.html">
+ * Subsampling/example_custom_kernel.cpp</a>
+ * \li <a href="_subsampling_2example_pick_n_random_points_8cpp-example.html">
+ * Subsampling/example_pick_n_random_points.cpp</a>
+ * \li <a href="_subsampling_2example_sparsify_point_set_8cpp-example.html">
+ * Subsampling/example_sparsify_point_set.cpp</a>
+ * \li <a href="_tangential_complex_2example_basic_8cpp-example.html">
+ * Tangential_complex/example_basic.cpp</a>
+ * \li <a href="_tangential_complex_2example_with_perturb_8cpp-example.html">
+ * Tangential_complex/example_with_perturb.cpp</a>
+ *
+ * \subsection eigen3 Eigen3
* The \ref alpha_complex data structure and few examples requires
* <a target="_blank" href="http://eigen.tuxfamily.org/">Eigen3</a> is a C++ template library for linear algebra:
* matrices, vectors, numerical solvers, and related algorithms.
@@ -228,9 +327,9 @@ make \endverbatim
* 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> (requires also Eigen3)
+ * 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> (requires also Eigen3)
+ * 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">
@@ -238,7 +337,7 @@ make \endverbatim
* \li <a href="_persistent_cohomology_2custom_persistence_sort_8cpp-example.html">
* Persistent_cohomology/custom_persistence_sort.cpp</a>
*
- * \subsection tbb Threading Building Blocks:
+ * \subsection tbb Threading Building Blocks
* <a target="_blank" href="https://www.threadingbuildingblocks.org/">Intel&reg; TBB</a> lets you easily write parallel
* C++ programs that take full advantage of multicore performance, that are portable and composable, and that have
* future-proof scalability.
@@ -262,8 +361,8 @@ make \endverbatim
* 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_2simplex_tree_from_alpha_shapes_3_8cpp-example.html">
- * Simplex_tree/simplex_tree_from_alpha_shapes_3.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">
@@ -272,28 +371,38 @@ make \endverbatim
* 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_2performance_rips_persistence_8cpp-example.html">
- * Persistent_cohomology/performance_rips_persistence.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.
+ * GUDHI is open to external contributions. If you want to join our development team, please contact us.
*
*/
@@ -308,36 +417,55 @@ make \endverbatim
* \verbinclude biblio/how_to_cite_gudhi.bib
*/
-// List of Gudhi examples - Doxygen needs at least a file tag to analyse comments
+// 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/CGAL_3D_points_off_reader.cpp
- * @example common/CGAL_points_off_reader.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/performance_rips_persistence.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/simplex_tree_from_alpha_shapes_3.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 Witness_complex/witness_complex_from_file.cpp
- * @example Witness_complex/witness_complex_sphere.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/doc/common/main_page.h~ b/doc/common/main_page.h~
deleted file mode 100644
index abe7398b..00000000
--- a/doc/common/main_page.h~
+++ /dev/null
@@ -1,341 +0,0 @@
-/*! \mainpage
- * \tableofcontents
- * \image html "Gudhi_banner.png" "" width=20cm
- *
- * \section Introduction Introduction
- * The Gudhi library (Geometry Understanding in Higher Dimensions) is a generic open source C++ library for
- * Computational Topology and Topological Data Analysis
- * (<a class="el" target="_blank" href="https://en.wikipedia.org/wiki/Topological_data_analysis">TDA</a>).
- * The GUDHI library intends to help the development of new algorithmic solutions in TDA and their transfer to
- * applications. It provides robust, efficient, flexible and easy to use implementations of state-of-the-art
- * algorithms and data structures.
- *
- * The current release of the GUDHI library includes:
- *
- * \li Data structures to represent, construct and manipulate simplicial complexes.
- * \li Algorithms to compute persistent homology and multi-field persistent homology.
- * \li Simplication of simplicial complexes by edge contraction.
- *
- * All data-structures are generic and several of their aspects can be parameterized via template classes.
- * We refer to \cite gudhilibrary_ICMS14 for a detailed description of the design of the library.
- *
- \section DataStructures Data structures
- \subsection AlphaComplexDataStructure Alpha complex
- \image html "alpha_complex_representation.png" "Alpha complex representation"
-<table border="0">
- <tr>
- <td width="25%">
- <b>Author:</b> Vincent Rouvreau<br>
- <b>Introduced in:</b> GUDHI 1.3.0<br>
- <b>Copyright:</b> GPL v3<br>
- </td>
- <td width="75%">
- Alpha_complex is a simplicial complex constructed from the finite cells of a Delaunay Triangulation.<br>
- The filtration value of each simplex is computed as the square of the circumradius of the simplex if the
- circumsphere is empty (the simplex is then said to be Gabriel), and as the minimum of the filtration
- values of the codimension 1 cofaces that make it not Gabriel otherwise.
- All simplices that have a filtration value strictly greater than a given alpha squared value are not inserted into
- the complex.<br>
- <b>User manual:</b> \ref alpha_complex - <b>Reference manual:</b> Gudhi::alphacomplex::Alpha_complex
- </td>
- </tr>
-</table>
- \subsection CubicalComplexDataStructure Cubical complex
- \image html "Cubical_complex_representation.png" "Cubical complex representation"
-<table border="0">
- <tr>
- <td width="25%">
- <b>Author:</b> Pawel Dlotko<br>
- <b>Introduced in:</b> GUDHI 1.3.0<br>
- <b>Copyright:</b> GPL v3<br>
- </td>
- <td width="75%">
- The cubical complex is an example of a structured complex useful in computational mathematics (specially
- rigorous numerics) and image analysis.<br>
- <b>User manual:</b> \ref cubical_complex - <b>Reference manual:</b> Gudhi::Cubical_complex::Bitmap_cubical_complex
- </td>
- </tr>
-</table>
- \subsection SimplexTreeDataStructure Simplex tree
- \image html "Simplex_tree_representation.png" "Simplex tree representation"
-<table border="0">
- <tr>
- <td width="25%">
- <b>Author:</b> Cl&eacute;ment Maria<br>
- <b>Introduced in:</b> GUDHI 1.0.0<br>
- <b>Copyright:</b> GPL v3<br>
- </td>
- <td width="75%">
- The simplex tree is an efficient and flexible
- data structure for representing general (filtered) simplicial complexes. The data structure
- is described in \cite boissonnatmariasimplextreealgorithmica .<br>
- <b>User manual:</b> \ref simplex_tree - <b>Reference manual:</b> Gudhi::Simplex_tree
- </td>
- </tr>
-</table>
- \subsection SkeletonBlockerDataStructure Skeleton blocker
- \image html "ds_representation.png" "Skeleton blocker representation"
-<table border="0">
- <tr>
- <td width="25%">
- <b>Author:</b> David Salinas<br>
- <b>Introduced in:</b> GUDHI 1.1.0<br>
- <b>Copyright:</b> GPL v3<br>
- </td>
- <td width="75%">
- The Skeleton-Blocker data-structure proposes a light encoding for simplicial complexes by storing only an *implicit*
- representation of its simplices \cite socg_blockers_2011,\cite blockers2012. Intuitively, it just stores the
- 1-skeleton of a simplicial complex with a graph and the set of its "missing faces" that is very small in practice.
- This data-structure handles all simplicial complexes operations such as simplex enumeration or simplex removal but
- operations that are particularly efficient are operations that do not require simplex enumeration such as edge
- iteration, link computation or simplex contraction.<br>
- <b>User manual:</b> \ref skbl - <b>Reference manual:</b> Gudhi::skbl::Skeleton_blocker_complex
- </td>
- </tr>
-</table>
- \subsection WitnessComplexDataStructure Witness complex
- \image html "Witness_complex_representation.png" "Witness complex representation"
-<table border="0">
- <tr>
- <td width="25%">
- <b>Author:</b> Siargey Kachanovich<br>
- <b>Introduced in:</b> GUDHI 1.3.0<br>
- <b>Copyright:</b> GPL v3<br>
- </td>
- <td width="75%">
- Witness complex \f$ Wit(W,L) \f$ is a simplicial complex defined on two sets of points in \f$\mathbb{R}^D\f$.
- The data structure is described in \cite boissonnatmariasimplextreealgorithmica .<br>
- <b>User manual:</b> \ref witness_complex - <b>Reference manual:</b> Gudhi::witness_complex::SimplicialComplexForWitness
- </td>
- </tr>
-</table>
-
- \section Toolbox Toolbox
- \subsection ContractionToolbox Contraction
- \image html "sphere_contraction_representation.png" "Sphere contraction example"
-<table border="0">
- <tr>
- <td width="25%">
- <b>Author:</b> David Salinas<br>
- <b>Introduced in:</b> GUDHI 1.1.0<br>
- <b>Copyright:</b> GPL v3<br>
- </td>
- <td width="75%">
- The purpose of this package is to offer a user-friendly interface for edge contraction simplification of huge
- simplicial complexes. It uses the \ref skbl data-structure whose size remains small during simplification of most
- used geometrical complexes of topological data analysis such as the Rips or the Delaunay complexes. In practice,
- the size of this data-structure is even much lower than the total number of simplices.<br>
- <b>User manual:</b> \ref contr
- </td>
- </tr>
-</table>
- \subsection PersistentCohomologyToolbox Persistent Cohomology
- \image html "3DTorus_poch.png" "Rips Persistent Cohomology on a 3D Torus"
-<table border="0">
- <tr>
- <td width="25%">
- <b>Author:</b> Cl&eacute;ment Maria<br>
- <b>Introduced in:</b> GUDHI 1.0.0<br>
- <b>Copyright:</b> GPL v3<br>
- </td>
- <td width="75%">
- The theory of homology consists in attaching to a topological space a sequence of (homology) groups, capturing
- global topological features like connected components, holes, cavities, etc. Persistent homology studies the
- evolution -- birth, life and death -- of these features when the topological space is changing. Consequently, the
- theory is essentially composed of three elements: topological spaces, their homology groups and an evolution
- scheme.
- Computation of persistent cohomology using the algorithm of \cite DBLP:journals/dcg/SilvaMV11 and
- \cite DBLP:journals/corr/abs-1208-5018 and the Compressed Annotation Matrix implementation of
- \cite DBLP:conf/esa/BoissonnatDM13 .<br>
- <b>User manual:</b> \ref persistent_cohomology - <b>Reference manual:</b> Gudhi::persistent_cohomology::Persistent_cohomology
- </td>
- </tr>
-</table>
-*/
-
-/*! \page installation Gudhi installation
- * 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 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_2performance_rips_persistence_8cpp-example.html">
- * Persistent_cohomology/performance_rips_persistence.cpp</a>
- * \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:
- * CGAL is a C++ library which provides easy access to efficient and reliable geometric algorithms.
- *
- * Having CGAL version 4.4 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="_simplex_tree_2simplex_tree_from_alpha_shapes_3_8cpp-example.html">
- * Simplex_tree/simplex_tree_from_alpha_shapes_3.cpp</a>
- * \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>
- *
- * The following example requires CGAL version &ge; 4.6:
- * \li <a href="_witness_complex_2witness_complex_sphere_8cpp-example.html">
- * Witness_complex/witness_complex_sphere.cpp</a>
- *
- * The following example requires CGAL version &ge; 4.7:
- * \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>
- *
- * \subsection eigen3 Eigen3:
- * <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> (requires also Eigen3)
- * \li <a href="_alpha_complex_2_alpha_complex_from_points_8cpp-example.html">
- * Alpha_complex/Alpha_complex_from_points.cpp</a> (requires also Eigen3)
- * \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>
- *
- * \subsection tbb Threading Building Blocks:
- * <a target="_blank" href="https://www.threadingbuildingblocks.org/">Intel&reg; TBB</a> lets you easily write parallel
- * C++ programs that take full advantage of multicore performance, that are portable and composable, and that have
- * future-proof scalability.
- *
- * Having Intel&reg; TBB installed is recommended to parallelize and accelerate some GUDHI computations.
- *
- * The following examples are using Intel&reg; TBB if installed:
- * \li <a href="_alpha_complex_2_alpha_complex_from_off_8cpp-example.html">
- * Alpha_complex/Alpha_complex_from_off.cpp</a>
- * \li <a href="_alpha_complex_2_alpha_complex_from_points_8cpp-example.html">
- * Alpha_complex/Alpha_complex_from_points.cpp</a>
- * \li <a href="_bitmap_cubical_complex_2_bitmap_cubical_complex_8cpp-example.html">
- * Bitmap_cubical_complex/Bitmap_cubical_complex.cpp</a>
- * \li <a href="_bitmap_cubical_complex_2_bitmap_cubical_complex_periodic_boundary_conditions_8cpp-example.html">
- * Bitmap_cubical_complex/Bitmap_cubical_complex_periodic_boundary_conditions.cpp</a>
- * \li <a href="_bitmap_cubical_complex_2_random_bitmap_cubical_complex_8cpp-example.html">
- * Bitmap_cubical_complex/Random_bitmap_cubical_complex.cpp</a>
- * \li <a href="_persistent_cohomology_2alpha_complex_3d_persistence_8cpp-example.html">
- * Persistent_cohomology/alpha_complex_3d_persistence.cpp</a>
- * \li <a href="_persistent_cohomology_2alpha_complex_persistence_8cpp-example.html">
- * Persistent_cohomology/alpha_complex_persistence.cpp</a>
- * \li <a href="_simplex_tree_2simple_simplex_tree_8cpp-example.html">
- * Simplex_tree/simple_simplex_tree.cpp</a>
- * \li <a href="_simplex_tree_2simplex_tree_from_alpha_shapes_3_8cpp-example.html">
- * Simplex_tree/simplex_tree_from_alpha_shapes_3.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_shapes_persistence_8cpp-example.html">
- * Persistent_cohomology/alpha_shapes_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_2performance_rips_persistence_8cpp-example.html">
- * Persistent_cohomology/performance_rips_persistence.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_8cpp-example.html">
- * Persistent_cohomology/rips_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>
- *
- * \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
- *
- * \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 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/CGAL_3D_points_off_reader.cpp
- * @example common/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/performance_rips_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_persistence.cpp
- * @example Persistent_cohomology/custom_persistence_sort.cpp
- * @example Simplex_tree/mini_simplex_tree.cpp
- * @example Simplex_tree/simple_simplex_tree.cpp
- * @example Simplex_tree/simplex_tree_from_alpha_shapes_3.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 Witness_complex/witness_complex_from_file.cpp
- * @example Witness_complex/witness_complex_sphere.cpp
- */
-
diff --git a/example/Alpha_complex/Alpha_complex_from_off.cpp b/example/Alpha_complex/Alpha_complex_from_off.cpp
index 7836d59a..d411e90a 100644
--- a/example/Alpha_complex/Alpha_complex_from_off.cpp
+++ b/example/Alpha_complex/Alpha_complex_from_off.cpp
@@ -1,4 +1,7 @@
#include <gudhi/Alpha_complex.h>
+// to construct a simplex_tree from alpha complex
+#include <gudhi/Simplex_tree.h>
+
#include <CGAL/Epick_d.h>
#include <iostream>
@@ -14,14 +17,14 @@ void usage(int nbArgs, char * const progName) {
int main(int argc, char **argv) {
if ((argc != 3) && (argc != 4)) usage(argc, (argv[0] - 1));
- std::string off_file_name(argv[1]);
- double alpha_square_max_value = atof(argv[2]);
+ std::string off_file_name {argv[1]};
+ double alpha_square_max_value {atof(argv[2])};
// ----------------------------------------------------------------------------
// Init of an alpha complex from an OFF file
// ----------------------------------------------------------------------------
- typedef CGAL::Epick_d< CGAL::Dynamic_dimension_tag > Kernel;
- Gudhi::alpha_complex::Alpha_complex<Kernel> alpha_complex_from_file(off_file_name, alpha_square_max_value);
+ using Kernel = CGAL::Epick_d< CGAL::Dynamic_dimension_tag >;
+ Gudhi::alpha_complex::Alpha_complex<Kernel> alpha_complex_from_file(off_file_name);
std::streambuf* streambufffer;
std::ofstream ouput_file_stream;
@@ -33,23 +36,27 @@ int main(int argc, char **argv) {
streambufffer = std::cout.rdbuf();
}
- std::ostream output_stream(streambufffer);
-
- // ----------------------------------------------------------------------------
- // Display information about the alpha complex
- // ----------------------------------------------------------------------------
- output_stream << "Alpha complex is of dimension " << alpha_complex_from_file.dimension() <<
- " - " << alpha_complex_from_file.num_simplices() << " simplices - " <<
- alpha_complex_from_file.num_vertices() << " vertices." << std::endl;
-
- output_stream << "Iterator on alpha complex simplices in the filtration order, with [filtration value]:" << std::endl;
- for (auto f_simplex : alpha_complex_from_file.filtration_simplex_range()) {
- output_stream << " ( ";
- for (auto vertex : alpha_complex_from_file.simplex_vertex_range(f_simplex)) {
- output_stream << vertex << " ";
+ Gudhi::Simplex_tree<> simplex;
+ if (alpha_complex_from_file.create_complex(simplex, alpha_square_max_value)) {
+ std::ostream output_stream(streambufffer);
+
+ // ----------------------------------------------------------------------------
+ // Display information about the alpha complex
+ // ----------------------------------------------------------------------------
+ output_stream << "Alpha complex is of dimension " << simplex.dimension() <<
+ " - " << simplex.num_simplices() << " simplices - " <<
+ simplex.num_vertices() << " vertices." << std::endl;
+
+ output_stream << "Iterator on alpha complex simplices in the filtration order, with [filtration value]:" <<
+ std::endl;
+ for (auto f_simplex : simplex.filtration_simplex_range()) {
+ output_stream << " ( ";
+ for (auto vertex : simplex.simplex_vertex_range(f_simplex)) {
+ output_stream << vertex << " ";
+ }
+ output_stream << ") -> " << "[" << simplex.filtration(f_simplex) << "] ";
+ output_stream << std::endl;
}
- output_stream << ") -> " << "[" << alpha_complex_from_file.filtration(f_simplex) << "] ";
- output_stream << std::endl;
}
ouput_file_stream.close();
return 0;
diff --git a/example/Alpha_complex/Alpha_complex_from_points.cpp b/example/Alpha_complex/Alpha_complex_from_points.cpp
index 49f77276..c19f7cc8 100644
--- a/example/Alpha_complex/Alpha_complex_from_points.cpp
+++ b/example/Alpha_complex/Alpha_complex_from_points.cpp
@@ -1,14 +1,17 @@
-#include <CGAL/Epick_d.h>
#include <gudhi/Alpha_complex.h>
+// to construct a simplex_tree from alpha complex
+#include <gudhi/Simplex_tree.h>
+
+#include <CGAL/Epick_d.h>
#include <iostream>
#include <string>
#include <vector>
#include <limits> // for numeric limits
-typedef CGAL::Epick_d< CGAL::Dimension_tag<2> > Kernel;
-typedef Kernel::Point_d Point;
-typedef std::vector<Point> Vector_of_points;
+using Kernel = CGAL::Epick_d< CGAL::Dimension_tag<2> >;
+using Point = Kernel::Point_d;
+using Vector_of_points = std::vector<Point>;
void usage(int nbArgs, char * const progName) {
std::cerr << "Error: Number of arguments (" << nbArgs << ") is not correct\n";
@@ -21,7 +24,7 @@ int main(int argc, char **argv) {
if ((argc != 1) && (argc != 2)) usage(argc, (argv[0] - 1));
// Delaunay complex if alpha_square_max_value is not given by the user.
- double alpha_square_max_value = std::numeric_limits<double>::infinity();
+ double alpha_square_max_value {std::numeric_limits<double>::infinity()};
if (argc == 2)
alpha_square_max_value = atof(argv[1]);
@@ -40,23 +43,26 @@ int main(int argc, char **argv) {
// ----------------------------------------------------------------------------
// Init of an alpha complex from the list of points
// ----------------------------------------------------------------------------
- Gudhi::alpha_complex::Alpha_complex<Kernel> alpha_complex_from_points(points, alpha_square_max_value);
+ Gudhi::alpha_complex::Alpha_complex<Kernel> alpha_complex_from_points(points);
- // ----------------------------------------------------------------------------
- // Display information about the alpha complex
- // ----------------------------------------------------------------------------
- std::cout << "Alpha complex is of dimension " << alpha_complex_from_points.dimension() <<
- " - " << alpha_complex_from_points.num_simplices() << " simplices - " <<
- alpha_complex_from_points.num_vertices() << " vertices." << std::endl;
-
- std::cout << "Iterator on alpha complex simplices in the filtration order, with [filtration value]:" << std::endl;
- for (auto f_simplex : alpha_complex_from_points.filtration_simplex_range()) {
- std::cout << " ( ";
- for (auto vertex : alpha_complex_from_points.simplex_vertex_range(f_simplex)) {
- std::cout << vertex << " ";
+ Gudhi::Simplex_tree<> simplex;
+ if (alpha_complex_from_points.create_complex(simplex, alpha_square_max_value)) {
+ // ----------------------------------------------------------------------------
+ // Display information about the alpha complex
+ // ----------------------------------------------------------------------------
+ std::cout << "Alpha complex is of dimension " << simplex.dimension() <<
+ " - " << simplex.num_simplices() << " simplices - " <<
+ simplex.num_vertices() << " vertices." << std::endl;
+
+ std::cout << "Iterator on alpha complex simplices in the filtration order, with [filtration value]:" << std::endl;
+ for (auto f_simplex : simplex.filtration_simplex_range()) {
+ std::cout << " ( ";
+ for (auto vertex : simplex.simplex_vertex_range(f_simplex)) {
+ std::cout << vertex << " ";
+ }
+ std::cout << ") -> " << "[" << simplex.filtration(f_simplex) << "] ";
+ std::cout << std::endl;
}
- std::cout << ") -> " << "[" << alpha_complex_from_points.filtration(f_simplex) << "] ";
- std::cout << std::endl;
}
return 0;
}
diff --git a/example/Alpha_complex/CMakeLists.txt b/example/Alpha_complex/CMakeLists.txt
index 71a95d61..a4853d78 100644
--- a/example/Alpha_complex/CMakeLists.txt
+++ b/example/Alpha_complex/CMakeLists.txt
@@ -2,32 +2,31 @@ cmake_minimum_required(VERSION 2.6)
project(Alpha_complex_examples)
# need CGAL 4.7
-# cmake -DCGAL_DIR=~/workspace/CGAL-4.7-Ic-41 ../../..
-if(CGAL_FOUND)
- if (NOT CGAL_VERSION VERSION_LESS 4.7.0)
- if (EIGEN3_FOUND)
- add_executable ( alphapoints Alpha_complex_from_points.cpp )
- target_link_libraries(alphapoints ${Boost_SYSTEM_LIBRARY} ${Boost_THREAD_LIBRARY} ${CGAL_LIBRARY})
- add_executable ( alphaoffreader Alpha_complex_from_off.cpp )
- target_link_libraries(alphaoffreader ${Boost_SYSTEM_LIBRARY} ${Boost_THREAD_LIBRARY} ${CGAL_LIBRARY})
- if (TBB_FOUND)
- target_link_libraries(alphapoints ${TBB_LIBRARIES})
- target_link_libraries(alphaoffreader ${TBB_LIBRARIES})
- endif()
+# cmake -DCGAL_DIR=~/workspace/CGAL-4.7 ..
+if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.7.0)
+ add_executable ( Alpha_complex_example_from_points Alpha_complex_from_points.cpp )
+ target_link_libraries(Alpha_complex_example_from_points ${Boost_SYSTEM_LIBRARY} ${Boost_THREAD_LIBRARY} ${CGAL_LIBRARY})
+ add_executable ( Alpha_complex_example_from_off Alpha_complex_from_off.cpp )
+ target_link_libraries(Alpha_complex_example_from_off ${Boost_SYSTEM_LIBRARY} ${Boost_THREAD_LIBRARY} ${CGAL_LIBRARY})
+ if (TBB_FOUND)
+ target_link_libraries(Alpha_complex_example_from_points ${TBB_LIBRARIES})
+ target_link_libraries(Alpha_complex_example_from_off ${TBB_LIBRARIES})
+ endif()
- add_test(alphapoints ${CMAKE_CURRENT_BINARY_DIR}/alphapoints)
- # Do not forget to copy test files in current binary dir
- file(COPY "${CMAKE_SOURCE_DIR}/data/points/alphacomplexdoc.off" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
- add_test(alphaoffreader_doc_60 ${CMAKE_CURRENT_BINARY_DIR}/alphaoffreader alphacomplexdoc.off 60.0 ${CMAKE_CURRENT_BINARY_DIR}/alphaoffreader_result_60.txt)
- add_test(alphaoffreader_doc_32 ${CMAKE_CURRENT_BINARY_DIR}/alphaoffreader alphacomplexdoc.off 32.0 ${CMAKE_CURRENT_BINARY_DIR}/alphaoffreader_result_32.txt)
- if (DIFF_PATH)
- # Do not forget to copy test results files in current binary dir
- file(COPY "alphaoffreader_for_doc_32.txt" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
- file(COPY "alphaoffreader_for_doc_60.txt" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
+ add_test(NAME Alpha_complex_example_from_points COMMAND $<TARGET_FILE:Alpha_complex_example_from_points>)
- add_test(alphaoffreader_doc_60_diff_files ${DIFF_PATH} ${CMAKE_CURRENT_BINARY_DIR}/alphaoffreader_result_60.txt ${CMAKE_CURRENT_BINARY_DIR}/alphaoffreader_for_doc_60.txt)
- add_test(alphaoffreader_doc_32_diff_files ${DIFF_PATH} ${CMAKE_CURRENT_BINARY_DIR}/alphaoffreader_result_32.txt ${CMAKE_CURRENT_BINARY_DIR}/alphaoffreader_for_doc_32.txt)
- endif()
- endif(EIGEN3_FOUND)
- endif(NOT CGAL_VERSION VERSION_LESS 4.7.0)
-endif(CGAL_FOUND)
+ add_test(NAME Alpha_complex_example_from_off_60 COMMAND $<TARGET_FILE:Alpha_complex_example_from_off>
+ "${CMAKE_SOURCE_DIR}/data/points/alphacomplexdoc.off" "60.0" "${CMAKE_CURRENT_BINARY_DIR}/alphaoffreader_result_60.txt")
+ add_test(NAME Alpha_complex_example_from_off_32 COMMAND $<TARGET_FILE:Alpha_complex_example_from_off>
+ "${CMAKE_SOURCE_DIR}/data/points/alphacomplexdoc.off" "32.0" "${CMAKE_CURRENT_BINARY_DIR}/alphaoffreader_result_32.txt")
+ if (DIFF_PATH)
+ # Do not forget to copy test results files in current binary dir
+ file(COPY "alphaoffreader_for_doc_32.txt" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
+ file(COPY "alphaoffreader_for_doc_60.txt" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
+
+ add_test(Alpha_complex_example_from_off_60_diff_files ${DIFF_PATH}
+ ${CMAKE_CURRENT_BINARY_DIR}/alphaoffreader_result_60.txt ${CMAKE_CURRENT_BINARY_DIR}/alphaoffreader_for_doc_60.txt)
+ add_test(Alpha_complex_example_from_off_32_diff_files ${DIFF_PATH}
+ ${CMAKE_CURRENT_BINARY_DIR}/alphaoffreader_result_32.txt ${CMAKE_CURRENT_BINARY_DIR}/alphaoffreader_for_doc_32.txt)
+ endif()
+endif(NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.7.0)
diff --git a/example/Bitmap_cubical_complex/CMakeLists.txt b/example/Bitmap_cubical_complex/CMakeLists.txt
index 2fddc514..241a11e5 100644
--- a/example/Bitmap_cubical_complex/CMakeLists.txt
+++ b/example/Bitmap_cubical_complex/CMakeLists.txt
@@ -6,21 +6,31 @@ target_link_libraries(Bitmap_cubical_complex ${Boost_SYSTEM_LIBRARY})
if (TBB_FOUND)
target_link_libraries(Bitmap_cubical_complex ${TBB_LIBRARIES})
endif()
-add_test(Bitmap_cubical_complex_one_sphere ${CMAKE_CURRENT_BINARY_DIR}/Bitmap_cubical_complex ${CMAKE_SOURCE_DIR}/data/bitmap/CubicalOneSphere.txt)
-add_test(Bitmap_cubical_complex_two_sphere ${CMAKE_CURRENT_BINARY_DIR}/Bitmap_cubical_complex ${CMAKE_SOURCE_DIR}/data/bitmap/CubicalTwoSphere.txt)
+
+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 )
target_link_libraries(Random_bitmap_cubical_complex ${Boost_SYSTEM_LIBRARY})
if (TBB_FOUND)
target_link_libraries(Random_bitmap_cubical_complex ${TBB_LIBRARIES})
endif()
-add_test(Random_bitmap_cubical_complex ${CMAKE_CURRENT_BINARY_DIR}/Random_bitmap_cubical_complex 2 100 100)
+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 )
target_link_libraries(Bitmap_cubical_complex_periodic_boundary_conditions ${Boost_SYSTEM_LIBRARY})
if (TBB_FOUND)
target_link_libraries(Bitmap_cubical_complex_periodic_boundary_conditions ${TBB_LIBRARIES})
endif()
-add_test(Bitmap_cubical_complex_periodic_2d_torus ${CMAKE_CURRENT_BINARY_DIR}/Bitmap_cubical_complex_periodic_boundary_conditions ${CMAKE_SOURCE_DIR}/data/bitmap/2d_torus.txt)
-add_test(Bitmap_cubical_complex_periodic_3d_torus ${CMAKE_CURRENT_BINARY_DIR}/Bitmap_cubical_complex_periodic_boundary_conditions ${CMAKE_SOURCE_DIR}/data/bitmap/3d_torus.txt)
+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")
diff --git a/example/Bottleneck_distance/CMakeLists.txt b/example/Bottleneck_distance/CMakeLists.txt
new file mode 100644
index 00000000..0d0bff45
--- /dev/null
+++ b/example/Bottleneck_distance/CMakeLists.txt
@@ -0,0 +1,22 @@
+cmake_minimum_required(VERSION 2.6)
+project(Bottleneck_distance_examples)
+
+if (NOT CGAL_WITH_EIGEN3_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_SYSTEM_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY})
+ if (TBB_FOUND)
+ target_link_libraries(bottleneck_read_file_example ${TBB_LIBRARIES})
+ target_link_libraries(bottleneck_basic_example ${TBB_LIBRARIES})
+ target_link_libraries(alpha_rips_persistence_bottleneck_distance ${TBB_LIBRARIES})
+ endif(TBB_FOUND)
+
+ add_test(NAME Bottleneck_distance_example_basic COMMAND $<TARGET_FILE:bottleneck_basic_example>)
+
+ 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")
+
+endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1)
diff --git a/example/Bottleneck_distance/alpha_rips_persistence_bottleneck_distance.cpp b/example/Bottleneck_distance/alpha_rips_persistence_bottleneck_distance.cpp
new file mode 100644
index 00000000..fd164b22
--- /dev/null
+++ b/example/Bottleneck_distance/alpha_rips_persistence_bottleneck_distance.cpp
@@ -0,0 +1,190 @@
+/* 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/>.
+ */
+
+#include <gudhi/Alpha_complex.h>
+#include <gudhi/Rips_complex.h>
+#include <gudhi/distance_functions.h>
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/Persistent_cohomology.h>
+#include <gudhi/Points_off_io.h>
+#include <gudhi/Bottleneck.h>
+
+#include <CGAL/Epick_d.h>
+
+#include <boost/program_options.hpp>
+
+#include <string>
+#include <vector>
+#include <limits> // infinity
+#include <utility> // for pair
+#include <algorithm> // for transform
+
+
+// Types definition
+using Simplex_tree = Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_fast_persistence>;
+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 Kernel = CGAL::Epick_d< CGAL::Dynamic_dimension_tag >;
+using Point_d = Kernel::Point_d;
+using Points_off_reader = Gudhi::Points_off_reader<Point_d>;
+
+void program_options(int argc, char * argv[]
+ , std::string & off_file_points
+ , Filtration_value & threshold
+ , int & dim_max
+ , int & p
+ , Filtration_value & min_persistence);
+
+static inline std::pair<double, double> compute_root_square(std::pair<double, double> input) {
+ return std::make_pair(std::sqrt(input.first), std::sqrt(input.second));
+}
+
+int main(int argc, char * argv[]) {
+ std::string off_file_points;
+ Filtration_value threshold;
+ int dim_max;
+ int p;
+ Filtration_value min_persistence;
+
+ program_options(argc, argv, off_file_points, threshold, dim_max, p, min_persistence);
+
+ Points_off_reader off_reader(off_file_points);
+
+ // --------------------------------------------
+ // Rips persistence
+ // --------------------------------------------
+ Rips_complex rips_complex(off_reader.get_point_cloud(), threshold, Gudhi::Euclidean_distance());
+
+ // Construct the Rips complex in a Simplex Tree
+ Simplex_tree rips_stree;
+
+ rips_complex.create_complex(rips_stree, dim_max);
+ std::cout << "The Rips complex contains " << rips_stree.num_simplices() << " simplices and has dimension "
+ << rips_stree.dimension() << " \n";
+
+ // Sort the simplices in the order of the filtration
+ rips_stree.initialize_filtration();
+
+ // Compute the persistence diagram of the complex
+ Persistent_cohomology rips_pcoh(rips_stree);
+ // initializes the coefficient field for homology
+ rips_pcoh.init_coefficients(p);
+ rips_pcoh.compute_persistent_cohomology(min_persistence);
+
+ // rips_pcoh.output_diagram();
+
+ // --------------------------------------------
+ // Alpha persistence
+ // --------------------------------------------
+ Gudhi::alpha_complex::Alpha_complex<Kernel> alpha_complex(off_reader.get_point_cloud());
+
+ Simplex_tree alpha_stree;
+ alpha_complex.create_complex(alpha_stree, threshold * threshold);
+ std::cout << "The Alpha complex contains " << alpha_stree.num_simplices() << " simplices and has dimension "
+ << alpha_stree.dimension() << " \n";
+
+ // Sort the simplices in the order of the filtration
+ alpha_stree.initialize_filtration();
+
+ // Compute the persistence diagram of the complex
+ Persistent_cohomology alpha_pcoh(alpha_stree);
+ // initializes the coefficient field for homology
+ alpha_pcoh.init_coefficients(p);
+ alpha_pcoh.compute_persistent_cohomology(min_persistence * min_persistence);
+
+ // alpha_pcoh.output_diagram();
+
+ // --------------------------------------------
+ // Bottleneck distance between both persistence
+ // --------------------------------------------
+ double max_b_distance {};
+ for (int dim = 0; dim < dim_max; dim ++) {
+ std::vector< std::pair< Filtration_value , Filtration_value > > rips_intervals;
+ std::vector< std::pair< Filtration_value , Filtration_value > > alpha_intervals;
+ rips_intervals = rips_pcoh.intervals_in_dimension(dim);
+ alpha_intervals = alpha_pcoh.intervals_in_dimension(dim);
+ std::transform(alpha_intervals.begin(), alpha_intervals.end(), alpha_intervals.begin(), compute_root_square);
+
+ double bottleneck_distance = Gudhi::persistence_diagram::bottleneck_distance(rips_intervals, alpha_intervals);
+ std::cout << "In dimension " << dim << ", bottleneck distance = " << bottleneck_distance << std::endl;
+ if (bottleneck_distance > max_b_distance)
+ max_b_distance = bottleneck_distance;
+ }
+ std::cout << "================================================================================" << std::endl;
+ std::cout << "Bottleneck distance is " << max_b_distance << std::endl;
+
+ return 0;
+}
+
+void program_options(int argc, char * argv[]
+ , std::string & off_file_points
+ , 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");
+
+ 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 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);
+
+ 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 Rips 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/Bottleneck_distance/bottleneck_basic_example.cpp b/example/Bottleneck_distance/bottleneck_basic_example.cpp
new file mode 100644
index 00000000..d0ca4e20
--- /dev/null
+++ b/example/Bottleneck_distance/bottleneck_basic_example.cpp
@@ -0,0 +1,50 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Authors: Francois Godi, small modifications by Pawel Dlotko
+ *
+ * Copyright (C) 2015 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/Bottleneck.h>
+
+#include <iostream>
+#include <vector>
+#include <utility> // for pair
+#include <limits> // for numeric_limits
+
+int main() {
+ std::vector< std::pair<double, double> > v1, v2;
+
+ v1.emplace_back(2.7, 3.7);
+ v1.emplace_back(9.6, 14.);
+ v1.emplace_back(34.2, 34.974);
+ v1.emplace_back(3., std::numeric_limits<double>::infinity());
+
+ v2.emplace_back(2.8, 4.45);
+ v2.emplace_back(9.5, 14.1);
+ v2.emplace_back(3.2, std::numeric_limits<double>::infinity());
+
+
+ double b = Gudhi::persistence_diagram::bottleneck_distance(v1, v2);
+
+ std::cout << "Bottleneck distance = " << b << std::endl;
+
+ b = Gudhi::persistence_diagram::bottleneck_distance(v1, v2, 0.1);
+
+ std::cout << "Approx bottleneck distance = " << b << std::endl;
+}
diff --git a/example/Bottleneck_distance/bottleneck_read_file_example.cpp b/example/Bottleneck_distance/bottleneck_read_file_example.cpp
new file mode 100644
index 00000000..bde05825
--- /dev/null
+++ b/example/Bottleneck_distance/bottleneck_read_file_example.cpp
@@ -0,0 +1,72 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Authors: Francois Godi, small modifications by Pawel Dlotko
+ *
+ * Copyright (C) 2015 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/>.
+ */
+
+#define CGAL_HAS_THREADS
+
+#include <gudhi/Bottleneck.h>
+#include <iostream>
+#include <vector>
+#include <utility> // for pair
+#include <fstream>
+#include <sstream>
+#include <string>
+
+std::vector< std::pair<double, double> > read_diagram_from_file(const char* filename) {
+ std::ifstream in;
+ in.open(filename);
+ std::vector< std::pair<double, double> > result;
+ if (!in.is_open()) {
+ std::cerr << "File : " << filename << " do not exist. The program will now terminate \n";
+ throw "File do not exist \n";
+ }
+
+ std::string line;
+ while (!in.eof()) {
+ getline(in, line);
+ if (line.length() != 0) {
+ std::stringstream lineSS;
+ lineSS << line;
+ double beginn, endd;
+ lineSS >> beginn;
+ lineSS >> endd;
+ result.push_back(std::make_pair(beginn, endd));
+ }
+ }
+ in.close();
+ return result;
+} // read_diagram_from_file
+
+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" <<
+ " distance (set by default to zero). The program will now terminate \n";
+ }
+ std::vector< std::pair< double, double > > diag1 = read_diagram_from_file(argv[1]);
+ std::vector< std::pair< double, double > > diag2 = read_diagram_from_file(argv[2]);
+ double tolerance = 0.;
+ if (argc == 4) {
+ tolerance = atof(argv[3]);
+ }
+ double b = Gudhi::persistence_diagram::bottleneck_distance(diag1, diag2, tolerance);
+ std::cout << "The distance between the diagrams is : " << b << ". The tolerance is : " << tolerance << std::endl;
+}
diff --git a/example/Contraction/CMakeLists.txt b/example/Contraction/CMakeLists.txt
index 4c09a0a7..51a6832d 100644
--- a/example/Contraction/CMakeLists.txt
+++ b/example/Contraction/CMakeLists.txt
@@ -9,7 +9,10 @@ target_link_libraries(RipsContraction ${Boost_TIMER_LIBRARY} ${Boost_SYSTEM_LIBR
target_link_libraries(GarlandHeckbert ${Boost_TIMER_LIBRARY} ${Boost_SYSTEM_LIBRARY})
-add_test(RipsContraction.tore3D.0.2 ${CMAKE_CURRENT_BINARY_DIR}/RipsContraction ${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off 0.2)
+add_test(NAME Contraction_example_tore3D_0.2 COMMAND $<TARGET_FILE:RipsContraction>
+ "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "0.2")
# TODO(DS) : These tests are too long under Windows
-#add_test(RipsContraction.sphere.0.2 ${CMAKE_CURRENT_BINARY_DIR}/RipsContraction ${CMAKE_SOURCE_DIR}/data/points/sphere3D_2646.off 0.2)
-#add_test(RipsContraction.S0310000 ${CMAKE_CURRENT_BINARY_DIR}/RipsContraction ${CMAKE_SOURCE_DIR}/data/points/SO3_10000.off 0.3)
+#add_test(NAME Contraction_example_sphere_0.2 COMMAND $<TARGET_FILE:RipsContraction>
+# "${CMAKE_SOURCE_DIR}/data/points/sphere3D_2646.off" "0.2")
+#add_test(NAME Contraction_example_SO3_0.3 COMMAND $<TARGET_FILE:RipsContraction>
+# "${CMAKE_SOURCE_DIR}/data/points/SO3_10000.off" "0.3")
diff --git a/example/Contraction/Garland_heckbert.cpp b/example/Contraction/Garland_heckbert.cpp
index cbc46e91..8b5a6a6c 100644
--- a/example/Contraction/Garland_heckbert.cpp
+++ b/example/Contraction/Garland_heckbert.cpp
@@ -35,11 +35,6 @@
#include "Garland_heckbert/Error_quadric.h"
-using namespace std;
-using namespace Gudhi;
-using namespace skeleton_blocker;
-using namespace contraction;
-
struct Geometry_trait {
typedef Point_d Point;
};
@@ -47,7 +42,8 @@ struct Geometry_trait {
/**
* The vertex stored in the complex contains a quadric.
*/
-struct Garland_heckbert_traits : public Skeleton_blocker_simple_geometric_traits<Geometry_trait> {
+struct Garland_heckbert_traits
+ : public Gudhi::skeleton_blocker::Skeleton_blocker_simple_geometric_traits<Geometry_trait> {
public:
struct Garland_heckbert_vertex : public Simple_geometric_vertex {
Error_quadric<Geometry_trait::Point> quadric;
@@ -55,9 +51,9 @@ struct Garland_heckbert_traits : public Skeleton_blocker_simple_geometric_traits
typedef Garland_heckbert_vertex Graph_vertex;
};
-typedef Skeleton_blocker_geometric_complex< Garland_heckbert_traits > Complex;
-typedef Edge_profile<Complex> EdgeProfile;
-typedef Skeleton_blocker_contractor<Complex> Complex_contractor;
+using Complex = Gudhi::skeleton_blocker::Skeleton_blocker_geometric_complex< Garland_heckbert_traits >;
+using EdgeProfile = Gudhi::contraction::Edge_profile<Complex>;
+using Complex_contractor = Gudhi::contraction::Skeleton_blocker_contractor<Complex>;
/**
* How the new vertex is placed after an edge collapse : here it is placed at
@@ -69,7 +65,7 @@ class GH_placement : public Gudhi::contraction::Placement_policy<EdgeProfile> {
public:
typedef Gudhi::contraction::Placement_policy<EdgeProfile>::Placement_type Placement_type;
- GH_placement(Complex& complex) : complex_(complex) { }
+ GH_placement(Complex& complex) : complex_(complex) { (void)complex_; }
Placement_type operator()(const EdgeProfile& profile) const override {
auto sum_quad(profile.v0().quadric);
@@ -93,7 +89,7 @@ class GH_cost : public Gudhi::contraction::Cost_policy<EdgeProfile> {
public:
typedef Gudhi::contraction::Cost_policy<EdgeProfile>::Cost_type Cost_type;
- GH_cost(Complex& complex) : complex_(complex) { }
+ GH_cost(Complex& complex) : complex_(complex) { (void)complex_; }
Cost_type operator()(EdgeProfile const& profile, boost::optional<Point> const& new_point) const override {
Cost_type res;
@@ -115,7 +111,7 @@ class GH_visitor : public Gudhi::contraction::Contraction_visitor<EdgeProfile> {
Complex& complex_;
public:
- GH_visitor(Complex& complex) : complex_(complex) { }
+ GH_visitor(Complex& complex) : complex_(complex) { (void)complex_; }
// Compute quadrics for every vertex v
// The quadric of v consists in the sum of quadric
@@ -154,7 +150,7 @@ int main(int argc, char *argv[]) {
typedef Complex::Vertex_handle Vertex_handle;
// load the points
- Skeleton_blocker_off_reader<Complex> off_reader(argv[1], complex);
+ Gudhi::skeleton_blocker::Skeleton_blocker_off_reader<Complex> off_reader(argv[1], complex);
if (!off_reader.is_valid()) {
std::cerr << "Unable to read file:" << argv[1] << std::endl;
return EXIT_FAILURE;
@@ -175,7 +171,7 @@ int main(int argc, char *argv[]) {
Complex_contractor contractor(complex,
new GH_cost(complex),
new GH_placement(complex),
- contraction::make_link_valid_contraction<EdgeProfile>(),
+ Gudhi::contraction::make_link_valid_contraction<EdgeProfile>(),
new GH_visitor(complex));
std::cout << "Contract " << num_contractions << " edges" << std::endl;
@@ -187,7 +183,7 @@ int main(int argc, char *argv[]) {
complex.num_triangles() << " triangles." << std::endl;
// write simplified complex
- Skeleton_blocker_off_writer<Complex> off_writer(argv[2], complex);
+ Gudhi::skeleton_blocker::Skeleton_blocker_off_writer<Complex> off_writer(argv[2], complex);
return EXIT_SUCCESS;
}
diff --git a/example/Contraction/Garland_heckbert/Error_quadric.h b/example/Contraction/Garland_heckbert/Error_quadric.h
index 076f1be0..e7dafaa0 100644
--- a/example/Contraction/Garland_heckbert/Error_quadric.h
+++ b/example/Contraction/Garland_heckbert/Error_quadric.h
@@ -21,8 +21,8 @@
*
*/
-#ifndef ERROR_QUADRIC_H_
-#define ERROR_QUADRIC_H_
+#ifndef GARLAND_HECKBERT_ERROR_QUADRIC_H_
+#define GARLAND_HECKBERT_ERROR_QUADRIC_H_
#include <boost/optional/optional.hpp>
@@ -179,4 +179,4 @@ template <typename Point> class Error_quadric {
}
};
-#endif // ERROR_QUADRIC_H_
+#endif // GARLAND_HECKBERT_ERROR_QUADRIC_H_
diff --git a/example/Contraction/Rips_contraction.cpp b/example/Contraction/Rips_contraction.cpp
index 978dd1cb..8289b1d3 100644
--- a/example/Contraction/Rips_contraction.cpp
+++ b/example/Contraction/Rips_contraction.cpp
@@ -27,20 +27,15 @@
#include <boost/timer/timer.hpp>
#include <iostream>
-using namespace std;
-using namespace Gudhi;
-using namespace skeleton_blocker;
-using namespace contraction;
-
struct Geometry_trait {
typedef Point_d Point;
};
-typedef Geometry_trait::Point Point;
-typedef Skeleton_blocker_simple_geometric_traits<Geometry_trait> Complex_geometric_traits;
-typedef Skeleton_blocker_geometric_complex< Complex_geometric_traits > Complex;
-typedef Edge_profile<Complex> Profile;
-typedef Skeleton_blocker_contractor<Complex> Complex_contractor;
+using Complex_geometric_traits = Gudhi::skeleton_blocker::Skeleton_blocker_simple_geometric_traits<Geometry_trait>;
+using Complex = Gudhi::skeleton_blocker::Skeleton_blocker_geometric_complex< Complex_geometric_traits >;
+using Profile = Gudhi::contraction::Edge_profile<Complex>;
+using Complex_contractor = Gudhi::contraction::Skeleton_blocker_contractor<Complex>;
+
template<typename ComplexType>
void build_rips(ComplexType& complex, double offset) {
@@ -63,7 +58,7 @@ int main(int argc, char *argv[]) {
Complex complex;
// load only the points
- Skeleton_blocker_off_reader<Complex> off_reader(argv[1], complex, true);
+ Gudhi::skeleton_blocker::Skeleton_blocker_off_reader<Complex> off_reader(argv[1], complex, true);
if (!off_reader.is_valid()) {
std::cerr << "Unable to read file:" << argv[1] << std::endl;
return EXIT_FAILURE;
@@ -80,10 +75,10 @@ int main(int argc, char *argv[]) {
complex.num_edges() << " edges" << std::endl;
Complex_contractor contractor(complex,
- new Edge_length_cost<Profile>,
- contraction::make_first_vertex_placement<Profile>(),
- contraction::make_link_valid_contraction<Profile>(),
- contraction::make_remove_popable_blockers_visitor<Profile>());
+ new Gudhi::contraction::Edge_length_cost<Profile>,
+ Gudhi::contraction::make_first_vertex_placement<Profile>(),
+ Gudhi::contraction::make_link_valid_contraction<Profile>(),
+ Gudhi::contraction::make_remove_popable_blockers_visitor<Profile>());
contractor.contract_edges();
std::cout << "Counting final number of simplices \n";
diff --git a/example/Persistent_cohomology/CMakeLists.txt b/example/Persistent_cohomology/CMakeLists.txt
index d97d1b63..3c45e79b 100644
--- a/example/Persistent_cohomology/CMakeLists.txt
+++ b/example/Persistent_cohomology/CMakeLists.txt
@@ -1,19 +1,21 @@
cmake_minimum_required(VERSION 2.6)
project(Persistent_cohomology_examples)
-# problem with Visual Studio link on Boost program_options
-add_definitions( -DBOOST_ALL_NO_LIB )
-add_definitions( -DBOOST_ALL_DYN_LINK )
-
add_executable(plain_homology plain_homology.cpp)
target_link_libraries(plain_homology ${Boost_SYSTEM_LIBRARY})
add_executable(persistence_from_simple_simplex_tree persistence_from_simple_simplex_tree.cpp)
target_link_libraries(persistence_from_simple_simplex_tree ${Boost_SYSTEM_LIBRARY})
+add_executable(rips_distance_matrix_persistence rips_distance_matrix_persistence.cpp)
+target_link_libraries(rips_distance_matrix_persistence ${Boost_SYSTEM_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY})
+
add_executable(rips_persistence rips_persistence.cpp)
target_link_libraries(rips_persistence ${Boost_SYSTEM_LIBRARY} ${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_SYSTEM_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY})
+
add_executable(rips_persistence_via_boundary_matrix rips_persistence_via_boundary_matrix.cpp)
target_link_libraries(rips_persistence_via_boundary_matrix ${Boost_SYSTEM_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY})
@@ -23,62 +25,82 @@ target_link_libraries(persistence_from_file ${Boost_SYSTEM_LIBRARY} ${Boost_PROG
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})
endif()
-add_test(plain_homology ${CMAKE_CURRENT_BINARY_DIR}/plain_homology)
-add_test(persistence_from_simple_simplex_tree ${CMAKE_CURRENT_BINARY_DIR}/persistence_from_simple_simplex_tree 1 0)
-add_test(rips_persistence_3 ${CMAKE_CURRENT_BINARY_DIR}/rips_persistence ${CMAKE_SOURCE_DIR}/data/points/Kl.txt -r 0.2 -d 3 -p 3 -m 100)
-add_test(rips_persistence_via_boundary_matrix_3 ${CMAKE_CURRENT_BINARY_DIR}/rips_persistence_via_boundary_matrix ${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.txt -r 0.3 -d 3 -p 3 -m 100)
-add_test(persistence_from_file_3_2_0 ${CMAKE_CURRENT_BINARY_DIR}/persistence_from_file ${CMAKE_SOURCE_DIR}/data/points/bunny_5000.st -p 2 -m 0)
-add_test(persistence_from_file_3_3_100 ${CMAKE_CURRENT_BINARY_DIR}/persistence_from_file ${CMAKE_SOURCE_DIR}/data/points/bunny_5000.st -p 3 -m 100)
+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>
+ "${CMAKE_SOURCE_DIR}/data/points/Kl.off" "-r" "0.16" "-d" "3" "-p" "3" "-m" "100")
+add_test(NAME Persistent_cohomology_example_from_file_3_2_0 COMMAND $<TARGET_FILE:persistence_from_file>
+ "${CMAKE_SOURCE_DIR}/data/filtered_simplicial_complex/bunny_5000_complex.fsc" "-p" "2" "-m" "0")
+add_test(NAME Persistent_cohomology_example_from_file_3_3_100 COMMAND $<TARGET_FILE:persistence_from_file>
+ "${CMAKE_SOURCE_DIR}/data/filtered_simplicial_complex/bunny_5000_complex.fsc" "-p" "3" "-m" "100")
if(GMP_FOUND)
if(GMPXX_FOUND)
add_executable(rips_multifield_persistence rips_multifield_persistence.cpp )
- target_link_libraries(rips_multifield_persistence ${Boost_SYSTEM_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY} ${GMPXX_LIBRARIES} ${GMP_LIBRARIES})
- add_executable ( performance_rips_persistence performance_rips_persistence.cpp )
- target_link_libraries(performance_rips_persistence ${Boost_SYSTEM_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY} ${GMPXX_LIBRARIES} ${GMP_LIBRARIES})
+ target_link_libraries(rips_multifield_persistence
+ ${Boost_SYSTEM_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY} ${GMPXX_LIBRARIES} ${GMP_LIBRARIES})
if (TBB_FOUND)
target_link_libraries(rips_multifield_persistence ${TBB_LIBRARIES})
- target_link_libraries(performance_rips_persistence ${TBB_LIBRARIES})
endif(TBB_FOUND)
-
- add_test(rips_multifield_persistence_2_71 ${CMAKE_CURRENT_BINARY_DIR}/rips_multifield_persistence ${CMAKE_SOURCE_DIR}/data/points/Kl.txt -r 0.2 -d 3 -p 2 -q 71 -m 100)
+ add_test(NAME Persistent_cohomology_example_multifield_2_71 COMMAND $<TARGET_FILE:rips_multifield_persistence>
+ "${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off" "-r" "0.25" "-m" "0.5" "-d" "3" "-p" "2" "-q" "71")
endif(GMPXX_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 ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY})
+ add_executable(exact_alpha_complex_3d_persistence exact_alpha_complex_3d_persistence.cpp)
+ target_link_libraries(exact_alpha_complex_3d_persistence ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY})
+ add_executable(weighted_alpha_complex_3d_persistence weighted_alpha_complex_3d_persistence.cpp)
+ target_link_libraries(weighted_alpha_complex_3d_persistence ${Boost_SYSTEM_LIBRARY} ${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(alpha_complex_3d_persistence_2_0_5 ${CMAKE_CURRENT_BINARY_DIR}/alpha_complex_3d_persistence ${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off 2 0.45)
-
-
- if (NOT CGAL_VERSION VERSION_LESS 4.7.0)
- if (EIGEN3_FOUND)
- add_executable (alpha_complex_persistence alpha_complex_persistence.cpp)
- target_link_libraries(alpha_complex_persistence ${Boost_SYSTEM_LIBRARY} ${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 ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY})
-
- add_executable(custom_persistence_sort custom_persistence_sort.cpp)
- target_link_libraries(custom_persistence_sort ${Boost_SYSTEM_LIBRARY} ${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(alpha_complex_persistence_2_0_45 ${CMAKE_CURRENT_BINARY_DIR}/alpha_complex_persistence ${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off -m 0.45 -p 2)
- add_test(periodic_alpha_complex_3d_persistence_2_0 ${CMAKE_CURRENT_BINARY_DIR}/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(custom_persistence_sort ${CMAKE_CURRENT_BINARY_DIR}/custom_persistence_sort)
- endif(EIGEN3_FOUND)
- endif (NOT CGAL_VERSION VERSION_LESS 4.7.0)
+ 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")
+
+ 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
+ ${Boost_SYSTEM_LIBRARY} ${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 ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY})
+
+ add_executable(custom_persistence_sort custom_persistence_sort.cpp)
+ target_link_libraries(custom_persistence_sort ${Boost_SYSTEM_LIBRARY} ${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>)
+ endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.7.0)
endif(CGAL_FOUND)
diff --git a/example/Persistent_cohomology/README b/example/Persistent_cohomology/README
index 7803e5ab..2ac79398 100644
--- a/example/Persistent_cohomology/README
+++ b/example/Persistent_cohomology/README
@@ -10,13 +10,13 @@ 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/Kl.txt -r 0.25 -d 3 -p 2 -m 100
+./rips_persistence ../../data/points/tore3D_1307.off -r 0.25 -m 0.5 -d 3 -p 2
output:
-210 0 0 inf
-210 1 0.0702103 inf
-2 1 0.0702103 inf
-2 2 0.159992 inf
+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
@@ -29,31 +29,45 @@ where
with Z/3Z coefficients:
-./rips_persistence ../../data/points/Kl.txt -r 0.25 -d 3 -p 3 -m 100
+./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.0702103 inf
+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:
-./rips_multifield_persistence ../../data/points/Kl.txt -r 0.25 -d 3 -p 2 -q 3 -m 100
+./rips_multifield_persistence ../../data/points/tore3D_1307.off -r 0.25 -m 0.12 -d 3 -p 2 -q 3
output:
-6 0 0 inf
-6 1 0.0702103 inf
-2 1 0.0702103 inf
-2 2 0.159992 inf
+6 0 0 inf
+6 1 0.0983494 inf
+6 1 0.104347 inf
+6 2 0.138335 inf
+6 0 0 0.122545
+6 0 0 0.121171
+6 0 0 0.120964
+6 0 0 0.12057
+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):
- ./rips_multifield_persistence ../../data/points/Kl.txt -r 0.25 -d 3 -p 2 -q 71 -m 100
+ ./rips_multifield_persistence ../../data/points/Kl.off -r 0.25 -m 0.5 -d 3 -p 2 -q 71
output:
-557940830126698960967415390 0 0 inf
-557940830126698960967415390 1 0.0702103 inf
-2 1 0.0702103 inf
-2 2 0.159992 inf
+557940830126698960967415390 0 0 inf
+557940830126698960967415390 1 0.0983494 inf
+557940830126698960967415390 1 0.104347 inf
+557940830126698960967415390 2 0.138335 inf
+557940830126698960967415390 0 0 0.122545
+557940830126698960967415390 0 0 0.121171
+557940830126698960967415390 0 0 0.120964
+557940830126698960967415390 0 0 0.12057
+557940830126698960967415390 0 0 0.12047
+557940830126698960967415390 0 0 0.120414
***********************************************************************************************************************
Example of use of ALPHA:
diff --git a/example/Persistent_cohomology/alpha_complex_3d_helper.h b/example/Persistent_cohomology/alpha_complex_3d_helper.h
new file mode 100644
index 00000000..7865e4ec
--- /dev/null
+++ b/example/Persistent_cohomology/alpha_complex_3d_helper.h
@@ -0,0 +1,76 @@
+/* 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 INRIA 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 ALPHA_COMPLEX_3D_HELPER_H_
+#define ALPHA_COMPLEX_3D_HELPER_H_
+
+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++) {
+#ifdef DEBUG_TRACES
+ std::cout << "from cell[" << i << "]=" << ch->vertex(i)->point() << std::endl;
+#endif // DEBUG_TRACES
+ the_list.push_back(ch->vertex(i));
+ }
+ return the_list;
+}
+
+template<class Vertex_list, class Facet>
+Vertex_list from_facet(const Facet& fct) {
+ Vertex_list the_list;
+ for (auto i = 0; i < 4; i++) {
+ if (fct.second != i) {
+#ifdef DEBUG_TRACES
+ std::cout << "from facet=[" << i << "]" << fct.first->vertex(i)->point() << std::endl;
+#endif // DEBUG_TRACES
+ the_list.push_back(fct.first->vertex(i));
+ }
+ }
+ return the_list;
+}
+
+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)) {
+#ifdef DEBUG_TRACES
+ std::cout << "from edge[" << i << "]=" << edg.first->vertex(i)->point() << std::endl;
+#endif // DEBUG_TRACES
+ the_list.push_back(edg.first->vertex(i));
+ }
+ }
+ return the_list;
+}
+
+template<class Vertex_list, class Vertex_handle>
+Vertex_list from_vertex(const Vertex_handle& vh) {
+ Vertex_list the_list;
+#ifdef DEBUG_TRACES
+ std::cout << "from vertex=" << vh->point() << std::endl;
+#endif // DEBUG_TRACES
+ the_list.push_back(vh);
+ return the_list;
+}
+
+#endif // ALPHA_COMPLEX_3D_HELPER_H_
diff --git a/example/Persistent_cohomology/alpha_complex_3d_persistence.cpp b/example/Persistent_cohomology/alpha_complex_3d_persistence.cpp
index 48fbb91a..fd227b82 100644
--- a/example/Persistent_cohomology/alpha_complex_3d_persistence.cpp
+++ b/example/Persistent_cohomology/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,10 +20,11 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <boost/variant.hpp>
+
#include <gudhi/Simplex_tree.h>
#include <gudhi/Persistent_cohomology.h>
#include <gudhi/Points_3D_off_io.h>
-#include <boost/variant.hpp>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Delaunay_triangulation_3.h>
@@ -39,84 +40,42 @@
#include <list>
#include <vector>
+#include "alpha_complex_3d_helper.h"
+
// Alpha_shape_3 templates type definitions
-typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
-typedef CGAL::Alpha_shape_vertex_base_3<Kernel> Vb;
-typedef CGAL::Alpha_shape_cell_base_3<Kernel> Fb;
-typedef CGAL::Triangulation_data_structure_3<Vb, Fb> Tds;
-typedef CGAL::Delaunay_triangulation_3<Kernel, Tds> Triangulation_3;
-typedef CGAL::Alpha_shape_3<Triangulation_3> Alpha_shape_3;
+using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
+using Vb = CGAL::Alpha_shape_vertex_base_3<Kernel>;
+using Fb = CGAL::Alpha_shape_cell_base_3<Kernel>;
+using Tds = CGAL::Triangulation_data_structure_3<Vb, Fb>;
+using Triangulation_3 = CGAL::Delaunay_triangulation_3<Kernel, Tds>;
+using Alpha_shape_3 = CGAL::Alpha_shape_3<Triangulation_3>;
// From file type definition
-typedef Kernel::Point_3 Point_3;
+using Point_3 = Kernel::Point_3;
// filtration with alpha values needed type definition
-typedef Alpha_shape_3::FT Alpha_value_type;
-typedef CGAL::Object Object;
-typedef 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> > > > Dispatch;
-typedef Alpha_shape_3::Cell_handle Cell_handle;
-typedef Alpha_shape_3::Facet Facet;
-typedef Alpha_shape_3::Edge Edge_3;
-typedef std::list<Alpha_shape_3::Vertex_handle> Vertex_list;
+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::list<Alpha_shape_3::Vertex_handle>;
// gudhi type definition
-typedef Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_fast_persistence> ST;
-typedef ST::Vertex_handle Simplex_tree_vertex;
-typedef std::map<Alpha_shape_3::Vertex_handle, Simplex_tree_vertex > Alpha_shape_simplex_tree_map;
-typedef std::pair<Alpha_shape_3::Vertex_handle, Simplex_tree_vertex> Alpha_shape_simplex_tree_pair;
-typedef std::vector< Simplex_tree_vertex > Simplex_tree_vector_vertex;
-typedef Gudhi::persistent_cohomology::Persistent_cohomology< ST, Gudhi::persistent_cohomology::Field_Zp > PCOH;
-
-Vertex_list from(const Cell_handle& ch) {
- Vertex_list the_list;
- for (auto i = 0; i < 4; i++) {
-#ifdef DEBUG_TRACES
- std::cout << "from cell[" << i << "]=" << ch->vertex(i)->point() << std::endl;
-#endif // DEBUG_TRACES
- the_list.push_back(ch->vertex(i));
- }
- return the_list;
-}
-
-Vertex_list from(const Facet& fct) {
- Vertex_list the_list;
- for (auto i = 0; i < 4; i++) {
- if (fct.second != i) {
-#ifdef DEBUG_TRACES
- std::cout << "from facet=[" << i << "]" << fct.first->vertex(i)->point() << std::endl;
-#endif // DEBUG_TRACES
- the_list.push_back(fct.first->vertex(i));
- }
- }
- return the_list;
-}
-
-Vertex_list from(const Edge_3& edg) {
- Vertex_list the_list;
- for (auto i = 0; i < 4; i++) {
- if ((edg.second == i) || (edg.third == i)) {
-#ifdef DEBUG_TRACES
- std::cout << "from edge[" << i << "]=" << edg.first->vertex(i)->point() << std::endl;
-#endif // DEBUG_TRACES
- the_list.push_back(edg.first->vertex(i));
- }
- }
- return the_list;
-}
-
-Vertex_list from(const Alpha_shape_3::Vertex_handle& vh) {
- Vertex_list the_list;
-#ifdef DEBUG_TRACES
- std::cout << "from vertex=" << vh->point() << std::endl;
-#endif // DEBUG_TRACES
- the_list.push_back(vh);
- return the_list;
-}
-
-void usage(char * const progName) {
+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: " << progName <<
" path_to_file_graph coeff_field_characteristic[integer > 0] min_persistence[float >= -1.0]\n";
exit(-1);
@@ -132,7 +91,7 @@ int main(int argc, char * const argv[]) {
int coeff_field_characteristic = atoi(argv[2]);
Filtration_value min_persistence = 0.0;
- int returnedScanValue = sscanf(argv[3], "%lf", &min_persistence);
+ 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]);
@@ -184,30 +143,29 @@ int main(int argc, char * const argv[]) {
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 = from_cell<Vertex_list, Cell_handle>(*cell);
count_cells++;
if (dim_max < 3) {
// Cell is of dim 3
dim_max = 3;
}
} else if (const Facet * facet = CGAL::object_cast<Facet>(&object_iterator)) {
- vertex_list = from(*facet);
+ vertex_list = from_facet<Vertex_list, Facet>(*facet);
count_facets++;
if (dim_max < 2) {
// Facet is of dim 2
dim_max = 2;
}
} else if (const Edge_3 * edge = CGAL::object_cast<Edge_3>(&object_iterator)) {
- vertex_list = from(*edge);
+ vertex_list = 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 = 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;
diff --git a/example/Persistent_cohomology/alpha_complex_persistence.cpp b/example/Persistent_cohomology/alpha_complex_persistence.cpp
index cb181936..9e84e91f 100644
--- a/example/Persistent_cohomology/alpha_complex_persistence.cpp
+++ b/example/Persistent_cohomology/alpha_complex_persistence.cpp
@@ -4,11 +4,16 @@
#include <gudhi/Alpha_complex.h>
#include <gudhi/Persistent_cohomology.h>
+// to construct a simplex_tree from alpha complex
+#include <gudhi/Simplex_tree.h>
#include <iostream>
#include <string>
#include <limits> // for numeric_limits
+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
@@ -30,35 +35,38 @@ int main(int argc, char **argv) {
// Init of an alpha complex from an OFF file
// ----------------------------------------------------------------------------
using Kernel = CGAL::Epick_d< CGAL::Dynamic_dimension_tag >;
- Gudhi::alpha_complex::Alpha_complex<Kernel> alpha_complex_from_file(off_file_points, alpha_square_max_value);
-
- // ----------------------------------------------------------------------------
- // Display information about the alpha complex
- // ----------------------------------------------------------------------------
- std::cout << "Alpha complex is of dimension " << alpha_complex_from_file.dimension() <<
- " - " << alpha_complex_from_file.num_simplices() << " simplices - " <<
- alpha_complex_from_file.num_vertices() << " vertices." << std::endl;
-
- // Sort the simplices in the order of the filtration
- alpha_complex_from_file.initialize_filtration();
-
- std::cout << "Simplex_tree dim: " << alpha_complex_from_file.dimension() << std::endl;
- // Compute the persistence diagram of the complex
- Gudhi::persistent_cohomology::Persistent_cohomology< Gudhi::alpha_complex::Alpha_complex<Kernel>,
- Gudhi::persistent_cohomology::Field_Zp > pcoh(alpha_complex_from_file);
- // 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();
+ Gudhi::alpha_complex::Alpha_complex<Kernel> alpha_complex_from_file(off_file_points);
+
+ Simplex_tree simplex;
+ if (alpha_complex_from_file.create_complex(simplex, alpha_square_max_value)) {
+ // ----------------------------------------------------------------------------
+ // 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;
+
+ // 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);
+ // 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;
diff --git a/example/Persistent_cohomology/custom_persistence_sort.cpp b/example/Persistent_cohomology/custom_persistence_sort.cpp
index 9af38611..64f2a4dc 100644
--- a/example/Persistent_cohomology/custom_persistence_sort.cpp
+++ b/example/Persistent_cohomology/custom_persistence_sort.cpp
@@ -27,6 +27,8 @@
#include <gudhi/Alpha_complex.h>
#include <gudhi/Persistent_cohomology.h>
+// to construct a simplex_tree from alpha complex
+#include <gudhi/Simplex_tree.h>
#include <iostream>
#include <iterator>
@@ -38,6 +40,9 @@
using Kernel = CGAL::Epick_d< CGAL::Dimension_tag<3> >;
using Point = Kernel::Point_d;
using Alpha_complex = Gudhi::alpha_complex::Alpha_complex<Kernel>;
+using Simplex_tree = Gudhi::Simplex_tree<>;
+using Persistent_cohomology = Gudhi::persistent_cohomology::Persistent_cohomology< Simplex_tree,
+ Gudhi::persistent_cohomology::Field_Zp >;
std::vector<Point> random_points() {
// Instanciate a random point generator
@@ -60,7 +65,7 @@ std::vector<Point> random_points() {
* Compare two intervals by dimension, then by length.
*/
struct cmp_intervals_by_dim_then_length {
- explicit cmp_intervals_by_dim_then_length(Alpha_complex * sc)
+ explicit cmp_intervals_by_dim_then_length(Simplex_tree * sc)
: sc_(sc) { }
template<typename Persistent_interval>
@@ -71,46 +76,62 @@ struct cmp_intervals_by_dim_then_length {
else
return (sc_->dimension(get < 0 > (p1)) > sc_->dimension(get < 0 > (p2)));
}
- Alpha_complex* sc_;
+ Simplex_tree* sc_;
};
int main(int argc, char **argv) {
std::vector<Point> points = random_points();
+ std::cout << "Points size=" << points.size() << std::endl;
// Alpha complex persistence computation from generated points
- Alpha_complex alpha_complex_from_points(points, 0.6);
-
- using Persistent_cohomology = Gudhi::persistent_cohomology::Persistent_cohomology< Alpha_complex,
- Gudhi::persistent_cohomology::Field_Zp >;
- Persistent_cohomology pcoh(alpha_complex_from_points);
-
- // initializes the coefficient field for homology - Z/3Z
- pcoh.init_coefficients(3);
- pcoh.compute_persistent_cohomology(0.2);
-
- // Custom sort and output persistence
- cmp_intervals_by_dim_then_length cmp(&alpha_complex_from_points);
- auto persistent_pairs = pcoh.get_persistent_pairs();
- std::sort(std::begin(persistent_pairs), std::end(persistent_pairs), cmp);
- for (auto pair : persistent_pairs) {
- std::cout << alpha_complex_from_points.dimension(get<0>(pair)) << " "
- << alpha_complex_from_points.filtration(get<0>(pair)) << " "
- << alpha_complex_from_points.filtration(get<1>(pair)) << std::endl;
+ Alpha_complex alpha_complex_from_points(points);
+ std::cout << "alpha_complex_from_points" << std::endl;
+
+ Simplex_tree simplex;
+ std::cout << "simplex" << std::endl;
+ if (alpha_complex_from_points.create_complex(simplex, 0.6)) {
+ std::cout << "simplex" << std::endl;
+ // ----------------------------------------------------------------------------
+ // 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;
+
+ // Sort the simplices in the order of the filtration
+ simplex.initialize_filtration();
+
+ std::cout << "Simplex_tree dim: " << simplex.dimension() << std::endl;
+
+ Persistent_cohomology pcoh(simplex);
+
+ // initializes the coefficient field for homology - Z/3Z
+ pcoh.init_coefficients(3);
+ pcoh.compute_persistent_cohomology(0.2);
+
+ // Custom sort and output persistence
+ cmp_intervals_by_dim_then_length cmp(&simplex);
+ auto persistent_pairs = pcoh.get_persistent_pairs();
+ std::sort(std::begin(persistent_pairs), std::end(persistent_pairs), cmp);
+ for (auto pair : persistent_pairs) {
+ std::cout << simplex.dimension(get<0>(pair)) << " "
+ << simplex.filtration(get<0>(pair)) << " "
+ << simplex.filtration(get<1>(pair)) << std::endl;
+ }
+
+ // Persistent Betti numbers
+ std::cout << "The persistent Betti numbers in interval [0.40, 0.41] are : ";
+ for (int dim = 0; dim < simplex.dimension(); dim++)
+ std::cout << "b" << dim << " = " << pcoh.persistent_betti_number(dim, 0.40, 0.41) << " ; ";
+ std::cout << std::endl;
+
+ // Betti numbers
+ std::vector<int> betti_numbers = pcoh.betti_numbers();
+ std::cout << "The Betti numbers are : ";
+ for (std::size_t i = 0; i < betti_numbers.size(); i++)
+ std::cout << "b" << i << " = " << betti_numbers[i] << " ; ";
+ std::cout << std::endl;
}
-
- // Persistent Betti numbers
- std::cout << "The persistent Betti numbers in interval [0.40, 0.41] are : ";
- for (int dim = 0; dim < alpha_complex_from_points.dimension(); dim++)
- std::cout << "b" << dim << " = " << pcoh.persistent_betti_number(dim, 0.40, 0.41) << " ; ";
- std::cout << std::endl;
-
- // Betti numbers
- std::vector<int> betti_numbers = pcoh.betti_numbers();
- std::cout << "The Betti numbers are : ";
- for (std::size_t i = 0; i < betti_numbers.size(); i++)
- std::cout << "b" << i << " = " << betti_numbers[i] << " ; ";
- std::cout << std::endl;
-
return 0;
}
diff --git a/example/Persistent_cohomology/exact_alpha_complex_3d_persistence.cpp b/example/Persistent_cohomology/exact_alpha_complex_3d_persistence.cpp
new file mode 100644
index 00000000..8a335075
--- /dev/null
+++ b/example/Persistent_cohomology/exact_alpha_complex_3d_persistence.cpp
@@ -0,0 +1,245 @@
+/* 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 INRIA 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/>.
+ */
+
+#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/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 <list>
+#include <vector>
+
+#include "alpha_complex_3d_helper.h"
+
+// Alpha_shape_3 templates type definitions
+using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
+using Exact_tag = CGAL::Tag_true;
+using Vb = CGAL::Alpha_shape_vertex_base_3<Kernel, CGAL::Default, Exact_tag>;
+using Fb = CGAL::Alpha_shape_cell_base_3<Kernel, CGAL::Default, Exact_tag>;
+using Tds = CGAL::Triangulation_data_structure_3<Vb, Fb>;
+using Triangulation_3 = CGAL::Delaunay_triangulation_3<Kernel, Tds>;
+using Alpha_shape_3 = CGAL::Alpha_shape_3<Triangulation_3, Exact_tag>;
+
+// From file type definition
+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 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>;
+
+// 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: " << progName <<
+ " path_to_file_graph coeff_field_characteristic[integer > 0] min_persistence[float >= -1.0]\n";
+ exit(-1);
+}
+
+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]);
+ }
+
+ int coeff_field_characteristic = atoi(argv[2]);
+
+ 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]);
+ }
+
+ // 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);
+ // Check the read operation was correct
+ if (!off_reader.is_valid()) {
+ std::cerr << "Unable to read file " << offInputFile << std::endl;
+ usage(argv[0]);
+ }
+
+ // Retrieve the triangulation
+ std::vector<Point_3> lp = off_reader.get_point_cloud();
+
+ // alpha shape construction from points. CGAL has a strange behavior in REGULARIZED mode.
+ Alpha_shape_3 as(lp.begin(), lp.end(), 0, Alpha_shape_3::GENERAL);
+#ifdef DEBUG_TRACES
+ std::cout << "Alpha shape computed in GENERAL mode" << std::endl;
+#endif // DEBUG_TRACES
+
+ // 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();
+ int dim_max = 0;
+ Filtration_value filtration_max = 0.0;
+ for (auto object_iterator : the_objects) {
+ // Retrieve Alpha shape vertex list from object
+ if (const Cell_handle * cell = CGAL::object_cast<Cell_handle>(&object_iterator)) {
+ vertex_list = from_cell<Vertex_list, Cell_handle>(*cell);
+ count_cells++;
+ if (dim_max < 3) {
+ // Cell is of dim 3
+ dim_max = 3;
+ }
+ } else if (const Facet * facet = CGAL::object_cast<Facet>(&object_iterator)) {
+ vertex_list = from_facet<Vertex_list, Facet>(*facet);
+ count_facets++;
+ if (dim_max < 2) {
+ // Facet is of dim 2
+ dim_max = 2;
+ }
+ } else if (const Edge_3 * edge = CGAL::object_cast<Edge_3>(&object_iterator)) {
+ vertex_list = from_edge<Vertex_list, Edge_3>(*edge);
+ count_edges++;
+ if (dim_max < 1) {
+ // Edge_3 is of dim 1
+ dim_max = 1;
+ }
+ } else if (const Vertex_handle * vertex = CGAL::object_cast<Vertex_handle>(&object_iterator)) {
+ count_vertices++;
+ vertex_list = from_vertex<Vertex_list, Vertex_handle>(*vertex);
+ }
+ // Construction of the vector of simplex_tree vertex from list of alpha_shapes vertex
+ Simplex_tree_vector_vertex the_simplex_tree;
+ 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_tree.push_back(vertex);
+ map_cgal_simplex_tree.insert(Alpha_shape_simplex_tree_pair(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);
+ }
+ }
+ // 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());
+#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.set_filtration(filtration_max);
+ simplex_tree.set_dimension(dim_max);
+
+#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() << " ";
+ std::cout << " filtration = " << simplex_tree.filtration() << std::endl << std::endl;
+#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
+ PCOH pcoh(simplex_tree);
+ // initializes the coefficient field for homology
+ pcoh.init_coefficients(coeff_field_characteristic);
+
+ pcoh.compute_persistent_cohomology(min_persistence);
+
+ pcoh.output_diagram();
+
+ return 0;
+}
diff --git a/example/Persistent_cohomology/performance_rips_persistence.cpp b/example/Persistent_cohomology/performance_rips_persistence.cpp
deleted file mode 100644
index b4d282ac..00000000
--- a/example/Persistent_cohomology/performance_rips_persistence.cpp
+++ /dev/null
@@ -1,214 +0,0 @@
-/* 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/reader_utils.h>
-#include <gudhi/graph_simplicial_complex.h>
-#include <gudhi/distance_functions.h>
-#include <gudhi/Simplex_tree.h>
-#include <gudhi/Persistent_cohomology.h>
-#include <gudhi/Persistent_cohomology/Multi_field.h>
-#include <gudhi/Hasse_complex.h>
-
-#include <chrono>
-#include <string>
-#include <vector>
-
-using namespace Gudhi;
-using namespace Gudhi::persistent_cohomology;
-
-/* Compute the persistent homology of the complex cpx with coefficients in Z/pZ. */
-template< typename FilteredComplex>
-void timing_persistence(FilteredComplex & cpx
- , int p);
-
-/* Compute multi-field persistent homology of the complex cpx with coefficients in
- * Z/rZ for all prime number r in [p;q].*/
-template< typename FilteredComplex>
-void timing_persistence(FilteredComplex & cpx
- , int p
- , int q);
-
-/* Timings for the computation of persistent homology with different
- * representations of a Rips complex and different coefficient fields. The
- * Rips complex is built on a set of 10000 points sampling a Klein bottle embedded
- * in dimension 5.
- * We represent complexes with a simplex tree and
- * with a Hasse diagram. The Hasse diagram represents explicitly all
- * codimension 1 incidence relations in the complex, and hence leads to
- * a faster computation of persistence because boundaries are precomputed.
- * Hovewer, the simplex tree may be constructed directly from a point cloud and
- * is more compact.
- * We compute persistent homology with coefficient fields Z/2Z and Z/1223Z.
- * We present also timings for the computation of multi-field persistent
- * homology in all fields Z/rZ for r prime between 2 and 1223.
- */
-int main(int argc, char * argv[]) {
- std::chrono::time_point<std::chrono::system_clock> start, end;
- int elapsed_sec;
- {
-
- std::string filepoints = "../../../data/points/Kl.txt";
- Filtration_value threshold = 0.27;
- int dim_max = 3;
- int p = 2;
- int q = 1223;
-
- // Extract the points from the file filepoints
- typedef std::vector<double> Point_t;
- std::vector< Point_t > points;
- read_points(filepoints, points);
-
- // Compute the proximity graph of the points
- start = std::chrono::system_clock::now();
- Graph_t prox_graph = compute_proximity_graph(points, threshold
- , euclidean_distance<Point_t>);
- end = std::chrono::system_clock::now();
- elapsed_sec = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
- std::cout << "Compute Rips graph in " << elapsed_sec << " ms.\n";
-
- // Construct the Rips complex in a Simplex Tree
- Simplex_tree<Simplex_tree_options_fast_persistence> st;
- start = std::chrono::system_clock::now();
-
- // insert the proximity graph in the simplex tree
- st.insert_graph(prox_graph);
- // expand the graph until dimension dim_max
- st.expansion(dim_max);
-
- end = std::chrono::system_clock::now();
- elapsed_sec = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
- std::cout << "Compute Rips complex in " << elapsed_sec << " ms.\n";
- std::cout << " - dimension = " << st.dimension() << std::endl;
- std::cout << " - number of simplices = " << st.num_simplices() << std::endl;
-
- // Sort the simplices in the order of the filtration
- start = std::chrono::system_clock::now();
- st.initialize_filtration();
- end = std::chrono::system_clock::now();
- elapsed_sec = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
- std::cout << "Order the simplices of the filtration in " << elapsed_sec << " ms.\n";
-
- // Copy the keys inside the simplices
- start = std::chrono::system_clock::now();
- {
- int count = 0;
- for (auto sh : st.filtration_simplex_range())
- st.assign_key(sh, count++);
- }
- end = std::chrono::system_clock::now();
- elapsed_sec = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
- std::cout << "Copied the keys inside the simplices in " << elapsed_sec << " ms.\n";
-
- // Convert the simplex tree into a hasse diagram
- start = std::chrono::system_clock::now();
- Hasse_complex<> hcpx(st);
- end = std::chrono::system_clock::now();
- elapsed_sec = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
- std::cout << "Convert the simplex tree into a Hasse diagram in " << elapsed_sec << " ms.\n";
-
-
- std::cout << "Timings when using a simplex tree: \n";
- timing_persistence(st, p);
- timing_persistence(st, q);
- timing_persistence(st, p, q);
-
- std::cout << "Timings when using a Hasse complex: \n";
- timing_persistence(hcpx, p);
- timing_persistence(hcpx, q);
- timing_persistence(hcpx, p, q);
-
- start = std::chrono::system_clock::now();
- }
- end = std::chrono::system_clock::now();
- elapsed_sec = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
- std::cout << "Running the complex destructors in " << elapsed_sec << " ms.\n";
- return 0;
-}
-
-template< typename FilteredComplex>
-void
-timing_persistence(FilteredComplex & cpx
- , int p) {
- std::chrono::time_point<std::chrono::system_clock> start, end;
- int elapsed_sec;
- {
- start = std::chrono::system_clock::now();
- Persistent_cohomology< FilteredComplex, Field_Zp > pcoh(cpx);
- end = std::chrono::system_clock::now();
- elapsed_sec = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
- std::cout << " Initialize pcoh in " << elapsed_sec << " ms.\n";
- // initializes the coefficient field for homology
- start = std::chrono::system_clock::now();
- pcoh.init_coefficients(p);
- end = std::chrono::system_clock::now();
- elapsed_sec = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
- std::cout << " Initialize the coefficient field in " << elapsed_sec << " ms.\n";
-
- start = std::chrono::system_clock::now();
-
- pcoh.compute_persistent_cohomology(INFINITY);
-
- end = std::chrono::system_clock::now();
- elapsed_sec = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
- std::cout << " Compute persistent homology in Z/" << p << "Z in " << elapsed_sec << " ms.\n";
- start = std::chrono::system_clock::now();
- }
- end = std::chrono::system_clock::now();
- elapsed_sec = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
- std::cout << " Run the persistence destructors in " << elapsed_sec << " ms.\n";
-}
-
-template< typename FilteredComplex>
-void
-timing_persistence(FilteredComplex & cpx
- , int p
- , int q) {
- std::chrono::time_point<std::chrono::system_clock> start, end;
- int elapsed_sec;
- {
- start = std::chrono::system_clock::now();
- Persistent_cohomology< FilteredComplex, Multi_field > pcoh(cpx);
- end = std::chrono::system_clock::now();
- elapsed_sec = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
- std::cout << " Initialize pcoh in " << elapsed_sec << " ms.\n";
- // initializes the coefficient field for homology
- start = std::chrono::system_clock::now();
- pcoh.init_coefficients(p, q);
- end = std::chrono::system_clock::now();
- elapsed_sec = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
- std::cout << " Initialize the coefficient field in " << elapsed_sec << " ms.\n";
- // compute persistent homology, disgarding persistent features of life shorter than min_persistence
-
- start = std::chrono::system_clock::now();
-
- pcoh.compute_persistent_cohomology(INFINITY);
-
- end = std::chrono::system_clock::now();
- elapsed_sec = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
- std::cout << " Compute multi-field persistent homology in all coefficient fields Z/pZ "
- << "with p in [" << p << ";" << q << "] in " << elapsed_sec << " ms.\n";
- start = std::chrono::system_clock::now();
- }
- end = std::chrono::system_clock::now();
- elapsed_sec = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
- std::cout << " Run the persistence destructors in " << elapsed_sec << " ms.\n";
-}
diff --git a/example/Persistent_cohomology/periodic_alpha_complex_3d_persistence.cpp b/example/Persistent_cohomology/periodic_alpha_complex_3d_persistence.cpp
index a199fea1..8928cfc2 100644
--- a/example/Persistent_cohomology/periodic_alpha_complex_3d_persistence.cpp
+++ b/example/Persistent_cohomology/periodic_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,10 +20,11 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <boost/variant.hpp>
+
#include <gudhi/Simplex_tree.h>
#include <gudhi/Persistent_cohomology.h>
#include <gudhi/Points_3D_off_io.h>
-#include <boost/variant.hpp>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Periodic_3_Delaunay_triangulation_traits_3.h>
@@ -39,6 +40,9 @@
#include <utility>
#include <list>
#include <vector>
+#include <cstdlib>
+
+#include "alpha_complex_3d_helper.h"
// Traits
using K = CGAL::Exact_predicates_inexact_constructions_kernel;
@@ -66,10 +70,12 @@ using Dispatch = CGAL::Dispatch_output_iterator<
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>;
// 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>;
@@ -77,52 +83,6 @@ using Simplex_tree_vector_vertex = std::vector< Simplex_tree_vertex >;
using Persistent_cohomology = Gudhi::persistent_cohomology::Persistent_cohomology<
ST, Gudhi::persistent_cohomology::Field_Zp >;
-Vertex_list from(const Cell_handle& ch) {
- Vertex_list the_list;
- for (auto i = 0; i < 4; i++) {
-#ifdef DEBUG_TRACES
- std::cout << "from cell[" << i << "]=" << ch->vertex(i)->point() << std::endl;
-#endif // DEBUG_TRACES
- the_list.push_back(ch->vertex(i));
- }
- return the_list;
-}
-
-Vertex_list from(const Facet& fct) {
- Vertex_list the_list;
- for (auto i = 0; i < 4; i++) {
- if (fct.second != i) {
-#ifdef DEBUG_TRACES
- std::cout << "from facet=[" << i << "]" << fct.first->vertex(i)->point() << std::endl;
-#endif // DEBUG_TRACES
- the_list.push_back(fct.first->vertex(i));
- }
- }
- return the_list;
-}
-
-Vertex_list from(const Edge_3& edg) {
- Vertex_list the_list;
- for (auto i = 0; i < 4; i++) {
- if ((edg.second == i) || (edg.third == i)) {
-#ifdef DEBUG_TRACES
- std::cout << "from edge[" << i << "]=" << edg.first->vertex(i)->point() << std::endl;
-#endif // DEBUG_TRACES
- the_list.push_back(edg.first->vertex(i));
- }
- }
- return the_list;
-}
-
-Vertex_list from(const Alpha_shape_3::Vertex_handle& vh) {
- Vertex_list the_list;
-#ifdef DEBUG_TRACES
- std::cout << "from vertex=" << vh->point() << std::endl;
-#endif // DEBUG_TRACES
- the_list.push_back(vh);
- return the_list;
-}
-
void usage(char * const progName) {
std::cerr << "Usage: " << progName <<
" path_to_file_graph path_to_iso_cuboid_3_file coeff_field_characteristic[integer > 0] min_persistence[float >= -1.0]\n";
@@ -136,19 +96,8 @@ int main(int argc, char * const argv[]) {
usage(argv[0]);
}
- int coeff_field_characteristic = 0;
- int returnedScanValue = sscanf(argv[3], "%d", &coeff_field_characteristic);
- if ((returnedScanValue == EOF) || (coeff_field_characteristic <= 0)) {
- std::cerr << "Error: " << argv[3] << " is not correct\n";
- usage(argv[0]);
- }
-
- Filtration_value min_persistence = 0.0;
- returnedScanValue = sscanf(argv[4], "%lf", &min_persistence);
- if ((returnedScanValue == EOF) || (min_persistence < -1.0)) {
- std::cerr << "Error: " << argv[4] << " is not correct\n";
- usage(argv[0]);
- }
+ int coeff_field_characteristic = atoi(argv[3]);
+ Filtration_value min_persistence = strtof(argv[4], nullptr);
// Read points from file
std::string offInputFile(argv[1]);
@@ -212,21 +161,21 @@ int main(int argc, char * const argv[]) {
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 = from_cell<Vertex_list, Cell_handle>(*cell);
count_cells++;
if (dim_max < 3) {
// Cell is of dim 3
dim_max = 3;
}
} else if (const Facet * facet = CGAL::object_cast<Facet>(&object_iterator)) {
- vertex_list = from(*facet);
+ vertex_list = from_facet<Vertex_list, Facet>(*facet);
count_facets++;
if (dim_max < 2) {
// Facet is of dim 2
dim_max = 2;
}
} else if (const Edge_3 * edge = CGAL::object_cast<Edge_3>(&object_iterator)) {
- vertex_list = from(*edge);
+ vertex_list = from_edge<Vertex_list, Edge_3>(*edge);
count_edges++;
if (dim_max < 1) {
// Edge_3 is of dim 1
@@ -235,7 +184,7 @@ int main(int argc, char * const argv[]) {
} else if (const Alpha_shape_3::Vertex_handle * vertex =
CGAL::object_cast<Alpha_shape_3::Vertex_handle>(&object_iterator)) {
count_vertices++;
- vertex_list = from(*vertex);
+ 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;
diff --git a/example/Persistent_cohomology/persistence_from_simple_simplex_tree.cpp b/example/Persistent_cohomology/persistence_from_simple_simplex_tree.cpp
index ba772f04..7ca9410a 100644
--- a/example/Persistent_cohomology/persistence_from_simple_simplex_tree.cpp
+++ b/example/Persistent_cohomology/persistence_from_simple_simplex_tree.cpp
@@ -4,7 +4,7 @@
*
* Author(s): Vincent Rouvreau
*
- * Copyright (C) 2014 INRIA Sophia Antipolis-Méditerranée (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
@@ -29,13 +29,12 @@
#include <utility>
#include <vector>
-using namespace Gudhi;
-using namespace Gudhi::persistent_cohomology;
-
-typedef std::vector< Vertex_handle > typeVectorVertex;
-typedef std::pair<typeVectorVertex, Filtration_value> typeSimplex;
-typedef std::pair< Simplex_tree<>::Simplex_handle, bool > typePairSimplexBool;
-typedef Simplex_tree<> typeST;
+// Types definition
+using Simplex_tree = Gudhi::Simplex_tree<>;
+using Filtration_value = Simplex_tree::Filtration_value;
+using Field_Zp = Gudhi::persistent_cohomology::Field_Zp;
+using Persistent_cohomology = Gudhi::persistent_cohomology::Persistent_cohomology<Simplex_tree, Field_Zp >;
+using typeVectorVertex = std::vector< Simplex_tree::Vertex_handle >;
void usage(char * const progName) {
std::cerr << "Usage: " << progName << " coeff_field_characteristic[integer > 0] min_persistence[float >= -1.0]\n";
@@ -66,7 +65,7 @@ int main(int argc, char * const argv[]) {
// TEST OF INSERTION
std::cout << "********************************************************************" << std::endl;
std::cout << "TEST OF INSERTION" << std::endl;
- typeST st;
+ Simplex_tree st;
// ++ FIRST
std::cout << " - INSERT (0,1,2)" << std::endl;
@@ -166,7 +165,7 @@ int main(int argc, char * const argv[]) {
std::cout << "**************************************************************" << std::endl;
// Compute the persistence diagram of the complex
- persistent_cohomology::Persistent_cohomology< Simplex_tree<>, Field_Zp > pcoh(st);
+ Persistent_cohomology pcoh(st);
// initializes the coefficient field for homology
pcoh.init_coefficients(coeff_field_characteristic);
diff --git a/example/Persistent_cohomology/plain_homology.cpp b/example/Persistent_cohomology/plain_homology.cpp
index ae82c817..50f692f2 100644
--- a/example/Persistent_cohomology/plain_homology.cpp
+++ b/example/Persistent_cohomology/plain_homology.cpp
@@ -27,13 +27,11 @@
#include <vector>
#include <cstdint> // for std::uint8_t
-using namespace Gudhi;
-
/* We could perfectly well use the default Simplex_tree<> (which uses
* Simplex_tree_options_full_featured), the following simply demonstrates
* how to save on storage by not storing a filtration value. */
-struct MyOptions : Simplex_tree_options_full_featured {
+struct MyOptions : Gudhi::Simplex_tree_options_full_featured {
// Implicitly use 0 as filtration value for all simplices
static const bool store_filtration = false;
// The persistence algorithm needs this
@@ -43,7 +41,10 @@ struct MyOptions : Simplex_tree_options_full_featured {
// Maximum number of simplices to compute persistence is 2^8 - 1 = 255. One is reserved for null_key
typedef std::uint8_t Simplex_key;
};
-typedef Simplex_tree<MyOptions> ST;
+
+using ST = Gudhi::Simplex_tree<MyOptions>;
+using Field_Zp = Gudhi::persistent_cohomology::Field_Zp;
+using Persistent_cohomology = Gudhi::persistent_cohomology::Persistent_cohomology<ST, Field_Zp>;
int main() {
ST st;
@@ -70,7 +71,7 @@ int main() {
st.initialize_filtration();
// Class for homology computation
- persistent_cohomology::Persistent_cohomology<ST, persistent_cohomology::Field_Zp> pcoh(st);
+ Persistent_cohomology pcoh(st);
// Initialize the coefficient field Z/2Z for homology
pcoh.init_coefficients(2);
diff --git a/example/Persistent_cohomology/rips_distance_matrix_persistence.cpp b/example/Persistent_cohomology/rips_distance_matrix_persistence.cpp
new file mode 100644
index 00000000..8517e7f6
--- /dev/null
+++ b/example/Persistent_cohomology/rips_distance_matrix_persistence.cpp
@@ -0,0 +1,144 @@
+/* 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
+ *
+ * Copyright (C) 2016 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/Rips_complex.h>
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/Persistent_cohomology.h>
+#include <gudhi/reader_utils.h>
+
+#include <boost/program_options.hpp>
+
+#include <string>
+#include <vector>
+#include <limits> // infinity
+
+// Types definition
+using Simplex_tree = Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_fast_persistence>;
+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 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);
+
+int main(int argc, char * argv[]) {
+ std::string csv_matrix_file;
+ std::string filediag;
+ Filtration_value threshold;
+ int dim_max;
+ int p;
+ Filtration_value min_persistence;
+
+ program_options(argc, argv, csv_matrix_file, filediag, threshold, dim_max, p, min_persistence);
+
+ Distance_matrix distances = read_lower_triangular_matrix_from_csv_file<Filtration_value>(csv_matrix_file);
+ Rips_complex rips_complex_from_file(distances, threshold);
+
+ // Construct the Rips complex in a Simplex Tree
+ Simplex_tree simplex_tree;
+
+ rips_complex_from_file.create_complex(simplex_tree, dim_max);
+ std::cout << "The complex contains " << simplex_tree.num_simplices() << " simplices \n";
+ std::cout << " and has dimension " << simplex_tree.dimension() << " \n";
+
+ // Sort the simplices in the order of the filtration
+ simplex_tree.initialize_filtration();
+
+ // Compute the persistence diagram of the complex
+ Persistent_cohomology pcoh(simplex_tree);
+ // initializes the coefficient field for homology
+ pcoh.init_coefficients(p);
+
+ pcoh.compute_persistent_cohomology(min_persistence);
+
+ // Output the diagram in filediag
+ if (filediag.empty()) {
+ pcoh.output_diagram();
+ } else {
+ std::ofstream out(filediag);
+ pcoh.output_diagram(out);
+ out.close();
+ }
+ 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) {
+ 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 ';'.");
+
+ 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");
+
+ 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 Rips complex defined on a set of distance matrix.\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/rips_multifield_persistence.cpp b/example/Persistent_cohomology/rips_multifield_persistence.cpp
index c5cd775d..dae36ed2 100644
--- a/example/Persistent_cohomology/rips_multifield_persistence.cpp
+++ b/example/Persistent_cohomology/rips_multifield_persistence.cpp
@@ -4,7 +4,7 @@
*
* Author(s): Clément Maria
*
- * Copyright (C) 2014 INRIA Sophia Antipolis-Méditerranée (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,26 +20,29 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <gudhi/reader_utils.h>
-#include <gudhi/graph_simplicial_complex.h>
+#include <gudhi/Rips_complex.h>
#include <gudhi/distance_functions.h>
#include <gudhi/Simplex_tree.h>
#include <gudhi/Persistent_cohomology.h>
#include <gudhi/Persistent_cohomology/Multi_field.h>
+#include <gudhi/Points_off_io.h>
#include <boost/program_options.hpp>
#include <string>
#include <vector>
-using namespace Gudhi;
-using namespace Gudhi::persistent_cohomology;
-
-typedef int Vertex_handle;
-typedef double Filtration_value;
+// Types definition
+using Simplex_tree = Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_fast_persistence>;
+using Filtration_value = Simplex_tree::Filtration_value;
+using Rips_complex = Gudhi::rips_complex::Rips_complex<Filtration_value>;
+using Multi_field = Gudhi::persistent_cohomology::Multi_field;
+using Persistent_cohomology = Gudhi::persistent_cohomology::Persistent_cohomology<Simplex_tree, Multi_field >;
+using Point = std::vector<double>;
+using Points_off_reader = Gudhi::Points_off_reader<Point>;
void program_options(int argc, char * argv[]
- , std::string & filepoints
+ , std::string & off_file_points
, std::string & filediag
, Filtration_value & threshold
, int & dim_max
@@ -48,7 +51,7 @@ void program_options(int argc, char * argv[]
, Filtration_value & min_persistence);
int main(int argc, char * argv[]) {
- std::string filepoints;
+ std::string off_file_points;
std::string filediag;
Filtration_value threshold;
int dim_max;
@@ -56,33 +59,26 @@ int main(int argc, char * argv[]) {
int max_p;
Filtration_value min_persistence;
- program_options(argc, argv, filepoints, filediag, threshold, dim_max, min_p, max_p, min_persistence);
-
- // Extract the points from the file filepoints
- typedef std::vector<double> Point_t;
- std::vector< Point_t > points;
- read_points(filepoints, points);
+ program_options(argc, argv, off_file_points, filediag, threshold, dim_max, min_p, max_p, min_persistence);
- // Compute the proximity graph of the points
- Graph_t prox_graph = compute_proximity_graph(points, threshold
- , euclidean_distance<Point_t>);
+ Points_off_reader off_reader(off_file_points);
+ Rips_complex rips_complex_from_file(off_reader.get_point_cloud(), threshold, Gudhi::Euclidean_distance());
// Construct the Rips complex in a Simplex Tree
- typedef Simplex_tree<Simplex_tree_options_fast_persistence> ST;
- ST st;
- // insert the proximity graph in the simplex tree
- st.insert_graph(prox_graph);
- // expand the graph until dimension dim_max
- st.expansion(dim_max);
+ Simplex_tree simplex_tree;
+
+ rips_complex_from_file.create_complex(simplex_tree, dim_max);
+ std::cout << "The complex contains " << simplex_tree.num_simplices() << " simplices \n";
+ std::cout << " and has dimension " << simplex_tree.dimension() << " \n";
// Sort the simplices in the order of the filtration
- st.initialize_filtration();
+ simplex_tree.initialize_filtration();
// Compute the persistence diagram of the complex
- Persistent_cohomology<ST, Multi_field > pcoh(st);
+ Persistent_cohomology pcoh(simplex_tree);
// initializes the coefficient field for homology
pcoh.init_coefficients(min_p, max_p);
- // compute persistent homology, disgarding persistent features of life shorter than min_persistence
+
pcoh.compute_persistent_cohomology(min_persistence);
// Output the diagram in filediag
@@ -98,7 +94,7 @@ int main(int argc, char * argv[]) {
}
void program_options(int argc, char * argv[]
- , std::string & filepoints
+ , std::string & off_file_points
, std::string & filediag
, Filtration_value & threshold
, int & dim_max
@@ -108,8 +104,8 @@ void program_options(int argc, char * argv[]
namespace po = boost::program_options;
po::options_description hidden("Hidden options");
hidden.add_options()
- ("input-file", po::value<std::string>(&filepoints),
- "Name of file containing a point set. Format is one point per line: X1 ... Xd \n");
+ ("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");
visible.add_options()
diff --git a/example/Persistent_cohomology/rips_persistence.cpp b/example/Persistent_cohomology/rips_persistence.cpp
index cab49395..d504798b 100644
--- a/example/Persistent_cohomology/rips_persistence.cpp
+++ b/example/Persistent_cohomology/rips_persistence.cpp
@@ -4,7 +4,7 @@
*
* Author(s): Clément Maria
*
- * Copyright (C) 2014 INRIA Sophia Antipolis-Méditerranée (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,11 +20,11 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <gudhi/reader_utils.h>
-#include <gudhi/graph_simplicial_complex.h>
+#include <gudhi/Rips_complex.h>
#include <gudhi/distance_functions.h>
#include <gudhi/Simplex_tree.h>
#include <gudhi/Persistent_cohomology.h>
+#include <gudhi/Points_off_io.h>
#include <boost/program_options.hpp>
@@ -32,14 +32,17 @@
#include <vector>
#include <limits> // infinity
-using namespace Gudhi;
-using namespace Gudhi::persistent_cohomology;
-
-typedef int Vertex_handle;
-typedef double Filtration_value;
+// Types definition
+using Simplex_tree = Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_fast_persistence>;
+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 Point = std::vector<double>;
+using Points_off_reader = Gudhi::Points_off_reader<Point>;
void program_options(int argc, char * argv[]
- , std::string & filepoints
+ , std::string & off_file_points
, std::string & filediag
, Filtration_value & threshold
, int & dim_max
@@ -47,40 +50,30 @@ void program_options(int argc, char * argv[]
, Filtration_value & min_persistence);
int main(int argc, char * argv[]) {
- std::string filepoints;
+ std::string off_file_points;
std::string filediag;
Filtration_value threshold;
int dim_max;
int p;
Filtration_value min_persistence;
- program_options(argc, argv, filepoints, filediag, threshold, dim_max, p, min_persistence);
-
- // Extract the points from the file filepoints
- typedef std::vector<double> Point_t;
- std::vector< Point_t > points;
- read_points(filepoints, points);
+ program_options(argc, argv, off_file_points, filediag, threshold, dim_max, p, min_persistence);
- // Compute the proximity graph of the points
- Graph_t prox_graph = compute_proximity_graph(points, threshold
- , euclidean_distance<Point_t>);
+ Points_off_reader off_reader(off_file_points);
+ Rips_complex rips_complex_from_file(off_reader.get_point_cloud(), threshold, Gudhi::Euclidean_distance());
// Construct the Rips complex in a Simplex Tree
- typedef Simplex_tree<Simplex_tree_options_fast_persistence> ST;
- ST st;
- // insert the proximity graph in the simplex tree
- st.insert_graph(prox_graph);
- // expand the graph until dimension dim_max
- st.expansion(dim_max);
+ Simplex_tree simplex_tree;
- std::cout << "The complex contains " << st.num_simplices() << " simplices \n";
- std::cout << " and has dimension " << st.dimension() << " \n";
+ rips_complex_from_file.create_complex(simplex_tree, dim_max);
+ std::cout << "The complex contains " << simplex_tree.num_simplices() << " simplices \n";
+ std::cout << " and has dimension " << simplex_tree.dimension() << " \n";
// Sort the simplices in the order of the filtration
- st.initialize_filtration();
+ simplex_tree.initialize_filtration();
// Compute the persistence diagram of the complex
- persistent_cohomology::Persistent_cohomology<ST, Field_Zp > pcoh(st);
+ Persistent_cohomology pcoh(simplex_tree);
// initializes the coefficient field for homology
pcoh.init_coefficients(p);
@@ -99,7 +92,7 @@ int main(int argc, char * argv[]) {
}
void program_options(int argc, char * argv[]
- , std::string & filepoints
+ , std::string & off_file_points
, std::string & filediag
, Filtration_value & threshold
, int & dim_max
@@ -108,15 +101,16 @@ void program_options(int argc, char * argv[]
namespace po = boost::program_options;
po::options_description hidden("Hidden options");
hidden.add_options()
- ("input-file", po::value<std::string>(&filepoints),
- "Name of file containing a point set. Format is one point per line: X1 ... Xd ");
+ ("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()),
+ ("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.")
diff --git a/example/Persistent_cohomology/rips_persistence_step_by_step.cpp b/example/Persistent_cohomology/rips_persistence_step_by_step.cpp
new file mode 100644
index 00000000..554eeba6
--- /dev/null
+++ b/example/Persistent_cohomology/rips_persistence_step_by_step.cpp
@@ -0,0 +1,217 @@
+/* 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/Persistent_cohomology.h>
+#include <gudhi/Points_off_io.h>
+
+#include <boost/program_options.hpp>
+
+#include <string>
+#include <vector>
+#include <limits> // infinity
+#include <utility> // for pair
+#include <map>
+
+// ----------------------------------------------------------------------------
+// rips_persistence_step_by_step is an example of each step that is required to
+// build a Rips over a Simplex_tree. Please refer to rips_persistence to see
+// how to do the same thing with the Rips_complex wrapper for less detailed
+// steps.
+// ----------------------------------------------------------------------------
+
+// Types definition
+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 Field_Zp = Gudhi::persistent_cohomology::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);
+
+int main(int argc, char * argv[]) {
+ std::string off_file_points;
+ std::string filediag;
+ Filtration_value threshold;
+ int dim_max;
+ int p;
+ Filtration_value min_persistence;
+
+ program_options(argc, argv, off_file_points, filediag, threshold, dim_max, p, min_persistence);
+
+ // 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
+ , Gudhi::Euclidean_distance());
+
+ // 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(dim_max);
+
+ 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();
+
+ // Compute the persistence diagram of the complex
+ Persistent_cohomology pcoh(st);
+ // initializes the coefficient field for homology
+ pcoh.init_coefficients(p);
+
+ pcoh.compute_persistent_cohomology(min_persistence);
+
+ // Output the diagram in filediag
+ if (filediag.empty()) {
+ pcoh.output_diagram();
+ } else {
+ std::ofstream out(filediag);
+ pcoh.output_diagram(out);
+ out.close();
+ }
+
+ 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) {
+ 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");
+
+ 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");
+
+ 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 Rips 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();
+ }
+}
+
+/** 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/Persistent_cohomology/rips_persistence_via_boundary_matrix.cpp b/example/Persistent_cohomology/rips_persistence_via_boundary_matrix.cpp
index 4c6656f5..9618f278 100644
--- a/example/Persistent_cohomology/rips_persistence_via_boundary_matrix.cpp
+++ b/example/Persistent_cohomology/rips_persistence_via_boundary_matrix.cpp
@@ -4,8 +4,7 @@
*
* Author(s): Clément Maria, Marc Glisse
*
- * Copyright (C) 2014 INRIA Sophia Antipolis-Méditerranée (France),
- * 2015 INRIA Saclay ÃŽle de 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
@@ -21,12 +20,12 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <gudhi/reader_utils.h>
-#include <gudhi/graph_simplicial_complex.h>
-#include <gudhi/distance_functions.h>
#include <gudhi/Simplex_tree.h>
#include <gudhi/Persistent_cohomology.h>
+#include <gudhi/Rips_complex.h>
#include <gudhi/Hasse_complex.h>
+#include <gudhi/Points_off_io.h>
+#include <gudhi/distance_functions.h>
#include <boost/program_options.hpp>
@@ -44,14 +43,16 @@
// //
////////////////////////////////////////////////////////////////
-using namespace Gudhi;
-using namespace Gudhi::persistent_cohomology;
-
-typedef int Vertex_handle;
-typedef double Filtration_value;
+// Types definition
+using Simplex_tree = Gudhi::Simplex_tree<>;
+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 Point = std::vector<double>;
+using Points_off_reader = Gudhi::Points_off_reader<Point>;
void program_options(int argc, char * argv[]
- , std::string & filepoints
+ , std::string & off_file_points
, std::string & filediag
, Filtration_value & threshold
, int & dim_max
@@ -59,30 +60,21 @@ void program_options(int argc, char * argv[]
, Filtration_value & min_persistence);
int main(int argc, char * argv[]) {
- std::string filepoints;
+ std::string off_file_points;
std::string filediag;
Filtration_value threshold;
int dim_max;
int p;
Filtration_value min_persistence;
- program_options(argc, argv, filepoints, filediag, threshold, dim_max, p, min_persistence);
-
- // Extract the points from the file filepoints
- typedef std::vector<double> Point_t;
- std::vector< Point_t > points;
- read_points(filepoints, points);
+ program_options(argc, argv, off_file_points, filediag, threshold, dim_max, p, min_persistence);
- // Compute the proximity graph of the points
- Graph_t prox_graph = compute_proximity_graph(points, threshold
- , euclidean_distance<Point_t>);
+ Points_off_reader off_reader(off_file_points);
+ Rips_complex rips_complex_from_file(off_reader.get_point_cloud(), threshold, Gudhi::Euclidean_distance());
// Construct the Rips complex in a Simplex Tree
- Simplex_tree<>& st = *new Simplex_tree<>;
- // insert the proximity graph in the simplex tree
- st.insert_graph(prox_graph);
- // expand the graph until dimension dim_max
- st.expansion(dim_max);
+ Simplex_tree& st = *new Simplex_tree;
+ rips_complex_from_file.create_complex(st, dim_max);
std::cout << "The complex contains " << st.num_simplices() << " simplices \n";
std::cout << " and has dimension " << st.dimension() << " \n";
@@ -99,7 +91,7 @@ int main(int argc, char * argv[]) {
st.assign_key(sh, count++);
// Convert to a more convenient representation.
- Hasse_complex<> hcpx(st);
+ Gudhi::Hasse_complex<> hcpx(st);
#ifdef GUDHI_USE_TBB
ts.terminate();
@@ -109,7 +101,7 @@ int main(int argc, char * argv[]) {
delete &st;
// Compute the persistence diagram of the complex
- persistent_cohomology::Persistent_cohomology< Hasse_complex<>, Field_Zp > pcoh(hcpx);
+ Gudhi::persistent_cohomology::Persistent_cohomology< Gudhi::Hasse_complex<>, Field_Zp > pcoh(hcpx);
// initializes the coefficient field for homology
pcoh.init_coefficients(p);
@@ -126,7 +118,7 @@ int main(int argc, char * argv[]) {
}
void program_options(int argc, char * argv[]
- , std::string & filepoints
+ , std::string & off_file_points
, std::string & filediag
, Filtration_value & threshold
, int & dim_max
@@ -135,7 +127,7 @@ void program_options(int argc, char * argv[]
namespace po = boost::program_options;
po::options_description hidden("Hidden options");
hidden.add_options()
- ("input-file", po::value<std::string>(&filepoints),
+ ("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);
diff --git a/example/Persistent_cohomology/weighted_alpha_complex_3d_persistence.cpp b/example/Persistent_cohomology/weighted_alpha_complex_3d_persistence.cpp
new file mode 100644
index 00000000..34b90933
--- /dev/null
+++ b/example/Persistent_cohomology/weighted_alpha_complex_3d_persistence.cpp
@@ -0,0 +1,263 @@
+/* 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 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/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/Regular_triangulation_euclidean_traits_3.h>
+#include <CGAL/Regular_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 <list>
+#include <vector>
+#include <cstdlib>
+
+#include "alpha_complex_3d_helper.h"
+
+// Traits
+using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
+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;
+
+// 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::list<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: " << progName <<
+ " path_to_file_graph path_to_weight_file coeff_field_characteristic[integer > 0] min_persistence[float >= -1.0]\n";
+ exit(-1);
+}
+
+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]);
+ }
+
+ int coeff_field_characteristic = atoi(argv[3]);
+ Filtration_value min_persistence = strtof(argv[4], nullptr);
+
+ // 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);
+ // Check the read operation was correct
+ if (!off_reader.is_valid()) {
+ std::cerr << "Unable to read file " << offInputFile << std::endl;
+ usage(argv[0]);
+ }
+
+ // Retrieve the triangulation
+ std::vector<Point_3> lp = off_reader.get_point_cloud();
+
+ // Read weights information from file
+ std::ifstream weights_ifstr(argv[2]);
+ std::vector<Weighted_point_3> wp;
+ if (weights_ifstr.good()) {
+ double weight = 0.0;
+ std::size_t index = 0;
+ // Attempt read the weight in a double format, return false if it fails
+ while ((weights_ifstr >> weight) && (index < lp.size())) {
+ 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]);
+ }
+
+ // alpha shape construction from points. CGAL has a strange behavior in REGULARIZED mode.
+ Alpha_shape_3 as(lp.begin(), lp.end(), 0, Alpha_shape_3::GENERAL);
+#ifdef DEBUG_TRACES
+ std::cout << "Alpha shape computed in GENERAL mode" << std::endl;
+#endif // DEBUG_TRACES
+
+ // 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();
+ int dim_max = 0;
+ Filtration_value filtration_max = 0.0;
+ for (auto object_iterator : the_objects) {
+ // Retrieve Alpha shape vertex list from object
+ if (const Cell_handle * cell = CGAL::object_cast<Cell_handle>(&object_iterator)) {
+ vertex_list = from_cell<Vertex_list, Cell_handle>(*cell);
+ count_cells++;
+ if (dim_max < 3) {
+ // Cell is of dim 3
+ dim_max = 3;
+ }
+ } else if (const Facet * facet = CGAL::object_cast<Facet>(&object_iterator)) {
+ vertex_list = from_facet<Vertex_list, Facet>(*facet);
+ count_facets++;
+ if (dim_max < 2) {
+ // Facet is of dim 2
+ dim_max = 2;
+ }
+ } else if (const Edge_3 * edge = CGAL::object_cast<Edge_3>(&object_iterator)) {
+ vertex_list = from_edge<Vertex_list, Edge_3>(*edge);
+ count_edges++;
+ if (dim_max < 1) {
+ // Edge_3 is of dim 1
+ dim_max = 1;
+ }
+ } else if (const Alpha_shape_3::Vertex_handle * vertex =
+ CGAL::object_cast<Alpha_shape_3::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;
+ 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_tree.push_back(vertex);
+ map_cgal_simplex_tree.insert(Alpha_shape_simplex_tree_pair(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);
+ }
+ }
+ // 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
+ 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.set_filtration(filtration_max);
+ simplex_tree.set_dimension(dim_max);
+
+#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() << " ";
+ std::cout << " filtration = " << simplex_tree.filtration() << std::endl << std::endl;
+#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);
+
+ pcoh.output_diagram();
+
+ return 0;
+}
diff --git a/example/Rips_complex/CMakeLists.txt b/example/Rips_complex/CMakeLists.txt
new file mode 100644
index 00000000..8aee79e2
--- /dev/null
+++ b/example/Rips_complex/CMakeLists.txt
@@ -0,0 +1,58 @@
+cmake_minimum_required(VERSION 2.6)
+project(Rips_complex_examples)
+
+# Point cloud
+add_executable ( Rips_complex_example_from_off example_rips_complex_from_off_file.cpp )
+target_link_libraries(Rips_complex_example_from_off ${Boost_SYSTEM_LIBRARY})
+
+add_executable ( Rips_complex_example_one_skeleton_from_points example_one_skeleton_rips_from_points.cpp )
+target_link_libraries(Rips_complex_example_one_skeleton_from_points ${Boost_SYSTEM_LIBRARY})
+
+# Distance matrix
+add_executable ( Rips_complex_example_one_skeleton_from_distance_matrix example_one_skeleton_rips_from_distance_matrix.cpp )
+target_link_libraries(Rips_complex_example_one_skeleton_from_distance_matrix ${Boost_SYSTEM_LIBRARY})
+
+add_executable ( Rips_complex_example_from_csv_distance_matrix example_rips_complex_from_csv_distance_matrix_file.cpp )
+target_link_libraries(Rips_complex_example_from_csv_distance_matrix ${Boost_SYSTEM_LIBRARY})
+
+if (TBB_FOUND)
+ target_link_libraries(Rips_complex_example_from_off ${TBB_LIBRARIES})
+ target_link_libraries(Rips_complex_example_one_skeleton_from_points ${TBB_LIBRARIES})
+ target_link_libraries(Rips_complex_example_one_skeleton_from_distance_matrix ${TBB_LIBRARIES})
+ target_link_libraries(Rips_complex_example_from_csv_distance_matrix ${TBB_LIBRARIES})
+endif()
+
+add_test(NAME Rips_complex_example_one_skeleton_from_points
+ COMMAND $<TARGET_FILE:Rips_complex_example_one_skeleton_from_points>)
+add_test(NAME Rips_complex_example_one_skeleton_from_distance_matrix
+ COMMAND $<TARGET_FILE:Rips_complex_example_one_skeleton_from_distance_matrix>)
+
+add_test(NAME Rips_complex_example_from_off_doc_12_1 COMMAND $<TARGET_FILE:Rips_complex_example_from_off>
+ "${CMAKE_SOURCE_DIR}/data/points/alphacomplexdoc.off" "12.0" "1" "${CMAKE_CURRENT_BINARY_DIR}/ripsoffreader_result_12_1.txt")
+add_test(NAME Rips_complex_example_from_off_doc_12_3 COMMAND $<TARGET_FILE:Rips_complex_example_from_off>
+ "${CMAKE_SOURCE_DIR}/data/points/alphacomplexdoc.off" "12.0" "3" "${CMAKE_CURRENT_BINARY_DIR}/ripsoffreader_result_12_3.txt")
+
+add_test(NAME Rips_complex_example_from_csv_distance_matrix_doc_12_1 COMMAND $<TARGET_FILE:Rips_complex_example_from_csv_distance_matrix>
+ "${CMAKE_SOURCE_DIR}/data/distance_matrix/full_square_distance_matrix.csv" "12.0" "1" "${CMAKE_CURRENT_BINARY_DIR}/ripscsvreader_result_12_1.txt")
+add_test(NAME Rips_complex_example_from_csv_distance_matrix_doc_12_3 COMMAND $<TARGET_FILE:Rips_complex_example_from_csv_distance_matrix>
+ "${CMAKE_SOURCE_DIR}/data/distance_matrix/full_square_distance_matrix.csv" "12.0" "3" "${CMAKE_CURRENT_BINARY_DIR}/ripscsvreader_result_12_3.txt")
+
+
+if (DIFF_PATH)
+ # Do not forget to copy test results files in current binary dir
+ file(COPY "one_skeleton_rips_for_doc.txt" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
+ file(COPY "full_skeleton_rips_for_doc.txt" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
+
+ add_test(Rips_complex_example_from_off_doc_12_1_diff_files ${DIFF_PATH}
+ ${CMAKE_CURRENT_BINARY_DIR}/ripsoffreader_result_12_1.txt
+ ${CMAKE_CURRENT_BINARY_DIR}/one_skeleton_rips_for_doc.txt)
+ add_test(Rips_complex_example_from_off_doc_12_3_diff_files ${DIFF_PATH}
+ ${CMAKE_CURRENT_BINARY_DIR}/ripsoffreader_result_12_3.txt
+ ${CMAKE_CURRENT_BINARY_DIR}/full_skeleton_rips_for_doc.txt)
+ add_test(Rips_complex_example_from_csv_distance_matrix_doc_12_1_diff_files ${DIFF_PATH}
+ ${CMAKE_CURRENT_BINARY_DIR}/ripscsvreader_result_12_1.txt
+ ${CMAKE_CURRENT_BINARY_DIR}/one_skeleton_rips_for_doc.txt)
+ add_test(Rips_complex_example_from_csv_distance_matrix_doc_12_3_diff_files ${DIFF_PATH}
+ ${CMAKE_CURRENT_BINARY_DIR}/ripscsvreader_result_12_3.txt
+ ${CMAKE_CURRENT_BINARY_DIR}/full_skeleton_rips_for_doc.txt)
+endif()
diff --git a/example/Rips_complex/example_one_skeleton_rips_from_distance_matrix.cpp b/example/Rips_complex/example_one_skeleton_rips_from_distance_matrix.cpp
new file mode 100644
index 00000000..bbc3c755
--- /dev/null
+++ b/example/Rips_complex/example_one_skeleton_rips_from_distance_matrix.cpp
@@ -0,0 +1,58 @@
+#include <gudhi/Rips_complex.h>
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/distance_functions.h>
+
+#include <iostream>
+#include <string>
+#include <vector>
+#include <limits> // for std::numeric_limits
+
+int main() {
+ // Type definitions
+ using Simplex_tree = Gudhi::Simplex_tree<>;
+ using Filtration_value = Simplex_tree::Filtration_value;
+ using Rips_complex = Gudhi::rips_complex::Rips_complex<Filtration_value>;
+ using Distance_matrix = std::vector<std::vector<Filtration_value>>;
+
+ // User defined distance matrix is:
+ // | 0 0.94 0.77 0.99 0.11 |
+ // | 0.94 0 0.26 0.99 0.39 |
+ // | 0.77 0.26 0 0.28 0.97 |
+ // | 0.99 0.99 0.28 0 0.30 |
+ // | 0.11 0.39 0.97 0.30 0 |
+
+ Distance_matrix distances;
+ distances.push_back({});
+ distances.push_back({0.94});
+ distances.push_back({0.77, 0.26});
+ distances.push_back({0.99, 0.99, 0.28});
+ distances.push_back({0.11, 0.39, 0.97, 0.30});
+
+ // ----------------------------------------------------------------------------
+ // Init of a Rips complex from points
+ // ----------------------------------------------------------------------------
+ double threshold = 1.0;
+ Rips_complex rips_complex_from_points(distances, threshold);
+
+ Simplex_tree stree;
+ rips_complex_from_points.create_complex(stree, 1);
+ // ----------------------------------------------------------------------------
+ // Display information about the one skeleton Rips complex
+ // ----------------------------------------------------------------------------
+ std::cout << "Rips complex is of dimension " << stree.dimension() <<
+ " - " << stree.num_simplices() << " simplices - " <<
+ stree.num_vertices() << " vertices." << std::endl;
+
+ std::cout << "Iterator on Rips complex simplices in the filtration order, with [filtration value]:" <<
+ std::endl;
+ for (auto f_simplex : stree.filtration_simplex_range()) {
+ std::cout << " ( ";
+ for (auto vertex : stree.simplex_vertex_range(f_simplex)) {
+ std::cout << vertex << " ";
+ }
+ std::cout << ") -> " << "[" << stree.filtration(f_simplex) << "] ";
+ std::cout << std::endl;
+ }
+
+ return 0;
+}
diff --git a/example/Rips_complex/example_one_skeleton_rips_from_points.cpp b/example/Rips_complex/example_one_skeleton_rips_from_points.cpp
new file mode 100644
index 00000000..a1db8910
--- /dev/null
+++ b/example/Rips_complex/example_one_skeleton_rips_from_points.cpp
@@ -0,0 +1,52 @@
+#include <gudhi/Rips_complex.h>
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/distance_functions.h>
+
+#include <iostream>
+#include <string>
+#include <vector>
+#include <limits> // for std::numeric_limits
+
+int main() {
+ // Type definitions
+ using Point = std::vector<double>;
+ using Simplex_tree = Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_fast_persistence>;
+ using Filtration_value = Simplex_tree::Filtration_value;
+ using Rips_complex = Gudhi::rips_complex::Rips_complex<Filtration_value>;
+
+ std::vector<Point> points;
+ points.push_back({1.0, 1.0});
+ points.push_back({7.0, 0.0});
+ points.push_back({4.0, 6.0});
+ points.push_back({9.0, 6.0});
+ points.push_back({0.0, 14.0});
+ points.push_back({2.0, 19.0});
+ points.push_back({9.0, 17.0});
+
+ // ----------------------------------------------------------------------------
+ // Init of a Rips complex from points
+ // ----------------------------------------------------------------------------
+ double threshold = 12.0;
+ Rips_complex rips_complex_from_points(points, threshold, Gudhi::Euclidean_distance());
+
+ Simplex_tree stree;
+ rips_complex_from_points.create_complex(stree, 1);
+ // ----------------------------------------------------------------------------
+ // Display information about the one skeleton Rips complex
+ // ----------------------------------------------------------------------------
+ std::cout << "Rips complex is of dimension " << stree.dimension() <<
+ " - " << stree.num_simplices() << " simplices - " <<
+ stree.num_vertices() << " vertices." << std::endl;
+
+ std::cout << "Iterator on Rips complex simplices in the filtration order, with [filtration value]:" <<
+ std::endl;
+ for (auto f_simplex : stree.filtration_simplex_range()) {
+ std::cout << " ( ";
+ for (auto vertex : stree.simplex_vertex_range(f_simplex)) {
+ std::cout << vertex << " ";
+ }
+ std::cout << ") -> " << "[" << stree.filtration(f_simplex) << "] ";
+ std::cout << std::endl;
+ }
+ return 0;
+}
diff --git a/example/Rips_complex/example_rips_complex_from_csv_distance_matrix_file.cpp b/example/Rips_complex/example_rips_complex_from_csv_distance_matrix_file.cpp
new file mode 100644
index 00000000..7ae8126f
--- /dev/null
+++ b/example/Rips_complex/example_rips_complex_from_csv_distance_matrix_file.cpp
@@ -0,0 +1,72 @@
+#include <gudhi/Rips_complex.h>
+// to construct Rips_complex from a csv file representing a distance matrix
+#include <gudhi/reader_utils.h>
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/distance_functions.h>
+
+#include <iostream>
+#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.csv threshold dim_max [ouput_file.txt]\n";
+ std::cerr << " i.e.: " << progName << " ../../data/distance_matrix/full_square_distance_matrix.csv 1.0 3\n";
+ exit(-1); // ----- >>
+}
+
+int main(int argc, char **argv) {
+ if ((argc != 4) && (argc != 5)) usage(argc, (argv[0] - 1));
+
+ std::string csv_file_name(argv[1]);
+ double threshold = atof(argv[2]);
+ int dim_max = atoi(argv[3]);
+
+ // Type definitions
+ using Simplex_tree = Gudhi::Simplex_tree<>;
+ using Filtration_value = Simplex_tree::Filtration_value;
+ using Rips_complex = Gudhi::rips_complex::Rips_complex<Filtration_value>;
+ using Distance_matrix = std::vector<std::vector<Filtration_value>>;
+
+ // ----------------------------------------------------------------------------
+ // Init of a Rips complex from a distance matrix in a csv file
+ // Default separator is ';'
+ // ----------------------------------------------------------------------------
+ Distance_matrix distances = read_lower_triangular_matrix_from_csv_file<Filtration_value>(csv_file_name);
+ Rips_complex rips_complex_from_file(distances, threshold);
+
+ std::streambuf* streambufffer;
+ std::ofstream ouput_file_stream;
+
+ if (argc == 5) {
+ ouput_file_stream.open(std::string(argv[4]));
+ streambufffer = ouput_file_stream.rdbuf();
+ } else {
+ streambufffer = std::cout.rdbuf();
+ }
+
+ Simplex_tree stree;
+ rips_complex_from_file.create_complex(stree, dim_max);
+ std::ostream output_stream(streambufffer);
+
+ // ----------------------------------------------------------------------------
+ // Display information about the Rips complex
+ // ----------------------------------------------------------------------------
+ output_stream << "Rips complex is of dimension " << stree.dimension() <<
+ " - " << stree.num_simplices() << " simplices - " <<
+ stree.num_vertices() << " vertices." << std::endl;
+
+ output_stream << "Iterator on Rips complex simplices in the filtration order, with [filtration value]:" <<
+ std::endl;
+ for (auto f_simplex : stree.filtration_simplex_range()) {
+ output_stream << " ( ";
+ for (auto vertex : stree.simplex_vertex_range(f_simplex)) {
+ output_stream << vertex << " ";
+ }
+ output_stream << ") -> " << "[" << stree.filtration(f_simplex) << "] ";
+ output_stream << std::endl;
+ }
+
+ ouput_file_stream.close();
+ return 0;
+}
diff --git a/example/Rips_complex/example_rips_complex_from_off_file.cpp b/example/Rips_complex/example_rips_complex_from_off_file.cpp
new file mode 100644
index 00000000..de2e4ea4
--- /dev/null
+++ b/example/Rips_complex/example_rips_complex_from_off_file.cpp
@@ -0,0 +1,71 @@
+#include <gudhi/Rips_complex.h>
+// to construct Rips_complex from a OFF file of points
+#include <gudhi/Points_off_io.h>
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/distance_functions.h>
+
+#include <iostream>
+#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 threshold dim_max [ouput_file.txt]\n";
+ std::cerr << " i.e.: " << progName << " ../../data/points/alphacomplexdoc.off 60.0\n";
+ exit(-1); // ----- >>
+}
+
+int main(int argc, char **argv) {
+ if ((argc != 4) && (argc != 5)) usage(argc, (argv[0] - 1));
+
+ std::string off_file_name(argv[1]);
+ double threshold = atof(argv[2]);
+ int dim_max = atoi(argv[3]);
+
+ // Type definitions
+ using Point = std::vector<float>;
+ using Simplex_tree = Gudhi::Simplex_tree<>;
+ using Filtration_value = Simplex_tree::Filtration_value;
+ using Rips_complex = Gudhi::rips_complex::Rips_complex<Filtration_value>;
+
+ // ----------------------------------------------------------------------------
+ // Init of a Rips complex from an OFF file
+ // ----------------------------------------------------------------------------
+ Gudhi::Points_off_reader<Point> off_reader(off_file_name);
+ Rips_complex rips_complex_from_file(off_reader.get_point_cloud(), threshold, Gudhi::Euclidean_distance());
+
+ std::streambuf* streambufffer;
+ std::ofstream ouput_file_stream;
+
+ if (argc == 5) {
+ ouput_file_stream.open(std::string(argv[4]));
+ streambufffer = ouput_file_stream.rdbuf();
+ } else {
+ streambufffer = std::cout.rdbuf();
+ }
+
+ Simplex_tree stree;
+ rips_complex_from_file.create_complex(stree, dim_max);
+ std::ostream output_stream(streambufffer);
+
+ // ----------------------------------------------------------------------------
+ // Display information about the Rips complex
+ // ----------------------------------------------------------------------------
+ output_stream << "Rips complex is of dimension " << stree.dimension() <<
+ " - " << stree.num_simplices() << " simplices - " <<
+ stree.num_vertices() << " vertices." << std::endl;
+
+ output_stream << "Iterator on Rips complex simplices in the filtration order, with [filtration value]:" <<
+ std::endl;
+ for (auto f_simplex : stree.filtration_simplex_range()) {
+ output_stream << " ( ";
+ for (auto vertex : stree.simplex_vertex_range(f_simplex)) {
+ output_stream << vertex << " ";
+ }
+ output_stream << ") -> " << "[" << stree.filtration(f_simplex) << "] ";
+ output_stream << std::endl;
+ }
+
+ ouput_file_stream.close();
+ return 0;
+}
diff --git a/example/Rips_complex/full_skeleton_rips_for_doc.txt b/example/Rips_complex/full_skeleton_rips_for_doc.txt
new file mode 100644
index 00000000..55de4ab8
--- /dev/null
+++ b/example/Rips_complex/full_skeleton_rips_for_doc.txt
@@ -0,0 +1,26 @@
+Rips complex is of dimension 3 - 24 simplices - 7 vertices.
+Iterator on Rips complex simplices in the filtration order, with [filtration value]:
+ ( 0 ) -> [0]
+ ( 1 ) -> [0]
+ ( 2 ) -> [0]
+ ( 3 ) -> [0]
+ ( 4 ) -> [0]
+ ( 5 ) -> [0]
+ ( 6 ) -> [0]
+ ( 3 2 ) -> [5]
+ ( 5 4 ) -> [5.38516]
+ ( 2 0 ) -> [5.83095]
+ ( 1 0 ) -> [6.08276]
+ ( 3 1 ) -> [6.32456]
+ ( 2 1 ) -> [6.7082]
+ ( 2 1 0 ) -> [6.7082]
+ ( 3 2 1 ) -> [6.7082]
+ ( 6 5 ) -> [7.28011]
+ ( 4 2 ) -> [8.94427]
+ ( 3 0 ) -> [9.43398]
+ ( 3 1 0 ) -> [9.43398]
+ ( 3 2 0 ) -> [9.43398]
+ ( 3 2 1 0 ) -> [9.43398]
+ ( 6 4 ) -> [9.48683]
+ ( 6 5 4 ) -> [9.48683]
+ ( 6 3 ) -> [11]
diff --git a/example/Rips_complex/one_skeleton_rips_for_doc.txt b/example/Rips_complex/one_skeleton_rips_for_doc.txt
new file mode 100644
index 00000000..706512a5
--- /dev/null
+++ b/example/Rips_complex/one_skeleton_rips_for_doc.txt
@@ -0,0 +1,20 @@
+Rips complex is of dimension 1 - 18 simplices - 7 vertices.
+Iterator on Rips complex simplices in the filtration order, with [filtration value]:
+ ( 0 ) -> [0]
+ ( 1 ) -> [0]
+ ( 2 ) -> [0]
+ ( 3 ) -> [0]
+ ( 4 ) -> [0]
+ ( 5 ) -> [0]
+ ( 6 ) -> [0]
+ ( 3 2 ) -> [5]
+ ( 5 4 ) -> [5.38516]
+ ( 2 0 ) -> [5.83095]
+ ( 1 0 ) -> [6.08276]
+ ( 3 1 ) -> [6.32456]
+ ( 2 1 ) -> [6.7082]
+ ( 6 5 ) -> [7.28011]
+ ( 4 2 ) -> [8.94427]
+ ( 3 0 ) -> [9.43398]
+ ( 6 4 ) -> [9.48683]
+ ( 6 3 ) -> [11]
diff --git a/example/Simplex_tree/CMakeLists.txt b/example/Simplex_tree/CMakeLists.txt
index 9314a805..b1ea98d4 100644
--- a/example/Simplex_tree/CMakeLists.txt
+++ b/example/Simplex_tree/CMakeLists.txt
@@ -1,29 +1,32 @@
cmake_minimum_required(VERSION 2.6)
project(Simplex_tree_examples)
-add_executable ( simplex_tree_from_cliques_of_graph simplex_tree_from_cliques_of_graph.cpp )
+add_executable ( Simplex_tree_example_from_cliques_of_graph simplex_tree_from_cliques_of_graph.cpp )
if (TBB_FOUND)
- target_link_libraries(simplex_tree_from_cliques_of_graph ${TBB_LIBRARIES})
+ target_link_libraries(Simplex_tree_example_from_cliques_of_graph ${TBB_LIBRARIES})
endif()
-add_test(simplex_tree_from_cliques_of_graph_2 ${CMAKE_CURRENT_BINARY_DIR}/simplex_tree_from_cliques_of_graph ${CMAKE_SOURCE_DIR}/data/points/Klein_bottle_complex.txt 2)
-add_test(simplex_tree_from_cliques_of_graph_3 ${CMAKE_CURRENT_BINARY_DIR}/simplex_tree_from_cliques_of_graph ${CMAKE_SOURCE_DIR}/data/points/Klein_bottle_complex.txt 3)
+add_test(NAME Simplex_tree_example_from_cliques_of_graph_2 COMMAND $<TARGET_FILE:Simplex_tree_example_from_cliques_of_graph>
+ "${CMAKE_SOURCE_DIR}/data/filtered_simplicial_complex/Klein_bottle_complex.fsc" "2")
+add_test(NAME Simplex_tree_example_from_cliques_of_graph_3 COMMAND $<TARGET_FILE:Simplex_tree_example_from_cliques_of_graph>
+ "${CMAKE_SOURCE_DIR}/data/filtered_simplicial_complex/Klein_bottle_complex.fsc" "3")
-add_executable ( simple_simplex_tree simple_simplex_tree.cpp )
+add_executable ( Simplex_tree_example_simple_simplex_tree simple_simplex_tree.cpp )
if (TBB_FOUND)
- target_link_libraries(simple_simplex_tree ${TBB_LIBRARIES})
+ target_link_libraries(Simplex_tree_example_simple_simplex_tree ${TBB_LIBRARIES})
endif()
-add_test(simple_simplex_tree ${CMAKE_CURRENT_BINARY_DIR}/simple_simplex_tree)
+add_test(NAME Simplex_tree_example_simple_simplex_tree COMMAND $<TARGET_FILE:Simplex_tree_example_simple_simplex_tree>)
-add_executable ( mini_simplex_tree mini_simplex_tree.cpp )
-add_test(mini_simplex_tree ${CMAKE_CURRENT_BINARY_DIR}/mini_simplex_tree)
+add_executable ( Simplex_tree_example_mini_simplex_tree mini_simplex_tree.cpp )
+add_test(NAME Simplex_tree_example_mini_simplex_tree COMMAND $<TARGET_FILE:Simplex_tree_example_mini_simplex_tree>)
# An example with Simplex-tree using CGAL alpha_shapes_3
if(GMP_FOUND AND CGAL_FOUND)
- add_executable ( simplex_tree_from_alpha_shapes_3 simplex_tree_from_alpha_shapes_3.cpp )
- target_link_libraries(simplex_tree_from_alpha_shapes_3 ${GMP_LIBRARIES} ${CGAL_LIBRARY} ${Boost_SYSTEM_LIBRARY})
+ add_executable ( Simplex_tree_example_alpha_shapes_3_from_off example_alpha_shapes_3_simplex_tree_from_off_file.cpp )
+ target_link_libraries(Simplex_tree_example_alpha_shapes_3_from_off ${GMP_LIBRARIES} ${CGAL_LIBRARY} ${Boost_SYSTEM_LIBRARY})
if (TBB_FOUND)
- target_link_libraries(simplex_tree_from_alpha_shapes_3 ${TBB_LIBRARIES})
+ target_link_libraries(Simplex_tree_example_alpha_shapes_3_from_off ${TBB_LIBRARIES})
endif()
- add_test(simplex_tree_from_alpha_shapes_3 ${CMAKE_CURRENT_BINARY_DIR}/simplex_tree_from_alpha_shapes_3 ${CMAKE_SOURCE_DIR}/data/points/bunny_5000)
+ add_test(NAME Simplex_tree_example_alpha_shapes_3_from_off COMMAND $<TARGET_FILE:Simplex_tree_example_alpha_shapes_3_from_off>
+ "${CMAKE_SOURCE_DIR}/data/points/bunny_5000.off")
endif()
diff --git a/example/Simplex_tree/README b/example/Simplex_tree/README
index e37af790..a9498173 100644
--- a/example/Simplex_tree/README
+++ b/example/Simplex_tree/README
@@ -10,7 +10,7 @@ Example of use :
*** Simple simplex tree construction
-./simple_simplex_tree
+./Simplex_tree_example_simple_simplex_tree
********************************************************************
EXAMPLE OF SIMPLE INSERTION
@@ -52,7 +52,7 @@ EXAMPLE OF SIMPLE INSERTION
*** Simplex tree construction with Z/2Z coefficients on weighted graph Klein bottle file:
-./simplex_tree_from_cliques_of_graph ../../../data/points/Klein_bottle_complex.txt 2
+./Simplex_tree_example_from_cliques_of_graph ../../../data/points/Klein_bottle_complex.txt 2
Insert the 1-skeleton in the simplex tree in 0 s.
Expand the simplex tree in 0 s.
Information of the Simplex Tree:
@@ -60,7 +60,7 @@ Information of the Simplex Tree:
with Z/3Z coefficients:
-./simplex_tree_from_cliques_of_graph ../../../data/points/Klein_bottle_complex.txt 3
+./Simplex_tree_example_from_cliques_of_graph ../../../data/points/Klein_bottle_complex.txt 3
Insert the 1-skeleton in the simplex tree in 0 s.
Expand the simplex tree in 0 s.
@@ -70,4 +70,4 @@ Information of the Simplex Tree:
*** Simplex_tree computed and displayed from a 3D alpha complex:
[ Requires CGAL, GMP and GMPXX to be installed]
-./simplex_tree_from_alpha_shapes_3 ../../../data/points/bunny_5000
+./Simplex_tree_example_alpha_shapes_3_from_off ../../../data/points/bunny_5000
diff --git a/example/Simplex_tree/simplex_tree_from_alpha_shapes_3.cpp b/example/Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp
index 49d358ab..ff2eebcb 100644
--- a/example/Simplex_tree/simplex_tree_from_alpha_shapes_3.cpp
+++ b/example/Simplex_tree/example_alpha_shapes_3_simplex_tree_from_off_file.cpp
@@ -20,8 +20,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <gudhi/graph_simplicial_complex.h>
#include <gudhi/Simplex_tree.h>
+#include <gudhi/Points_3D_off_io.h>
+
#include <boost/variant.hpp>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
@@ -118,24 +119,21 @@ int main(int argc, char * const argv[]) {
// program args management
if (argc != 2) {
std::cerr << "Usage: " << argv[0]
- << " path_to_file_graph \n";
+ << " path_to_off_file \n";
return 0;
}
// Read points from file
- std::string filegraph = argv[1];
- std::list<Point> lp;
- std::ifstream is(filegraph.c_str());
- int n;
- is >> n;
-#ifdef DEBUG_TRACES
- std::cout << "Reading " << n << " points " << std::endl;
-#endif // DEBUG_TRACES
- Point p;
- for (; n > 0; n--) {
- is >> p;
- lp.push_back(p);
+ std::string offInputFile(argv[1]);
+ // Read the OFF file (input file name given as parameter) and triangulate points
+ Gudhi::Points_3D_off_reader<Point> off_reader(offInputFile);
+ // Check the read operation was correct
+ if (!off_reader.is_valid()) {
+ std::cerr << "Unable to read file " << argv[1] << std::endl;
+ return 0;
}
+ // Retrieve the triangulation
+ std::vector<Point> lp = off_reader.get_point_cloud();
// alpha shape construction from points. CGAL has a strange behavior in REGULARIZED mode.
Alpha_shape_3 as(lp.begin(), lp.end(), 0, Alpha_shape_3::GENERAL);
diff --git a/example/Simplex_tree/mini_simplex_tree.cpp b/example/Simplex_tree/mini_simplex_tree.cpp
index 7e48aaaf..ad99df23 100644
--- a/example/Simplex_tree/mini_simplex_tree.cpp
+++ b/example/Simplex_tree/mini_simplex_tree.cpp
@@ -24,19 +24,18 @@
#include <iostream>
#include <initializer_list>
-using namespace Gudhi;
-
-struct MyOptions : Simplex_tree_options_full_featured {
+struct MyOptions : Gudhi::Simplex_tree_options_full_featured {
// Not doing persistence, so we don't need those
static const bool store_key = false;
static const bool store_filtration = false;
// I have few vertices
typedef short Vertex_handle;
};
-typedef Simplex_tree<MyOptions> ST;
+
+using ST = Gudhi::Simplex_tree<MyOptions>;
// Dictionary should be private, but for now this is the easiest way.
-static_assert(sizeof(ST::Dictionary::value_type) < sizeof(Simplex_tree<>::Dictionary::value_type),
+static_assert(sizeof(ST::Dictionary::value_type) < sizeof(Gudhi::Simplex_tree<>::Dictionary::value_type),
"Not storing the filtration and key should save some space");
int main() {
diff --git a/example/Simplex_tree/simple_simplex_tree.cpp b/example/Simplex_tree/simple_simplex_tree.cpp
index 5146b906..60f9a35e 100644
--- a/example/Simplex_tree/simple_simplex_tree.cpp
+++ b/example/Simplex_tree/simple_simplex_tree.cpp
@@ -4,7 +4,7 @@
*
* Author(s): Vincent Rouvreau
*
- * Copyright (C) 2014 INRIA Sophia Antipolis-Méditerranée (France)
+ * 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
@@ -27,10 +27,11 @@
#include <utility> // for pair
#include <vector>
-using namespace Gudhi;
-
-typedef std::vector< Vertex_handle > typeVectorVertex;
-typedef std::pair< Simplex_tree<>::Simplex_handle, bool > typePairSimplexBool;
+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 >;
int main(int argc, char * const argv[]) {
const Filtration_value FIRST_FILTRATION_VALUE = 0.1;
@@ -42,7 +43,7 @@ int main(int argc, char * const argv[]) {
std::cout << "********************************************************************" << std::endl;
std::cout << "EXAMPLE OF SIMPLE INSERTION" << std::endl;
// Construct the Simplex Tree
- Simplex_tree<> simplexTree;
+ Simplex_tree simplexTree;
/* Simplex to be inserted: */
/* 1 */
@@ -212,7 +213,7 @@ int main(int argc, char * const argv[]) {
// ------------------------------------------------------------------------------------------------------------------
// Find in the simplex_tree
// ------------------------------------------------------------------------------------------------------------------
- Simplex_tree<>::Simplex_handle simplexFound = simplexTree.find(secondSimplexVector);
+ Simplex_tree::Simplex_handle simplexFound = simplexTree.find(secondSimplexVector);
std::cout << "**************IS THE SIMPLEX {1} IN THE SIMPLEX TREE ?\n";
if (simplexFound != simplexTree.null_simplex())
std::cout << "***+ YES IT IS!\n";
diff --git a/example/Simplex_tree/simplex_tree_from_cliques_of_graph.cpp b/example/Simplex_tree/simplex_tree_from_cliques_of_graph.cpp
index 58085014..d1b8b2de 100644
--- a/example/Simplex_tree/simplex_tree_from_cliques_of_graph.cpp
+++ b/example/Simplex_tree/simplex_tree_from_cliques_of_graph.cpp
@@ -4,7 +4,7 @@
*
* Author(s): Clément Maria
*
- * Copyright (C) 2014 INRIA Sophia Antipolis-Méditerranée (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
@@ -26,9 +26,16 @@
#include <iostream>
#include <ctime>
#include <string>
+#include <utility> // for std::pair
using namespace Gudhi;
+typedef int Vertex_handle;
+typedef double Filtration_value;
+typedef boost::adjacency_list < boost::vecS, boost::vecS, boost::undirectedS,
+ boost::property < vertex_filtration_t, Filtration_value >,
+ boost::property < edge_filtration_t, Filtration_value > > Graph_t;
+
int main(int argc, char * const argv[]) {
if (argc != 3) {
std::cerr << "Usage: " << argv[0]
@@ -43,7 +50,7 @@ int main(int argc, char * const argv[]) {
Simplex_tree<> st;
start = clock();
- auto g = read_graph(filegraph);
+ auto g = read_graph<Graph_t, Filtration_value, Vertex_handle>(filegraph);
// insert the graph in the simplex tree as 1-skeleton
st.insert_graph(g);
end = clock();
diff --git a/example/Skeleton_blocker/CMakeLists.txt b/example/Skeleton_blocker/CMakeLists.txt
index cc7f37f3..c887e408 100644
--- a/example/Skeleton_blocker/CMakeLists.txt
+++ b/example/Skeleton_blocker/CMakeLists.txt
@@ -1,12 +1,12 @@
cmake_minimum_required(VERSION 2.6)
project(Skeleton_blocker_examples)
-add_executable(SkeletonBlockerFromSimplices Skeleton_blocker_from_simplices.cpp)
-add_executable(SkeletonBlockerIteration Skeleton_blocker_iteration.cpp)
-add_executable(SkeletonBlockerLink Skeleton_blocker_link.cpp)
+add_executable(Skeleton_blocker_example_from_simplices Skeleton_blocker_from_simplices.cpp)
+add_executable(Skeleton_blocker_example_iteration Skeleton_blocker_iteration.cpp)
+add_executable(Skeleton_blocker_example_link Skeleton_blocker_link.cpp)
-target_link_libraries(SkeletonBlockerIteration ${Boost_TIMER_LIBRARY} ${Boost_SYSTEM_LIBRARY})
+target_link_libraries(Skeleton_blocker_example_iteration ${Boost_TIMER_LIBRARY} ${Boost_SYSTEM_LIBRARY})
-add_test(SkeletonBlockerFromSimplices ${CMAKE_CURRENT_BINARY_DIR}/SkeletonBlockerFromSimplices)
-add_test(SkeletonBlockerIteration ${CMAKE_CURRENT_BINARY_DIR}/SkeletonBlockerIteration)
-add_test(SkeletonBlockerLink ${CMAKE_CURRENT_BINARY_DIR}/SkeletonBlockerLink)
+add_test(NAME Skeleton_blocker_example_from_simplices COMMAND $<TARGET_FILE:Skeleton_blocker_example_from_simplices>)
+add_test(NAME Skeleton_blocker_example_iteration COMMAND $<TARGET_FILE:Skeleton_blocker_example_iteration>)
+add_test(NAME Skeleton_blocker_example_link COMMAND $<TARGET_FILE:Skeleton_blocker_example_link>)
diff --git a/example/Skeleton_blocker/Skeleton_blocker_from_simplices.cpp b/example/Skeleton_blocker/Skeleton_blocker_from_simplices.cpp
index 171f35f2..076c6a53 100644
--- a/example/Skeleton_blocker/Skeleton_blocker_from_simplices.cpp
+++ b/example/Skeleton_blocker/Skeleton_blocker_from_simplices.cpp
@@ -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
@@ -29,11 +29,8 @@
#include <sstream>
#include <vector>
-using namespace std;
-using namespace Gudhi;
-using namespace skeleton_blocker;
-
-typedef Skeleton_blocker_complex<Skeleton_blocker_simple_traits> Complex;
+typedef Gudhi::skeleton_blocker::Skeleton_blocker_simple_traits Traits;
+typedef Gudhi::skeleton_blocker::Skeleton_blocker_complex<Traits> Complex;
typedef Complex::Vertex_handle Vertex_handle;
typedef Complex::Simplex Simplex;
@@ -47,7 +44,7 @@ int main(int argc, char *argv[]) {
simplices.push_back(Simplex(Vertex_handle(3), Vertex_handle(0), Vertex_handle(1)));
// get complex from top faces
- Complex complex(make_complex_from_top_faces<Complex>(simplices.begin(), simplices.end()));
+ Complex complex(Gudhi::skeleton_blocker::make_complex_from_top_faces<Complex>(simplices.begin(), simplices.end()));
std::cout << "Simplices:" << std::endl;
diff --git a/example/Skeleton_blocker/Skeleton_blocker_iteration.cpp b/example/Skeleton_blocker/Skeleton_blocker_iteration.cpp
index 8d9d1a67..6a1bc480 100644
--- a/example/Skeleton_blocker/Skeleton_blocker_iteration.cpp
+++ b/example/Skeleton_blocker/Skeleton_blocker_iteration.cpp
@@ -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
@@ -30,12 +30,8 @@
#include <fstream>
#include <sstream>
-
-using namespace std;
-using namespace Gudhi;
-using namespace skeleton_blocker;
-
-typedef Skeleton_blocker_complex<Skeleton_blocker_simple_traits> Complex;
+typedef Gudhi::skeleton_blocker::Skeleton_blocker_simple_traits Traits;
+typedef Gudhi::skeleton_blocker::Skeleton_blocker_complex<Traits> Complex;
typedef Complex::Vertex_handle Vertex_handle;
typedef Complex::Simplex Simplex;
diff --git a/example/Skeleton_blocker/Skeleton_blocker_link.cpp b/example/Skeleton_blocker/Skeleton_blocker_link.cpp
index 1f937170..58322038 100644
--- a/example/Skeleton_blocker/Skeleton_blocker_link.cpp
+++ b/example/Skeleton_blocker/Skeleton_blocker_link.cpp
@@ -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
@@ -28,11 +28,8 @@
#include <fstream>
#include <sstream>
-using namespace std;
-using namespace Gudhi;
-using namespace skeleton_blocker;
-
-typedef Skeleton_blocker_complex<Skeleton_blocker_simple_traits> Complex;
+typedef Gudhi::skeleton_blocker::Skeleton_blocker_simple_traits Traits;
+typedef Gudhi::skeleton_blocker::Skeleton_blocker_complex<Traits> Complex;
typedef Complex::Vertex_handle Vertex_handle;
typedef Complex::Root_vertex_handle Root_vertex_handle;
typedef Complex::Simplex Simplex;
@@ -47,25 +44,26 @@ int main(int argc, char *argv[]) {
Simplex tetrahedron(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3));
complex.add_simplex(tetrahedron);
- cout << "complex:" << complex.to_string() << endl;
+ std::cout << "complex:" << complex.to_string() << std::endl;
// build the link of vertex 1, eg a triangle {0,2,3}
auto link = complex.link(Vertex_handle(1));
- cout << "link:" << link.to_string() << endl;
+ std::cout << "link:" << link.to_string() << std::endl;
// Internally link is a subcomplex of 'complex' and its vertices are stored in a vector.
// They can be accessed via Vertex_handle(x) where x is an index of the vector.
// In that example, link has three vertices and thus it contains only
// Vertex_handle(0),Vertex_handle(1) and Vertex_handle(2) are).
for (int i = 0; i < 5; ++i)
- cout << "link.contains_vertex(Vertex_handle(" << i << ")):" << link.contains_vertex(Vertex_handle(i)) << endl;
- cout << endl;
+ std::cout << "link.contains_vertex(Vertex_handle(" << i << ")):" << link.contains_vertex(Vertex_handle(i)) <<
+ std::endl;
+ std::cout << std::endl;
// To access to the initial vertices eg (0,1,2,3,4), Root_vertex_handle must be used.
// For instance, to test if the link contains the vertex that was labeled i:
for (int i = 0; i < 5; ++i)
- cout << "link.contains_vertex(Root_vertex_handle(" << i << ")):" <<
- link.contains_vertex(Root_vertex_handle(i)) << endl;
+ std::cout << "link.contains_vertex(Root_vertex_handle(" << i << ")):" <<
+ link.contains_vertex(Root_vertex_handle(i)) << std::endl;
return EXIT_SUCCESS;
}
diff --git a/example/Spatial_searching/CMakeLists.txt b/example/Spatial_searching/CMakeLists.txt
new file mode 100644
index 00000000..f4b9f3cb
--- /dev/null
+++ b/example/Spatial_searching/CMakeLists.txt
@@ -0,0 +1,9 @@
+cmake_minimum_required(VERSION 2.6)
+project(Spatial_searching_examples)
+
+if(NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1)
+ add_executable( Spatial_searching_example_spatial_searching example_spatial_searching.cpp )
+ target_link_libraries(Spatial_searching_example_spatial_searching ${CGAL_LIBRARY})
+ add_test(NAME Spatial_searching_example_spatial_searching
+ COMMAND $<TARGET_FILE:Spatial_searching_example_spatial_searching>)
+endif(NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1)
diff --git a/example/Spatial_searching/example_spatial_searching.cpp b/example/Spatial_searching/example_spatial_searching.cpp
new file mode 100644
index 00000000..14b324ae
--- /dev/null
+++ b/example/Spatial_searching/example_spatial_searching.cpp
@@ -0,0 +1,52 @@
+#include <gudhi/Kd_tree_search.h>
+
+#include <CGAL/Epick_d.h>
+#include <CGAL/Random.h>
+
+#include <vector>
+
+namespace gss = Gudhi::spatial_searching;
+
+int main(void) {
+ typedef CGAL::Epick_d<CGAL::Dimension_tag<4> > K;
+ typedef typename K::Point_d Point;
+ typedef std::vector<Point> Points;
+
+ typedef gss::Kd_tree_search<K, Points> Points_ds;
+
+ CGAL::Random rd;
+
+ Points points;
+ for (int i = 0; i < 500; ++i)
+ points.push_back(Point(rd.get_double(-1., 1), rd.get_double(-1., 1), rd.get_double(-1., 1), rd.get_double(-1., 1)));
+
+ Points_ds points_ds(points);
+
+ // 10-nearest neighbor query
+ std::cout << "10 nearest neighbors from points[20]:\n";
+ auto knn_range = points_ds.query_k_nearest_neighbors(points[20], 10, true);
+ for (auto const& nghb : knn_range)
+ std::cout << nghb.first << " (sq. dist. = " << nghb.second << ")\n";
+
+ // Incremental nearest neighbor query
+ std::cout << "Incremental nearest neighbors:\n";
+ auto inn_range = points_ds.query_incremental_nearest_neighbors(points[45]);
+ // Get the neighbors in distance order until we hit the first point
+ for (auto ins_iterator = inn_range.begin(); ins_iterator->first != 0; ++ins_iterator)
+ std::cout << ins_iterator->first << " (sq. dist. = " << ins_iterator->second << ")\n";
+
+ // 10-farthest neighbor query
+ std::cout << "10 farthest neighbors from points[20]:\n";
+ auto kfn_range = points_ds.query_k_farthest_neighbors(points[20], 10, true);
+ for (auto const& nghb : kfn_range)
+ std::cout << nghb.first << " (sq. dist. = " << nghb.second << ")\n";
+
+ // Incremental farthest neighbor query
+ std::cout << "Incremental farthest neighbors:\n";
+ auto ifn_range = points_ds.query_incremental_farthest_neighbors(points[45]);
+ // Get the neighbors in distance reverse order until we hit the first point
+ for (auto ifs_iterator = ifn_range.begin(); ifs_iterator->first != 0; ++ifs_iterator)
+ std::cout << ifs_iterator->first << " (sq. dist. = " << ifs_iterator->second << ")\n";
+
+ return 0;
+}
diff --git a/example/Subsampling/CMakeLists.txt b/example/Subsampling/CMakeLists.txt
new file mode 100644
index 00000000..71b8d2e8
--- /dev/null
+++ b/example/Subsampling/CMakeLists.txt
@@ -0,0 +1,17 @@
+cmake_minimum_required(VERSION 2.6)
+project(Subsampling_examples)
+
+if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1)
+ add_executable(Subsampling_example_pick_n_random_points example_pick_n_random_points.cpp)
+ add_executable(Subsampling_example_choose_n_farthest_points example_choose_n_farthest_points.cpp)
+ add_executable(Subsampling_example_custom_kernel example_custom_kernel.cpp)
+ add_executable(Subsampling_example_sparsify_point_set example_sparsify_point_set.cpp)
+ target_link_libraries(Subsampling_example_sparsify_point_set ${CGAL_LIBRARY})
+
+ add_test(NAME Subsampling_example_pick_n_random_points
+ COMMAND $<TARGET_FILE:Subsampling_example_pick_n_random_points>)
+ add_test(NAME Subsampling_example_choose_n_farthest_points
+ COMMAND $<TARGET_FILE:Subsampling_example_choose_n_farthest_points>)
+ add_test(NAME Subsampling_example_sparsify_point_set
+ COMMAND $<TARGET_FILE:Subsampling_example_sparsify_point_set>)
+endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1)
diff --git a/example/Subsampling/example_choose_n_farthest_points.cpp b/example/Subsampling/example_choose_n_farthest_points.cpp
new file mode 100644
index 00000000..ebf631fc
--- /dev/null
+++ b/example/Subsampling/example_choose_n_farthest_points.cpp
@@ -0,0 +1,29 @@
+#include <gudhi/choose_n_farthest_points.h>
+
+#include <CGAL/Epick_d.h>
+#include <CGAL/Random.h>
+
+#include <vector>
+#include <iterator>
+
+int main(void) {
+ typedef CGAL::Epick_d<CGAL::Dimension_tag<4> > K;
+ typedef typename K::Point_d Point_d;
+
+ CGAL::Random rd;
+
+ std::vector<Point_d> points;
+ for (int i = 0; i < 500; ++i)
+ points.push_back(Point_d(rd.get_double(-1., 1), rd.get_double(-1., 1),
+ rd.get_double(-1., 1), rd.get_double(-1., 1)));
+
+ K k;
+ std::vector<Point_d> results;
+ Gudhi::subsampling::choose_n_farthest_points(k, points, 100,
+ Gudhi::subsampling::random_starting_point,
+ std::back_inserter(results));
+ std::cout << "Before sparsification: " << points.size() << " points.\n";
+ std::cout << "After sparsification: " << results.size() << " points.\n";
+
+ return 0;
+}
diff --git a/example/Subsampling/example_custom_kernel.cpp b/example/Subsampling/example_custom_kernel.cpp
new file mode 100644
index 00000000..2d42bdde
--- /dev/null
+++ b/example/Subsampling/example_custom_kernel.cpp
@@ -0,0 +1,65 @@
+#include <gudhi/choose_n_farthest_points.h>
+
+#include <CGAL/Epick_d.h>
+#include <CGAL/Random.h>
+
+#include <vector>
+#include <iterator>
+
+
+/* The class Kernel contains a distance function defined on the set of points {0, 1, 2, 3}
+ * and computes a distance according to the matrix:
+ * 0 1 2 4
+ * 1 0 4 2
+ * 2 4 0 1
+ * 4 2 1 0
+ */
+class Kernel {
+ public:
+ typedef double FT;
+ typedef unsigned Point_d;
+
+ // Class Squared_distance_d
+ class Squared_distance_d {
+ private:
+ std::vector<std::vector<FT>> matrix_;
+
+ public:
+ Squared_distance_d() {
+ matrix_.push_back(std::vector<FT>({0, 1, 2, 4}));
+ matrix_.push_back(std::vector<FT>({1, 0, 4, 2}));
+ matrix_.push_back(std::vector<FT>({2, 4, 0, 1}));
+ matrix_.push_back(std::vector<FT>({4, 2, 1, 0}));
+ }
+
+ FT operator()(Point_d p1, Point_d p2) {
+ return matrix_[p1][p2];
+ }
+ };
+
+ // Constructor
+ Kernel() {}
+
+ // Object of type Squared_distance_d
+ Squared_distance_d squared_distance_d_object() const {
+ return Squared_distance_d();
+ }
+};
+
+int main(void) {
+ typedef Kernel K;
+ typedef typename K::Point_d Point_d;
+
+ K k;
+ std::vector<Point_d> points = {0, 1, 2, 3};
+ std::vector<Point_d> results;
+
+ Gudhi::subsampling::choose_n_farthest_points(k, points, 2,
+ Gudhi::subsampling::random_starting_point,
+ std::back_inserter(results));
+ std::cout << "Before sparsification: " << points.size() << " points.\n";
+ std::cout << "After sparsification: " << results.size() << " points.\n";
+ std::cout << "Result table: {" << results[0] << "," << results[1] << "}\n";
+
+ return 0;
+}
diff --git a/example/Subsampling/example_pick_n_random_points.cpp b/example/Subsampling/example_pick_n_random_points.cpp
new file mode 100644
index 00000000..1e38e405
--- /dev/null
+++ b/example/Subsampling/example_pick_n_random_points.cpp
@@ -0,0 +1,27 @@
+#include <gudhi/pick_n_random_points.h>
+
+#include <CGAL/Epick_d.h>
+#include <CGAL/Random.h>
+
+#include <vector>
+#include <iterator>
+
+int main(void) {
+ typedef CGAL::Epick_d<CGAL::Dimension_tag<4> > K;
+ typedef typename K::Point_d Point_d;
+
+ CGAL::Random rd;
+
+ std::vector<Point_d> points;
+ for (int i = 0; i < 500; ++i)
+ points.push_back(Point_d(rd.get_double(-1., 1), rd.get_double(-1., 1),
+ rd.get_double(-1., 1), rd.get_double(-1., 1)));
+
+ K k;
+ std::vector<Point_d> results;
+ Gudhi::subsampling::pick_n_random_points(points, 100, std::back_inserter(results));
+ std::cout << "Before sparsification: " << points.size() << " points.\n";
+ std::cout << "After sparsification: " << results.size() << " points.\n";
+
+ return 0;
+}
diff --git a/example/Subsampling/example_sparsify_point_set.cpp b/example/Subsampling/example_sparsify_point_set.cpp
new file mode 100644
index 00000000..b35a18d9
--- /dev/null
+++ b/example/Subsampling/example_sparsify_point_set.cpp
@@ -0,0 +1,27 @@
+#include <gudhi/sparsify_point_set.h>
+
+#include <CGAL/Epick_d.h>
+#include <CGAL/Random.h>
+
+#include <vector>
+#include <iterator>
+
+int main(void) {
+ typedef CGAL::Epick_d<CGAL::Dimension_tag<4> > K;
+ typedef typename K::Point_d Point_d;
+
+ CGAL::Random rd;
+
+ std::vector<Point_d> points;
+ for (int i = 0; i < 500; ++i)
+ points.push_back(Point_d(rd.get_double(-1., 1), rd.get_double(-1., 1),
+ rd.get_double(-1., 1), rd.get_double(-1., 1)));
+
+ K k;
+ std::vector<Point_d> results;
+ Gudhi::subsampling::sparsify_point_set(k, points, 0.4, std::back_inserter(results));
+ std::cout << "Before sparsification: " << points.size() << " points.\n";
+ std::cout << "After sparsification: " << results.size() << " points.\n";
+
+ return 0;
+}
diff --git a/example/Tangential_complex/CMakeLists.txt b/example/Tangential_complex/CMakeLists.txt
new file mode 100644
index 00000000..339d0581
--- /dev/null
+++ b/example/Tangential_complex/CMakeLists.txt
@@ -0,0 +1,18 @@
+cmake_minimum_required(VERSION 2.6)
+project(Tangential_complex_examples)
+
+if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1)
+ add_executable( Tangential_complex_example_basic example_basic.cpp )
+ target_link_libraries(Tangential_complex_example_basic ${CGAL_LIBRARY} ${Boost_DATE_TIME_LIBRARY})
+ add_executable( Tangential_complex_example_with_perturb example_with_perturb.cpp )
+ target_link_libraries(Tangential_complex_example_with_perturb ${CGAL_LIBRARY} ${Boost_DATE_TIME_LIBRARY})
+ if (TBB_FOUND)
+ target_link_libraries(Tangential_complex_example_basic ${TBB_LIBRARIES})
+ target_link_libraries(Tangential_complex_example_with_perturb ${TBB_LIBRARIES})
+ endif(TBB_FOUND)
+
+ add_test(NAME Tangential_complex_example_basic
+ COMMAND $<TARGET_FILE:Tangential_complex_example_basic>)
+ add_test(NAME Tangential_complex_example_with_perturb
+ COMMAND $<TARGET_FILE:Tangential_complex_example_with_perturb>)
+endif(NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.8.1)
diff --git a/example/Tangential_complex/example_basic.cpp b/example/Tangential_complex/example_basic.cpp
new file mode 100644
index 00000000..4f2b859e
--- /dev/null
+++ b/example/Tangential_complex/example_basic.cpp
@@ -0,0 +1,46 @@
+#include <gudhi/Tangential_complex.h>
+#include <gudhi/sparsify_point_set.h>
+
+#include <CGAL/Epick_d.h>
+#include <CGAL/Random.h>
+
+#include <array>
+#include <vector>
+
+namespace tc = Gudhi::tangential_complex;
+
+typedef CGAL::Epick_d<CGAL::Dynamic_dimension_tag> Kernel;
+typedef Kernel::FT FT;
+typedef Kernel::Point_d Point;
+typedef Kernel::Vector_d Vector;
+typedef tc::Tangential_complex<
+Kernel, CGAL::Dynamic_dimension_tag,
+CGAL::Parallel_tag> TC;
+
+int main(void) {
+ const int INTRINSIC_DIM = 2;
+ const int AMBIENT_DIM = 3;
+ const int NUM_POINTS = 1000;
+
+ Kernel k;
+
+ // Generate points on a 2-sphere
+ CGAL::Random_points_on_sphere_d<Point> generator(AMBIENT_DIM, 3.);
+ std::vector<Point> points;
+ points.reserve(NUM_POINTS);
+ for (int i = 0; i < NUM_POINTS; ++i)
+ points.push_back(*generator++);
+
+ // Compute the TC
+ TC tc(points, INTRINSIC_DIM, k);
+ tc.compute_tangential_complex();
+
+ // Export the TC into a Simplex_tree
+ Gudhi::Simplex_tree<> stree;
+ tc.create_complex(stree);
+
+ // Display stats about inconsistencies
+ tc.number_of_inconsistent_simplices(true); // verbose
+
+ return 0;
+}
diff --git a/example/Tangential_complex/example_with_perturb.cpp b/example/Tangential_complex/example_with_perturb.cpp
new file mode 100644
index 00000000..d0d877ea
--- /dev/null
+++ b/example/Tangential_complex/example_with_perturb.cpp
@@ -0,0 +1,53 @@
+#include <gudhi/Tangential_complex.h>
+#include <gudhi/sparsify_point_set.h>
+
+#include <CGAL/Epick_d.h>
+#include <CGAL/Random.h>
+
+#include <array>
+#include <vector>
+
+namespace subsampl = Gudhi::subsampling;
+namespace tc = Gudhi::tangential_complex;
+
+typedef CGAL::Epick_d<CGAL::Dimension_tag < 3 >> Kernel;
+typedef Kernel::FT FT;
+typedef Kernel::Point_d Point;
+typedef Kernel::Vector_d Vector;
+typedef tc::Tangential_complex<
+Kernel, CGAL::Dimension_tag<2>,
+CGAL::Parallel_tag> TC;
+
+int main(void) {
+ const int INTRINSIC_DIM = 2;
+ const int AMBIENT_DIM = 3;
+ const int NUM_POINTS = 50;
+
+ Kernel k;
+
+ // Generate points on a 2-sphere
+ CGAL::Random_points_on_sphere_d<Point> generator(AMBIENT_DIM, 3.);
+ std::vector<Point> points;
+ points.reserve(NUM_POINTS);
+ for (int i = 0; i < NUM_POINTS; ++i)
+ points.push_back(*generator++);
+
+ // Sparsify the point set
+ std::vector<Point> sparsified_points;
+ subsampl::sparsify_point_set(k, points, 0.1 * 0.1,
+ std::back_inserter(sparsified_points));
+ sparsified_points.swap(points);
+
+ // Compute the TC
+ TC tc(points, INTRINSIC_DIM, k);
+ tc.compute_tangential_complex();
+
+ // Try to fix inconsistencies. Give it 10 seconds to succeed
+ tc.fix_inconsistencies_using_perturbation(0.05, 10);
+
+ // Export the TC into a Simplex_tree
+ Gudhi::Simplex_tree<> stree;
+ tc.create_complex(stree);
+
+ return 0;
+}
diff --git a/example/Witness_complex/CMakeLists.txt b/example/Witness_complex/CMakeLists.txt
index 4d67e0d0..670651ce 100644
--- a/example/Witness_complex/CMakeLists.txt
+++ b/example/Witness_complex/CMakeLists.txt
@@ -1,16 +1,46 @@
cmake_minimum_required(VERSION 2.6)
project(Witness_complex_examples)
-# A simple example
- add_executable( witness_complex_from_file witness_complex_from_file.cpp )
- add_test( witness_complex_from_bunny ${CMAKE_CURRENT_BINARY_DIR}/witness_complex_from_file ${CMAKE_SOURCE_DIR}/data/points/bunny_5000 100)
-
-if(CGAL_FOUND)
- if (NOT CGAL_VERSION VERSION_LESS 4.6.0)
- if (EIGEN3_FOUND)
- add_executable ( witness_complex_sphere witness_complex_sphere.cpp )
- target_link_libraries(witness_complex_sphere ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY})
- add_test( witness_complex_sphere_10 ${CMAKE_CURRENT_BINARY_DIR}/witness_complex_sphere 10)
- endif(EIGEN3_FOUND)
- endif (NOT CGAL_VERSION VERSION_LESS 4.6.0)
+add_executable ( Witness_complex_example_nearest_landmark_table example_nearest_landmark_table.cpp )
+target_link_libraries(Witness_complex_example_nearest_landmark_table ${Boost_SYSTEM_LIBRARY})
+if (TBB_FOUND)
+ target_link_libraries(Witness_complex_example_nearest_landmark_table ${TBB_LIBRARIES})
endif()
+add_test(NAME Witness_complex_example_nearest_landmark_table
+ COMMAND $<TARGET_FILE:Witness_complex_example_nearest_landmark_table>)
+
+# 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 )
+ target_link_libraries(Witness_complex_example_off ${Boost_SYSTEM_LIBRARY})
+ add_executable( Witness_complex_example_strong_off example_strong_witness_complex_off.cpp )
+ target_link_libraries(Witness_complex_example_strong_off ${Boost_SYSTEM_LIBRARY})
+ add_executable ( Witness_complex_example_sphere example_witness_complex_sphere.cpp )
+ target_link_libraries(Witness_complex_example_sphere ${Boost_SYSTEM_LIBRARY})
+
+ add_executable ( Witness_complex_example_witness_persistence example_witness_complex_persistence.cpp )
+ target_link_libraries(Witness_complex_example_witness_persistence ${Boost_SYSTEM_LIBRARY} ${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_SYSTEM_LIBRARY} ${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_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_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")
+endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.6.0)
diff --git a/example/Witness_complex/example_nearest_landmark_table.cpp b/example/Witness_complex/example_nearest_landmark_table.cpp
new file mode 100644
index 00000000..b8594212
--- /dev/null
+++ b/example/Witness_complex/example_nearest_landmark_table.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): Siargey Kachanovich
+ *
+ * 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/>.
+ */
+
+#define BOOST_PARAMETER_MAX_ARITY 12
+
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/Witness_complex.h>
+#include <gudhi/Persistent_cohomology.h>
+
+#include <iostream>
+#include <fstream>
+#include <utility>
+#include <string>
+#include <vector>
+
+int main(int argc, char * const argv[]) {
+ using Nearest_landmark_range = std::vector<std::pair<std::size_t, double>>;
+ using Nearest_landmark_table = std::vector<Nearest_landmark_range>;
+ using Witness_complex = Gudhi::witness_complex::Witness_complex<Nearest_landmark_table>;
+ using Simplex_tree = Gudhi::Simplex_tree<>;
+ using Field_Zp = Gudhi::persistent_cohomology::Field_Zp;
+ using Persistent_cohomology = Gudhi::persistent_cohomology::Persistent_cohomology<Simplex_tree, Field_Zp>;
+
+ Simplex_tree simplex_tree;
+ Nearest_landmark_table nlt;
+
+ // Example contains 5 witnesses and 5 landmarks
+ Nearest_landmark_range w0 = {std::make_pair(0, 0), std::make_pair(1, 1), std::make_pair(2, 2),
+ std::make_pair(3, 3), std::make_pair(4, 4)}; nlt.push_back(w0);
+ Nearest_landmark_range w1 = {std::make_pair(1, 0), std::make_pair(2, 1), std::make_pair(3, 2),
+ std::make_pair(4, 3), std::make_pair(0, 4)}; nlt.push_back(w1);
+ Nearest_landmark_range w2 = {std::make_pair(2, 0), std::make_pair(3, 1), std::make_pair(4, 2),
+ std::make_pair(0, 3), std::make_pair(1, 4)}; nlt.push_back(w2);
+ Nearest_landmark_range w3 = {std::make_pair(3, 0), std::make_pair(4, 1), std::make_pair(0, 2),
+ std::make_pair(1, 3), std::make_pair(2, 4)}; nlt.push_back(w3);
+ Nearest_landmark_range w4 = {std::make_pair(4, 0), std::make_pair(0, 1), std::make_pair(1, 2),
+ std::make_pair(2, 3), std::make_pair(3, 4)}; nlt.push_back(w4);
+
+ Witness_complex witness_complex(nlt);
+ witness_complex.create_complex(simplex_tree, 4.1);
+
+ std::cout << "Number of simplices: " << simplex_tree.num_simplices() << std::endl;
+
+ Persistent_cohomology pcoh(simplex_tree);
+ // initializes the coefficient field for homology
+ pcoh.init_coefficients(11);
+
+ pcoh.compute_persistent_cohomology(-0.1);
+ pcoh.output_diagram();
+}
diff --git a/example/Witness_complex/example_strong_witness_complex_off.cpp b/example/Witness_complex/example_strong_witness_complex_off.cpp
new file mode 100644
index 00000000..0ee9ee90
--- /dev/null
+++ b/example/Witness_complex/example_strong_witness_complex_off.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): Siargey Kachanovich
+ *
+ * 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/Simplex_tree.h>
+#include <gudhi/Euclidean_strong_witness_complex.h>
+#include <gudhi/pick_n_random_points.h>
+#include <gudhi/Points_off_io.h>
+
+#include <CGAL/Epick_d.h>
+
+#include <iostream>
+#include <fstream>
+#include <ctime>
+#include <string>
+#include <vector>
+
+using K = CGAL::Epick_d<CGAL::Dynamic_dimension_tag>;
+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[]) {
+ if (argc != 5) {
+ std::cerr << "Usage: " << argv[0]
+ << " path_to_point_file number_of_landmarks max_squared_alpha limit_dimension\n";
+ return 0;
+ }
+
+ std::string file_name = argv[1];
+ int nbL = atoi(argv[2]), lim_dim = atoi(argv[4]);
+ double alpha2 = atof(argv[3]);
+ clock_t start, end;
+ Gudhi::Simplex_tree<> simplex_tree;
+
+ // Read the point file
+ 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); // ----- >>
+ }
+ 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));
+
+ // Compute witness complex
+ start = clock();
+ 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 << "Number of simplices is: " << simplex_tree.num_simplices() << "\n";
+}
diff --git a/example/Witness_complex/example_strong_witness_persistence.cpp b/example/Witness_complex/example_strong_witness_persistence.cpp
new file mode 100644
index 00000000..f786fe7b
--- /dev/null
+++ b/example/Witness_complex/example_strong_witness_persistence.cpp
@@ -0,0 +1,171 @@
+/* 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): Siargey Kachanovich
+ *
+ * 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/Simplex_tree.h>
+#include <gudhi/Euclidean_strong_witness_complex.h>
+#include <gudhi/Persistent_cohomology.h>
+#include <gudhi/Points_off_io.h>
+#include <gudhi/pick_n_random_points.h>
+
+#include <boost/program_options.hpp>
+
+#include <CGAL/Epick_d.h>
+
+#include <string>
+#include <vector>
+#include <limits> // infinity
+
+using K = CGAL::Epick_d<CGAL::Dynamic_dimension_tag>;
+using Point_d = K::Point_d;
+
+using Point_vector = std::vector<Point_d>;
+using Strong_witness_complex = Gudhi::witness_complex::Euclidean_strong_witness_complex<K>;
+using SimplexTree = Gudhi::Simplex_tree<>;
+
+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);
+
+int main(int argc, char * argv[]) {
+ std::string file_name;
+ std::string filediag;
+ Filtration_value max_squared_alpha;
+ int p, nbL, lim_d;
+ Filtration_value min_persistence;
+ SimplexTree simplex_tree;
+
+ program_options(argc, argv, nbL, file_name, filediag, max_squared_alpha, p, lim_d, min_persistence);
+
+ // Extract the points from the file file_name
+ 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); // ----- >>
+ }
+ 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));
+
+ // Compute witness complex
+ Strong_witness_complex strong_witness_complex(landmarks,
+ witnesses);
+
+ strong_witness_complex.create_complex(simplex_tree, max_squared_alpha, lim_d);
+
+ std::cout << "The complex contains " << simplex_tree.num_simplices() << " simplices \n";
+ std::cout << " and has dimension " << simplex_tree.dimension() << " \n";
+
+ // Sort the simplices in the order of the filtration
+ simplex_tree.initialize_filtration();
+
+ // Compute the persistence diagram of the complex
+ Persistent_cohomology pcoh(simplex_tree);
+ // initializes the coefficient field for homology
+ pcoh.init_coefficients(p);
+
+ pcoh.compute_persistent_cohomology(min_persistence);
+
+ // Output the diagram in filediag
+ if (filediag.empty()) {
+ pcoh.output_diagram();
+ } else {
+ std::ofstream out(filediag);
+ pcoh.output_diagram(out);
+ out.close();
+ }
+
+ 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) {
+ 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.");
+
+ 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.");
+
+ 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 Strong witness 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/Witness_complex/example_witness_complex_off.cpp b/example/Witness_complex/example_witness_complex_off.cpp
new file mode 100644
index 00000000..b36dac0d
--- /dev/null
+++ b/example/Witness_complex/example_witness_complex_off.cpp
@@ -0,0 +1,60 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/Euclidean_witness_complex.h>
+#include <gudhi/pick_n_random_points.h>
+#include <gudhi/Points_off_io.h>
+
+#include <CGAL/Epick_d.h>
+
+#include <iostream>
+#include <fstream>
+#include <ctime>
+#include <string>
+#include <vector>
+
+using K = CGAL::Epick_d<CGAL::Dynamic_dimension_tag>;
+using Point_d = K::Point_d;
+using Witness_complex = Gudhi::witness_complex::Euclidean_witness_complex<K>;
+using Point_vector = std::vector< Point_d >;
+
+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";
+ return 0;
+ }
+
+ std::string file_name = argv[1];
+ int nbL = atoi(argv[2]), lim_dim = atoi(argv[4]);
+ double alpha2 = atof(argv[3]);
+ clock_t start, end;
+ Gudhi::Simplex_tree<> simplex_tree;
+
+ // Read the point file
+ Point_vector point_vector, 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); // ----- >>
+ }
+ 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));
+
+ // Compute witness complex
+ start = clock();
+ Witness_complex witness_complex(landmarks,
+ point_vector);
+
+ witness_complex.create_complex(simplex_tree, alpha2, lim_dim);
+ end = clock();
+ std::cout << "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_persistence.cpp b/example/Witness_complex/example_witness_complex_persistence.cpp
new file mode 100644
index 00000000..a1146922
--- /dev/null
+++ b/example/Witness_complex/example_witness_complex_persistence.cpp
@@ -0,0 +1,171 @@
+/* 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): Siargey Kachanovich
+ *
+ * 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/Simplex_tree.h>
+#include <gudhi/Euclidean_witness_complex.h>
+#include <gudhi/Persistent_cohomology.h>
+#include <gudhi/Points_off_io.h>
+#include <gudhi/pick_n_random_points.h>
+
+#include <boost/program_options.hpp>
+
+#include <CGAL/Epick_d.h>
+
+#include <string>
+#include <vector>
+#include <limits> // infinity
+
+using K = CGAL::Epick_d<CGAL::Dynamic_dimension_tag>;
+using Point_d = K::Point_d;
+
+using Point_vector = std::vector<Point_d>;
+using Witness_complex = Gudhi::witness_complex::Euclidean_witness_complex<K>;
+using SimplexTree = Gudhi::Simplex_tree<>;
+
+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);
+
+int main(int argc, char * argv[]) {
+ std::string file_name;
+ std::string filediag;
+ Filtration_value max_squared_alpha;
+ int p, nbL, lim_d;
+ Filtration_value min_persistence;
+ SimplexTree simplex_tree;
+
+ program_options(argc, argv, nbL, file_name, filediag, max_squared_alpha, p, lim_d, min_persistence);
+
+ // Extract the points from the file file_name
+ 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); // ----- >>
+ }
+ 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));
+
+ // Compute witness complex
+ Witness_complex witness_complex(landmarks,
+ witnesses);
+
+ witness_complex.create_complex(simplex_tree, max_squared_alpha, lim_d);
+
+ std::cout << "The complex contains " << simplex_tree.num_simplices() << " simplices \n";
+ std::cout << " and has dimension " << simplex_tree.dimension() << " \n";
+
+ // Sort the simplices in the order of the filtration
+ simplex_tree.initialize_filtration();
+
+ // Compute the persistence diagram of the complex
+ Persistent_cohomology pcoh(simplex_tree);
+ // initializes the coefficient field for homology
+ pcoh.init_coefficients(p);
+
+ pcoh.compute_persistent_cohomology(min_persistence);
+
+ // Output the diagram in filediag
+ if (filediag.empty()) {
+ pcoh.output_diagram();
+ } else {
+ std::ofstream out(filediag);
+ pcoh.output_diagram(out);
+ out.close();
+ }
+
+ 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) {
+ 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.");
+
+ 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.");
+
+ 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 Weak witness 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/Witness_complex/witness_complex_sphere.cpp b/example/Witness_complex/example_witness_complex_sphere.cpp
index b26c9f36..124fd99b 100644
--- a/example/Witness_complex/witness_complex_sphere.cpp
+++ b/example/Witness_complex/example_witness_complex_sphere.cpp
@@ -4,7 +4,7 @@
*
* Author(s): Siargey Kachanovich
*
- * Copyright (C) 2015 INRIA Sophia Antipolis-Méditerranée (France)
+ * 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
@@ -19,17 +19,16 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#define BOOST_PARAMETER_MAX_ARITY 12
-
-#include <sys/types.h>
-#include <sys/stat.h>
+#define BOOST_PARAMETER_MAX_ARITY 12
#include <gudhi/Simplex_tree.h>
-#include <gudhi/Witness_complex.h>
-#include <gudhi/Landmark_choice_by_random_point.h>
+#include <gudhi/Euclidean_witness_complex.h>
+#include <gudhi/pick_n_random_points.h>
#include <gudhi/reader_utils.h>
+#include <CGAL/Epick_d.h>
+
#include <iostream>
#include <fstream>
#include <ctime>
@@ -51,6 +50,9 @@ void write_data(Data_range & data, std::string filename) {
}
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";
@@ -58,27 +60,27 @@ int main(int argc, char * const argv[]) {
}
int number_of_landmarks = atoi(argv[1]);
- clock_t start, end;
-
- // Construct the Simplex Tree
- Gudhi::Simplex_tree<> simplex_tree;
std::vector< std::pair<int, double> > l_time;
- // Read the point file
+ // Generate points
for (int nbP = 500; nbP < 10000; nbP += 500) {
- Point_Vector point_vector;
+ clock_t start, end;
+ // Construct the Simplex Tree
+ Gudhi::Simplex_tree<> simplex_tree;
+ Point_Vector point_vector, landmarks;
generate_points_sphere(point_vector, nbP, 4);
std::cout << "Successfully generated " << point_vector.size() << " points.\n";
std::cout << "Ambient dimension is " << point_vector[0].size() << ".\n";
// Choose landmarks
start = clock();
- std::vector<std::vector< int > > knn;
- Gudhi::witness_complex::landmark_choice_by_random_point(point_vector, number_of_landmarks, knn);
+ Gudhi::subsampling::pick_n_random_points(point_vector, number_of_landmarks, std::back_inserter(landmarks));
// Compute witness complex
- Gudhi::witness_complex::witness_complex(knn, number_of_landmarks, point_vector[0].size(), simplex_tree);
+ 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 "
diff --git a/example/Witness_complex/generators.h b/example/Witness_complex/generators.h
index ac445261..7df43db5 100644
--- a/example/Witness_complex/generators.h
+++ b/example/Witness_complex/generators.h
@@ -25,17 +25,19 @@
#include <CGAL/Epick_d.h>
#include <CGAL/point_generators_d.h>
+#include <CGAL/Random.h>
#include <fstream>
#include <string>
#include <vector>
+#include <cmath>
-typedef CGAL::Epick_d<CGAL::Dynamic_dimension_tag> K;
-typedef K::FT FT;
-typedef K::Point_d Point_d;
-typedef std::vector<Point_d> Point_Vector;
-typedef CGAL::Random_points_in_cube_d<Point_d> Random_cube_iterator;
-typedef CGAL::Random_points_in_ball_d<Point_d> Random_point_iterator;
+using K = CGAL::Epick_d<CGAL::Dynamic_dimension_tag>;
+using FT = K::FT;
+using Point_d = K::Point_d;
+using Point_Vector = std::vector<Point_d>;
+using Random_cube_iterator = CGAL::Random_points_in_cube_d<Point_d>;
+using Random_point_iterator = CGAL::Random_points_in_ball_d<Point_d>;
/**
* \brief Rock age method of reading off file
@@ -144,4 +146,21 @@ void generate_points_sphere(Point_Vector& W, int nbP, int dim) {
W.push_back(*rp++);
}
+/** \brief Generate nbP points on a (flat) d-torus embedded in R^{2d}
+ *
+ */
+void generate_points_torus(Point_Vector& W, int nbP, int dim) {
+ CGAL::Random rand;
+ const double pi = std::acos(-1);
+ for (int i = 0; i < nbP; i++) {
+ std::vector<FT> point;
+ for (int j = 0; j < dim; j++) {
+ double alpha = rand.uniform_real(static_cast<double>(0), 2*pi);
+ point.push_back(sin(alpha));
+ point.push_back(cos(alpha));
+ }
+ W.push_back(Point_d(point));
+ }
+}
+
#endif // EXAMPLE_WITNESS_COMPLEX_GENERATORS_H_
diff --git a/example/Witness_complex/witness_complex_from_file.cpp b/example/Witness_complex/witness_complex_from_file.cpp
deleted file mode 100644
index 53207ad2..00000000
--- a/example/Witness_complex/witness_complex_from_file.cpp
+++ /dev/null
@@ -1,100 +0,0 @@
-/* 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): Siargey Kachanovich
- *
- * Copyright (C) 2015 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 <sys/types.h>
-#include <sys/stat.h>
-
-#include <gudhi/Simplex_tree.h>
-#include <gudhi/Witness_complex.h>
-#include <gudhi/Landmark_choice_by_random_point.h>
-#include <gudhi/reader_utils.h>
-
-#include <iostream>
-#include <fstream>
-#include <ctime>
-#include <string>
-#include <vector>
-
-typedef std::vector< Vertex_handle > typeVectorVertex;
-typedef std::vector< std::vector <double> > Point_Vector;
-
-/**
- * \brief Customized version of read_points
- * which takes into account a possible nbP first line
- *
- */
-inline void
-read_points_cust(std::string file_name, std::vector< std::vector< double > > & points) {
- std::ifstream in_file(file_name.c_str(), std::ios::in);
- if (!in_file.is_open()) {
- std::cerr << "Unable to open file " << file_name << std::endl;
- return;
- }
- std::string line;
- double x;
- while (getline(in_file, line)) {
- std::vector< double > point;
- std::istringstream iss(line);
- while (iss >> x) {
- point.push_back(x);
- }
- if (point.size() != 1)
- points.push_back(point);
- }
- in_file.close();
-}
-
-int main(int argc, char * const argv[]) {
- if (argc != 3) {
- std::cerr << "Usage: " << argv[0]
- << " path_to_point_file nbL \n";
- return 0;
- }
-
- std::string file_name = argv[1];
- int nbL = atoi(argv[2]);
- clock_t start, end;
-
- // Construct the Simplex Tree
- Gudhi::Simplex_tree<> simplex_tree;
-
- // Read the point file
- Point_Vector point_vector;
- read_points_cust(file_name, point_vector);
- std::cout << "Successfully read " << point_vector.size() << " points.\n";
- std::cout << "Ambient dimension is " << point_vector[0].size() << ".\n";
-
- // Choose landmarks
- start = clock();
- std::vector<std::vector< int > > knn;
- Gudhi::witness_complex::landmark_choice_by_random_point(point_vector, nbL, knn);
- end = clock();
- std::cout << "Landmark choice for " << nbL << " landmarks took "
- << static_cast<double>(end - start) / CLOCKS_PER_SEC << " s. \n";
-
- // Compute witness complex
- start = clock();
- Gudhi::witness_complex::witness_complex(knn, nbL, point_vector[0].size(), simplex_tree);
- end = clock();
- std::cout << "Witness complex took "
- << static_cast<double>(end - start) / CLOCKS_PER_SEC << " s. \n";
-}
diff --git a/example/common/CMakeLists.txt b/example/common/CMakeLists.txt
index 0da3dcc0..d5311b18 100644
--- a/example/common/CMakeLists.txt
+++ b/example/common/CMakeLists.txt
@@ -1,17 +1,22 @@
cmake_minimum_required(VERSION 2.6)
project(Common_examples)
-# need CGAL 4.7
+add_executable ( vector_double_off_reader example_vector_double_points_off_reader.cpp )
+target_link_libraries(vector_double_off_reader ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY})
+add_test(NAME Common_example_vector_double_off_reader COMMAND $<TARGET_FILE:vector_double_off_reader>
+ "${CMAKE_SOURCE_DIR}/data/points/SO3_10000.off")
+
if(CGAL_FOUND)
- add_executable ( cgal3Doffreader CGAL_3D_points_off_reader.cpp )
- target_link_libraries(cgal3Doffreader ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY})
- add_test(cgal3Doffreader ${CMAKE_CURRENT_BINARY_DIR}/cgal3Doffreader ${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off)
+ add_executable ( cgal_3D_off_reader example_CGAL_3D_points_off_reader.cpp )
+ target_link_libraries(cgal_3D_off_reader ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY})
+ add_test(NAME Common_example_vector_cgal_3D_off_reader COMMAND $<TARGET_FILE:cgal_3D_off_reader>
+ "${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off")
- if (NOT CGAL_VERSION VERSION_LESS 4.7.0)
- if (EIGEN3_FOUND)
- add_executable ( cgaloffreader CGAL_points_off_reader.cpp )
- target_link_libraries(cgaloffreader ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY})
- add_test(cgaloffreader ${CMAKE_CURRENT_BINARY_DIR}/cgaloffreader ${CMAKE_SOURCE_DIR}/data/points/alphacomplexdoc.off)
- endif(EIGEN3_FOUND)
- endif (NOT CGAL_VERSION VERSION_LESS 4.7.0)
+ # need CGAL 4.7and Eigen3
+ if (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.7.0)
+ add_executable ( cgal_off_reader example_CGAL_points_off_reader.cpp )
+ target_link_libraries(cgal_off_reader ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY})
+ add_test(NAME Common_example_vector_cgal_off_reader COMMAND $<TARGET_FILE:cgal_off_reader>
+ "${CMAKE_SOURCE_DIR}/data/points/alphacomplexdoc.off")
+ endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 4.7.0)
endif()
diff --git a/example/common/CGAL_3D_points_off_reader.cpp b/example/common/example_CGAL_3D_points_off_reader.cpp
index d48bb17d..665b7a29 100644
--- a/example/common/CGAL_3D_points_off_reader.cpp
+++ b/example/common/example_CGAL_3D_points_off_reader.cpp
@@ -32,7 +32,7 @@ int main(int argc, char **argv) {
// Retrieve the triangulation
std::vector<Point_3> point_cloud = off_reader.get_point_cloud();
- int n {0};
+ int n {};
for (auto point : point_cloud) {
++n;
std::cout << "Point[" << n << "] = (" << point[0] << ", " << point[1] << ", " << point[2] << ")\n";
diff --git a/example/common/CGAL_points_off_reader.cpp b/example/common/example_CGAL_points_off_reader.cpp
index d1ca166d..8c6a6b54 100644
--- a/example/common/CGAL_points_off_reader.cpp
+++ b/example/common/example_CGAL_points_off_reader.cpp
@@ -34,10 +34,10 @@ int main(int argc, char **argv) {
// Retrieve the triangulation
std::vector<Point_d> point_cloud = off_reader.get_point_cloud();
- int n {0};
+ int n {};
for (auto point : point_cloud) {
std::cout << "Point[" << n << "] = ";
- for (int i {0}; i < point.dimension(); i++)
+ for (std::size_t i {0}; i < point.size(); i++)
std::cout << point[i] << " ";
std::cout << "\n";
++n;
diff --git a/example/common/example_vector_double_points_off_reader.cpp b/example/common/example_vector_double_points_off_reader.cpp
new file mode 100644
index 00000000..8aecb26e
--- /dev/null
+++ b/example/common/example_vector_double_points_off_reader.cpp
@@ -0,0 +1,41 @@
+#include <gudhi/Points_off_io.h>
+
+#include <iostream>
+#include <string>
+#include <vector>
+
+using Point_d = std::vector<double>;
+
+void usage(char * const progName) {
+ std::cerr << "Usage: " << progName << " inputFile.off" << std::endl;
+ exit(-1);
+}
+
+int main(int argc, char **argv) {
+ if (argc != 2) {
+ std::cerr << "Error: Number of arguments (" << argc << ") is not correct" << std::endl;
+ usage(argv[0]);
+ }
+
+ std::string offInputFile(argv[1]);
+ // Read the OFF file (input file name given as parameter) and triangulate points
+ Gudhi::Points_off_reader<Point_d> off_reader(offInputFile);
+ // Check the read operation was correct
+ if (!off_reader.is_valid()) {
+ std::cerr << "Unable to read file " << offInputFile << std::endl;
+ usage(argv[0]);
+ }
+
+ // Retrieve the triangulation
+ std::vector<Point_d> point_cloud = off_reader.get_point_cloud();
+
+ int n {0};
+ for (auto point : point_cloud) {
+ std::cout << "Point[" << n << "] = ";
+ for (std::size_t i {0}; i < point.size(); i++)
+ std::cout << point[i] << " ";
+ std::cout << "\n";
+ ++n;
+ }
+ return 0;
+}
diff --git a/include/gudhi/Active_witness/Active_witness.h b/include/gudhi/Active_witness/Active_witness.h
new file mode 100644
index 00000000..d41a6811
--- /dev/null
+++ b/include/gudhi/Active_witness/Active_witness.h
@@ -0,0 +1,67 @@
+/* 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): Siargey Kachanovich
+ *
+ * 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 ACTIVE_WITNESS_ACTIVE_WITNESS_H_
+#define ACTIVE_WITNESS_ACTIVE_WITNESS_H_
+
+#include <gudhi/Active_witness/Active_witness_iterator.h>
+#include <list>
+
+namespace Gudhi {
+
+namespace witness_complex {
+
+ /* \class Active_witness
+ * \brief Class representing a list of nearest neighbors to a given witness.
+ * \details Every element is a pair of a landmark identifier and the squared distance to it.
+ */
+template< typename Id_distance_pair,
+ typename INS_range >
+class Active_witness {
+ public:
+ typedef Active_witness<Id_distance_pair, INS_range> ActiveWitness;
+ typedef typename INS_range::iterator INS_iterator;
+ typedef Active_witness_iterator< ActiveWitness, Id_distance_pair, INS_iterator > iterator;
+ typedef typename std::list<Id_distance_pair> Table;
+
+ Table nearest_landmark_table_;
+ INS_range search_range_;
+ INS_iterator iterator_next_;
+ INS_iterator iterator_end_;
+
+ Active_witness(const INS_range& search_range)
+ : search_range_(search_range), iterator_next_(search_range_.begin()), iterator_end_(search_range_.end()) {
+ }
+
+ iterator begin() {
+ return iterator(this, nearest_landmark_table_.begin());
+ }
+
+ iterator end() {
+ return iterator(this);
+ }
+};
+
+} // namespace witness_complex
+} // namespace Gudhi
+
+#endif // ACTIVE_WITNESS_ACTIVE_WITNESS_H_
diff --git a/include/gudhi/Active_witness/Active_witness_iterator.h b/include/gudhi/Active_witness/Active_witness_iterator.h
new file mode 100644
index 00000000..0a05173a
--- /dev/null
+++ b/include/gudhi/Active_witness/Active_witness_iterator.h
@@ -0,0 +1,108 @@
+/* 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): Siargey Kachanovich
+ *
+ * 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 ACTIVE_WITNESS_ACTIVE_WITNESS_ITERATOR_H_
+#define ACTIVE_WITNESS_ACTIVE_WITNESS_ITERATOR_H_
+
+#include <boost/iterator/iterator_facade.hpp>
+#include <list>
+
+namespace Gudhi {
+
+namespace witness_complex {
+
+/* \brief Iterator in the nearest landmark list.
+ * \details After the iterator reaches the end of the list,
+ * the list is augmented by a (nearest landmark, distance) pair if possible.
+ * If all the landmarks are present in the list, iterator returns the specific end value
+ * of the corresponding 'Active_witness' object.
+ */
+template< typename Active_witness,
+ typename Id_distance_pair,
+ typename INS_iterator >
+class Active_witness_iterator
+ : public boost::iterator_facade< Active_witness_iterator <Active_witness, Id_distance_pair, INS_iterator>,
+ Id_distance_pair const,
+ boost::forward_traversal_tag,
+ Id_distance_pair const> {
+ friend class boost::iterator_core_access;
+
+ typedef typename std::list<Id_distance_pair>::iterator Pair_iterator;
+ typedef typename Gudhi::witness_complex::Active_witness_iterator<Active_witness,
+ Id_distance_pair,
+ INS_iterator> Iterator;
+
+ Active_witness *aw_;
+ Pair_iterator lh_; // landmark handle
+ bool is_end_; // true only if the pointer is end and there are no more neighbors to add
+
+ public:
+ Active_witness_iterator(Active_witness* aw)
+ : aw_(aw), lh_(aw_->nearest_landmark_table_.end()), is_end_(true) {
+ }
+
+ Active_witness_iterator(Active_witness* aw, const Pair_iterator& lh)
+ : aw_(aw), lh_(lh) {
+ is_end_ = false;
+ if (lh_ == aw_->nearest_landmark_table_.end()) {
+ if (aw_->iterator_next_ == aw_->iterator_end_) {
+ is_end_ = true;
+ } else {
+ aw_->nearest_landmark_table_.push_back(*aw_->iterator_next_);
+ lh_ = --aw_->nearest_landmark_table_.end();
+ ++(aw_->iterator_next_);
+ }
+ }
+ }
+
+ private :
+ Id_distance_pair& dereference() const {
+ return *lh_;
+ }
+
+ bool equal(const Iterator& other) const {
+ return (is_end_ == other.is_end_) || (lh_ == other.lh_);
+ }
+
+ void increment() {
+ // the neighbor search can't be at the end iterator of a list
+ GUDHI_CHECK(!is_end_ && lh_ != aw_->nearest_landmark_table_.end(),
+ std::logic_error("Wrong active witness increment."));
+ // if the id of the current landmark is the same as the last one
+
+ lh_++;
+ if (lh_ == aw_->nearest_landmark_table_.end()) {
+ if (aw_->iterator_next_ == aw_->iterator_end_) {
+ is_end_ = true;
+ } else {
+ aw_->nearest_landmark_table_.push_back(*aw_->iterator_next_);
+ lh_ = std::prev(aw_->nearest_landmark_table_.end());
+ ++(aw_->iterator_next_);
+ }
+ }
+ }
+};
+
+} // namespace witness_complex
+} // namespace Gudhi
+
+#endif // ACTIVE_WITNESS_ACTIVE_WITNESS_ITERATOR_H_
diff --git a/include/gudhi/Alpha_complex.h b/include/gudhi/Alpha_complex.h
index 2c95ceb4..1ff95c3d 100644
--- a/include/gudhi/Alpha_complex.h
+++ b/include/gudhi/Alpha_complex.h
@@ -4,7 +4,7 @@
*
* Author(s): Vincent Rouvreau
*
- * Copyright (C) 2015 INRIA Saclay (France)
+ * Copyright (C) 2015 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
@@ -23,9 +23,6 @@
#ifndef ALPHA_COMPLEX_H_
#define ALPHA_COMPLEX_H_
-// to construct a simplex_tree from Delaunay_triangulation
-#include <gudhi/graph_simplicial_complex.h>
-#include <gudhi/Simplex_tree.h>
#include <gudhi/Debug_utils.h>
// to construct Alpha_complex from a OFF file of points
#include <gudhi/Points_off_io.h>
@@ -36,6 +33,7 @@
#include <CGAL/Delaunay_triangulation.h>
#include <CGAL/Epick_d.h>
#include <CGAL/Spatial_sort_traits_adapter_d.h>
+#include <CGAL/property_map.h> // for CGAL::Identity_property_map
#include <iostream>
#include <vector>
@@ -57,9 +55,9 @@ namespace alpha_complex {
* \ingroup alpha_complex
*
* \details
- * The data structure can be constructed from a CGAL Delaunay triangulation (for more informations on CGAL Delaunay
- * triangulation, please refer to the corresponding chapter in page http://doc.cgal.org/latest/Triangulation/) or from
- * an OFF file (cf. Points_off_reader).
+ * The data structure is constructing a CGAL Delaunay triangulation (for more informations on CGAL Delaunay
+ * triangulation, please refer to the corresponding chapter in page http://doc.cgal.org/latest/Triangulation/) from a
+ * range of points or from an OFF file (cf. Points_off_reader).
*
* Please refer to \ref alpha_complex for examples.
*
@@ -74,7 +72,7 @@ namespace alpha_complex {
*
*/
template<class Kernel = CGAL::Epick_d<CGAL::Dynamic_dimension_tag>>
-class Alpha_complex : public Simplex_tree<> {
+class Alpha_complex {
public:
// Add an int in TDS to save point index in the structure
typedef CGAL::Triangulation_data_structure<typename Kernel::Dimension,
@@ -90,13 +88,6 @@ class Alpha_complex : public Simplex_tree<> {
typedef Kernel Geom_traits;
private:
- // From Simplex_tree
- // Type required to insert into a simplex_tree (with or without subfaces).
- typedef std::vector<Vertex_handle> Vector_vertex;
-
- // Simplex_result is the type returned from simplex_tree insert function.
- typedef typename std::pair<Simplex_handle, bool> Simplex_result;
-
typedef typename Kernel::Compute_squared_radius_d Squared_Radius;
typedef typename Kernel::Side_of_bounded_sphere_d Is_Gabriel;
typedef typename Kernel::Point_dimension_d Point_Dimension;
@@ -111,7 +102,7 @@ class Alpha_complex : public Simplex_tree<> {
typedef typename Delaunay_triangulation::size_type size_type;
// Map type to switch from simplex tree vertex handle to CGAL vertex iterator.
- typedef typename std::map< Vertex_handle, CGAL_vertex_iterator > Vector_vertex_iterator;
+ typedef typename std::map< std::size_t, CGAL_vertex_iterator > Vector_vertex_iterator;
private:
/** \brief Vertex iterator vector to switch from simplex tree vertex handle to CGAL vertex iterator.
@@ -124,16 +115,15 @@ class Alpha_complex : public Simplex_tree<> {
public:
/** \brief Alpha_complex constructor from an OFF file name.
- * Uses the Delaunay_triangulation_off_reader to construct the Delaunay triangulation required to initialize
+ *
+ * Uses the Points_off_reader to construct the Delaunay triangulation required to initialize
* the Alpha_complex.
*
* Duplicate points are inserted once in the Alpha_complex. This is the reason why the vertices may be not contiguous.
*
* @param[in] off_file_name OFF file [path and] name.
- * @param[in] max_alpha_square maximum for alpha square value. Default value is +\f$\infty\f$.
*/
- Alpha_complex(const std::string& off_file_name,
- Filtration_value max_alpha_square = std::numeric_limits<Filtration_value>::infinity())
+ Alpha_complex(const std::string& off_file_name)
: triangulation_(nullptr) {
Gudhi::Points_off_reader<Point_d> off_reader(off_file_name);
if (!off_reader.is_valid()) {
@@ -141,7 +131,7 @@ class Alpha_complex : public Simplex_tree<> {
exit(-1); // ----- >>
}
- init_from_range(off_reader.get_point_cloud(), max_alpha_square);
+ init_from_range(off_reader.get_point_cloud());
}
/** \brief Alpha_complex constructor from a list of points.
@@ -149,23 +139,17 @@ class Alpha_complex : public Simplex_tree<> {
* Duplicate points are inserted once in the Alpha_complex. This is the reason why the vertices may be not contiguous.
*
* @param[in] points Range of points to triangulate. Points must be in Kernel::Point_d
- * @param[in] max_alpha_square maximum for alpha square value. Default value is +\f$\infty\f$.
*
* The type InputPointRange must be a range for which std::begin and
* std::end return input iterators on a Kernel::Point_d.
- *
- * @post Compare num_simplices with InputPointRange points number (not the same in case of duplicate points).
*/
template<typename InputPointRange >
- Alpha_complex(const InputPointRange& points,
- Filtration_value max_alpha_square = std::numeric_limits<Filtration_value>::infinity())
+ Alpha_complex(const InputPointRange& points)
: triangulation_(nullptr) {
- init_from_range(points, max_alpha_square);
+ init_from_range(points);
}
- /** \brief Alpha_complex destructor.
- *
- * @warning Deletes the Delaunay triangulation.
+ /** \brief Alpha_complex destructor deletes the Delaunay triangulation.
*/
~Alpha_complex() {
delete triangulation_;
@@ -183,15 +167,24 @@ class Alpha_complex : public Simplex_tree<> {
* @return The point found.
* @exception std::out_of_range In case vertex is not found (cf. std::vector::at).
*/
- Point_d get_point(Vertex_handle vertex) const {
+ const Point_d& get_point(std::size_t vertex) const {
return vertex_handle_to_iterator_.at(vertex)->point();
}
+ /** \brief number_of_vertices returns the number of vertices (same as the number of points).
+ *
+ * @return The number of vertices.
+ */
+ const std::size_t number_of_vertices() const {
+ return vertex_handle_to_iterator_.size();
+ }
+
private:
template<typename InputPointRange >
- void init_from_range(const InputPointRange& points, Filtration_value max_alpha_square) {
+ void init_from_range(const InputPointRange& points) {
auto first = std::begin(points);
auto last = std::end(points);
+
if (first != last) {
// point_dimension function initialization
Point_Dimension point_dimension = kernel_.point_dimension_d_object();
@@ -199,90 +192,107 @@ class Alpha_complex : public Simplex_tree<> {
// Delaunay triangulation is point dimension.
triangulation_ = new Delaunay_triangulation(point_dimension(*first));
- std::vector<Point_d> points(first, last);
+ std::vector<Point_d> point_cloud(first, last);
// Creates a vector {0, 1, ..., N-1}
std::vector<std::ptrdiff_t> indices(boost::counting_iterator<std::ptrdiff_t>(0),
- boost::counting_iterator<std::ptrdiff_t>(points.size()));
+ boost::counting_iterator<std::ptrdiff_t>(point_cloud.size()));
+
+ typedef boost::iterator_property_map<typename std::vector<Point_d>::iterator,
+ CGAL::Identity_property_map<std::ptrdiff_t>> Point_property_map;
+ typedef CGAL::Spatial_sort_traits_adapter_d<Kernel, Point_property_map> Search_traits_d;
- // Sort indices considering CGAL spatial sort
- typedef CGAL::Spatial_sort_traits_adapter_d<Kernel, Point_d*> Search_traits_d;
- spatial_sort(indices.begin(), indices.end(), Search_traits_d(&(points[0])));
+ CGAL::spatial_sort(indices.begin(), indices.end(), Search_traits_d(std::begin(point_cloud)));
typename Delaunay_triangulation::Full_cell_handle hint;
for (auto index : indices) {
- typename Delaunay_triangulation::Vertex_handle pos = triangulation_->insert(points[index], hint);
+ typename Delaunay_triangulation::Vertex_handle pos = triangulation_->insert(point_cloud[index], hint);
// Save index value as data to retrieve it after insertion
pos->data() = index;
hint = pos->full_cell();
}
- init(max_alpha_square);
+ // --------------------------------------------------------------------------------------------
+ // double map to retrieve simplex tree vertex handles from CGAL vertex iterator and vice versa
+ // Loop on triangulation vertices list
+ for (CGAL_vertex_iterator vit = triangulation_->vertices_begin(); vit != triangulation_->vertices_end(); ++vit) {
+ if (!triangulation_->is_infinite(*vit)) {
+#ifdef DEBUG_TRACES
+ std::cout << "Vertex insertion - " << vit->data() << " -> " << vit->point() << std::endl;
+#endif // DEBUG_TRACES
+ vertex_handle_to_iterator_.emplace(vit->data(), vit);
+ }
+ }
+ // --------------------------------------------------------------------------------------------
}
}
- /** \brief Initialize the Alpha_complex from the Delaunay triangulation.
+ public:
+ template <typename SimplicialComplexForAlpha>
+ bool create_complex(SimplicialComplexForAlpha& complex) {
+ typedef typename SimplicialComplexForAlpha::Filtration_value Filtration_value;
+ return create_complex(complex, std::numeric_limits<Filtration_value>::infinity());
+ }
+
+ /** \brief Inserts all Delaunay triangulation into the simplicial complex.
+ * It also computes the filtration values accordingly to the \ref createcomplexalgorithm
*
- * @param[in] max_alpha_square maximum for alpha square value.
+ * \tparam SimplicialComplexForAlpha must meet `SimplicialComplexForAlpha` concept.
*
- * @warning Delaunay triangulation must be already constructed with at least one vertex and dimension must be more
- * than 0.
+ * @param[in] complex SimplicialComplexForAlpha to be created.
+ * @param[in] max_alpha_square maximum for alpha square value. Default value is +\f$\infty\f$.
+ *
+ * @return true if creation succeeds, false otherwise.
+ *
+ * @pre Delaunay triangulation must be already constructed with dimension strictly greater than 0.
+ * @pre The simplicial complex must be empty (no vertices)
*
* Initialization can be launched once.
*/
- void init(Filtration_value max_alpha_square) {
+ template <typename SimplicialComplexForAlpha, typename Filtration_value>
+ bool create_complex(SimplicialComplexForAlpha& complex, Filtration_value max_alpha_square) {
+ // From SimplicialComplexForAlpha type required to insert into a simplicial complex (with or without subfaces).
+ typedef typename SimplicialComplexForAlpha::Vertex_handle Vertex_handle;
+ typedef typename SimplicialComplexForAlpha::Simplex_handle Simplex_handle;
+ typedef std::vector<Vertex_handle> Vector_vertex;
+
if (triangulation_ == nullptr) {
- std::cerr << "Alpha_complex init - Cannot init from a NULL triangulation\n";
- return; // ----- >>
- }
- if (triangulation_->number_of_vertices() < 1) {
- std::cerr << "Alpha_complex init - Cannot init from a triangulation without vertices\n";
- return; // ----- >>
+ std::cerr << "Alpha_complex cannot create_complex from a NULL triangulation\n";
+ return false; // ----- >>
}
if (triangulation_->maximal_dimension() < 1) {
- std::cerr << "Alpha_complex init - Cannot init from a zero-dimension triangulation\n";
- return; // ----- >>
+ std::cerr << "Alpha_complex cannot create_complex from a zero-dimension triangulation\n";
+ return false; // ----- >>
}
- if (num_vertices() > 0) {
- std::cerr << "Alpha_complex init - Cannot init twice\n";
- return; // ----- >>
+ if (complex.num_vertices() > 0) {
+ std::cerr << "Alpha_complex create_complex - complex is not empty\n";
+ return false; // ----- >>
}
- set_dimension(triangulation_->maximal_dimension());
-
- // --------------------------------------------------------------------------------------------
- // double map to retrieve simplex tree vertex handles from CGAL vertex iterator and vice versa
- // Loop on triangulation vertices list
- for (CGAL_vertex_iterator vit = triangulation_->vertices_begin(); vit != triangulation_->vertices_end(); ++vit) {
- if (!triangulation_->is_infinite(*vit)) {
-#ifdef DEBUG_TRACES
- std::cout << "Vertex insertion - " << vit->data() << " -> " << vit->point() << std::endl;
-#endif // DEBUG_TRACES
- vertex_handle_to_iterator_.emplace(vit->data(), vit);
- }
- }
- // --------------------------------------------------------------------------------------------
+ complex.set_dimension(triangulation_->maximal_dimension());
// --------------------------------------------------------------------------------------------
// Simplex_tree construction from loop on triangulation finite full cells list
- for (auto cit = triangulation_->finite_full_cells_begin(); cit != triangulation_->finite_full_cells_end(); ++cit) {
- Vector_vertex vertexVector;
+ if (triangulation_->number_of_vertices() > 0) {
+ for (auto cit = triangulation_->finite_full_cells_begin(); cit != triangulation_->finite_full_cells_end(); ++cit) {
+ Vector_vertex vertexVector;
#ifdef DEBUG_TRACES
- std::cout << "Simplex_tree insertion ";
+ std::cout << "Simplex_tree insertion ";
#endif // DEBUG_TRACES
- for (auto vit = cit->vertices_begin(); vit != cit->vertices_end(); ++vit) {
- if (*vit != nullptr) {
+ for (auto vit = cit->vertices_begin(); vit != cit->vertices_end(); ++vit) {
+ if (*vit != nullptr) {
#ifdef DEBUG_TRACES
- std::cout << " " << (*vit)->data();
+ std::cout << " " << (*vit)->data();
#endif // DEBUG_TRACES
- // Vector of vertex construction for simplex_tree structure
- vertexVector.push_back((*vit)->data());
+ // Vector of vertex construction for simplex_tree structure
+ vertexVector.push_back((*vit)->data());
+ }
}
- }
#ifdef DEBUG_TRACES
- std::cout << std::endl;
+ std::cout << std::endl;
#endif // DEBUG_TRACES
- // Insert each simplex and its subfaces in the simplex tree - filtration is NaN
- insert_simplex_and_subfaces(vertexVector, std::numeric_limits<double>::quiet_NaN());
+ // Insert each simplex and its subfaces in the simplex tree - filtration is NaN
+ complex.insert_simplex_and_subfaces(vertexVector, std::numeric_limits<double>::quiet_NaN());
+ }
}
// --------------------------------------------------------------------------------------------
@@ -290,16 +300,16 @@ class Alpha_complex : public Simplex_tree<> {
// Will be re-used many times
Vector_of_CGAL_points pointVector;
// ### For i : d -> 0
- for (int decr_dim = dimension(); decr_dim >= 0; decr_dim--) {
+ for (int decr_dim = triangulation_->maximal_dimension(); decr_dim >= 0; decr_dim--) {
// ### Foreach Sigma of dim i
- for (auto f_simplex : skeleton_simplex_range(decr_dim)) {
- int f_simplex_dim = dimension(f_simplex);
+ for (Simplex_handle f_simplex : complex.skeleton_simplex_range(decr_dim)) {
+ int f_simplex_dim = complex.dimension(f_simplex);
if (decr_dim == f_simplex_dim) {
pointVector.clear();
#ifdef DEBUG_TRACES
std::cout << "Sigma of dim " << decr_dim << " is";
#endif // DEBUG_TRACES
- for (auto vertex : simplex_vertex_range(f_simplex)) {
+ for (auto vertex : complex.simplex_vertex_range(f_simplex)) {
pointVector.push_back(get_point(vertex));
#ifdef DEBUG_TRACES
std::cout << " " << vertex;
@@ -309,7 +319,7 @@ class Alpha_complex : public Simplex_tree<> {
std::cout << std::endl;
#endif // DEBUG_TRACES
// ### If filt(Sigma) is NaN : filt(Sigma) = alpha(Sigma)
- if (std::isnan(filtration(f_simplex))) {
+ if (std::isnan(complex.filtration(f_simplex))) {
Filtration_value alpha_complex_filtration = 0.0;
// No need to compute squared_radius on a single point - alpha is 0.0
if (f_simplex_dim > 0) {
@@ -318,12 +328,12 @@ class Alpha_complex : public Simplex_tree<> {
alpha_complex_filtration = squared_radius(pointVector.begin(), pointVector.end());
}
- assign_filtration(f_simplex, alpha_complex_filtration);
+ complex.assign_filtration(f_simplex, alpha_complex_filtration);
#ifdef DEBUG_TRACES
- std::cout << "filt(Sigma) is NaN : filt(Sigma) =" << filtration(f_simplex) << std::endl;
+ std::cout << "filt(Sigma) is NaN : filt(Sigma) =" << complex.filtration(f_simplex) << std::endl;
#endif // DEBUG_TRACES
}
- propagate_alpha_filtration(f_simplex, decr_dim);
+ propagate_alpha_filtration(complex, f_simplex, decr_dim);
}
}
}
@@ -331,36 +341,41 @@ class Alpha_complex : public Simplex_tree<> {
// --------------------------------------------------------------------------------------------
// As Alpha value is an approximation, we have to make filtration non decreasing while increasing the dimension
- bool modified_filt = make_filtration_non_decreasing();
+ complex.make_filtration_non_decreasing();
// Remove all simplices that have a filtration value greater than max_alpha_square
- // Remark: prune_above_filtration does not require initialize_filtration to be done before.
- modified_filt |= prune_above_filtration(max_alpha_square);
- if (modified_filt) {
- initialize_filtration();
- }
+ complex.prune_above_filtration(max_alpha_square);
// --------------------------------------------------------------------------------------------
+ return true;
}
- template<typename Simplex_handle>
- void propagate_alpha_filtration(Simplex_handle f_simplex, int decr_dim) {
+ private:
+ template <typename SimplicialComplexForAlpha, typename Simplex_handle>
+ void propagate_alpha_filtration(SimplicialComplexForAlpha& complex, Simplex_handle f_simplex, int decr_dim) {
+ // From SimplicialComplexForAlpha type required to assign filtration values.
+ typedef typename SimplicialComplexForAlpha::Filtration_value Filtration_value;
+#ifdef DEBUG_TRACES
+ typedef typename SimplicialComplexForAlpha::Vertex_handle Vertex_handle;
+#endif // DEBUG_TRACES
+
// ### Foreach Tau face of Sigma
- for (auto f_boundary : boundary_simplex_range(f_simplex)) {
+ for (auto f_boundary : complex.boundary_simplex_range(f_simplex)) {
#ifdef DEBUG_TRACES
std::cout << " | --------------------------------------------------\n";
std::cout << " | Tau ";
- for (auto vertex : simplex_vertex_range(f_boundary)) {
+ for (auto vertex : complex.simplex_vertex_range(f_boundary)) {
std::cout << vertex << " ";
}
std::cout << "is a face of Sigma\n";
- std::cout << " | isnan(filtration(Tau)=" << std::isnan(filtration(f_boundary)) << std::endl;
+ std::cout << " | isnan(complex.filtration(Tau)=" << std::isnan(complex.filtration(f_boundary)) << std::endl;
#endif // DEBUG_TRACES
// ### If filt(Tau) is not NaN
- if (!std::isnan(filtration(f_boundary))) {
+ if (!std::isnan(complex.filtration(f_boundary))) {
// ### filt(Tau) = fmin(filt(Tau), filt(Sigma))
- Filtration_value alpha_complex_filtration = fmin(filtration(f_boundary), filtration(f_simplex));
- assign_filtration(f_boundary, alpha_complex_filtration);
+ Filtration_value alpha_complex_filtration = fmin(complex.filtration(f_boundary),
+ complex.filtration(f_simplex));
+ complex.assign_filtration(f_boundary, alpha_complex_filtration);
#ifdef DEBUG_TRACES
- std::cout << " | filt(Tau) = fmin(filt(Tau), filt(Sigma)) = " << filtration(f_boundary) << std::endl;
+ std::cout << " | filt(Tau) = fmin(filt(Tau), filt(Sigma)) = " << complex.filtration(f_boundary) << std::endl;
#endif // DEBUG_TRACES
// ### Else
} else {
@@ -372,12 +387,12 @@ class Alpha_complex : public Simplex_tree<> {
#ifdef DEBUG_TRACES
Vertex_handle vertexForGabriel = Vertex_handle();
#endif // DEBUG_TRACES
- for (auto vertex : simplex_vertex_range(f_boundary)) {
+ for (auto vertex : complex.simplex_vertex_range(f_boundary)) {
pointVector.push_back(get_point(vertex));
}
// Retrieve the Sigma point that is not part of Tau - parameter for is_gabriel function
Point_d point_for_gabriel;
- for (auto vertex : simplex_vertex_range(f_simplex)) {
+ for (auto vertex : complex.simplex_vertex_range(f_simplex)) {
point_for_gabriel = get_point(vertex);
if (std::find(pointVector.begin(), pointVector.end(), point_for_gabriel) == pointVector.end()) {
#ifdef DEBUG_TRACES
@@ -398,10 +413,10 @@ class Alpha_complex : public Simplex_tree<> {
// ### If Tau is not Gabriel of Sigma
if (false == is_gab) {
// ### filt(Tau) = filt(Sigma)
- Filtration_value alpha_complex_filtration = filtration(f_simplex);
- assign_filtration(f_boundary, alpha_complex_filtration);
+ Filtration_value alpha_complex_filtration = complex.filtration(f_simplex);
+ complex.assign_filtration(f_boundary, alpha_complex_filtration);
#ifdef DEBUG_TRACES
- std::cout << " | filt(Tau) = filt(Sigma) = " << filtration(f_boundary) << std::endl;
+ std::cout << " | filt(Tau) = filt(Sigma) = " << complex.filtration(f_boundary) << std::endl;
#endif // DEBUG_TRACES
}
}
diff --git a/include/gudhi/Alpha_complex.h~ b/include/gudhi/Alpha_complex.h~
deleted file mode 100644
index a1900cb9..00000000
--- a/include/gudhi/Alpha_complex.h~
+++ /dev/null
@@ -1,417 +0,0 @@
-/* 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) 2015 INRIA 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 ALPHA_COMPLEX_H_
-#define ALPHA_COMPLEX_H_
-
-// to construct a simplex_tree from Delaunay_triangulation
-#include <gudhi/graph_simplicial_complex.h>
-#include <gudhi/Simplex_tree.h>
-#include <gudhi/Debug_utils.h>
-// to construct Alpha_complex from a OFF file of points
-#include <gudhi/Points_off_io.h>
-
-#include <stdlib.h>
-#include <math.h> // isnan, fmax
-
-#include <CGAL/Delaunay_triangulation.h>
-#include <CGAL/Epick_d.h>
-#include <CGAL/Spatial_sort_traits_adapter_d.h>
-
-#include <iostream>
-#include <vector>
-#include <string>
-#include <limits> // NaN
-#include <map>
-#include <utility> // std::pair
-#include <stdexcept>
-#include <numeric> // for std::iota
-
-namespace Gudhi {
-
-namespace alphacomplex {
-
-/**
- * \class Alpha_complex Alpha_complex.h gudhi/Alpha_complex.h
- * \brief Alpha complex data structure.
- *
- * \ingroup alpha_complex
- *
- * \details
- * The data structure can be constructed from a CGAL Delaunay triangulation (for more informations on CGAL Delaunay
- * triangulation, please refer to the corresponding chapter in page http://doc.cgal.org/latest/Triangulation/) or from
- * an OFF file (cf. Points_off_reader).
- *
- * Please refer to \ref alpha_complex for examples.
- *
- * The complex is a template class requiring an Epick_d <a target="_blank"
- * href="http://doc.cgal.org/latest/Kernel_d/index.html#Chapter_dD_Geometry_Kernel">dD Geometry Kernel</a>
- * \cite cgal:s-gkd-15b from CGAL as template, default value is <a target="_blank"
- * href="http://doc.cgal.org/latest/Kernel_d/classCGAL_1_1Epick__d.html">CGAL::Epick_d</a>
- * < <a target="_blank" href="http://doc.cgal.org/latest/Kernel_23/classCGAL_1_1Dynamic__dimension__tag.html">
- * CGAL::Dynamic_dimension_tag </a> >
- *
- * \remark When Alpha_complex is constructed with an infinite value of alpha, the complex is a Delaunay complex.
- *
- */
-template<class Kernel = CGAL::Epick_d<CGAL::Dynamic_dimension_tag>>
-class Alpha_complex : public Simplex_tree<> {
- public:
- // Add an int in TDS to save point index in the structure
- typedef CGAL::Triangulation_data_structure<typename Kernel::Dimension,
- CGAL::Triangulation_vertex<Kernel, std::ptrdiff_t>,
- CGAL::Triangulation_full_cell<Kernel> > TDS;
- /** \brief A Delaunay triangulation of a set of points in \f$ \mathbb{R}^D\f$.*/
- typedef CGAL::Delaunay_triangulation<Kernel, TDS> Delaunay_triangulation;
-
- /** \brief A point in Euclidean space.*/
- typedef typename Kernel::Point_d Point_d;
- /** \brief Geometric traits class that provides the geometric types and predicates needed by Delaunay
- * triangulations.*/
- typedef Kernel Geom_traits;
-
- private:
- // From Simplex_tree
- // Type required to insert into a simplex_tree (with or without subfaces).
- typedef std::vector<Vertex_handle> Vector_vertex;
-
- // Simplex_result is the type returned from simplex_tree insert function.
- typedef typename std::pair<Simplex_handle, bool> Simplex_result;
-
- typedef typename Kernel::Compute_squared_radius_d Squared_Radius;
- typedef typename Kernel::Side_of_bounded_sphere_d Is_Gabriel;
- typedef typename Kernel::Point_dimension_d Point_Dimension;
-
- // Type required to compute squared radius, or side of bounded sphere on a vector of points.
- typedef typename std::vector<Point_d> Vector_of_CGAL_points;
-
- // Vertex_iterator type from CGAL.
- typedef typename Delaunay_triangulation::Vertex_iterator CGAL_vertex_iterator;
-
- // size_type type from CGAL.
- typedef typename Delaunay_triangulation::size_type size_type;
-
- // Map type to switch from simplex tree vertex handle to CGAL vertex iterator.
- typedef typename std::map< Vertex_handle, CGAL_vertex_iterator > Vector_vertex_iterator;
-
- private:
- /** \brief Vertex iterator vector to switch from simplex tree vertex handle to CGAL vertex iterator.
- * Vertex handles are inserted sequentially, starting at 0.*/
- Vector_vertex_iterator vertex_handle_to_iterator_;
- /** \brief Pointer on the CGAL Delaunay triangulation.*/
- Delaunay_triangulation* triangulation_;
- /** \brief Kernel for triangulation_ functions access.*/
- Kernel kernel_;
-
- public:
- /** \brief Alpha_complex constructor from an OFF file name.
- * Uses the Delaunay_triangulation_off_reader to construct the Delaunay triangulation required to initialize
- * the Alpha_complex.
- *
- * Duplicate points are inserted once in the Alpha_complex. This is the reason why the vertices may be not contiguous.
- *
- * @param[in] off_file_name OFF file [path and] name.
- * @param[in] max_alpha_square maximum for alpha square value. Default value is +\f$\infty\f$.
- */
- Alpha_complex(const std::string& off_file_name,
- Filtration_value max_alpha_square = std::numeric_limits<Filtration_value>::infinity())
- : triangulation_(nullptr) {
- Gudhi::Points_off_reader<Point_d> off_reader(off_file_name);
- if (!off_reader.is_valid()) {
- std::cerr << "Alpha_complex - Unable to read file " << off_file_name << "\n";
- exit(-1); // ----- >>
- }
-
- init_from_range(off_reader.get_point_cloud(), max_alpha_square);
- }
-
- /** \brief Alpha_complex constructor from a list of points.
- *
- * Duplicate points are inserted once in the Alpha_complex. This is the reason why the vertices may be not contiguous.
- *
- * @param[in] points Range of points to triangulate. Points must be in Kernel::Point_d
- * @param[in] max_alpha_square maximum for alpha square value. Default value is +\f$\infty\f$.
- *
- * The type InputPointRange must be a range for which std::begin and
- * std::end return input iterators on a Kernel::Point_d.
- *
- * @post Compare num_simplices with InputPointRange points number (not the same in case of duplicate points).
- */
- template<typename InputPointRange >
- Alpha_complex(const InputPointRange& points,
- Filtration_value max_alpha_square = std::numeric_limits<Filtration_value>::infinity())
- : triangulation_(nullptr) {
- init_from_range(points, max_alpha_square);
- }
-
- /** \brief Alpha_complex destructor.
- *
- * @warning Deletes the Delaunay triangulation.
- */
- ~Alpha_complex() {
- delete triangulation_;
- }
-
- // Forbid copy/move constructor/assignment operator
- Alpha_complex(const Alpha_complex& other) = delete;
- Alpha_complex& operator= (const Alpha_complex& other) = delete;
- Alpha_complex (Alpha_complex&& other) = delete;
- Alpha_complex& operator= (Alpha_complex&& other) = delete;
-
- /** \brief get_point returns the point corresponding to the vertex given as parameter.
- *
- * @param[in] vertex Vertex handle of the point to retrieve.
- * @return The point found.
- * @exception std::out_of_range In case vertex is not found (cf. std::vector::at).
- */
- Point_d get_point(Vertex_handle vertex) const {
- return vertex_handle_to_iterator_.at(vertex)->point();
- }
-
- private:
- template<typename InputPointRange >
- void init_from_range(const InputPointRange& points, Filtration_value max_alpha_square) {
- auto first = std::begin(points);
- auto last = std::end(points);
- if (first != last) {
- // point_dimension function initialization
- Point_Dimension point_dimension = kernel_.point_dimension_d_object();
-
- // Delaunay triangulation is point dimension.
- triangulation_ = new Delaunay_triangulation(point_dimension(*first));
-
- std::vector<Point_d> points(first, last);
-
- // Creates a vector {0, 1, ..., N-1}
- std::vector<std::ptrdiff_t> indices(boost::counting_iterator<std::ptrdiff_t>(0),
- boost::counting_iterator<std::ptrdiff_t>(points.size()));
-
- // Sort indices considering CGAL spatial sort
- typedef CGAL::Spatial_sort_traits_adapter_d<Kernel, Point_d*> Search_traits_d;
- spatial_sort(indices.begin(), indices.end(), Search_traits_d(&(points[0])));
-
- typename Delaunay_triangulation::Full_cell_handle hint;
- for (auto index : indices) {
- typename Delaunay_triangulation::Vertex_handle pos = triangulation_->insert(points[index], hint);
- // Save index value as data to retrieve it after insertion
- pos->data() = index;
- hint = pos->full_cell();
- }
- init(max_alpha_square);
- }
- }
-
- /** \brief Initialize the Alpha_complex from the Delaunay triangulation.
- *
- * @param[in] max_alpha_square maximum for alpha square value.
- *
- * @warning Delaunay triangulation must be already constructed with at least one vertex and dimension must be more
- * than 0.
- *
- * Initialization can be launched once.
- */
- void init(Filtration_value max_alpha_square) {
- if (triangulation_ == nullptr) {
- std::cerr << "Alpha_complex init - Cannot init from a NULL triangulation\n";
- return; // ----- >>
- }
- if (triangulation_->number_of_vertices() < 1) {
- std::cerr << "Alpha_complex init - Cannot init from a triangulation without vertices\n";
- return; // ----- >>
- }
- if (triangulation_->maximal_dimension() < 1) {
- std::cerr << "Alpha_complex init - Cannot init from a zero-dimension triangulation\n";
- return; // ----- >>
- }
- if (num_vertices() > 0) {
- std::cerr << "Alpha_complex init - Cannot init twice\n";
- return; // ----- >>
- }
-
- set_dimension(triangulation_->maximal_dimension());
-
- // --------------------------------------------------------------------------------------------
- // double map to retrieve simplex tree vertex handles from CGAL vertex iterator and vice versa
- // Loop on triangulation vertices list
- for (CGAL_vertex_iterator vit = triangulation_->vertices_begin(); vit != triangulation_->vertices_end(); ++vit) {
- if (!triangulation_->is_infinite(*vit)) {
-#ifdef DEBUG_TRACES
- std::cout << "Vertex insertion - " << vit->data() << " -> " << vit->point() << std::endl;
-#endif // DEBUG_TRACES
- vertex_handle_to_iterator_.emplace(vit->data(), vit);
- }
- }
- // --------------------------------------------------------------------------------------------
-
- // --------------------------------------------------------------------------------------------
- // Simplex_tree construction from loop on triangulation finite full cells list
- for (auto cit = triangulation_->finite_full_cells_begin(); cit != triangulation_->finite_full_cells_end(); ++cit) {
- Vector_vertex vertexVector;
-#ifdef DEBUG_TRACES
- std::cout << "Simplex_tree insertion ";
-#endif // DEBUG_TRACES
- for (auto vit = cit->vertices_begin(); vit != cit->vertices_end(); ++vit) {
- if (*vit != nullptr) {
-#ifdef DEBUG_TRACES
- std::cout << " " << (*vit)->data();
-#endif // DEBUG_TRACES
- // Vector of vertex construction for simplex_tree structure
- vertexVector.push_back((*vit)->data());
- }
- }
-#ifdef DEBUG_TRACES
- std::cout << std::endl;
-#endif // DEBUG_TRACES
- // Insert each simplex and its subfaces in the simplex tree - filtration is NaN
- insert_simplex_and_subfaces(vertexVector, std::numeric_limits<double>::quiet_NaN());
- }
- // --------------------------------------------------------------------------------------------
-
- // --------------------------------------------------------------------------------------------
- // Will be re-used many times
- Vector_of_CGAL_points pointVector;
- // ### For i : d -> 0
- for (int decr_dim = dimension(); decr_dim >= 0; decr_dim--) {
- // ### Foreach Sigma of dim i
- for (auto f_simplex : skeleton_simplex_range(decr_dim)) {
- int f_simplex_dim = dimension(f_simplex);
- if (decr_dim == f_simplex_dim) {
- pointVector.clear();
-#ifdef DEBUG_TRACES
- std::cout << "Sigma of dim " << decr_dim << " is";
-#endif // DEBUG_TRACES
- for (auto vertex : simplex_vertex_range(f_simplex)) {
- pointVector.push_back(get_point(vertex));
-#ifdef DEBUG_TRACES
- std::cout << " " << vertex;
-#endif // DEBUG_TRACES
- }
-#ifdef DEBUG_TRACES
- std::cout << std::endl;
-#endif // DEBUG_TRACES
- // ### If filt(Sigma) is NaN : filt(Sigma) = alpha(Sigma)
- if (isnan(filtration(f_simplex))) {
- Filtration_value alpha_complex_filtration = 0.0;
- // No need to compute squared_radius on a single point - alpha is 0.0
- if (f_simplex_dim > 0) {
- // squared_radius function initialization
- Squared_Radius squared_radius = kernel_.compute_squared_radius_d_object();
-
- alpha_complex_filtration = squared_radius(pointVector.begin(), pointVector.end());
- }
- assign_filtration(f_simplex, alpha_complex_filtration);
-#ifdef DEBUG_TRACES
- std::cout << "filt(Sigma) is NaN : filt(Sigma) =" << filtration(f_simplex) << std::endl;
-#endif // DEBUG_TRACES
- }
- propagate_alpha_filtration(f_simplex, decr_dim);
- }
- }
- }
- // --------------------------------------------------------------------------------------------
-
- // --------------------------------------------------------------------------------------------
- // As Alpha value is an approximation, we have to make filtration non decreasing while increasing the dimension
- bool modified_filt = make_filtration_non_decreasing();
- // Remove all simplices that have a filtration value greater than max_alpha_square
- // Remark: prune_above_filtration does not require initialize_filtration to be done before.
- modified_filt |= prune_above_filtration(max_alpha_square);
- if (modified_filt) {
- initialize_filtration();
- }
- // --------------------------------------------------------------------------------------------
- }
-
- template<typename Simplex_handle>
- void propagate_alpha_filtration(Simplex_handle f_simplex, int decr_dim) {
- // ### Foreach Tau face of Sigma
- for (auto f_boundary : boundary_simplex_range(f_simplex)) {
-#ifdef DEBUG_TRACES
- std::cout << " | --------------------------------------------------\n";
- std::cout << " | Tau ";
- for (auto vertex : simplex_vertex_range(f_boundary)) {
- std::cout << vertex << " ";
- }
- std::cout << "is a face of Sigma\n";
- std::cout << " | isnan(filtration(Tau)=" << isnan(filtration(f_boundary)) << std::endl;
-#endif // DEBUG_TRACES
- // ### If filt(Tau) is not NaN
- if (!isnan(filtration(f_boundary))) {
- // ### filt(Tau) = fmin(filt(Tau), filt(Sigma))
- Filtration_value alpha_complex_filtration = fmin(filtration(f_boundary), filtration(f_simplex));
- assign_filtration(f_boundary, alpha_complex_filtration);
-#ifdef DEBUG_TRACES
- std::cout << " | filt(Tau) = fmin(filt(Tau), filt(Sigma)) = " << filtration(f_boundary) << std::endl;
-#endif // DEBUG_TRACES
- // ### Else
- } else {
- // No need to compute is_gabriel for dimension <= 2
- // i.e. : Sigma = (3,1) => Tau = 1
- if (decr_dim > 1) {
- // insert the Tau points in a vector for is_gabriel function
- Vector_of_CGAL_points pointVector;
-#ifdef DEBUG_TRACES
- Vertex_handle vertexForGabriel = Vertex_handle();
-#endif // DEBUG_TRACES
- for (auto vertex : simplex_vertex_range(f_boundary)) {
- pointVector.push_back(get_point(vertex));
- }
- // Retrieve the Sigma point that is not part of Tau - parameter for is_gabriel function
- Point_d point_for_gabriel;
- for (auto vertex : simplex_vertex_range(f_simplex)) {
- point_for_gabriel = get_point(vertex);
- if (std::find(pointVector.begin(), pointVector.end(), point_for_gabriel) == pointVector.end()) {
-#ifdef DEBUG_TRACES
- // vertex is not found in Tau
- vertexForGabriel = vertex;
-#endif // DEBUG_TRACES
- // No need to continue loop
- break;
- }
- }
- // is_gabriel function initialization
- Is_Gabriel is_gabriel = kernel_.side_of_bounded_sphere_d_object();
- bool is_gab = is_gabriel(pointVector.begin(), pointVector.end(), point_for_gabriel)
- != CGAL::ON_BOUNDED_SIDE;
-#ifdef DEBUG_TRACES
- std::cout << " | Tau is_gabriel(Sigma)=" << is_gab << " - vertexForGabriel=" << vertexForGabriel << std::endl;
-#endif // DEBUG_TRACES
- // ### If Tau is not Gabriel of Sigma
- if (false == is_gab) {
- // ### filt(Tau) = filt(Sigma)
- Filtration_value alpha_complex_filtration = filtration(f_simplex);
- assign_filtration(f_boundary, alpha_complex_filtration);
-#ifdef DEBUG_TRACES
- std::cout << " | filt(Tau) = filt(Sigma) = " << filtration(f_boundary) << std::endl;
-#endif // DEBUG_TRACES
- }
- }
- }
- }
- }
-};
-
-} // namespace alphacomplex
-
-} // namespace Gudhi
-
-#endif // ALPHA_COMPLEX_H_
diff --git a/include/gudhi/Bottleneck.h b/include/gudhi/Bottleneck.h
new file mode 100644
index 00000000..b90a0ee0
--- /dev/null
+++ b/include/gudhi/Bottleneck.h
@@ -0,0 +1,115 @@
+/* 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: Francois Godi
+ *
+ * Copyright (C) 2015 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 BOTTLENECK_H_
+#define BOTTLENECK_H_
+
+#include <gudhi/Graph_matching.h>
+
+#include <vector>
+#include <algorithm> // for max
+#include <limits> // for numeric_limits
+
+#include <cmath>
+
+namespace Gudhi {
+
+namespace persistence_diagram {
+
+double bottleneck_distance_approx(Persistence_graph& g, double e) {
+ double b_lower_bound = 0.;
+ double b_upper_bound = g.diameter_bound();
+ const double alpha = std::pow(g.size(), 1. / 5.);
+ Graph_matching m(g);
+ Graph_matching biggest_unperfect(g);
+ while (b_upper_bound - b_lower_bound > 2 * e) {
+ double step = b_lower_bound + (b_upper_bound - b_lower_bound) / alpha;
+ 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)
+ if (m.perfect()) {
+ m = biggest_unperfect;
+ b_upper_bound = step;
+ } else {
+ biggest_unperfect = m;
+ b_lower_bound = step;
+ }
+ }
+ return (b_lower_bound + b_upper_bound) / 2.;
+}
+
+double bottleneck_distance_exact(Persistence_graph& g) {
+ std::vector<double> sd = g.sorted_distances();
+ long lower_bound_i = 0;
+ long upper_bound_i = sd.size() - 1;
+ const double alpha = std::pow(g.size(), 1. / 5.);
+ Graph_matching m(g);
+ Graph_matching biggest_unperfect(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)
+ if (m.perfect()) {
+ m = biggest_unperfect;
+ upper_bound_i = step;
+ } else {
+ biggest_unperfect = m;
+ lower_bound_i = step + 1;
+ }
+ }
+ return sd.at(lower_bound_i);
+}
+
+/** \brief Function to compute the Bottleneck distance between two persistence diagrams.
+ *
+ * \tparam Persistence_diagram1,Persistence_diagram2
+ * models of the concept `PersistenceDiagram`.
+ * \param[in] e
+ * \parblock
+ * If `e` is 0, this uses an expensive algorithm to compute the exact distance.
+ *
+ * If `e` is not 0, it asks for an additive `e`-approximation, and currently
+ * also allows a small multiplicative error (the last 2 or 3 bits of the
+ * mantissa may be wrong). This version of the algorithm takes advantage of the
+ * limited precision of `double` and is usually a lot faster to compute,
+ * whatever the value of `e`.
+ *
+ * Thus, by default, `e` is the smallest positive double.
+ * \endparblock
+ *
+ * \ingroup bottleneck_distance
+ */
+template<typename Persistence_diagram1, typename Persistence_diagram2>
+double bottleneck_distance(const Persistence_diagram1 &diag1, const Persistence_diagram2 &diag2,
+ double e = std::numeric_limits<double>::min()) {
+ Persistence_graph g(diag1, diag2, e);
+ if (g.bottleneck_alive() == std::numeric_limits<double>::infinity())
+ return std::numeric_limits<double>::infinity();
+ return std::max(g.bottleneck_alive(), e == 0. ? bottleneck_distance_exact(g) : bottleneck_distance_approx(g, e));
+}
+
+} // namespace persistence_diagram
+
+} // namespace Gudhi
+
+#endif // BOTTLENECK_H_
diff --git a/include/gudhi/Clock.h b/include/gudhi/Clock.h
index 04c6ffb9..77f196ca 100644
--- a/include/gudhi/Clock.h
+++ b/include/gudhi/Clock.h
@@ -27,47 +27,55 @@
#include <string>
+namespace Gudhi {
+
class Clock {
public:
- Clock() : end_called(false) {
- startTime = boost::posix_time::microsec_clock::local_time();
- }
-
- Clock(const std::string& msg_) {
- end_called = false;
- begin();
- msg = msg_;
- }
+ // Construct and start the timer
+ Clock(const std::string& msg_ = std::string())
+ : startTime(boost::posix_time::microsec_clock::local_time()),
+ end_called(false),
+ msg(msg_) { }
+ // Restart the timer
void begin() const {
end_called = false;
startTime = boost::posix_time::microsec_clock::local_time();
}
+ // Stop the timer
void end() const {
end_called = true;
endTime = boost::posix_time::microsec_clock::local_time();
}
+ std::string message() const {
+ return msg;
+ }
+
+ // Print current value to std::cout
void print() const {
std::cout << *this << std::endl;
}
friend std::ostream& operator<<(std::ostream& stream, const Clock& clock) {
- if (!clock.end_called)
- clock.end();
+ if (!clock.msg.empty())
+ stream << clock.msg << ": ";
- if (!clock.end_called) {
- stream << "end not called";
- } else {
- stream << clock.msg << ":" << clock.num_seconds() << "s";
- }
+ stream << clock.num_seconds() << "s";
return stream;
}
+ // Get the number of seconds between the timer start and:
+ // - the last call of end() if it was called
+ // - or now otherwise. In this case, the timer is not stopped.
double num_seconds() const {
- if (!end_called) return -1;
- return (endTime - startTime).total_milliseconds() / 1000.;
+ if (!end_called) {
+ auto end = boost::posix_time::microsec_clock::local_time();
+ return (end - startTime).total_milliseconds() / 1000.;
+ } else {
+ return (endTime - startTime).total_milliseconds() / 1000.;
+ }
}
private:
@@ -76,4 +84,6 @@ class Clock {
std::string msg;
};
-#endif // CLOCK_H_
+} // namespace Gudhi
+
+#endif // CLOCK_H_
diff --git a/include/gudhi/Debug_utils.h b/include/gudhi/Debug_utils.h
index 7573a9db..8ed3b7b3 100644
--- a/include/gudhi/Debug_utils.h
+++ b/include/gudhi/Debug_utils.h
@@ -33,8 +33,10 @@
// 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_code(CODE) CODE
#else
#define GUDHI_CHECK(expression, excpt) (void) 0
+ #define GUDHI_CHECK_code(CODE)
#endif
#define PRINT(a) std::cerr << #a << ": " << (a) << " (DISP)" << std::endl
diff --git a/include/gudhi/Edge_contraction.h b/include/gudhi/Edge_contraction.h
index 5af13c3e..61f2d945 100644
--- a/include/gudhi/Edge_contraction.h
+++ b/include/gudhi/Edge_contraction.h
@@ -41,7 +41,7 @@ namespace contraction {
\author David Salinas
-\section Introduction
+\section edgecontractionintroduction Introduction
The purpose of this package is to offer a user-friendly interface for edge contraction simplification of huge simplicial complexes.
It uses the \ref skbl data-structure whose size remains small during simplification
diff --git a/include/gudhi/Euclidean_strong_witness_complex.h b/include/gudhi/Euclidean_strong_witness_complex.h
new file mode 100644
index 00000000..fb669ef8
--- /dev/null
+++ b/include/gudhi/Euclidean_strong_witness_complex.h
@@ -0,0 +1,104 @@
+/* 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): Siargey Kachanovich
+ *
+ * Copyright (C) 2015 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 EUCLIDEAN_STRONG_WITNESS_COMPLEX_H_
+#define EUCLIDEAN_STRONG_WITNESS_COMPLEX_H_
+
+#include <gudhi/Strong_witness_complex.h>
+#include <gudhi/Active_witness/Active_witness.h>
+#include <gudhi/Kd_tree_search.h>
+
+#include <utility>
+#include <vector>
+
+namespace Gudhi {
+
+namespace witness_complex {
+
+/**
+ * \private
+ * \class Euclidean_strong_witness_complex
+ * \brief Constructs strong witness complex for given sets of witnesses and landmarks in Euclidean space.
+ * \ingroup witness_complex
+ *
+ * \tparam Kernel_ requires a <a target="_blank"
+ * href="http://doc.cgal.org/latest/Kernel_d/classCGAL_1_1Epick__d.html">CGAL::Epick_d</a> class.
+ */
+template< class Kernel_ >
+class Euclidean_strong_witness_complex
+ : public Strong_witness_complex<std::vector<typename Gudhi::spatial_searching::Kd_tree_search<Kernel_,
+ std::vector<typename Kernel_::Point_d>>::INS_range>> {
+ private:
+ typedef Kernel_ K;
+ typedef typename K::Point_d Point_d;
+ typedef std::vector<Point_d> Point_range;
+ typedef Gudhi::spatial_searching::Kd_tree_search<Kernel_, Point_range> Kd_tree;
+ typedef typename Kd_tree::INS_range Nearest_landmark_range;
+ typedef typename std::vector<Nearest_landmark_range> Nearest_landmark_table;
+
+ typedef typename Nearest_landmark_range::Point_with_transformed_distance Id_distance_pair;
+ typedef typename Id_distance_pair::first_type Landmark_id;
+ typedef Landmark_id Vertex_handle;
+
+ private:
+ Point_range landmarks_;
+ Kd_tree landmark_tree_;
+ using Strong_witness_complex<Nearest_landmark_table>::nearest_landmark_table_;
+
+ public:
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ /* @name Constructor
+ */
+
+ //@{
+
+ /**
+ * \brief Initializes member variables before constructing simplicial complex.
+ * \details Records landmarks from the range 'landmarks' into a
+ * table internally, as well as witnesses from the range 'witnesses'.
+ * Both ranges should have value_type Kernel_::Point_d.
+ */
+ template< typename LandmarkRange,
+ typename WitnessRange >
+ Euclidean_strong_witness_complex(const LandmarkRange & landmarks,
+ const WitnessRange & witnesses)
+ : landmarks_(std::begin(landmarks), std::end(landmarks)), landmark_tree_(landmarks_) {
+ nearest_landmark_table_.reserve(boost::size(witnesses));
+ for (auto w : witnesses)
+ nearest_landmark_table_.push_back(landmark_tree_.query_incremental_nearest_neighbors(w));
+ }
+
+ /** \brief Returns the point corresponding to the given vertex.
+ */
+ template <typename Vertex_handle>
+ Point_d get_point(Vertex_handle vertex) const {
+ return landmarks_[vertex];
+ }
+
+ //@}
+};
+
+} // namespace witness_complex
+
+} // namespace Gudhi
+
+#endif // EUCLIDEAN_STRONG_WITNESS_COMPLEX_H_
diff --git a/include/gudhi/Euclidean_witness_complex.h b/include/gudhi/Euclidean_witness_complex.h
new file mode 100644
index 00000000..6afe9a5d
--- /dev/null
+++ b/include/gudhi/Euclidean_witness_complex.h
@@ -0,0 +1,106 @@
+/* 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): Siargey Kachanovich
+ *
+ * Copyright (C) 2015 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 EUCLIDEAN_WITNESS_COMPLEX_H_
+#define EUCLIDEAN_WITNESS_COMPLEX_H_
+
+#include <gudhi/Witness_complex.h>
+#include <gudhi/Active_witness/Active_witness.h>
+#include <gudhi/Kd_tree_search.h>
+
+#include <utility>
+#include <vector>
+#include <list>
+#include <limits>
+
+namespace Gudhi {
+
+namespace witness_complex {
+
+/**
+ * \private
+ * \class Euclidean_witness_complex
+ * \brief Constructs (weak) witness complex for given sets of witnesses and landmarks in Euclidean space.
+ * \ingroup witness_complex
+ *
+ * \tparam Kernel_ requires a <a target="_blank"
+ * href="http://doc.cgal.org/latest/Kernel_d/classCGAL_1_1Epick__d.html">CGAL::Epick_d</a> class.
+ */
+template< class Kernel_ >
+class Euclidean_witness_complex
+ : public Witness_complex<std::vector<typename Gudhi::spatial_searching::Kd_tree_search<Kernel_,
+ std::vector<typename Kernel_::Point_d>>::INS_range>> {
+ private:
+ typedef Kernel_ K;
+ typedef typename K::Point_d Point_d;
+ typedef std::vector<Point_d> Point_range;
+ typedef Gudhi::spatial_searching::Kd_tree_search<Kernel_, Point_range> Kd_tree;
+ typedef typename Kd_tree::INS_range Nearest_landmark_range;
+ typedef typename std::vector<Nearest_landmark_range> Nearest_landmark_table;
+
+ typedef typename Nearest_landmark_range::Point_with_transformed_distance Id_distance_pair;
+ typedef typename Id_distance_pair::first_type Landmark_id;
+ typedef Landmark_id Vertex_handle;
+
+ private:
+ Point_range landmarks_;
+ Kd_tree landmark_tree_;
+ using Witness_complex<Nearest_landmark_table>::nearest_landmark_table_;
+
+ public:
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ /* @name Constructor
+ */
+
+ //@{
+
+ /**
+ * \brief Initializes member variables before constructing simplicial complex.
+ * \details Records landmarks from the range 'landmarks' into a
+ * table internally, as well as witnesses from the range 'witnesses'.
+ * Both ranges should have value_type Kernel_::Point_d.
+ */
+ template< typename LandmarkRange,
+ typename WitnessRange >
+ Euclidean_witness_complex(const LandmarkRange & landmarks,
+ const WitnessRange & witnesses)
+ : landmarks_(std::begin(landmarks), std::end(landmarks)), landmark_tree_(landmarks) {
+ nearest_landmark_table_.reserve(boost::size(witnesses));
+ for (auto w : witnesses)
+ nearest_landmark_table_.push_back(landmark_tree_.query_incremental_nearest_neighbors(w));
+ }
+
+ /** \brief Returns the point corresponding to the given vertex.
+ * @param[in] vertex Vertex handle of the point to retrieve.
+ */
+ Point_d get_point(Vertex_handle vertex) const {
+ return landmarks_[vertex];
+ }
+
+ //@}
+};
+
+} // namespace witness_complex
+
+} // namespace Gudhi
+
+#endif // EUCLIDEAN_WITNESS_COMPLEX_H_
diff --git a/include/gudhi/Graph_matching.h b/include/gudhi/Graph_matching.h
new file mode 100644
index 00000000..f51e22e9
--- /dev/null
+++ b/include/gudhi/Graph_matching.h
@@ -0,0 +1,174 @@
+/* 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: Francois Godi
+ *
+ * Copyright (C) 2015 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 GRAPH_MATCHING_H_
+#define GRAPH_MATCHING_H_
+
+#include <gudhi/Neighbors_finder.h>
+
+#include <vector>
+#include <unordered_set>
+#include <algorithm>
+
+namespace Gudhi {
+
+namespace persistence_diagram {
+
+/** \internal \brief Structure representing a graph matching. The graph is a Persistence_diagrams_graph.
+ *
+ * \ingroup bottleneck_distance
+ */
+class Graph_matching {
+ public:
+ /** \internal \brief Constructor constructing an empty matching. */
+ explicit Graph_matching(Persistence_graph &g);
+ /** \internal \brief Is the matching perfect ? */
+ bool perfect() const;
+ /** \internal \brief Augments the matching with a maximal set of edge-disjoint shortest augmenting paths. */
+ bool multi_augment();
+ /** \internal \brief Sets the maximum length of the edges allowed to be added in the matching, 0 initially. */
+ void set_r(double r);
+
+ private:
+ Persistence_graph* gp;
+ double r;
+ /** \internal \brief Given a point from V, provides its matched point in U, null_point_index() if there isn't. */
+ std::vector<int> v_to_u;
+ /** \internal \brief All the unmatched points in U. */
+ std::unordered_set<int> unmatched_in_u;
+
+ /** \internal \brief Provides a Layered_neighbors_finder dividing the graph in layers. Basically a BFS. */
+ Layered_neighbors_finder layering() const;
+ /** \internal \brief Augments the matching with a simple path no longer than max_depth. Basically a DFS. */
+ bool augment(Layered_neighbors_finder & layered_nf, int u_start_index, int max_depth);
+ /** \internal \brief Update the matching with the simple augmenting path given as parameter. */
+ void update(std::vector<int> & path);
+};
+
+inline Graph_matching::Graph_matching(Persistence_graph& g)
+ : gp(&g), r(0.), v_to_u(g.size(), null_point_index()), unmatched_in_u(g.size()) {
+ for (int u_point_index = 0; u_point_index < g.size(); ++u_point_index)
+ unmatched_in_u.insert(u_point_index);
+}
+
+inline bool Graph_matching::perfect() const {
+ return unmatched_in_u.empty();
+}
+
+inline bool Graph_matching::multi_augment() {
+ if (perfect())
+ return false;
+ Layered_neighbors_finder layered_nf(layering());
+ int max_depth = layered_nf.vlayers_number()*2 - 1;
+ double rn = sqrt(gp->size());
+ // verification of a necessary criterion in order to shortcut if possible
+ if (max_depth < 0 || (unmatched_in_u.size() > rn && max_depth >= rn))
+ return false;
+ bool successful = false;
+ std::vector<int> tries(unmatched_in_u.cbegin(), unmatched_in_u.cend());
+ for (auto it = tries.cbegin(); it != tries.cend(); it++)
+ // 'augment' has side-effects which have to be always executed, don't change order
+ successful = augment(layered_nf, *it, max_depth) || successful;
+ return successful;
+}
+
+inline void Graph_matching::set_r(double r) {
+ this->r = r;
+}
+
+inline bool Graph_matching::augment(Layered_neighbors_finder & layered_nf, int u_start_index, int max_depth) {
+ // V vertices have at most one successor, thus when we backtrack from U we can directly pop_back 2 vertices.
+ std::vector<int> path;
+ path.emplace_back(u_start_index);
+ do {
+ if (static_cast<int> (path.size()) > max_depth) {
+ path.pop_back();
+ path.pop_back();
+ }
+ if (path.empty())
+ return false;
+ path.emplace_back(layered_nf.pull_near(path.back(), static_cast<int> (path.size()) / 2));
+ while (path.back() == null_point_index()) {
+ path.pop_back();
+ path.pop_back();
+ if (path.empty())
+ return false;
+ path.pop_back();
+ path.emplace_back(layered_nf.pull_near(path.back(), path.size() / 2));
+ }
+ path.emplace_back(v_to_u.at(path.back()));
+ } while (path.back() != null_point_index());
+ // if v_to_u.at(path.back()) has no successor, path.back() is an exposed vertex
+ path.pop_back();
+ update(path);
+ return true;
+}
+
+inline Layered_neighbors_finder Graph_matching::layering() const {
+ std::vector<int> u_vertices(unmatched_in_u.cbegin(), unmatched_in_u.cend());
+ std::vector<int> v_vertices;
+ Neighbors_finder nf(*gp, r);
+ for (int v_point_index = 0; v_point_index < gp->size(); ++v_point_index)
+ nf.add(v_point_index);
+ Layered_neighbors_finder layered_nf(*gp, r);
+ for (int layer = 0; !u_vertices.empty(); layer++) {
+ // one layer is one step in the BFS
+ for (auto it1 = u_vertices.cbegin(); it1 != u_vertices.cend(); ++it1) {
+ std::vector<int> u_succ(nf.pull_all_near(*it1));
+ for (auto it2 = u_succ.begin(); it2 != u_succ.end(); ++it2) {
+ layered_nf.add(*it2, layer);
+ v_vertices.emplace_back(*it2);
+ }
+ }
+ // When the above for finishes, we have progress of one half-step (from U to V) in the BFS
+ u_vertices.clear();
+ bool end = false;
+ for (auto it = v_vertices.cbegin(); it != v_vertices.cend(); it++)
+ if (v_to_u.at(*it) == null_point_index())
+ // we stop when a nearest exposed V vertex (from U exposed vertices) has been found
+ end = true;
+ else
+ u_vertices.emplace_back(v_to_u.at(*it));
+ // When the above for finishes, we have progress of one half-step (from V to U) in the BFS
+ if (end)
+ return layered_nf;
+ v_vertices.clear();
+ }
+ return layered_nf;
+}
+
+inline void Graph_matching::update(std::vector<int>& path) {
+ // Must return 1.
+ unmatched_in_u.erase(path.front());
+ for (auto it = path.cbegin(); it != path.cend(); ++it) {
+ // Be careful, the iterator is incremented twice each time
+ int tmp = *it;
+ v_to_u[*(++it)] = tmp;
+ }
+}
+
+
+} // namespace persistence_diagram
+
+} // namespace Gudhi
+
+#endif // GRAPH_MATCHING_H_
diff --git a/include/gudhi/Internal_point.h b/include/gudhi/Internal_point.h
new file mode 100644
index 00000000..0b2d26fe
--- /dev/null
+++ b/include/gudhi/Internal_point.h
@@ -0,0 +1,91 @@
+/* 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: Francois Godi
+ *
+ * Copyright (C) 2015 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 INTERNAL_POINT_H_
+#define INTERNAL_POINT_H_
+
+namespace Gudhi {
+
+namespace persistence_diagram {
+
+/** \internal \brief Returns the used index for encoding none of the points */
+int null_point_index();
+
+/** \internal \typedef \brief Internal_point is the internal points representation, indexes used outside. */
+struct Internal_point {
+ double vec[2];
+ int point_index;
+
+ Internal_point() { }
+
+ Internal_point(double x, double y, int p_i) {
+ vec[0] = x;
+ vec[1] = y;
+ point_index = p_i;
+ }
+
+ double x() const {
+ return vec[ 0 ];
+ }
+
+ double y() const {
+ return vec[ 1 ];
+ }
+
+ double& x() {
+ return vec[ 0 ];
+ }
+
+ double& y() {
+ return vec[ 1 ];
+ }
+
+ bool operator==(const Internal_point& p) const {
+ return point_index == p.point_index;
+ }
+
+ bool operator!=(const Internal_point& p) const {
+ return !(*this == p);
+ }
+};
+
+inline int null_point_index() {
+ return -1;
+}
+
+struct Construct_coord_iterator {
+ typedef const double* result_type;
+
+ const double* operator()(const Internal_point& p) const {
+ return p.vec;
+ }
+
+ const double* operator()(const Internal_point& p, int) const {
+ return p.vec + 2;
+ }
+};
+
+} // namespace persistence_diagram
+
+} // namespace Gudhi
+
+#endif // INTERNAL_POINT_H_
diff --git a/include/gudhi/Kd_tree_search.h b/include/gudhi/Kd_tree_search.h
new file mode 100644
index 00000000..6728d56e
--- /dev/null
+++ b/include/gudhi/Kd_tree_search.h
@@ -0,0 +1,264 @@
+/* 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): Clement Jamin
+ *
+ * Copyright (C) 2016 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 KD_TREE_SEARCH_H_
+#define KD_TREE_SEARCH_H_
+
+#include <CGAL/Orthogonal_k_neighbor_search.h>
+#include <CGAL/Orthogonal_incremental_neighbor_search.h>
+#include <CGAL/Search_traits.h>
+#include <CGAL/Search_traits_adapter.h>
+#include <CGAL/property_map.h>
+
+#include <boost/property_map/property_map.hpp>
+#include <boost/iterator/counting_iterator.hpp>
+
+#include <cstddef>
+#include <vector>
+
+namespace Gudhi {
+namespace spatial_searching {
+
+
+ /**
+ * \class Kd_tree_search Kd_tree_search.h gudhi/Kd_tree_search.h
+ * \brief Spatial tree data structure to perform (approximate) nearest and farthest neighbor search.
+ *
+ * \ingroup spatial_searching
+ *
+ * \details
+ * The class Kd_tree_search is a tree-based data structure, based on
+ * <a target="_blank" href="http://doc.cgal.org/latest/Spatial_searching/index.html">CGAL dD spatial searching data structures</a>.
+ * It provides a simplified API to perform (approximate) nearest and farthest neighbor searches. Contrary to CGAL default behavior, the tree
+ * does not store the points themselves, but stores indices.
+ *
+ * There are two types of queries: the <i>k-nearest or k-farthest neighbor query</i>, where <i>k</i> is fixed and the <i>k</i> nearest
+ * or farthest points are computed right away,
+ * and the <i>incremental nearest or farthest neighbor query</i>, where no number of neighbors is provided during the call, as the
+ * neighbors will be computed incrementally when the iterator on the range is incremented.
+ *
+ * \tparam Search_traits must be a model of the <a target="_blank"
+ * href="http://doc.cgal.org/latest/Spatial_searching/classSearchTraits.html">SearchTraits</a>
+ * concept, such as the <a target="_blank"
+ * href="http://doc.cgal.org/latest/Kernel_d/classCGAL_1_1Epick__d.html">CGAL::Epick_d</a> class, which
+ * can be static if you know the ambiant dimension at compile-time, or dynamic if you don't.
+ * \tparam Point_range is the type of the range that provides the points.
+ * It must be a range whose iterator type is a `RandomAccessIterator`.
+ */
+template <typename Search_traits, typename Point_range>
+class Kd_tree_search {
+ typedef boost::iterator_property_map<
+ typename Point_range::const_iterator,
+ CGAL::Identity_property_map<std::ptrdiff_t> > Point_property_map;
+
+ public:
+ /// The Traits.
+ typedef Search_traits Traits;
+ /// Number type used for distances.
+ typedef typename Traits::FT FT;
+ /// The point type.
+ typedef typename Point_range::value_type Point;
+
+ typedef CGAL::Search_traits<
+ FT, Point,
+ typename Traits::Cartesian_const_iterator_d,
+ typename Traits::Construct_cartesian_const_iterator_d> Traits_base;
+
+ typedef CGAL::Search_traits_adapter<
+ std::ptrdiff_t,
+ Point_property_map,
+ Traits_base> STraits;
+
+ typedef CGAL::Orthogonal_k_neighbor_search<STraits> K_neighbor_search;
+ typedef typename K_neighbor_search::Tree Tree;
+ typedef typename K_neighbor_search::Distance Distance;
+ /// \brief The range returned by a k-nearest or k-farthest neighbor search.
+ /// Its value type is `std::pair<std::size_t, FT>` where `first` is the index
+ /// of a point P and `second` is the squared distance between P and the query point.
+ typedef K_neighbor_search KNS_range;
+
+ typedef CGAL::Orthogonal_incremental_neighbor_search<
+ STraits, Distance, CGAL::Sliding_midpoint<STraits>, Tree>
+ Incremental_neighbor_search;
+ /// \brief The range returned by an incremental nearest or farthest neighbor search.
+ /// Its value type is `std::pair<std::size_t, FT>` where `first` is the index
+ /// of a point P and `second` is the squared distance between P and the query point.
+ typedef Incremental_neighbor_search INS_range;
+
+ /// \brief Constructor
+ /// @param[in] points Const reference to the point range. This range
+ /// is not copied, so it should not be destroyed or modified afterwards.
+ Kd_tree_search(Point_range const& points)
+ : m_points(points),
+ m_tree(boost::counting_iterator<std::ptrdiff_t>(0),
+ boost::counting_iterator<std::ptrdiff_t>(points.size()),
+ typename Tree::Splitter(),
+ STraits(std::begin(points))) {
+ // Build the tree now (we don't want to wait for the first query)
+ m_tree.build();
+ }
+
+ /// \brief Constructor
+ /// @param[in] points Const reference to the point range. This range
+ /// is not copied, so it should not be destroyed or modified afterwards.
+ /// @param[in] only_these_points Specifies the indices of the points that
+ /// should be actually inserted into the tree. The other points are ignored.
+ template <typename Point_indices_range>
+ Kd_tree_search(
+ Point_range const& points,
+ Point_indices_range const& only_these_points)
+ : m_points(points),
+ m_tree(
+ only_these_points.begin(), only_these_points.end(),
+ typename Tree::Splitter(),
+ STraits(std::begin(points))) {
+ // Build the tree now (we don't want to wait for the first query)
+ m_tree.build();
+ }
+
+ /// \brief Constructor
+ /// @param[in] points Const reference to the point range. This range
+ /// is not copied, so it should not be destroyed or modified afterwards.
+ /// @param[in] begin_idx, past_the_end_idx Define the subset of the points that
+ /// should be actually inserted into the tree. The other points are ignored.
+ Kd_tree_search(
+ Point_range const& points,
+ std::size_t begin_idx, std::size_t past_the_end_idx)
+ : m_points(points),
+ m_tree(
+ boost::counting_iterator<std::ptrdiff_t>(begin_idx),
+ boost::counting_iterator<std::ptrdiff_t>(past_the_end_idx),
+ typename Tree::Splitter(),
+ STraits(std::begin(points))) {
+ // Build the tree now (we don't want to wait for the first query)
+ m_tree.build();
+ }
+
+ // Be careful, this function invalidates the tree,
+ // which will be recomputed at the next query
+ void insert(std::ptrdiff_t point_idx) {
+ m_tree.insert(point_idx);
+ }
+
+ /// \brief Search for the k-nearest neighbors from a query point.
+ /// @param[in] p The query point.
+ /// @param[in] k Number of nearest points to search.
+ /// @param[in] sorted Indicates if the computed sequence of k-nearest neighbors needs to be sorted.
+ /// @param[in] eps Approximation factor.
+ /// @return A range containing the k-nearest neighbors.
+ KNS_range query_k_nearest_neighbors(const
+ Point &p,
+ unsigned int k,
+ bool sorted = true,
+ FT eps = FT(0)) const {
+ // Initialize the search structure, and search all N points
+ // Note that we need to pass the Distance explicitly since it needs to
+ // know the property map
+ K_neighbor_search search(
+ m_tree,
+ p,
+ k,
+ eps,
+ true,
+ CGAL::Distance_adapter<std::ptrdiff_t, Point_property_map, CGAL::Euclidean_distance<Traits_base> >(
+ std::begin(m_points)), sorted);
+
+ return search;
+ }
+
+ /// \brief Search incrementally for the nearest neighbors from a query point.
+ /// @param[in] p The query point.
+ /// @param[in] eps Approximation factor.
+ /// @return A range containing the neighbors sorted by their distance to p.
+ /// All the neighbors are not computed by this function, but they will be
+ /// computed incrementally when the iterator on the range is incremented.
+ INS_range query_incremental_nearest_neighbors(const Point &p, FT eps = FT(0)) const {
+ // Initialize the search structure, and search all N points
+ // Note that we need to pass the Distance explicitly since it needs to
+ // know the property map
+ Incremental_neighbor_search search(
+ m_tree,
+ p,
+ eps,
+ true,
+ CGAL::Distance_adapter<std::ptrdiff_t, Point_property_map, CGAL::Euclidean_distance<Traits_base> >(
+ std::begin(m_points)) );
+
+ return search;
+ }
+
+ /// \brief Search for the k-farthest points from a query point.
+ /// @param[in] p The query point.
+ /// @param[in] k Number of farthest points to search.
+ /// @param[in] sorted Indicates if the computed sequence of k-farthest neighbors needs to be sorted.
+ /// @param[in] eps Approximation factor.
+ /// @return A range containing the k-farthest neighbors.
+ KNS_range query_k_farthest_neighbors(const
+ Point &p,
+ unsigned int k,
+ bool sorted = true,
+ FT eps = FT(0)) const {
+ // Initialize the search structure, and search all N points
+ // Note that we need to pass the Distance explicitly since it needs to
+ // know the property map
+ K_neighbor_search search(
+ m_tree,
+ p,
+ k,
+ eps,
+ false,
+ CGAL::Distance_adapter<std::ptrdiff_t, Point_property_map, CGAL::Euclidean_distance<Traits_base> >(
+ std::begin(m_points)), sorted);
+
+ return search;
+ }
+
+ /// \brief Search incrementally for the farthest neighbors from a query point.
+ /// @param[in] p The query point.
+ /// @param[in] eps Approximation factor.
+ /// @return A range containing the neighbors sorted by their distance to p.
+ /// All the neighbors are not computed by this function, but they will be
+ /// computed incrementally when the iterator on the range is incremented.
+ INS_range query_incremental_farthest_neighbors(const Point &p, FT eps = FT(0)) const {
+ // Initialize the search structure, and search all N points
+ // Note that we need to pass the Distance explicitly since it needs to
+ // know the property map
+ Incremental_neighbor_search search(
+ m_tree,
+ p,
+ eps,
+ false,
+ CGAL::Distance_adapter<std::ptrdiff_t, Point_property_map, CGAL::Euclidean_distance<Traits_base> >(
+ std::begin(m_points)) );
+
+ return search;
+ }
+
+ private:
+ Point_range const& m_points;
+ Tree m_tree;
+};
+
+} // namespace spatial_searching
+} // namespace Gudhi
+
+#endif // KD_TREE_SEARCH_H_
diff --git a/include/gudhi/Landmark_choice_by_furthest_point.h b/include/gudhi/Landmark_choice_by_furthest_point.h
deleted file mode 100644
index df93155b..00000000
--- a/include/gudhi/Landmark_choice_by_furthest_point.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/* 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): Siargey Kachanovich
- *
- * Copyright (C) 2015 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/>.
- */
-
-#ifndef LANDMARK_CHOICE_BY_FURTHEST_POINT_H_
-#define LANDMARK_CHOICE_BY_FURTHEST_POINT_H_
-
-#include <boost/range/size.hpp>
-
-#include <limits> // for numeric_limits<>
-#include <iterator>
-#include <algorithm> // for sort
-#include <vector>
-
-namespace Gudhi {
-
-namespace witness_complex {
-
- typedef std::vector<int> typeVectorVertex;
-
- /**
- * \ingroup witness_complex
- * \brief Landmark choice strategy by iteratively adding the furthest witness from the
- * current landmark set as the new landmark.
- * \details It chooses nbL landmarks from a random access range `points` and
- * writes {witness}*{closest landmarks} matrix in `knn`.
- *
- * The type KNearestNeighbors can be seen as
- * Witness_range<Closest_landmark_range<Vertex_handle>>, where
- * Witness_range and Closest_landmark_range are random access ranges
- *
- */
-
- template <typename KNearestNeighbours,
- typename Point_random_access_range>
- void landmark_choice_by_furthest_point(Point_random_access_range const &points,
- int nbL,
- KNearestNeighbours &knn) {
- int nb_points = boost::size(points);
- assert(nb_points >= nbL);
- // distance matrix witness x landmarks
- std::vector<std::vector<double>> wit_land_dist(nb_points, std::vector<double>());
- // landmark list
- typeVectorVertex chosen_landmarks;
-
- knn = KNearestNeighbours(nb_points, std::vector<int>());
- int current_number_of_landmarks = 0; // counter for landmarks
- double curr_max_dist = 0; // used for defining the furhest point from L
- const double infty = std::numeric_limits<double>::infinity(); // infinity (see next entry)
- std::vector< double > dist_to_L(nb_points, infty); // vector of current distances to L from points
-
- // TODO(SK) Consider using rand_r(...) instead of rand(...) for improved thread safety
- // or better yet std::uniform_int_distribution
- int rand_int = rand() % nb_points;
- int curr_max_w = rand_int; // For testing purposes a pseudo-random number is used here
-
- for (current_number_of_landmarks = 0; current_number_of_landmarks != nbL; current_number_of_landmarks++) {
- // curr_max_w at this point is the next landmark
- chosen_landmarks.push_back(curr_max_w);
- unsigned i = 0;
- for (auto& p : points) {
- double curr_dist = euclidean_distance(p, *(std::begin(points) + chosen_landmarks[current_number_of_landmarks]));
- wit_land_dist[i].push_back(curr_dist);
- knn[i].push_back(current_number_of_landmarks);
- if (curr_dist < dist_to_L[i])
- dist_to_L[i] = curr_dist;
- ++i;
- }
- curr_max_dist = 0;
- for (i = 0; i < dist_to_L.size(); i++)
- if (dist_to_L[i] > curr_max_dist) {
- curr_max_dist = dist_to_L[i];
- curr_max_w = i;
- }
- }
- for (int i = 0; i < nb_points; ++i)
- std::sort(std::begin(knn[i]),
- std::end(knn[i]),
- [&wit_land_dist, i](int a, int b) {
- return wit_land_dist[i][a] < wit_land_dist[i][b]; });
- }
-
-} // namespace witness_complex
-
-} // namespace Gudhi
-
-#endif // LANDMARK_CHOICE_BY_FURTHEST_POINT_H_
diff --git a/include/gudhi/Landmark_choice_by_random_point.h b/include/gudhi/Landmark_choice_by_random_point.h
deleted file mode 100644
index ebf6aad1..00000000
--- a/include/gudhi/Landmark_choice_by_random_point.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/* 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): Siargey Kachanovich
- *
- * Copyright (C) 2015 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/>.
- */
-
-#ifndef LANDMARK_CHOICE_BY_RANDOM_POINT_H_
-#define LANDMARK_CHOICE_BY_RANDOM_POINT_H_
-
-#include <boost/range/size.hpp>
-
-#include <queue> // for priority_queue<>
-#include <utility> // for pair<>
-#include <iterator>
-#include <vector>
-#include <set>
-
-namespace Gudhi {
-
-namespace witness_complex {
-
- /**
- * \ingroup witness_complex
- * \brief Landmark choice strategy by taking random vertices for landmarks.
- * \details It chooses nbL distinct landmarks from a random access range `points`
- * and outputs a matrix {witness}*{closest landmarks} in knn.
- *
- * The type KNearestNeighbors can be seen as
- * Witness_range<Closest_landmark_range<Vertex_handle>>, where
- * Witness_range and Closest_landmark_range are random access ranges and
- * Vertex_handle is the label type of a vertex in a simplicial complex.
- * Closest_landmark_range needs to have push_back operation.
- */
-
- template <typename KNearestNeighbours,
- typename Point_random_access_range>
- void landmark_choice_by_random_point(Point_random_access_range const &points,
- int nbL,
- KNearestNeighbours &knn) {
- int nbP = boost::size(points);
- assert(nbP >= nbL);
- std::set<int> landmarks;
- int current_number_of_landmarks = 0; // counter for landmarks
-
- // TODO(SK) Consider using rand_r(...) instead of rand(...) for improved thread safety
- int chosen_landmark = rand() % nbP;
- for (current_number_of_landmarks = 0; current_number_of_landmarks != nbL; current_number_of_landmarks++) {
- while (landmarks.find(chosen_landmark) != landmarks.end())
- chosen_landmark = rand() % nbP;
- landmarks.insert(chosen_landmark);
- }
-
- int dim = boost::size(*std::begin(points));
- typedef std::pair<double, int> dist_i;
- typedef bool (*comp)(dist_i, dist_i);
- knn = KNearestNeighbours(nbP);
- for (int points_i = 0; points_i < nbP; points_i++) {
- std::priority_queue<dist_i, std::vector<dist_i>, comp> l_heap([](dist_i j1, dist_i j2) {
- return j1.first > j2.first;
- });
- std::set<int>::iterator landmarks_it;
- int landmarks_i = 0;
- for (landmarks_it = landmarks.begin(), landmarks_i = 0; landmarks_it != landmarks.end();
- ++landmarks_it, landmarks_i++) {
- dist_i dist = std::make_pair(euclidean_distance(points[points_i], points[*landmarks_it]), landmarks_i);
- l_heap.push(dist);
- }
- for (int i = 0; i < dim + 1; i++) {
- dist_i dist = l_heap.top();
- knn[points_i].push_back(dist.second);
- l_heap.pop();
- }
- }
- }
-
-} // namespace witness_complex
-
-} // namespace Gudhi
-
-#endif // LANDMARK_CHOICE_BY_RANDOM_POINT_H_
diff --git a/include/gudhi/Neighbors_finder.h b/include/gudhi/Neighbors_finder.h
new file mode 100644
index 00000000..bdc47578
--- /dev/null
+++ b/include/gudhi/Neighbors_finder.h
@@ -0,0 +1,192 @@
+/* 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: Francois Godi
+ *
+ * Copyright (C) 2015 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 NEIGHBORS_FINDER_H_
+#define NEIGHBORS_FINDER_H_
+
+// Inclusion order is important for CGAL patch
+#include <CGAL/Kd_tree.h>
+#include <CGAL/Search_traits.h>
+
+#include <gudhi/Persistence_graph.h>
+#include <gudhi/Internal_point.h>
+
+#include <unordered_set>
+#include <vector>
+
+namespace Gudhi {
+
+namespace persistence_diagram {
+
+/** \internal \brief Variant of CGAL::Fuzzy_iso_box to ensure that the box ic closed. It isn't clear how necessary that is.
+ */
+struct Square_query {
+ typedef CGAL::Dimension_tag<2> D;
+ 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;
+ }
+ bool inner_range_intersects(CGAL::Kd_tree_rectangle<FT,D> const&r) const {
+ return
+ r.max_coord(0) >= c.x() - size &&
+ r.min_coord(0) <= c.x() + size &&
+ r.max_coord(1) >= c.y() - size &&
+ r.min_coord(1) <= c.y() + size;
+ }
+ bool outer_range_contains(CGAL::Kd_tree_rectangle<FT,D> const&r) const {
+ return
+ r.min_coord(0) >= c.x() - size &&
+ r.max_coord(0) <= c.x() + size &&
+ r.min_coord(1) >= c.y() - size &&
+ r.max_coord(1) <= c.y() + size;
+ }
+ Point_d c;
+ FT size;
+};
+
+/** \internal \brief data structure used to find any point (including projections) in V near to a query point from U
+ * (which can be a projection).
+ *
+ * V points have to be added manually using their index and before the first pull. A neighbor pulled is automatically
+ * removed.
+ *
+ * \ingroup bottleneck_distance
+ */
+class Neighbors_finder {
+ typedef CGAL::Dimension_tag<2> D;
+ typedef CGAL::Search_traits<double, Internal_point, const double*, Construct_coord_iterator, D> Traits;
+ typedef CGAL::Kd_tree<Traits> Kd_tree;
+
+ public:
+ /** \internal \brief Constructor taking the near distance definition as parameter. */
+ Neighbors_finder(const Persistence_graph& g, double r);
+ /** \internal \brief A point added will be possibly pulled. */
+ void add(int v_point_index);
+ /** \internal \brief Returns and remove a V point near to the U point given as parameter, null_point_index() if
+ * there isn't such a point. */
+ int pull_near(int u_point_index);
+ /** \internal \brief Returns and remove all the V points near to the U point given as parameter. */
+ std::vector<int> pull_all_near(int u_point_index);
+
+ private:
+ const Persistence_graph& g;
+ const double r;
+ Kd_tree kd_t;
+ std::unordered_set<int> projections_f;
+};
+
+/** \internal \brief data structure used to find any point (including projections) in V near to a query point from U
+ * (which can be a projection) in a layered graph layer given as parmeter.
+ *
+ * V points have to be added manually using their index and before the first pull. A neighbor pulled is automatically
+ * removed.
+ *
+ * \ingroup bottleneck_distance
+ */
+class Layered_neighbors_finder {
+ public:
+ /** \internal \brief Constructor taking the near distance definition as parameter. */
+ Layered_neighbors_finder(const Persistence_graph& g, double r);
+ /** \internal \brief A point added will be possibly pulled. */
+ void add(int v_point_index, int vlayer);
+ /** \internal \brief Returns and remove a V point near to the U point given as parameter, null_point_index() if
+ * there isn't such a point. */
+ int pull_near(int u_point_index, int vlayer);
+ /** \internal \brief Returns the number of layers. */
+ int vlayers_number() const;
+
+ private:
+ const Persistence_graph& g;
+ const double r;
+ std::vector<std::unique_ptr<Neighbors_finder>> neighbors_finder;
+};
+
+inline Neighbors_finder::Neighbors_finder(const Persistence_graph& g, double r) :
+ g(g), r(r), kd_t(), projections_f() { }
+
+inline void Neighbors_finder::add(int v_point_index) {
+ if (g.on_the_v_diagonal(v_point_index))
+ projections_f.emplace(v_point_index);
+ else
+ kd_t.insert(g.get_v_point(v_point_index));
+}
+
+inline int Neighbors_finder::pull_near(int u_point_index) {
+ int tmp;
+ int c = g.corresponding_point_in_v(u_point_index);
+ if (g.on_the_u_diagonal(u_point_index) && !projections_f.empty()) {
+ // Any pair of projection is at distance 0
+ tmp = *projections_f.cbegin();
+ projections_f.erase(tmp);
+ } else if (projections_f.count(c) && (g.distance(u_point_index, c) <= r)) {
+ // Is the query point near to its projection ?
+ tmp = c;
+ projections_f.erase(tmp);
+ } else {
+ // Is the query point near to a V point in the plane ?
+ Internal_point u_point = g.get_u_point(u_point_index);
+ auto neighbor = kd_t.search_any_point(Square_query{u_point, r});
+ if(!neighbor)
+ return null_point_index();
+ tmp = neighbor->point_index;
+ auto point = g.get_v_point(tmp);
+ int idx = point.point_index;
+ kd_t.remove(point, [idx](Internal_point const&p){return p.point_index == idx;});
+ }
+ return tmp;
+}
+
+inline std::vector<int> Neighbors_finder::pull_all_near(int u_point_index) {
+ std::vector<int> all_pull;
+ int last_pull = pull_near(u_point_index);
+ while (last_pull != null_point_index()) {
+ all_pull.emplace_back(last_pull);
+ last_pull = pull_near(u_point_index);
+ }
+ return all_pull;
+}
+
+inline Layered_neighbors_finder::Layered_neighbors_finder(const Persistence_graph& g, double r) :
+ g(g), r(r), neighbors_finder() { }
+
+inline void Layered_neighbors_finder::add(int v_point_index, int vlayer) {
+ for (int l = neighbors_finder.size(); l <= vlayer; l++)
+ neighbors_finder.emplace_back(std::unique_ptr<Neighbors_finder>(new Neighbors_finder(g, r)));
+ neighbors_finder.at(vlayer)->add(v_point_index);
+}
+
+inline int Layered_neighbors_finder::pull_near(int u_point_index, int vlayer) {
+ if (static_cast<int> (neighbors_finder.size()) <= vlayer)
+ return null_point_index();
+ return neighbors_finder.at(vlayer)->pull_near(u_point_index);
+}
+
+inline int Layered_neighbors_finder::vlayers_number() const {
+ return static_cast<int> (neighbors_finder.size());
+}
+
+} // namespace persistence_diagram
+
+} // namespace Gudhi
+
+#endif // NEIGHBORS_FINDER_H_
diff --git a/include/gudhi/Null_output_iterator.h b/include/gudhi/Null_output_iterator.h
new file mode 100644
index 00000000..42e6e449
--- /dev/null
+++ b/include/gudhi/Null_output_iterator.h
@@ -0,0 +1,48 @@
+/* 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): Marc Glisse
+ *
+ * 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 NULL_OUTPUT_ITERATOR_H_
+#define NULL_OUTPUT_ITERATOR_H_
+
+#include <iterator>
+
+namespace Gudhi {
+
+/** An output iterator that ignores whatever it is given. */
+struct Null_output_iterator {
+ typedef std::output_iterator_tag iterator_category;
+ typedef void value_type;
+ typedef void difference_type;
+ typedef void pointer;
+ typedef void reference;
+
+ Null_output_iterator& operator++() {return *this;}
+ Null_output_iterator operator++(int) {return *this;}
+ struct proxy {
+ template<class T>
+ proxy& operator=(T&&){return *this;}
+ };
+ proxy operator*()const{return {};}
+};
+} // namespace Gudhi
+
+#endif // NULL_OUTPUT_ITERATOR_H_
diff --git a/include/gudhi/Persistence_graph.h b/include/gudhi/Persistence_graph.h
new file mode 100644
index 00000000..44f4b827
--- /dev/null
+++ b/include/gudhi/Persistence_graph.h
@@ -0,0 +1,188 @@
+/* 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: Francois Godi
+ *
+ * Copyright (C) 2015 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 PERSISTENCE_GRAPH_H_
+#define PERSISTENCE_GRAPH_H_
+
+#include <gudhi/Internal_point.h>
+
+#ifdef GUDHI_USE_TBB
+#include <tbb/parallel_sort.h>
+#endif
+
+#include <vector>
+#include <algorithm>
+#include <limits> // for numeric_limits
+
+namespace Gudhi {
+
+namespace persistence_diagram {
+
+/** \internal \brief Structure representing an euclidean bipartite graph containing
+ * the points from the two persistence diagrams (including the projections).
+ *
+ * \ingroup bottleneck_distance
+ */
+class Persistence_graph {
+ public:
+ /** \internal \brief Constructor taking 2 PersistenceDiagrams (concept) as parameters. */
+ template<typename Persistence_diagram1, typename Persistence_diagram2>
+ Persistence_graph(const Persistence_diagram1& diag1, const Persistence_diagram2& diag2, double e);
+ /** \internal \brief Is the given point from U the projection of a point in V ? */
+ bool on_the_u_diagonal(int u_point_index) const;
+ /** \internal \brief Is the given point from V the projection of a point in U ? */
+ bool on_the_v_diagonal(int v_point_index) const;
+ /** \internal \brief Given a point from V, returns the corresponding (projection or projector) point in U. */
+ int corresponding_point_in_u(int v_point_index) const;
+ /** \internal \brief Given a point from U, returns the corresponding (projection or projector) point in V. */
+ int corresponding_point_in_v(int u_point_index) const;
+ /** \internal \brief Given a point from U and a point from V, returns the distance between those points. */
+ double distance(int u_point_index, int v_point_index) const;
+ /** \internal \brief Returns size = |U| = |V|. */
+ int size() const;
+ /** \internal \brief Is there as many infinite points (alive components) in both diagrams ? */
+ double bottleneck_alive() const;
+ /** \internal \brief Returns the O(n^2) sorted distances between the points. */
+ std::vector<double> sorted_distances() const;
+ /** \internal \brief Returns an upper bound for the diameter of the convex hull of all non infinite points */
+ double diameter_bound() const;
+ /** \internal \brief Returns the corresponding internal point */
+ Internal_point get_u_point(int u_point_index) const;
+ /** \internal \brief Returns the corresponding internal point */
+ Internal_point get_v_point(int v_point_index) const;
+
+ private:
+ std::vector<Internal_point> u;
+ std::vector<Internal_point> v;
+ double b_alive;
+};
+
+template<typename Persistence_diagram1, typename Persistence_diagram2>
+Persistence_graph::Persistence_graph(const Persistence_diagram1 &diag1,
+ const Persistence_diagram2 &diag2, double e)
+ : u(), v(), b_alive(0.) {
+ std::vector<double> u_alive;
+ std::vector<double> v_alive;
+ for (auto it = std::begin(diag1); it != std::end(diag1); ++it) {
+ if (std::get<1>(*it) == std::numeric_limits<double>::infinity())
+ u_alive.push_back(std::get<0>(*it));
+ else if (std::get<1>(*it) - std::get<0>(*it) > e)
+ u.push_back(Internal_point(std::get<0>(*it), std::get<1>(*it), u.size()));
+ }
+ for (auto it = std::begin(diag2); it != std::end(diag2); ++it) {
+ if (std::get<1>(*it) == std::numeric_limits<double>::infinity())
+ v_alive.push_back(std::get<0>(*it));
+ else if (std::get<1>(*it) - std::get<0>(*it) > e)
+ v.push_back(Internal_point(std::get<0>(*it), std::get<1>(*it), v.size()));
+ }
+ if (u.size() < v.size())
+ swap(u, v);
+ std::sort(u_alive.begin(), u_alive.end());
+ std::sort(v_alive.begin(), v_alive.end());
+ if (u_alive.size() != v_alive.size()) {
+ b_alive = std::numeric_limits<double>::infinity();
+ } else {
+ for (auto it_u = u_alive.cbegin(), it_v = v_alive.cbegin(); it_u != u_alive.cend(); ++it_u, ++it_v)
+ b_alive = std::max(b_alive, std::fabs(*it_u - *it_v));
+ }
+}
+
+inline bool Persistence_graph::on_the_u_diagonal(int u_point_index) const {
+ return u_point_index >= static_cast<int> (u.size());
+}
+
+inline bool Persistence_graph::on_the_v_diagonal(int v_point_index) const {
+ return v_point_index >= static_cast<int> (v.size());
+}
+
+inline int Persistence_graph::corresponding_point_in_u(int v_point_index) const {
+ return on_the_v_diagonal(v_point_index) ?
+ v_point_index - static_cast<int> (v.size()) : v_point_index + static_cast<int> (u.size());
+}
+
+inline int Persistence_graph::corresponding_point_in_v(int u_point_index) const {
+ return on_the_u_diagonal(u_point_index) ?
+ u_point_index - static_cast<int> (u.size()) : u_point_index + static_cast<int> (v.size());
+}
+
+inline double Persistence_graph::distance(int u_point_index, int v_point_index) const {
+ if (on_the_u_diagonal(u_point_index) && on_the_v_diagonal(v_point_index))
+ return 0.;
+ Internal_point p_u = get_u_point(u_point_index);
+ Internal_point p_v = get_v_point(v_point_index);
+ return std::max(std::fabs(p_u.x() - p_v.x()), std::fabs(p_u.y() - p_v.y()));
+}
+
+inline int Persistence_graph::size() const {
+ return static_cast<int> (u.size() + v.size());
+}
+
+inline double Persistence_graph::bottleneck_alive() const {
+ return b_alive;
+}
+
+inline std::vector<double> Persistence_graph::sorted_distances() const {
+ std::vector<double> distances;
+ distances.push_back(0.); // for empty diagrams
+ for (int u_point_index = 0; u_point_index < size(); ++u_point_index) {
+ distances.push_back(distance(u_point_index, corresponding_point_in_v(u_point_index)));
+ for (int v_point_index = 0; v_point_index < size(); ++v_point_index)
+ distances.push_back(distance(u_point_index, v_point_index));
+ }
+#ifdef GUDHI_USE_TBB
+ tbb::parallel_sort(distances.begin(), distances.end());
+#else
+ std::sort(distances.begin(), distances.end());
+#endif
+ return distances;
+}
+
+inline Internal_point Persistence_graph::get_u_point(int u_point_index) const {
+ if (!on_the_u_diagonal(u_point_index))
+ return u.at(u_point_index);
+ Internal_point projector = v.at(corresponding_point_in_v(u_point_index));
+ double m = (projector.x() + projector.y()) / 2.;
+ return Internal_point(m, m, u_point_index);
+}
+
+inline Internal_point Persistence_graph::get_v_point(int v_point_index) const {
+ if (!on_the_v_diagonal(v_point_index))
+ return v.at(v_point_index);
+ Internal_point projector = u.at(corresponding_point_in_u(v_point_index));
+ double m = (projector.x() + projector.y()) / 2.;
+ return Internal_point(m, m, v_point_index);
+}
+
+inline double Persistence_graph::diameter_bound() const {
+ double max = 0.;
+ for (auto it = u.cbegin(); it != u.cend(); it++)
+ max = std::max(max, it->y());
+ for (auto it = v.cbegin(); it != v.cend(); it++)
+ max = std::max(max, it->y());
+ return max;
+}
+
+} // namespace persistence_diagram
+
+} // namespace Gudhi
+
+#endif // PERSISTENCE_GRAPH_H_
diff --git a/include/gudhi/Persistent_cohomology.h b/include/gudhi/Persistent_cohomology.h
index b31df6a4..672fda48 100644
--- a/include/gudhi/Persistent_cohomology.h
+++ b/include/gudhi/Persistent_cohomology.h
@@ -110,7 +110,7 @@ class Persistent_cohomology {
cell_pool_() {
if (cpx_->num_simplices() > std::numeric_limits<Simplex_key>::max()) {
// num_simplices must be strictly lower than the limit, because a value is reserved for null_key.
- throw std::out_of_range ("The number of simplices is more than Simplex_key type numeric limit.");
+ throw std::out_of_range("The number of simplices is more than Simplex_key type numeric limit.");
}
Simplex_key idx_fil = 0;
for (auto sh : cpx_->filtration_simplex_range()) {
@@ -300,8 +300,7 @@ class Persistent_cohomology {
// with multiplicity. We used to sum the coefficients directly in
// annotations_in_boundary by using a map, we now do it later.
typedef std::pair<Column *, int> annotation_t;
- // Danger: not thread-safe!
- static std::vector<annotation_t> annotations_in_boundary;
+ thread_local std::vector<annotation_t> annotations_in_boundary;
annotations_in_boundary.clear();
int sign = 1 - 2 * (dim_sigma % 2); // \in {-1,1} provides the sign in the
// alternate sum in the boundary.
@@ -604,7 +603,7 @@ class Persistent_cohomology {
*/
std::vector<int> betti_numbers() const {
// Init Betti numbers vector with zeros until Simplicial complex dimension
- std::vector<int> betti_numbers(cpx_->dimension(), 0);
+ std::vector<int> betti_numbers(dim_max_, 0);
for (auto pair : persistent_pairs_) {
// Count never ended persistence intervals
@@ -643,8 +642,7 @@ class Persistent_cohomology {
*/
std::vector<int> persistent_betti_numbers(Filtration_value from, Filtration_value to) const {
// Init Betti numbers vector with zeros until Simplicial complex dimension
- std::vector<int> betti_numbers(cpx_->dimension(), 0);
-
+ std::vector<int> betti_numbers(dim_max_, 0);
for (auto pair : persistent_pairs_) {
// Count persistence intervals that covers the given interval
// null_simplex test : if the function is called with to=+infinity, we still get something useful. And it will
@@ -690,6 +688,22 @@ class Persistent_cohomology {
return persistent_pairs_;
}
+ /** @brief Returns persistence intervals for a given dimension.
+ * @param[in] dimension Dimension to get the birth and death pairs from.
+ * @return A vector of persistence intervals (birth and death) on a fixed dimension.
+ */
+ std::vector< std::pair< Filtration_value , Filtration_value > >
+ intervals_in_dimension(int dimension) {
+ std::vector< std::pair< Filtration_value , Filtration_value > > result;
+ // auto && pair, to avoid unnecessary copying
+ for (auto && pair : persistent_pairs_) {
+ if (cpx_->dimension(get<0>(pair)) == dimension) {
+ result.emplace_back(cpx_->filtration(get<0>(pair)), cpx_->filtration(get<1>(pair)));
+ }
+ }
+ return result;
+ }
+
private:
/*
* Structure representing a cocycle.
diff --git a/include/gudhi/Points_3D_off_io.h b/include/gudhi/Points_3D_off_io.h
index 2647f11e..b0d24998 100644
--- a/include/gudhi/Points_3D_off_io.h
+++ b/include/gudhi/Points_3D_off_io.h
@@ -132,12 +132,12 @@ class Points_3D_off_visitor_reader {
*
* @code template<class InputIterator > Point_3::Point_3(double x, double y, double z) @endcode
*
- * @section Example
+ * @section point3doffioexample Example
*
* This example loads points from an OFF file and builds a vector of CGAL points in dimension 3.
* Then, it is asked to display the points.
*
- * @include common/CGAL_3D_points_off_reader.cpp
+ * @include common/example_CGAL_3D_points_off_reader.cpp
*
* When launching:
*
diff --git a/include/gudhi/Points_off_io.h b/include/gudhi/Points_off_io.h
index 74b49386..29af8a8a 100644
--- a/include/gudhi/Points_off_io.h
+++ b/include/gudhi/Points_off_io.h
@@ -73,9 +73,8 @@ class Points_off_visitor_reader {
* @details
* Point_d must have a constructor with the following form:
*
- * @code template<class InputIterator > Point_d::Point_d(int d, InputIterator first, InputIterator last) @endcode
+ * @code template<class InputIterator > Point_d::Point_d(InputIterator first, InputIterator last) @endcode
*
- * where d is the point dimension.
*/
void point(const std::vector<double>& point) {
#ifdef DEBUG_TRACES
@@ -86,7 +85,7 @@ class Points_off_visitor_reader {
std::cout << std::endl;
#endif // DEBUG_TRACES
// Fill the point cloud
- point_cloud.push_back(Point_d(point.size(), point.begin(), point.end()));
+ point_cloud.push_back(Point_d(point.begin(), point.end()));
}
// Off_reader visitor maximal_face implementation - Only points are read
@@ -115,16 +114,16 @@ class Points_off_visitor_reader {
*
* where d is the point dimension.
*
- * \section Example
+ * \section pointoffioexample Example
*
- * This example loads points from an OFF file and builds a vector of CGAL points in dimension d.
+ * This example loads points from an OFF file and builds a vector of points (vector of double).
* Then, it is asked to display the points.
*
- * \include common/CGAL_points_off_reader.cpp
+ * \include common/example_vector_double_points_off_reader.cpp
*
* When launching:
*
- * \code $> ./cgaloffreader ../../data/points/alphacomplexdoc.off
+ * \code $> ./vector_double_off_reader ../../data/points/alphacomplexdoc.off
* \endcode
*
* the program output is:
diff --git a/include/gudhi/Rips_complex.h b/include/gudhi/Rips_complex.h
new file mode 100644
index 00000000..1e4b76a7
--- /dev/null
+++ b/include/gudhi/Rips_complex.h
@@ -0,0 +1,185 @@
+/* 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, Pawel Dlotko, Vincent Rouvreau
+ *
+ * Copyright (C) 2016 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 RIPS_COMPLEX_H_
+#define RIPS_COMPLEX_H_
+
+#include <gudhi/Debug_utils.h>
+#include <gudhi/graph_simplicial_complex.h>
+
+#include <boost/graph/adjacency_list.hpp>
+
+#include <iostream>
+#include <vector>
+#include <map>
+#include <string>
+#include <limits> // for numeric_limits
+#include <utility> // for pair<>
+
+
+namespace Gudhi {
+
+namespace rips_complex {
+
+/**
+ * \class Rips_complex
+ * \brief Rips complex data structure.
+ *
+ * \ingroup rips_complex
+ *
+ * \details
+ * The data structure is a one skeleton graph, or Rips graph, containing edges when the edge length is less or equal
+ * to a given threshold. Edge length is computed from a user given point cloud with a given distance function, or a
+ * distance matrix.
+ *
+ * \tparam Filtration_value is the type used to store the filtration values of the simplicial complex.
+ */
+template<typename Filtration_value>
+class Rips_complex {
+ public:
+ /**
+ * \brief Type of the one skeleton graph stored inside the Rips complex structure.
+ */
+ typedef typename boost::adjacency_list < boost::vecS, boost::vecS, boost::undirectedS
+ , boost::property < vertex_filtration_t, Filtration_value >
+ , boost::property < edge_filtration_t, Filtration_value >> OneSkeletonGraph;
+
+ private:
+ typedef int Vertex_handle;
+
+ public:
+ /** \brief Rips_complex constructor from a list of points.
+ *
+ * @param[in] points Range of points.
+ * @param[in] threshold Rips value.
+ * @param[in] distance distance function that returns a `Filtration_value` from 2 given points.
+ *
+ * \tparam ForwardPointRange must be a range for which `std::begin` and `std::end` return input iterators on a
+ * point.
+ *
+ * \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 ForwardPointRange, typename Distance >
+ Rips_complex(const ForwardPointRange& points, Filtration_value threshold, Distance distance) {
+ compute_proximity_graph(points, threshold, distance);
+ }
+
+ /** \brief Rips_complex constructor from a distance matrix.
+ *
+ * @param[in] distance_matrix Range of distances.
+ * @param[in] threshold Rips value.
+ *
+ * \tparam DistanceMatrix must have a `size()` method and on which `distance_matrix[i][j]` returns
+ * the distance between points \f$i\f$ and \f$j\f$ as long as \f$ 0 \leqslant i < j \leqslant
+ * distance\_matrix.size().\f$
+ */
+ template<typename DistanceMatrix>
+ Rips_complex(const DistanceMatrix& distance_matrix, Filtration_value threshold) {
+ compute_proximity_graph(boost::irange((size_t)0, distance_matrix.size()), threshold,
+ [&](size_t i, size_t j){return distance_matrix[j][i];});
+ }
+
+ /** \brief Initializes the simplicial complex from the Rips graph and expands it until a given maximal
+ * dimension.
+ *
+ * \tparam SimplicialComplexForRips must meet `SimplicialComplexForRips` concept.
+ *
+ * @param[in] complex SimplicialComplexForRips to be created.
+ * @param[in] dim_max graph expansion for Rips until this given maximal dimension.
+ * @exception std::invalid_argument In debug mode, if `complex.num_vertices()` does not return 0.
+ *
+ */
+ template <typename SimplicialComplexForRips>
+ void create_complex(SimplicialComplexForRips& complex, int dim_max) {
+ GUDHI_CHECK(complex.num_vertices() == 0,
+ std::invalid_argument("Rips_complex::create_complex - simplicial complex is not empty"));
+
+ // insert the proximity graph in the simplicial complex
+ complex.insert_graph(rips_skeleton_graph_);
+ // expand the graph until dimension dim_max
+ complex.expansion(dim_max);
+ }
+
+ private:
+ /** \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 ForwardPointRange, typename Distance >
+ void compute_proximity_graph(const ForwardPointRange& points, Filtration_value threshold,
+ Distance distance) {
+ std::vector< std::pair< Vertex_handle, Vertex_handle > > edges;
+ std::vector< Filtration_value > edges_fil;
+
+ // Compute 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.
+ // --------------------------------------------------------------------------------------------
+ // Creates the vector of edges and its filtration values (returned by distance function)
+ Vertex_handle idx_u = 0;
+ for (auto it_u = std::begin(points); it_u != std::end(points); ++it_u, ++idx_u) {
+ Vertex_handle idx_v = idx_u + 1;
+ for (auto it_v = it_u + 1; it_v != std::end(points); ++it_v, ++idx_v) {
+ Filtration_value fil = distance(*it_u, *it_v);
+ if (fil <= threshold) {
+ edges.emplace_back(idx_u, idx_v);
+ edges_fil.push_back(fil);
+ }
+ }
+ }
+
+ // --------------------------------------------------------------------------------------------
+ // Creates the proximity graph from edges and sets the property with the filtration value.
+ // Number of points is labeled from 0 to idx_u-1
+ // --------------------------------------------------------------------------------------------
+ // Do not use : rips_skeleton_graph_ = OneSkeletonGraph(...) -> deep copy of the graph (boost graph is not
+ // move-enabled)
+ rips_skeleton_graph_.~OneSkeletonGraph();
+ new(&rips_skeleton_graph_)OneSkeletonGraph(edges.begin(), edges.end(), edges_fil.begin(), idx_u);
+
+ auto vertex_prop = boost::get(vertex_filtration_t(), rips_skeleton_graph_);
+
+ using vertex_iterator = typename boost::graph_traits<OneSkeletonGraph>::vertex_iterator;
+ vertex_iterator vi, vi_end;
+ for (std::tie(vi, vi_end) = boost::vertices(rips_skeleton_graph_);
+ vi != vi_end; ++vi) {
+ boost::put(vertex_prop, *vi, 0.);
+ }
+ }
+
+ private:
+ OneSkeletonGraph rips_skeleton_graph_;
+};
+
+} // namespace rips_complex
+
+} // namespace Gudhi
+
+#endif // RIPS_COMPLEX_H_
diff --git a/include/gudhi/Simplex_tree.h b/include/gudhi/Simplex_tree.h
index 63e3f0e5..317bce23 100644
--- a/include/gudhi/Simplex_tree.h
+++ b/include/gudhi/Simplex_tree.h
@@ -1029,7 +1029,7 @@ class Simplex_tree {
Dictionary_it next = siblings->members().begin();
++next;
- static std::vector<std::pair<Vertex_handle, Node> > inter; // static, not thread-safe.
+ thread_local std::vector<std::pair<Vertex_handle, Node> > inter;
for (Dictionary_it s_h = siblings->members().begin();
s_h != siblings->members().end(); ++s_h, ++next) {
Simplex_handle root_sh = find_vertex(s_h->first);
diff --git a/include/gudhi/Skeleton_blocker.h b/include/gudhi/Skeleton_blocker.h
index 822282fd..32fe411c 100644
--- a/include/gudhi/Skeleton_blocker.h
+++ b/include/gudhi/Skeleton_blocker.h
@@ -1,24 +1,24 @@
- /* 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): David Salinas
- *
- * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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/>.
- */
+/* 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): David Salinas
+ *
+ * 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/>.
+ */
#ifndef SKELETON_BLOCKER_H_
#define SKELETON_BLOCKER_H_
@@ -37,11 +37,12 @@ namespace Gudhi {
namespace skeleton_blocker {
-/** \defgroup skbl Skeleton-Blocker
+/** \defgroup skbl Skeleton-Blocker
+@{
\author David Salinas
-\section Introduction
+\section skblintroduction Introduction
The Skeleton-Blocker data-structure proposes a light encoding for simplicial complexes by storing only an *implicit* representation of its
simplices
\cite socg_blockers_2011,\cite blockers2012.
@@ -52,7 +53,7 @@ This data-structure handles all simplicial complexes operations such as
are operations that do not require simplex enumeration such as edge iteration, link computation or simplex contraction.
-\section Definitions
+\section skbldefinitions Definitions
We recall briefly classical definitions of simplicial complexes
\cite Munkres-elementsalgtop1984.
@@ -63,7 +64,7 @@ when \f$ \tau \neq \sigma\f$ we say that \f$ \tau\f$ is a proper-face of \f$ \si
An abstract simplicial complex is a set of simplices that contains all the faces of its simplices.
The 1-skeleton of a simplicial complex (or its graph) consists of its elements of dimension lower than 2.
-*\image html "ds_representation.png" "Skeleton-blocker representation" width=20cm
+ *\image html "ds_representation.png" "Skeleton-blocker representation" width=20cm
To encode, a simplicial complex, one can encodes all its simplices.
@@ -85,7 +86,7 @@ in next figure. Storing the graph and blockers of such simplicial complexes is m
their simplices.
-*\image html "blockers_curve.png" "Number of blockers of random triangulations of 3-spheres" width=10cm
+ *\image html "blockers_curve.png" "Number of blockers of random triangulations of 3-spheres" width=10cm
@@ -107,7 +108,7 @@ and point access in addition.
-\subsection Visitor
+\subsection skblvisitor Visitor
The class Skeleton_blocker_complex has a visitor that is called when usual operations such as adding an edge or remove a vertex are called.
You may want to use this visitor to compute statistics or to update another data-structure (for instance this visitor is heavily used in the \ref contr package).
@@ -115,7 +116,7 @@ You may want to use this visitor to compute statistics or to update another data
-\section Example
+\section skblexample Example
\subsection Iterating Iterating through vertices, edges, blockers and simplices
@@ -127,46 +128,46 @@ such as the Simplex Tree. The following example computes the Euler Characteristi
of a simplicial complex.
\code{.cpp}
- typedef Skeleton_blocker_complex<Skeleton_blocker_simple_traits> Complex;
- typedef Complex::Vertex_handle Vertex_handle;
- typedef Complex::Simplex Simplex;
-
- const int n = 15;
-
- // build a full complex with 10 vertices and 2^n-1 simplices
- Complex complex;
- for(int i=0;i<n;i++)
- complex.add_vertex();
- for(int i=0;i<n;i++)
- for(int j=0;j<i;j++)
- complex.add_edge_without_blockers(Vertex_handle(i),Vertex_handle(j));
-
- // this is just to illustrate iterators, to count number of vertices
- // or edges, complex.num_vertices() and complex.num_edges() are
- // more appropriated!
- unsigned num_vertices = 0;
- for(auto v : complex.vertex_range()){
- ++num_vertices;
- }
-
- unsigned num_edges = 0;
- for(auto e : complex.edge_range())
- ++num_edges;
-
- unsigned euler = 0;
- unsigned num_simplices = 0;
- // we use a reference to a simplex instead of a copy
- // value here because a simplex is a set of integers
- // and copying it cost time
- for(const Simplex & s : complex.star_simplex_range()){
- ++num_simplices;
- if(s.dimension()%2 == 0)
- euler += 1;
- else
- euler -= 1;
- }
- std::cout << "Saw "<<num_vertices<<" vertices, "<<num_edges<<" edges and "<<num_simplices<<" simplices"<<std::endl;
- std::cout << "The Euler Characteristic is "<<euler<<std::endl;
+ typedef Skeleton_blocker_complex<Skeleton_blocker_simple_traits> Complex;
+ typedef Complex::Vertex_handle Vertex_handle;
+ typedef Complex::Simplex Simplex;
+
+ const int n = 15;
+
+ // build a full complex with 10 vertices and 2^n-1 simplices
+ Complex complex;
+ for(int i=0;i<n;i++)
+ complex.add_vertex();
+ for(int i=0;i<n;i++)
+ for(int j=0;j<i;j++)
+ complex.add_edge_without_blockers(Vertex_handle(i),Vertex_handle(j));
+
+ // this is just to illustrate iterators, to count number of vertices
+ // or edges, complex.num_vertices() and complex.num_edges() are
+ // more appropriated!
+ unsigned num_vertices = 0;
+ for(auto v : complex.vertex_range()){
+ ++num_vertices;
+ }
+
+ unsigned num_edges = 0;
+ for(auto e : complex.edge_range())
+ ++num_edges;
+
+ unsigned euler = 0;
+ unsigned num_simplices = 0;
+ // we use a reference to a simplex instead of a copy
+ // value here because a simplex is a set of integers
+ // and copying it cost time
+ for(const Simplex & s : complex.star_simplex_range()){
+ ++num_simplices;
+ if(s.dimension()%2 == 0)
+ euler += 1;
+ else
+ euler -= 1;
+ }
+ std::cout << "Saw "<<num_vertices<<" vertices, "<<num_edges<<" edges and "<<num_simplices<<" simplices"<<std::endl;
+ std::cout << "The Euler Characteristic is "<<euler<<std::endl;
\endcode
@@ -181,43 +182,43 @@ The Euler Characteristic is 1
\subsection s Constructing a skeleton-blockers from a list of maximal faces or from a list of faces
\code{.cpp}
- std::vector<Simplex> simplices;
-
- //add 4 triangles of a tetrahedron 0123
- simplices.push_back(Simplex(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2)));
- simplices.push_back(Simplex(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3)));
- simplices.push_back(Simplex(Vertex_handle(3),Vertex_handle(0),Vertex_handle(2)));
- simplices.push_back(Simplex(Vertex_handle(3),Vertex_handle(0),Vertex_handle(1)));
-
- Complex complex;
- //get complex from top faces
- make_complex_from_top_faces(complex,simplices.begin(),simplices.end());
-
- std::cout << "Simplices:"<<std::endl;
- for(const Simplex & s : complex.star_simplex_range())
- std::cout << s << " ";
- std::cout << std::endl;
-
- //One blocker as simplex 0123 is not in the complex but all its proper faces are.
- std::cout << "Blockers: "<<complex.blockers_to_string()<<std::endl;
-
- //now build a complex from its full list of simplices
- simplices.clear();
- simplices.push_back(Simplex(Vertex_handle(0)));
- simplices.push_back(Simplex(Vertex_handle(1)));
- simplices.push_back(Simplex(Vertex_handle(2)));
- simplices.push_back(Simplex(Vertex_handle(0),Vertex_handle(1)));
- simplices.push_back(Simplex(Vertex_handle(1),Vertex_handle(2)));
- simplices.push_back(Simplex(Vertex_handle(2),Vertex_handle(0)));
- complex = Complex(simplices.begin(),simplices.end());
-
- std::cout << "Simplices:"<<std::endl;
- for(const Simplex & s : complex.star_simplex_range())
- std::cout << s << " ";
- std::cout << std::endl;
-
- //One blocker as simplex 012 is not in the complex but all its proper faces are.
- std::cout << "Blockers: "<<complex.blockers_to_string()<<std::endl;
+ std::vector<Simplex> simplices;
+
+ //add 4 triangles of a tetrahedron 0123
+ simplices.push_back(Simplex(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2)));
+ simplices.push_back(Simplex(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3)));
+ simplices.push_back(Simplex(Vertex_handle(3),Vertex_handle(0),Vertex_handle(2)));
+ simplices.push_back(Simplex(Vertex_handle(3),Vertex_handle(0),Vertex_handle(1)));
+
+ Complex complex;
+ //get complex from top faces
+ make_complex_from_top_faces(complex,simplices.begin(),simplices.end());
+
+ std::cout << "Simplices:"<<std::endl;
+ for(const Simplex & s : complex.star_simplex_range())
+ std::cout << s << " ";
+ std::cout << std::endl;
+
+ //One blocker as simplex 0123 is not in the complex but all its proper faces are.
+ std::cout << "Blockers: "<<complex.blockers_to_string()<<std::endl;
+
+ //now build a complex from its full list of simplices
+ simplices.clear();
+ simplices.push_back(Simplex(Vertex_handle(0)));
+ simplices.push_back(Simplex(Vertex_handle(1)));
+ simplices.push_back(Simplex(Vertex_handle(2)));
+ simplices.push_back(Simplex(Vertex_handle(0),Vertex_handle(1)));
+ simplices.push_back(Simplex(Vertex_handle(1),Vertex_handle(2)));
+ simplices.push_back(Simplex(Vertex_handle(2),Vertex_handle(0)));
+ complex = Complex(simplices.begin(),simplices.end());
+
+ std::cout << "Simplices:"<<std::endl;
+ for(const Simplex & s : complex.star_simplex_range())
+ std::cout << s << " ";
+ std::cout << std::endl;
+
+ //One blocker as simplex 012 is not in the complex but all its proper faces are.
+ std::cout << "Blockers: "<<complex.blockers_to_string()<<std::endl;
\endcode
\verbatim
./SkeletonBlockerFromSimplices
@@ -236,12 +237,12 @@ The author wishes to thank Dominique Attali and André Lieutier for
their collaboration to write the two initial papers
\cite socg_blockers_2011,\cite blockers2012
about this data-structure
- and also Dominique for leaving him use a prototype.
+ and also Dominique for leaving him use a prototype.
-\copyright GNU General Public License v3.
-*/
-/** @} */ // end defgroup
+\copyright GNU General Public License v3.
+
+@} */
} // namespace skeleton_blocker
diff --git a/include/gudhi/Skeleton_blocker/Skeleton_blocker_complex_visitor.h b/include/gudhi/Skeleton_blocker/Skeleton_blocker_complex_visitor.h
index 32f40a4b..ba3636bc 100644
--- a/include/gudhi/Skeleton_blocker/Skeleton_blocker_complex_visitor.h
+++ b/include/gudhi/Skeleton_blocker/Skeleton_blocker_complex_visitor.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
@@ -19,6 +19,7 @@
* 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 SKELETON_BLOCKER_SKELETON_BLOCKER_COMPLEX_VISITOR_H_
#define SKELETON_BLOCKER_SKELETON_BLOCKER_COMPLEX_VISITOR_H_
@@ -27,7 +28,7 @@
namespace Gudhi {
namespace skeleton_blocker {
-// todo rajouter les const
+// TODO(DS): to be constified
/**
*@class Skeleton_blocker_complex_visitor
@@ -36,7 +37,7 @@ namespace skeleton_blocker {
template<typename Vertex_handle>
class Skeleton_blocker_complex_visitor {
public:
- virtual ~Skeleton_blocker_complex_visitor() {}
+ virtual ~Skeleton_blocker_complex_visitor() { }
virtual void on_add_vertex(Vertex_handle) = 0;
virtual void on_remove_vertex(Vertex_handle) = 0;
@@ -61,9 +62,9 @@ class Skeleton_blocker_complex_visitor {
virtual void on_swaped_edge(Vertex_handle a, Vertex_handle b,
Vertex_handle x) = 0;
virtual void on_add_blocker(
- const Skeleton_blocker_simplex<Vertex_handle>&) = 0;
+ const Skeleton_blocker_simplex<Vertex_handle>&) = 0;
virtual void on_delete_blocker(
- const Skeleton_blocker_simplex<Vertex_handle>*) = 0;
+ const Skeleton_blocker_simplex<Vertex_handle>*) = 0;
};
/**
@@ -73,24 +74,23 @@ class Skeleton_blocker_complex_visitor {
*/
template<typename Vertex_handle>
class Dummy_complex_visitor : public Skeleton_blocker_complex_visitor<
- Vertex_handle> {
+Vertex_handle> {
public:
- void on_add_vertex(Vertex_handle) {
- }
- void on_remove_vertex(Vertex_handle) {
- }
- void on_add_edge_without_blockers(Vertex_handle a, Vertex_handle b) {
- }
- void on_remove_edge(Vertex_handle a, Vertex_handle b) {
- }
- void on_changed_edge(Vertex_handle a, Vertex_handle b) {
- }
- void on_swaped_edge(Vertex_handle a, Vertex_handle b, Vertex_handle x) {
- }
- void on_add_blocker(const Skeleton_blocker_simplex<Vertex_handle>&) {
- }
- void on_delete_blocker(const Skeleton_blocker_simplex<Vertex_handle>*) {
- }
+ void on_add_vertex(Vertex_handle) { }
+
+ void on_remove_vertex(Vertex_handle) { }
+
+ void on_add_edge_without_blockers(Vertex_handle a, Vertex_handle b) { }
+
+ void on_remove_edge(Vertex_handle a, Vertex_handle b) { }
+
+ void on_changed_edge(Vertex_handle a, Vertex_handle b) { }
+
+ void on_swaped_edge(Vertex_handle a, Vertex_handle b, Vertex_handle x) { }
+
+ void on_add_blocker(const Skeleton_blocker_simplex<Vertex_handle>&) { }
+
+ void on_delete_blocker(const Skeleton_blocker_simplex<Vertex_handle>*) { }
};
/**
@@ -100,29 +100,36 @@ class Dummy_complex_visitor : public Skeleton_blocker_complex_visitor<
*/
template<typename Vertex_handle>
class Print_complex_visitor : public Skeleton_blocker_complex_visitor<
- Vertex_handle> {
+Vertex_handle> {
public:
void on_add_vertex(Vertex_handle v) {
std::cerr << "on_add_vertex:" << v << std::endl;
}
+
void on_remove_vertex(Vertex_handle v) {
std::cerr << "on_remove_vertex:" << v << std::endl;
}
+
void on_add_edge_without_blockers(Vertex_handle a, Vertex_handle b) {
std::cerr << "on_add_edge_without_blockers:" << a << "," << b << std::endl;
}
+
void on_remove_edge(Vertex_handle a, Vertex_handle b) {
std::cerr << "on_remove_edge:" << a << "," << b << std::endl;
}
+
void on_changed_edge(Vertex_handle a, Vertex_handle b) {
std::cerr << "on_changed_edge:" << a << "," << b << std::endl;
}
+
void on_swaped_edge(Vertex_handle a, Vertex_handle b, Vertex_handle x) {
std::cerr << "on_swaped_edge:" << a << "," << b << "," << x << std::endl;
}
+
void on_add_blocker(const Skeleton_blocker_simplex<Vertex_handle>& b) {
std::cerr << "on_add_blocker:" << b << std::endl;
}
+
void on_delete_blocker(const Skeleton_blocker_simplex<Vertex_handle>* b) {
std::cerr << "on_delete_blocker:" << b << std::endl;
}
diff --git a/include/gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.h b/include/gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.h
index 3bfb5d11..d4b60613 100644
--- a/include/gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.h
+++ b/include/gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.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
@@ -19,6 +19,7 @@
* 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 SKELETON_BLOCKER_SKELETON_BLOCKER_LINK_SUPERIOR_H_
#define SKELETON_BLOCKER_SKELETON_BLOCKER_LINK_SUPERIOR_H_
@@ -36,7 +37,7 @@ template<class ComplexType> class Skeleton_blocker_sub_complex;
*/
template<typename ComplexType>
class Skeleton_blocker_link_superior : public Skeleton_blocker_link_complex<
- ComplexType> {
+ComplexType> {
typedef typename ComplexType::Edge_handle Edge_handle;
typedef typename ComplexType::boost_vertex_handle boost_vertex_handle;
@@ -54,20 +55,17 @@ class Skeleton_blocker_link_superior : public Skeleton_blocker_link_complex<
typedef typename ComplexType::Root_simplex_handle::Simplex_vertex_const_iterator IdSimplexConstIterator;
Skeleton_blocker_link_superior()
- : Skeleton_blocker_link_complex<ComplexType>(true) {
- }
+ : Skeleton_blocker_link_complex<ComplexType>(true) { }
Skeleton_blocker_link_superior(const ComplexType & parent_complex,
Simplex& alpha_parent_adress)
: Skeleton_blocker_link_complex<ComplexType>(parent_complex,
- alpha_parent_adress, true) {
- }
+ alpha_parent_adress, true) { }
Skeleton_blocker_link_superior(const ComplexType & parent_complex,
Vertex_handle a_parent_adress)
: Skeleton_blocker_link_complex<ComplexType>(parent_complex,
- a_parent_adress, true) {
- }
+ a_parent_adress, true) { }
};
} // namespace skeleton_blocker
diff --git a/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h b/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h
index ba46c49e..747e60f1 100644
--- a/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h
+++ b/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.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
@@ -19,6 +19,7 @@
* 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 SKELETON_BLOCKER_SKELETON_BLOCKER_OFF_IO_H_
#define SKELETON_BLOCKER_SKELETON_BLOCKER_OFF_IO_H_
@@ -49,8 +50,8 @@ class Skeleton_blocker_off_flag_visitor_reader {
load_only_points_(load_only_points) { }
void init(int dim, int num_vertices, int num_faces, int num_edges) {
- // todo do an assert to check that this number are correctly read
- // todo reserve size for vector points
+ // TODO(DS): do an assert to check that this number are correctly read
+ // TODO(DS): reserve size for vector points
}
void point(const std::vector<double>& point) {
@@ -108,7 +109,7 @@ class Skeleton_blocker_off_visitor_reader {
void done() {
complex_ = make_complex_from_top_faces<Complex>(maximal_faces_.begin(), maximal_faces_.end(),
- points_.begin(), points_.end() );
+ points_.begin(), points_.end());
}
};
@@ -140,7 +141,7 @@ class Skeleton_blocker_off_reader {
}
/**
- * return true iff reading did not meet problems.
+ * return true if reading did not meet problems.
*/
bool is_valid() const {
return valid_;
diff --git a/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h b/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h
index fb4a1106..275376e6 100644
--- a/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h
+++ b/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.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
@@ -19,6 +19,7 @@
* 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 SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_GEOMETRIC_TRAITS_H_
#define SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_GEOMETRIC_TRAITS_H_
@@ -39,7 +40,7 @@ namespace skeleton_blocker {
*/
template<typename GeometryTrait>
struct Skeleton_blocker_simple_geometric_traits :
- public Skeleton_blocker_simple_traits {
+public Skeleton_blocker_simple_traits {
public:
typedef GeometryTrait GT;
typedef typename GT::Point Point;
@@ -57,19 +58,20 @@ struct Skeleton_blocker_simple_geometric_traits :
Point& point() {
return point_;
}
+
const Point& point() const {
return point_;
}
};
class Simple_geometric_edge :
- public Skeleton_blocker_simple_traits::Graph_edge {
+ public Skeleton_blocker_simple_traits::Graph_edge {
int index_;
public:
Simple_geometric_edge()
: Skeleton_blocker_simple_traits::Graph_edge(),
- index_(-1) {
- }
+ index_(-1) { }
+
/**
* @brief Allows to modify the index of the edge.
* The indices of the edge are used to store heap information
@@ -78,6 +80,7 @@ struct Skeleton_blocker_simple_geometric_traits :
int& index() {
return index_;
}
+
int index() const {
return index_;
}
diff --git a/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h b/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h
index 31bec3b6..3835cf77 100644
--- a/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h
+++ b/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.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
@@ -19,6 +19,7 @@
* 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 SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_TRAITS_H_
#define SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_TRAITS_H_
@@ -48,9 +49,9 @@ struct Skeleton_blocker_simple_traits {
*/
struct Root_vertex_handle {
typedef int boost_vertex_handle;
+
explicit Root_vertex_handle(boost_vertex_handle val = -1)
- : vertex(val) {
- }
+ : vertex(val) { }
boost_vertex_handle vertex;
bool operator!=(const Root_vertex_handle& other) const {
@@ -65,8 +66,8 @@ struct Skeleton_blocker_simple_traits {
return this->vertex < other.vertex;
}
- friend std::ostream& operator <<(std::ostream& o,
- const Root_vertex_handle & v) {
+ friend std::ostream& operator<<(std::ostream& o,
+ const Root_vertex_handle & v) {
o << v.vertex;
return o;
}
@@ -74,11 +75,13 @@ struct Skeleton_blocker_simple_traits {
struct Vertex_handle {
typedef int boost_vertex_handle;
+
explicit Vertex_handle(boost_vertex_handle val = -1)
- : vertex(val) {
- }
+ : vertex(val) { }
- operator int() const { return static_cast<int>(vertex); }
+ operator int() const {
+ return static_cast<int> (vertex);
+ }
boost_vertex_handle vertex;
@@ -94,7 +97,7 @@ struct Skeleton_blocker_simple_traits {
return this->vertex < other.vertex;
}
- friend std::ostream& operator <<(std::ostream& o, const Vertex_handle & v) {
+ friend std::ostream& operator<<(std::ostream& o, const Vertex_handle & v) {
o << v.vertex;
return o;
}
@@ -105,21 +108,24 @@ struct Skeleton_blocker_simple_traits {
Root_vertex_handle id_;
public:
- virtual ~Graph_vertex() {
- }
+ virtual ~Graph_vertex() { }
void activate() {
is_active_ = true;
}
+
void deactivate() {
is_active_ = false;
}
+
bool is_active() const {
return is_active_;
}
+
void set_id(Root_vertex_handle i) {
id_ = i;
}
+
Root_vertex_handle get_id() const {
return id_;
}
@@ -130,7 +136,7 @@ struct Skeleton_blocker_simple_traits {
return res.str();
}
- friend std::ostream& operator <<(std::ostream& o, const Graph_vertex & v) {
+ friend std::ostream& operator<<(std::ostream& o, const Graph_vertex & v) {
o << v.to_string();
return o;
}
@@ -144,13 +150,13 @@ struct Skeleton_blocker_simple_traits {
public:
Graph_edge()
: a_(-1),
- b_(-1),
- index_(-1) {
- }
+ b_(-1),
+ index_(-1) { }
int& index() {
return index_;
}
+
int index() const {
return index_;
}
@@ -168,7 +174,7 @@ struct Skeleton_blocker_simple_traits {
return b_;
}
- friend std::ostream& operator <<(std::ostream& o, const Graph_edge & v) {
+ friend std::ostream& operator<<(std::ostream& o, const Graph_edge & v) {
o << "(" << v.a_ << "," << v.b_ << " - id = " << v.index();
return o;
}
diff --git a/include/gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h b/include/gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h
index 3c7f1dd5..aa6f2215 100644
--- a/include/gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h
+++ b/include/gudhi/Skeleton_blocker/Skeleton_blocker_simplex.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
@@ -63,7 +63,6 @@ class Skeleton_blocker_simplex {
*/
//@{
- // Skeleton_blocker_simplex():simplex_set() {}
void clear() {
simplex_set.clear();
}
@@ -89,8 +88,7 @@ class Skeleton_blocker_simplex {
add_vertex(v);
}
- void add_vertices() {
- }
+ void add_vertices() { }
/**
* Initialize a simplex with a string such as {0,1,2}
@@ -192,7 +190,6 @@ class Skeleton_blocker_simplex {
return simplex_set.crend();
}
-
typename std::set<T>::iterator begin() {
return simplex_set.begin();
}
@@ -236,6 +233,7 @@ class Skeleton_blocker_simplex {
assert(!empty());
return *(simplex_set.rbegin());
}
+
/**
* @return true iff the simplex contains the simplex a.
*/
@@ -351,8 +349,8 @@ class Skeleton_blocker_simplex {
//@}
- friend std::ostream& operator <<(std::ostream& o,
- const Skeleton_blocker_simplex & sigma) {
+ friend std::ostream& operator<<(std::ostream& o,
+ const Skeleton_blocker_simplex & sigma) {
bool first = true;
o << "{";
for (auto i : sigma) {
diff --git a/include/gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h b/include/gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h
index 196fe8c0..fadf6619 100644
--- a/include/gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h
+++ b/include/gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.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
@@ -159,7 +159,7 @@ class Skeleton_blocker_sub_complex : public ComplexType {
if (simplex.contains(*blocker)) {
Root_simplex_handle blocker_root(parent_complex.get_id(*(blocker)));
Simplex blocker_restr(
- *(this->get_simplex_address(blocker_root)));
+ *(this->get_simplex_address(blocker_root)));
this->add_blocker(new Simplex(blocker_restr));
}
}
@@ -190,14 +190,15 @@ class Skeleton_blocker_sub_complex : public ComplexType {
// */
// boost::optional<Simplex> get_address(const Root_simplex_handle & s) const;
-// private:
+ // private:
/**
* same as get_address except that it will return a simplex in any case.
* The vertices that were not found are not added.
*/
// @remark should be private but problem with VS
+
std::vector<boost::optional<Vertex_handle> > get_addresses(
- const Root_simplex_handle & s) const {
+ const Root_simplex_handle & s) const {
std::vector < boost::optional<Vertex_handle> > res;
for (auto i : s) {
res.push_back(get_address(i));
@@ -214,14 +215,14 @@ class Skeleton_blocker_sub_complex : public ComplexType {
*/
template<typename ComplexType>
bool proper_face_in_union(
- Skeleton_blocker_sub_complex<ComplexType> & link,
- std::vector<boost::optional<typename ComplexType::Vertex_handle> > & addresses_sigma_in_link,
- int vertex_to_be_ignored) {
+ Skeleton_blocker_sub_complex<ComplexType> & link,
+ std::vector<boost::optional<typename ComplexType::Vertex_handle> > & addresses_sigma_in_link,
+ std::size_t vertex_to_be_ignored) {
// we test that all vertices of 'addresses_sigma_in_link' but 'vertex_to_be_ignored'
// are in link1 if it is the case we construct the corresponding simplex
bool vertices_sigma_are_in_link = true;
typename ComplexType::Simplex sigma_in_link;
- for (int i = 0; i < addresses_sigma_in_link.size(); ++i) {
+ for (std::size_t i = 0; i < addresses_sigma_in_link.size(); ++i) {
if (i != vertex_to_be_ignored) {
if (!addresses_sigma_in_link[i]) {
vertices_sigma_are_in_link = false;
@@ -236,43 +237,24 @@ bool proper_face_in_union(
return vertices_sigma_are_in_link && link.contains(sigma_in_link);
}
-/*
- template<typename ComplexType>
- bool
- proper_faces_in_union(Skeleton_blocker_simplex<typename ComplexType::Root_vertex_handle> & sigma, Skeleton_blocker_sub_complex<ComplexType> & link1, Skeleton_blocker_sub_complex<ComplexType> & link2)
- {
- typedef typename ComplexType::Vertex_handle Vertex_handle;
- std::vector<boost::optional<Vertex_handle> > addresses_sigma_in_link1 = link1.get_addresses(sigma);
- std::vector<boost::optional<Vertex_handle> > addresses_sigma_in_link2 = link2.get_addresses(sigma);
-
- for (int current_index = 0; current_index < addresses_sigma_in_link1.size(); ++current_index)
- {
-
- if (!proper_face_in_union(link1, addresses_sigma_in_link1, current_index)
- && !proper_face_in_union(link2, addresses_sigma_in_link2, current_index)){
- return false;
- }
- }
- return true;
- }*/
-
// Remark: this function should be friend in order to leave get_adresses private
// however doing so seemes currently not possible due to a visual studio bug c2668
// "the compiler does not support partial ordering of template functions as specified in the C++ Standard"
// http://www.serkey.com/error-c2668-ambiguous-call-to-overloaded-function-bb45ft.html
+
template<typename ComplexType>
bool proper_faces_in_union(
- Skeleton_blocker_simplex<typename ComplexType::Root_vertex_handle> & sigma,
- Skeleton_blocker_sub_complex<ComplexType> & link1,
- Skeleton_blocker_sub_complex<ComplexType> & link2) {
+ Skeleton_blocker_simplex<typename ComplexType::Root_vertex_handle> & sigma,
+ Skeleton_blocker_sub_complex<ComplexType> & link1,
+ Skeleton_blocker_sub_complex<ComplexType> & link2) {
typedef typename ComplexType::Vertex_handle Vertex_handle;
std::vector < boost::optional<Vertex_handle> > addresses_sigma_in_link1 =
link1.get_addresses(sigma);
std::vector < boost::optional<Vertex_handle> > addresses_sigma_in_link2 =
link2.get_addresses(sigma);
- for (int current_index = 0; current_index < addresses_sigma_in_link1.size();
- ++current_index) {
+ for (std::size_t current_index = 0; current_index < addresses_sigma_in_link1.size();
+ ++current_index) {
if (!proper_face_in_union(link1, addresses_sigma_in_link1, current_index)
&& !proper_face_in_union(link2, addresses_sigma_in_link2,
current_index)) {
@@ -289,4 +271,3 @@ namespace skbl = skeleton_blocker;
} // namespace Gudhi
#endif // SKELETON_BLOCKER_SKELETON_BLOCKER_SUB_COMPLEX_H_
-
diff --git a/include/gudhi/Skeleton_blocker/internal/Top_faces.h b/include/gudhi/Skeleton_blocker/internal/Top_faces.h
index 39d95661..2b681752 100644
--- a/include/gudhi/Skeleton_blocker/internal/Top_faces.h
+++ b/include/gudhi/Skeleton_blocker/internal/Top_faces.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
@@ -19,6 +19,7 @@
* 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 SKELETON_BLOCKER_INTERNAL_TOP_FACES_H_
#define SKELETON_BLOCKER_INTERNAL_TOP_FACES_H_
@@ -69,4 +70,4 @@ namespace skbl = skeleton_blocker;
} // namespace Gudhi
-#endif // SKELETON_BLOCKER_INTERNAL_TOP_FACES_H_
+#endif // SKELETON_BLOCKER_INTERNAL_TOP_FACES_H_
diff --git a/include/gudhi/Skeleton_blocker/internal/Trie.h b/include/gudhi/Skeleton_blocker/internal/Trie.h
index cdc47b8a..2c9602fa 100644
--- a/include/gudhi/Skeleton_blocker/internal/Trie.h
+++ b/include/gudhi/Skeleton_blocker/internal/Trie.h
@@ -4,7 +4,7 @@
*
* Author(s): David Salinas
*
- * Copyright (C) 2014 INRIA Sophia Antipolis-Méditerranée (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
@@ -21,7 +21,6 @@
*
*/
-
#ifndef SKELETON_BLOCKER_INTERNAL_TRIE_H_
#define SKELETON_BLOCKER_INTERNAL_TRIE_H_
@@ -148,7 +147,7 @@ struct Trie {
}
void remove_leaf() {
- assert(is_leaf);
+ assert(is_leaf());
if (!is_root())
parent_->childs.erase(this);
}
@@ -240,7 +239,7 @@ struct Tries {
std::vector<Simplex> next_dimension_simplices() const {
std::vector<Simplex> res;
- while (!to_see_.empty() && to_see_.front()->simplex().dimension() == current_dimension_) {
+ while (!(to_see_.empty()) && (to_see_.front()->simplex().dimension() == current_dimension_)) {
res.emplace_back(to_see_.front()->simplex());
for (auto child : to_see_.front()->childs)
to_see_.push_back(child.get());
@@ -257,7 +256,7 @@ struct Tries {
private:
mutable std::deque<STrie*> to_see_;
- mutable unsigned current_dimension_ = 0;
+ mutable int current_dimension_ = 0;
std::vector<STrie*> cofaces_;
};
diff --git a/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h b/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h
index 4dbc9ed3..d2fff960 100644
--- a/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h
+++ b/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.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
@@ -19,6 +19,7 @@
* 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 SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_BLOCKERS_ITERATORS_H_
#define SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_BLOCKERS_ITERATORS_H_
diff --git a/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h b/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h
index 15618932..b90dcf34 100644
--- a/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h
+++ b/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.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
@@ -19,6 +19,7 @@
* 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 SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_EDGES_ITERATORS_H_
#define SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_EDGES_ITERATORS_H_
diff --git a/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_iterators.h b/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_iterators.h
index cc3ed276..1351614f 100644
--- a/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_iterators.h
+++ b/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_iterators.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
diff --git a/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h b/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h
index 3b941be5..2acdb555 100644
--- a/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h
+++ b/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.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
@@ -19,6 +19,7 @@
* 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 SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_SIMPLICES_ITERATORS_H_
#define SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_SIMPLICES_ITERATORS_H_
@@ -68,10 +69,11 @@ public boost::iterator_facade < Simplex_around_vertex_iterator<SkeletonBlockerCo
Vertex_handle v;
std::shared_ptr<Link> link_v;
std::shared_ptr<Trie> trie;
- std::list<Trie*> nodes_to_be_seen; // todo deque
+ // TODO(DS): use a deque instead
+ std::list<Trie*> nodes_to_be_seen;
public:
- Simplex_around_vertex_iterator() : complex(0) {}
+ Simplex_around_vertex_iterator() : complex(0) { }
Simplex_around_vertex_iterator(const Complex* complex_, Vertex_handle v_) :
complex(complex_),
@@ -81,15 +83,16 @@ public boost::iterator_facade < Simplex_around_vertex_iterator<SkeletonBlockerCo
compute_trie_and_nodes_to_be_seen();
}
- // todo avoid useless copy
- // todo currently just work if copy begin iterator
+ // TODO(DS): avoid useless copy
+ // TODO(DS): currently just work if copy begin iterator
Simplex_around_vertex_iterator(const Simplex_around_vertex_iterator& other) :
complex(other.complex),
v(other.v),
link_v(other.link_v),
trie(other.trie),
nodes_to_be_seen(other.nodes_to_be_seen) {
- if (!other.is_end()) {}
+ if (!other.is_end()) {
+ }
}
/**
@@ -159,7 +162,8 @@ public boost::iterator_facade < Simplex_around_vertex_iterator<SkeletonBlockerCo
bool both_non_empty = !nodes_to_be_seen.empty() && !other.nodes_to_be_seen.empty();
- if (!both_non_empty) return false; // one is empty the other is not
+ // one is empty the other is not
+ if (!both_non_empty) return false;
bool same_node = (**(nodes_to_be_seen.begin()) == **(other.nodes_to_be_seen.begin()));
return same_node;
@@ -238,7 +242,6 @@ public boost::iterator_facade < Simplex_iterator<SkeletonBlockerComplex>
}
private:
- // todo return to private
Simplex_iterator(const Complex* complex, bool end) :
complex_(complex) {
set_end();
@@ -306,7 +309,7 @@ public boost::iterator_facade < Simplex_iterator<SkeletonBlockerComplex>
/**
* Iterator through the maximal faces of the coboundary of a simplex.
- */
+ */
template<typename SkeletonBlockerComplex, typename Link>
class Simplex_coboundary_iterator :
public boost::iterator_facade < Simplex_coboundary_iterator<SkeletonBlockerComplex, Link>
@@ -329,12 +332,12 @@ public boost::iterator_facade < Simplex_coboundary_iterator<SkeletonBlockerCompl
Complex_vertex_iterator link_vertex_end;
public:
- Simplex_coboundary_iterator() : complex(0) {}
+ Simplex_coboundary_iterator() : complex(0) { }
Simplex_coboundary_iterator(const Complex* complex_, const Simplex& sigma_) :
complex(complex_),
sigma(sigma_),
- //need only vertices of the link hence the true flag
+ // need only vertices of the link hence the true flag
link(new Link(*complex_, sigma_, false, true)) {
auto link_vertex_range = link->vertex_range();
current_vertex = link_vertex_range.begin();
@@ -347,9 +350,9 @@ public boost::iterator_facade < Simplex_coboundary_iterator<SkeletonBlockerCompl
link(other.link),
current_vertex(other.current_vertex),
link_vertex_end(other.link_vertex_end) { }
-
+
// returns an iterator to the end
- Simplex_coboundary_iterator(const Complex* complex_,const Simplex& sigma_, bool end) :
+ Simplex_coboundary_iterator(const Complex* complex_, const Simplex& sigma_, bool end) :
complex(complex_),
sigma(sigma_) {
// to represent an end iterator without having to build a useless link, we use
@@ -361,7 +364,7 @@ public boost::iterator_facade < Simplex_coboundary_iterator<SkeletonBlockerCompl
return complex->convert_handle_from_another_complex(*link, link_vh);
}
-public:
+ public:
friend std::ostream& operator<<(std::ostream& stream, const Simplex_coboundary_iterator& sci) {
return stream;
}
@@ -369,8 +372,8 @@ public:
// assume that iterator points to the same complex and comes from the same simplex
bool equal(const Simplex_coboundary_iterator& other) const {
assert(complex == other.complex && sigma == other.sigma);
- if(is_end()) return other.is_end();
- if(other.is_end()) return is_end();
+ if (is_end()) return other.is_end();
+ if (other.is_end()) return is_end();
return *current_vertex == *(other.current_vertex);
}
@@ -384,13 +387,12 @@ public:
return res;
}
-private:
+ private:
bool is_end() const {
return !link || current_vertex == link_vertex_end;
}
};
-
} // namespace skeleton_blocker
namespace skbl = skeleton_blocker;
diff --git a/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_triangles_iterators.h b/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_triangles_iterators.h
index b2dd9a21..736941dd 100644
--- a/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_triangles_iterators.h
+++ b/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_triangles_iterators.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
@@ -19,6 +19,7 @@
* 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 SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_TRIANGLES_ITERATORS_H_
#define SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_TRIANGLES_ITERATORS_H_
@@ -135,7 +136,7 @@ typename SkeletonBlockerComplex::Simplex const
Triangle_iterator(const SkeletonBlockerComplex* complex) :
complex_(complex),
current_vertex_(complex->vertex_range().begin()),
- current_triangle_(complex, *current_vertex_), // xxx this line is problematic is the complex is empty
+ current_triangle_(complex, *current_vertex_), // this line is problematic is the complex is empty
is_end_(false) {
assert(!complex->empty());
gotoFirstTriangle();
@@ -172,7 +173,8 @@ typename SkeletonBlockerComplex::Simplex const
bool both_arent_finished = !is_finished() && !other.is_finished();
// if the two iterators are not finished, they must have the same state
return (complex_ == other.complex_) && (both_are_finished || ((both_arent_finished) &&
- current_vertex_ == other.current_vertex_ && current_triangle_ == other.current_triangle_));
+ current_vertex_ == other.current_vertex_ &&
+ current_triangle_ == other.current_triangle_));
}
Simplex dereference() const {
@@ -183,8 +185,10 @@ typename SkeletonBlockerComplex::Simplex const
// goto the next vertex that has a triangle pending or the
// end vertex iterator if none exists
void goto_next_vertex() {
- assert(current_triangle_.finished()); // we mush have consume all triangles passing through the vertex
- assert(!is_finished()); // we must not be done
+ // we must have consume all triangles passing through the vertex
+ assert(current_triangle_.finished());
+ // we must not be done
+ assert(!is_finished());
++current_vertex_;
diff --git a/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_vertices_iterators.h b/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_vertices_iterators.h
index f06cab71..9e9ae961 100644
--- a/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_vertices_iterators.h
+++ b/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_vertices_iterators.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
@@ -19,6 +19,7 @@
* 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 SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_VERTICES_ITERATORS_H_
#define SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_VERTICES_ITERATORS_H_
@@ -103,7 +104,7 @@ class Vertex_iterator : public boost::iterator_facade< Vertex_iterator <Skeleton
};
template<typename SkeletonBlockerComplex>
-class Neighbors_vertices_iterator: public boost::iterator_facade < Neighbors_vertices_iterator<SkeletonBlockerComplex>
+class Neighbors_vertices_iterator : public boost::iterator_facade < Neighbors_vertices_iterator<SkeletonBlockerComplex>
, typename SkeletonBlockerComplex::Vertex_handle const
, boost::forward_traversal_tag
, typename SkeletonBlockerComplex::Vertex_handle const> {
@@ -122,9 +123,6 @@ class Neighbors_vertices_iterator: public boost::iterator_facade < Neighbors_ver
boost_adjacency_iterator end_;
public:
- // boost_adjacency_iterator ai, ai_end;
- // for (tie(ai, ai_end) = adjacent_vertices(v.vertex, skeleton); ai != ai_end; ++ai) {
-
Neighbors_vertices_iterator() : complex(NULL) { }
Neighbors_vertices_iterator(const Complex* complex_, Vertex_handle v_) :
@@ -157,7 +155,7 @@ class Neighbors_vertices_iterator: public boost::iterator_facade < Neighbors_ver
}
private:
- // todo remove this ugly hack
+ // TODO(DS): remove this ugly hack
void set_end() {
current_ = end_;
}
@@ -170,5 +168,3 @@ namespace skbl = skeleton_blocker;
} // namespace Gudhi
#endif // SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_VERTICES_ITERATORS_H_
-
-
diff --git a/include/gudhi/Skeleton_blocker_complex.h b/include/gudhi/Skeleton_blocker_complex.h
index 7a6d1d50..4f052ba5 100644
--- a/include/gudhi/Skeleton_blocker_complex.h
+++ b/include/gudhi/Skeleton_blocker_complex.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
@@ -211,7 +211,6 @@ class Skeleton_blocker_complex {
add_edge_without_blockers(e.first, e.second);
}
-
template<typename SimpleHandleOutputIterator>
void add_blockers(SimpleHandleOutputIterator simplices_begin, SimpleHandleOutputIterator simplices_end) {
Tries<Simplex> tries(num_vertices(), simplices_begin, simplices_end);
@@ -414,7 +413,8 @@ class Skeleton_blocker_complex {
/**
*/
bool contains_vertex(Vertex_handle u) const {
- if (u.vertex < 0 || u.vertex >= boost::num_vertices(skeleton))
+ Vertex_handle num_vertices(boost::num_vertices(skeleton));
+ if (u.vertex < 0 || u.vertex >= num_vertices)
return false;
return (*this)[u].is_active();
}
@@ -441,11 +441,11 @@ class Skeleton_blocker_complex {
* @brief Given an Id return the address of the vertex having this Id in the complex.
* @remark For a simplicial complex, the address is the id but it may not be the case for a SubComplex.
*/
- virtual boost::optional<Vertex_handle> get_address(
- Root_vertex_handle id) const {
+ virtual boost::optional<Vertex_handle> get_address(Root_vertex_handle id) const {
boost::optional<Vertex_handle> res;
- if (id.vertex < boost::num_vertices(skeleton))
- res = Vertex_handle(id.vertex); // xxx
+ int num_vertices = boost::num_vertices(skeleton);
+ if (id.vertex < num_vertices)
+ res = Vertex_handle(id.vertex);
return res;
}
@@ -560,7 +560,7 @@ class Skeleton_blocker_complex {
return res;
}
- /**
+ /**
* @brief Adds all edges of s in the complex.
*/
void add_edge(const Simplex& s) {
@@ -591,7 +591,6 @@ class Skeleton_blocker_complex {
return *edge_handle;
}
-
/**
* @brief Adds all edges of s in the complex without adding blockers.
*/
@@ -844,12 +843,13 @@ class Skeleton_blocker_complex {
boost_adjacency_iterator ai, ai_end;
for (tie(ai, ai_end) = adjacent_vertices(v.vertex, skeleton); ai != ai_end;
++ai) {
+ Vertex_handle value(*ai);
if (keep_only_superior) {
- if (*ai > v.vertex) {
- n.add_vertex(Vertex_handle(*ai));
+ if (value > v.vertex) {
+ n.add_vertex(value);
}
} else {
- n.add_vertex(Vertex_handle(*ai));
+ n.add_vertex(value);
}
}
}
@@ -929,7 +929,7 @@ class Skeleton_blocker_complex {
// xxx rename get_address et place un using dans sub_complex
boost::optional<Simplex> get_simplex_address(
- const Root_simplex_handle& s) const {
+ const Root_simplex_handle& s) const {
boost::optional<Simplex> res;
Simplex s_address;
@@ -1001,10 +1001,9 @@ class Skeleton_blocker_complex {
return std::distance(triangles.begin(), triangles.end());
}
-
/*
* @brief returns the number of simplices of a given dimension in the complex.
- */
+ */
size_t num_simplices() const {
auto simplices = complex_simplex_range();
return std::distance(simplices.begin(), simplices.end());
@@ -1012,8 +1011,8 @@ class Skeleton_blocker_complex {
/*
* @brief returns the number of simplices of a given dimension in the complex.
- */
- size_t num_simplices(unsigned dimension) const {
+ */
+ size_t num_simplices(int dimension) const {
// TODO(DS): iterator on k-simplices
size_t res = 0;
for (const auto& s : complex_simplex_range())
diff --git a/include/gudhi/Skeleton_blocker_geometric_complex.h b/include/gudhi/Skeleton_blocker_geometric_complex.h
index 1130ca9f..95331b7a 100644
--- a/include/gudhi/Skeleton_blocker_geometric_complex.h
+++ b/include/gudhi/Skeleton_blocker_geometric_complex.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
@@ -19,6 +19,7 @@
* 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 SKELETON_BLOCKER_GEOMETRIC_COMPLEX_H_
#define SKELETON_BLOCKER_GEOMETRIC_COMPLEX_H_
diff --git a/include/gudhi/Skeleton_blocker_link_complex.h b/include/gudhi/Skeleton_blocker_link_complex.h
index 1bd66289..4db075b0 100644
--- a/include/gudhi/Skeleton_blocker_link_complex.h
+++ b/include/gudhi/Skeleton_blocker_link_complex.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
@@ -19,6 +19,7 @@
* 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 SKELETON_BLOCKER_LINK_COMPLEX_H_
#define SKELETON_BLOCKER_LINK_COMPLEX_H_
@@ -39,7 +40,7 @@ template<class ComplexType> class Skeleton_blocker_sub_complex;
*/
template<typename ComplexType>
class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
- ComplexType> {
+ComplexType> {
template<typename T> friend class Skeleton_blocker_link_superior;
typedef typename ComplexType::Edge_handle Edge_handle;
@@ -60,8 +61,7 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
typedef typename ComplexType::Root_simplex_handle::Simplex_vertex_const_iterator Root_simplex_handle_iterator;
explicit Skeleton_blocker_link_complex(bool only_superior_vertices = false)
- : only_superior_vertices_(only_superior_vertices) {
- }
+ : only_superior_vertices_(only_superior_vertices) { }
/**
* If the parameter only_superior_vertices is true,
@@ -95,10 +95,10 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
*/
Skeleton_blocker_link_complex(const ComplexType & parent_complex,
Edge_handle edge, bool only_superior_vertices =
- false)
+ false)
: only_superior_vertices_(only_superior_vertices) {
Simplex alpha_simplex(parent_complex.first_vertex(edge),
- parent_complex.second_vertex(edge));
+ parent_complex.second_vertex(edge));
build_link(parent_complex, alpha_simplex);
}
@@ -151,7 +151,7 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
bool only_superior_vertices) {
// for a vertex we know exactly the number of vertices of the link (and the size of the corresponding vector
this->skeleton.m_vertices.reserve(
- parent_complex.degree(alpha_parent_adress));
+ parent_complex.degree(alpha_parent_adress));
// For all vertex 'v' in this intersection, we go through all its adjacent blockers.
// If one blocker minus 'v' is included in alpha then the vertex is not in the link complex.
@@ -169,21 +169,21 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
return;
for (auto x_link = this->vertex_range().begin();
- x_link != this->vertex_range().end(); ++x_link) {
+ x_link != this->vertex_range().end(); ++x_link) {
for (auto y_link = x_link; ++y_link != this->vertex_range().end();) {
Vertex_handle x_parent = *parent_complex.get_address(
- this->get_id(*x_link));
+ this->get_id(*x_link));
Vertex_handle y_parent = *parent_complex.get_address(
- this->get_id(*y_link));
+ this->get_id(*y_link));
if (parent_complex.contains_edge(x_parent, y_parent)) {
// we check that there is no blocker subset of alpha passing trough x and y
bool new_edge = true;
for (auto blocker_parent : parent_complex.const_blocker_range(
- x_parent)) {
+ x_parent)) {
if (!is_alpha_blocker || *blocker_parent != alpha_parent_adress) {
if (blocker_parent->contains(y_parent)) {
new_edge = !(alpha_parent_adress.contains_difference(
- *blocker_parent, x_parent, y_parent));
+ *blocker_parent, x_parent, y_parent));
if (!new_edge)
break;
}
@@ -201,8 +201,8 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
* corresponding address in 'other_complex'.
* It assumes that other_complex have a vertex 'this.get_id(address)'
*/
- boost::optional<Vertex_handle> give_equivalent_vertex(
- const ComplexType & other_complex, Vertex_handle address) const {
+ boost::optional<Vertex_handle> give_equivalent_vertex(const ComplexType & other_complex,
+ Vertex_handle address) const {
Root_vertex_handle id((*this)[address].get_id());
return other_complex.get_address(id);
}
@@ -269,7 +269,7 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
bool only_vertices = false) {
assert(is_alpha_blocker || parent_complex.contains(alpha_parent_adress));
compute_link_vertices(parent_complex, alpha_parent_adress, only_superior_vertices_);
- if(!only_vertices) {
+ if (!only_vertices) {
compute_link_edges(parent_complex, alpha_parent_adress, is_alpha_blocker);
compute_link_blockers(parent_complex, alpha_parent_adress, is_alpha_blocker);
}
diff --git a/include/gudhi/Skeleton_blocker_simplifiable_complex.h b/include/gudhi/Skeleton_blocker_simplifiable_complex.h
index 171efd4b..544e02e8 100644
--- a/include/gudhi/Skeleton_blocker_simplifiable_complex.h
+++ b/include/gudhi/Skeleton_blocker_simplifiable_complex.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
@@ -19,6 +19,7 @@
* 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 SKELETON_BLOCKER_SIMPLIFIABLE_COMPLEX_H_
#define SKELETON_BLOCKER_SIMPLIFIABLE_COMPLEX_H_
@@ -33,7 +34,7 @@ namespace Gudhi {
namespace skeleton_blocker {
/**
- * Returns true iff the blocker 'sigma' is popable.
+ * Returns true if the blocker 'sigma' is popable.
* To define popable, let us call 'L' the complex that
* consists in the current complex without the blocker 'sigma'.
* A blocker 'sigma' is then "popable" if the link of 'sigma'
@@ -145,8 +146,7 @@ void Skeleton_blocker_complex<SkeletonBlockerDS>::remove_star(Vertex_handle v) {
* whenever the dimension of tau is at least 2.
*/
template<typename SkeletonBlockerDS>
-void Skeleton_blocker_complex<SkeletonBlockerDS>::update_blockers_after_remove_star_of_vertex_or_edge(
- const Simplex& simplex_to_be_removed) {
+void Skeleton_blocker_complex<SkeletonBlockerDS>::update_blockers_after_remove_star_of_vertex_or_edge(const Simplex& simplex_to_be_removed) {
std::list <Blocker_handle> blockers_to_update;
if (simplex_to_be_removed.empty()) return;
@@ -224,8 +224,6 @@ void Skeleton_blocker_complex<SkeletonBlockerDS>::add_simplex(const Simplex& sig
add_blockers_after_simplex_insertion(sigma);
}
-
-
template<typename SkeletonBlockerDS>
void Skeleton_blocker_complex<SkeletonBlockerDS>::add_blockers_after_simplex_insertion(Simplex sigma) {
if (sigma.dimension() < 1) return;
@@ -385,7 +383,8 @@ Skeleton_blocker_complex<SkeletonBlockerDS>::contract_edge(Vertex_handle a, Vert
template<typename SkeletonBlockerDS>
void Skeleton_blocker_complex<SkeletonBlockerDS>::get_blockers_to_be_added_after_contraction(Vertex_handle a,
- Vertex_handle b, std::set<Simplex>& blockers_to_add) {
+ Vertex_handle b,
+ std::set<Simplex>& blockers_to_add) {
blockers_to_add.clear();
typedef Skeleton_blocker_link_complex<Skeleton_blocker_complex<SkeletonBlockerDS> > LinkComplexType;
diff --git a/include/gudhi/Strong_witness_complex.h b/include/gudhi/Strong_witness_complex.h
new file mode 100644
index 00000000..a973ddb7
--- /dev/null
+++ b/include/gudhi/Strong_witness_complex.h
@@ -0,0 +1,185 @@
+/* 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): Siargey Kachanovich
+ *
+ * Copyright (C) 2015 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 STRONG_WITNESS_COMPLEX_H_
+#define STRONG_WITNESS_COMPLEX_H_
+
+#include <gudhi/Active_witness/Active_witness.h>
+
+#include <utility>
+#include <vector>
+#include <list>
+#include <limits>
+
+namespace Gudhi {
+
+namespace witness_complex {
+
+/* \private
+ * \class Strong_witness_complex
+ * \brief Constructs strong witness complex for a given table of nearest landmarks with respect to witnesses.
+ * \ingroup witness_complex
+ *
+ * \tparam Nearest_landmark_table_ needs to be a range of a range of pairs of nearest landmarks and distances.
+ * The class Nearest_landmark_table_::value_type must be a copiable range.
+ * The range of pairs must admit a member type 'iterator'. The dereference type
+ * of the pair range iterator needs to be 'std::pair<std::size_t, double>'.
+ */
+template< class Nearest_landmark_table_ >
+class Strong_witness_complex {
+ private:
+ typedef typename Nearest_landmark_table_::value_type Nearest_landmark_range;
+ typedef std::size_t Witness_id;
+ typedef std::size_t Landmark_id;
+ typedef std::pair<Landmark_id, double> Id_distance_pair;
+ typedef Active_witness<Id_distance_pair, Nearest_landmark_range> ActiveWitness;
+ typedef std::list< ActiveWitness > ActiveWitnessList;
+ typedef std::vector< Landmark_id > typeVectorVertex;
+ typedef std::vector<Nearest_landmark_range> Nearest_landmark_table_internal;
+ typedef Landmark_id Vertex_handle;
+
+ protected:
+ Nearest_landmark_table_internal nearest_landmark_table_;
+
+ public:
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ /* @name Constructor
+ */
+
+ //@{
+
+ Strong_witness_complex() {
+ }
+
+ /**
+ * \brief Initializes member variables before constructing simplicial complex.
+ * \details Records nearest landmark table.
+ * @param[in] nearest_landmark_table needs to be a range of a range of pairs of nearest landmarks and distances.
+ * The class Nearest_landmark_table_::value_type must be a copiable range.
+ * The range of pairs must admit a member type 'iterator'. The dereference type
+ * of the pair range iterator needs to be 'std::pair<std::size_t, double>'.
+ */
+ Strong_witness_complex(Nearest_landmark_table_ const & nearest_landmark_table)
+ : nearest_landmark_table_(std::begin(nearest_landmark_table), std::end(nearest_landmark_table)) {
+ }
+
+ /** \brief Outputs the strong witness complex of relaxation 'max_alpha_square'
+ * in a simplicial complex data structure.
+ * \details The function returns true if the construction is successful and false otherwise.
+ * @param[out] complex Simplicial complex data structure, which is a model of
+ * SimplicialComplexForWitness concept.
+ * @param[in] max_alpha_square Maximal squared relaxation parameter.
+ * @param[in] limit_dimension Represents the maximal dimension of the simplicial complex
+ * (default value = no limit).
+ */
+ template < typename SimplicialComplexForWitness >
+ bool create_complex(SimplicialComplexForWitness& complex,
+ double max_alpha_square,
+ Landmark_id limit_dimension = std::numeric_limits<Landmark_id>::max()) const {
+ Landmark_id complex_dim = 0;
+ if (complex.num_vertices() > 0) {
+ std::cerr << "Strong witness complex cannot create complex - complex is not empty.\n";
+ return false;
+ }
+ if (max_alpha_square < 0) {
+ std::cerr << "Strong witness complex cannot create complex - squared relaxation parameter must be "
+ << "non-negative.\n";
+ return false;
+ }
+ if (limit_dimension < 0) {
+ std::cerr << "Strong witness complex cannot create complex - limit dimension must be non-negative.\n";
+ return false;
+ }
+ for (auto w : nearest_landmark_table_) {
+ ActiveWitness aw(w);
+ typeVectorVertex simplex;
+ typename ActiveWitness::iterator aw_it = aw.begin();
+ float lim_dist2 = aw.begin()->second + max_alpha_square;
+ while ((Landmark_id)simplex.size() <= limit_dimension && aw_it != aw.end() && aw_it->second < lim_dist2) {
+ simplex.push_back(aw_it->first);
+ complex.insert_simplex_and_subfaces(simplex, aw_it->second - aw.begin()->second);
+ aw_it++;
+ }
+ // continue inserting limD-faces of the following simplices
+ typeVectorVertex& vertices = simplex; // 'simplex' now will be called vertices
+ while (aw_it != aw.end() && aw_it->second < lim_dist2) {
+ typeVectorVertex facet = {};
+ add_all_faces_of_dimension(limit_dimension, vertices, vertices.begin(), aw_it,
+ aw_it->second - aw.begin()->second, facet, complex);
+ vertices.push_back(aw_it->first);
+ aw_it++;
+ }
+ 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.
+ * simplex is the prefix of the simplexes to insert.
+ * The landmark pointed by aw_it is added to all formed simplices.
+ */
+ template < typename SimplicialComplexForWitness >
+ void add_all_faces_of_dimension(Landmark_id dim,
+ typeVectorVertex& vertices,
+ typename typeVectorVertex::iterator curr_it,
+ typename ActiveWitness::iterator aw_it,
+ double filtration_value,
+ typeVectorVertex& simplex,
+ SimplicialComplexForWitness& sc) const {
+ if (dim > 0) {
+ while (curr_it != vertices.end()) {
+ simplex.push_back(*curr_it);
+ ++curr_it;
+ add_all_faces_of_dimension(dim-1,
+ vertices,
+ curr_it,
+ aw_it,
+ filtration_value,
+ simplex,
+ sc);
+ simplex.pop_back();
+ add_all_faces_of_dimension(dim,
+ vertices,
+ curr_it,
+ aw_it,
+ filtration_value,
+ simplex,
+ sc);
+ }
+ } else if (dim == 0) {
+ simplex.push_back(aw_it->first);
+ sc.insert_simplex_and_subfaces(simplex, filtration_value);
+ simplex.pop_back();
+ }
+ }
+ //@}
+};
+
+} // namespace witness_complex
+
+} // namespace Gudhi
+
+#endif // STRONG_WITNESS_COMPLEX_H_
diff --git a/include/gudhi/Tangential_complex.h b/include/gudhi/Tangential_complex.h
new file mode 100644
index 00000000..cfc82eb1
--- /dev/null
+++ b/include/gudhi/Tangential_complex.h
@@ -0,0 +1,2276 @@
+/* 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): Clement Jamin
+ *
+ * Copyright (C) 2016 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 TANGENTIAL_COMPLEX_H_
+#define TANGENTIAL_COMPLEX_H_
+
+#include <gudhi/Tangential_complex/config.h>
+#include <gudhi/Tangential_complex/Simplicial_complex.h>
+#include <gudhi/Tangential_complex/utilities.h>
+#include <gudhi/Kd_tree_search.h>
+#include <gudhi/console_color.h>
+#include <gudhi/Clock.h>
+#include <gudhi/Simplex_tree.h>
+
+#include <CGAL/Default.h>
+#include <CGAL/Dimension.h>
+#include <CGAL/function_objects.h> // for CGAL::Identity
+#include <CGAL/Epick_d.h>
+#include <CGAL/Regular_triangulation_traits_adapter.h>
+#include <CGAL/Regular_triangulation.h>
+#include <CGAL/Delaunay_triangulation.h>
+#include <CGAL/Combination_enumerator.h>
+#include <CGAL/point_generators_d.h>
+
+#include <Eigen/Core>
+#include <Eigen/Eigen>
+
+#include <boost/optional.hpp>
+#include <boost/iterator/transform_iterator.hpp>
+#include <boost/range/adaptor/transformed.hpp>
+#include <boost/range/counting_range.hpp>
+#include <boost/math/special_functions/factorials.hpp>
+#include <boost/container/flat_set.hpp>
+
+#include <tuple>
+#include <vector>
+#include <set>
+#include <utility>
+#include <sstream>
+#include <iostream>
+#include <limits>
+#include <algorithm>
+#include <functional>
+#include <iterator>
+#include <cmath> // for std::sqrt
+#include <string>
+#include <cstddef> // for std::size_t
+
+#ifdef GUDHI_USE_TBB
+#include <tbb/parallel_for.h>
+#include <tbb/combinable.h>
+#include <tbb/mutex.h>
+#endif
+
+// #define GUDHI_TC_EXPORT_NORMALS // Only for 3D surfaces (k=2, d=3)
+
+namespace sps = Gudhi::spatial_searching;
+
+namespace Gudhi {
+
+namespace tangential_complex {
+
+using namespace internal;
+
+class Vertex_data {
+ public:
+ Vertex_data(std::size_t data = (std::numeric_limits<std::size_t>::max)())
+ : m_data(data) { }
+
+ operator std::size_t() {
+ return m_data;
+ }
+
+ operator std::size_t() const {
+ return m_data;
+ }
+
+ private:
+ std::size_t m_data;
+};
+
+/**
+ * \class Tangential_complex Tangential_complex.h gudhi/Tangential_complex.h
+ * \brief Tangential complex data structure.
+ *
+ * \ingroup tangential_complex
+ *
+ * \details
+ * The class Tangential_complex represents a tangential complex.
+ * After the computation of the complex, an optional post-processing called perturbation can
+ * be run to attempt to remove inconsistencies.
+ *
+ * \tparam Kernel_ requires a <a target="_blank"
+ * href="http://doc.cgal.org/latest/Kernel_d/classCGAL_1_1Epick__d.html">CGAL::Epick_d</a> class, which
+ * can be static if you know the ambiant dimension at compile-time, or dynamic if you don't.
+ * \tparam DimensionTag can be either <a target="_blank"
+ * href="http://doc.cgal.org/latest/Kernel_23/classCGAL_1_1Dimension__tag.html">Dimension_tag<d></a>
+ * if you know the intrinsic dimension at compile-time,
+ * or <a target="_blank"
+ * href="http://doc.cgal.org/latest/Kernel_23/classCGAL_1_1Dynamic__dimension__tag.html">CGAL::Dynamic_dimension_tag</a>
+ * if you don't.
+ * \tparam Concurrency_tag enables sequential versus parallel computation. Possible values are `CGAL::Parallel_tag` (the default) and `CGAL::Sequential_tag`.
+ * \tparam Triangulation_ is the type used for storing the local regular triangulations. We highly recommend to use the default value (`CGAL::Regular_triangulation`).
+ *
+ */
+template
+<
+ typename Kernel_, // ambiant kernel
+ typename DimensionTag, // intrinsic dimension
+ typename Concurrency_tag = CGAL::Parallel_tag,
+ typename Triangulation_ = CGAL::Default
+>
+class Tangential_complex {
+ typedef Kernel_ K;
+ typedef typename K::FT FT;
+ typedef typename K::Point_d Point;
+ typedef typename K::Weighted_point_d Weighted_point;
+ typedef typename K::Vector_d Vector;
+
+ typedef typename CGAL::Default::Get
+ <
+ Triangulation_,
+ CGAL::Regular_triangulation
+ <
+ CGAL::Epick_d<DimensionTag>,
+ CGAL::Triangulation_data_structure
+ <
+ typename CGAL::Epick_d<DimensionTag>::Dimension,
+ CGAL::Triangulation_vertex
+ <
+ CGAL::Regular_triangulation_traits_adapter< CGAL::Epick_d<DimensionTag> >, Vertex_data
+ >,
+ CGAL::Triangulation_full_cell<CGAL::Regular_triangulation_traits_adapter< CGAL::Epick_d<DimensionTag> > >
+ >
+ >
+ >::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 Triangulation::Vertex_handle Tr_vertex_handle;
+ typedef typename Triangulation::Full_cell_handle Tr_full_cell_handle;
+ typedef typename Tr_traits::Vector_d Tr_vector;
+
+#if defined(GUDHI_USE_TBB)
+ typedef tbb::mutex Mutex_for_perturb;
+ typedef Vector Translation_for_perturb;
+ typedef std::vector<Atomic_wrapper<FT> > Weights;
+#else
+ typedef Vector Translation_for_perturb;
+ typedef std::vector<FT> Weights;
+#endif
+ typedef std::vector<Translation_for_perturb> Translations_for_perturb;
+
+ // Store a local triangulation and a handle to its center vertex
+
+ struct Tr_and_VH {
+ public:
+ Tr_and_VH()
+ : m_tr(NULL) { }
+
+ Tr_and_VH(int dim)
+ : m_tr(new Triangulation(dim)) { }
+
+ ~Tr_and_VH() {
+ destroy_triangulation();
+ }
+
+ Triangulation & construct_triangulation(int dim) {
+ delete m_tr;
+ m_tr = new Triangulation(dim);
+ return tr();
+ }
+
+ void destroy_triangulation() {
+ delete m_tr;
+ m_tr = NULL;
+ }
+
+ Triangulation & tr() {
+ return *m_tr;
+ }
+
+ Triangulation const& tr() const {
+ return *m_tr;
+ }
+
+ Tr_vertex_handle const& center_vertex() const {
+ return m_center_vertex;
+ }
+
+ Tr_vertex_handle & center_vertex() {
+ return m_center_vertex;
+ }
+
+ private:
+ Triangulation* m_tr;
+ Tr_vertex_handle m_center_vertex;
+ };
+
+ public:
+ typedef Basis<K> Tangent_space_basis;
+ typedef Basis<K> Orthogonal_space_basis;
+ typedef std::vector<Tangent_space_basis> TS_container;
+ typedef std::vector<Orthogonal_space_basis> OS_container;
+
+ typedef std::vector<Point> Points;
+
+ typedef boost::container::flat_set<std::size_t> Simplex;
+ typedef std::set<Simplex> Simplex_set;
+
+ private:
+ typedef sps::Kd_tree_search<K, Points> Points_ds;
+ typedef typename Points_ds::KNS_range KNS_range;
+ typedef typename Points_ds::INS_range INS_range;
+
+ typedef std::vector<Tr_and_VH> Tr_container;
+ typedef std::vector<Vector> Vectors;
+
+ // An Incident_simplex is the list of the vertex indices
+ // except the center vertex
+ typedef boost::container::flat_set<std::size_t> Incident_simplex;
+ typedef std::vector<Incident_simplex> Star;
+ typedef std::vector<Star> Stars_container;
+
+ // For transform_iterator
+
+ static const Tr_point &vertex_handle_to_point(Tr_vertex_handle vh) {
+ return vh->point();
+ }
+
+ template <typename P, typename VH>
+ static const P &vertex_handle_to_point(VH vh) {
+ return vh->point();
+ }
+
+ public:
+ typedef internal::Simplicial_complex Simplicial_complex;
+
+ /** \brief Constructor from a range of points.
+ * Points are copied into the instance, and a search data structure is initialized.
+ * Note the complex is not computed: `compute_tangential_complex` must be called after the creation
+ * of the object.
+ *
+ * @param[in] points Range of points (`Point_range::value_type` must be the same as `Kernel_::Point_d`).
+ * @param[in] intrinsic_dimension Intrinsic dimension of the manifold.
+ * @param[in] k Kernel instance.
+ */
+ template <typename Point_range>
+ Tangential_complex(Point_range points,
+ int intrinsic_dimension,
+#ifdef GUDHI_TC_USE_ANOTHER_POINT_SET_FOR_TANGENT_SPACE_ESTIM
+ InputIterator first_for_tse, InputIterator last_for_tse,
+#endif
+ const K &k = K()
+ )
+ : m_k(k),
+ m_intrinsic_dim(intrinsic_dimension),
+ m_ambient_dim(points.empty() ? 0 : k.point_dimension_d_object()(*points.begin())),
+ m_points(points.begin(), points.end()),
+ m_weights(m_points.size(), FT(0))
+#if defined(GUDHI_USE_TBB) && defined(GUDHI_TC_PERTURB_POSITION)
+ , m_p_perturb_mutexes(NULL)
+#endif
+ , m_points_ds(m_points)
+ , m_last_max_perturb(0.)
+ , m_are_tangent_spaces_computed(m_points.size(), false)
+ , m_tangent_spaces(m_points.size(), Tangent_space_basis())
+#ifdef GUDHI_TC_EXPORT_NORMALS
+ , m_orth_spaces(m_points.size(), Orthogonal_space_basis())
+#endif
+#ifdef GUDHI_TC_USE_ANOTHER_POINT_SET_FOR_TANGENT_SPACE_ESTIM
+ , m_points_for_tse(first_for_tse, last_for_tse)
+ , m_points_ds_for_tse(m_points_for_tse)
+#endif
+ { }
+
+ /// Destructor
+ ~Tangential_complex() {
+#if defined(GUDHI_USE_TBB) && defined(GUDHI_TC_PERTURB_POSITION)
+ delete [] m_p_perturb_mutexes;
+#endif
+ }
+
+ /// Returns the intrinsic dimension of the manifold.
+ int intrinsic_dimension() const {
+ return m_intrinsic_dim;
+ }
+
+ /// Returns the ambient dimension.
+ int ambient_dimension() const {
+ return m_ambient_dim;
+ }
+
+ Points const& points() const {
+ return m_points;
+ }
+
+ /** \brief Returns the point corresponding to the vertex given as parameter.
+ *
+ * @param[in] vertex Vertex handle of the point to retrieve.
+ * @return The point found.
+ */
+ Point get_point(std::size_t vertex) const {
+ return m_points[vertex];
+ }
+
+ /** \brief Returns the perturbed position of the point corresponding to the vertex given as parameter.
+ *
+ * @param[in] vertex Vertex handle of the point to retrieve.
+ * @return The perturbed position of the point found.
+ */
+ Point get_perturbed_point(std::size_t vertex) const {
+ return compute_perturbed_point(vertex);
+ }
+
+ /// Returns the number of vertices.
+
+ std::size_t number_of_vertices() const {
+ return m_points.size();
+ }
+
+ void set_weights(const Weights& weights) {
+ m_weights = weights;
+ }
+
+ void set_tangent_planes(const TS_container& tangent_spaces
+#ifdef GUDHI_TC_EXPORT_NORMALS
+ , const OS_container& orthogonal_spaces
+#endif
+ ) {
+#ifdef GUDHI_TC_EXPORT_NORMALS
+ GUDHI_CHECK(
+ m_points.size() == tangent_spaces.size()
+ && m_points.size() == orthogonal_spaces.size(),
+ std::logic_error("Wrong sizes"));
+#else
+ GUDHI_CHECK(
+ m_points.size() == tangent_spaces.size(),
+ std::logic_error("Wrong sizes"));
+#endif
+ m_tangent_spaces = tangent_spaces;
+#ifdef GUDHI_TC_EXPORT_NORMALS
+ m_orth_spaces = orthogonal_spaces;
+#endif
+ for (std::size_t i = 0; i < m_points.size(); ++i)
+ m_are_tangent_spaces_computed[i] = true;
+ }
+
+ /// Computes the tangential complex.
+ void compute_tangential_complex() {
+#ifdef GUDHI_TC_PERFORM_EXTRA_CHECKS
+ std::cerr << red << "WARNING: GUDHI_TC_PERFORM_EXTRA_CHECKS is defined. "
+ << "Computation might be slower than usual.\n" << white;
+#endif
+
+#if defined(GUDHI_TC_PROFILING) && defined(GUDHI_USE_TBB)
+ Gudhi::Clock t;
+#endif
+
+ // We need to do that because we don't want the container to copy the
+ // already-computed triangulations (while resizing) since it would
+ // invalidate the vertex handles stored beside the triangulations
+ m_triangulations.resize(m_points.size());
+ m_stars.resize(m_points.size());
+ m_squared_star_spheres_radii_incl_margin.resize(m_points.size(), FT(-1));
+#ifdef GUDHI_TC_PERTURB_POSITION
+ if (m_points.empty())
+ m_translations.clear();
+ else
+ m_translations.resize(m_points.size(),
+ m_k.construct_vector_d_object()(m_ambient_dim));
+#if defined(GUDHI_USE_TBB)
+ delete [] m_p_perturb_mutexes;
+ m_p_perturb_mutexes = new Mutex_for_perturb[m_points.size()];
+#endif
+#endif
+
+#ifdef GUDHI_USE_TBB
+ // Parallel
+ if (boost::is_convertible<Concurrency_tag, CGAL::Parallel_tag>::value) {
+ tbb::parallel_for(tbb::blocked_range<size_t>(0, m_points.size()),
+ Compute_tangent_triangulation(*this));
+ } else {
+#endif // GUDHI_USE_TBB
+ // Sequential
+ for (std::size_t i = 0; i < m_points.size(); ++i)
+ compute_tangent_triangulation(i);
+#ifdef GUDHI_USE_TBB
+ }
+#endif // GUDHI_USE_TBB
+
+#if defined(GUDHI_TC_PROFILING) && defined(GUDHI_USE_TBB)
+ t.end();
+ std::cerr << "Tangential complex computed in " << t.num_seconds()
+ << " seconds.\n";
+#endif
+ }
+
+ /// \brief Type returned by `Tangential_complex::fix_inconsistencies_using_perturbation`.
+ struct Fix_inconsistencies_info {
+ /// `true` if all inconsistencies could be removed, `false` if the time limit has been reached before
+ bool success = false;
+ /// number of steps performed
+ unsigned int num_steps = 0;
+ /// initial number of inconsistent stars
+ std::size_t initial_num_inconsistent_stars = 0;
+ /// best number of inconsistent stars during the process
+ std::size_t best_num_inconsistent_stars = 0;
+ /// final number of inconsistent stars
+ std::size_t final_num_inconsistent_stars = 0;
+ };
+
+ /** \brief Attempts to fix inconsistencies by perturbing the point positions.
+ *
+ * @param[in] max_perturb Maximum length of the translations used by the perturbation.
+ * @param[in] time_limit Time limit in seconds. If -1, no time limit is set.
+ */
+ Fix_inconsistencies_info fix_inconsistencies_using_perturbation(double max_perturb, double time_limit = -1.) {
+ Fix_inconsistencies_info info;
+
+ if (time_limit == 0.)
+ return info;
+
+ Gudhi::Clock t;
+
+#ifdef GUDHI_TC_SHOW_DETAILED_STATS_FOR_INCONSISTENCIES
+ std::tuple<std::size_t, std::size_t, std::size_t> stats_before =
+ number_of_inconsistent_simplices(false);
+
+ if (std::get<1>(stats_before) == 0) {
+#ifdef DEBUG_TRACES
+ std::cerr << "Nothing to fix.\n";
+#endif
+ info.success = false;
+ return info;
+ }
+#endif // GUDHI_TC_SHOW_DETAILED_STATS_FOR_INCONSISTENCIES
+
+ m_last_max_perturb = max_perturb;
+
+ bool done = false;
+ info.best_num_inconsistent_stars = m_triangulations.size();
+ info.num_steps = 0;
+ while (!done) {
+#ifdef GUDHI_TC_SHOW_DETAILED_STATS_FOR_INCONSISTENCIES
+ std::cerr
+ << "\nBefore fix step:\n"
+ << " * Total number of simplices in stars (incl. duplicates): "
+ << std::get<0>(stats_before) << "\n"
+ << " * Num inconsistent simplices in stars (incl. duplicates): "
+ << red << std::get<1>(stats_before) << white << " ("
+ << 100. * std::get<1>(stats_before) / std::get<0>(stats_before) << "%)\n"
+ << " * Number of stars containing inconsistent simplices: "
+ << red << std::get<2>(stats_before) << white << " ("
+ << 100. * std::get<2>(stats_before) / m_points.size() << "%)\n";
+#endif
+
+#if defined(DEBUG_TRACES) || defined(GUDHI_TC_PROFILING)
+ std::cerr << yellow
+ << "\nAttempt to fix inconsistencies using perturbations - step #"
+ << info.num_steps + 1 << "... " << white;
+#endif
+
+ std::size_t num_inconsistent_stars = 0;
+ std::vector<std::size_t> updated_points;
+
+#ifdef GUDHI_TC_PROFILING
+ Gudhi::Clock t_fix_step;
+#endif
+
+ // Parallel
+#if defined(GUDHI_USE_TBB)
+ if (boost::is_convertible<Concurrency_tag, CGAL::Parallel_tag>::value) {
+ tbb::combinable<std::size_t> num_inconsistencies;
+ tbb::combinable<std::vector<std::size_t> > tls_updated_points;
+ tbb::parallel_for(
+ tbb::blocked_range<size_t>(0, m_triangulations.size()),
+ Try_to_solve_inconsistencies_in_a_local_triangulation(*this, max_perturb,
+ num_inconsistencies,
+ tls_updated_points));
+ num_inconsistent_stars =
+ num_inconsistencies.combine(std::plus<std::size_t>());
+ updated_points = tls_updated_points.combine(
+ [](std::vector<std::size_t> const& x,
+ std::vector<std::size_t> const& y) {
+ std::vector<std::size_t> res;
+ res.reserve(x.size() + y.size());
+ res.insert(res.end(), x.begin(), x.end());
+ res.insert(res.end(), y.begin(), y.end());
+ return res;
+ });
+ } else {
+#endif // GUDHI_USE_TBB
+ // Sequential
+ for (std::size_t i = 0; i < m_triangulations.size(); ++i) {
+ num_inconsistent_stars +=
+ try_to_solve_inconsistencies_in_a_local_triangulation(i, max_perturb,
+ std::back_inserter(updated_points));
+ }
+#if defined(GUDHI_USE_TBB)
+ }
+#endif // GUDHI_USE_TBB
+
+#ifdef GUDHI_TC_PROFILING
+ t_fix_step.end();
+#endif
+
+#if defined(GUDHI_TC_SHOW_DETAILED_STATS_FOR_INCONSISTENCIES) || defined(DEBUG_TRACES)
+ std::cerr
+ << "\nEncountered during fix:\n"
+ << " * Num stars containing inconsistent simplices: "
+ << red << num_inconsistent_stars << white
+ << " (" << 100. * num_inconsistent_stars / m_points.size() << "%)\n";
+#endif
+
+#ifdef GUDHI_TC_PROFILING
+ std::cerr << yellow << "done in " << t_fix_step.num_seconds()
+ << " seconds.\n" << white;
+#elif defined(DEBUG_TRACES)
+ std::cerr << yellow << "done.\n" << white;
+#endif
+
+ if (num_inconsistent_stars > 0)
+ refresh_tangential_complex(updated_points);
+
+#ifdef GUDHI_TC_PERFORM_EXTRA_CHECKS
+ // Confirm that all stars were actually refreshed
+ std::size_t num_inc_1 =
+ std::get<1>(number_of_inconsistent_simplices(false));
+ refresh_tangential_complex();
+ std::size_t num_inc_2 =
+ std::get<1>(number_of_inconsistent_simplices(false));
+ if (num_inc_1 != num_inc_2)
+ std::cerr << red << "REFRESHMENT CHECK: FAILED. ("
+ << num_inc_1 << " vs " << num_inc_2 << ")\n" << white;
+ else
+ std::cerr << green << "REFRESHMENT CHECK: PASSED.\n" << white;
+#endif
+
+#ifdef GUDHI_TC_SHOW_DETAILED_STATS_FOR_INCONSISTENCIES
+ std::tuple<std::size_t, std::size_t, std::size_t> stats_after =
+ number_of_inconsistent_simplices(false);
+
+ std::cerr
+ << "\nAfter fix:\n"
+ << " * Total number of simplices in stars (incl. duplicates): "
+ << std::get<0>(stats_after) << "\n"
+ << " * Num inconsistent simplices in stars (incl. duplicates): "
+ << red << std::get<1>(stats_after) << white << " ("
+ << 100. * std::get<1>(stats_after) / std::get<0>(stats_after) << "%)\n"
+ << " * Number of stars containing inconsistent simplices: "
+ << red << std::get<2>(stats_after) << white << " ("
+ << 100. * std::get<2>(stats_after) / m_points.size() << "%)\n";
+
+ stats_before = stats_after;
+#endif
+
+ if (info.num_steps == 0)
+ info.initial_num_inconsistent_stars = num_inconsistent_stars;
+
+ if (num_inconsistent_stars < info.best_num_inconsistent_stars)
+ info.best_num_inconsistent_stars = num_inconsistent_stars;
+
+ info.final_num_inconsistent_stars = num_inconsistent_stars;
+
+ done = (num_inconsistent_stars == 0);
+ if (!done) {
+ ++info.num_steps;
+ if (time_limit > 0. && t.num_seconds() > time_limit) {
+#ifdef DEBUG_TRACES
+ std::cerr << red << "Time limit reached.\n" << white;
+#endif
+ info.success = false;
+ return info;
+ }
+ }
+ }
+
+#ifdef DEBUG_TRACES
+ std::cerr << green << "Fixed!\n" << white;
+#endif
+ info.success = true;
+ return info;
+ }
+
+ /// \brief Type returned by `Tangential_complex::number_of_inconsistent_simplices`.
+ struct Num_inconsistencies {
+ /// Total number of simplices in stars (including duplicates that appear in several stars)
+ std::size_t num_simplices = 0;
+ /// Number of inconsistent simplices
+ std::size_t num_inconsistent_simplices = 0;
+ /// Number of stars containing at least one inconsistent simplex
+ std::size_t num_inconsistent_stars = 0;
+ };
+
+ /// Returns the number of inconsistencies
+ /// @param[in] verbose If true, outputs a message into `std::cerr`.
+
+ Num_inconsistencies
+ number_of_inconsistent_simplices(
+#ifdef DEBUG_TRACES
+ bool verbose = true
+#else
+ bool verbose = false
+#endif
+ ) const {
+ Num_inconsistencies stats;
+
+ // For each triangulation
+ for (std::size_t idx = 0; idx < m_points.size(); ++idx) {
+ bool is_star_inconsistent = false;
+
+ // For each cell
+ Star::const_iterator it_inc_simplex = m_stars[idx].begin();
+ Star::const_iterator it_inc_simplex_end = m_stars[idx].end();
+ for (; it_inc_simplex != it_inc_simplex_end; ++it_inc_simplex) {
+ // Don't check infinite cells
+ if (is_infinite(*it_inc_simplex))
+ continue;
+
+ Simplex c = *it_inc_simplex;
+ c.insert(idx); // Add the missing index
+
+ if (!is_simplex_consistent(c)) {
+ ++stats.num_inconsistent_simplices;
+ is_star_inconsistent = true;
+ }
+
+ ++stats.num_simplices;
+ }
+ stats.num_inconsistent_stars += is_star_inconsistent;
+ }
+
+ if (verbose) {
+ std::cerr
+ << "\n==========================================================\n"
+ << "Inconsistencies:\n"
+ << " * Total number of simplices in stars (incl. duplicates): "
+ << stats.num_simplices << "\n"
+ << " * Number of inconsistent simplices in stars (incl. duplicates): "
+ << stats.num_inconsistent_simplices << " ("
+ << 100. * stats.num_inconsistent_simplices / stats.num_simplices << "%)\n"
+ << " * Number of stars containing inconsistent simplices: "
+ << stats.num_inconsistent_stars << " ("
+ << 100. * stats.num_inconsistent_stars / m_points.size() << "%)\n"
+ << "==========================================================\n";
+ }
+
+ return stats;
+ }
+
+ /** \brief Exports the complex into a Simplex_tree.
+ *
+ * \tparam Simplex_tree_ must be a `Simplex_tree`.
+ *
+ * @param[out] tree The result, where each `Vertex_handle` is the index of the
+ * corresponding point in the range provided to the constructor (it can also be
+ * retrieved through the `Tangential_complex::get_point` function.
+ * @param[in] export_inconsistent_simplices Also export inconsistent simplices or not?
+ * @return The maximal dimension of the simplices.
+ */
+ template <typename Simplex_tree_>
+ int create_complex(Simplex_tree_ &tree
+ , bool export_inconsistent_simplices = true
+ /// \cond ADVANCED_PARAMETERS
+ , bool export_infinite_simplices = false
+ , Simplex_set *p_inconsistent_simplices = NULL
+ /// \endcond
+ ) const {
+#if defined(DEBUG_TRACES) || defined(GUDHI_TC_PROFILING)
+ std::cerr << yellow
+ << "\nExporting the TC as a Simplex_tree... " << white;
+#endif
+#ifdef GUDHI_TC_PROFILING
+ Gudhi::Clock t;
+#endif
+
+ int max_dim = -1;
+
+ // For each triangulation
+ for (std::size_t idx = 0; idx < m_points.size(); ++idx) {
+ // For each cell of the star
+ Star::const_iterator it_inc_simplex = m_stars[idx].begin();
+ Star::const_iterator it_inc_simplex_end = m_stars[idx].end();
+ for (; it_inc_simplex != it_inc_simplex_end; ++it_inc_simplex) {
+ Simplex c = *it_inc_simplex;
+
+ // Don't export infinite cells
+ if (!export_infinite_simplices && is_infinite(c))
+ continue;
+
+ if (!export_inconsistent_simplices && !is_simplex_consistent(c))
+ continue;
+
+ if (static_cast<int> (c.size()) > max_dim)
+ max_dim = static_cast<int> (c.size());
+ // Add the missing center vertex
+ c.insert(idx);
+
+ // Try to insert the simplex
+ bool inserted = tree.insert_simplex_and_subfaces(c).second;
+
+ // Inconsistent?
+ if (p_inconsistent_simplices && inserted && !is_simplex_consistent(c)) {
+ p_inconsistent_simplices->insert(c);
+ }
+ }
+ }
+
+#ifdef GUDHI_TC_PROFILING
+ t.end();
+ std::cerr << yellow << "done in " << t.num_seconds()
+ << " seconds.\n" << white;
+#elif defined(DEBUG_TRACES)
+ std::cerr << yellow << "done.\n" << white;
+#endif
+
+ return max_dim;
+ }
+
+ // First clears the complex then exports the TC into it
+ // Returns the max dimension of the simplices
+ // check_lower_and_higher_dim_simplices : 0 (false), 1 (true), 2 (auto)
+ // If the check is enabled, the function:
+ // - won't insert the simplex if it is already in a higher dim simplex
+ // - will erase any lower-dim simplices that are faces of the new simplex
+ // "auto" (= 2) will enable the check as a soon as it encounters a
+ // simplex whose dimension is different from the previous ones.
+ // N.B.: The check is quite expensive.
+
+ int create_complex(Simplicial_complex &complex,
+ bool export_inconsistent_simplices = true,
+ bool export_infinite_simplices = false,
+ int check_lower_and_higher_dim_simplices = 2,
+ Simplex_set *p_inconsistent_simplices = NULL) const {
+#if defined(DEBUG_TRACES) || defined(GUDHI_TC_PROFILING)
+ std::cerr << yellow
+ << "\nExporting the TC as a Simplicial_complex... " << white;
+#endif
+#ifdef GUDHI_TC_PROFILING
+ Gudhi::Clock t;
+#endif
+
+ int max_dim = -1;
+ complex.clear();
+
+ // For each triangulation
+ for (std::size_t idx = 0; idx < m_points.size(); ++idx) {
+ // For each cell of the star
+ Star::const_iterator it_inc_simplex = m_stars[idx].begin();
+ Star::const_iterator it_inc_simplex_end = m_stars[idx].end();
+ for (; it_inc_simplex != it_inc_simplex_end; ++it_inc_simplex) {
+ Simplex c = *it_inc_simplex;
+
+ // Don't export infinite cells
+ if (!export_infinite_simplices && is_infinite(c))
+ continue;
+
+ if (!export_inconsistent_simplices && !is_simplex_consistent(c))
+ continue;
+
+ // Unusual simplex dim?
+ if (check_lower_and_higher_dim_simplices == 2
+ && max_dim != -1
+ && static_cast<int> (c.size()) != max_dim) {
+ // Let's activate the check
+ std::cerr << red <<
+ "Info: check_lower_and_higher_dim_simplices ACTIVATED. "
+ "Export might be take some time...\n" << white;
+ check_lower_and_higher_dim_simplices = 1;
+ }
+
+ if (static_cast<int> (c.size()) > max_dim)
+ max_dim = static_cast<int> (c.size());
+ // Add the missing center vertex
+ c.insert(idx);
+
+ // Try to insert the simplex
+ bool added =
+ complex.add_simplex(c, check_lower_and_higher_dim_simplices == 1);
+
+ // Inconsistent?
+ if (p_inconsistent_simplices && added && !is_simplex_consistent(c)) {
+ p_inconsistent_simplices->insert(c);
+ }
+ }
+ }
+
+#ifdef GUDHI_TC_PROFILING
+ t.end();
+ std::cerr << yellow << "done in " << t.num_seconds()
+ << " seconds.\n" << white;
+#elif defined(DEBUG_TRACES)
+ std::cerr << yellow << "done.\n" << white;
+#endif
+
+ return max_dim;
+ }
+
+ template<typename ProjectionFunctor = CGAL::Identity<Point> >
+ std::ostream &export_to_off(
+ const Simplicial_complex &complex, std::ostream & os,
+ Simplex_set const *p_simpl_to_color_in_red = NULL,
+ Simplex_set const *p_simpl_to_color_in_green = NULL,
+ Simplex_set const *p_simpl_to_color_in_blue = NULL,
+ ProjectionFunctor const& point_projection = ProjectionFunctor())
+ const {
+ return export_to_off(
+ os, false, p_simpl_to_color_in_red, p_simpl_to_color_in_green,
+ p_simpl_to_color_in_blue, &complex, point_projection);
+ }
+
+ template<typename ProjectionFunctor = CGAL::Identity<Point> >
+ std::ostream &export_to_off(
+ std::ostream & os, bool color_inconsistencies = false,
+ Simplex_set const *p_simpl_to_color_in_red = NULL,
+ Simplex_set const *p_simpl_to_color_in_green = NULL,
+ Simplex_set const *p_simpl_to_color_in_blue = NULL,
+ const Simplicial_complex *p_complex = NULL,
+ ProjectionFunctor const& point_projection = ProjectionFunctor()) const {
+ if (m_points.empty())
+ return os;
+
+ if (m_ambient_dim < 2) {
+ std::cerr << "Error: export_to_off => ambient dimension should be >= 2.\n";
+ os << "Error: export_to_off => ambient dimension should be >= 2.\n";
+ return os;
+ }
+ if (m_ambient_dim > 3) {
+ std::cerr << "Warning: export_to_off => ambient dimension should be "
+ "<= 3. Only the first 3 coordinates will be exported.\n";
+ }
+
+ if (m_intrinsic_dim < 1 || m_intrinsic_dim > 3) {
+ std::cerr << "Error: export_to_off => intrinsic dimension should be "
+ "between 1 and 3.\n";
+ os << "Error: export_to_off => intrinsic dimension should be "
+ "between 1 and 3.\n";
+ return os;
+ }
+
+ std::stringstream output;
+ std::size_t num_simplices, num_vertices;
+ export_vertices_to_off(output, num_vertices, false, point_projection);
+ if (p_complex) {
+ export_simplices_to_off(
+ *p_complex, output, num_simplices, p_simpl_to_color_in_red,
+ p_simpl_to_color_in_green, p_simpl_to_color_in_blue);
+ } else {
+ export_simplices_to_off(
+ output, num_simplices, color_inconsistencies, p_simpl_to_color_in_red,
+ p_simpl_to_color_in_green, p_simpl_to_color_in_blue);
+ }
+
+#ifdef GUDHI_TC_EXPORT_NORMALS
+ os << "N";
+#endif
+
+ os << "OFF \n"
+ << num_vertices << " "
+ << num_simplices << " "
+ << "0 \n"
+ << output.str();
+
+ return os;
+ }
+
+ private:
+ void refresh_tangential_complex() {
+#if defined(DEBUG_TRACES) || defined(GUDHI_TC_PROFILING)
+ std::cerr << yellow << "\nRefreshing TC... " << white;
+#endif
+
+#ifdef GUDHI_TC_PROFILING
+ Gudhi::Clock t;
+#endif
+#ifdef GUDHI_USE_TBB
+ // Parallel
+ if (boost::is_convertible<Concurrency_tag, CGAL::Parallel_tag>::value) {
+ tbb::parallel_for(tbb::blocked_range<size_t>(0, m_points.size()),
+ Compute_tangent_triangulation(*this));
+ } else {
+#endif // GUDHI_USE_TBB
+ // Sequential
+ for (std::size_t i = 0; i < m_points.size(); ++i)
+ compute_tangent_triangulation(i);
+#ifdef GUDHI_USE_TBB
+ }
+#endif // GUDHI_USE_TBB
+
+#ifdef GUDHI_TC_PROFILING
+ t.end();
+ std::cerr << yellow << "done in " << t.num_seconds()
+ << " seconds.\n" << white;
+#elif defined(DEBUG_TRACES)
+ std::cerr << yellow << "done.\n" << white;
+#endif
+ }
+
+ // If the list of perturbed points is provided, it is much faster
+ template <typename Point_indices_range>
+ void refresh_tangential_complex(
+ Point_indices_range const& perturbed_points_indices) {
+#if defined(DEBUG_TRACES) || defined(GUDHI_TC_PROFILING)
+ std::cerr << yellow << "\nRefreshing TC... " << white;
+#endif
+
+#ifdef GUDHI_TC_PROFILING
+ Gudhi::Clock t;
+#endif
+
+ // ANN tree containing only the perturbed points
+ Points_ds updated_pts_ds(m_points, perturbed_points_indices);
+
+#ifdef GUDHI_USE_TBB
+ // Parallel
+ if (boost::is_convertible<Concurrency_tag, CGAL::Parallel_tag>::value) {
+ tbb::parallel_for(tbb::blocked_range<size_t>(0, m_points.size()),
+ Refresh_tangent_triangulation(*this, updated_pts_ds));
+ } else {
+#endif // GUDHI_USE_TBB
+ // Sequential
+ for (std::size_t i = 0; i < m_points.size(); ++i)
+ refresh_tangent_triangulation(i, updated_pts_ds);
+#ifdef GUDHI_USE_TBB
+ }
+#endif // GUDHI_USE_TBB
+
+#ifdef GUDHI_TC_PROFILING
+ t.end();
+ std::cerr << yellow << "done in " << t.num_seconds()
+ << " seconds.\n" << white;
+#elif defined(DEBUG_TRACES)
+ std::cerr << yellow << "done.\n" << white;
+#endif
+ }
+
+ void export_inconsistent_stars_to_OFF_files(std::string const& filename_base) const {
+ // For each triangulation
+ for (std::size_t idx = 0; idx < m_points.size(); ++idx) {
+ // We build a SC along the way in case it's inconsistent
+ Simplicial_complex sc;
+ // For each cell
+ bool is_inconsistent = false;
+ Star::const_iterator it_inc_simplex = m_stars[idx].begin();
+ Star::const_iterator it_inc_simplex_end = m_stars[idx].end();
+ for (; it_inc_simplex != it_inc_simplex_end;
+ ++it_inc_simplex) {
+ // Skip infinite cells
+ if (is_infinite(*it_inc_simplex))
+ continue;
+
+ Simplex c = *it_inc_simplex;
+ c.insert(idx); // Add the missing index
+
+ sc.add_simplex(c);
+
+ // If we do not already know this star is inconsistent, test it
+ if (!is_inconsistent && !is_simplex_consistent(c))
+ is_inconsistent = true;
+ }
+
+ if (is_inconsistent) {
+ // Export star to OFF file
+ std::stringstream output_filename;
+ output_filename << filename_base << "_" << idx << ".off";
+ std::ofstream off_stream(output_filename.str().c_str());
+ export_to_off(sc, off_stream);
+ }
+ }
+ }
+
+ class Compare_distance_to_ref_point {
+ public:
+ Compare_distance_to_ref_point(Point const& ref, K const& k)
+ : m_ref(ref), m_k(k) { }
+
+ bool operator()(Point const& p1, Point const& p2) {
+ typename K::Squared_distance_d sqdist =
+ m_k.squared_distance_d_object();
+ return sqdist(p1, m_ref) < sqdist(p2, m_ref);
+ }
+
+ private:
+ Point const& m_ref;
+ K const& m_k;
+ };
+
+#ifdef GUDHI_USE_TBB
+ // Functor for compute_tangential_complex function
+ class Compute_tangent_triangulation {
+ Tangential_complex & m_tc;
+
+ public:
+ // Constructor
+ Compute_tangent_triangulation(Tangential_complex &tc)
+ : m_tc(tc) { }
+
+ // Constructor
+ Compute_tangent_triangulation(const Compute_tangent_triangulation &ctt)
+ : m_tc(ctt.m_tc) { }
+
+ // operator()
+ void operator()(const tbb::blocked_range<size_t>& r) const {
+ for (size_t i = r.begin(); i != r.end(); ++i)
+ m_tc.compute_tangent_triangulation(i);
+ }
+ };
+
+ // Functor for refresh_tangential_complex function
+ class Refresh_tangent_triangulation {
+ Tangential_complex & m_tc;
+ Points_ds const& m_updated_pts_ds;
+
+ public:
+ // Constructor
+ Refresh_tangent_triangulation(Tangential_complex &tc, Points_ds const& updated_pts_ds)
+ : m_tc(tc), m_updated_pts_ds(updated_pts_ds) { }
+
+ // Constructor
+ Refresh_tangent_triangulation(const Refresh_tangent_triangulation &ctt)
+ : m_tc(ctt.m_tc), m_updated_pts_ds(ctt.m_updated_pts_ds) { }
+
+ // operator()
+ void operator()(const tbb::blocked_range<size_t>& r) const {
+ for (size_t i = r.begin(); i != r.end(); ++i)
+ m_tc.refresh_tangent_triangulation(i, m_updated_pts_ds);
+ }
+ };
+#endif // GUDHI_USE_TBB
+
+ bool is_infinite(Simplex const& s) const {
+ return *s.rbegin() == (std::numeric_limits<std::size_t>::max)();
+ }
+
+ // Output: "triangulation" is a Regular Triangulation containing at least the
+ // star of "center_pt"
+ // Returns the handle of the center vertex
+ Tr_vertex_handle compute_star(std::size_t i, const Point &center_pt, const Tangent_space_basis &tsb,
+ Triangulation &triangulation, bool verbose = false) {
+ int tangent_space_dim = tsb.dimension();
+ const Tr_traits &local_tr_traits = triangulation.geom_traits();
+ Tr_vertex_handle center_vertex;
+
+ // Kernel functor & objects
+ typename K::Squared_distance_d k_sqdist = m_k.squared_distance_d_object();
+
+ // Triangulation's traits functor & objects
+ typename Tr_traits::Compute_weight_d point_weight = local_tr_traits.compute_weight_d_object();
+ typename Tr_traits::Power_center_d power_center = local_tr_traits.power_center_d_object();
+
+ //***************************************************
+ // Build a minimal triangulation in the tangent space
+ // (we only need the star of p)
+ //***************************************************
+
+ // Insert p
+ Tr_point proj_wp;
+ if (i == tsb.origin()) {
+ // Insert {(0, 0, 0...), m_weights[i]}
+ proj_wp = local_tr_traits.construct_weighted_point_d_object()(local_tr_traits.construct_point_d_object()(tangent_space_dim, CGAL::ORIGIN),
+ m_weights[i]);
+ } else {
+ const Weighted_point& wp = compute_perturbed_weighted_point(i);
+ proj_wp = project_point_and_compute_weight(wp, tsb, local_tr_traits);
+ }
+
+ center_vertex = triangulation.insert(proj_wp);
+ center_vertex->data() = i;
+ if (verbose)
+ std::cerr << "* Inserted point #" << i << "\n";
+
+#ifdef GUDHI_TC_VERY_VERBOSE
+ std::size_t num_attempts_to_insert_points = 1;
+ std::size_t num_inserted_points = 1;
+#endif
+ // const int NUM_NEIGHBORS = 150;
+ // KNS_range ins_range = m_points_ds.query_k_nearest_neighbors(center_pt, NUM_NEIGHBORS);
+ INS_range ins_range = m_points_ds.query_incremental_nearest_neighbors(center_pt);
+
+ // While building the local triangulation, we keep the radius
+ // of the sphere "star sphere" centered at "center_vertex"
+ // and which contains all the
+ // circumspheres of the star of "center_vertex"
+ boost::optional<FT> squared_star_sphere_radius_plus_margin;
+
+ // Insert points until we find a point which is outside "star sphere"
+ for (auto nn_it = ins_range.begin();
+ nn_it != ins_range.end();
+ ++nn_it) {
+ std::size_t neighbor_point_idx = nn_it->first;
+
+ // ith point = p, which is already inserted
+ if (neighbor_point_idx != i) {
+ // No need to lock the Mutex_for_perturb here since this will not be
+ // called while other threads are perturbing the positions
+ Point neighbor_pt;
+ FT neighbor_weight;
+ compute_perturbed_weighted_point(neighbor_point_idx, neighbor_pt, neighbor_weight);
+
+ if (squared_star_sphere_radius_plus_margin &&
+ k_sqdist(center_pt, neighbor_pt) > *squared_star_sphere_radius_plus_margin)
+ break;
+
+ Tr_point proj_pt = project_point_and_compute_weight(neighbor_pt, neighbor_weight, tsb,
+ local_tr_traits);
+
+#ifdef GUDHI_TC_VERY_VERBOSE
+ ++num_attempts_to_insert_points;
+#endif
+
+
+ Tr_vertex_handle vh = triangulation.insert_if_in_star(proj_pt, center_vertex);
+ // Tr_vertex_handle vh = triangulation.insert(proj_pt);
+ if (vh != Tr_vertex_handle() && vh->data() == (std::numeric_limits<std::size_t>::max)()) {
+#ifdef GUDHI_TC_VERY_VERBOSE
+ ++num_inserted_points;
+#endif
+ if (verbose)
+ std::cerr << "* Inserted point #" << neighbor_point_idx << "\n";
+
+ vh->data() = neighbor_point_idx;
+
+ // Let's recompute squared_star_sphere_radius_plus_margin
+ if (triangulation.current_dimension() >= tangent_space_dim) {
+ squared_star_sphere_radius_plus_margin = boost::none;
+ // Get the incident cells and look for the biggest circumsphere
+ std::vector<Tr_full_cell_handle> incident_cells;
+ triangulation.incident_full_cells(
+ center_vertex,
+ std::back_inserter(incident_cells));
+ for (typename std::vector<Tr_full_cell_handle>::iterator cit =
+ incident_cells.begin(); cit != incident_cells.end(); ++cit) {
+ Tr_full_cell_handle cell = *cit;
+ if (triangulation.is_infinite(cell)) {
+ squared_star_sphere_radius_plus_margin = boost::none;
+ break;
+ } else {
+ // Note that this uses the perturbed point since it uses
+ // the points of the local triangulation
+ Tr_point c = power_center(boost::make_transform_iterator(cell->vertices_begin(),
+ vertex_handle_to_point<Tr_point,
+ Tr_vertex_handle>),
+ boost::make_transform_iterator(cell->vertices_end(),
+ vertex_handle_to_point<Tr_point,
+ Tr_vertex_handle>));
+
+ FT sq_power_sphere_diam = 4 * point_weight(c);
+
+ if (!squared_star_sphere_radius_plus_margin ||
+ sq_power_sphere_diam > *squared_star_sphere_radius_plus_margin) {
+ squared_star_sphere_radius_plus_margin = sq_power_sphere_diam;
+ }
+ }
+ }
+
+ // Let's add the margin, now
+ // The value depends on whether we perturb weight or position
+ if (squared_star_sphere_radius_plus_margin) {
+ // "2*m_last_max_perturb" because both points can be perturbed
+ squared_star_sphere_radius_plus_margin = CGAL::square(std::sqrt(*squared_star_sphere_radius_plus_margin)
+ + 2 * m_last_max_perturb);
+
+ // Save it in `m_squared_star_spheres_radii_incl_margin`
+ m_squared_star_spheres_radii_incl_margin[i] =
+ *squared_star_sphere_radius_plus_margin;
+ } else {
+ m_squared_star_spheres_radii_incl_margin[i] = FT(-1);
+ }
+ }
+ }
+ }
+ }
+
+ return center_vertex;
+ }
+
+ void refresh_tangent_triangulation(std::size_t i, Points_ds const& updated_pts_ds, bool verbose = false) {
+ if (verbose)
+ std::cerr << "** Refreshing tangent tri #" << i << " **\n";
+
+ if (m_squared_star_spheres_radii_incl_margin[i] == FT(-1))
+ return compute_tangent_triangulation(i, verbose);
+
+ Point center_point = compute_perturbed_point(i);
+ // Among updated point, what is the closer from our center point?
+ std::size_t closest_pt_index =
+ updated_pts_ds.query_k_nearest_neighbors(center_point, 1, false).begin()->first;
+
+ typename K::Construct_weighted_point_d k_constr_wp =
+ m_k.construct_weighted_point_d_object();
+ typename K::Power_distance_d k_power_dist = m_k.power_distance_d_object();
+
+ // Construct a weighted point equivalent to the star sphere
+ Weighted_point star_sphere = k_constr_wp(compute_perturbed_point(i),
+ m_squared_star_spheres_radii_incl_margin[i]);
+ Weighted_point closest_updated_point =
+ compute_perturbed_weighted_point(closest_pt_index);
+
+ // Is the "closest point" inside our star sphere?
+ if (k_power_dist(star_sphere, closest_updated_point) <= FT(0))
+ compute_tangent_triangulation(i, verbose);
+ }
+
+ void compute_tangent_triangulation(std::size_t i, bool verbose = false) {
+ if (verbose)
+ std::cerr << "** Computing tangent tri #" << i << " **\n";
+ // std::cerr << "***********************************************\n";
+
+ // No need to lock the mutex here since this will not be called while
+ // other threads are perturbing the positions
+ const Point center_pt = compute_perturbed_point(i);
+ Tangent_space_basis &tsb = m_tangent_spaces[i];
+
+ // Estimate the tangent space
+ if (!m_are_tangent_spaces_computed[i]) {
+#ifdef GUDHI_TC_EXPORT_NORMALS
+ tsb = compute_tangent_space(center_pt, i, true /*normalize*/, &m_orth_spaces[i]);
+#else
+ tsb = compute_tangent_space(center_pt, i);
+#endif
+ }
+
+#if defined(GUDHI_TC_PROFILING) && defined(GUDHI_TC_VERY_VERBOSE)
+ Gudhi::Clock t;
+#endif
+ int tangent_space_dim = tangent_basis_dim(i);
+ Triangulation &local_tr =
+ m_triangulations[i].construct_triangulation(tangent_space_dim);
+
+ m_triangulations[i].center_vertex() =
+ compute_star(i, center_pt, tsb, local_tr, verbose);
+
+#if defined(GUDHI_TC_PROFILING) && defined(GUDHI_TC_VERY_VERBOSE)
+ t.end();
+ std::cerr << " - triangulation construction: " << t.num_seconds() << " s.\n";
+ t.reset();
+#endif
+
+#ifdef GUDHI_TC_VERY_VERBOSE
+ std::cerr << "Inserted " << num_inserted_points << " points / "
+ << num_attempts_to_insert_points << " attemps to compute the star\n";
+#endif
+
+ update_star(i);
+
+#if defined(GUDHI_TC_PROFILING) && defined(GUDHI_TC_VERY_VERBOSE)
+ t.end();
+ std::cerr << " - update_star: " << t.num_seconds() << " s.\n";
+#endif
+ }
+
+ // Updates m_stars[i] directly from m_triangulations[i]
+
+ void update_star(std::size_t i) {
+ Star &star = m_stars[i];
+ star.clear();
+ Triangulation &local_tr = m_triangulations[i].tr();
+ Tr_vertex_handle center_vertex = m_triangulations[i].center_vertex();
+ int cur_dim_plus_1 = local_tr.current_dimension() + 1;
+
+ std::vector<Tr_full_cell_handle> incident_cells;
+ local_tr.incident_full_cells(
+ center_vertex, std::back_inserter(incident_cells));
+
+ typename std::vector<Tr_full_cell_handle>::const_iterator it_c = incident_cells.begin();
+ typename std::vector<Tr_full_cell_handle>::const_iterator it_c_end = incident_cells.end();
+ // For each cell
+ for (; it_c != it_c_end; ++it_c) {
+ // Will contain all indices except center_vertex
+ Incident_simplex incident_simplex;
+ for (int j = 0; j < cur_dim_plus_1; ++j) {
+ std::size_t index = (*it_c)->vertex(j)->data();
+ if (index != i)
+ incident_simplex.insert(index);
+ }
+ GUDHI_CHECK(incident_simplex.size() == cur_dim_plus_1 - 1,
+ std::logic_error("update_star: wrong size of incident simplex"));
+ star.push_back(incident_simplex);
+ }
+ }
+
+ // Estimates tangent subspaces using PCA
+
+ Tangent_space_basis compute_tangent_space(const Point &p
+ , const std::size_t i
+ , bool normalize_basis = true
+ , Orthogonal_space_basis *p_orth_space_basis = NULL
+ ) {
+ unsigned int num_pts_for_pca = (std::min)(static_cast<unsigned int> (std::pow(GUDHI_TC_BASE_VALUE_FOR_PCA, m_intrinsic_dim)),
+ static_cast<unsigned int> (m_points.size()));
+
+ // Kernel functors
+ typename K::Construct_vector_d constr_vec =
+ m_k.construct_vector_d_object();
+ typename K::Compute_coordinate_d coord =
+ m_k.compute_coordinate_d_object();
+
+#ifdef GUDHI_TC_USE_ANOTHER_POINT_SET_FOR_TANGENT_SPACE_ESTIM
+ KNS_range kns_range = m_points_ds_for_tse.query_k_nearest_neighbors(
+ p, num_pts_for_pca, false);
+ const Points &points_for_pca = m_points_for_tse;
+#else
+ KNS_range kns_range = m_points_ds.query_k_nearest_neighbors(p, num_pts_for_pca, false);
+ const Points &points_for_pca = m_points;
+#endif
+
+ // One row = one point
+ Eigen::MatrixXd mat_points(num_pts_for_pca, m_ambient_dim);
+ auto nn_it = kns_range.begin();
+ for (unsigned int j = 0;
+ j < num_pts_for_pca && nn_it != kns_range.end();
+ ++j, ++nn_it) {
+ for (int i = 0; i < m_ambient_dim; ++i) {
+ mat_points(j, i) = CGAL::to_double(coord(points_for_pca[nn_it->first], i));
+ }
+ }
+ Eigen::MatrixXd centered = mat_points.rowwise() - mat_points.colwise().mean();
+ Eigen::MatrixXd cov = centered.adjoint() * centered;
+ Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> eig(cov);
+
+ Tangent_space_basis tsb(i); // p = compute_perturbed_point(i) here
+
+ // The eigenvectors are sorted in increasing order of their corresponding
+ // eigenvalues
+ for (int j = m_ambient_dim - 1;
+ j >= m_ambient_dim - m_intrinsic_dim;
+ --j) {
+ if (normalize_basis) {
+ Vector v = constr_vec(m_ambient_dim,
+ eig.eigenvectors().col(j).data(),
+ eig.eigenvectors().col(j).data() + m_ambient_dim);
+ tsb.push_back(normalize_vector(v, m_k));
+ } else {
+ tsb.push_back(constr_vec(
+ m_ambient_dim,
+ eig.eigenvectors().col(j).data(),
+ eig.eigenvectors().col(j).data() + m_ambient_dim));
+ }
+ }
+
+ if (p_orth_space_basis) {
+ p_orth_space_basis->set_origin(i);
+ for (int j = m_ambient_dim - m_intrinsic_dim - 1;
+ j >= 0;
+ --j) {
+ if (normalize_basis) {
+ Vector v = constr_vec(m_ambient_dim,
+ eig.eigenvectors().col(j).data(),
+ eig.eigenvectors().col(j).data() + m_ambient_dim);
+ p_orth_space_basis->push_back(normalize_vector(v, m_k));
+ } else {
+ p_orth_space_basis->push_back(constr_vec(
+ m_ambient_dim,
+ eig.eigenvectors().col(j).data(),
+ eig.eigenvectors().col(j).data() + m_ambient_dim));
+ }
+ }
+ }
+
+ m_are_tangent_spaces_computed[i] = true;
+
+ return tsb;
+ }
+
+ // Compute the space tangent to a simplex (p1, p2, ... pn)
+ // TODO(CJ): Improve this?
+ // Basically, it takes all the neighbor points to p1, p2... pn and runs PCA
+ // on it. Note that most points are duplicated.
+
+ Tangent_space_basis compute_tangent_space(const Simplex &s, bool normalize_basis = true) {
+ unsigned int num_pts_for_pca = (std::min)(static_cast<unsigned int> (std::pow(GUDHI_TC_BASE_VALUE_FOR_PCA, m_intrinsic_dim)),
+ static_cast<unsigned int> (m_points.size()));
+
+ // Kernel functors
+ typename K::Construct_vector_d constr_vec =
+ m_k.construct_vector_d_object();
+ typename K::Compute_coordinate_d coord =
+ m_k.compute_coordinate_d_object();
+ typename K::Squared_length_d sqlen =
+ m_k.squared_length_d_object();
+ typename K::Scaled_vector_d scaled_vec =
+ m_k.scaled_vector_d_object();
+ typename K::Scalar_product_d scalar_pdct =
+ m_k.scalar_product_d_object();
+ typename K::Difference_of_vectors_d diff_vec =
+ m_k.difference_of_vectors_d_object();
+
+ // One row = one point
+ Eigen::MatrixXd mat_points(s.size() * num_pts_for_pca, m_ambient_dim);
+ unsigned int current_row = 0;
+
+ for (Simplex::const_iterator it_index = s.begin();
+ it_index != s.end(); ++it_index) {
+ const Point &p = m_points[*it_index];
+
+#ifdef GUDHI_TC_USE_ANOTHER_POINT_SET_FOR_TANGENT_SPACE_ESTIM
+ KNS_range kns_range = m_points_ds_for_tse.query_k_nearest_neighbors(
+ p, num_pts_for_pca, false);
+ const Points &points_for_pca = m_points_for_tse;
+#else
+ KNS_range kns_range = m_points_ds.query_k_nearest_neighbors(p, num_pts_for_pca, false);
+ const Points &points_for_pca = m_points;
+#endif
+
+ auto nn_it = kns_range.begin();
+ for (;
+ current_row < num_pts_for_pca && nn_it != kns_range.end();
+ ++current_row, ++nn_it) {
+ for (int i = 0; i < m_ambient_dim; ++i) {
+ mat_points(current_row, i) =
+ CGAL::to_double(coord(points_for_pca[nn_it->first], i));
+ }
+ }
+ }
+ Eigen::MatrixXd centered = mat_points.rowwise() - mat_points.colwise().mean();
+ Eigen::MatrixXd cov = centered.adjoint() * centered;
+ Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> eig(cov);
+
+ Tangent_space_basis tsb;
+
+ // The eigenvectors are sorted in increasing order of their corresponding
+ // eigenvalues
+ for (int j = m_ambient_dim - 1;
+ j >= m_ambient_dim - m_intrinsic_dim;
+ --j) {
+ if (normalize_basis) {
+ Vector v = constr_vec(m_ambient_dim,
+ eig.eigenvectors().col(j).data(),
+ eig.eigenvectors().col(j).data() + m_ambient_dim);
+ tsb.push_back(normalize_vector(v, m_k));
+ } else {
+ tsb.push_back(constr_vec(
+ m_ambient_dim,
+ eig.eigenvectors().col(j).data(),
+ eig.eigenvectors().col(j).data() + m_ambient_dim));
+ }
+ }
+
+ return tsb;
+ }
+
+ // Returns the dimension of the ith local triangulation
+
+ int tangent_basis_dim(std::size_t i) const {
+ return m_tangent_spaces[i].dimension();
+ }
+
+ Point compute_perturbed_point(std::size_t pt_idx) const {
+#ifdef GUDHI_TC_PERTURB_POSITION
+ return m_k.translated_point_d_object()(
+ m_points[pt_idx], m_translations[pt_idx]);
+#else
+ return m_points[pt_idx];
+#endif
+ }
+
+ void compute_perturbed_weighted_point(std::size_t pt_idx, Point &p, FT &w) const {
+#ifdef GUDHI_TC_PERTURB_POSITION
+ p = m_k.translated_point_d_object()(
+ m_points[pt_idx], m_translations[pt_idx]);
+#else
+ p = m_points[pt_idx];
+#endif
+ w = m_weights[pt_idx];
+ }
+
+ Weighted_point compute_perturbed_weighted_point(std::size_t pt_idx) const {
+ typename K::Construct_weighted_point_d k_constr_wp =
+ m_k.construct_weighted_point_d_object();
+
+ Weighted_point wp = k_constr_wp(
+#ifdef GUDHI_TC_PERTURB_POSITION
+ m_k.translated_point_d_object()(m_points[pt_idx], m_translations[pt_idx]),
+#else
+ m_points[pt_idx],
+#endif
+ m_weights[pt_idx]);
+
+ return wp;
+ }
+
+ Point unproject_point(const Tr_point &p,
+ const Tangent_space_basis &tsb,
+ const Tr_traits &tr_traits) const {
+ typename K::Translated_point_d k_transl =
+ m_k.translated_point_d_object();
+ typename K::Scaled_vector_d k_scaled_vec =
+ m_k.scaled_vector_d_object();
+ typename Tr_traits::Compute_coordinate_d coord =
+ tr_traits.compute_coordinate_d_object();
+
+ Point global_point = compute_perturbed_point(tsb.origin());
+ for (int i = 0; i < m_intrinsic_dim; ++i)
+ global_point = k_transl(global_point,
+ k_scaled_vec(tsb[i], coord(p, i)));
+
+ return global_point;
+ }
+
+ // Project the point in the tangent space
+ // Resulting point coords are expressed in tsb's space
+ Tr_bare_point project_point(const Point &p,
+ const Tangent_space_basis &tsb,
+ const Tr_traits &tr_traits) const {
+ typename K::Scalar_product_d scalar_pdct =
+ m_k.scalar_product_d_object();
+ typename K::Difference_of_points_d diff_points =
+ m_k.difference_of_points_d_object();
+
+ Vector v = diff_points(p, compute_perturbed_point(tsb.origin()));
+
+ std::vector<FT> coords;
+ // Ambiant-space coords of the projected point
+ coords.reserve(tsb.dimension());
+ for (std::size_t i = 0; i < m_intrinsic_dim; ++i) {
+ // Local coords are given by the scalar product with the vectors of tsb
+ FT coord = scalar_pdct(v, tsb[i]);
+ coords.push_back(coord);
+ }
+
+ return tr_traits.construct_point_d_object()(
+ static_cast<int> (coords.size()), coords.begin(), coords.end());
+ }
+
+ // Project the point in the tangent space
+ // The weight will be the squared distance between p and the projection of p
+ // Resulting point coords are expressed in tsb's space
+
+ Tr_point project_point_and_compute_weight(const Weighted_point &wp,
+ const Tangent_space_basis &tsb,
+ const Tr_traits &tr_traits) const {
+ typename K::Point_drop_weight_d k_drop_w =
+ m_k.point_drop_weight_d_object();
+ typename K::Compute_weight_d k_point_weight =
+ m_k.compute_weight_d_object();
+ return project_point_and_compute_weight(
+ k_drop_w(wp), k_point_weight(wp), tsb, tr_traits);
+ }
+
+ // Same as above, with slightly different parameters
+ Tr_point project_point_and_compute_weight(const Point &p, const FT w,
+ const Tangent_space_basis &tsb,
+ const Tr_traits &tr_traits) const {
+ const int point_dim = m_k.point_dimension_d_object()(p);
+
+ typename K::Construct_point_d constr_pt =
+ m_k.construct_point_d_object();
+ typename K::Scalar_product_d scalar_pdct =
+ m_k.scalar_product_d_object();
+ typename K::Difference_of_points_d diff_points =
+ m_k.difference_of_points_d_object();
+ typename K::Compute_coordinate_d coord =
+ m_k.compute_coordinate_d_object();
+ typename K::Construct_cartesian_const_iterator_d ccci =
+ m_k.construct_cartesian_const_iterator_d_object();
+
+ Point origin = compute_perturbed_point(tsb.origin());
+ Vector v = diff_points(p, origin);
+
+ // Same dimension? Then the weight is 0
+ bool same_dim = (point_dim == tsb.dimension());
+
+ std::vector<FT> coords;
+ // Ambiant-space coords of the projected point
+ std::vector<FT> p_proj(ccci(origin), ccci(origin, 0));
+ coords.reserve(tsb.dimension());
+ for (int i = 0; i < tsb.dimension(); ++i) {
+ // Local coords are given by the scalar product with the vectors of tsb
+ FT c = scalar_pdct(v, tsb[i]);
+ coords.push_back(c);
+
+ // p_proj += c * tsb[i]
+ if (!same_dim) {
+ for (int j = 0; j < point_dim; ++j)
+ p_proj[j] += c * coord(tsb[i], j);
+ }
+ }
+
+ // Same dimension? Then the weight is 0
+ FT sq_dist_to_proj_pt = 0;
+ if (!same_dim) {
+ Point projected_pt = constr_pt(point_dim, p_proj.begin(), p_proj.end());
+ sq_dist_to_proj_pt = m_k.squared_distance_d_object()(p, projected_pt);
+ }
+
+ return tr_traits.construct_weighted_point_d_object()
+ (tr_traits.construct_point_d_object()(static_cast<int> (coords.size()), coords.begin(), coords.end()),
+ w - sq_dist_to_proj_pt);
+ }
+
+ // Project all the points in the tangent space
+
+ template <typename Indexed_point_range>
+ std::vector<Tr_point> project_points_and_compute_weights(
+ const Indexed_point_range &point_indices,
+ const Tangent_space_basis &tsb,
+ const Tr_traits &tr_traits) const {
+ std::vector<Tr_point> ret;
+ for (typename Indexed_point_range::const_iterator
+ it = point_indices.begin(), it_end = point_indices.end();
+ it != it_end; ++it) {
+ ret.push_back(project_point_and_compute_weight(
+ compute_perturbed_weighted_point(*it), tsb, tr_traits));
+ }
+ return ret;
+ }
+
+ // A simplex here is a local tri's full cell handle
+
+ bool is_simplex_consistent(Tr_full_cell_handle fch, int cur_dim) const {
+ Simplex c;
+ for (int i = 0; i < cur_dim + 1; ++i) {
+ std::size_t data = fch->vertex(i)->data();
+ c.insert(data);
+ }
+ return is_simplex_consistent(c);
+ }
+
+ // A simplex here is a list of point indices
+ // TODO(CJ): improve it like the other "is_simplex_consistent" below
+
+ bool is_simplex_consistent(Simplex const& simplex) const {
+ // Check if the simplex is in the stars of all its vertices
+ Simplex::const_iterator it_point_idx = simplex.begin();
+ // For each point p of the simplex, we parse the incidents cells of p
+ // and we check if "simplex" is among them
+ for (; it_point_idx != simplex.end(); ++it_point_idx) {
+ std::size_t point_idx = *it_point_idx;
+ // Don't check infinite simplices
+ if (point_idx == (std::numeric_limits<std::size_t>::max)())
+ continue;
+
+ Star const& star = m_stars[point_idx];
+
+ // What we're looking for is "simplex" \ point_idx
+ Incident_simplex is_to_find = simplex;
+ is_to_find.erase(point_idx);
+
+ // For each cell
+ if (std::find(star.begin(), star.end(), is_to_find) == star.end())
+ return false;
+ }
+
+ return true;
+ }
+
+ // A simplex here is a list of point indices
+ // "s" contains all the points of the simplex except "center_point"
+ // This function returns the points whose star doesn't contain the simplex
+ // N.B.: the function assumes that the simplex is contained in
+ // star(center_point)
+
+ template <typename OutputIterator> // value_type = std::size_t
+ bool is_simplex_consistent(
+ std::size_t center_point,
+ Incident_simplex const& s, // without "center_point"
+ OutputIterator points_whose_star_does_not_contain_s,
+ bool check_also_in_non_maximal_faces = false) const {
+ Simplex full_simplex = s;
+ full_simplex.insert(center_point);
+
+ // Check if the simplex is in the stars of all its vertices
+ Incident_simplex::const_iterator it_point_idx = s.begin();
+ // For each point p of the simplex, we parse the incidents cells of p
+ // and we check if "simplex" is among them
+ for (; it_point_idx != s.end(); ++it_point_idx) {
+ std::size_t point_idx = *it_point_idx;
+ // Don't check infinite simplices
+ if (point_idx == (std::numeric_limits<std::size_t>::max)())
+ continue;
+
+ Star const& star = m_stars[point_idx];
+
+ // What we're looking for is full_simplex \ point_idx
+ Incident_simplex is_to_find = full_simplex;
+ is_to_find.erase(point_idx);
+
+ if (check_also_in_non_maximal_faces) {
+ // For each simplex "is" of the star, check if ic_to_simplex is
+ // included in "is"
+ bool found = false;
+ for (Star::const_iterator is = star.begin(), is_end = star.end();
+ !found && is != is_end; ++is) {
+ if (std::includes(is->begin(), is->end(),
+ is_to_find.begin(), is_to_find.end()))
+ found = true;
+ }
+
+ if (!found)
+ *points_whose_star_does_not_contain_s++ = point_idx;
+ } else {
+ // Does the star contain is_to_find?
+ if (std::find(star.begin(), star.end(), is_to_find) == star.end())
+ *points_whose_star_does_not_contain_s++ = point_idx;
+ }
+ }
+
+ return true;
+ }
+
+ // A simplex here is a list of point indices
+ // It looks for s in star(p).
+ // "s" contains all the points of the simplex except p.
+ bool is_simplex_in_star(std::size_t p,
+ Incident_simplex const& s,
+ bool check_also_in_non_maximal_faces = true) const {
+ Star const& star = m_stars[p];
+
+ if (check_also_in_non_maximal_faces) {
+ // For each simplex "is" of the star, check if ic_to_simplex is
+ // included in "is"
+ bool found = false;
+ for (Star::const_iterator is = star.begin(), is_end = star.end();
+ !found && is != is_end; ++is) {
+ if (std::includes(is->begin(), is->end(), s.begin(), s.end()))
+ found = true;
+ }
+
+ return found;
+ } else {
+ return !(std::find(star.begin(), star.end(), s) == star.end());
+ }
+ }
+
+#ifdef GUDHI_USE_TBB
+ // Functor for try_to_solve_inconsistencies_in_a_local_triangulation function
+ class Try_to_solve_inconsistencies_in_a_local_triangulation {
+ Tangential_complex & m_tc;
+ double m_max_perturb;
+ tbb::combinable<std::size_t> &m_num_inconsistencies;
+ tbb::combinable<std::vector<std::size_t> > &m_updated_points;
+
+ public:
+ // Constructor
+ Try_to_solve_inconsistencies_in_a_local_triangulation(Tangential_complex &tc,
+ double max_perturb,
+ tbb::combinable<std::size_t> &num_inconsistencies,
+ tbb::combinable<std::vector<std::size_t> > &updated_points)
+ : m_tc(tc),
+ m_max_perturb(max_perturb),
+ m_num_inconsistencies(num_inconsistencies),
+ m_updated_points(updated_points) { }
+
+ // Constructor
+ Try_to_solve_inconsistencies_in_a_local_triangulation(const Try_to_solve_inconsistencies_in_a_local_triangulation&
+ tsilt)
+ : m_tc(tsilt.m_tc),
+ m_max_perturb(tsilt.m_max_perturb),
+ m_num_inconsistencies(tsilt.m_num_inconsistencies),
+ m_updated_points(tsilt.m_updated_points) { }
+
+ // operator()
+ void operator()(const tbb::blocked_range<size_t>& r) const {
+ for (size_t i = r.begin(); i != r.end(); ++i) {
+ m_num_inconsistencies.local() +=
+ m_tc.try_to_solve_inconsistencies_in_a_local_triangulation(i, m_max_perturb,
+ std::back_inserter(m_updated_points.local()));
+ }
+ }
+ };
+#endif // GUDHI_USE_TBB
+
+ void perturb(std::size_t point_idx, double max_perturb) {
+ const Tr_traits &local_tr_traits =
+ m_triangulations[point_idx].tr().geom_traits();
+ typename Tr_traits::Compute_coordinate_d coord =
+ local_tr_traits.compute_coordinate_d_object();
+ typename K::Translated_point_d k_transl =
+ m_k.translated_point_d_object();
+ typename K::Construct_vector_d k_constr_vec =
+ m_k.construct_vector_d_object();
+ typename K::Scaled_vector_d k_scaled_vec =
+ m_k.scaled_vector_d_object();
+
+ CGAL::Random_points_in_ball_d<Tr_bare_point>
+ tr_point_in_ball_generator(m_intrinsic_dim,
+ m_random_generator.get_double(0., max_perturb));
+
+ Tr_point local_random_transl =
+ local_tr_traits.construct_weighted_point_d_object()(*tr_point_in_ball_generator++, 0);
+ Translation_for_perturb global_transl = k_constr_vec(m_ambient_dim);
+ const Tangent_space_basis &tsb = m_tangent_spaces[point_idx];
+ for (int i = 0; i < m_intrinsic_dim; ++i) {
+ global_transl = k_transl(global_transl,
+ k_scaled_vec(tsb[i], coord(local_random_transl, i)));
+ }
+ // Parallel
+#if defined(GUDHI_USE_TBB)
+ m_p_perturb_mutexes[point_idx].lock();
+ m_translations[point_idx] = global_transl;
+ m_p_perturb_mutexes[point_idx].unlock();
+ // Sequential
+#else
+ m_translations[point_idx] = global_transl;
+#endif
+ }
+
+ // Return true if inconsistencies were found
+ template <typename OutputIt>
+ bool try_to_solve_inconsistencies_in_a_local_triangulation(std::size_t tr_index,
+ double max_perturb,
+ OutputIt perturbed_pts_indices = CGAL::Emptyset_iterator()) {
+ bool is_inconsistent = false;
+
+ Star const& star = m_stars[tr_index];
+ Tr_vertex_handle center_vh = m_triangulations[tr_index].center_vertex();
+
+ // For each incident simplex
+ Star::const_iterator it_inc_simplex = star.begin();
+ Star::const_iterator it_inc_simplex_end = star.end();
+ for (; it_inc_simplex != it_inc_simplex_end; ++it_inc_simplex) {
+ const Incident_simplex &incident_simplex = *it_inc_simplex;
+
+ // Don't check infinite cells
+ if (is_infinite(incident_simplex))
+ continue;
+
+ Simplex c = incident_simplex;
+ c.insert(tr_index); // Add the missing index
+
+ // Perturb the center point
+ if (!is_simplex_consistent(c)) {
+ is_inconsistent = true;
+
+ std::size_t idx = tr_index;
+
+ perturb(tr_index, max_perturb);
+ *perturbed_pts_indices++ = idx;
+
+ // We will try the other cells next time
+ break;
+ }
+ }
+
+ return is_inconsistent;
+ }
+
+
+ // 1st line: number of points
+ // Then one point per line
+ std::ostream &export_point_set(std::ostream & os,
+ bool use_perturbed_points = false,
+ const char *coord_separator = " ") const {
+ if (use_perturbed_points) {
+ std::vector<Point> perturbed_points;
+ perturbed_points.reserve(m_points.size());
+ for (std::size_t i = 0; i < m_points.size(); ++i)
+ perturbed_points.push_back(compute_perturbed_point(i));
+
+ return export_point_set(
+ m_k, perturbed_points, os, coord_separator);
+ } else {
+ return export_point_set(
+ m_k, m_points, os, coord_separator);
+ }
+ }
+
+ template<typename ProjectionFunctor = CGAL::Identity<Point> >
+ std::ostream &export_vertices_to_off(
+ std::ostream & os, std::size_t &num_vertices,
+ bool use_perturbed_points = false,
+ ProjectionFunctor const& point_projection = ProjectionFunctor()) const {
+ if (m_points.empty()) {
+ num_vertices = 0;
+ return os;
+ }
+
+ // If m_intrinsic_dim = 1, we output each point two times
+ // to be able to export each segment as a flat triangle with 3 different
+ // indices (otherwise, Meshlab detects degenerated simplices)
+ const int N = (m_intrinsic_dim == 1 ? 2 : 1);
+
+ // Kernel functors
+ typename K::Compute_coordinate_d coord =
+ m_k.compute_coordinate_d_object();
+
+#ifdef GUDHI_TC_EXPORT_ALL_COORDS_IN_OFF
+ int num_coords = m_ambient_dim;
+#else
+ int num_coords = (std::min)(m_ambient_dim, 3);
+#endif
+
+#ifdef GUDHI_TC_EXPORT_NORMALS
+ OS_container::const_iterator it_os = m_orth_spaces.begin();
+#endif
+ typename Points::const_iterator it_p = m_points.begin();
+ typename Points::const_iterator it_p_end = m_points.end();
+ // For each point p
+ for (std::size_t i = 0; it_p != it_p_end; ++it_p, ++i) {
+ Point p = point_projection(
+ use_perturbed_points ? compute_perturbed_point(i) : *it_p);
+ for (int ii = 0; ii < N; ++ii) {
+ int j = 0;
+ for (; j < num_coords; ++j)
+ os << CGAL::to_double(coord(p, j)) << " ";
+ if (j == 2)
+ os << "0";
+
+#ifdef GUDHI_TC_EXPORT_NORMALS
+ for (j = 0; j < num_coords; ++j)
+ os << " " << CGAL::to_double(coord(*it_os->begin(), j));
+#endif
+ os << "\n";
+ }
+#ifdef GUDHI_TC_EXPORT_NORMALS
+ ++it_os;
+#endif
+ }
+
+ num_vertices = N * m_points.size();
+ return os;
+ }
+
+ std::ostream &export_simplices_to_off(std::ostream & os, std::size_t &num_OFF_simplices,
+ bool color_inconsistencies = false,
+ Simplex_set const *p_simpl_to_color_in_red = NULL,
+ Simplex_set const *p_simpl_to_color_in_green = NULL,
+ Simplex_set const *p_simpl_to_color_in_blue = NULL)
+ const {
+ // If m_intrinsic_dim = 1, each point is output two times
+ // (see export_vertices_to_off)
+ num_OFF_simplices = 0;
+ std::size_t num_maximal_simplices = 0;
+ std::size_t num_inconsistent_maximal_simplices = 0;
+ std::size_t num_inconsistent_stars = 0;
+ typename Tr_container::const_iterator it_tr = m_triangulations.begin();
+ typename Tr_container::const_iterator it_tr_end = m_triangulations.end();
+ // For each triangulation
+ for (std::size_t idx = 0; it_tr != it_tr_end; ++it_tr, ++idx) {
+ bool is_star_inconsistent = false;
+
+ Triangulation const& tr = it_tr->tr();
+ Tr_vertex_handle center_vh = it_tr->center_vertex();
+
+ if (tr.current_dimension() < m_intrinsic_dim)
+ continue;
+
+ // Color for this star
+ std::stringstream color;
+ // color << rand()%256 << " " << 100+rand()%156 << " " << 100+rand()%156;
+ color << 128 << " " << 128 << " " << 128;
+
+ // Gather the triangles here, with an int telling its color
+ typedef std::vector<std::pair<Simplex, int> > Star_using_triangles;
+ Star_using_triangles star_using_triangles;
+
+ // For each cell of the star
+ Star::const_iterator it_inc_simplex = m_stars[idx].begin();
+ Star::const_iterator it_inc_simplex_end = m_stars[idx].end();
+ for (; it_inc_simplex != it_inc_simplex_end; ++it_inc_simplex) {
+ Simplex c = *it_inc_simplex;
+ c.insert(idx);
+ std::size_t num_vertices = c.size();
+ ++num_maximal_simplices;
+
+ int color_simplex = -1; // -1=no color, 0=yellow, 1=red, 2=green, 3=blue
+ if (color_inconsistencies && !is_simplex_consistent(c)) {
+ ++num_inconsistent_maximal_simplices;
+ color_simplex = 0;
+ is_star_inconsistent = true;
+ } else {
+ if (p_simpl_to_color_in_red &&
+ std::find(
+ p_simpl_to_color_in_red->begin(),
+ p_simpl_to_color_in_red->end(),
+ c) != p_simpl_to_color_in_red->end()) {
+ color_simplex = 1;
+ } else if (p_simpl_to_color_in_green &&
+ std::find(
+ p_simpl_to_color_in_green->begin(),
+ p_simpl_to_color_in_green->end(),
+ c) != p_simpl_to_color_in_green->end()) {
+ color_simplex = 2;
+ } else if (p_simpl_to_color_in_blue &&
+ std::find(
+ p_simpl_to_color_in_blue->begin(),
+ p_simpl_to_color_in_blue->end(),
+ c) != p_simpl_to_color_in_blue->end()) {
+ color_simplex = 3;
+ }
+ }
+
+ // If m_intrinsic_dim = 1, each point is output two times,
+ // so we need to multiply each index by 2
+ // And if only 2 vertices, add a third one (each vertex is duplicated in
+ // the file when m_intrinsic dim = 2)
+ if (m_intrinsic_dim == 1) {
+ Simplex tmp_c;
+ Simplex::iterator it = c.begin();
+ for (; it != c.end(); ++it)
+ tmp_c.insert(*it * 2);
+ if (num_vertices == 2)
+ tmp_c.insert(*tmp_c.rbegin() + 1);
+
+ c = tmp_c;
+ }
+
+ if (num_vertices <= 3) {
+ star_using_triangles.push_back(std::make_pair(c, color_simplex));
+ } else {
+ // num_vertices >= 4: decompose the simplex in triangles
+ std::vector<bool> booleans(num_vertices, false);
+ std::fill(booleans.begin() + num_vertices - 3, booleans.end(), true);
+ do {
+ Simplex triangle;
+ Simplex::iterator it = c.begin();
+ for (int i = 0; it != c.end(); ++i, ++it) {
+ if (booleans[i])
+ triangle.insert(*it);
+ }
+ star_using_triangles.push_back(
+ std::make_pair(triangle, color_simplex));
+ } while (std::next_permutation(booleans.begin(), booleans.end()));
+ }
+ }
+
+ // For each cell
+ Star_using_triangles::const_iterator it_simplex =
+ star_using_triangles.begin();
+ Star_using_triangles::const_iterator it_simplex_end =
+ star_using_triangles.end();
+ for (; it_simplex != it_simplex_end; ++it_simplex) {
+ const Simplex &c = it_simplex->first;
+
+ // Don't export infinite cells
+ if (is_infinite(c))
+ continue;
+
+ int color_simplex = it_simplex->second;
+
+ std::stringstream sstr_c;
+
+ Simplex::const_iterator it_point_idx = c.begin();
+ for (; it_point_idx != c.end(); ++it_point_idx) {
+ sstr_c << *it_point_idx << " ";
+ }
+
+ os << 3 << " " << sstr_c.str();
+ if (color_inconsistencies || p_simpl_to_color_in_red
+ || p_simpl_to_color_in_green || p_simpl_to_color_in_blue) {
+ switch (color_simplex) {
+ case 0: os << " 255 255 0";
+ break;
+ case 1: os << " 255 0 0";
+ break;
+ case 2: os << " 0 255 0";
+ break;
+ case 3: os << " 0 0 255";
+ break;
+ default: os << " " << color.str();
+ break;
+ }
+ }
+ ++num_OFF_simplices;
+ os << "\n";
+ }
+ if (is_star_inconsistent)
+ ++num_inconsistent_stars;
+ }
+
+#ifdef DEBUG_TRACES
+ std::cerr
+ << "\n==========================================================\n"
+ << "Export from list of stars to OFF:\n"
+ << " * Number of vertices: " << m_points.size() << "\n"
+ << " * Total number of maximal simplices: " << num_maximal_simplices
+ << "\n";
+ if (color_inconsistencies) {
+ std::cerr
+ << " * Number of inconsistent stars: "
+ << num_inconsistent_stars << " ("
+ << (m_points.size() > 0 ?
+ 100. * num_inconsistent_stars / m_points.size() : 0.) << "%)\n"
+ << " * Number of inconsistent maximal simplices: "
+ << num_inconsistent_maximal_simplices << " ("
+ << (num_maximal_simplices > 0 ?
+ 100. * num_inconsistent_maximal_simplices / num_maximal_simplices
+ : 0.) << "%)\n";
+ }
+ std::cerr << "==========================================================\n";
+#endif
+
+ return os;
+ }
+
+ public:
+ std::ostream &export_simplices_to_off(
+ const Simplicial_complex &complex,
+ std::ostream & os, std::size_t &num_OFF_simplices,
+ Simplex_set const *p_simpl_to_color_in_red = NULL,
+ Simplex_set const *p_simpl_to_color_in_green = NULL,
+ Simplex_set const *p_simpl_to_color_in_blue = NULL)
+ const {
+ typedef Simplicial_complex::Simplex Simplex;
+ typedef Simplicial_complex::Simplex_set Simplex_set;
+
+ // If m_intrinsic_dim = 1, each point is output two times
+ // (see export_vertices_to_off)
+ num_OFF_simplices = 0;
+ std::size_t num_maximal_simplices = 0;
+
+ typename Simplex_set::const_iterator it_s =
+ complex.simplex_range().begin();
+ typename Simplex_set::const_iterator it_s_end =
+ complex.simplex_range().end();
+ // For each simplex
+ for (; it_s != it_s_end; ++it_s) {
+ Simplex c = *it_s;
+ ++num_maximal_simplices;
+
+ int color_simplex = -1; // -1=no color, 0=yellow, 1=red, 2=green, 3=blue
+ if (p_simpl_to_color_in_red &&
+ std::find(
+ p_simpl_to_color_in_red->begin(),
+ p_simpl_to_color_in_red->end(),
+ c) != p_simpl_to_color_in_red->end()) {
+ color_simplex = 1;
+ } else if (p_simpl_to_color_in_green &&
+ std::find(p_simpl_to_color_in_green->begin(),
+ p_simpl_to_color_in_green->end(),
+ c) != p_simpl_to_color_in_green->end()) {
+ color_simplex = 2;
+ } else if (p_simpl_to_color_in_blue &&
+ std::find(p_simpl_to_color_in_blue->begin(),
+ p_simpl_to_color_in_blue->end(),
+ c) != p_simpl_to_color_in_blue->end()) {
+ color_simplex = 3;
+ }
+
+ // Gather the triangles here
+ typedef std::vector<Simplex> Triangles;
+ Triangles triangles;
+
+ int num_vertices = static_cast<int>(c.size());
+ // Do not export smaller dimension simplices
+ if (num_vertices < m_intrinsic_dim + 1)
+ continue;
+
+ // If m_intrinsic_dim = 1, each point is output two times,
+ // so we need to multiply each index by 2
+ // And if only 2 vertices, add a third one (each vertex is duplicated in
+ // the file when m_intrinsic dim = 2)
+ if (m_intrinsic_dim == 1) {
+ Simplex tmp_c;
+ Simplex::iterator it = c.begin();
+ for (; it != c.end(); ++it)
+ tmp_c.insert(*it * 2);
+ if (num_vertices == 2)
+ tmp_c.insert(*tmp_c.rbegin() + 1);
+
+ c = tmp_c;
+ }
+
+ if (num_vertices <= 3) {
+ triangles.push_back(c);
+ } else {
+ // num_vertices >= 4: decompose the simplex in triangles
+ std::vector<bool> booleans(num_vertices, false);
+ std::fill(booleans.begin() + num_vertices - 3, booleans.end(), true);
+ do {
+ Simplex triangle;
+ Simplex::iterator it = c.begin();
+ for (int i = 0; it != c.end(); ++i, ++it) {
+ if (booleans[i])
+ triangle.insert(*it);
+ }
+ triangles.push_back(triangle);
+ } while (std::next_permutation(booleans.begin(), booleans.end()));
+ }
+
+ // For each cell
+ Triangles::const_iterator it_tri = triangles.begin();
+ Triangles::const_iterator it_tri_end = triangles.end();
+ for (; it_tri != it_tri_end; ++it_tri) {
+ // Don't export infinite cells
+ if (is_infinite(*it_tri))
+ continue;
+
+ os << 3 << " ";
+ Simplex::const_iterator it_point_idx = it_tri->begin();
+ for (; it_point_idx != it_tri->end(); ++it_point_idx) {
+ os << *it_point_idx << " ";
+ }
+
+ if (p_simpl_to_color_in_red || p_simpl_to_color_in_green
+ || p_simpl_to_color_in_blue) {
+ switch (color_simplex) {
+ case 0: os << " 255 255 0";
+ break;
+ case 1: os << " 255 0 0";
+ break;
+ case 2: os << " 0 255 0";
+ break;
+ case 3: os << " 0 0 255";
+ break;
+ default: os << " 128 128 128";
+ break;
+ }
+ }
+
+ ++num_OFF_simplices;
+ os << "\n";
+ }
+ }
+
+#ifdef DEBUG_TRACES
+ std::cerr
+ << "\n==========================================================\n"
+ << "Export from complex to OFF:\n"
+ << " * Number of vertices: " << m_points.size() << "\n"
+ << " * Total number of maximal simplices: " << num_maximal_simplices
+ << "\n"
+ << "==========================================================\n";
+#endif
+
+ return os;
+ }
+
+ private:
+ const K m_k;
+ const int m_intrinsic_dim;
+ const int m_ambient_dim;
+
+ Points m_points;
+ Weights m_weights;
+#ifdef GUDHI_TC_PERTURB_POSITION
+ Translations_for_perturb m_translations;
+#if defined(GUDHI_USE_TBB)
+ Mutex_for_perturb *m_p_perturb_mutexes;
+#endif
+#endif
+
+ Points_ds m_points_ds;
+ double m_last_max_perturb;
+ std::vector<bool> m_are_tangent_spaces_computed;
+ TS_container m_tangent_spaces;
+#ifdef GUDHI_TC_EXPORT_NORMALS
+ OS_container m_orth_spaces;
+#endif
+ Tr_container m_triangulations; // Contains the triangulations
+ // and their center vertex
+ Stars_container m_stars;
+ std::vector<FT> m_squared_star_spheres_radii_incl_margin;
+
+#ifdef GUDHI_TC_USE_ANOTHER_POINT_SET_FOR_TANGENT_SPACE_ESTIM
+ Points m_points_for_tse;
+ Points_ds m_points_ds_for_tse;
+#endif
+
+ mutable CGAL::Random m_random_generator;
+}; // /class Tangential_complex
+
+} // end namespace tangential_complex
+} // end namespace Gudhi
+
+#endif // TANGENTIAL_COMPLEX_H_
diff --git a/include/gudhi/Tangential_complex/Simplicial_complex.h b/include/gudhi/Tangential_complex/Simplicial_complex.h
new file mode 100644
index 00000000..65c74ca5
--- /dev/null
+++ b/include/gudhi/Tangential_complex/Simplicial_complex.h
@@ -0,0 +1,539 @@
+/* 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): Clement Jamin
+ *
+ * Copyright (C) 2016 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 TANGENTIAL_COMPLEX_SIMPLICIAL_COMPLEX_H_
+#define TANGENTIAL_COMPLEX_SIMPLICIAL_COMPLEX_H_
+
+#include <gudhi/Tangential_complex/config.h>
+#include <gudhi/Tangential_complex/utilities.h>
+#include <gudhi/Debug_utils.h>
+#include <gudhi/console_color.h>
+
+#include <CGAL/iterator.h>
+
+// For is_pure_pseudomanifold
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/connected_components.hpp>
+#include <boost/container/flat_set.hpp>
+
+#include <algorithm>
+#include <string>
+#include <fstream>
+#include <map> // for map<>
+#include <vector> // for vector<>
+#include <set> // for set<>
+
+namespace Gudhi {
+namespace tangential_complex {
+namespace internal {
+
+class Simplicial_complex {
+ public:
+ typedef boost::container::flat_set<std::size_t> Simplex;
+ typedef std::set<Simplex> Simplex_set;
+
+ // If perform_checks = true, the function:
+ // - won't insert the simplex if it is already in a higher dim simplex
+ // - will erase any lower-dim simplices that are faces of the new simplex
+ // Returns true if the simplex was added
+ bool add_simplex(
+ const Simplex &s, bool perform_checks = true) {
+ if (perform_checks) {
+ unsigned int num_pts = static_cast<int> (s.size());
+ std::vector<Complex::iterator> to_erase;
+ bool check_higher_dim_simpl = true;
+ for (Complex::iterator it_simplex = m_complex.begin(),
+ it_simplex_end = m_complex.end();
+ it_simplex != it_simplex_end;
+ ++it_simplex) {
+ // Check if the simplex is not already in a higher dim simplex
+ if (check_higher_dim_simpl
+ && it_simplex->size() > num_pts
+ && std::includes(it_simplex->begin(), it_simplex->end(),
+ s.begin(), s.end())) {
+ // No need to insert it, then
+ return false;
+ }
+ // Check if the simplex includes some lower-dim simplices
+ if (it_simplex->size() < num_pts
+ && std::includes(s.begin(), s.end(),
+ it_simplex->begin(), it_simplex->end())) {
+ to_erase.push_back(it_simplex);
+ // We don't need to check higher-sim simplices any more
+ check_higher_dim_simpl = false;
+ }
+ }
+ for (std::vector<Complex::iterator>::const_iterator it = to_erase.begin();
+ it != to_erase.end(); ++it) {
+ m_complex.erase(*it);
+ }
+ }
+ return m_complex.insert(s).second;
+ }
+
+ const Simplex_set &simplex_range() const {
+ return m_complex;
+ }
+
+ bool empty() {
+ return m_complex.empty();
+ }
+
+ void clear() {
+ m_complex.clear();
+ }
+
+ template <typename Test, typename Output_it>
+ void get_simplices_matching_test(Test test, Output_it out) {
+ for (Complex::const_iterator it_simplex = m_complex.begin(),
+ it_simplex_end = m_complex.end();
+ it_simplex != it_simplex_end;
+ ++it_simplex) {
+ if (test(*it_simplex))
+ *out++ = *it_simplex;
+ }
+ }
+
+ // When a simplex S has only one co-face C, we can remove S and C
+ // without changing the topology
+
+ void collapse(int max_simplex_dim, bool quiet = false) {
+#ifdef DEBUG_TRACES
+ if (!quiet)
+ std::cerr << "Collapsing... ";
+#endif
+ // We note k = max_simplex_dim - 1
+ int k = max_simplex_dim - 1;
+
+ typedef Complex::iterator Simplex_iterator;
+ typedef std::vector<Simplex_iterator> Simplex_iterator_list;
+ typedef std::map<Simplex, Simplex_iterator_list> Cofaces_map;
+
+ std::size_t num_collapsed_maximal_simplices = 0;
+ do {
+ num_collapsed_maximal_simplices = 0;
+ // Create a map associating each non-maximal k-faces to the list of its
+ // maximal cofaces
+ Cofaces_map cofaces_map;
+ for (Complex::const_iterator it_simplex = m_complex.begin(),
+ it_simplex_end = m_complex.end();
+ it_simplex != it_simplex_end;
+ ++it_simplex) {
+ if (static_cast<int> (it_simplex->size()) > k + 1) {
+ std::vector<Simplex> k_faces;
+ // Get the k-faces composing the simplex
+ combinations(*it_simplex, k + 1, std::back_inserter(k_faces));
+ for (const auto &comb : k_faces)
+ cofaces_map[comb].push_back(it_simplex);
+ }
+ }
+
+ // For each non-maximal k-face F, if F has only one maximal coface Cf:
+ // - Look for the other k-faces F2, F3... of Cf in the map and:
+ // * if the list contains only Cf, clear the list (we don't remove the
+ // list since it creates troubles with the iterators) and add the F2,
+ // F3... to the complex
+ // * otherwise, remove Cf from the associated list
+ // - Remove Cf from the complex
+ for (Cofaces_map::const_iterator it_map_elt = cofaces_map.begin(),
+ it_map_end = cofaces_map.end();
+ it_map_elt != it_map_end;
+ ++it_map_elt) {
+ if (it_map_elt->second.size() == 1) {
+ std::vector<Simplex> k_faces;
+ const Simplex_iterator_list::value_type &it_Cf =
+ *it_map_elt->second.begin();
+ GUDHI_CHECK(it_Cf->size() == max_simplex_dim + 1,
+ std::logic_error("Wrong dimension"));
+ // Get the k-faces composing the simplex
+ combinations(*it_Cf, k + 1, std::back_inserter(k_faces));
+ for (const auto &f2 : k_faces) {
+ // Skip F
+ if (f2 != it_map_elt->first) {
+ Cofaces_map::iterator it_comb_in_map = cofaces_map.find(f2);
+ if (it_comb_in_map->second.size() == 1) {
+ it_comb_in_map->second.clear();
+ m_complex.insert(f2);
+ } else { // it_comb_in_map->second.size() > 1
+ Simplex_iterator_list::iterator it = std::find(it_comb_in_map->second.begin(),
+ it_comb_in_map->second.end(),
+ it_Cf);
+ GUDHI_CHECK(it != it_comb_in_map->second.end(),
+ std::logic_error("Error: it == it_comb_in_map->second.end()"));
+ it_comb_in_map->second.erase(it);
+ }
+ }
+ }
+ m_complex.erase(it_Cf);
+ ++num_collapsed_maximal_simplices;
+ }
+ }
+ // Repeat until no maximal simplex got removed
+ } while (num_collapsed_maximal_simplices > 0);
+
+ // Collapse the lower dimension simplices
+ if (k > 0)
+ collapse(max_simplex_dim - 1, true);
+
+#ifdef DEBUG_TRACES
+ if (!quiet)
+ std::cerr << "done.\n";
+#endif
+ }
+
+ void display_stats() const {
+ std::cerr << yellow << "Complex stats:\n" << white;
+
+ if (m_complex.empty()) {
+ std::cerr << " * No simplices.\n";
+ } else {
+ // Number of simplex for each dimension
+ std::map<int, std::size_t> simplex_stats;
+
+ for (Complex::const_iterator it_simplex = m_complex.begin(),
+ it_simplex_end = m_complex.end();
+ it_simplex != it_simplex_end;
+ ++it_simplex) {
+ ++simplex_stats[static_cast<int> (it_simplex->size()) - 1];
+ }
+
+ for (std::map<int, std::size_t>::const_iterator it_map = simplex_stats.begin();
+ it_map != simplex_stats.end(); ++it_map) {
+ std::cerr << " * " << it_map->first << "-simplices: "
+ << it_map->second << "\n";
+ }
+ }
+ }
+
+ // verbose_level = 0, 1 or 2
+ bool is_pure_pseudomanifold__do_not_check_if_stars_are_connected(int simplex_dim,
+ bool allow_borders = false,
+ bool exit_at_the_first_problem = false,
+ int verbose_level = 0,
+ std::size_t *p_num_wrong_dim_simplices = NULL,
+ std::size_t *p_num_wrong_number_of_cofaces = NULL) const {
+ typedef Simplex K_1_face;
+ typedef std::map<K_1_face, std::size_t> Cofaces_map;
+
+ std::size_t num_wrong_dim_simplices = 0;
+ std::size_t num_wrong_number_of_cofaces = 0;
+
+ // Counts the number of cofaces of each K_1_face
+
+ // Create a map associating each non-maximal k-faces to the list of its
+ // maximal cofaces
+ Cofaces_map cofaces_map;
+ for (Complex::const_iterator it_simplex = m_complex.begin(),
+ it_simplex_end = m_complex.end();
+ it_simplex != it_simplex_end;
+ ++it_simplex) {
+ if (static_cast<int> (it_simplex->size()) != simplex_dim + 1) {
+ if (verbose_level >= 2)
+ std::cerr << "Found a simplex with dim = "
+ << it_simplex->size() - 1 << "\n";
+ ++num_wrong_dim_simplices;
+ } else {
+ std::vector<K_1_face> k_1_faces;
+ // Get the facets composing the simplex
+ combinations(
+ *it_simplex, simplex_dim, std::back_inserter(k_1_faces));
+ for (const auto &k_1_face : k_1_faces) {
+ ++cofaces_map[k_1_face];
+ }
+ }
+ }
+
+ for (Cofaces_map::const_iterator it_map_elt = cofaces_map.begin(),
+ it_map_end = cofaces_map.end();
+ it_map_elt != it_map_end;
+ ++it_map_elt) {
+ if (it_map_elt->second != 2
+ && (!allow_borders || it_map_elt->second != 1)) {
+ if (verbose_level >= 2)
+ std::cerr << "Found a k-1-face with "
+ << it_map_elt->second << " cofaces\n";
+
+ if (exit_at_the_first_problem)
+ return false;
+ else
+ ++num_wrong_number_of_cofaces;
+ }
+ }
+
+ bool ret = num_wrong_dim_simplices == 0 && num_wrong_number_of_cofaces == 0;
+
+ if (verbose_level >= 1) {
+ std::cerr << "Pure pseudo-manifold: ";
+ if (ret) {
+ std::cerr << green << "YES" << white << "\n";
+ } else {
+ std::cerr << red << "NO" << white << "\n"
+ << " * Number of wrong dimension simplices: "
+ << num_wrong_dim_simplices << "\n"
+ << " * Number of wrong number of cofaces: "
+ << num_wrong_number_of_cofaces << "\n";
+ }
+ }
+
+ if (p_num_wrong_dim_simplices)
+ *p_num_wrong_dim_simplices = num_wrong_dim_simplices;
+ if (p_num_wrong_number_of_cofaces)
+ *p_num_wrong_number_of_cofaces = num_wrong_number_of_cofaces;
+
+ return ret;
+ }
+
+ template <int K>
+ std::size_t num_K_simplices() const {
+ Simplex_set k_simplices;
+
+ for (Complex::const_iterator it_simplex = m_complex.begin(),
+ it_simplex_end = m_complex.end();
+ it_simplex != it_simplex_end;
+ ++it_simplex) {
+ if (it_simplex->size() == K + 1) {
+ k_simplices.insert(*it_simplex);
+ } else if (it_simplex->size() > K + 1) {
+ // Get the k-faces composing the simplex
+ combinations(
+ *it_simplex, K + 1, std::inserter(k_simplices, k_simplices.begin()));
+ }
+ }
+
+ return k_simplices.size();
+ }
+
+ std::ptrdiff_t euler_characteristic(bool verbose = false) const {
+ if (verbose)
+ std::cerr << "\nComputing Euler characteristic of the complex...\n";
+
+ std::size_t num_vertices = num_K_simplices<0>();
+ std::size_t num_edges = num_K_simplices<1>();
+ std::size_t num_triangles = num_K_simplices<2>();
+
+ std::ptrdiff_t ec =
+ (std::ptrdiff_t) num_vertices
+ - (std::ptrdiff_t) num_edges
+ + (std::ptrdiff_t) num_triangles;
+
+ if (verbose)
+ std::cerr << "Euler characteristic: V - E + F = "
+ << num_vertices << " - " << num_edges << " + " << num_triangles << " = "
+ << blue
+ << ec
+ << white << "\n";
+
+ return ec;
+ }
+
+ // TODO(CJ): ADD COMMENTS
+
+ bool is_pure_pseudomanifold(
+ int simplex_dim,
+ std::size_t num_vertices,
+ bool allow_borders = false,
+ bool exit_at_the_first_problem = false,
+ int verbose_level = 0,
+ std::size_t *p_num_wrong_dim_simplices = NULL,
+ std::size_t *p_num_wrong_number_of_cofaces = NULL,
+ std::size_t *p_num_unconnected_stars = NULL,
+ Simplex_set *p_wrong_dim_simplices = NULL,
+ Simplex_set *p_wrong_number_of_cofaces_simplices = NULL,
+ Simplex_set *p_unconnected_stars_simplices = NULL) const {
+ // If simplex_dim == 1, we do not need to check if stars are connected
+ if (simplex_dim == 1) {
+ if (p_num_unconnected_stars)
+ *p_num_unconnected_stars = 0;
+ return is_pure_pseudomanifold__do_not_check_if_stars_are_connected(simplex_dim,
+ allow_borders,
+ exit_at_the_first_problem,
+ verbose_level,
+ p_num_wrong_dim_simplices,
+ p_num_wrong_number_of_cofaces);
+ }
+ // Associates each vertex (= the index in the vector)
+ // to its star (list of simplices)
+ typedef std::vector<std::vector<Complex::const_iterator> > Stars;
+ std::size_t num_wrong_dim_simplices = 0;
+ std::size_t num_wrong_number_of_cofaces = 0;
+ std::size_t num_unconnected_stars = 0;
+
+ // Fills a Stars data structure
+ Stars stars;
+ stars.resize(num_vertices);
+ for (Complex::const_iterator it_simplex = m_complex.begin(),
+ it_simplex_end = m_complex.end();
+ it_simplex != it_simplex_end;
+ ++it_simplex) {
+ if (static_cast<int> (it_simplex->size()) != simplex_dim + 1) {
+ if (verbose_level >= 2)
+ std::cerr << "Found a simplex with dim = "
+ << it_simplex->size() - 1 << "\n";
+ ++num_wrong_dim_simplices;
+ if (p_wrong_dim_simplices)
+ p_wrong_dim_simplices->insert(*it_simplex);
+ } else {
+ for (Simplex::const_iterator it_point_idx = it_simplex->begin();
+ it_point_idx != it_simplex->end();
+ ++it_point_idx) {
+ stars[*it_point_idx].push_back(it_simplex);
+ }
+ }
+ }
+
+ // Now, for each star, we have a vector of its d-simplices
+ // i.e. one index for each d-simplex
+ // Boost Graph only deals with indexes, so we also need indexes for the
+ // (d-1)-simplices
+ std::size_t center_vertex_index = 0;
+ for (Stars::const_iterator it_star = stars.begin();
+ it_star != stars.end();
+ ++it_star, ++center_vertex_index) {
+ typedef std::map<Simplex, std::vector<std::size_t> >
+ Dm1_faces_to_adj_D_faces;
+ Dm1_faces_to_adj_D_faces dm1_faces_to_adj_d_faces;
+
+ for (std::size_t i_dsimpl = 0; i_dsimpl < it_star->size(); ++i_dsimpl) {
+ Simplex dm1_simpl_of_link = *((*it_star)[i_dsimpl]);
+ dm1_simpl_of_link.erase(center_vertex_index);
+ // Copy it to a vector so that we can use operator[] on it
+ std::vector<std::size_t> dm1_simpl_of_link_vec(
+ dm1_simpl_of_link.begin(), dm1_simpl_of_link.end());
+
+ CGAL::Combination_enumerator<int> dm2_simplices(
+ simplex_dim - 1, 0, simplex_dim);
+ for (; !dm2_simplices.finished(); ++dm2_simplices) {
+ Simplex dm2_simpl;
+ for (int j = 0; j < simplex_dim - 1; ++j)
+ dm2_simpl.insert(dm1_simpl_of_link_vec[dm2_simplices[j]]);
+ dm1_faces_to_adj_d_faces[dm2_simpl].push_back(i_dsimpl);
+ }
+ }
+
+ Adj_graph adj_graph;
+ std::vector<Graph_vertex> d_faces_descriptors;
+ d_faces_descriptors.resize(it_star->size());
+ for (std::size_t j = 0; j < it_star->size(); ++j)
+ d_faces_descriptors[j] = boost::add_vertex(adj_graph);
+
+ Dm1_faces_to_adj_D_faces::const_iterator dm1_to_d_it =
+ dm1_faces_to_adj_d_faces.begin();
+ Dm1_faces_to_adj_D_faces::const_iterator dm1_to_d_it_end =
+ dm1_faces_to_adj_d_faces.end();
+ for (std::size_t i_km1_face = 0;
+ dm1_to_d_it != dm1_to_d_it_end;
+ ++dm1_to_d_it, ++i_km1_face) {
+ Graph_vertex km1_gv = boost::add_vertex(adj_graph);
+
+ for (std::vector<std::size_t>::const_iterator kface_it =
+ dm1_to_d_it->second.begin();
+ kface_it != dm1_to_d_it->second.end();
+ ++kface_it) {
+ boost::add_edge(km1_gv, *kface_it, adj_graph);
+ }
+
+ if (dm1_to_d_it->second.size() != 2
+ && (!allow_borders || dm1_to_d_it->second.size() != 1)) {
+ ++num_wrong_number_of_cofaces;
+ if (p_wrong_number_of_cofaces_simplices) {
+ for (auto idx : dm1_to_d_it->second)
+ p_wrong_number_of_cofaces_simplices->insert(*((*it_star)[idx]));
+ }
+ }
+ }
+
+ // What is left is to check the connexity
+ bool is_connected = true;
+ if (boost::num_vertices(adj_graph) > 0) {
+ std::vector<int> components(boost::num_vertices(adj_graph));
+ is_connected =
+ (boost::connected_components(adj_graph, &components[0]) == 1);
+ }
+
+ if (!is_connected) {
+ if (verbose_level >= 2)
+ std::cerr << "Error: star #" << center_vertex_index
+ << " is not connected\n";
+ ++num_unconnected_stars;
+ if (p_unconnected_stars_simplices) {
+ for (std::vector<Complex::const_iterator>::const_iterator
+ it_simpl = it_star->begin(),
+ it_simpl_end = it_star->end();
+ it_simpl != it_simpl_end;
+ ++it_simpl) {
+ p_unconnected_stars_simplices->insert(**it_simpl);
+ }
+ }
+ }
+ }
+
+ // Each one has been counted several times ("simplex_dim" times)
+ num_wrong_number_of_cofaces /= simplex_dim;
+
+ bool ret =
+ num_wrong_dim_simplices == 0
+ && num_wrong_number_of_cofaces == 0
+ && num_unconnected_stars == 0;
+
+ if (verbose_level >= 1) {
+ std::cerr << "Pure pseudo-manifold: ";
+ if (ret) {
+ std::cerr << green << "YES" << white << "\n";
+ } else {
+ std::cerr << red << "NO" << white << "\n"
+ << " * Number of wrong dimension simplices: "
+ << num_wrong_dim_simplices << "\n"
+ << " * Number of wrong number of cofaces: "
+ << num_wrong_number_of_cofaces << "\n"
+ << " * Number of not-connected stars: "
+ << num_unconnected_stars << "\n";
+ }
+ }
+
+ if (p_num_wrong_dim_simplices)
+ *p_num_wrong_dim_simplices = num_wrong_dim_simplices;
+ if (p_num_wrong_number_of_cofaces)
+ *p_num_wrong_number_of_cofaces = num_wrong_number_of_cofaces;
+ if (p_num_unconnected_stars)
+ *p_num_unconnected_stars = num_unconnected_stars;
+
+ return ret;
+ }
+
+ private:
+ typedef Simplex_set Complex;
+
+ // graph is an adjacency list
+ typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS> Adj_graph;
+ // map that gives to a certain simplex its node in graph and its dimension
+ typedef boost::graph_traits<Adj_graph>::vertex_descriptor Graph_vertex;
+ typedef boost::graph_traits<Adj_graph>::edge_descriptor Graph_edge;
+
+ Complex m_complex;
+}; // class Simplicial_complex
+
+} // namespace internal
+} // namespace tangential_complex
+} // namespace Gudhi
+
+#endif // TANGENTIAL_COMPLEX_SIMPLICIAL_COMPLEX_H_
diff --git a/include/gudhi/Tangential_complex/config.h b/include/gudhi/Tangential_complex/config.h
new file mode 100644
index 00000000..ffefcd6b
--- /dev/null
+++ b/include/gudhi/Tangential_complex/config.h
@@ -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): Clement Jamin
+ *
+ * Copyright (C) 2016 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 TANGENTIAL_COMPLEX_CONFIG_H_
+#define TANGENTIAL_COMPLEX_CONFIG_H_
+
+#include <cstddef>
+
+// ========================= Debugging & profiling =============================
+// #define GUDHI_TC_PROFILING
+// #define GUDHI_TC_VERY_VERBOSE
+// #define GUDHI_TC_PERFORM_EXTRA_CHECKS
+// #define GUDHI_TC_SHOW_DETAILED_STATS_FOR_INCONSISTENCIES
+
+// ========================= Strategy ==========================================
+#define GUDHI_TC_PERTURB_POSITION
+// #define GUDHI_TC_PERTURB_WEIGHT
+
+// ========================= Parameters ========================================
+
+// PCA will use GUDHI_TC_BASE_VALUE_FOR_PCA^intrinsic_dim points
+const std::size_t GUDHI_TC_BASE_VALUE_FOR_PCA = 5;
+
+#endif // TANGENTIAL_COMPLEX_CONFIG_H_
diff --git a/include/gudhi/Tangential_complex/utilities.h b/include/gudhi/Tangential_complex/utilities.h
new file mode 100644
index 00000000..b2d6d674
--- /dev/null
+++ b/include/gudhi/Tangential_complex/utilities.h
@@ -0,0 +1,195 @@
+/* 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): Clement Jamin
+ *
+ * Copyright (C) 2016 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 TANGENTIAL_COMPLEX_UTILITIES_H_
+#define TANGENTIAL_COMPLEX_UTILITIES_H_
+
+#include <CGAL/Dimension.h>
+#include <CGAL/Combination_enumerator.h>
+#include <CGAL/IO/Triangulation_off_ostream.h>
+
+#include <boost/container/flat_set.hpp>
+
+#include <Eigen/Core>
+#include <Eigen/Eigen>
+
+#include <set>
+#include <vector>
+#include <array>
+#include <fstream>
+#include <atomic>
+#include <cmath> // for std::sqrt
+
+namespace Gudhi {
+namespace tangential_complex {
+namespace internal {
+
+// Provides copy constructors to std::atomic so that
+// it can be used in a vector
+template <typename T>
+struct Atomic_wrapper
+: public std::atomic<T> {
+ typedef std::atomic<T> Base;
+
+ Atomic_wrapper() { }
+
+ Atomic_wrapper(const T &t) : Base(t) { }
+
+ Atomic_wrapper(const std::atomic<T> &a) : Base(a.load()) { }
+
+ Atomic_wrapper(const Atomic_wrapper &other) : Base(other.load()) { }
+
+ Atomic_wrapper &operator=(const T &other) {
+ Base::store(other);
+ return *this;
+ }
+
+ Atomic_wrapper &operator=(const std::atomic<T> &other) {
+ Base::store(other.load());
+ return *this;
+ }
+
+ Atomic_wrapper &operator=(const Atomic_wrapper &other) {
+ Base::store(other.load());
+ return *this;
+ }
+};
+
+// Modifies v in-place
+template <typename K>
+typename K::Vector_d& normalize_vector(typename K::Vector_d& v,
+ K const& k) {
+ v = k.scaled_vector_d_object()(
+ v, typename K::FT(1) / std::sqrt(k.squared_length_d_object()(v)));
+ return v;
+}
+
+template<typename Kernel>
+struct Basis {
+ typedef typename Kernel::FT FT;
+ typedef typename Kernel::Point_d Point;
+ typedef typename Kernel::Vector_d Vector;
+ typedef typename std::vector<Vector>::const_iterator const_iterator;
+
+ std::size_t m_origin;
+ std::vector<Vector> m_vectors;
+
+ std::size_t origin() const {
+ return m_origin;
+ }
+
+ void set_origin(std::size_t o) {
+ m_origin = o;
+ }
+
+ const_iterator begin() const {
+ return m_vectors.begin();
+ }
+
+ const_iterator end() const {
+ return m_vectors.end();
+ }
+
+ std::size_t size() const {
+ return m_vectors.size();
+ }
+
+ Vector& operator[](const std::size_t i) {
+ return m_vectors[i];
+ }
+
+ const Vector& operator[](const std::size_t i) const {
+ return m_vectors[i];
+ }
+
+ void push_back(const Vector& v) {
+ m_vectors.push_back(v);
+ }
+
+ void reserve(const std::size_t s) {
+ m_vectors.reserve(s);
+ }
+
+ Basis() { }
+
+ Basis(std::size_t origin) : m_origin(origin) { }
+
+ Basis(std::size_t origin, const std::vector<Vector>& vectors)
+ : m_origin(origin), m_vectors(vectors) { }
+
+ int dimension() const {
+ return static_cast<int> (m_vectors.size());
+ }
+};
+
+// 1st line: number of points
+// Then one point per line
+template <typename Kernel, typename Point_range>
+std::ostream &export_point_set(
+ Kernel const& k,
+ Point_range const& points,
+ std::ostream & os,
+ const char *coord_separator = " ") {
+ // Kernel functors
+ typename Kernel::Construct_cartesian_const_iterator_d ccci =
+ k.construct_cartesian_const_iterator_d_object();
+
+ os << points.size() << "\n";
+
+ typename Point_range::const_iterator it_p = points.begin();
+ typename Point_range::const_iterator it_p_end = points.end();
+ // For each point p
+ for (; it_p != it_p_end; ++it_p) {
+ for (auto it = ccci(*it_p); it != ccci(*it_p, 0); ++it)
+ os << CGAL::to_double(*it) << coord_separator;
+
+ os << "\n";
+ }
+
+ return os;
+}
+
+// Compute all the k-combinations of elements
+// Output_iterator::value_type must be
+// boost::container::flat_set<std::size_t>
+template <typename Elements_container, typename Output_iterator>
+void combinations(const Elements_container elements, int k,
+ Output_iterator combinations) {
+ std::size_t n = elements.size();
+ std::vector<bool> booleans(n, false);
+ std::fill(booleans.begin() + n - k, booleans.end(), true);
+ do {
+ boost::container::flat_set<std::size_t> combination;
+ typename Elements_container::const_iterator it_elt = elements.begin();
+ for (std::size_t i = 0; i < n; ++i, ++it_elt) {
+ if (booleans[i])
+ combination.insert(*it_elt);
+ }
+ *combinations++ = combination;
+ } while (std::next_permutation(booleans.begin(), booleans.end()));
+}
+
+} // namespace internal
+} // namespace tangential_complex
+} // namespace Gudhi
+
+#endif // TANGENTIAL_COMPLEX_UTILITIES_H_
diff --git a/include/gudhi/Test.h b/include/gudhi/Test.h
deleted file mode 100644
index 6024c822..00000000
--- a/include/gudhi/Test.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/* 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): David Salinas
- *
- * Copyright (C) 2014 INRIA Sophia Antipolis-Mediterranee (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 TEST_H_
-#define TEST_H_
-
-#include <list>
-#include <string>
-#include <vector>
-#include <sstream>
-#include <iostream>
-
-
-#define TEST(a) std::cout << "TEST: " << (a) << std::endl
-#define TESTMSG(a, b) std::cout << "TEST: " << a << b << std::endl
-#define TESTVALUE(a) std::cout << "TEST: " << #a << ": " << a << std::endl
-
-/**
- * Class to perform test
- */
-
-class Test {
- private:
- std::string name;
- bool (*test)();
-
- std::string separation() const {
- return "+++++++++++++++++++++++++++++++++++++++++++++++++\n";
- }
-
- std::string print_between_plus(std::string& s) const {
- std::stringstream res;
- res << "+++++++++++++++++" << s << "+++++++++++++++++\n";
- return res.str();
- }
-
- public:
- Test(std::string name_, bool (*test_)()) {
- name = name_;
- test = test_;
- }
-
- bool run() {
- std::cout << print_between_plus(name);
- return test();
- }
-
- std::string getName() {
- return name;
- }
-};
-
-class Tests {
- private:
- std::list<Test> tests;
-
- public:
- void add(std::string name_, bool (*test_)()) {
- Test test(name_, test_);
- tests.push_back(test);
- }
-
- bool run() {
- bool tests_succesful(true);
- std::vector<bool> res;
- for (Test test : tests) {
- res.push_back(test.run());
- }
- std::cout << "\n\n results of tests : " << std::endl;
- int i = 0;
- for (Test t : tests) {
- std::cout << "Test " << i << " \"" << t.getName() << "\" --> ";
- if (res[i++]) {
- std::cout << "OK" << std::endl;
- } else {
- std::cout << "Fail" << std::endl;
- tests_succesful = false;
- break;
- }
- }
- return tests_succesful;
- }
-};
-
-#endif // TEST_H_
diff --git a/include/gudhi/Witness_complex.h b/include/gudhi/Witness_complex.h
index 489cdf11..63f03687 100644
--- a/include/gudhi/Witness_complex.h
+++ b/include/gudhi/Witness_complex.h
@@ -4,7 +4,7 @@
*
* Author(s): Siargey Kachanovich
*
- * Copyright (C) 2015 INRIA Sophia Antipolis-Méditerranée (France)
+ * Copyright (C) 2015 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
@@ -23,65 +23,44 @@
#ifndef WITNESS_COMPLEX_H_
#define WITNESS_COMPLEX_H_
-// Needed for the adjacency graph in bad link search
-#include <boost/graph/graph_traits.hpp>
-#include <boost/graph/adjacency_list.hpp>
-#include <boost/graph/connected_components.hpp>
+#include <gudhi/Active_witness/Active_witness.h>
+#include <gudhi/Witness_complex/all_faces_in.h>
-#include <boost/range/size.hpp>
-
-#include <gudhi/distance_functions.h>
-
-#include <algorithm>
#include <utility>
#include <vector>
#include <list>
-#include <set>
-#include <queue>
#include <limits>
-#include <ctime>
-#include <iostream>
namespace Gudhi {
namespace witness_complex {
-// /*
-// * \private
-// \class Witness_complex
-// \brief Constructs the witness complex for the given set of witnesses and landmarks.
-// \ingroup witness_complex
-// */
-template< class SimplicialComplex>
+/**
+ * \private
+ * \class Witness_complex
+ * \brief Constructs (weak) witness complex for a given table of nearest landmarks with respect to witnesses.
+ * \ingroup witness_complex
+ *
+ * \tparam Nearest_landmark_table_ needs to be a range of a range of pairs of nearest landmarks and distances.
+ * The class Nearest_landmark_table_::value_type must be a copiable range.
+ * The range of pairs must admit a member type 'iterator'. The dereference type
+ * of the pair range iterator needs to be 'std::pair<std::size_t, double>'.
+*/
+template< class Nearest_landmark_table_ >
class Witness_complex {
private:
- struct Active_witness {
- int witness_id;
- int landmark_id;
-
- Active_witness(int witness_id_, int landmark_id_)
- : witness_id(witness_id_),
- landmark_id(landmark_id_) { }
- };
-
- private:
- typedef typename SimplicialComplex::Simplex_handle Simplex_handle;
- typedef typename SimplicialComplex::Vertex_handle Vertex_handle;
-
- typedef std::vector< double > Point_t;
- typedef std::vector< Point_t > Point_Vector;
-
- typedef std::vector< Vertex_handle > typeVectorVertex;
- typedef std::pair< typeVectorVertex, Filtration_value> typeSimplex;
- typedef std::pair< Simplex_handle, bool > typePairSimplexBool;
-
- typedef int Witness_id;
- typedef int Landmark_id;
- typedef std::list< Vertex_handle > ActiveWitnessList;
-
- private:
- int nbL_; // Number of landmarks
- SimplicialComplex& sc_; // Simplicial complex
+ typedef typename Nearest_landmark_table_::value_type Nearest_landmark_range;
+ typedef std::size_t Witness_id;
+ typedef std::size_t Landmark_id;
+ typedef std::pair<Landmark_id, double> Id_distance_pair;
+ typedef Active_witness<Id_distance_pair, Nearest_landmark_range> ActiveWitness;
+ typedef std::list< ActiveWitness > ActiveWitnessList;
+ typedef std::vector< Landmark_id > typeVectorVertex;
+ typedef std::vector<Nearest_landmark_range> Nearest_landmark_table_internal;
+ typedef Landmark_id Vertex_handle;
+
+ protected:
+ Nearest_landmark_table_internal nearest_landmark_table_;
public:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -90,174 +69,136 @@ class Witness_complex {
//@{
- // Witness_range<Closest_landmark_range<Vertex_handle>>
+ Witness_complex() {
+ }
- /*
- * \brief Iterative construction of the witness complex.
- * \details The witness complex is written in sc_ basing on a matrix knn of
- * nearest neighbours of the form {witnesses}x{landmarks}.
- *
- * The type KNearestNeighbors can be seen as
- * Witness_range<Closest_landmark_range<Vertex_handle>>, where
- * Witness_range and Closest_landmark_range are random access ranges.
- *
- * Constructor takes into account at most (dim+1)
- * first landmarks from each landmark range to construct simplices.
- *
- * Landmarks are supposed to be in [0,nbL_-1]
+ /**
+ * \brief Initializes member variables before constructing simplicial complex.
+ * \details Records nearest landmark table.
+ * @param[in] nearest_landmark_table needs to be a range of a range of pairs of nearest landmarks and distances.
+ * The class Nearest_landmark_table_::value_type must be a copiable range.
+ * The range of pairs must admit a member type 'iterator'. The dereference type
+ * of the pair range iterator needs to be 'std::pair<std::size_t, double>'.
*/
- template< typename KNearestNeighbors >
- Witness_complex(KNearestNeighbors const & knn,
- int nbL,
- int dim,
- SimplicialComplex & sc) : nbL_(nbL), sc_(sc) {
- // Construction of the active witness list
- int nbW = boost::size(knn);
- typeVectorVertex vv;
- int counter = 0;
- /* The list of still useful witnesses
- * it will diminuish in the course of iterations
- */
- ActiveWitnessList active_w; // = new ActiveWitnessList();
- for (Vertex_handle i = 0; i != nbL_; ++i) {
- // initial fill of 0-dimensional simplices
- // by doing it we don't assume that landmarks are necessarily witnesses themselves anymore
- counter++;
- vv = {i};
- sc_.insert_simplex(vv);
- // TODO(SK) Error if not inserted : normally no need here though
+
+ Witness_complex(Nearest_landmark_table_ const & nearest_landmark_table)
+ : nearest_landmark_table_(std::begin(nearest_landmark_table), std::end(nearest_landmark_table)) {
+ }
+
+ /** \brief Outputs the (weak) witness complex of relaxation 'max_alpha_square'
+ * in a simplicial complex data structure.
+ * \details The function returns true if the construction is successful and false otherwise.
+ * @param[out] complex Simplicial complex data structure compatible which is a model of
+ * SimplicialComplexForWitness concept.
+ * @param[in] max_alpha_square Maximal squared relaxation parameter.
+ * @param[in] limit_dimension Represents the maximal dimension of the simplicial complex
+ * (default value = no limit).
+ */
+ template < typename SimplicialComplexForWitness >
+ bool create_complex(SimplicialComplexForWitness& complex,
+ double max_alpha_square,
+ std::size_t limit_dimension = std::numeric_limits<std::size_t>::max()) const {
+ if (complex.num_vertices() > 0) {
+ std::cerr << "Witness complex cannot create complex - complex is not empty.\n";
+ return false;
}
- int k = 1; /* current dimension in iterative construction */
- for (int i = 0; i != nbW; ++i)
- active_w.push_back(i);
- while (!active_w.empty() && k < dim) {
- typename ActiveWitnessList::iterator it = active_w.begin();
- while (it != active_w.end()) {
- typeVectorVertex simplex_vector;
- /* THE INSERTION: Checking if all the subfaces are in the simplex tree*/
- bool ok = all_faces_in(knn, *it, k);
- if (ok) {
- for (int i = 0; i != k + 1; ++i)
- simplex_vector.push_back(knn[*it][i]);
- sc_.insert_simplex(simplex_vector);
- // TODO(SK) Error if not inserted : normally no need here though
- ++it;
- } else {
- active_w.erase(it++); // First increase the iterator and then erase the previous element
- }
+ if (max_alpha_square < 0) {
+ std::cerr << "Witness complex cannot create complex - squared relaxation parameter must be non-negative.\n";
+ return false;
+ }
+ if (limit_dimension < 0) {
+ std::cerr << "Witness complex cannot create complex - limit dimension must be non-negative.\n";
+ return false;
+ }
+ ActiveWitnessList active_witnesses;
+ Landmark_id k = 0; /* current dimension in iterative construction */
+ for (auto w : nearest_landmark_table_)
+ active_witnesses.push_back(ActiveWitness(w));
+ while (!active_witnesses.empty() && k <= limit_dimension) {
+ typename ActiveWitnessList::iterator aw_it = active_witnesses.begin();
+ std::vector<Landmark_id> simplex;
+ simplex.reserve(k+1);
+ while (aw_it != active_witnesses.end()) {
+ bool ok = add_all_faces_of_dimension(k,
+ max_alpha_square,
+ std::numeric_limits<double>::infinity(),
+ aw_it->begin(),
+ simplex,
+ complex,
+ aw_it->end());
+ assert(simplex.empty());
+ if (!ok)
+ active_witnesses.erase(aw_it++); // First increase the iterator and then erase the previous element
+ else
+ aw_it++;
}
k++;
}
+ complex.set_dimension(k-1);
+ return true;
}
//@}
private:
- /* \brief Check if the facets of the k-dimensional simplex witnessed
- * by witness witness_id are already in the complex.
- * inserted_vertex is the handle of the (k+1)-th vertex witnessed by witness_id
+ /* \brief Adds recursively all the faces of a certain dimension dim witnessed by the same witness.
+ * Iterator is needed to know until how far we can take landmarks to form simplexes.
+ * simplex is the prefix of the simplexes to insert.
+ * The output value indicates if the witness rests active or not.
*/
- template <typename KNearestNeighbors>
- bool all_faces_in(KNearestNeighbors const &knn, int witness_id, int k) {
- std::vector< Vertex_handle > facet;
- // CHECK ALL THE FACETS
- for (int i = 0; i != k + 1; ++i) {
- facet = {};
- for (int j = 0; j != k + 1; ++j) {
- if (j != i) {
- facet.push_back(knn[witness_id][j]);
+ template < typename SimplicialComplexForWitness >
+ bool add_all_faces_of_dimension(int dim,
+ double alpha2,
+ double norelax_dist2,
+ typename ActiveWitness::iterator curr_l,
+ std::vector<Landmark_id>& simplex,
+ SimplicialComplexForWitness& sc,
+ typename ActiveWitness::iterator end) const {
+ if (curr_l == end)
+ return false;
+ bool will_be_active = false;
+ typename ActiveWitness::iterator l_it = curr_l;
+ if (dim > 0) {
+ for (; l_it != end && l_it->second - alpha2 <= norelax_dist2; ++l_it) {
+ simplex.push_back(l_it->first);
+ if (sc.find(simplex) != sc.null_simplex()) {
+ typename ActiveWitness::iterator next_it = l_it;
+ will_be_active = add_all_faces_of_dimension(dim-1,
+ alpha2,
+ norelax_dist2,
+ ++next_it,
+ simplex,
+ sc,
+ end) || will_be_active;
}
- } // endfor
- if (sc_.find(facet) == sc_.null_simplex())
- return false;
- } // endfor
- return true;
- }
-
- template <typename T>
- static void print_vector(const std::vector<T>& v) {
- std::cout << "[";
- if (!v.empty()) {
- std::cout << *(v.begin());
- for (auto it = v.begin() + 1; it != v.end(); ++it) {
- std::cout << ",";
- std::cout << *it;
+ assert(!simplex.empty());
+ simplex.pop_back();
+ // If norelax_dist is infinity, change to first omitted distance
+ if (l_it->second <= norelax_dist2)
+ norelax_dist2 = l_it->second;
}
- }
- std::cout << "]";
- }
-
- public:
- // /*
- // * \brief Verification if every simplex in the complex is witnessed by witnesses in knn.
- // * \param print_output =true will print the witnesses for each simplex
- // * \remark Added for debugging purposes.
- // */
- template< class KNearestNeighbors >
- bool is_witness_complex(KNearestNeighbors const & knn, bool print_output) {
- for (Simplex_handle sh : sc_.complex_simplex_range()) {
- bool is_witnessed = false;
- typeVectorVertex simplex;
- int nbV = 0; // number of verticed in the simplex
- for (Vertex_handle v : sc_.simplex_vertex_range(sh))
- simplex.push_back(v);
- nbV = simplex.size();
- for (typeVectorVertex w : knn) {
- bool has_vertices = true;
- for (Vertex_handle v : simplex)
- if (std::find(w.begin(), w.begin() + nbV, v) == w.begin() + nbV) {
- has_vertices = false;
- }
- if (has_vertices) {
- is_witnessed = true;
- if (print_output) {
- std::cout << "The simplex ";
- print_vector(simplex);
- std::cout << " is witnessed by the witness ";
- print_vector(w);
- std::cout << std::endl;
- }
- break;
- }
- }
- if (!is_witnessed) {
- if (print_output) {
- std::cout << "The following simplex is not witnessed ";
- print_vector(simplex);
- std::cout << std::endl;
+ } else if (dim == 0) {
+ for (; l_it != end && l_it->second - alpha2 <= norelax_dist2; ++l_it) {
+ simplex.push_back(l_it->first);
+ double filtration_value = 0;
+ // if norelax_dist is infinite, relaxation is 0.
+ if (l_it->second > norelax_dist2)
+ filtration_value = l_it->second - norelax_dist2;
+ if (all_faces_in(simplex, &filtration_value, sc)) {
+ will_be_active = true;
+ sc.insert_simplex(simplex, filtration_value);
}
- assert(is_witnessed);
- return false;
+ assert(!simplex.empty());
+ simplex.pop_back();
+ // If norelax_dist is infinity, change to first omitted distance
+ if (l_it->second < norelax_dist2)
+ norelax_dist2 = l_it->second;
}
}
- return true;
+ return will_be_active;
}
};
- /**
- * \ingroup witness_complex
- * \brief Iterative construction of the witness complex.
- * \details The witness complex is written in simplicial complex sc_
- * basing on a matrix knn of
- * nearest neighbours of the form {witnesses}x{landmarks}.
- *
- * The type KNearestNeighbors can be seen as
- * Witness_range<Closest_landmark_range<Vertex_handle>>, where
- * Witness_range and Closest_landmark_range are random access ranges.
- *
- * Procedure takes into account at most (dim+1)
- * first landmarks from each landmark range to construct simplices.
- *
- * Landmarks are supposed to be in [0,nbL_-1]
- */
- template <class KNearestNeighbors, class SimplicialComplexForWitness>
- void witness_complex(KNearestNeighbors const & knn,
- int nbL,
- int dim,
- SimplicialComplexForWitness & sc) {
- Witness_complex<SimplicialComplexForWitness>(knn, nbL, dim, sc);
- }
-
} // namespace witness_complex
} // namespace Gudhi
diff --git a/include/gudhi/Witness_complex/all_faces_in.h b/include/gudhi/Witness_complex/all_faces_in.h
new file mode 100644
index 00000000..b68d75a1
--- /dev/null
+++ b/include/gudhi/Witness_complex/all_faces_in.h
@@ -0,0 +1,55 @@
+/* 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): Siargey Kachanovich
+ *
+ * Copyright (C) 2015 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 WITNESS_COMPLEX_ALL_FACES_IN_H_
+#define WITNESS_COMPLEX_ALL_FACES_IN_H_
+
+/* \brief Check if the facets of the k-dimensional simplex witnessed
+ * by witness witness_id are already in the complex.
+ * inserted_vertex is the handle of the (k+1)-th vertex witnessed by witness_id
+ */
+template < typename SimplicialComplexForWitness,
+ typename Simplex >
+ bool all_faces_in(Simplex& simplex,
+ double* filtration_value,
+ SimplicialComplexForWitness& sc) {
+ typedef typename SimplicialComplexForWitness::Simplex_handle Simplex_handle;
+
+ if (simplex.size() == 1)
+ return true; /* Add vertices unconditionally */
+
+ Simplex facet;
+ for (typename Simplex::iterator not_it = simplex.begin(); not_it != simplex.end(); ++not_it) {
+ facet.clear();
+ for (typename Simplex::iterator it = simplex.begin(); it != simplex.end(); ++it)
+ if (it != not_it)
+ facet.push_back(*it);
+ Simplex_handle facet_sh = sc.find(facet);
+ if (facet_sh == sc.null_simplex())
+ return false;
+ else if (sc.filtration(facet_sh) > *filtration_value)
+ *filtration_value = sc.filtration(facet_sh);
+ }
+ return true;
+ }
+
+#endif // WITNESS_COMPLEX_ALL_FACES_IN_H_
diff --git a/include/gudhi/choose_n_farthest_points.h b/include/gudhi/choose_n_farthest_points.h
new file mode 100644
index 00000000..86500b28
--- /dev/null
+++ b/include/gudhi/choose_n_farthest_points.h
@@ -0,0 +1,133 @@
+/* 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): Siargey Kachanovich
+ *
+ * Copyright (C) 2016 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 CHOOSE_N_FARTHEST_POINTS_H_
+#define CHOOSE_N_FARTHEST_POINTS_H_
+
+#include <boost/range.hpp>
+
+#include <gudhi/Null_output_iterator.h>
+
+#include <iterator>
+#include <vector>
+#include <random>
+#include <limits> // for numeric_limits<>
+
+namespace Gudhi {
+
+namespace subsampling {
+
+/**
+ * \ingroup subsampling
+ */
+enum : std::size_t {
+/**
+ * Argument for `choose_n_farthest_points` to indicate that the starting point should be picked randomly.
+ */
+ random_starting_point = std::size_t(-1)
+};
+
+/**
+ * \ingroup subsampling
+ * \brief Subsample by a greedy strategy of iteratively adding the farthest point from the
+ * current chosen point set to the subsampling.
+ * The iteration starts with the landmark `starting point` or, if `starting point==random_starting_point`, with a random landmark.
+ * \tparam Kernel must provide a type Kernel::Squared_distance_d which is a model of the
+ * concept <a target="_blank"
+ * href="http://doc.cgal.org/latest/Kernel_d/classKernel__d_1_1Squared__distance__d.html">Kernel_d::Squared_distance_d</a> (despite the name, taken from CGAL, this can be any kind of metric or proximity measure).
+ * It must also contain a public member `squared_distance_d_object()` that returns an object of this type.
+ * \tparam Point_range Range whose value type is Kernel::Point_d. It must provide random-access
+ * via `operator[]` and the points should be stored contiguously in memory.
+ * \tparam PointOutputIterator Output iterator whose value type is Kernel::Point_d.
+ * \tparam DistanceOutputIterator Output iterator for distances.
+ * \details It chooses `final_size` points from a random access range
+ * `input_pts` and outputs them in the output iterator `output_it`. It also
+ * outputs the distance from each of those points to the set of previous
+ * points in `dist_it`.
+ * @param[in] k A kernel object.
+ * @param[in] input_pts Const reference to the input points.
+ * @param[in] final_size The size of the subsample to compute.
+ * @param[in] starting_point The seed in the farthest point algorithm.
+ * @param[out] output_it The output iterator for points.
+ * @param[out] dist_it The optional output iterator for distances.
+ *
+ */
+template < typename Kernel,
+typename Point_range,
+typename PointOutputIterator,
+typename DistanceOutputIterator = Null_output_iterator>
+void choose_n_farthest_points(Kernel const &k,
+ Point_range const &input_pts,
+ std::size_t final_size,
+ std::size_t starting_point,
+ PointOutputIterator output_it,
+ DistanceOutputIterator dist_it = {}) {
+ std::size_t nb_points = boost::size(input_pts);
+ if (final_size > nb_points)
+ final_size = nb_points;
+
+ // Tests to the limit
+ if (final_size < 1)
+ return;
+
+ if (starting_point == random_starting_point) {
+ // 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));
+ starting_point = dis(gen);
+ }
+
+ typename Kernel::Squared_distance_d sqdist = k.squared_distance_d_object();
+
+ std::size_t current_number_of_landmarks = 0; // counter for landmarks
+ const double infty = std::numeric_limits<double>::infinity(); // infinity (see next entry)
+ std::vector< double > dist_to_L(nb_points, infty); // vector of current distances to L from input_pts
+
+ std::size_t curr_max_w = starting_point;
+
+ for (current_number_of_landmarks = 0; current_number_of_landmarks != final_size; current_number_of_landmarks++) {
+ // curr_max_w at this point is the next landmark
+ *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) {
+ 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;
+ ++i;
+ }
+ // choose the next curr_max_w
+ double curr_max_dist = 0; // used for defining the furhest point from L
+ for (i = 0; i < dist_to_L.size(); i++)
+ if (dist_to_L[i] > curr_max_dist) {
+ curr_max_dist = dist_to_L[i];
+ curr_max_w = i;
+ }
+ }
+}
+
+} // namespace subsampling
+
+} // namespace Gudhi
+
+#endif // CHOOSE_N_FARTHEST_POINTS_H_
diff --git a/include/gudhi/console_color.h b/include/gudhi/console_color.h
new file mode 100644
index 00000000..c4671da3
--- /dev/null
+++ b/include/gudhi/console_color.h
@@ -0,0 +1,97 @@
+/* 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): Clement Jamin
+ *
+ * Copyright (C) 2016 INRIA Sophia-Antipolis (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 CONSOLE_COLOR_H_
+#define CONSOLE_COLOR_H_
+
+#include <iostream>
+
+#if defined(WIN32)
+#include <windows.h>
+#endif
+
+inline std::ostream& blue(std::ostream &s) {
+#if defined(WIN32)
+ HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
+ SetConsoleTextAttribute(hStdout,
+ FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
+#else
+ s << "\x1b[0;34m";
+#endif
+ return s;
+}
+
+inline std::ostream& red(std::ostream &s) {
+#if defined(WIN32)
+ HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
+ SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_INTENSITY);
+#else
+ s << "\x1b[0;31m";
+#endif
+ return s;
+}
+
+inline std::ostream& green(std::ostream &s) {
+#if defined(WIN32)
+ HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
+ SetConsoleTextAttribute(hStdout, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
+#else
+ s << "\x1b[0;32m";
+#endif
+ return s;
+}
+
+inline std::ostream& yellow(std::ostream &s) {
+#if defined(WIN32)
+ HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
+ SetConsoleTextAttribute(hStdout,
+ FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
+#else
+ s << "\x1b[0;33m";
+#endif
+ return s;
+}
+
+inline std::ostream& white(std::ostream &s) {
+#if defined(WIN32)
+ HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
+ SetConsoleTextAttribute(hStdout,
+ FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
+#else
+ s << "\x1b[0;37m";
+#endif
+ return s;
+}
+
+inline std::ostream& black_on_white(std::ostream &s) {
+#if defined(WIN32)
+ HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
+ SetConsoleTextAttribute(hStdout,
+ BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
+#else
+ s << "\x1b[0;33m";
+#endif
+ return s;
+}
+
+
+#endif // CONSOLE_COLOR_H_
diff --git a/include/gudhi/distance_functions.h b/include/gudhi/distance_functions.h
index cd518581..f6e2ab5a 100644
--- a/include/gudhi/distance_functions.h
+++ b/include/gudhi/distance_functions.h
@@ -4,7 +4,7 @@
*
* Author(s): Clément Maria
*
- * Copyright (C) 2014 INRIA Sophia Antipolis-Méditerranée (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
@@ -24,20 +24,32 @@
#define DISTANCE_FUNCTIONS_H_
#include <cmath> // for std::sqrt
+#include <type_traits> // for std::decay
+#include <iterator> // for std::begin, std::end
-/* Compute the Euclidean distance between two Points given
- * by a range of coordinates. The points are assumed to have
- * the same dimension. */
-template< typename Point >
-double euclidean_distance(Point &p1, Point &p2) {
- double dist = 0.;
- auto it1 = p1.begin();
- auto it2 = p2.begin();
- for (; it1 != p1.end(); ++it1, ++it2) {
- double tmp = *it1 - *it2;
- dist += tmp*tmp;
+namespace Gudhi {
+
+/** @file
+ * @brief Global distance functions
+ */
+
+/** @brief Compute the Euclidean distance between two Points given by a range of coordinates. The points are assumed to
+ * have the same dimension. */
+class Euclidean_distance {
+ public:
+ 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);
+ dist += tmp*tmp;
+ }
+ return std::sqrt(dist);
}
- return std::sqrt(dist);
-}
+};
+
+} // namespace Gudhi
#endif // DISTANCE_FUNCTIONS_H_
diff --git a/include/gudhi/graph_simplicial_complex.h b/include/gudhi/graph_simplicial_complex.h
index 042ef516..5fe7c826 100644
--- a/include/gudhi/graph_simplicial_complex.h
+++ b/include/gudhi/graph_simplicial_complex.h
@@ -4,7 +4,7 @@
*
* Author(s): Clément Maria
*
- * Copyright (C) 2014 INRIA Sophia Antipolis-Méditerranée (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
@@ -39,61 +39,4 @@ struct vertex_filtration_t {
typedef boost::vertex_property_tag kind;
};
-typedef int Vertex_handle;
-typedef double Filtration_value;
-typedef boost::adjacency_list < boost::vecS, boost::vecS, boost::undirectedS
-, boost::property < vertex_filtration_t, Filtration_value >
-, boost::property < edge_filtration_t, Filtration_value >
-> Graph_t;
-typedef std::pair< Vertex_handle, Vertex_handle > Edge_t;
-
-/** \brief 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 PointCloud
-, typename Point >
-Graph_t compute_proximity_graph(PointCloud &points
- , Filtration_value threshold
- , Filtration_value distance(Point p1, Point p2)) {
- std::vector< Edge_t > 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;
- }
-
- 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;
-}
-
#endif // GRAPH_SIMPLICIAL_COMPLEX_H_
diff --git a/include/gudhi/pick_n_random_points.h b/include/gudhi/pick_n_random_points.h
new file mode 100644
index 00000000..f0e3f1f1
--- /dev/null
+++ b/include/gudhi/pick_n_random_points.h
@@ -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): Siargey Kachanovich
+ *
+ * Copyright (C) 2016 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 PICK_N_RANDOM_POINTS_H_
+#define PICK_N_RANDOM_POINTS_H_
+
+#include <gudhi/Clock.h>
+
+#include <boost/range/size.hpp>
+
+#include <cstddef>
+#include <random> // random_device, mt19937
+#include <algorithm> // shuffle
+#include <numeric> // iota
+#include <iterator>
+#include <vector>
+
+
+namespace Gudhi {
+
+namespace subsampling {
+
+/**
+ * \ingroup subsampling
+ * \brief Subsample a point set by picking random vertices.
+ *
+ * \details It chooses `final_size` distinct points from a random access range `points`
+ * and outputs them to the output iterator `output_it`.
+ * Point_container::iterator should be ValueSwappable and RandomAccessIterator.
+ */
+template <typename Point_container,
+typename OutputIterator>
+void pick_n_random_points(Point_container const &points,
+ std::size_t final_size,
+ OutputIterator output_it) {
+#ifdef GUDHI_SUBS_PROFILING
+ Gudhi::Clock t;
+#endif
+
+ std::size_t nbP = boost::size(points);
+ if (final_size > nbP)
+ final_size = nbP;
+
+ std::vector<int> landmarks(nbP);
+ std::iota(landmarks.begin(), landmarks.end(), 0);
+
+ std::random_device rd;
+ std::mt19937 g(rd());
+
+ std::shuffle(landmarks.begin(), landmarks.end(), g);
+ landmarks.resize(final_size);
+
+ for (int l : landmarks)
+ *output_it++ = points[l];
+
+#ifdef GUDHI_SUBS_PROFILING
+ t.end();
+ std::cerr << "Random landmark choice took " << t.num_seconds()
+ << " seconds." << std::endl;
+#endif
+}
+
+} // namespace subsampling
+
+} // namespace Gudhi
+
+#endif // PICK_N_RANDOM_POINTS_H_
diff --git a/include/gudhi/random_point_generators.h b/include/gudhi/random_point_generators.h
new file mode 100644
index 00000000..2ec465ef
--- /dev/null
+++ b/include/gudhi/random_point_generators.h
@@ -0,0 +1,474 @@
+/* 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): Clement Jamin
+ *
+ * Copyright (C) 2016 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 RANDOM_POINT_GENERATORS_H_
+#define RANDOM_POINT_GENERATORS_H_
+
+#include <CGAL/number_utils.h>
+#include <CGAL/Random.h>
+#include <CGAL/point_generators_d.h>
+
+#include <vector> // for vector<>
+
+namespace Gudhi {
+
+///////////////////////////////////////////////////////////////////////////////
+// Note: All these functions have been tested with the CGAL::Epick_d kernel
+///////////////////////////////////////////////////////////////////////////////
+
+// construct_point: dim 2
+
+template <typename Kernel>
+typename Kernel::Point_d construct_point(const Kernel &k,
+ typename Kernel::FT x1, typename Kernel::FT x2) {
+ typename Kernel::FT tab[2];
+ tab[0] = x1;
+ tab[1] = x2;
+ return k.construct_point_d_object()(2, &tab[0], &tab[2]);
+}
+
+// construct_point: dim 3
+
+template <typename Kernel>
+typename Kernel::Point_d construct_point(const Kernel &k,
+ typename Kernel::FT x1, typename Kernel::FT x2, typename Kernel::FT x3) {
+ typename Kernel::FT tab[3];
+ tab[0] = x1;
+ tab[1] = x2;
+ tab[2] = x3;
+ return k.construct_point_d_object()(3, &tab[0], &tab[3]);
+}
+
+// construct_point: dim 4
+
+template <typename Kernel>
+typename Kernel::Point_d construct_point(const Kernel &k,
+ typename Kernel::FT x1, typename Kernel::FT x2, typename Kernel::FT x3,
+ typename Kernel::FT x4) {
+ typename Kernel::FT tab[4];
+ tab[0] = x1;
+ tab[1] = x2;
+ tab[2] = x3;
+ tab[3] = x4;
+ return k.construct_point_d_object()(4, &tab[0], &tab[4]);
+}
+
+// construct_point: dim 5
+
+template <typename Kernel>
+typename Kernel::Point_d construct_point(const Kernel &k,
+ typename Kernel::FT x1, typename Kernel::FT x2, typename Kernel::FT x3,
+ typename Kernel::FT x4, typename Kernel::FT x5) {
+ typename Kernel::FT tab[5];
+ tab[0] = x1;
+ tab[1] = x2;
+ tab[2] = x3;
+ tab[3] = x4;
+ tab[4] = x5;
+ return k.construct_point_d_object()(5, &tab[0], &tab[5]);
+}
+
+// construct_point: dim 6
+
+template <typename Kernel>
+typename Kernel::Point_d construct_point(const Kernel &k,
+ typename Kernel::FT x1, typename Kernel::FT x2, typename Kernel::FT x3,
+ typename Kernel::FT x4, typename Kernel::FT x5, typename Kernel::FT x6) {
+ typename Kernel::FT tab[6];
+ tab[0] = x1;
+ tab[1] = x2;
+ tab[2] = x3;
+ tab[3] = x4;
+ tab[4] = x5;
+ tab[5] = x6;
+ return k.construct_point_d_object()(6, &tab[0], &tab[6]);
+}
+
+template <typename Kernel>
+std::vector<typename Kernel::Point_d> generate_points_on_plane(std::size_t num_points, int intrinsic_dim,
+ int ambient_dim,
+ double coord_min = -5., double coord_max = 5.) {
+ typedef typename Kernel::Point_d Point;
+ typedef typename Kernel::FT FT;
+ Kernel k;
+ CGAL::Random rng;
+ std::vector<Point> points;
+ points.reserve(num_points);
+ for (std::size_t i = 0; i < num_points;) {
+ std::vector<FT> pt(ambient_dim, FT(0));
+ for (int j = 0; j < intrinsic_dim; ++j)
+ pt[j] = rng.get_double(coord_min, coord_max);
+
+ Point p = k.construct_point_d_object()(ambient_dim, pt.begin(), pt.end());
+ points.push_back(p);
+ ++i;
+ }
+ return points;
+}
+
+template <typename Kernel>
+std::vector<typename Kernel::Point_d> generate_points_on_moment_curve(std::size_t num_points, int dim,
+ typename Kernel::FT min_x,
+ typename Kernel::FT max_x) {
+ typedef typename Kernel::Point_d Point;
+ typedef typename Kernel::FT FT;
+ Kernel k;
+ CGAL::Random rng;
+ std::vector<Point> points;
+ points.reserve(num_points);
+ for (std::size_t i = 0; i < num_points;) {
+ FT x = rng.get_double(min_x, max_x);
+ std::vector<FT> coords;
+ coords.reserve(dim);
+ for (int p = 1; p <= dim; ++p)
+ coords.push_back(std::pow(CGAL::to_double(x), p));
+ Point p = k.construct_point_d_object()(
+ dim, coords.begin(), coords.end());
+ points.push_back(p);
+ ++i;
+ }
+ return points;
+}
+
+
+// R = big radius, r = small radius
+template <typename Kernel/*, typename TC_basis*/>
+std::vector<typename Kernel::Point_d> generate_points_on_torus_3D(std::size_t num_points, double R, double r,
+ bool uniform = false) {
+ typedef typename Kernel::Point_d Point;
+ typedef typename Kernel::FT FT;
+ Kernel k;
+ CGAL::Random rng;
+
+ // if uniform
+ std::size_t num_lines = (std::size_t)sqrt(num_points);
+
+ std::vector<Point> points;
+ points.reserve(num_points);
+ for (std::size_t i = 0; i < num_points;) {
+ FT u, v;
+ if (uniform) {
+ std::size_t k1 = i / num_lines;
+ std::size_t k2 = i % num_lines;
+ u = 6.2832 * k1 / num_lines;
+ v = 6.2832 * k2 / num_lines;
+ } else {
+ u = rng.get_double(0, 6.2832);
+ v = rng.get_double(0, 6.2832);
+ }
+ Point p = construct_point(k,
+ (R + r * std::cos(u)) * std::cos(v),
+ (R + r * std::cos(u)) * std::sin(v),
+ r * std::sin(u));
+ points.push_back(p);
+ ++i;
+ }
+ return points;
+}
+
+// "Private" function used by generate_points_on_torus_d
+template <typename Kernel, typename OutputIterator>
+static void generate_uniform_points_on_torus_d(const Kernel &k, int dim, std::size_t num_slices,
+ OutputIterator out,
+ double radius_noise_percentage = 0.,
+ std::vector<typename Kernel::FT> current_point = std::vector<typename Kernel::FT>()) {
+ CGAL::Random rng;
+ int point_size = static_cast<int>(current_point.size());
+ if (point_size == 2 * dim) {
+ *out++ = k.construct_point_d_object()(point_size, current_point.begin(), current_point.end());
+ } else {
+ for (std::size_t slice_idx = 0; slice_idx < num_slices; ++slice_idx) {
+ double radius_noise_ratio = 1.;
+ if (radius_noise_percentage > 0.) {
+ radius_noise_ratio = rng.get_double(
+ (100. - radius_noise_percentage) / 100.,
+ (100. + radius_noise_percentage) / 100.);
+ }
+ std::vector<typename Kernel::FT> cp2 = current_point;
+ double alpha = 6.2832 * slice_idx / num_slices;
+ cp2.push_back(radius_noise_ratio * std::cos(alpha));
+ cp2.push_back(radius_noise_ratio * std::sin(alpha));
+ generate_uniform_points_on_torus_d(
+ k, dim, num_slices, out, radius_noise_percentage, cp2);
+ }
+ }
+}
+
+template <typename Kernel>
+std::vector<typename Kernel::Point_d> generate_points_on_torus_d(std::size_t num_points, int dim, bool uniform = false,
+ double radius_noise_percentage = 0.) {
+ typedef typename Kernel::Point_d Point;
+ typedef typename Kernel::FT FT;
+ Kernel k;
+ CGAL::Random rng;
+
+ std::vector<Point> points;
+ points.reserve(num_points);
+ if (uniform) {
+ std::size_t num_slices = (std::size_t)std::pow(num_points, 1. / dim);
+ generate_uniform_points_on_torus_d(
+ k, dim, num_slices, std::back_inserter(points), radius_noise_percentage);
+ } else {
+ for (std::size_t i = 0; i < num_points;) {
+ double radius_noise_ratio = 1.;
+ if (radius_noise_percentage > 0.) {
+ radius_noise_ratio = rng.get_double(
+ (100. - radius_noise_percentage) / 100.,
+ (100. + radius_noise_percentage) / 100.);
+ }
+ std::vector<typename Kernel::FT> pt;
+ pt.reserve(dim * 2);
+ for (int curdim = 0; curdim < dim; ++curdim) {
+ FT alpha = rng.get_double(0, 6.2832);
+ pt.push_back(radius_noise_ratio * std::cos(alpha));
+ pt.push_back(radius_noise_ratio * std::sin(alpha));
+ }
+
+ Point p = k.construct_point_d_object()(pt.begin(), pt.end());
+ points.push_back(p);
+ ++i;
+ }
+ }
+ return points;
+}
+
+template <typename Kernel>
+std::vector<typename Kernel::Point_d> generate_points_on_sphere_d(std::size_t num_points, int dim, double radius,
+ double radius_noise_percentage = 0.) {
+ typedef typename Kernel::Point_d Point;
+ Kernel k;
+ CGAL::Random rng;
+ CGAL::Random_points_on_sphere_d<Point> generator(dim, radius);
+ std::vector<Point> points;
+ points.reserve(num_points);
+ for (std::size_t i = 0; i < num_points;) {
+ Point p = *generator++;
+ if (radius_noise_percentage > 0.) {
+ double radius_noise_ratio = rng.get_double(
+ (100. - radius_noise_percentage) / 100.,
+ (100. + radius_noise_percentage) / 100.);
+
+ typename Kernel::Point_to_vector_d k_pt_to_vec =
+ k.point_to_vector_d_object();
+ typename Kernel::Vector_to_point_d k_vec_to_pt =
+ k.vector_to_point_d_object();
+ typename Kernel::Scaled_vector_d k_scaled_vec =
+ k.scaled_vector_d_object();
+ p = k_vec_to_pt(k_scaled_vec(k_pt_to_vec(p), radius_noise_ratio));
+ }
+ points.push_back(p);
+ ++i;
+ }
+ return points;
+}
+
+template <typename Kernel>
+std::vector<typename Kernel::Point_d> generate_points_on_two_spheres_d(std::size_t num_points, int dim, double radius,
+ double distance_between_centers,
+ double radius_noise_percentage = 0.) {
+ typedef typename Kernel::FT FT;
+ typedef typename Kernel::Point_d Point;
+ typedef typename Kernel::Vector_d Vector;
+ Kernel k;
+ CGAL::Random rng;
+ CGAL::Random_points_on_sphere_d<Point> generator(dim, radius);
+ std::vector<Point> points;
+ points.reserve(num_points);
+
+ std::vector<FT> t(dim, FT(0));
+ t[0] = distance_between_centers;
+ Vector c1_to_c2(t.begin(), t.end());
+
+ for (std::size_t i = 0; i < num_points;) {
+ Point p = *generator++;
+ if (radius_noise_percentage > 0.) {
+ double radius_noise_ratio = rng.get_double(
+ (100. - radius_noise_percentage) / 100.,
+ (100. + radius_noise_percentage) / 100.);
+
+ typename Kernel::Point_to_vector_d k_pt_to_vec =
+ k.point_to_vector_d_object();
+ typename Kernel::Vector_to_point_d k_vec_to_pt =
+ k.vector_to_point_d_object();
+ typename Kernel::Scaled_vector_d k_scaled_vec =
+ k.scaled_vector_d_object();
+ p = k_vec_to_pt(k_scaled_vec(k_pt_to_vec(p), radius_noise_ratio));
+ }
+
+ typename Kernel::Translated_point_d k_transl =
+ k.translated_point_d_object();
+ Point p2 = k_transl(p, c1_to_c2);
+ points.push_back(p);
+ points.push_back(p2);
+ i += 2;
+ }
+ return points;
+}
+
+// Product of a 3-sphere and a circle => d = 3 / D = 5
+
+template <typename Kernel>
+std::vector<typename Kernel::Point_d> generate_points_on_3sphere_and_circle(std::size_t num_points,
+ double sphere_radius) {
+ typedef typename Kernel::FT FT;
+ typedef typename Kernel::Point_d Point;
+ Kernel k;
+ CGAL::Random rng;
+ CGAL::Random_points_on_sphere_d<Point> generator(3, sphere_radius);
+ std::vector<Point> points;
+ points.reserve(num_points);
+
+ typename Kernel::Compute_coordinate_d k_coord =
+ k.compute_coordinate_d_object();
+ for (std::size_t i = 0; i < num_points;) {
+ Point p_sphere = *generator++; // First 3 coords
+
+ FT alpha = rng.get_double(0, 6.2832);
+ std::vector<FT> pt(5);
+ pt[0] = k_coord(p_sphere, 0);
+ pt[1] = k_coord(p_sphere, 1);
+ pt[2] = k_coord(p_sphere, 2);
+ pt[3] = std::cos(alpha);
+ pt[4] = std::sin(alpha);
+ Point p(pt.begin(), pt.end());
+ points.push_back(p);
+ ++i;
+ }
+ return points;
+}
+
+// a = big radius, b = small radius
+template <typename Kernel>
+std::vector<typename Kernel::Point_d> generate_points_on_klein_bottle_3D(std::size_t num_points, double a, double b,
+ bool uniform = false) {
+ typedef typename Kernel::Point_d Point;
+ typedef typename Kernel::FT FT;
+ Kernel k;
+ CGAL::Random rng;
+
+ // if uniform
+ std::size_t num_lines = (std::size_t)sqrt(num_points);
+
+ std::vector<Point> points;
+ points.reserve(num_points);
+ for (std::size_t i = 0; i < num_points;) {
+ FT u, v;
+ if (uniform) {
+ std::size_t k1 = i / num_lines;
+ std::size_t k2 = i % num_lines;
+ u = 6.2832 * k1 / num_lines;
+ v = 6.2832 * k2 / num_lines;
+ } else {
+ u = rng.get_double(0, 6.2832);
+ v = rng.get_double(0, 6.2832);
+ }
+ double tmp = cos(u / 2) * sin(v) - sin(u / 2) * sin(2. * v);
+ Point p = construct_point(k,
+ (a + b * tmp) * cos(u),
+ (a + b * tmp) * sin(u),
+ b * (sin(u / 2) * sin(v) + cos(u / 2) * sin(2. * v)));
+ points.push_back(p);
+ ++i;
+ }
+ return points;
+}
+
+// a = big radius, b = small radius
+template <typename Kernel>
+std::vector<typename Kernel::Point_d> generate_points_on_klein_bottle_4D(std::size_t num_points, double a, double b,
+ double noise = 0., bool uniform = false) {
+ typedef typename Kernel::Point_d Point;
+ typedef typename Kernel::FT FT;
+ Kernel k;
+ CGAL::Random rng;
+
+ // if uniform
+ std::size_t num_lines = (std::size_t)sqrt(num_points);
+
+ std::vector<Point> points;
+ points.reserve(num_points);
+ for (std::size_t i = 0; i < num_points;) {
+ FT u, v;
+ if (uniform) {
+ std::size_t k1 = i / num_lines;
+ std::size_t k2 = i % num_lines;
+ u = 6.2832 * k1 / num_lines;
+ v = 6.2832 * k2 / num_lines;
+ } else {
+ u = rng.get_double(0, 6.2832);
+ v = rng.get_double(0, 6.2832);
+ }
+ Point p = construct_point(k,
+ (a + b * cos(v)) * cos(u) + (noise == 0. ? 0. : rng.get_double(0, noise)),
+ (a + b * cos(v)) * sin(u) + (noise == 0. ? 0. : rng.get_double(0, noise)),
+ b * sin(v) * cos(u / 2) + (noise == 0. ? 0. : rng.get_double(0, noise)),
+ b * sin(v) * sin(u / 2) + (noise == 0. ? 0. : rng.get_double(0, noise)));
+ points.push_back(p);
+ ++i;
+ }
+ return points;
+}
+
+
+// a = big radius, b = small radius
+
+template <typename Kernel>
+std::vector<typename Kernel::Point_d>
+generate_points_on_klein_bottle_variant_5D(
+ std::size_t num_points, double a, double b, bool uniform = false) {
+ typedef typename Kernel::Point_d Point;
+ typedef typename Kernel::FT FT;
+ Kernel k;
+ CGAL::Random rng;
+
+ // if uniform
+ std::size_t num_lines = (std::size_t)sqrt(num_points);
+
+ std::vector<Point> points;
+ points.reserve(num_points);
+ for (std::size_t i = 0; i < num_points;) {
+ FT u, v;
+ if (uniform) {
+ std::size_t k1 = i / num_lines;
+ std::size_t k2 = i % num_lines;
+ u = 6.2832 * k1 / num_lines;
+ v = 6.2832 * k2 / num_lines;
+ } else {
+ u = rng.get_double(0, 6.2832);
+ v = rng.get_double(0, 6.2832);
+ }
+ FT x1 = (a + b * cos(v)) * cos(u);
+ FT x2 = (a + b * cos(v)) * sin(u);
+ FT x3 = b * sin(v) * cos(u / 2);
+ FT x4 = b * sin(v) * sin(u / 2);
+ FT x5 = x1 + x2 + x3 + x4;
+
+ Point p = construct_point(k, x1, x2, x3, x4, x5);
+ points.push_back(p);
+ ++i;
+ }
+ return points;
+}
+
+} // namespace Gudhi
+
+#endif // RANDOM_POINT_GENERATORS_H_
diff --git a/include/gudhi/reader_utils.h b/include/gudhi/reader_utils.h
index 899f9df6..97a87edd 100644
--- a/include/gudhi/reader_utils.h
+++ b/include/gudhi/reader_utils.h
@@ -2,9 +2,9 @@
* (Geometric Understanding in Higher Dimensions) is a generic C++
* library for computational topology.
*
- * Author(s): Clément Maria
+ * Author(s): Clement Maria, Pawel Dlotko
*
- * Copyright (C) 2014 INRIA Sophia Antipolis-Méditerranée (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
@@ -30,18 +30,25 @@
#include <iostream>
#include <fstream>
#include <map>
-#include <limits> // for numeric_limits<>
+#include <limits> // for numeric_limits
#include <string>
#include <vector>
+#include <utility> // for pair
+
+// Keep this file tag for Doxygen to parse the code, otherwise, functions are not documented.
+// It is required for global functions and variables.
+
+/** @file
+ * @brief This file includes common file reader for GUDHI
+ */
/**
- * \brief Read a set of points to turn it
- * into a vector< vector<double> > by filling points
+ * @brief Read a set of points to turn it into a vector< vector<double> > by filling points.
*
- * File format: 1 point per line
- * X11 X12 ... X1d
- * X21 X22 ... X2d
- * etc
+ * File format: 1 point per line<br>
+ * X11 X12 ... X1d<br>
+ * X21 X22 ... X2d<br>
+ * etc<br>
*/
inline void read_points(std::string file_name, std::vector< std::vector< double > > & points) {
std::ifstream in_file(file_name.c_str(), std::ios::in);
@@ -66,23 +73,29 @@ inline void read_points(std::string file_name, std::vector< std::vector< double
}
/**
- * \brief Read a graph from a file.
+ * @brief Read a graph from a file.
+ *
+ * \tparam Graph_t Type for the return graph. Must be constructible from iterators on pairs of Vertex_handle
+ * \tparam Filtration_value Type for the value of the read filtration
+ * \tparam Vertex_handle Type for the value of the read vertices
*
- * File format: 1 simplex per line
- * Dim1 X11 X12 ... X1d Fil1
- * Dim2 X21 X22 ... X2d Fil2
- * etc
+ * File format: 1 simplex per line<br>
+ * Dim1 X11 X12 ... X1d Fil1<br>
+ * Dim2 X21 X22 ... X2d Fil2<br>
+ * etc<br>
*
* The vertices must be labeled from 0 to n-1.
* Every simplex must appear exactly once.
* Simplices of dimension more than 1 are ignored.
*/
-inline Graph_t read_graph(std::string file_name) {
+template< typename Graph_t, typename Filtration_value, typename Vertex_handle >
+Graph_t read_graph(std::string file_name) {
std::ifstream in_(file_name.c_str(), std::ios::in);
if (!in_.is_open()) {
std::cerr << "Unable to open file " << file_name << std::endl;
}
+ typedef std::pair< Vertex_handle, Vertex_handle > Edge_t;
std::vector< Edge_t > edges;
std::vector< Filtration_value > edges_fil;
std::map< Vertex_handle, Filtration_value > vertices;
@@ -130,7 +143,7 @@ inline Graph_t read_graph(std::string file_name) {
Graph_t skel_graph(edges.begin(), edges.end(), edges_fil.begin(), vertices.size());
auto vertex_prop = boost::get(vertex_filtration_t(), skel_graph);
- boost::graph_traits<Graph_t>::vertex_iterator vi, vi_end;
+ typename boost::graph_traits<Graph_t>::vertex_iterator vi, vi_end;
auto v_it = vertices.begin();
for (std::tie(vi, vi_end) = boost::vertices(skel_graph); vi != vi_end; ++vi, ++v_it) {
boost::put(vertex_prop, *vi, v_it->second);
@@ -140,12 +153,12 @@ inline Graph_t read_graph(std::string file_name) {
}
/**
- * \brief Read a face from a file.
+ * @brief Read a face from a file.
*
- * File format: 1 simplex per line
- * Dim1 X11 X12 ... X1d Fil1
- * Dim2 X21 X22 ... X2d Fil2
- * etc
+ * File format: 1 simplex per line<br>
+ * Dim1 X11 X12 ... X1d Fil1<br>
+ * Dim2 X21 X22 ... X2d Fil2<br>
+ * etc<br>
*
* The vertices must be labeled from 0 to n-1.
* Every simplex must appear exactly once.
@@ -166,18 +179,16 @@ bool read_simplex(std::istream & in_, std::vector< Vertex_handle > & simplex, Fi
}
/**
- * \brief Read a hasse simplex from a file.
- *
- * File format: 1 simplex per line
- * Dim1 k11 k12 ... k1Dim1 Fil1
- * Dim2 k21 k22 ... k2Dim2 Fil2
- * etc
- *
- * The key of a simplex is its position in the filtration order
- * and also the number of its row in the file.
- * Dimi ki1 ki2 ... kiDimi Fili means that the ith simplex in the
- * filtration has dimension Dimi, filtration value fil1 and simplices with
- * key ki1 ... kiDimi in its boundary.*/
+ * @brief Read a hasse simplex from a file.
+ *
+ * File format: 1 simplex per line<br>
+ * Dim1 k11 k12 ... k1Dim1 Fil1<br>
+ * Dim2 k21 k22 ... k2Dim2 Fil2<br>
+ * etc<br>
+ *
+ * The key of a simplex is its position in the filtration order and also the number of its row in the file.
+ * Dimi ki1 ki2 ... kiDimi Fili means that the ith simplex in the filtration has dimension Dimi, filtration value
+ * fil1 and simplices with key ki1 ... kiDimi in its boundary.*/
template< typename Simplex_key, typename Filtration_value >
bool read_hasse_simplex(std::istream & in_, std::vector< Simplex_key > & boundary, Filtration_value & fil) {
int dim;
@@ -195,4 +206,93 @@ bool read_hasse_simplex(std::istream & in_, std::vector< Simplex_key > & boundar
return true;
}
+/**
+ * @brief Read a lower triangular distance matrix from a csv file. We assume that the .csv store the whole
+ * (square) matrix.
+ *
+ * @author Pawel Dlotko
+ *
+ * Square matrix file format:<br>
+ * 0;D12;...;D1j<br>
+ * D21;0;...;D2j<br>
+ * ...<br>
+ * Dj1;Dj2;...;0<br>
+ *
+ * lower matrix file format:<br>
+ * 0<br>
+ * D21;<br>
+ * D31;D32;<br>
+ * ...<br>
+ * Dj1;Dj2;...;Dj(j-1);<br>
+ *
+ **/
+template< typename Filtration_value >
+std::vector< std::vector< Filtration_value > > read_lower_triangular_matrix_from_csv_file(const std::string& filename,
+ const char separator = ';') {
+#ifdef DEBUG_TRACES
+ std::cout << "Using procedure read_lower_triangular_matrix_from_csv_file \n";
+#endif // DEBUG_TRACES
+ std::vector< std::vector< Filtration_value > > result;
+ std::ifstream in;
+ in.open(filename.c_str());
+ if (!in.is_open()) {
+ return result;
+ }
+
+ std::string line;
+
+ // the first line is emtpy, so we ignore it:
+ std::getline(in, line);
+ std::vector< Filtration_value > values_in_this_line;
+ result.push_back(values_in_this_line);
+
+ int number_of_line = 0;
+
+ // first, read the file line by line to a string:
+ while (std::getline(in, line)) {
+ // if line is empty, break
+ if (line.size() == 0)
+ break;
+
+ // if the last element of a string is comma:
+ if (line[ line.size() - 1 ] == separator) {
+ // then shrink the string by one
+ line.pop_back();
+ }
+
+ // replace all commas with spaces
+ std::replace(line.begin(), line.end(), separator, ' ');
+
+ // put the new line to a stream
+ std::istringstream iss(line);
+ // and now read the doubles.
+
+ int number_of_entry = 0;
+ std::vector< Filtration_value > values_in_this_line;
+ while (iss.good()) {
+ double entry;
+ iss >> entry;
+ if (number_of_entry <= number_of_line) {
+ values_in_this_line.push_back(entry);
+ }
+ ++number_of_entry;
+ }
+ if (!values_in_this_line.empty())result.push_back(values_in_this_line);
+ ++number_of_line;
+ }
+ in.close();
+
+#ifdef DEBUG_TRACES
+ std::cerr << "Here is the matrix we read : \n";
+ for (size_t i = 0; i != result.size(); ++i) {
+ for (size_t j = 0; j != result[i].size(); ++j) {
+ std::cerr << result[i][j] << " ";
+ }
+ std::cerr << std::endl;
+ }
+#endif // DEBUG_TRACES
+
+ return result;
+} // read_lower_triangular_matrix_from_csv_file
+
#endif // READER_UTILS_H_
diff --git a/include/gudhi/sparsify_point_set.h b/include/gudhi/sparsify_point_set.h
new file mode 100644
index 00000000..507f8c79
--- /dev/null
+++ b/include/gudhi/sparsify_point_set.h
@@ -0,0 +1,113 @@
+/* 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): Clement Jamin
+ *
+ * Copyright (C) 2016 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 SPARSIFY_POINT_SET_H_
+#define SPARSIFY_POINT_SET_H_
+
+#include <gudhi/Kd_tree_search.h>
+#ifdef GUDHI_SUBSAMPLING_PROFILING
+#include <gudhi/Clock.h>
+#endif
+
+#include <cstddef>
+#include <vector>
+
+namespace Gudhi {
+
+namespace subsampling {
+
+/**
+ * \ingroup subsampling
+ * \brief Outputs a subset of the input points so that the
+ * squared distance between any two points
+ * is greater than or equal to `min_squared_dist`.
+ *
+ * \tparam Kernel must be a model of the <a target="_blank"
+ * href="http://doc.cgal.org/latest/Spatial_searching/classSearchTraits.html">SearchTraits</a>
+ * concept, such as the <a target="_blank"
+ * href="http://doc.cgal.org/latest/Kernel_d/classCGAL_1_1Epick__d.html">CGAL::Epick_d</a> class, which
+ * can be static if you know the ambiant dimension at compile-time, or dynamic if you don't.
+ * \tparam Point_range Range whose value type is Kernel::Point_d. It must provide random-access
+ * via `operator[]` and the points should be stored contiguously in memory.
+ * \tparam OutputIterator Output iterator whose value type is Kernel::Point_d.
+ *
+ * @param[in] k A kernel object.
+ * @param[in] input_pts Const reference to the input points.
+ * @param[in] min_squared_dist Minimum squared distance separating the output points.
+ * @param[out] output_it The output iterator.
+ */
+template <typename Kernel, typename Point_range, typename OutputIterator>
+void
+sparsify_point_set(
+ const Kernel &k, Point_range const& input_pts,
+ typename Kernel::FT min_squared_dist,
+ OutputIterator output_it) {
+ typedef typename Gudhi::spatial_searching::Kd_tree_search<
+ Kernel, Point_range> Points_ds;
+
+#ifdef GUDHI_SUBSAMPLING_PROFILING
+ Gudhi::Clock t;
+#endif
+
+ Points_ds points_ds(input_pts);
+
+ std::vector<bool> dropped_points(input_pts.size(), false);
+
+ // Parse the input points, and add them if they are not too close to
+ // the other points
+ std::size_t pt_idx = 0;
+ for (typename Point_range::const_iterator it_pt = input_pts.begin();
+ it_pt != input_pts.end();
+ ++it_pt, ++pt_idx) {
+ if (dropped_points[pt_idx])
+ continue;
+
+ *output_it++ = *it_pt;
+
+ auto ins_range = points_ds.query_incremental_nearest_neighbors(*it_pt);
+
+ // If another point Q is closer that min_squared_dist, mark Q to be dropped
+ for (auto const& neighbor : ins_range) {
+ std::size_t neighbor_point_idx = neighbor.first;
+ // If the neighbor is too close, we drop the neighbor
+ if (neighbor.second < min_squared_dist) {
+ // N.B.: If neighbor_point_idx < pt_idx,
+ // dropped_points[neighbor_point_idx] is already true but adding a
+ // test doesn't make things faster, so why bother?
+ dropped_points[neighbor_point_idx] = true;
+ } else {
+ break;
+ }
+ }
+ }
+
+#ifdef GUDHI_SUBSAMPLING_PROFILING
+ t.end();
+ std::cerr << "Point set sparsified in " << t.num_seconds()
+ << " seconds." << std::endl;
+#endif
+}
+
+} // namespace subsampling
+} // namespace Gudhi
+
+#endif // SPARSIFY_POINT_SET_H_
diff --git a/include/gudhi_patches/Bottleneck_distance_CGAL_patches.txt b/include/gudhi_patches/Bottleneck_distance_CGAL_patches.txt
new file mode 100644
index 00000000..a588d113
--- /dev/null
+++ b/include/gudhi_patches/Bottleneck_distance_CGAL_patches.txt
@@ -0,0 +1,3 @@
+CGAL/Kd_tree.h
+CGAL/Kd_tree_node.h
+CGAL/Orthogonal_incremental_neighbor_search.h
diff --git a/include/gudhi_patches/CGAL/Convex_hull.h b/include/gudhi_patches/CGAL/Convex_hull.h
new file mode 100644
index 00000000..a8f91bf8
--- /dev/null
+++ b/include/gudhi_patches/CGAL/Convex_hull.h
@@ -0,0 +1,56 @@
+// Copyright (c) 2009-2014 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Samuel Hornus
+
+/* RANDOM DESIGN IDEAS:
+- Use a policy tag to choose for incremental with inserts only or
+ incremental with removals and inserts.
+ In the first case: use Triangulation for storage.
+ In the second case: use Delaunay !
+ In this second case, we must keeps the points that are inserted in the hull,
+ as they may become part of the boundary later on, when some points are removed.
+- Constructor with range argument uses quickhull.
+*/
+
+#ifndef CGAL_CONVEX_HULL_H
+#define CGAL_CONVEX_HULL_H
+
+namespace CGAL {
+
+template < class CHTraits, class TDS_ = Default >
+class Convex_hull
+{
+ typedef typename Maximal_dimension<typename CHTraits::Point_d>::type
+ Maximal_dimension_;
+ typedef typename Default::Get<TDS_, Triangulation_data_structure
+ < Maximal_dimension_,
+ Triangulation_vertex<CHTraits>,
+ Triangulation_full_cell<CHTraits> >
+ >::type TDS;
+ typedef Convex_hull<CHTraits, TDS_> Self;
+
+ typedef typename CHTraits::Coaffine_orientation_d
+ Coaffine_orientation_d;
+ typedef typename CHTraits::Orientation_d Orientation_d;
+
+public:
+};
+
+} //namespace CGAL
+
+#endif // CGAL_CONVEX_HULL_H
diff --git a/include/gudhi_patches/CGAL/Delaunay_triangulation.h b/include/gudhi_patches/CGAL/Delaunay_triangulation.h
new file mode 100644
index 00000000..071cd184
--- /dev/null
+++ b/include/gudhi_patches/CGAL/Delaunay_triangulation.h
@@ -0,0 +1,933 @@
+// Copyright (c) 2009-2014 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Samuel Hornus
+
+#ifndef CGAL_DELAUNAY_COMPLEX_H
+#define CGAL_DELAUNAY_COMPLEX_H
+
+#include <CGAL/tss.h>
+#include <CGAL/Triangulation.h>
+#include <CGAL/Dimension.h>
+#include <CGAL/Default.h>
+
+#include <boost/iterator/transform_iterator.hpp>
+
+#include <algorithm>
+
+namespace CGAL {
+
+template< typename DCTraits, typename _TDS = Default >
+class Delaunay_triangulation
+: public Triangulation<DCTraits,
+ typename Default::Get<_TDS, Triangulation_data_structure<
+ typename DCTraits::Dimension,
+ Triangulation_vertex<DCTraits>,
+ Triangulation_full_cell<DCTraits> >
+ >::type >
+{
+ typedef typename DCTraits::Dimension Maximal_dimension_;
+ typedef typename Default::Get<_TDS, Triangulation_data_structure<
+ Maximal_dimension_,
+ Triangulation_vertex<DCTraits>,
+ Triangulation_full_cell<DCTraits> >
+ >::type TDS;
+ typedef Triangulation<DCTraits, TDS> Base;
+ typedef Delaunay_triangulation<DCTraits, _TDS> Self;
+
+ typedef typename DCTraits::Side_of_oriented_sphere_d
+ Side_of_oriented_sphere_d;
+ typedef typename DCTraits::Orientation_d Orientation_d;
+
+public: // PUBLIC NESTED TYPES
+
+ typedef DCTraits Geom_traits;
+ typedef typename Base::Triangulation_ds Triangulation_ds;
+
+ typedef typename Base::Vertex Vertex;
+ typedef typename Base::Full_cell Full_cell;
+ typedef typename Base::Facet Facet;
+ typedef typename Base::Face Face;
+
+ typedef typename Base::Maximal_dimension Maximal_dimension;
+ typedef typename DCTraits::Point_d Point;
+ typedef typename DCTraits::Point_d Point_d;
+
+ typedef typename Base::Vertex_handle Vertex_handle;
+ typedef typename Base::Vertex_iterator Vertex_iterator;
+ typedef typename Base::Vertex_const_handle Vertex_const_handle;
+ typedef typename Base::Vertex_const_iterator Vertex_const_iterator;
+
+ typedef typename Base::Full_cell_handle Full_cell_handle;
+ typedef typename Base::Full_cell_iterator Full_cell_iterator;
+ typedef typename Base::Full_cell_const_handle Full_cell_const_handle;
+ typedef typename Base::Full_cell_const_iterator Full_cell_const_iterator;
+ typedef typename Base::Finite_full_cell_const_iterator
+ Finite_full_cell_const_iterator;
+
+ typedef typename Base::size_type size_type;
+ typedef typename Base::difference_type difference_type;
+
+ typedef typename Base::Locate_type Locate_type;
+
+ //Tag to distinguish triangulations with weighted_points
+ typedef Tag_false Weighted_tag;
+
+protected: // DATA MEMBERS
+
+
+public:
+
+ using typename Base::Rotor;
+ using Base::maximal_dimension;
+ using Base::are_incident_full_cells_valid;
+ using Base::coaffine_orientation_predicate;
+ using Base::reset_flat_orientation;
+ using Base::current_dimension;
+ //using Base::star;
+ //using Base::incident_full_cells;
+ using Base::geom_traits;
+ using Base::index_of_covertex;
+ //using Base::index_of_second_covertex;
+ using Base::infinite_vertex;
+ using Base::rotate_rotor;
+ using Base::insert_in_hole;
+ using Base::insert_outside_convex_hull_1;
+ using Base::is_infinite;
+ using Base::locate;
+ using Base::points_begin;
+ using Base::set_neighbors;
+ using Base::new_full_cell;
+ using Base::number_of_vertices;
+ using Base::orientation;
+ using Base::tds;
+ using Base::reorient_full_cells;
+ using Base::full_cell;
+ using Base::full_cells_begin;
+ using Base::full_cells_end;
+ using Base::finite_full_cells_begin;
+ using Base::finite_full_cells_end;
+ using Base::vertices_begin;
+ using Base::vertices_end;
+ // using Base::
+
+private:
+ //*** Side_of_oriented_subsphere_d ***
+ typedef typename Base::Flat_orientation_d Flat_orientation_d;
+ typedef typename Base::Construct_flat_orientation_d Construct_flat_orientation_d;
+ typedef typename DCTraits::In_flat_side_of_oriented_sphere_d In_flat_side_of_oriented_sphere_d;
+ // Wrapper
+ struct Side_of_oriented_subsphere_d
+ {
+ boost::optional<Flat_orientation_d>* fop;
+ Construct_flat_orientation_d cfo;
+ In_flat_side_of_oriented_sphere_d ifsoos;
+
+ Side_of_oriented_subsphere_d(
+ boost::optional<Flat_orientation_d>& x,
+ Construct_flat_orientation_d const&y,
+ In_flat_side_of_oriented_sphere_d const&z)
+ : fop(&x), cfo(y), ifsoos(z) {}
+
+ template<class Iter>
+ CGAL::Orientation operator()(Iter a, Iter b, const Point & p)const
+ {
+ if(!*fop)
+ *fop=cfo(a,b);
+ return ifsoos(fop->get(),a,b,p);
+ }
+ };
+public:
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - CREATION / CONSTRUCTORS
+
+ Delaunay_triangulation(int dim, const Geom_traits &k = Geom_traits())
+ : Base(dim, k)
+ {
+ }
+
+ // With this constructor,
+ // the user can specify a Flat_orientation_d object to be used for
+ // orienting simplices of a specific dimension
+ // (= preset_flat_orientation_.first)
+ // It it used by the dark triangulations created by DT::remove
+ Delaunay_triangulation(
+ int dim,
+ const std::pair<int, const Flat_orientation_d *> &preset_flat_orientation,
+ const Geom_traits &k = Geom_traits())
+ : Base(dim, preset_flat_orientation, k)
+ {
+ }
+
+ ~Delaunay_triangulation() {}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ACCESS
+
+ // Not Documented
+ Side_of_oriented_subsphere_d side_of_oriented_subsphere_predicate() const
+ {
+ return Side_of_oriented_subsphere_d (
+ flat_orientation_,
+ geom_traits().construct_flat_orientation_d_object(),
+ geom_traits().in_flat_side_of_oriented_sphere_d_object()
+ );
+ }
+
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - REMOVALS
+
+ Full_cell_handle remove(Vertex_handle);
+ Full_cell_handle remove(const Point & p, Full_cell_handle hint = Full_cell_handle())
+ {
+ Locate_type lt;
+ Face f(maximal_dimension());
+ Facet ft;
+ Full_cell_handle s = locate(p, lt, f, ft, hint);
+ if( Base::ON_VERTEX == lt )
+ {
+ return remove(s->vertex(f.index(0)));
+ }
+ return Full_cell_handle();
+ }
+
+ template< typename ForwardIterator >
+ void remove(ForwardIterator start, ForwardIterator end)
+ {
+ while( start != end )
+ remove(*start++);
+ }
+
+ // Not documented
+ void remove_decrease_dimension(Vertex_handle);
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - INSERTIONS
+
+ template< typename ForwardIterator >
+ size_type insert(ForwardIterator start, ForwardIterator end)
+ {
+ size_type n = number_of_vertices();
+ std::vector<Point> points(start, end);
+ spatial_sort(points.begin(), points.end(), geom_traits());
+ Full_cell_handle hint;
+ for( typename std::vector<Point>::const_iterator p = points.begin(); p != points.end(); ++p )
+ {
+ hint = insert(*p, hint)->full_cell();
+ }
+ return number_of_vertices() - n;
+ }
+ Vertex_handle insert(const Point &, Locate_type, const Face &, const Facet &, Full_cell_handle);
+ Vertex_handle insert(const Point & p, Full_cell_handle start = Full_cell_handle())
+ {
+ Locate_type lt;
+ Face f(maximal_dimension());
+ Facet ft;
+ Full_cell_handle s = locate(p, lt, f, ft, start);
+ return insert(p, lt, f, ft, s);
+ }
+ Vertex_handle insert(const Point & p, Vertex_handle hint)
+ {
+ CGAL_assertion( Vertex_handle() != hint );
+ return insert(p, hint->full_cell());
+ }
+ Vertex_handle insert_outside_affine_hull(const Point &);
+ Vertex_handle insert_in_conflicting_cell(const Point &, Full_cell_handle);
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - GATHERING CONFLICTING SIMPLICES
+
+ bool is_in_conflict(const Point &, Full_cell_const_handle) const;
+ template< class OrientationPredicate >
+ Oriented_side perturbed_side_of_positive_sphere(const Point &,
+ Full_cell_const_handle, const OrientationPredicate &) const;
+
+ template< typename OutputIterator >
+ Facet compute_conflict_zone(const Point &, Full_cell_handle, OutputIterator) const;
+
+ template < typename OrientationPredicate, typename SideOfOrientedSpherePredicate >
+ class Conflict_predicate
+ {
+ const Self & dc_;
+ const Point & p_;
+ OrientationPredicate ori_;
+ SideOfOrientedSpherePredicate side_of_s_;
+ int cur_dim_;
+ public:
+ Conflict_predicate(
+ const Self & dc,
+ const Point & p,
+ const OrientationPredicate & ori,
+ const SideOfOrientedSpherePredicate & side)
+ : dc_(dc), p_(p), ori_(ori), side_of_s_(side), cur_dim_(dc.current_dimension()) {}
+
+ inline
+ bool operator()(Full_cell_const_handle s) const
+ {
+ bool ok;
+ if( ! dc_.is_infinite(s) )
+ {
+ Oriented_side side = side_of_s_(dc_.points_begin(s), dc_.points_begin(s) + cur_dim_ + 1, p_);
+ if( ON_POSITIVE_SIDE == side )
+ ok = true;
+ else if( ON_NEGATIVE_SIDE == side )
+ ok = false;
+ else
+ ok = ON_POSITIVE_SIDE == dc_.perturbed_side_of_positive_sphere<OrientationPredicate>(p_, s, ori_);
+ }
+ else
+ {
+ typedef typename Full_cell::Vertex_handle_const_iterator VHCI;
+ typedef Substitute_point_in_vertex_iterator<VHCI> F;
+ F spivi(dc_.infinite_vertex(), &p_);
+
+ Orientation o = ori_(
+ boost::make_transform_iterator(s->vertices_begin(), spivi),
+ boost::make_transform_iterator(s->vertices_begin() + cur_dim_ + 1,
+ spivi));
+
+ if( POSITIVE == o )
+ ok = true;
+ else if( o == NEGATIVE )
+ ok = false;
+ else
+ ok = (*this)(s->neighbor( s->index( dc_.infinite_vertex() ) ));
+ }
+ return ok;
+ }
+ };
+
+ template < typename ConflictPredicate >
+ class Conflict_traversal_predicate
+ {
+ const Self & dc_;
+ const ConflictPredicate & pred_;
+ public:
+ Conflict_traversal_predicate(const Self & dc, const ConflictPredicate & pred)
+ : dc_(dc), pred_(pred)
+ {}
+ inline
+ bool operator()(const Facet & f) const
+ {
+ return pred_(dc_.full_cell(f)->neighbor(dc_.index_of_covertex(f)));
+ }
+ };
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - VALIDITY
+
+ bool is_valid(bool verbose = false, int level = 0) const;
+
+private:
+ // Some internal types to shorten notation
+ typedef typename Base::Coaffine_orientation_d Coaffine_orientation_d;
+ using Base::flat_orientation_;
+ typedef Conflict_predicate<Coaffine_orientation_d, Side_of_oriented_subsphere_d>
+ Conflict_pred_in_subspace;
+ typedef Conflict_predicate<Orientation_d, Side_of_oriented_sphere_d>
+ Conflict_pred_in_fullspace;
+ typedef Conflict_traversal_predicate<Conflict_pred_in_subspace>
+ Conflict_traversal_pred_in_subspace;
+ typedef Conflict_traversal_predicate<Conflict_pred_in_fullspace>
+ Conflict_traversal_pred_in_fullspace;
+};
+
+// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
+// FUNCTIONS THAT ARE MEMBER METHODS:
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - REMOVALS
+
+template< typename DCTraits, typename TDS >
+typename Delaunay_triangulation<DCTraits, TDS>::Full_cell_handle
+Delaunay_triangulation<DCTraits, TDS>
+::remove( Vertex_handle v )
+{
+ CGAL_precondition( ! is_infinite(v) );
+ CGAL_expensive_precondition( is_vertex(v) );
+
+ // THE CASE cur_dim == 0
+ if( 0 == current_dimension() )
+ {
+ remove_decrease_dimension(v);
+ return Full_cell_handle();
+ }
+ else if( 1 == current_dimension() )
+ { // THE CASE cur_dim == 1
+ if( 2 == number_of_vertices() )
+ {
+ remove_decrease_dimension(v);
+ return Full_cell_handle();
+ }
+ Full_cell_handle left = v->full_cell();
+ if( 0 == left->index(v) )
+ left = left->neighbor(1);
+ CGAL_assertion( 1 == left->index(v) );
+ Full_cell_handle right = left->neighbor(0);
+
+ tds().associate_vertex_with_full_cell(left, 1, right->vertex(1));
+ set_neighbors(left, 0, right->neighbor(0), right->mirror_index(0));
+
+ tds().delete_vertex(v);
+ tds().delete_full_cell(right);
+ return left;
+ }
+
+ // THE CASE cur_dim >= 2
+ // Gather the finite vertices sharing an edge with |v|
+ typedef typename Base::template Full_cell_set<Full_cell_handle> Simplices;
+ Simplices simps;
+ std::back_insert_iterator<Simplices> out(simps);
+ tds().incident_full_cells(v, out);
+ typedef std::set<Vertex_handle> Vertex_set;
+ Vertex_set verts;
+ Vertex_handle vh;
+ for( typename Simplices::iterator it = simps.begin(); it != simps.end(); ++it )
+ for( int i = 0; i <= current_dimension(); ++i )
+ {
+ vh = (*it)->vertex(i);
+ if( is_infinite(vh) )
+ continue;
+ if( vh == v )
+ continue;
+ verts.insert(vh);
+ }
+
+ // After gathering finite neighboring vertices, create their Dark Delaunay triangulation
+ typedef Triangulation_vertex<Geom_traits, Vertex_handle> Dark_vertex_base;
+ typedef Triangulation_full_cell<Geom_traits,
+ internal::Triangulation::Dark_full_cell_data<Self> > Dark_full_cell_base;
+ typedef Triangulation_data_structure<Maximal_dimension, Dark_vertex_base, Dark_full_cell_base> Dark_tds;
+ typedef Delaunay_triangulation<DCTraits, Dark_tds> Dark_triangulation;
+ typedef typename Dark_triangulation::Face Dark_face;
+ typedef typename Dark_triangulation::Facet Dark_facet;
+ typedef typename Dark_triangulation::Vertex_handle Dark_v_handle;
+ typedef typename Dark_triangulation::Full_cell_handle Dark_s_handle;
+
+ // If flat_orientation_ is defined, we give it the Dark triangulation
+ // so that the orientation it uses for "current_dimension()"-simplices is
+ // coherent with the global triangulation
+ Dark_triangulation dark_side(
+ maximal_dimension(),
+ flat_orientation_ ?
+ std::pair<int, const Flat_orientation_d *>(current_dimension(), flat_orientation_.get_ptr())
+ : std::pair<int, const Flat_orientation_d *>((std::numeric_limits<int>::max)(), (Flat_orientation_d*) NULL) );
+
+ Dark_s_handle dark_s;
+ Dark_v_handle dark_v;
+ typedef std::map<Vertex_handle, Dark_v_handle> Vertex_map;
+ Vertex_map light_to_dark;
+ typename Vertex_set::iterator vit = verts.begin();
+ while( vit != verts.end() )
+ {
+ dark_v = dark_side.insert((*vit)->point(), dark_s);
+ dark_s = dark_v->full_cell();
+ dark_v->data() = *vit;
+ light_to_dark[*vit] = dark_v;
+ ++vit;
+ }
+
+ if( dark_side.current_dimension() != current_dimension() )
+ {
+ CGAL_assertion( dark_side.current_dimension() + 1 == current_dimension() );
+ // Here, the finite neighbors of |v| span a affine subspace of
+ // dimension one less than the current dimension. Two cases are possible:
+ if( (size_type)(verts.size() + 1) == number_of_vertices() )
+ {
+ remove_decrease_dimension(v);
+ return Full_cell_handle();
+ }
+ else
+ { // |v| is strictly outside the convex hull of the rest of the points. This is an
+ // easy case: first, modify the finite full_cells, then, delete the infinite ones.
+ // We don't even need the Dark triangulation.
+ Simplices infinite_simps;
+ {
+ Simplices finite_simps;
+ for( typename Simplices::iterator it = simps.begin(); it != simps.end(); ++it )
+ if( is_infinite(*it) )
+ infinite_simps.push_back(*it);
+ else
+ finite_simps.push_back(*it);
+ simps.swap(finite_simps);
+ } // now, simps only contains finite simplices
+ // First, modify the finite full_cells:
+ for( typename Simplices::iterator it = simps.begin(); it != simps.end(); ++it )
+ {
+ int v_idx = (*it)->index(v);
+ tds().associate_vertex_with_full_cell(*it, v_idx, infinite_vertex());
+ }
+ // Make the handles to infinite full cells searchable
+ infinite_simps.make_searchable();
+ // Then, modify the neighboring relation
+ for( typename Simplices::iterator it = simps.begin(); it != simps.end(); ++it )
+ {
+ for( int i = 0; i <= current_dimension(); ++i )
+ {
+ if (is_infinite((*it)->vertex(i)))
+ continue;
+ (*it)->vertex(i)->set_full_cell(*it);
+ Full_cell_handle n = (*it)->neighbor(i);
+ // Was |n| a finite full cell prior to removing |v| ?
+ if( ! infinite_simps.contains(n) )
+ continue;
+ int n_idx = n->index(v);
+ set_neighbors(*it, i, n->neighbor(n_idx), n->neighbor(n_idx)->index(n));
+ }
+ }
+ Full_cell_handle ret_s;
+ // Then, we delete the infinite full_cells
+ for( typename Simplices::iterator it = infinite_simps.begin(); it != infinite_simps.end(); ++it )
+ tds().delete_full_cell(*it);
+ tds().delete_vertex(v);
+ return simps.front();
+ }
+ }
+ else // From here on, dark_side.current_dimension() == current_dimension()
+ {
+ dark_side.infinite_vertex()->data() = infinite_vertex();
+ light_to_dark[infinite_vertex()] = dark_side.infinite_vertex();
+ }
+
+ // Now, compute the conflict zone of v->point() in
+ // the dark side. This is precisely the set of full_cells
+ // that we have to glue back into the light side.
+ Dark_face dark_f(dark_side.maximal_dimension());
+ Dark_facet dark_ft;
+ typename Dark_triangulation::Locate_type lt;
+ dark_s = dark_side.locate(v->point(), lt, dark_f, dark_ft);
+ CGAL_assertion( lt != Dark_triangulation::ON_VERTEX
+ && lt != Dark_triangulation::OUTSIDE_AFFINE_HULL );
+
+ // |ret_s| is the full_cell that we return
+ Dark_s_handle dark_ret_s = dark_s;
+ Full_cell_handle ret_s;
+
+ typedef typename Base::template Full_cell_set<Dark_s_handle> Dark_full_cells;
+ Dark_full_cells conflict_zone;
+ std::back_insert_iterator<Dark_full_cells> dark_out(conflict_zone);
+
+ dark_ft = dark_side.compute_conflict_zone(v->point(), dark_s, dark_out);
+ // Make the dark simplices in the conflict zone searchable
+ conflict_zone.make_searchable();
+
+ // THE FOLLOWING SHOULD MAYBE GO IN TDS.
+ // Here is the plan:
+ // 1. Pick any Facet from boundary of the light zone
+ // 2. Find corresponding Facet on boundary of dark zone
+ // 3. stitch.
+
+ // 1. Build a facet on the boudary of the light zone:
+ Full_cell_handle light_s = *simps.begin();
+ Facet light_ft(light_s, light_s->index(v));
+
+ // 2. Find corresponding Dark_facet on boundary of the dark zone
+ Dark_full_cells dark_incident_s;
+ for( int i = 0; i <= current_dimension(); ++i )
+ {
+ if( index_of_covertex(light_ft) == i )
+ continue;
+ Dark_v_handle dark_v = light_to_dark[full_cell(light_ft)->vertex(i)];
+ dark_incident_s.clear();
+ dark_out = std::back_inserter(dark_incident_s);
+ dark_side.tds().incident_full_cells(dark_v, dark_out);
+ for( typename Dark_full_cells::iterator it = dark_incident_s.begin(); it != dark_incident_s.end(); ++it )
+ {
+ (*it)->data().count_ += 1;
+ }
+ }
+
+ for( typename Dark_full_cells::iterator it = dark_incident_s.begin(); it != dark_incident_s.end(); ++it )
+ {
+ if( current_dimension() != (*it)->data().count_ )
+ continue;
+ if( ! conflict_zone.contains(*it) )
+ continue;
+ // We found a full_cell incident to the dark facet corresponding to the light facet |light_ft|
+ int ft_idx = 0;
+ while( light_s->has_vertex( (*it)->vertex(ft_idx)->data() ) )
+ ++ft_idx;
+ dark_ft = Dark_facet(*it, ft_idx);
+ break;
+ }
+ // Pre-3. Now, we are ready to traverse both boundary and do the stiching.
+
+ // But first, we create the new full_cells in the light triangulation,
+ // with as much adjacency information as possible.
+
+ // Create new full_cells with vertices
+ for( typename Dark_full_cells::iterator it = conflict_zone.begin(); it != conflict_zone.end(); ++it )
+ {
+ Full_cell_handle new_s = new_full_cell();
+ (*it)->data().light_copy_ = new_s;
+ for( int i = 0; i <= current_dimension(); ++i )
+ tds().associate_vertex_with_full_cell(new_s, i, (*it)->vertex(i)->data());
+ if( dark_ret_s == *it )
+ ret_s = new_s;
+ }
+
+ // Setup adjacencies inside the hole
+ for( typename Dark_full_cells::iterator it = conflict_zone.begin(); it != conflict_zone.end(); ++it )
+ {
+ Full_cell_handle new_s = (*it)->data().light_copy_;
+ for( int i = 0; i <= current_dimension(); ++i )
+ if( conflict_zone.contains((*it)->neighbor(i)) )
+ tds().set_neighbors(new_s, i, (*it)->neighbor(i)->data().light_copy_, (*it)->mirror_index(i));
+ }
+
+ // 3. Stitch
+ simps.make_searchable();
+ typedef std::queue<std::pair<Facet, Dark_facet> > Queue;
+ Queue q;
+ q.push(std::make_pair(light_ft, dark_ft));
+ dark_s = dark_side.full_cell(dark_ft);
+ int dark_i = dark_side.index_of_covertex(dark_ft);
+ // mark dark_ft as visited:
+ // TODO try by marking with Dark_v_handle (vertex)
+ dark_s->neighbor(dark_i)->set_neighbor(dark_s->mirror_index(dark_i), Dark_s_handle());
+ while( ! q.empty() )
+ {
+ std::pair<Facet, Dark_facet> p = q.front();
+ q.pop();
+ light_ft = p.first;
+ dark_ft = p.second;
+ light_s = full_cell(light_ft);
+ int light_i = index_of_covertex(light_ft);
+ dark_s = dark_side.full_cell(dark_ft);
+ int dark_i = dark_side.index_of_covertex(dark_ft);
+ Full_cell_handle light_n = light_s->neighbor(light_i);
+ set_neighbors(dark_s->data().light_copy_, dark_i, light_n, light_s->mirror_index(light_i));
+ for( int di = 0; di <= current_dimension(); ++di )
+ {
+ if( di == dark_i )
+ continue;
+ int li = light_s->index(dark_s->vertex(di)->data());
+ Rotor light_r(light_s, li, light_i);
+ typename Dark_triangulation::Rotor dark_r(dark_s, di, dark_i);
+
+ while (simps.contains(cpp11::get<0>(light_r)->neighbor(cpp11::get<1>(light_r))))
+ light_r = rotate_rotor(light_r);
+
+ while (conflict_zone.contains(cpp11::get<0>(dark_r)->neighbor(cpp11::get<1>(dark_r))))
+ dark_r = dark_side.rotate_rotor(dark_r);
+
+ Dark_s_handle dark_ns = cpp11::get<0>(dark_r);
+ int dark_ni = cpp11::get<1>(dark_r);
+ Full_cell_handle light_ns = cpp11::get<0>(light_r);
+ int light_ni = cpp11::get<1>(light_r);
+ // mark dark_r as visited:
+ // TODO try by marking with Dark_v_handle (vertex)
+ Dark_s_handle outside = dark_ns->neighbor(dark_ni);
+ Dark_v_handle mirror = dark_ns->mirror_vertex(dark_ni, current_dimension());
+ int dn = outside->index(mirror);
+ if( Dark_s_handle() == outside->neighbor(dn) )
+ continue;
+ outside->set_neighbor(dn, Dark_s_handle());
+ q.push(std::make_pair(Facet(light_ns, light_ni), Dark_facet(dark_ns, dark_ni)));
+ }
+ }
+ tds().delete_full_cells(simps.begin(), simps.end());
+ tds().delete_vertex(v);
+ return ret_s;
+}
+
+template< typename DCTraits, typename TDS >
+void
+Delaunay_triangulation<DCTraits, TDS>
+::remove_decrease_dimension(Vertex_handle v)
+{
+ CGAL_precondition( current_dimension() >= 0 );
+ tds().remove_decrease_dimension(v, infinite_vertex());
+ // reset the predicates:
+ reset_flat_orientation();
+ if( 1 <= current_dimension() )
+ {
+ Full_cell_handle inf_v_cell = infinite_vertex()->full_cell();
+ int inf_v_index = inf_v_cell->index(infinite_vertex());
+ Full_cell_handle s = inf_v_cell->neighbor(inf_v_index);
+ Orientation o = orientation(s);
+ CGAL_assertion( ZERO != o );
+ if( NEGATIVE == o )
+ reorient_full_cells();
+ }
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - INSERTIONS
+
+template< typename DCTraits, typename TDS >
+typename Delaunay_triangulation<DCTraits, TDS>::Vertex_handle
+Delaunay_triangulation<DCTraits, TDS>
+::insert(const Point & p, Locate_type lt, const Face & f, const Facet &, Full_cell_handle s)
+{
+ switch( lt )
+ {
+ case Base::OUTSIDE_AFFINE_HULL:
+ return insert_outside_affine_hull(p);
+ break;
+ case Base::ON_VERTEX:
+ {
+ Vertex_handle v = s->vertex(f.index(0));
+ v->set_point(p);
+ return v;
+ break;
+ }
+ default:
+ if( 1 == current_dimension() )
+ {
+ if( Base::OUTSIDE_CONVEX_HULL == lt )
+ {
+ return insert_outside_convex_hull_1(p, s);
+ }
+ Vertex_handle v = tds().insert_in_full_cell(s);
+ v->set_point(p);
+ return v;
+ }
+ else
+ return insert_in_conflicting_cell(p, s);
+ break;
+ }
+}
+
+/*
+[Undocumented function]
+
+Inserts the point `p` in the Delaunay triangulation. Returns a handle to the
+(possibly newly created) vertex at that position.
+\pre The point `p`
+must lie outside the affine hull of the Delaunay triangulation. This implies that
+`dt`.`current_dimension()` must be less than `dt`.`maximal_dimension()`.
+*/
+template< typename DCTraits, typename TDS >
+typename Delaunay_triangulation<DCTraits, TDS>::Vertex_handle
+Delaunay_triangulation<DCTraits, TDS>
+::insert_outside_affine_hull(const Point & p)
+{
+ // we don't use Base::insert_outside_affine_hull(...) because here, we
+ // also need to reset the side_of_oriented_subsphere functor.
+ CGAL_precondition( current_dimension() < maximal_dimension() );
+ Vertex_handle v = tds().insert_increase_dimension(infinite_vertex());
+ // reset the predicates:
+ reset_flat_orientation();
+ v->set_point(p);
+ if( current_dimension() >= 1 )
+ {
+ Full_cell_handle inf_v_cell = infinite_vertex()->full_cell();
+ int inf_v_index = inf_v_cell->index(infinite_vertex());
+ Full_cell_handle s = inf_v_cell->neighbor(inf_v_index);
+ Orientation o = orientation(s);
+ CGAL_assertion( ZERO != o );
+ if( NEGATIVE == o )
+ reorient_full_cells();
+
+ // We just inserted the second finite point and the right infinite
+ // cell is like : (inf_v, v), but we want it to be (v, inf_v) to be
+ // consistent with the rest of the cells
+ if (current_dimension() == 1)
+ {
+ // Is "inf_v_cell" the right infinite cell?
+ // Then inf_v_index should be 1
+ if (inf_v_cell->neighbor(inf_v_index)->index(inf_v_cell) == 0
+ && inf_v_index == 0)
+ {
+ inf_v_cell->swap_vertices(
+ current_dimension() - 1, current_dimension());
+ }
+ // Otherwise, let's find the right infinite cell
+ else
+ {
+ inf_v_cell = inf_v_cell->neighbor((inf_v_index + 1) % 2);
+ inf_v_index = inf_v_cell->index(infinite_vertex());
+ // Is "inf_v_cell" the right infinite cell?
+ // Then inf_v_index should be 1
+ if (inf_v_cell->neighbor(inf_v_index)->index(inf_v_cell) == 0
+ && inf_v_index == 0)
+ {
+ inf_v_cell->swap_vertices(
+ current_dimension() - 1, current_dimension());
+ }
+ }
+ }
+ }
+ return v;
+}
+
+/*!
+[Undocumented function]
+
+Inserts the point `p` in the Delaunay triangulation. Returns a handle to the
+(possibly newly created) vertex at that position.
+\pre The point `p` must be in conflict with the full cell `c`.
+*/
+template< typename DCTraits, typename TDS >
+typename Delaunay_triangulation<DCTraits, TDS>::Vertex_handle
+Delaunay_triangulation<DCTraits, TDS>
+::insert_in_conflicting_cell(const Point & p, Full_cell_handle s)
+{
+ CGAL_precondition(is_in_conflict(p, s));
+
+ // for storing conflicting full_cells.
+ typedef std::vector<Full_cell_handle> Full_cell_h_vector;
+ CGAL_STATIC_THREAD_LOCAL_VARIABLE(Full_cell_h_vector,cs,0);
+ cs.clear();
+
+ std::back_insert_iterator<Full_cell_h_vector> out(cs);
+ Facet ft = compute_conflict_zone(p, s, out);
+ return insert_in_hole(p, cs.begin(), cs.end(), ft);
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GATHERING CONFLICTING SIMPLICES
+
+// NOT DOCUMENTED
+template< typename DCTraits, typename TDS >
+template< typename OrientationPred >
+Oriented_side
+Delaunay_triangulation<DCTraits, TDS>
+::perturbed_side_of_positive_sphere(const Point & p, Full_cell_const_handle s,
+ const OrientationPred & ori) const
+{
+ CGAL_precondition_msg( ! is_infinite(s), "full cell must be finite");
+ CGAL_expensive_precondition( POSITIVE == orientation(s) );
+ typedef std::vector<const Point *> Points;
+ Points points(current_dimension() + 2);
+ int i(0);
+ for( ; i <= current_dimension(); ++i )
+ points[i] = &(s->vertex(i)->point());
+ points[i] = &p;
+ std::sort(points.begin(), points.end(),
+ internal::Triangulation::Compare_points_for_perturbation<Self>(*this));
+ typename Points::const_reverse_iterator cut_pt = points.rbegin();
+ Points test_points;
+ while( cut_pt != points.rend() )
+ {
+ if( &p == *cut_pt )
+ // because the full_cell "s" is assumed to be positively oriented
+ return ON_NEGATIVE_SIDE; // we consider |p| to lie outside the sphere
+ test_points.clear();
+ typename Base::Point_const_iterator spit = points_begin(s);
+ int adjust_sign = -1;
+ for( i = 0; i < current_dimension(); ++i )
+ {
+ if( &(*spit) == *cut_pt )
+ {
+ ++spit;
+ adjust_sign = (((current_dimension() + i) % 2) == 0) ? -1 : +1;
+ }
+ test_points.push_back(&(*spit));
+ ++spit;
+ }
+ test_points.push_back(&p);
+
+ typedef typename CGAL::Iterator_project<typename Points::iterator,
+ internal::Triangulation::Point_from_pointer<Self>,
+ const Point &, const Point *> Point_pointer_iterator;
+
+ Orientation ori_value = ori(
+ Point_pointer_iterator(test_points.begin()),
+ Point_pointer_iterator(test_points.end()));
+
+ if( ZERO != ori_value )
+ return Oriented_side( - adjust_sign * ori_value );
+
+ ++cut_pt;
+ }
+ CGAL_assertion(false); // we should never reach here
+ return ON_NEGATIVE_SIDE;
+}
+
+template< typename DCTraits, typename TDS >
+bool
+Delaunay_triangulation<DCTraits, TDS>
+::is_in_conflict(const Point & p, Full_cell_const_handle s) const
+{
+ CGAL_precondition( 2 <= current_dimension() );
+ if( current_dimension() < maximal_dimension() )
+ {
+ Conflict_pred_in_subspace c(*this, p, coaffine_orientation_predicate(), side_of_oriented_subsphere_predicate());
+ return c(s);
+ }
+ else
+ {
+ Orientation_d ori = geom_traits().orientation_d_object();
+ Side_of_oriented_sphere_d side = geom_traits().side_of_oriented_sphere_d_object();
+ Conflict_pred_in_fullspace c(*this, p, ori, side);
+ return c(s);
+ }
+}
+
+template< typename DCTraits, typename TDS >
+template< typename OutputIterator >
+typename Delaunay_triangulation<DCTraits, TDS>::Facet
+Delaunay_triangulation<DCTraits, TDS>
+::compute_conflict_zone(const Point & p, Full_cell_handle s, OutputIterator out) const
+{
+ CGAL_precondition( 2 <= current_dimension() );
+ if( current_dimension() < maximal_dimension() )
+ {
+ Conflict_pred_in_subspace c(*this, p, coaffine_orientation_predicate(), side_of_oriented_subsphere_predicate());
+ Conflict_traversal_pred_in_subspace tp(*this, c);
+ return tds().gather_full_cells(s, tp, out);
+ }
+ else
+ {
+ Orientation_d ori = geom_traits().orientation_d_object();
+ Side_of_oriented_sphere_d side = geom_traits().side_of_oriented_sphere_d_object();
+ Conflict_pred_in_fullspace c(*this, p, ori, side);
+ Conflict_traversal_pred_in_fullspace tp(*this, c);
+ return tds().gather_full_cells(s, tp, out);
+ }
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - VALIDITY
+
+template< typename DCTraits, typename TDS >
+bool
+Delaunay_triangulation<DCTraits, TDS>
+::is_valid(bool verbose, int level) const
+{
+ if (!Base::is_valid(verbose, level))
+ return false;
+
+ int dim = current_dimension();
+ if (dim == maximal_dimension())
+ {
+ for (Finite_full_cell_const_iterator cit = this->finite_full_cells_begin() ;
+ cit != this->finite_full_cells_end() ; ++cit )
+ {
+ Full_cell_const_handle ch = cit.base();
+ for(int i = 0; i < dim+1 ; ++i )
+ {
+ // If the i-th neighbor is not an infinite cell
+ Vertex_handle opposite_vh =
+ ch->neighbor(i)->vertex(ch->neighbor(i)->index(ch));
+ if (!is_infinite(opposite_vh))
+ {
+ Side_of_oriented_sphere_d side =
+ geom_traits().side_of_oriented_sphere_d_object();
+ if (side(Point_const_iterator(ch->vertices_begin()),
+ Point_const_iterator(ch->vertices_end()),
+ opposite_vh->point()) == ON_BOUNDED_SIDE)
+ {
+ if (verbose)
+ CGAL_warning_msg(false, "Non-empty sphere");
+ return false;
+ }
+ }
+ }
+ }
+ }
+ return true;
+}
+
+
+} //namespace CGAL
+
+#endif // CGAL_DELAUNAY_COMPLEX_H
diff --git a/include/gudhi_patches/CGAL/Epeck_d.h b/include/gudhi_patches/CGAL/Epeck_d.h
new file mode 100644
index 00000000..52bce84c
--- /dev/null
+++ b/include/gudhi_patches/CGAL/Epeck_d.h
@@ -0,0 +1,53 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_EPECK_D_H
+#define CGAL_EPECK_D_H
+#include <CGAL/NewKernel_d/Cartesian_base.h>
+#include <CGAL/NewKernel_d/Wrapper/Cartesian_wrap.h>
+#include <CGAL/NewKernel_d/Kernel_d_interface.h>
+#include <CGAL/internal/Exact_type_selector.h>
+
+
+namespace CGAL {
+#define CGAL_BASE \
+ Cartesian_base_d<internal::Exact_field_selector<double>::Type, Dim>
+template<class Dim>
+struct Epeck_d_help1
+: CGAL_BASE
+{
+ CGAL_CONSTEXPR Epeck_d_help1(){}
+ CGAL_CONSTEXPR Epeck_d_help1(int d):CGAL_BASE(d){}
+};
+#undef CGAL_BASE
+#define CGAL_BASE \
+ Kernel_d_interface< \
+ Cartesian_wrap< \
+ Epeck_d_help1<Dim>, \
+ Epeck_d<Dim> > >
+template<class Dim>
+struct Epeck_d
+: CGAL_BASE
+{
+ CGAL_CONSTEXPR Epeck_d(){}
+ CGAL_CONSTEXPR Epeck_d(int d):CGAL_BASE(d){}
+};
+#undef CGAL_BASE
+}
+#endif
diff --git a/include/gudhi_patches/CGAL/Epick_d.h b/include/gudhi_patches/CGAL/Epick_d.h
new file mode 100644
index 00000000..64438539
--- /dev/null
+++ b/include/gudhi_patches/CGAL/Epick_d.h
@@ -0,0 +1,71 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_EPICK_D_H
+#define CGAL_EPICK_D_H
+#include <CGAL/NewKernel_d/Cartesian_base.h>
+#include <CGAL/NewKernel_d/Cartesian_static_filters.h>
+#include <CGAL/NewKernel_d/Cartesian_filter_K.h>
+#include <CGAL/NewKernel_d/Wrapper/Cartesian_wrap.h>
+#include <CGAL/NewKernel_d/Kernel_d_interface.h>
+#include <CGAL/internal/Exact_type_selector.h>
+#include <CGAL/Interval_nt.h>
+#include <CGAL/NewKernel_d/Types/Weighted_point.h>
+
+
+namespace CGAL {
+#define CGAL_BASE \
+ Cartesian_filter_K< \
+ Cartesian_base_d<double, Dim>, \
+ Cartesian_base_d<Interval_nt_advanced, Dim>, \
+ Cartesian_base_d<internal::Exact_field_selector<double>::Type, Dim> \
+ >
+template<class Dim>
+struct Epick_d_help1
+: CGAL_BASE
+{
+ CGAL_CONSTEXPR Epick_d_help1(){}
+ CGAL_CONSTEXPR Epick_d_help1(int d):CGAL_BASE(d){}
+};
+#undef CGAL_BASE
+#define CGAL_BASE \
+ Cartesian_static_filters<Dim,Epick_d_help1<Dim>,Epick_d_help2<Dim> >
+template<class Dim>
+struct Epick_d_help2
+: CGAL_BASE
+{
+ CGAL_CONSTEXPR Epick_d_help2(){}
+ CGAL_CONSTEXPR Epick_d_help2(int d):CGAL_BASE(d){}
+};
+#undef CGAL_BASE
+#define CGAL_BASE \
+ Kernel_d_interface< \
+ Cartesian_wrap< \
+ Epick_d_help2<Dim>, \
+ Epick_d<Dim> > >
+template<class Dim>
+struct Epick_d
+: CGAL_BASE
+{
+ CGAL_CONSTEXPR Epick_d(){}
+ CGAL_CONSTEXPR Epick_d(int d):CGAL_BASE(d){}
+};
+#undef CGAL_BASE
+}
+#endif
diff --git a/include/gudhi_patches/CGAL/IO/Triangulation_off_ostream.h b/include/gudhi_patches/CGAL/IO/Triangulation_off_ostream.h
new file mode 100644
index 00000000..701f0820
--- /dev/null
+++ b/include/gudhi_patches/CGAL/IO/Triangulation_off_ostream.h
@@ -0,0 +1,320 @@
+// Copyright (c) 2014 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL: $
+// $Id: $
+//
+// Author(s) : Clement Jamin
+
+
+#ifndef CGAL_TRIANGULATION_IO_H
+#define CGAL_TRIANGULATION_IO_H
+
+#include <CGAL/Epick_d.h>
+#include <CGAL/Triangulation.h>
+#include <sstream>
+#include <iostream>
+
+namespace CGAL {
+
+namespace Triangulation_IO
+{
+// TODO: test if the stream is binary or text?
+template<typename Traits, typename P>
+int
+output_point(std::ostream & os, const Traits &traits, const P & p)
+{
+ typedef typename Traits::Compute_coordinate_d Ccd;
+ const Ccd ccd = traits.compute_coordinate_d_object();
+ const int dim = traits.point_dimension_d_object()(p);
+ if (dim > 0)
+ {
+ os << ccd(p, 0);
+ for (int i = 1 ; i < dim ; ++i)
+ os << " " << CGAL::to_double(ccd(p, i));
+ }
+ return dim;
+}
+
+// TODO: test if the stream is binary or text?
+template<typename Traits, typename P>
+int
+output_weighted_point(std::ostream & os, const Traits &traits, const P & p,
+ bool output_weight = true)
+{
+ typedef typename Traits::Compute_coordinate_d Ccd;
+ typename Traits::Construct_point_d cp =
+ traits.construct_point_d_object();
+ typename Traits::Compute_weight_d pt_weight = traits.compute_weight_d_object();
+ const Ccd ccd = traits.compute_coordinate_d_object();
+ const int dim = traits.point_dimension_d_object()(p);
+ if (dim > 0)
+ {
+ output_point(os, traits, p);
+ if (output_weight)
+ os << " " << pt_weight(p);
+ }
+ return dim;
+}
+
+// TODO: test if the stream is binary or text?
+template<typename Traits, typename FCH>
+void
+output_full_cell(std::ostream & os, const Traits &traits, const FCH & fch,
+ bool output_weights = false)
+{
+ typename FCH::value_type::Vertex_handle_iterator vit = fch->vertices_begin();
+ for( ; vit != fch->vertices_end(); ++vit )
+ {
+ int dim;
+ if (output_weights)
+ dim = output_weighted_point(os, traits, (*vit)->point());
+ else
+ dim = output_point(os, traits, (*vit)->point());
+ if (dim > 0)
+ os << std::endl;
+ }
+}
+
+// TODO: test if the stream is binary or text?
+/*template<typename Traits, typename P>
+void
+input_point(std::istream & is, const Traits &traits, P & p)
+{
+ typedef typename Traits::FT FT;
+ std::vector<FT> coords;
+
+ std::string line;
+ for(;;)
+ {
+ if (!std::getline(is, line))
+ return is;
+ if (line != "")
+ break;
+ }
+ std::stringstream line_sstr(line);
+ FT temp;
+ while (line_sstr >> temp)
+ coords.push_back(temp);
+
+ p = traits.construct_point_d_object()(coords.begin(), coords.end());
+}*/
+
+} // namespace Triangulation_IO
+
+///////////////////////////////////////////////////////////////
+// TODO: replace these operator>> by an "input_point" function
+///////////////////////////////////////////////////////////////
+
+// TODO: test if the stream is binary or text?
+template<typename K>
+std::istream &
+operator>>(std::istream &is, typename Wrap::Point_d<K> & p)
+{
+ typedef typename Wrap::Point_d<K> P;
+ typedef typename K::FT FT;
+ std::vector<FT> coords;
+
+ std::string line;
+ for(;;)
+ {
+ if (!std::getline(is, line))
+ return is;
+ if (line != "")
+ break;
+ }
+ std::stringstream line_sstr(line);
+ FT temp;
+ while (line_sstr >> temp)
+ coords.push_back(temp);
+
+ p = P(coords.begin(), coords.end());
+ return is;
+}
+
+// TODO: test if the stream is binary or text?
+template<typename K>
+std::istream &
+operator>>(std::istream &is, typename Wrap::Weighted_point_d<K> & wp)
+{
+ typedef typename Wrap::Point_d<K> P;
+ typedef typename Wrap::Weighted_point_d<K> WP;
+ typedef typename K::FT FT;
+
+ std::string line;
+ for(;;)
+ {
+ if (!std::getline(is, line))
+ return is;
+ if (line != "")
+ break;
+ }
+ std::stringstream line_sstr(line);
+ FT temp;
+ std::vector<FT> coords;
+ while (line_sstr >> temp)
+ coords.push_back(temp);
+
+ typename std::vector<FT>::iterator last = coords.end() - 1;
+ P p = P(coords.begin(), last);
+ wp = WP(p, *last);
+
+ return is;
+}
+
+// TODO: test if the stream is binary or text?
+template<typename K>
+std::istream &
+operator>>(std::istream &is, typename Wrap::Vector_d<K> & v)
+{
+ typedef typename Wrap::Vector_d<K> V;
+ typedef typename K::FT FT;
+ std::vector<FT> coords;
+
+ std::string line;
+ for (;;)
+ {
+ if (!std::getline(is, line))
+ return is;
+ if (line != "")
+ break;
+ }
+ std::stringstream line_sstr(line);
+ FT temp;
+ while (line_sstr >> temp)
+ coords.push_back(temp);
+
+ v = V(coords.begin(), coords.end());
+ return is;
+}
+
+template < class GT, class TDS >
+std::ostream &
+export_triangulation_to_off(std::ostream & os,
+ const Triangulation<GT,TDS> & tr,
+ bool in_3D_export_surface_only = false)
+{
+ typedef Triangulation<GT,TDS> Tr;
+ typedef typename Tr::Vertex_const_handle Vertex_handle;
+ typedef typename Tr::Finite_vertex_const_iterator Finite_vertex_iterator;
+ typedef typename Tr::Finite_full_cell_const_iterator Finite_full_cell_iterator;
+ typedef typename Tr::Full_cell_const_iterator Full_cell_iterator;
+ typedef typename Tr::Full_cell Full_cell;
+ typedef typename Full_cell::Vertex_handle_const_iterator Full_cell_vertex_iterator;
+
+ if (tr.maximal_dimension() < 2 || tr.maximal_dimension() > 3)
+ {
+ std::cerr << "Warning: export_tds_to_off => dimension should be 2 or 3.";
+ os << "Warning: export_tds_to_off => dimension should be 2 or 3.";
+ return os;
+ }
+
+ size_t n = tr.number_of_vertices();
+
+ std::stringstream output;
+
+ // write the vertices
+ std::map<Vertex_handle, int> index_of_vertex;
+ int i = 0;
+ for(Finite_vertex_iterator it = tr.finite_vertices_begin();
+ it != tr.finite_vertices_end(); ++it, ++i)
+ {
+ Triangulation_IO::output_point(output, tr.geom_traits(), it->point());
+ if (tr.maximal_dimension() == 2)
+ output << " 0";
+ output << std::endl;
+ index_of_vertex[it.base()] = i;
+ }
+ CGAL_assertion( i == n );
+
+ size_t number_of_triangles = 0;
+ if (tr.maximal_dimension() == 2)
+ {
+ for (Finite_full_cell_iterator fch = tr.finite_full_cells_begin() ;
+ fch != tr.finite_full_cells_end() ; ++fch)
+ {
+ output << "3 ";
+ for (Full_cell_vertex_iterator vit = fch->vertices_begin() ;
+ vit != fch->vertices_end() ; ++vit)
+ {
+ output << index_of_vertex[*vit] << " ";
+ }
+ output << std::endl;
+ ++number_of_triangles;
+ }
+ }
+ else if (tr.maximal_dimension() == 3)
+ {
+ if (in_3D_export_surface_only)
+ {
+ // Parse boundary facets
+ for (Full_cell_iterator fch = tr.full_cells_begin() ;
+ fch != tr.full_cells_end() ; ++fch)
+ {
+ if (tr.is_infinite(fch))
+ {
+ output << "3 ";
+ for (Full_cell_vertex_iterator vit = fch->vertices_begin() ;
+ vit != fch->vertices_end() ; ++vit)
+ {
+ if (!tr.is_infinite(*vit))
+ output << index_of_vertex[*vit] << " ";
+ }
+ output << std::endl;
+ ++number_of_triangles;
+ }
+ }
+ }
+ else
+ {
+ // Parse finite cells
+ for (Finite_full_cell_iterator fch = tr.finite_full_cells_begin() ;
+ fch != tr.finite_full_cells_end() ; ++fch)
+ {
+ output << "3 "
+ << index_of_vertex[fch->vertex(0)] << " "
+ << index_of_vertex[fch->vertex(1)] << " "
+ << index_of_vertex[fch->vertex(2)]
+ << std::endl;
+ output << "3 "
+ << index_of_vertex[fch->vertex(0)] << " "
+ << index_of_vertex[fch->vertex(2)] << " "
+ << index_of_vertex[fch->vertex(3)]
+ << std::endl;
+ output << "3 "
+ << index_of_vertex[fch->vertex(1)] << " "
+ << index_of_vertex[fch->vertex(2)] << " "
+ << index_of_vertex[fch->vertex(3)]
+ << std::endl;
+ output << "3 "
+ << index_of_vertex[fch->vertex(0)] << " "
+ << index_of_vertex[fch->vertex(1)] << " "
+ << index_of_vertex[fch->vertex(3)]
+ << std::endl;
+ number_of_triangles += 4;
+ }
+ }
+ }
+
+ os << "OFF \n"
+ << n << " "
+ << number_of_triangles << " 0\n"
+ << output.str();
+
+ return os;
+}
+
+} //namespace CGAL
+
+#endif // CGAL_TRIANGULATION_IO_H
diff --git a/include/gudhi_patches/CGAL/Kd_tree.h b/include/gudhi_patches/CGAL/Kd_tree.h
new file mode 100644
index 00000000..f085b0da
--- /dev/null
+++ b/include/gudhi_patches/CGAL/Kd_tree.h
@@ -0,0 +1,582 @@
+// Copyright (c) 2002,2011,2014 Utrecht University (The Netherlands), Max-Planck-Institute Saarbruecken (Germany).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Hans Tangelder (<hanst@cs.uu.nl>),
+// : Waqar Khan <wkhan@mpi-inf.mpg.de>
+
+#ifndef CGAL_KD_TREE_H
+#define CGAL_KD_TREE_H
+
+#include "Kd_tree_node.h"
+
+#include <CGAL/basic.h>
+#include <CGAL/assertions.h>
+#include <vector>
+
+#include <CGAL/algorithm.h>
+#include <CGAL/internal/Get_dimension_tag.h>
+#include <CGAL/Search_traits.h>
+
+
+#include <deque>
+#include <boost/container/deque.hpp>
+#include <boost/optional.hpp>
+
+#ifdef CGAL_HAS_THREADS
+#include <CGAL/mutex.h>
+#endif
+
+namespace CGAL {
+
+//template <class SearchTraits, class Splitter_=Median_of_rectangle<SearchTraits>, class UseExtendedNode = Tag_true >
+template <class SearchTraits, class Splitter_=Sliding_midpoint<SearchTraits>, class UseExtendedNode = Tag_true >
+class Kd_tree {
+
+public:
+ typedef SearchTraits Traits;
+ typedef Splitter_ Splitter;
+ typedef typename SearchTraits::Point_d Point_d;
+ typedef typename Splitter::Container Point_container;
+
+ typedef typename SearchTraits::FT FT;
+ typedef Kd_tree_node<SearchTraits, Splitter, UseExtendedNode > Node;
+ typedef Kd_tree_leaf_node<SearchTraits, Splitter, UseExtendedNode > Leaf_node;
+ typedef Kd_tree_internal_node<SearchTraits, Splitter, UseExtendedNode > Internal_node;
+ typedef Kd_tree<SearchTraits, Splitter> Tree;
+ typedef Kd_tree<SearchTraits, Splitter,UseExtendedNode> Self;
+
+ typedef Node* Node_handle;
+ typedef const Node* Node_const_handle;
+ typedef Leaf_node* Leaf_node_handle;
+ typedef const Leaf_node* Leaf_node_const_handle;
+ typedef Internal_node* Internal_node_handle;
+ typedef const Internal_node* Internal_node_const_handle;
+ typedef typename std::vector<const Point_d*>::const_iterator Point_d_iterator;
+ typedef typename std::vector<const Point_d*>::const_iterator Point_d_const_iterator;
+ typedef typename Splitter::Separator Separator;
+ typedef typename std::vector<Point_d>::const_iterator iterator;
+ typedef typename std::vector<Point_d>::const_iterator const_iterator;
+
+ typedef typename std::vector<Point_d>::size_type size_type;
+
+ typedef typename internal::Get_dimension_tag<SearchTraits>::Dimension D;
+
+private:
+ SearchTraits traits_;
+ Splitter split;
+
+
+ // wokaround for https://svn.boost.org/trac/boost/ticket/9332
+#if (_MSC_VER == 1800) && (BOOST_VERSION == 105500)
+ std::deque<Internal_node> internal_nodes;
+ std::deque<Leaf_node> leaf_nodes;
+#else
+ boost::container::deque<Internal_node> internal_nodes;
+ boost::container::deque<Leaf_node> leaf_nodes;
+#endif
+
+ Node_handle tree_root;
+
+ Kd_tree_rectangle<FT,D>* bbox;
+ std::vector<Point_d> pts;
+
+ // Instead of storing the points in arrays in the Kd_tree_node
+ // we put all the data in a vector in the Kd_tree.
+ // and we only store an iterator range in the Kd_tree_node.
+ //
+ std::vector<const Point_d*> data;
+
+
+ #ifdef CGAL_HAS_THREADS
+ mutable CGAL_MUTEX building_mutex;//mutex used to protect const calls inducing build()
+ #endif
+ bool built_;
+ bool removed_;
+
+ // protected copy constructor
+ Kd_tree(const Tree& tree)
+ : traits_(tree.traits_),built_(tree.built_)
+ {};
+
+
+ // Instead of the recursive construction of the tree in the class Kd_tree_node
+ // we do this in the tree class. The advantage is that we then can optimize
+ // the allocation of the nodes.
+
+ // The leaf node
+ Node_handle
+ create_leaf_node(Point_container& c)
+ {
+ Leaf_node node(true , static_cast<unsigned int>(c.size()));
+ std::ptrdiff_t tmp = c.begin() - data.begin();
+ node.data = pts.begin() + tmp;
+
+ leaf_nodes.push_back(node);
+ Leaf_node_handle nh = &leaf_nodes.back();
+
+
+ return nh;
+ }
+
+
+ // The internal node
+
+ Node_handle
+ create_internal_node(Point_container& c, const Tag_true&)
+ {
+ return create_internal_node_use_extension(c);
+ }
+
+ Node_handle
+ create_internal_node(Point_container& c, const Tag_false&)
+ {
+ return create_internal_node(c);
+ }
+
+
+
+ // TODO: Similiar to the leaf_init function above, a part of the code should be
+ // moved to a the class Kd_tree_node.
+ // It is not proper yet, but the goal was to see if there is
+ // a potential performance gain through the Compact_container
+ Node_handle
+ create_internal_node_use_extension(Point_container& c)
+ {
+ Internal_node node(false);
+ internal_nodes.push_back(node);
+ Internal_node_handle nh = &internal_nodes.back();
+
+ Separator sep;
+ Point_container c_low(c.dimension(),traits_);
+ split(sep, c, c_low);
+ nh->set_separator(sep);
+
+ int cd = nh->cutting_dimension();
+ if(!c_low.empty()){
+ nh->lower_low_val = c_low.tight_bounding_box().min_coord(cd);
+ nh->lower_high_val = c_low.tight_bounding_box().max_coord(cd);
+ }
+ else{
+ nh->lower_low_val = nh->cutting_value();
+ nh->lower_high_val = nh->cutting_value();
+ }
+ if(!c.empty()){
+ nh->upper_low_val = c.tight_bounding_box().min_coord(cd);
+ nh->upper_high_val = c.tight_bounding_box().max_coord(cd);
+ }
+ else{
+ nh->upper_low_val = nh->cutting_value();
+ nh->upper_high_val = nh->cutting_value();
+ }
+
+ CGAL_assertion(nh->cutting_value() >= nh->lower_low_val);
+ CGAL_assertion(nh->cutting_value() <= nh->upper_high_val);
+
+ if (c_low.size() > split.bucket_size()){
+ nh->lower_ch = create_internal_node_use_extension(c_low);
+ }else{
+ nh->lower_ch = create_leaf_node(c_low);
+ }
+ if (c.size() > split.bucket_size()){
+ nh->upper_ch = create_internal_node_use_extension(c);
+ }else{
+ nh->upper_ch = create_leaf_node(c);
+ }
+
+
+
+
+ return nh;
+ }
+
+
+ // Note also that I duplicated the code to get rid if the if's for
+ // the boolean use_extension which was constant over the construction
+ Node_handle
+ create_internal_node(Point_container& c)
+ {
+ Internal_node node(false);
+ internal_nodes.push_back(node);
+ Internal_node_handle nh = &internal_nodes.back();
+ Separator sep;
+
+ Point_container c_low(c.dimension(),traits_);
+ split(sep, c, c_low);
+ nh->set_separator(sep);
+
+ if (c_low.size() > split.bucket_size()){
+ nh->lower_ch = create_internal_node(c_low);
+ }else{
+ nh->lower_ch = create_leaf_node(c_low);
+ }
+ if (c.size() > split.bucket_size()){
+ nh->upper_ch = create_internal_node(c);
+ }else{
+ nh->upper_ch = create_leaf_node(c);
+ }
+
+
+
+ return nh;
+ }
+
+
+
+public:
+
+ Kd_tree(Splitter s = Splitter(),const SearchTraits traits=SearchTraits())
+ : traits_(traits),split(s), built_(false), removed_(false)
+ {}
+
+ template <class InputIterator>
+ Kd_tree(InputIterator first, InputIterator beyond,
+ Splitter s = Splitter(),const SearchTraits traits=SearchTraits())
+ : traits_(traits),split(s), built_(false), removed_(false)
+ {
+ pts.insert(pts.end(), first, beyond);
+ }
+
+ bool empty() const {
+ return pts.empty();
+ }
+
+ void
+ build()
+ {
+ // This function is not ready to be called when a tree already exists, one
+ // must call invalidate_built() first.
+ CGAL_assertion(!is_built());
+ CGAL_assertion(!removed_);
+ const Point_d& p = *pts.begin();
+ typename SearchTraits::Construct_cartesian_const_iterator_d ccci=traits_.construct_cartesian_const_iterator_d_object();
+ int dim = static_cast<int>(std::distance(ccci(p), ccci(p,0)));
+
+ data.reserve(pts.size());
+ for(unsigned int i = 0; i < pts.size(); i++){
+ data.push_back(&pts[i]);
+ }
+ Point_container c(dim, data.begin(), data.end(),traits_);
+ bbox = new Kd_tree_rectangle<FT,D>(c.bounding_box());
+ if (c.size() <= split.bucket_size()){
+ tree_root = create_leaf_node(c);
+ }else {
+ tree_root = create_internal_node(c, UseExtendedNode());
+ }
+
+ //Reorder vector for spatial locality
+ std::vector<Point_d> ptstmp;
+ ptstmp.resize(pts.size());
+ for (std::size_t i = 0; i < pts.size(); ++i){
+ ptstmp[i] = *data[i];
+ }
+ for(std::size_t i = 0; i < leaf_nodes.size(); ++i){
+ std::ptrdiff_t tmp = leaf_nodes[i].begin() - pts.begin();
+ leaf_nodes[i].data = ptstmp.begin() + tmp;
+ }
+ pts.swap(ptstmp);
+
+ data.clear();
+
+ built_ = true;
+ }
+
+private:
+ //any call to this function is for the moment not threadsafe
+ void const_build() const {
+ #ifdef CGAL_HAS_THREADS
+ //this ensure that build() will be called once
+ CGAL_SCOPED_LOCK(building_mutex);
+ if(!is_built())
+ #endif
+ const_cast<Self*>(this)->build(); //THIS IS NOT THREADSAFE
+ }
+public:
+
+ bool is_built() const
+ {
+ return built_;
+ }
+
+ void invalidate_built()
+ {
+ if(removed_){
+ // Walk the tree to collect the remaining points.
+ // Writing directly to pts would likely work, but better be safe.
+ std::vector<Point_d> ptstmp;
+ //ptstmp.resize(root()->num_items());
+ root()->tree_items(std::back_inserter(ptstmp));
+ pts.swap(ptstmp);
+ removed_=false;
+ CGAL_assertion(is_built()); // the rest of the cleanup must happen
+ }
+ if(is_built()){
+ internal_nodes.clear();
+ leaf_nodes.clear();
+ data.clear();
+ delete bbox;
+ built_ = false;
+ }
+ }
+
+ void clear()
+ {
+ invalidate_built();
+ pts.clear();
+ removed_ = false;
+ }
+
+ void
+ insert(const Point_d& p)
+ {
+ invalidate_built();
+ pts.push_back(p);
+ }
+
+ template <class InputIterator>
+ void
+ insert(InputIterator first, InputIterator beyond)
+ {
+ invalidate_built();
+ pts.insert(pts.end(),first, beyond);
+ }
+
+private:
+ struct Equal_by_coordinates {
+ SearchTraits const* traits;
+ Point_d const* pp;
+ bool operator()(Point_d const&q) const {
+ typename SearchTraits::Construct_cartesian_const_iterator_d ccci=traits->construct_cartesian_const_iterator_d_object();
+ return std::equal(ccci(*pp), ccci(*pp,0), ccci(q));
+ }
+ };
+ Equal_by_coordinates equal_by_coordinates(Point_d const&p){
+ Equal_by_coordinates ret = { &traits(), &p };
+ return ret;
+ }
+
+public:
+ void
+ remove(const Point_d& p)
+ {
+ remove(p, equal_by_coordinates(p));
+ }
+
+ template<class Equal>
+ void
+ remove(const Point_d& p, Equal const& equal_to_p)
+ {
+#if 0
+ // This code could have quadratic runtime.
+ if (!is_built()) {
+ std::vector<Point_d>::iterator pi = std::find(pts.begin(), pts.end(), p);
+ // Precondition: the point must be there.
+ CGAL_assertion (pi != pts.end());
+ pts.erase(pi);
+ return;
+ }
+#endif
+ bool success = remove_(p, 0, false, 0, false, root(), equal_to_p);
+ CGAL_assertion(success);
+
+ // Do not set the flag is the tree has been cleared.
+ if(is_built())
+ removed_ |= success;
+ }
+private:
+ template<class Equal>
+ bool remove_(const Point_d& p,
+ Internal_node_handle grandparent, bool parent_islower,
+ Internal_node_handle parent, bool islower,
+ Node_handle node, Equal const& equal_to_p) {
+ // Recurse to locate the point
+ if (!node->is_leaf()) {
+ Internal_node_handle newparent = static_cast<Internal_node_handle>(node);
+ // FIXME: This should be if(x<y) remove low; else remove up;
+ if (traits().construct_cartesian_const_iterator_d_object()(p)[newparent->cutting_dimension()] <= newparent->cutting_value()) {
+ if (remove_(p, parent, islower, newparent, true, newparent->lower(), equal_to_p))
+ return true;
+ }
+ //if (traits().construct_cartesian_const_iterator_d_object()(p)[newparent->cutting_dimension()] >= newparent->cutting_value())
+ return remove_(p, parent, islower, newparent, false, newparent->upper(), equal_to_p);
+
+ CGAL_assertion(false); // Point was not found
+ }
+
+ // Actual removal
+ Leaf_node_handle lnode = static_cast<Leaf_node_handle>(node);
+ if (lnode->size() > 1) {
+ iterator pi = std::find_if(lnode->begin(), lnode->end(), equal_to_p);
+ // FIXME: we should ensure this never happens
+ if (pi == lnode->end()) return false;
+ iterator lasti = lnode->end() - 1;
+ if (pi != lasti) {
+ // Hack to get a non-const iterator
+ std::iter_swap(pts.begin()+(pi-pts.begin()), pts.begin()+(lasti-pts.begin()));
+ }
+ lnode->drop_last_point();
+ } else if (!equal_to_p(*lnode->begin())) {
+ // FIXME: we should ensure this never happens
+ return false;
+ } else if (grandparent) {
+ Node_handle brother = islower ? parent->upper() : parent->lower();
+ if (parent_islower)
+ grandparent->set_lower(brother);
+ else
+ grandparent->set_upper(brother);
+ } else if (parent) {
+ tree_root = islower ? parent->upper() : parent->lower();
+ } else {
+ clear();
+ }
+ return true;
+ }
+
+public:
+ //For efficiency; reserve the size of the points vectors in advance (if the number of points is already known).
+ void reserve(size_t size)
+ {
+ pts.reserve(size);
+ }
+
+ //Get the capacity of the underlying points vector.
+ size_t capacity()
+ {
+ return pts.capacity();
+ }
+
+
+ template <class OutputIterator, class FuzzyQueryItem>
+ OutputIterator
+ search(OutputIterator it, const FuzzyQueryItem& q) const
+ {
+ if(! pts.empty()){
+
+ if(! is_built()){
+ const_build();
+ }
+ Kd_tree_rectangle<FT,D> b(*bbox);
+ return tree_root->search(it,q,b);
+ }
+ return it;
+ }
+
+
+ template <class FuzzyQueryItem>
+ boost::optional<Point_d>
+ search_any_point(const FuzzyQueryItem& q) const
+ {
+ if(! pts.empty()){
+
+ if(! is_built()){
+ const_build();
+ }
+ Kd_tree_rectangle<FT,D> b(*bbox);
+ return tree_root->search_any_point(q,b);
+ }
+ return boost::none;
+ }
+
+
+ ~Kd_tree() {
+ if(is_built()){
+ delete bbox;
+ }
+ }
+
+
+ const SearchTraits&
+ traits() const
+ {
+ return traits_;
+ }
+
+ Node_const_handle
+ root() const
+ {
+ if(! is_built()){
+ const_build();
+ }
+ return tree_root;
+ }
+
+ Node_handle
+ root()
+ {
+ if(! is_built()){
+ build();
+ }
+ return tree_root;
+ }
+
+ void
+ print() const
+ {
+ if(! is_built()){
+ const_build();
+ }
+ root()->print();
+ }
+
+ const Kd_tree_rectangle<FT,D>&
+ bounding_box() const
+ {
+ if(! is_built()){
+ const_build();
+ }
+ return *bbox;
+ }
+
+ const_iterator
+ begin() const
+ {
+ return pts.begin();
+ }
+
+ const_iterator
+ end() const
+ {
+ return pts.end();
+ }
+
+ size_type
+ size() const
+ {
+ return pts.size();
+ }
+
+ // Print statistics of the tree.
+ std::ostream&
+ statistics(std::ostream& s) const
+ {
+ if(! is_built()){
+ const_build();
+ }
+ s << "Tree statistics:" << std::endl;
+ s << "Number of items stored: "
+ << root()->num_items() << std::endl;
+ s << "Number of nodes: "
+ << root()->num_nodes() << std::endl;
+ s << " Tree depth: " << root()->depth() << std::endl;
+ return s;
+ }
+
+
+};
+
+} // namespace CGAL
+
+#endif // CGAL_KD_TREE_H
diff --git a/include/gudhi_patches/CGAL/Kd_tree_node.h b/include/gudhi_patches/CGAL/Kd_tree_node.h
new file mode 100644
index 00000000..909ee260
--- /dev/null
+++ b/include/gudhi_patches/CGAL/Kd_tree_node.h
@@ -0,0 +1,586 @@
+// Copyright (c) 2002,2011 Utrecht University (The Netherlands).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+//
+// Authors : Hans Tangelder (<hanst@cs.uu.nl>)
+
+#ifndef CGAL_KD_TREE_NODE_H
+#define CGAL_KD_TREE_NODE_H
+
+#include "CGAL/Splitters.h"
+
+#include <CGAL/Compact_container.h>
+#include <boost/cstdint.hpp>
+
+namespace CGAL {
+
+ template <class SearchTraits, class Splitter, class UseExtendedNode>
+ class Kd_tree;
+
+ template < class TreeTraits, class Splitter, class UseExtendedNode >
+ class Kd_tree_node {
+
+ friend class Kd_tree<TreeTraits,Splitter,UseExtendedNode>;
+
+ typedef typename Kd_tree<TreeTraits,Splitter,UseExtendedNode>::Node_handle Node_handle;
+ typedef typename Kd_tree<TreeTraits,Splitter,UseExtendedNode>::Node_const_handle Node_const_handle;
+ typedef typename Kd_tree<TreeTraits,Splitter,UseExtendedNode>::Internal_node_handle Internal_node_handle;
+ typedef typename Kd_tree<TreeTraits,Splitter,UseExtendedNode>::Internal_node_const_handle Internal_node_const_handle;
+ typedef typename Kd_tree<TreeTraits,Splitter,UseExtendedNode>::Leaf_node_handle Leaf_node_handle;
+ typedef typename Kd_tree<TreeTraits,Splitter,UseExtendedNode>::Leaf_node_const_handle Leaf_node_const_handle;
+ typedef typename TreeTraits::Point_d Point_d;
+
+ typedef typename TreeTraits::FT FT;
+ typedef typename Kd_tree<TreeTraits,Splitter,UseExtendedNode>::Separator Separator;
+ typedef typename Kd_tree<TreeTraits,Splitter,UseExtendedNode>::Point_d_iterator Point_d_iterator;
+ typedef typename Kd_tree<TreeTraits,Splitter,UseExtendedNode>::iterator iterator;
+ typedef typename Kd_tree<TreeTraits,Splitter,UseExtendedNode>::D D;
+
+ bool leaf;
+
+ public :
+ Kd_tree_node(bool leaf_)
+ :leaf(leaf_){}
+
+ bool is_leaf() const{
+ return leaf;
+ }
+
+ std::size_t
+ num_items() const
+ {
+ if (is_leaf()){
+ Leaf_node_const_handle node =
+ static_cast<Leaf_node_const_handle>(this);
+ return node->size();
+ }
+ else {
+ Internal_node_const_handle node =
+ static_cast<Internal_node_const_handle>(this);
+ return node->lower()->num_items() + node->upper()->num_items();
+ }
+ }
+
+ std::size_t
+ num_nodes() const
+ {
+ if (is_leaf()) return 1;
+ else {
+ Internal_node_const_handle node =
+ static_cast<Internal_node_const_handle>(this);
+ return node->lower()->num_nodes() + node->upper()->num_nodes();
+ }
+ }
+
+ int
+ depth(const int current_max_depth) const
+ {
+ if (is_leaf()){
+ return current_max_depth;
+ }
+ else {
+ Internal_node_const_handle node =
+ static_cast<Internal_node_const_handle>(this);
+ return
+ (std::max)( node->lower()->depth(current_max_depth + 1),
+ node->upper()->depth(current_max_depth + 1));
+ }
+ }
+
+ int
+ depth() const
+ {
+ return depth(1);
+ }
+
+ template <class OutputIterator>
+ OutputIterator
+ tree_items(OutputIterator it) const {
+ if (is_leaf()) {
+ Leaf_node_const_handle node =
+ static_cast<Leaf_node_const_handle>(this);
+ if (node->size()>0)
+ for (iterator i=node->begin(); i != node->end(); i++)
+ {*it=*i; ++it;}
+ }
+ else {
+ Internal_node_const_handle node =
+ static_cast<Internal_node_const_handle>(this);
+ it=node->lower()->tree_items(it);
+ it=node->upper()->tree_items(it);
+ }
+ return it;
+ }
+
+
+ boost::optional<Point_d>
+ any_tree_item() const {
+ boost::optional<Point_d> result = boost::none;
+ if (is_leaf()) {
+ Leaf_node_const_handle node =
+ static_cast<Leaf_node_const_handle>(this);
+ if (node->size()>0){
+ return boost::make_optional(*(node->begin()));
+ }
+ }
+ else {
+ Internal_node_const_handle node =
+ static_cast<Internal_node_const_handle>(this);
+ result = node->lower()->any_tree_item();
+ if(! result){
+ result = node->upper()->any_tree_item();
+ }
+ }
+ return result;
+ }
+
+
+ void
+ indent(int d) const
+ {
+ for(int i = 0; i < d; i++){
+ std::cout << " ";
+ }
+ }
+
+
+ void
+ print(int d = 0) const
+ {
+ if (is_leaf()) {
+ Leaf_node_const_handle node =
+ static_cast<Leaf_node_const_handle>(this);
+ indent(d);
+ std::cout << "leaf" << std::endl;
+ if (node->size()>0)
+ for (iterator i=node->begin(); i != node->end(); i++)
+ {indent(d);std::cout << *i << std::endl;}
+ }
+ else {
+ Internal_node_const_handle node =
+ static_cast<Internal_node_const_handle>(this);
+ indent(d);
+ std::cout << "lower tree" << std::endl;
+ node->lower()->print(d+1);
+ indent(d);
+ std::cout << "separator: dim = " << node->cutting_dimension() << " val = " << node->cutting_value() << std::endl;
+ indent(d);
+ std::cout << "upper tree" << std::endl;
+ node->upper()->print(d+1);
+ }
+ }
+
+
+ template <class OutputIterator, class FuzzyQueryItem>
+ OutputIterator
+ search(OutputIterator it, const FuzzyQueryItem& q,
+ Kd_tree_rectangle<FT,D>& b) const
+ {
+ if (is_leaf()) {
+ Leaf_node_const_handle node =
+ static_cast<Leaf_node_const_handle>(this);
+ if (node->size()>0)
+ for (iterator i=node->begin(); i != node->end(); i++)
+ if (q.contains(*i))
+ {*it++=*i;}
+ }
+ else {
+ Internal_node_const_handle node =
+ static_cast<Internal_node_const_handle>(this);
+ // after splitting b denotes the lower part of b
+ Kd_tree_rectangle<FT,D> b_upper(b);
+ b.split(b_upper, node->cutting_dimension(),
+ node->cutting_value());
+
+ if (q.outer_range_contains(b))
+ it=node->lower()->tree_items(it);
+ else
+ if (q.inner_range_intersects(b))
+ it=node->lower()->search(it,q,b);
+ if (q.outer_range_contains(b_upper))
+ it=node->upper()->tree_items(it);
+ else
+ if (q.inner_range_intersects(b_upper))
+ it=node->upper()->search(it,q,b_upper);
+ };
+ return it;
+ }
+
+
+ template <class FuzzyQueryItem>
+ boost::optional<Point_d>
+ search_any_point(const FuzzyQueryItem& q,
+ Kd_tree_rectangle<FT,D>& b) const
+ {
+ boost::optional<Point_d> result = boost::none;
+ if (is_leaf()) {
+ Leaf_node_const_handle node =
+ static_cast<Leaf_node_const_handle>(this);
+ if (node->size()>0)
+ for (iterator i=node->begin(); i != node->end(); i++)
+ if (q.contains(*i))
+ { result = *i; break; }
+ }
+ else {
+ Internal_node_const_handle node =
+ static_cast<Internal_node_const_handle>(this);
+ // after splitting b denotes the lower part of b
+ Kd_tree_rectangle<FT,D> b_upper(b);
+ b.split(b_upper, node->cutting_dimension(),
+ node->cutting_value());
+
+ if (q.outer_range_contains(b)){
+ result = node->lower()->any_tree_item();
+ }else{
+ if (q.inner_range_intersects(b)){
+ result = node->lower()->search_any_point(q,b);
+ }
+ }
+ if(result){
+ return result;
+ }
+ if (q.outer_range_contains(b_upper)){
+ result = node->upper()->any_tree_item();
+ }else{
+ if (q.inner_range_intersects(b_upper))
+ result = node->upper()->search_any_point(q,b_upper);
+ }
+ }
+ return result;
+ }
+
+ };
+
+
+ template < class TreeTraits, class Splitter, class UseExtendedNode >
+ class Kd_tree_leaf_node : public Kd_tree_node< TreeTraits, Splitter, UseExtendedNode >{
+
+ friend class Kd_tree<TreeTraits,Splitter,UseExtendedNode>;
+
+ typedef typename Kd_tree<TreeTraits,Splitter,UseExtendedNode>::iterator iterator;
+ typedef Kd_tree_node< TreeTraits, Splitter, UseExtendedNode> Base;
+ typedef typename TreeTraits::Point_d Point_d;
+
+ private:
+
+ // private variables for leaf nodes
+ boost::int32_t n; // denotes number of items in a leaf node
+ iterator data; // iterator to data in leaf node
+
+
+ public:
+
+ // default constructor
+ Kd_tree_leaf_node()
+ {}
+
+ Kd_tree_leaf_node(bool leaf_ )
+ : Base(leaf_)
+ {}
+
+ Kd_tree_leaf_node(bool leaf_,unsigned int n_ )
+ : Base(leaf_), n(n_)
+ {}
+
+ // members for all nodes
+
+ // members for leaf nodes only
+ inline
+ unsigned int
+ size() const
+ {
+ return n;
+ }
+
+ inline
+ iterator
+ begin() const
+ {
+ return data;
+ }
+
+ inline
+ iterator
+ end() const
+ {
+ return data + n;
+ }
+
+ inline
+ void
+ drop_last_point()
+ {
+ --n;
+ }
+
+ }; //leaf node
+
+
+
+ template < class TreeTraits, class Splitter, class UseExtendedNode>
+ class Kd_tree_internal_node : public Kd_tree_node< TreeTraits, Splitter, UseExtendedNode >{
+
+ friend class Kd_tree<TreeTraits,Splitter,UseExtendedNode>;
+
+ typedef Kd_tree_node< TreeTraits, Splitter, UseExtendedNode> Base;
+ typedef typename Kd_tree<TreeTraits,Splitter,UseExtendedNode>::Node_handle Node_handle;
+ typedef typename Kd_tree<TreeTraits,Splitter,UseExtendedNode>::Node_const_handle Node_const_handle;
+
+ typedef typename TreeTraits::FT FT;
+ typedef typename Kd_tree<TreeTraits,Splitter,UseExtendedNode>::Separator Separator;
+
+ private:
+
+ // private variables for internal nodes
+ boost::int32_t cut_dim;
+ FT cut_val;
+ Node_handle lower_ch, upper_ch;
+
+
+ // private variables for extended internal nodes
+ FT upper_low_val;
+ FT upper_high_val;
+ FT lower_low_val;
+ FT lower_high_val;
+
+
+ public:
+
+ // default constructor
+ Kd_tree_internal_node()
+ {}
+
+ Kd_tree_internal_node(bool leaf_)
+ : Base(leaf_)
+ {}
+
+
+ // members for internal node and extended internal node
+
+ inline
+ Node_const_handle
+ lower() const
+ {
+ return lower_ch;
+ }
+
+ inline
+ Node_const_handle
+ upper() const
+ {
+ return upper_ch;
+ }
+
+ inline
+ Node_handle
+ lower()
+ {
+ return lower_ch;
+ }
+
+ inline
+ Node_handle
+ upper()
+ {
+ return upper_ch;
+ }
+
+ inline
+ void
+ set_lower(Node_handle nh)
+ {
+ lower_ch = nh;
+ }
+
+ inline
+ void
+ set_upper(Node_handle nh)
+ {
+ upper_ch = nh;
+ }
+
+ // inline Separator& separator() {return sep; }
+ // use instead
+ inline
+ void set_separator(Separator& sep){
+ cut_dim = sep.cutting_dimension();
+ cut_val = sep.cutting_value();
+ }
+
+ inline
+ FT
+ cutting_value() const
+ {
+ return cut_val;
+ }
+
+ inline
+ int
+ cutting_dimension() const
+ {
+ return cut_dim;
+ }
+
+ // members for extended internal node only
+ inline
+ FT
+ upper_low_value() const
+ {
+ return upper_low_val;
+ }
+
+ inline
+ FT
+ upper_high_value() const
+ {
+ return upper_high_val;
+ }
+
+ inline
+ FT
+ lower_low_value() const
+ {
+ return lower_low_val;
+ }
+
+ inline
+ FT
+ lower_high_value() const
+ {
+ return lower_high_val;
+ }
+
+ /*Separator&
+ separator()
+ {
+ return Separator(cutting_dimension,cutting_value);
+ }*/
+
+
+ };//internal node
+
+ template < class TreeTraits, class Splitter>
+ class Kd_tree_internal_node<TreeTraits,Splitter,Tag_false> : public Kd_tree_node< TreeTraits, Splitter, Tag_false >{
+
+ friend class Kd_tree<TreeTraits,Splitter,Tag_false>;
+
+ typedef Kd_tree_node< TreeTraits, Splitter, Tag_false> Base;
+ typedef typename Kd_tree<TreeTraits,Splitter,Tag_false>::Node_handle Node_handle;
+ typedef typename Kd_tree<TreeTraits,Splitter,Tag_false>::Node_const_handle Node_const_handle;
+
+ typedef typename TreeTraits::FT FT;
+ typedef typename Kd_tree<TreeTraits,Splitter,Tag_false>::Separator Separator;
+
+ private:
+
+ // private variables for internal nodes
+ boost::uint8_t cut_dim;
+ FT cut_val;
+
+ Node_handle lower_ch, upper_ch;
+
+ public:
+
+ // default constructor
+ Kd_tree_internal_node()
+ {}
+
+ Kd_tree_internal_node(bool leaf_)
+ : Base(leaf_)
+ {}
+
+
+ // members for internal node and extended internal node
+
+ inline
+ Node_const_handle
+ lower() const
+ {
+ return lower_ch;
+ }
+
+ inline
+ Node_const_handle
+ upper() const
+ {
+ return upper_ch;
+ }
+
+ inline
+ Node_handle
+ lower()
+ {
+ return lower_ch;
+ }
+
+ inline
+ Node_handle
+ upper()
+ {
+ return upper_ch;
+ }
+
+ inline
+ void
+ set_lower(Node_handle nh)
+ {
+ lower_ch = nh;
+ }
+
+ inline
+ void
+ set_upper(Node_handle nh)
+ {
+ upper_ch = nh;
+ }
+
+ // inline Separator& separator() {return sep; }
+ // use instead
+
+ inline
+ void set_separator(Separator& sep){
+ cut_dim = sep.cutting_dimension();
+ cut_val = sep.cutting_value();
+ }
+
+ inline
+ FT
+ cutting_value() const
+ {
+ return cut_val;
+ }
+
+ inline
+ int
+ cutting_dimension() const
+ {
+ return cut_dim;
+ }
+
+ /* Separator&
+ separator()
+ {
+ return Separator(cutting_dimension,cutting_value);
+ }*/
+
+
+ };//internal node
+
+
+
+} // namespace CGAL
+#endif // CGAL_KDTREE_NODE_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_LA_base.h b/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_LA_base.h
new file mode 100644
index 00000000..c13a9801
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_LA_base.h
@@ -0,0 +1,177 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KERNEL_D_CARTESIAN_LA_BASE_H
+#define CGAL_KERNEL_D_CARTESIAN_LA_BASE_H
+
+#include <CGAL/basic.h>
+#include <CGAL/Origin.h>
+#include <boost/type_traits/integral_constant.hpp>
+#include <CGAL/representation_tags.h>
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/Uncertain.h>
+#include <CGAL/typeset.h>
+#include <CGAL/NewKernel_d/Dimension_base.h>
+#include <CGAL/NewKernel_d/Cartesian_LA_functors.h>
+#include <CGAL/NewKernel_d/Vector/array.h>
+#include <CGAL/NewKernel_d/Vector/vector.h>
+#include <CGAL/NewKernel_d/Vector/mix.h>
+#ifdef CGAL_EIGEN3_ENABLED
+#include <CGAL/NewKernel_d/LA_eigen/LA.h>
+#else
+#error Eigen3 is required
+#endif
+
+namespace CGAL {
+
+template < typename FT_, typename Dim_,
+#if 1
+ typename Vec_=Mix_vector<Array_vector<FT_, Dim_>,
+ Vector_vector<FT_, Dim_>,
+ FT_, Dim_>,
+#elif 0
+ typename Vec_=Array_vector<FT_, Dim_>,
+#elif 0
+ typename Vec_=Vector_vector<FT_, Dim_>,
+#else
+ // Dangerous because of alignment. Ok on x86_64 without AVX.
+ typename Vec_=LA_eigen<FT_, Dim_>,
+#endif
+ typename LA_=LA_eigen<FT_,Dim_> >
+ /* Default LA to Vec or to LA_eigen? */
+struct Cartesian_LA_base_d : public Dimension_base<Dim_>
+{
+ typedef Cartesian_LA_base_d<FT_,Dim_> Self;
+ typedef Cartesian_tag Rep_tag;
+ typedef Cartesian_tag Kernel_tag;
+ typedef Dim_ Default_ambient_dimension;
+ typedef Dim_ Max_ambient_dimension;
+ typedef Dim_ Dimension;
+ typedef LA_ LA;
+ template <class> struct Ambient_dimension { typedef Dim_ type; };
+
+ typedef Vec_ LA_vector;
+ typedef typename LA_vector::Vector Point;
+ typedef typename LA_vector::Vector Vector;
+ typedef typename LA_vector::Vector Vector_;
+ typedef typename LA_vector::Construct_vector Constructor;
+ typedef typename LA_vector::Vector_const_iterator Point_cartesian_const_iterator;
+ typedef typename LA_vector::Vector_const_iterator Vector_cartesian_const_iterator;
+
+ template<class, class=void> struct Type {};
+ template<class D> struct Type< Point_tag, D> { typedef Vector_ type; };
+ template<class D> struct Type<Vector_tag, D> { typedef Vector_ type; };
+ template<class D> struct Type< FT_tag, D> { typedef FT_ type; };
+ template<class D> struct Type< RT_tag, D> { typedef FT_ type; };
+
+ typedef typeset<Point_tag>
+ ::add<Vector_tag>::type
+ // FIXME: These have nothing to do here.
+ ::add<Segment_tag>::type
+ ::add<Hyperplane_tag>::type
+ ::add<Sphere_tag>::type
+ ::add<Weighted_point_tag>::type
+ Object_list;
+
+ typedef typeset< Point_cartesian_const_iterator_tag>::type
+ ::add<Vector_cartesian_const_iterator_tag>::type
+ Iterator_list;
+
+ template<class, class=void, class=boost::integral_constant<int,0> > struct Functor {
+ typedef Null_functor type;
+ };
+ template<class D> struct Functor<Construct_ttag<Vector_tag>,D> {
+ typedef CartesianDVectorBase::Construct_LA_vector<Self,Null_vector> type;
+ };
+ template<class D> struct Functor<Construct_ttag<Point_tag>,D> {
+ typedef CartesianDVectorBase::Construct_LA_vector<Self,Origin> type;
+ };
+ template<class D> struct Functor<Construct_ttag<Point_cartesian_const_iterator_tag>,D> {
+ typedef CartesianDVectorBase::Construct_cartesian_const_iterator<Self> type;
+ };
+ template<class D> struct Functor<Construct_ttag<Vector_cartesian_const_iterator_tag>,D> {
+ typedef CartesianDVectorBase::Construct_cartesian_const_iterator<Self> type;
+ };
+ template<class D> struct Functor<Sum_of_vectors_tag,D,
+ boost::integral_constant<int,!LA_vector::template Property<Has_vector_plus_minus_tag>::value> > {
+ typedef CartesianDVectorBase::Sum_of_vectors<Self> type;
+ };
+ template<class D> struct Functor<Difference_of_vectors_tag,D,
+ boost::integral_constant<int,!LA_vector::template Property<Has_vector_plus_minus_tag>::value> > {
+ typedef CartesianDVectorBase::Difference_of_vectors<Self> type;
+ };
+ template<class D> struct Functor<Opposite_vector_tag,D,
+ boost::integral_constant<int,!LA_vector::template Property<Has_vector_plus_minus_tag>::value> > {
+ typedef CartesianDVectorBase::Opposite_vector<Self> type;
+ };
+ template<class D> struct Functor<Midpoint_tag,D,
+ boost::integral_constant<int,
+ !LA_vector::template Property<Has_vector_plus_minus_tag>::value
+ || !LA_vector::template Property<Has_vector_scalar_ops_tag>::value> > {
+ typedef CartesianDVectorBase::Midpoint<Self> type;
+ };
+ template<class D> struct Functor<Compute_point_cartesian_coordinate_tag,D> {
+ typedef CartesianDVectorBase::Compute_cartesian_coordinate<Self> type;
+ };
+ template<class D> struct Functor<Compute_vector_cartesian_coordinate_tag,D> {
+ typedef CartesianDVectorBase::Compute_cartesian_coordinate<Self> type;
+ };
+ template<class D> struct Functor<Point_dimension_tag,D> {
+ typedef CartesianDVectorBase::PV_dimension<Self> type;
+ };
+ template<class D> struct Functor<Vector_dimension_tag,D> {
+ typedef CartesianDVectorBase::PV_dimension<Self> type;
+ };
+ template<class D> struct Functor<Orientation_of_vectors_tag,D,
+ boost::integral_constant<int,!LA_vector::template Property<Has_determinant_of_iterator_to_vectors_tag>::value> > {
+ typedef CartesianDVectorBase::Orientation_of_vectors<Self> type;
+ };
+ template<class D> struct Functor<Orientation_of_points_tag,D,
+ boost::integral_constant<int,!LA_vector::template Property<Has_determinant_of_iterator_to_points_tag>::value> > {
+ typedef CartesianDVectorBase::Orientation_of_points<Self> type;
+ };
+ template<class D> struct Functor<Scalar_product_tag,D,
+ boost::integral_constant<int,!LA_vector::template Property<Has_dot_product_tag>::value> > {
+ typedef CartesianDVectorBase::Scalar_product<Self> type;
+ };
+ template<class D> struct Functor<Squared_distance_to_origin_tag,D,
+ boost::integral_constant<int,!LA_vector::template Property<Stores_squared_norm_tag>::value> > {
+ typedef CartesianDVectorBase::Squared_distance_to_origin_stored<Self> type;
+ };
+ // Use integral_constant<int,2> in case of failure, to distinguish from the previous one.
+ template<class D> struct Functor<Squared_distance_to_origin_tag,D,
+ boost::integral_constant<int,
+ (LA_vector::template Property<Stores_squared_norm_tag>::value
+ || !LA_vector::template Property<Has_dot_product_tag>::value)*2> > {
+ typedef CartesianDVectorBase::Squared_distance_to_origin_via_dotprod<Self> type;
+ };
+ template<class D> struct Functor<Point_to_vector_tag,D> {
+ typedef CartesianDVectorBase::Identity_functor<Self> type;
+ };
+ template<class D> struct Functor<Vector_to_point_tag,D> {
+ typedef CartesianDVectorBase::Identity_functor<Self> type;
+ };
+
+ CGAL_CONSTEXPR Cartesian_LA_base_d(){}
+ CGAL_CONSTEXPR Cartesian_LA_base_d(int d):Dimension_base<Dim_>(d){}
+};
+
+} //namespace CGAL
+
+#endif // CGAL_KERNEL_D_CARTESIAN_LA_BASE_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_LA_functors.h b/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_LA_functors.h
new file mode 100644
index 00000000..871c463a
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_LA_functors.h
@@ -0,0 +1,344 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_CARTESIAN_LA_FUNCTORS_H
+#define CGAL_CARTESIAN_LA_FUNCTORS_H
+
+#include <CGAL/NewKernel_d/utils.h>
+#include <CGAL/is_iterator.h>
+#include <CGAL/argument_swaps.h>
+#include <CGAL/Kernel/Return_base_tag.h>
+#include <CGAL/transforming_iterator.h>
+#include <CGAL/NewKernel_d/store_kernel.h>
+#include <CGAL/Dimension.h>
+
+namespace CGAL {
+namespace CartesianDVectorBase {
+#ifndef CGAL_CXX11
+namespace internal {
+template<class R_,class Dim_> struct Construct_LA_vector_ {
+ struct Never_use {};
+ void operator()(Never_use)const;
+};
+#define CGAL_CODE(Z,N,_) template<class R> struct Construct_LA_vector_<R,Dimension_tag<N> > { \
+ typedef typename R::Constructor Constructor; \
+ typedef typename Get_type<R, RT_tag>::type RT; \
+ typedef typename R::Vector_ result_type; \
+ result_type operator() \
+ (BOOST_PP_ENUM_PARAMS(N,RT const& t)) const { \
+ return typename Constructor::Values()(BOOST_PP_ENUM_PARAMS(N,t)); \
+ } \
+ result_type operator() \
+ (BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(N),RT const& t)) const { \
+ return typename Constructor::Values_divide()(t##N,BOOST_PP_ENUM_PARAMS(N,t)); \
+ } \
+ };
+BOOST_PP_REPEAT_FROM_TO(2, 11, CGAL_CODE, _ )
+#undef CGAL_CODE
+}
+#endif
+
+template<class R_,class Zero_> struct Construct_LA_vector
+: private Store_kernel<R_>
+#ifndef CGAL_CXX11
+, public internal::Construct_LA_vector_<R_,typename R_::Default_ambient_dimension>
+#endif
+{
+ //CGAL_FUNCTOR_INIT_IGNORE(Construct_LA_vector)
+ CGAL_FUNCTOR_INIT_STORE(Construct_LA_vector)
+ typedef R_ R;
+ typedef typename R::Constructor Constructor;
+ typedef typename Get_type<R, RT_tag>::type RT;
+ typedef typename Get_type<R, FT_tag>::type FT;
+ typedef typename R::Vector_ result_type;
+ typedef typename R_::Default_ambient_dimension Dimension;
+ result_type operator()(int d)const{
+ CGAL_assertion(check_dimension_eq(d,this->kernel().dimension()));
+ return typename Constructor::Dimension()(d);
+ }
+ result_type operator()()const{
+ return typename Constructor::Dimension()((std::max)(0,this->kernel().dimension()));
+ }
+ result_type operator()(int d, Zero_ const&)const{
+ CGAL_assertion(check_dimension_eq(d,this->kernel().dimension()));
+ return typename Constructor::Dimension()(d);
+ }
+ result_type operator()(Zero_ const&)const{
+ // Makes no sense for an unknown dimension.
+ return typename Constructor::Dimension()(this->kernel().dimension());
+ }
+ result_type operator()(result_type const& v)const{
+ return v;
+ }
+#ifdef CGAL_CXX11
+ result_type operator()(result_type&& v)const{
+ return std::move(v);
+ }
+#endif
+#ifdef CGAL_CXX11
+ template<class...U>
+ typename std::enable_if<Constructible_from_each<RT,U...>::value &&
+ boost::is_same<Dimension_tag<sizeof...(U)>, Dimension>::value,
+ result_type>::type
+ operator()(U&&...u)const{
+ return typename Constructor::Values()(std::forward<U>(u)...);
+ }
+ //template<class...U,class=typename std::enable_if<Constructible_from_each<RT,U...>::value>::type,class=typename std::enable_if<(sizeof...(U)==static_dim+1)>::type,class=void>
+ template<class...U>
+ typename std::enable_if<Constructible_from_each<RT,U...>::value &&
+ boost::is_same<Dimension_tag<sizeof...(U)-1>, Dimension>::value,
+ result_type>::type
+ operator()(U&&...u)const{
+ return Apply_to_last_then_rest()(typename Constructor::Values_divide(),std::forward<U>(u)...);
+ }
+#else
+ using internal::Construct_LA_vector_<R_,typename R::Default_ambient_dimension>::operator();
+#endif
+ template<class Iter> inline
+ typename boost::enable_if<is_iterator_type<Iter,std::forward_iterator_tag>,result_type>::type operator()
+ (Iter f,Iter g,Cartesian_tag t)const
+ {
+ return this->operator()((int)std::distance(f,g),f,g,t);
+ }
+ template<class Iter> inline
+ typename boost::enable_if<is_iterator_type<Iter,std::forward_iterator_tag>,result_type>::type operator()
+ (int d,Iter f,Iter g,Cartesian_tag)const
+ {
+ CGAL_assertion(d==std::distance(f,g));
+ CGAL_assertion(check_dimension_eq(d,this->kernel().dimension()));
+ return typename Constructor::Iterator()(d,f,g);
+ }
+ template<class Iter> inline
+ typename boost::enable_if<is_iterator_type<Iter,std::bidirectional_iterator_tag>,result_type>::type operator()
+ (Iter f,Iter g,Homogeneous_tag)const
+ {
+ --g;
+ return this->operator()((int)std::distance(f,g),f,g,*g);
+ }
+ template<class Iter> inline
+ typename boost::enable_if<is_iterator_type<Iter,std::bidirectional_iterator_tag>,result_type>::type operator()
+ (int d,Iter f,Iter g,Homogeneous_tag)const
+ {
+ --g;
+ return this->operator()(d,f,g,*g);
+ }
+ template<class Iter> inline
+ typename boost::enable_if<is_iterator_type<Iter,std::forward_iterator_tag>,result_type>::type operator()
+ (Iter f,Iter g)const
+ {
+ // Shouldn't it try comparing dist(f,g) to the dimension if it is known?
+ return this->operator()(f,g,typename R::Rep_tag());
+ }
+ template<class Iter> inline
+ typename boost::enable_if<is_iterator_type<Iter,std::forward_iterator_tag>,result_type>::type operator()
+ (int d,Iter f,Iter g)const
+ {
+ return this->operator()(d,f,g,typename R::Rep_tag());
+ }
+
+ // Last homogeneous coordinate given separately
+ template<class Iter,class NT> inline
+ typename boost::enable_if<is_iterator_type<Iter,std::forward_iterator_tag>,result_type>::type operator()
+ (int d,Iter f,Iter g,NT const&l)const
+ {
+ CGAL_assertion(d==std::distance(f,g));
+ CGAL_assertion(check_dimension_eq(d,this->kernel().dimension()));
+ // RT? better be safe for now
+ return typename Constructor::Iterator()(d,CGAL::make_transforming_iterator(f,Divide<FT,NT>(l)),CGAL::make_transforming_iterator(g,Divide<FT,NT>(l)));
+ }
+ template<class Iter,class NT> inline
+ typename boost::enable_if<is_iterator_type<Iter,std::forward_iterator_tag>,result_type>::type operator()
+ (Iter f,Iter g,NT const&l)const
+ {
+ return this->operator()((int)std::distance(f,g),f,g,l);
+ }
+};
+
+template<class R_> struct Compute_cartesian_coordinate {
+ CGAL_FUNCTOR_INIT_IGNORE(Compute_cartesian_coordinate)
+ typedef R_ R;
+ typedef typename Get_type<R, RT_tag>::type RT;
+ typedef typename R::Vector_ first_argument_type;
+ typedef int second_argument_type;
+ typedef Tag_true Is_exact;
+#ifdef CGAL_CXX11
+ typedef decltype(std::declval<const first_argument_type>()[0]) result_type;
+#else
+ typedef RT const& result_type;
+ // RT const& doesn't work with some LA (Eigen2 for instance) so we
+ // should use plain RT or find a way to detect this.
+#endif
+
+ result_type operator()(first_argument_type const& v,int i)const{
+ return v[i];
+ }
+};
+
+template<class R_> struct Construct_cartesian_const_iterator {
+ CGAL_FUNCTOR_INIT_IGNORE(Construct_cartesian_const_iterator)
+ typedef R_ R;
+ typedef typename R::Vector_ argument_type;
+ typedef typename R::LA_vector S_;
+ typedef typename R::Point_cartesian_const_iterator result_type;
+ // same as Vector
+ typedef Tag_true Is_exact;
+
+ result_type operator()(argument_type const& v,Begin_tag)const{
+ return S_::vector_begin(v);
+ }
+ result_type operator()(argument_type const& v,End_tag)const{
+ return S_::vector_end(v);
+ }
+};
+
+template<class R_> struct Midpoint {
+ CGAL_FUNCTOR_INIT_IGNORE(Midpoint)
+ typedef R_ R;
+ typedef typename Get_type<R, Point_tag>::type first_argument_type;
+ typedef typename Get_type<R, Point_tag>::type second_argument_type;
+ typedef typename Get_type<R, Point_tag>::type result_type;
+
+ result_type operator()(result_type const& a, result_type const& b)const{
+ return (a+b)/2;
+ }
+};
+
+template<class R_> struct Sum_of_vectors {
+ CGAL_FUNCTOR_INIT_IGNORE(Sum_of_vectors)
+ typedef R_ R;
+ typedef typename Get_type<R, Vector_tag>::type first_argument_type;
+ typedef typename Get_type<R, Vector_tag>::type second_argument_type;
+ typedef typename Get_type<R, Vector_tag>::type result_type;
+
+ result_type operator()(result_type const& a, result_type const& b)const{
+ return a+b;
+ }
+};
+
+template<class R_> struct Difference_of_vectors {
+ CGAL_FUNCTOR_INIT_IGNORE(Difference_of_vectors)
+ typedef R_ R;
+ typedef typename Get_type<R, Vector_tag>::type first_argument_type;
+ typedef typename Get_type<R, Vector_tag>::type second_argument_type;
+ typedef typename Get_type<R, Vector_tag>::type result_type;
+
+ result_type operator()(result_type const& a, result_type const& b)const{
+ return a-b;
+ }
+};
+
+template<class R_> struct Opposite_vector {
+ CGAL_FUNCTOR_INIT_IGNORE(Opposite_vector)
+ typedef R_ R;
+ typedef typename Get_type<R, Vector_tag>::type result_type;
+ typedef typename Get_type<R, Vector_tag>::type argument_type;
+
+ result_type operator()(result_type const& v)const{
+ return -v;
+ }
+};
+
+template<class R_> struct Scalar_product {
+ CGAL_FUNCTOR_INIT_IGNORE(Scalar_product)
+ typedef R_ R;
+ typedef typename R::LA_vector LA;
+ typedef typename Get_type<R, RT_tag>::type result_type;
+ typedef typename Get_type<R, Vector_tag>::type first_argument_type;
+ typedef typename Get_type<R, Vector_tag>::type second_argument_type;
+
+ result_type operator()(first_argument_type const& a, second_argument_type const& b)const{
+ return LA::dot_product(a,b);
+ }
+};
+
+template<class R_> struct Squared_distance_to_origin_stored {
+ CGAL_FUNCTOR_INIT_IGNORE(Squared_distance_to_origin_stored)
+ typedef R_ R;
+ typedef typename R::LA_vector LA;
+ typedef typename Get_type<R, RT_tag>::type result_type;
+ typedef typename Get_type<R, Point_tag>::type argument_type;
+
+ result_type operator()(argument_type const& a)const{
+ return LA::squared_norm(a);
+ }
+};
+
+template<class R_> struct Squared_distance_to_origin_via_dotprod {
+ CGAL_FUNCTOR_INIT_IGNORE(Squared_distance_to_origin_via_dotprod)
+ typedef R_ R;
+ typedef typename R::LA_vector LA;
+ typedef typename Get_type<R, RT_tag>::type result_type;
+ typedef typename Get_type<R, Point_tag>::type argument_type;
+
+ result_type operator()(argument_type const& a)const{
+ return LA::dot_product(a,a);
+ }
+};
+
+template<class R_> struct Orientation_of_vectors {
+ CGAL_FUNCTOR_INIT_IGNORE(Orientation_of_vectors)
+ typedef R_ R;
+ typedef typename R::Vector_cartesian_const_iterator first_argument_type;
+ typedef typename R::Vector_cartesian_const_iterator second_argument_type;
+ typedef typename Get_type<R, Orientation_tag>::type result_type;
+ typedef typename R::LA_vector LA;
+
+ template<class Iter>
+ result_type operator()(Iter const& f, Iter const& e) const {
+ return LA::determinant_of_iterators_to_vectors(f,e);
+ }
+};
+
+template<class R_> struct Orientation_of_points {
+ CGAL_FUNCTOR_INIT_IGNORE(Orientation_of_points)
+ typedef R_ R;
+ typedef typename R::Point_cartesian_const_iterator first_argument_type;
+ typedef typename R::Point_cartesian_const_iterator second_argument_type;
+ typedef typename Get_type<R, Orientation_tag>::type result_type;
+ typedef typename R::LA_vector LA;
+
+ template<class Iter>
+ result_type operator()(Iter const& f, Iter const& e) const {
+ return LA::determinant_of_iterators_to_points(f,e);
+ }
+};
+
+template<class R_> struct PV_dimension {
+ CGAL_FUNCTOR_INIT_IGNORE(PV_dimension)
+ typedef R_ R;
+ typedef typename R::Vector_ argument_type;
+ typedef int result_type;
+ typedef typename R::LA_vector LA;
+ typedef Tag_true Is_exact;
+
+ template<class T>
+ result_type operator()(T const& v) const {
+ return LA::size_of_vector(v);
+ }
+};
+
+template<class R_> struct Identity_functor {
+ CGAL_FUNCTOR_INIT_IGNORE(Identity_functor)
+ template<class T>
+ T const& operator()(T const&t) const { return t; }
+};
+
+}
+} // namespace CGAL
+#endif // CGAL_CARTESIAN_LA_FUNCTORS_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_base.h b/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_base.h
new file mode 100644
index 00000000..641bf8ae
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_base.h
@@ -0,0 +1,40 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KERNEL_D_CARTESIAN_BASE_H
+#define CGAL_KERNEL_D_CARTESIAN_BASE_H
+
+#include <CGAL/basic.h>
+#include <CGAL/NewKernel_d/Cartesian_complete.h>
+#include <CGAL/NewKernel_d/Cartesian_LA_base.h>
+
+namespace CGAL {
+#define CGAL_BASE \
+ Cartesian_LA_base_d< FT_, Dim_ >
+template < typename FT_, typename Dim_, typename Derived_=Default>
+struct Cartesian_base_d : public CGAL_BASE
+{
+ CGAL_CONSTEXPR Cartesian_base_d(){}
+ CGAL_CONSTEXPR Cartesian_base_d(int d):CGAL_BASE(d){}
+};
+#undef CGAL_BASE
+
+} //namespace CGAL
+
+#endif // CGAL_KERNEL_D_CARTESIAN_BASE_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_change_FT.h b/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_change_FT.h
new file mode 100644
index 00000000..e09c72d0
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_change_FT.h
@@ -0,0 +1,117 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KERNEL_D_CARTESIAN_CHANGE_FT_H
+#define CGAL_KERNEL_D_CARTESIAN_CHANGE_FT_H
+
+#include <CGAL/basic.h>
+#include <CGAL/NT_converter.h>
+#include <CGAL/transforming_iterator.h>
+#include <CGAL/NewKernel_d/Cartesian_complete.h>
+
+namespace CGAL {
+
+template < typename Base_, typename FT_, typename LA_=CGAL::LA_eigen<FT_,typename Base_::Default_ambient_dimension> >
+struct Cartesian_change_FT_base : public
+ Base_
+{
+ CGAL_CONSTEXPR Cartesian_change_FT_base(){}
+ CGAL_CONSTEXPR Cartesian_change_FT_base(int d):Base_(d){}
+
+ typedef Cartesian_change_FT_base Self;
+ typedef Base_ Kernel_base;
+ typedef LA_ LA;
+
+ template <class T, class D=void> struct Type : Inherit_type<Base_, T> {};
+ template <class D> struct Type <FT_tag, D> { typedef FT_ type; };
+ template <class D> struct Type <RT_tag, D> { typedef FT_ type; };
+
+ typedef NT_converter<typename Get_type<Kernel_base, FT_tag>::type,FT_> FT_converter;
+ typedef transforming_iterator<FT_converter,typename Kernel_base::Point_cartesian_const_iterator> Point_cartesian_const_iterator;
+ typedef transforming_iterator<FT_converter,typename Kernel_base::Vector_cartesian_const_iterator> Vector_cartesian_const_iterator;
+ //FIXME: use Iterator_list!
+ /*
+ template<class T,bool=CGAL_BOOSTD is_same<typename iterator_tag_traits<T>::value_tag,FT_tag>::value>
+ struct Iterator : Get_type<Kernel_base,T> {};
+ template<class T> struct Iterator<T,true> {
+ typedef transforming_iterator<FT_converter,typename Get_type<Kernel_base,T>::type> type;
+ };
+ */
+
+ template<class Tag_,class Type_>
+ struct Construct_cartesian_const_iterator_ {
+ typedef typename Get_functor<Kernel_base, Tag_>::type Functor_base;
+ Construct_cartesian_const_iterator_(){}
+ Construct_cartesian_const_iterator_(Self const&r):f(r){}
+ Functor_base f;
+ typedef Type_ result_type;
+ template<class T>
+ result_type operator()(T const& v, Begin_tag)const{
+ return make_transforming_iterator(f(v,Begin_tag()),FT_converter());
+ }
+ template<class T>
+ result_type operator()(T const& v, End_tag)const{
+ return make_transforming_iterator(f(v,End_tag()),FT_converter());
+ }
+ };
+ typedef Construct_cartesian_const_iterator_<Construct_ttag<Point_cartesian_const_iterator_tag>,Point_cartesian_const_iterator> Construct_point_cartesian_const_iterator;
+ typedef Construct_cartesian_const_iterator_<Construct_ttag<Vector_cartesian_const_iterator_tag>,Vector_cartesian_const_iterator> Construct_vector_cartesian_const_iterator;
+
+ template<class Tag_>
+ struct Compute_cartesian_coordinate {
+ typedef typename Get_functor<Kernel_base, Tag_>::type Functor_base;
+ Compute_cartesian_coordinate(){}
+ Compute_cartesian_coordinate(Self const&r):f(r){}
+ Functor_base f;
+ typedef FT_ result_type;
+ template<class Obj_>
+ result_type operator()(Obj_ const& v,int i)const{
+ return FT_converter()(f(v,i));
+ }
+ };
+
+ template<class T,class U=void,class=typename Get_functor_category<Cartesian_change_FT_base,T>::type> struct Functor :
+ Inherit_functor<Kernel_base,T,U> { };
+ template<class T,class U> struct Functor<T,U,Compute_tag> { };
+ template<class T,class U> struct Functor<T,U,Predicate_tag> { };
+ template<class D> struct Functor<Compute_point_cartesian_coordinate_tag,D,Compute_tag> {
+ typedef Compute_cartesian_coordinate<Compute_point_cartesian_coordinate_tag> type;
+ };
+ template<class D> struct Functor<Compute_vector_cartesian_coordinate_tag,D,Compute_tag> {
+ typedef Compute_cartesian_coordinate<Compute_vector_cartesian_coordinate_tag> type;
+ };
+ template<class D> struct Functor<Construct_ttag<Point_cartesian_const_iterator_tag>,D,Construct_iterator_tag> {
+ typedef Construct_point_cartesian_const_iterator type;
+ };
+ template<class D> struct Functor<Construct_ttag<Vector_cartesian_const_iterator_tag>,D,Construct_iterator_tag> {
+ typedef Construct_vector_cartesian_const_iterator type;
+ };
+};
+
+template < typename Base_, typename FT_>
+struct Cartesian_change_FT : public
+ Cartesian_change_FT_base<Base_,FT_>
+{
+ CGAL_CONSTEXPR Cartesian_change_FT(){}
+ CGAL_CONSTEXPR Cartesian_change_FT(int d):Cartesian_change_FT_base<Base_,FT_>(d){}
+};
+
+} //namespace CGAL
+
+#endif // CGAL_KERNEL_D_CARTESIAN_CHANGE_FT_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_complete.h b/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_complete.h
new file mode 100644
index 00000000..ef8921db
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_complete.h
@@ -0,0 +1,33 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KERNEL_D_CARTESIAN_COMPLETE_H
+#define CGAL_KERNEL_D_CARTESIAN_COMPLETE_H
+
+#include <CGAL/NewKernel_d/function_objects_cartesian.h>
+#include <CGAL/NewKernel_d/Cartesian_per_dimension.h>
+#include <CGAL/NewKernel_d/Types/Segment.h>
+#include <CGAL/NewKernel_d/Types/Sphere.h>
+#include <CGAL/NewKernel_d/Types/Hyperplane.h>
+#include <CGAL/NewKernel_d/Types/Aff_transformation.h>
+#include <CGAL/NewKernel_d/Types/Line.h>
+#include <CGAL/NewKernel_d/Types/Ray.h>
+#include <CGAL/NewKernel_d/Types/Iso_box.h>
+
+#endif // CGAL_KERNEL_D_CARTESIAN_COMPLETE_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_filter_K.h b/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_filter_K.h
new file mode 100644
index 00000000..179e97bf
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_filter_K.h
@@ -0,0 +1,79 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KERNEL_D_CARTESIAN_FILTER_K_H
+#define CGAL_KERNEL_D_CARTESIAN_FILTER_K_H
+
+#include <CGAL/basic.h>
+#include <CGAL/NewKernel_d/KernelD_converter.h>
+#include <CGAL/NewKernel_d/Filtered_predicate2.h>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/and.hpp>
+
+namespace CGAL {
+
+template < typename Base_, typename AK_, typename EK_ >
+struct Cartesian_filter_K : public Base_,
+ private Store_kernel<AK_>, private Store_kernel2<EK_>
+{
+ CGAL_CONSTEXPR Cartesian_filter_K(){}
+ CGAL_CONSTEXPR Cartesian_filter_K(int d):Base_(d){}
+ //FIXME: or do we want an instance of AK and EK belonging to this kernel,
+ //instead of a reference to external ones?
+ CGAL_CONSTEXPR Cartesian_filter_K(AK_ const&a,EK_ const&b):Base_(),Store_kernel<AK_>(a),Store_kernel2<EK_>(b){}
+ CGAL_CONSTEXPR Cartesian_filter_K(int d,AK_ const&a,EK_ const&b):Base_(d),Store_kernel<AK_>(a),Store_kernel2<EK_>(b){}
+ typedef Base_ Kernel_base;
+ typedef AK_ AK;
+ typedef EK_ EK;
+ typedef typename Store_kernel<AK_>::reference_type AK_rt;
+ AK_rt approximate_kernel()const{return this->kernel();}
+ typedef typename Store_kernel2<EK_>::reference2_type EK_rt;
+ EK_rt exact_kernel()const{return this->kernel2();}
+
+ // MSVC is too dumb to perform the empty base optimization.
+ typedef boost::mpl::and_<
+ internal::Do_not_store_kernel<Kernel_base>,
+ internal::Do_not_store_kernel<AK>,
+ internal::Do_not_store_kernel<EK> > Do_not_store_kernel;
+
+ //TODO: C2A/C2E could be able to convert *this into this->kernel() or this->kernel2().
+ typedef KernelD_converter<Kernel_base,AK> C2A;
+ typedef KernelD_converter<Kernel_base,EK> C2E;
+
+ // fix the types
+ // TODO: only fix some types, based on some criterion?
+ template<class T> struct Type : Get_type<Kernel_base,T> {};
+
+ template<class T,class D=void,class=typename Get_functor_category<Cartesian_filter_K,T>::type> struct Functor :
+ Inherit_functor<Kernel_base,T,D> {};
+ template<class T,class D> struct Functor<T,D,Predicate_tag> {
+ typedef typename Get_functor<AK, T>::type AP;
+ typedef typename Get_functor<EK, T>::type EP;
+ typedef Filtered_predicate2<EP,AP,C2E,C2A> type;
+ };
+// TODO:
+// template<class T> struct Functor<T,No_filter_tag,Predicate_tag> :
+// Kernel_base::template Functor<T,No_filter_tag> {};
+// TODO:
+// detect when Less_cartesian_coordinate doesn't need filtering
+};
+
+} //namespace CGAL
+
+#endif // CGAL_KERNEL_D_CARTESIAN_FILTER_K_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_filter_NT.h b/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_filter_NT.h
new file mode 100644
index 00000000..c390a55c
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_filter_NT.h
@@ -0,0 +1,93 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KERNEL_D_CARTESIAN_FILTER_NT_H
+#define CGAL_KERNEL_D_CARTESIAN_FILTER_NT_H
+
+#include <CGAL/basic.h>
+#include <CGAL/NewKernel_d/Cartesian_change_FT.h>
+#include <CGAL/internal/Exact_type_selector.h>
+
+namespace CGAL {
+
+template < typename Base_ >
+struct Cartesian_filter_NT : public Base_
+{
+ CGAL_CONSTEXPR Cartesian_filter_NT(){}
+ CGAL_CONSTEXPR Cartesian_filter_NT(int d):Base_(d){}
+ typedef Base_ Kernel_base;
+ typedef Cartesian_change_FT<Kernel_base,Interval_nt_advanced> K1;
+ typedef typename internal::Exact_field_selector<typename Get_type<Kernel_base, FT_tag>::type>::Type Exact_nt;
+ typedef Cartesian_change_FT<Kernel_base,Exact_nt> K2;
+
+ template<class T,class D=void,class=typename Get_functor_category<Cartesian_filter_NT,T>::type> struct Functor :
+ Inherit_functor<Kernel_base,T,D> {};
+ template<class T,class D> struct Functor<T,D,Predicate_tag> {
+ struct type {
+ //TODO: use compression (derive from a compressed_pair?)
+ typedef typename Get_functor<K1, T>::type P1; P1 p1;
+ typedef typename Get_functor<K2, T>::type P2; P2 p2;
+ typedef typename P2::result_type result_type;
+ type(){}
+ type(Cartesian_filter_NT const&k):p1(reinterpret_cast<K1 const&>(k)),p2(reinterpret_cast<K2 const&>(k)){}
+ //FIXME: if predicate's constructor takes a kernel as argument, how do we translate that? reinterpret_cast is really ugly and possibly unsafe.
+
+#ifdef CGAL_CXX11
+ template<class...U> result_type operator()(U&&...u)const{
+ {
+ Protect_FPU_rounding<true> p;
+ try {
+ typename P1::result_type res=p1(u...); // don't forward as u may be reused
+ if(is_certain(res)) return get_certain(res);
+ } catch (Uncertain_conversion_exception) {}
+ }
+ return p2(std::forward<U>(u)...);
+ }
+#else
+ result_type operator()()const{ // does it make sense to have 0 argument?
+ {
+ Protect_FPU_rounding<true> p;
+ try {
+ typename P1::result_type res=p1();
+ if(is_certain(res)) return get_certain(res);
+ } catch (Uncertain_conversion_exception) {}
+ }
+ return p2();
+ }
+#define CGAL_CODE(Z,N,_) template<BOOST_PP_ENUM_PARAMS(N,class T)> result_type operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t))const{ \
+ { \
+ Protect_FPU_rounding<true> p; \
+ try { \
+ typename P1::result_type res=p1(BOOST_PP_ENUM_PARAMS(N,t)); \
+ if(is_certain(res)) return get_certain(res); \
+ } catch (Uncertain_conversion_exception) {} \
+ } \
+ return p2(BOOST_PP_ENUM_PARAMS(N,t)); \
+ }
+ BOOST_PP_REPEAT_FROM_TO(1,11,CGAL_CODE,_)
+#undef CGAL_CODE
+
+#endif
+ };
+ };
+};
+
+} //namespace CGAL
+
+#endif // CGAL_KERNEL_D_CARTESIAN_FILTER_NT_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_per_dimension.h b/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_per_dimension.h
new file mode 100644
index 00000000..179f7319
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_per_dimension.h
@@ -0,0 +1,33 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KD_CARTESIAN_PER_DIM_H
+#define CGAL_KD_CARTESIAN_PER_DIM_H
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/Dimension.h>
+#include <CGAL/predicates/sign_of_determinant.h>
+
+// Should probably disappear.
+
+namespace CGAL {
+template <class Dim_, class R_, class Derived_>
+struct Cartesian_per_dimension : public R_ {};
+}
+
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_static_filters.h b/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_static_filters.h
new file mode 100644
index 00000000..693e962a
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Cartesian_static_filters.h
@@ -0,0 +1,95 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KD_CARTESIAN_STATIC_FILTERS_H
+#define CGAL_KD_CARTESIAN_STATIC_FILTERS_H
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/Dimension.h>
+#include <CGAL/internal/Static_filters/tools.h> // bug, should be included by the next one
+#include <CGAL/internal/Static_filters/Orientation_2.h>
+#include <boost/mpl/if.hpp>
+
+namespace CGAL {
+namespace SFA { // static filter adapter
+// Note that this would be quite a bit simpler without stateful kernels
+template <class Base_,class R_> struct Orientation_of_points_2 : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Orientation_of_points_2)
+ typedef typename Get_type<R_, Point_tag>::type Point;
+ typedef typename Get_type<R_, Orientation_tag>::type result_type;
+ typedef typename Get_type<R_, FT_tag>::type FT;
+ typedef typename Get_functor<R_, Compute_point_cartesian_coordinate_tag>::type CC;
+ typedef typename Get_functor<Base_, Orientation_of_points_tag>::type Orientation_base;
+ // TODO: Move this out for easy reuse
+ struct Adapter {
+ struct Point_2 {
+ R_ const&r; CC const&c; Point const& p;
+ Point_2(R_ const&r_, CC const&c_, Point const&p_):r(r_),c(c_),p(p_){}
+ // use result_of instead?
+ typename CC::result_type x()const{return c(p,0);}
+ typename CC::result_type y()const{return c(p,1);}
+ };
+ struct Vector_2 {};
+ struct Circle_2 {};
+ struct Orientation_2 {
+ typedef typename Orientation_of_points_2::result_type result_type;
+ result_type operator()(Point_2 const&A, Point_2 const&B, Point_2 const&C)const{
+ Point const* t[3]={&A.p,&B.p,&C.p};
+ return Orientation_base(A.r)(make_transforming_iterator<Dereference_functor>(t+0),make_transforming_iterator<Dereference_functor>(t+3));
+ }
+ };
+ };
+ template<class Iter> result_type operator()(Iter f, Iter CGAL_assertion_code(e))const{
+ CC c(this->kernel());
+ Point const& A=*f;
+ Point const& B=*++f;
+ Point const& C=*++f;
+ CGAL_assertion(++f==e);
+ typedef typename Adapter::Point_2 P;
+ return typename internal::Static_filters_predicates::Orientation_2<Adapter>()(P(this->kernel(),c,A),P(this->kernel(),c,B),P(this->kernel(),c,C));
+ }
+};
+}
+
+template <class Dim_ /* should be implicit */, class R_, class Derived_=Default>
+struct Cartesian_static_filters : public R_ {
+ CGAL_CONSTEXPR Cartesian_static_filters(){}
+ CGAL_CONSTEXPR Cartesian_static_filters(int d):R_(d){}
+};
+
+template <class R_, class Derived_>
+struct Cartesian_static_filters<Dimension_tag<2>, R_, Derived_> : public R_ {
+ CGAL_CONSTEXPR Cartesian_static_filters(){}
+ CGAL_CONSTEXPR Cartesian_static_filters(int d):R_(d){}
+ typedef Cartesian_static_filters<Dimension_tag<2>, R_, Derived_> Self;
+ typedef typename Default::Get<Derived_,Self>::type Derived;
+ template <class T, class=void> struct Functor : Inherit_functor<R_, T> {};
+ template <class D> struct Functor <Orientation_of_points_tag,D> {
+ typedef
+ //typename boost::mpl::if_ <
+ //boost::is_same<D,No_filter_tag>,
+ //typename Get_functor<R_, Orientation_of_points_tag>::type,
+ SFA::Orientation_of_points_2<R_,Derived>
+ // >::type
+ type;
+ };
+};
+
+}
+
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Coaffine.h b/include/gudhi_patches/CGAL/NewKernel_d/Coaffine.h
new file mode 100644
index 00000000..43015d24
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Coaffine.h
@@ -0,0 +1,330 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KD_COAFFINE_H
+#define CGAL_KD_COAFFINE_H
+#include <vector>
+#include <algorithm>
+#include <iterator>
+#include <CGAL/Dimension.h>
+#include <CGAL/NewKernel_d/functor_tags.h>
+
+namespace CGAL {
+namespace CartesianDKernelFunctors {
+struct Flat_orientation {
+ std::vector<int> proj;
+ std::vector<int> rest;
+ bool reverse;
+};
+
+// For debugging purposes
+inline std::ostream& operator<< (std::ostream& o, Flat_orientation const& f) {
+ o << "Proj: ";
+ for(std::vector<int>::const_iterator i=f.proj.begin();
+ i!=f.proj.end(); ++i)
+ o << *i << ' ';
+ o << "\nRest: ";
+ for(std::vector<int>::const_iterator i=f.rest.begin();
+ i!=f.rest.end(); ++i)
+ o << *i << ' ';
+ o << "\nInv: " << f.reverse;
+ return o << '\n';
+}
+
+namespace internal {
+namespace coaffine {
+template<class Mat>
+inline void debug_matrix(std::ostream& o, Mat const&mat) {
+ for(int i=0;i<mat.rows();++i){
+ for(int j=0;j<mat.cols();++j){
+ o<<mat(i,j)<<' ';
+ }
+ o<<'\n';
+ }
+}
+}
+}
+
+template<class R_> struct Construct_flat_orientation : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Construct_flat_orientation)
+ typedef R_ R;
+ typedef typename Get_type<R, FT_tag>::type FT;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Increment_dimension<typename R::Max_ambient_dimension>::type Dplusone;
+ typedef typename R::LA::template Rebind_dimension<Dynamic_dimension_tag,Dplusone>::Other LA;
+ typedef typename LA::Square_matrix Matrix;
+ typedef typename Get_functor<R, Compute_point_cartesian_coordinate_tag>::type CCC;
+ typedef typename Get_functor<R, Point_dimension_tag>::type PD;
+ typedef Flat_orientation result_type;
+
+ // This implementation is going to suck. Maybe we should push the
+ // functionality into LA. And we should check (in debug mode) that
+ // the points are affinely independent.
+ template<class Iter>
+ result_type operator()(Iter f, Iter e)const{
+ Iter f_save = f;
+ PD pd (this->kernel());
+ CCC ccc (this->kernel());
+ int dim = pd(*f);
+ Matrix coord (dim+1, dim+1); // use distance(f,e)? This matrix doesn't need to be square.
+ int col = 0;
+ Flat_orientation o;
+ std::vector<int>& proj=o.proj;
+ std::vector<int>& rest=o.rest; rest.reserve(dim+1);
+ for(int i=0; i<dim+1; ++i) rest.push_back(i);
+ for( ; f != e ; ++col, ++f ) {
+ //std::cerr << "(*f)[0]=" << (*f)[0] << std::endl;
+ Point const&p=*f;
+ // use a coordinate iterator instead?
+ for(int i=0; i<dim; ++i) coord(col, i) = ccc(p, i);
+ coord(col,dim)=1;
+ int d = (int)proj.size()+1;
+ Matrix m (d, d);
+ // Fill the matrix with what we already have
+ for(int i=0; i<d; ++i)
+ for(int j=0; j<d-1; ++j)
+ m(i,j) = coord(i, proj[j]);
+ // Try to complete with any other coordinate
+ // TODO: iterate on rest by the end, or use a (forward_)list.
+ for(std::vector<int>::iterator it=rest.begin();;++it) {
+ CGAL_assertion(it!=rest.end());
+ for(int i=0; i<d; ++i) m(i,d-1) = coord(i, *it);
+ if(LA::sign_of_determinant(m)!=0) {
+ proj.push_back(*it);
+ rest.erase(it);
+ break;
+ }
+ }
+ }
+ std::sort(proj.begin(),proj.end());
+ typename Get_functor<R, In_flat_orientation_tag>::type ifo(this->kernel());
+ o.reverse = false;
+ o.reverse = ifo(o, f_save, e) != CGAL::POSITIVE;
+ return o;
+ }
+};
+
+template<class R_> struct Contained_in_affine_hull : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Contained_in_affine_hull)
+ typedef R_ R;
+ typedef typename Get_type<R, FT_tag>::type FT;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_type<R, Bool_tag>::type result_type;
+ typedef typename Get_functor<R, Compute_point_cartesian_coordinate_tag>::type CCC;
+ typedef typename Get_functor<R, Point_dimension_tag>::type PD;
+ //typedef typename Increment_dimension<typename R::Default_ambient_dimension>::type D1;
+ //typedef typename Increment_dimension<typename R::Max_ambient_dimension>::type D2;
+ //typedef typename R::LA::template Rebind_dimension<D1,D2>::Other LA;
+ typedef typename Increment_dimension<typename R::Max_ambient_dimension>::type Dplusone;
+ typedef typename R::LA::template Rebind_dimension<Dynamic_dimension_tag,Dplusone>::Other LA;
+ typedef typename LA::Square_matrix Matrix;
+
+ // mostly copied from Construct_flat_orientation. TODO: dedup this code or use LA.
+ template<class Iter>
+ result_type operator()(Iter f, Iter e, Point const&x) const {
+ // FIXME: are the points in (f,e) required to be affinely independent?
+ PD pd (this->kernel());
+ CCC ccc (this->kernel());
+ int dim=pd(*f);
+ Matrix coord (dim+1, dim+1); // use distance
+ int col = 0;
+ std::vector<int> proj;
+ std::vector<int> rest; rest.reserve(dim+1);
+ for(int i=0; i<dim+1; ++i) rest.push_back(i);
+ for( ; f != e ; ++col, ++f ) {
+ Point const&p=*f;
+ for(int i=0; i<dim; ++i) coord(col, i) = ccc(p, i);
+ coord(col,dim)=1;
+ int d = (int)proj.size()+1;
+ Matrix m (d, d);
+ for(int i=0; i<d; ++i)
+ for(int j=0; j<d-1; ++j)
+ m(i,j) = coord(i, proj[j]);
+ for(std::vector<int>::iterator it=rest.begin();it!=rest.end();++it) {
+ for(int i=0; i<d; ++i) m(i,d-1) = coord(i, *it);
+ if(LA::sign_of_determinant(m)!=0) {
+ proj.push_back(*it);
+ rest.erase(it);
+ break;
+ }
+ }
+ }
+ for(int i=0; i<dim; ++i) coord(col, i) = ccc(x, i);
+ coord(col,dim)=1;
+ int d = (int)proj.size()+1;
+ Matrix m (d, d);
+ for(int i=0; i<d; ++i)
+ for(int j=0; j<d-1; ++j)
+ m(i,j) = coord(i, proj[j]);
+ for(std::vector<int>::iterator it=rest.begin();it!=rest.end();++it) {
+ for(int i=0; i<d; ++i) m(i,d-1) = coord(i, *it);
+ if(LA::sign_of_determinant(m)!=0) return false;
+ }
+ return true;
+ }
+};
+
+template<class R_> struct In_flat_orientation : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(In_flat_orientation)
+ typedef R_ R;
+ typedef typename Get_type<R, FT_tag>::type FT;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_type<R, Orientation_tag>::type result_type;
+ typedef typename Increment_dimension<typename R::Default_ambient_dimension>::type D1;
+ typedef typename Increment_dimension<typename R::Max_ambient_dimension>::type D2;
+ typedef typename R::LA::template Rebind_dimension<D1,D2>::Other LA;
+ typedef typename LA::Square_matrix Matrix;
+
+ template<class Iter>
+ result_type operator()(Flat_orientation const&o, Iter f, Iter e) const {
+ // TODO: work in the projection instead of the ambient space.
+ typename Get_functor<R, Compute_point_cartesian_coordinate_tag>::type c(this->kernel());
+ typename Get_functor<R, Point_dimension_tag>::type pd(this->kernel());
+ int d=pd(*f);
+ Matrix m(d+1,d+1);
+ int i=0;
+ for(;f!=e;++f,++i) {
+ Point const& p=*f;
+ m(i,0)=1;
+ for(int j=0;j<d;++j){
+ m(i,j+1)=c(p,j);
+ }
+ }
+ for(std::vector<int>::const_iterator it = o.rest.begin(); it != o.rest.end() /* i<d+1 */; ++i, ++it) {
+ m(i,0)=1;
+ for(int j=0;j<d;++j){
+ m(i,j+1)=0; // unneeded if the matrix is initialized to 0
+ }
+ if(*it != d) m(i,1+*it)=1;
+ }
+
+ result_type ret = LA::sign_of_determinant(CGAL_MOVE(m));
+ if(o.reverse) ret=-ret;
+ return ret;
+ }
+};
+
+template<class R_> struct In_flat_side_of_oriented_sphere : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(In_flat_side_of_oriented_sphere)
+ typedef R_ R;
+ typedef typename Get_type<R, FT_tag>::type FT;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_type<R, Orientation_tag>::type result_type;
+ typedef typename Increment_dimension<typename R::Default_ambient_dimension,2>::type D1;
+ typedef typename Increment_dimension<typename R::Max_ambient_dimension,2>::type D2;
+ typedef typename R::LA::template Rebind_dimension<D1,D2>::Other LA;
+ typedef typename LA::Square_matrix Matrix;
+
+ template<class Iter>
+ result_type operator()(Flat_orientation const&o, Iter f, Iter e, Point const&x) const {
+ // TODO: can't work in the projection, but we should at least remove the row of 1s.
+ typename Get_functor<R, Compute_point_cartesian_coordinate_tag>::type c(this->kernel());
+ typename Get_functor<R, Point_dimension_tag>::type pd(this->kernel());
+ int d=pd(*f);
+ Matrix m(d+2,d+2);
+ int i=0;
+ for(;f!=e;++f,++i) {
+ Point const& p=*f;
+ m(i,0)=1;
+ m(i,d+1)=0;
+ for(int j=0;j<d;++j){
+ m(i,j+1)=c(p,j);
+ m(i,d+1)+=CGAL_NTS square(m(i,j+1));
+ }
+ }
+ for(std::vector<int>::const_iterator it = o.rest.begin(); it != o.rest.end() /* i<d+1 */; ++i, ++it) {
+ m(i,0)=1;
+ for(int j=0;j<d;++j){
+ m(i,j+1)=0; // unneeded if the matrix is initialized to 0
+ }
+ if(*it != d) m(i,d+1)=m(i,1+*it)=1;
+ else m(i,d+1)=0;
+ }
+ m(d+1,0)=1;
+ m(d+1,d+1)=0;
+ for(int j=0;j<d;++j){
+ m(d+1,j+1)=c(x,j);
+ m(d+1,d+1)+=CGAL_NTS square(m(d+1,j+1));
+ }
+
+ result_type ret = -LA::sign_of_determinant(CGAL_MOVE(m));
+ if(o.reverse) ret=-ret;
+ return ret;
+ }
+};
+
+template<class R_> struct In_flat_power_side_of_power_sphere_raw : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(In_flat_power_side_of_power_sphere_raw)
+ typedef R_ R;
+ typedef typename Get_type<R, FT_tag>::type FT;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_type<R, Orientation_tag>::type result_type;
+ typedef typename Increment_dimension<typename R::Default_ambient_dimension,2>::type D1;
+ typedef typename Increment_dimension<typename R::Max_ambient_dimension,2>::type D2;
+ typedef typename R::LA::template Rebind_dimension<D1,D2>::Other LA;
+ typedef typename LA::Square_matrix Matrix;
+
+ template<class Iter, class IterW, class Wt>
+ result_type operator()(Flat_orientation const&o, Iter f, Iter e, IterW fw, Point const&x, Wt const&w) const {
+ // TODO: can't work in the projection, but we should at least remove the row of 1s.
+ typename Get_functor<R, Compute_point_cartesian_coordinate_tag>::type c(this->kernel());
+ typename Get_functor<R, Point_dimension_tag>::type pd(this->kernel());
+ int d=pd(*f);
+ Matrix m(d+2,d+2);
+ int i=0;
+ for(;f!=e;++f,++fw,++i) {
+ Point const& p=*f;
+ m(i,0)=1;
+ m(i,d+1)=-*fw;
+ for(int j=0;j<d;++j){
+ m(i,j+1)=c(p,j);
+ m(i,d+1)+=CGAL_NTS square(m(i,j+1));
+ }
+ }
+ for(std::vector<int>::const_iterator it = o.rest.begin(); it != o.rest.end() /* i<d+1 */; ++i, ++it) {
+ m(i,0)=1;
+ for(int j=0;j<d;++j){
+ m(i,j+1)=0; // unneeded if the matrix is initialized to 0
+ }
+ if(*it != d) m(i,d+1)=m(i,1+*it)=1;
+ else m(i,d+1)=0;
+ }
+ m(d+1,0)=1;
+ m(d+1,d+1)=-w;
+ for(int j=0;j<d;++j){
+ m(d+1,j+1)=c(x,j);
+ m(d+1,d+1)+=CGAL_NTS square(m(d+1,j+1));
+ }
+
+ result_type ret = -LA::sign_of_determinant(CGAL_MOVE(m));
+ if(o.reverse) ret=-ret;
+ return ret;
+ }
+};
+
+
+}
+CGAL_KD_DEFAULT_TYPE(Flat_orientation_tag,(CGAL::CartesianDKernelFunctors::Flat_orientation),(),());
+CGAL_KD_DEFAULT_FUNCTOR(In_flat_orientation_tag,(CartesianDKernelFunctors::In_flat_orientation<K>),(Point_tag),(Compute_point_cartesian_coordinate_tag,Point_dimension_tag));
+CGAL_KD_DEFAULT_FUNCTOR(In_flat_side_of_oriented_sphere_tag,(CartesianDKernelFunctors::In_flat_side_of_oriented_sphere<K>),(Point_tag),(Compute_point_cartesian_coordinate_tag,Point_dimension_tag));
+CGAL_KD_DEFAULT_FUNCTOR(In_flat_power_side_of_power_sphere_raw_tag,(CartesianDKernelFunctors::In_flat_power_side_of_power_sphere_raw<K>),(Point_tag),(Compute_point_cartesian_coordinate_tag,Point_dimension_tag));
+CGAL_KD_DEFAULT_FUNCTOR(Construct_flat_orientation_tag,(CartesianDKernelFunctors::Construct_flat_orientation<K>),(Point_tag),(Compute_point_cartesian_coordinate_tag,Point_dimension_tag,In_flat_orientation_tag));
+CGAL_KD_DEFAULT_FUNCTOR(Contained_in_affine_hull_tag,(CartesianDKernelFunctors::Contained_in_affine_hull<K>),(Point_tag),(Compute_point_cartesian_coordinate_tag,Point_dimension_tag));
+}
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Define_kernel_types.h b/include/gudhi_patches/CGAL/NewKernel_d/Define_kernel_types.h
new file mode 100644
index 00000000..6a40515b
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Define_kernel_types.h
@@ -0,0 +1,50 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_DEFINE_KERNEL_TYPES_H
+#define CGAL_DEFINE_KERNEL_TYPES_H
+#include <CGAL/config.h>
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/typeset.h>
+#ifdef CGAL_CXX11
+#include <type_traits>
+#else
+#include <boost/type_traits.hpp>
+#endif
+
+namespace CGAL {
+ namespace internal {
+ template<class K,class Tag_,bool=iterator_tag_traits<Tag_>::is_iterator>
+ struct Type_or_iter : K::template Type<Tag_> {};
+ template<class K,class Tag_>
+ struct Type_or_iter<K, Tag_, true> : K::template Iterator<Tag_> {};
+ }
+ template<class K, class Base=K, class List=typename typeset_union<typename K::Object_list,typename K::Iterator_list>::type> struct Define_kernel_types;
+ template<class K, class Base>
+ struct Define_kernel_types <K, Base, typeset<> > : Base {};
+ template<class K>
+ struct Define_kernel_types <K, void, typeset<> > {};
+ template<class K, class Base, class List>
+ struct Define_kernel_types :
+ Typedef_tag_type<typename List::head,
+ typename internal::Type_or_iter<K,typename List::head>::type,
+ Define_kernel_types<K, Base, typename List::tail>
+ > {};
+}
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Dimension_base.h b/include/gudhi_patches/CGAL/NewKernel_d/Dimension_base.h
new file mode 100644
index 00000000..be875e63
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Dimension_base.h
@@ -0,0 +1,49 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KD_DIMENSION_BASE_h
+#define CGAL_KD_DIMENSION_BASE_h
+#include <CGAL/Dimension.h>
+#include <CGAL/assertions.h>
+#include <CGAL/NewKernel_d/utils.h>
+namespace CGAL {
+struct Store_dimension_base {
+ //TODO: add some assertions
+ Store_dimension_base(int dim=UNKNOWN_DIMENSION):dim_(dim){}
+ int dimension()const{return dim_;}
+ void set_dimension(int dim){dim_=dim;}
+ private:
+ int dim_;
+};
+template<class=Dynamic_dimension_tag>
+struct Dimension_base {
+ Dimension_base(int = UNKNOWN_DIMENSION){}
+ int dimension() const { return UNKNOWN_DIMENSION; }
+ void set_dimension(int) {}
+};
+template<int dim_>
+struct Dimension_base<Dimension_tag<dim_> > {
+ Dimension_base(){}
+ Dimension_base(int CGAL_assertion_code(dim)){CGAL_assertion(dim_==dim);}
+ int dimension()const{return dim_;}
+ void set_dimension(int dim){CGAL_assertion(dim_==dim);}
+};
+}
+#endif
+
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Filtered_predicate2.h b/include/gudhi_patches/CGAL/NewKernel_d/Filtered_predicate2.h
new file mode 100644
index 00000000..1a6a67bc
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Filtered_predicate2.h
@@ -0,0 +1,137 @@
+// Copyright (c) 2001-2005 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+//
+// Author(s) : Sylvain Pion
+
+#ifndef CGAL_FILTERED_PREDICATE2_H
+#define CGAL_FILTERED_PREDICATE2_H
+
+#include <string>
+#include <CGAL/config.h>
+#include <CGAL/Interval_nt.h>
+#include <CGAL/Uncertain.h>
+#include <CGAL/Profile_counter.h>
+#include <CGAL/NewKernel_d/store_kernel.h>
+#include <boost/preprocessor.hpp>
+
+namespace CGAL {
+
+// This template class is a wrapper that implements the filtering for any
+// predicate (dynamic filters with IA).
+
+// TODO :
+// - each predicate in the default kernel should define a tag that says if it
+// wants to be filtered or not (=> all homogeneous predicate define this
+// tag). We could even test-suite that automatically. It makes a strong
+// new requirement on the kernel though...
+// Could be done with a traits mechanism ?
+// A default template could use the current IA, but other tags or whatever
+// could specify no filtering at all, or static filtering...
+// - same thing for constructions => virtual operator() ?
+// - similarly, constructions should have a tag saying if they can throw or
+// not, or we let all this up to the compiler optimizer to figure out ?
+// - Some caching could be done at the Point_2 level.
+
+
+template <class EP, class AP, class C2E, class C2A, bool Protection = true>
+class Filtered_predicate2
+{
+//TODO: pack (at least use a tuple)
+//FIXME: is it better to store those, or just store enough to recreate them
+//(i.e. possibly references to the kernels)?
+ EP ep;
+ AP ap;
+ C2E c2e;
+ C2A c2a;
+
+ typedef typename AP::result_type Ares;
+
+public:
+
+ typedef AP Approximate_predicate;
+ typedef EP Exact_predicate;
+ typedef C2E To_exact_converter;
+ typedef C2A To_approximate_converter;
+
+ // FIXME: should use result_of, see emails by Nico
+ typedef typename EP::result_type result_type;
+ // AP::result_type must be convertible to EP::result_type.
+
+ Filtered_predicate2()
+ {}
+
+ template <class K>
+ Filtered_predicate2(const K& k)
+ : ep(k.exact_kernel()), ap(k.approximate_kernel()), c2e(k,k.exact_kernel()), c2a(k,k.approximate_kernel())
+ {}
+
+#ifdef CGAL_CXX11
+ template <typename... Args>
+ result_type
+ operator()(Args&&... args) const
+ {
+ CGAL_BRANCH_PROFILER(std::string(" failures/calls to : ") + std::string(CGAL_PRETTY_FUNCTION), tmp);
+ // Protection is outside the try block as VC8 has the CGAL_CFG_FPU_ROUNDING_MODE_UNWINDING_VC_BUG
+ {
+ Protect_FPU_rounding<Protection> p;
+ try
+ {
+ // No forward here, the arguments may still be needed
+ Ares res = ap(c2a(args)...);
+ if (is_certain(res))
+ return get_certain(res);
+ }
+ catch (Uncertain_conversion_exception) {}
+ }
+ CGAL_BRANCH_PROFILER_BRANCH(tmp);
+ Protect_FPU_rounding<!Protection> p(CGAL_FE_TONEAREST);
+ return ep(c2e(std::forward<Args>(args))...);
+ }
+#else
+
+#define CGAL_VAR(Z,N,C) C(a##N)
+#define CGAL_CODE(Z,N,_) \
+ template <BOOST_PP_ENUM_PARAMS(N,class A)> \
+ result_type \
+ operator()(BOOST_PP_ENUM_BINARY_PARAMS(N, A, const& a)) const \
+ { \
+ CGAL_BRANCH_PROFILER(std::string(" failures/calls to : ") + std::string(CGAL_PRETTY_FUNCTION), tmp); \
+ { \
+ Protect_FPU_rounding<Protection> p; \
+ try \
+ { \
+ Ares res = ap(BOOST_PP_ENUM(N,CGAL_VAR,c2a)); \
+ if (is_certain(res)) \
+ return get_certain(res); \
+ } \
+ catch (Uncertain_conversion_exception) {} \
+ } \
+ CGAL_BRANCH_PROFILER_BRANCH(tmp); \
+ Protect_FPU_rounding<!Protection> p(CGAL_FE_TONEAREST); \
+ return ep(BOOST_PP_ENUM(N,CGAL_VAR,c2e)); \
+ }
+ BOOST_PP_REPEAT_FROM_TO(1, 10, CGAL_CODE, _ )
+#undef CGAL_CODE
+#undef CGAL_VAR
+
+#endif
+};
+
+} //namespace CGAL
+
+#endif // CGAL_FILTERED_PREDICATE2_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/KernelD_converter.h b/include/gudhi_patches/CGAL/NewKernel_d/KernelD_converter.h
new file mode 100644
index 00000000..a8896976
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/KernelD_converter.h
@@ -0,0 +1,199 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KERNEL_D_CARTESIAN_CONVERTER_H
+#define CGAL_KERNEL_D_CARTESIAN_CONVERTER_H
+
+#include <CGAL/basic.h>
+#include <CGAL/tuple.h>
+#include <CGAL/typeset.h>
+#include <CGAL/Object.h>
+#include <CGAL/Origin.h>
+#include <CGAL/NT_converter.h>
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/Kernel/mpl.h>
+#include <CGAL/is_iterator.h>
+#include <CGAL/transforming_iterator.h>
+#include <boost/utility/enable_if.hpp>
+#include <boost/mpl/if.hpp>
+#include <CGAL/NewKernel_d/store_kernel.h>
+#include <CGAL/NewKernel_d/Kernel_object_converter.h>
+
+namespace CGAL {
+namespace internal {
+// Reverses order, but that shouldn't matter.
+template<class K,class T> struct Map_taglist_to_typelist :
+ Map_taglist_to_typelist<K,typename T::tail>::type
+ ::template add<typename Get_type<K, typename T::head>::type>
+{};
+template<class K> struct Map_taglist_to_typelist<K,typeset<> > : typeset<> {};
+}
+
+template<class List = typeset<> >
+struct Object_converter {
+ typedef Object result_type;
+ template<class F>
+ result_type operator()(Object const& o, F const& f) const {
+ typedef typename List::head H;
+ if (H const* ptr = object_cast<H>(&o))
+ return make_object(f(*ptr));
+ else
+ return Object_converter<typename List::tail>()(o,f);
+ }
+};
+template<>
+struct Object_converter <typeset<> > {
+ typedef Object result_type;
+ template<class F>
+ result_type operator()(Object const&,F const&)const {
+ CGAL_error_msg("Cartesiand_converter is unable to determine what is wrapped in the Object");
+ return Object();
+ }
+};
+
+
+ //TODO: special case when K1==K2 (or they are very close?)
+template<class Final_, class K1, class K2, class List>
+class KernelD_converter_
+: public KernelD_converter_<Final_,K1,K2,typename List::tail>
+{
+ typedef typename List::head Tag_;
+ typedef typename List::tail Rest;
+ typedef KernelD_converter_<Final_,K1,K2,Rest> Base;
+ typedef typename Get_type<K1,Tag_>::type K1_Obj;
+ typedef typename Get_type<K2,Tag_>::type K2_Obj;
+ typedef typename Get_functor<K1, Convert_ttag<Tag_> >::type K1_Conv;
+ typedef KO_converter<Tag_,K1,K2> KOC;
+ typedef CGAL_BOOSTD is_same<K1_Conv, Null_functor> no_converter;
+ typedef typename internal::Map_taglist_to_typelist<K1,Rest>::type::template contains<K1_Obj> duplicate;
+
+ // Disable the conversion in some cases:
+ struct Do_not_use{};
+
+ // Explicit calls to boost::mpl functions to avoid parenthesis
+ // warning on some versions of GCC
+ typedef typename boost::mpl::if_ <
+ // If Point==Vector, keep only one conversion
+ boost::mpl::or_<boost::mpl::bool_<duplicate::value>,
+ // For iterator objects, the default is make_transforming_iterator
+ boost::mpl::bool_<(iterator_tag_traits<Tag_>::is_iterator && no_converter::value)> >,
+ Do_not_use,K1_Obj>::type argument_type;
+ //typedef typename KOC::argument_type K1_Obj;
+ //typedef typename KOC::result_type K2_Obj;
+ public:
+ using Base::operator(); // don't use directly, just make it accessible to the next level
+ K2_Obj helper(K1_Obj const& o,CGAL_BOOSTD true_type)const{
+ return KOC()(this->myself().kernel(),this->myself().kernel2(),this->myself(),o);
+ }
+ K2_Obj helper(K1_Obj const& o,CGAL_BOOSTD false_type)const{
+ return K1_Conv(this->myself().kernel())(this->myself().kernel2(),this->myself(),o);
+ }
+ K2_Obj operator()(argument_type const& o)const{
+ return helper(o,no_converter());
+ }
+ template<class X,int=0> struct result:Base::template result<X>{};
+ template<int i> struct result<Final_(argument_type),i> {typedef K2_Obj type;};
+};
+
+template<class Final_, class K1, class K2>
+class KernelD_converter_<Final_,K1,K2,typeset<> > {
+ public:
+ struct Do_not_use2{};
+ void operator()(Do_not_use2)const{}
+ template<class T> struct result;
+ Final_& myself(){return *static_cast<Final_*>(this);}
+ Final_ const& myself()const{return *static_cast<Final_ const*>(this);}
+};
+
+
+// TODO: use the intersection of Kn::Object_list.
+template<class K1, class K2, class List_=
+typename typeset_intersection<typename K1::Object_list, typename K2::Object_list>::type
+//typeset<Point_tag>::add<Vector_tag>::type/*::add<Segment_tag>::type*/
+> class KernelD_converter
+ : public Store_kernel<K1>, public Store_kernel2<K2>,
+ public KernelD_converter_<KernelD_converter<K1,K2,List_>,K1,K2,List_>
+{
+ typedef KernelD_converter Self;
+ typedef Self Final_;
+ typedef KernelD_converter_<Self,K1,K2,List_> Base;
+ typedef typename Get_type<K1, FT_tag>::type FT1;
+ typedef typename Get_type<K2, FT_tag>::type FT2;
+ typedef NT_converter<FT1, FT2> NTc;
+ NTc c; // TODO: compressed storage as this is likely empty and the converter gets passed around (and stored in iterators)
+
+ public:
+ KernelD_converter(){}
+ KernelD_converter(K1 const&a,K2 const&b):Store_kernel<K1>(a),Store_kernel2<K2>(b){}
+
+ // For boost::result_of, used in transforming_iterator
+ template<class T,int i=is_iterator<T>::value?42:0> struct result:Base::template result<T>{};
+ template<class T> struct result<Final_(T),42> {
+ typedef transforming_iterator<Final_,T> type;
+ };
+ template<int i> struct result<Final_(K1),i>{typedef K2 type;};
+ template<int i> struct result<Final_(int),i>{typedef int type;};
+ // Ideally the next 2 would come with Point_tag and Vector_tag, but that's hard...
+ template<int i> struct result<Final_(Origin),i>{typedef Origin type;};
+ template<int i> struct result<Final_(Null_vector),i>{typedef Null_vector type;};
+ template<int i> struct result<Final_(Object),i>{typedef Object type;};
+ template<int i> struct result<Final_(FT1),i>{typedef FT2 type;};
+
+ using Base::operator();
+ typename Store_kernel2<K2>::reference2_type operator()(K1 const&)const{return this->kernel2();}
+ int operator()(int i)const{return i;}
+ Origin operator()(Origin const&o)const{return o;}
+ Null_vector operator()(Null_vector const&v)const{return v;}
+ FT2 operator()(FT1 const&x)const{return c(x);}
+ //RT2 operator()(typename First_if_different<RT1,FT1>::Type const&x)const{return cr(x);}
+
+ typename Get_type<K2, Flat_orientation_tag>::type const&
+ operator()(typename Get_type<K1, Flat_orientation_tag>::type const&o)const
+ { return o; } // Both kernels should have the same, returning a reference should warn if not.
+
+ template<class It>
+ transforming_iterator<Final_,typename boost::enable_if<is_iterator<It>,It>::type>
+ operator()(It const& it) const {
+ return make_transforming_iterator(it,*this);
+ }
+
+ template<class T>
+ //TODO: use decltype in C++11 instead of result
+ std::vector<typename result<Final_(T)>::type>
+ operator()(const std::vector<T>& v) const {
+ return std::vector<typename result<Final_(T)>::type>(operator()(v.begin()),operator()(v.begin()));
+ }
+
+ //TODO: convert std::list and other containers?
+
+ Object
+ operator()(const Object &obj) const
+ {
+ typedef typename internal::Map_taglist_to_typelist<K1,List_>::type Possibilities;
+ //TODO: add Empty, vector<Point>, etc to the list.
+ return Object_converter<Possibilities>()(obj,*this);
+ }
+
+ //TODO: convert boost::variant
+
+};
+
+} //namespace CGAL
+
+#endif // CGAL_KERNEL_D_CARTESIAN_CONVERTER_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Kernel_2_interface.h b/include/gudhi_patches/CGAL/NewKernel_d/Kernel_2_interface.h
new file mode 100644
index 00000000..fa30dff0
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Kernel_2_interface.h
@@ -0,0 +1,104 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KD_KERNEL_2_INTERFACE_H
+#define CGAL_KD_KERNEL_2_INTERFACE_H
+
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/transforming_iterator.h>
+#include <CGAL/NewKernel_d/utils.h>
+#include <CGAL/tuple.h>
+
+
+namespace CGAL {
+template <class Base_> struct Kernel_2_interface : public Base_ {
+ typedef Base_ Base;
+ typedef Kernel_2_interface<Base> Kernel;
+ typedef typename Get_type<Base, RT_tag>::type RT;
+ typedef typename Get_type<Base, FT_tag>::type FT;
+ typedef typename Get_type<Base, Bool_tag>::type Boolean;
+ typedef typename Get_type<Base, Sign_tag>::type Sign;
+ typedef typename Get_type<Base, Comparison_result_tag>::type Comparison_result;
+ typedef typename Get_type<Base, Orientation_tag>::type Orientation;
+ typedef typename Get_type<Base, Oriented_side_tag>::type Oriented_side;
+ typedef typename Get_type<Base, Bounded_side_tag>::type Bounded_side;
+ typedef typename Get_type<Base, Angle_tag>::type Angle;
+ typedef typename Get_type<Base, Point_tag>::type Point_2;
+ typedef typename Get_type<Base, Vector_tag>::type Vector_2;
+ typedef typename Get_type<Base, Segment_tag>::type Segment_2;
+ typedef cpp0x::tuple<Point_2,Point_2,Point_2> Triangle_2; // triangulation insists...
+ template <class T,int i> struct Help_2p_i {
+ typedef typename Get_functor<Base, T>::type LT;
+ typedef typename LT::result_type result_type;
+ LT lt;
+ Help_2p_i(Kernel const&k):lt(k){}
+ result_type operator()(Point_2 const&a, Point_2 const&b) {
+ return lt(a,b,i);
+ }
+ };
+ typedef Help_2p_i<Less_point_cartesian_coordinate_tag,0> Less_x_2;
+ typedef Help_2p_i<Less_point_cartesian_coordinate_tag,1> Less_y_2;
+ typedef Help_2p_i<Compare_point_cartesian_coordinate_tag,0> Compare_x_2;
+ typedef Help_2p_i<Compare_point_cartesian_coordinate_tag,1> Compare_y_2;
+ struct Compare_distance_2 {
+ typedef typename Get_functor<Base, Compare_distance_tag>::type CD;
+ typedef typename CD::result_type result_type;
+ CD cd;
+ Compare_distance_2(Kernel const&k):cd(k){}
+ result_type operator()(Point_2 const&a, Point_2 const&b, Point_2 const&c) {
+ return cd(a,b,c);
+ }
+ result_type operator()(Point_2 const&a, Point_2 const&b, Point_2 const&c, Point_2 const&d) {
+ return cd(a,b,c,d);
+ }
+ };
+ struct Orientation_2 {
+ typedef typename Get_functor<Base, Orientation_of_points_tag>::type O;
+ typedef typename O::result_type result_type;
+ O o;
+ Orientation_2(Kernel const&k):o(k){}
+ result_type operator()(Point_2 const&a, Point_2 const&b, Point_2 const&c) {
+ //return o(a,b,c);
+ Point_2 const* t[3]={&a,&b,&c};
+ return o(make_transforming_iterator<Dereference_functor>(t+0),make_transforming_iterator<Dereference_functor>(t+3));
+
+ }
+ };
+ struct Side_of_oriented_circle_2 {
+ typedef typename Get_functor<Base, Side_of_oriented_sphere_tag>::type SOS;
+ typedef typename SOS::result_type result_type;
+ SOS sos;
+ Side_of_oriented_circle_2(Kernel const&k):sos(k){}
+ result_type operator()(Point_2 const&a, Point_2 const&b, Point_2 const&c, Point_2 const&d) {
+ //return sos(a,b,c,d);
+ Point_2 const* t[4]={&a,&b,&c,&d};
+ return sos(make_transforming_iterator<Dereference_functor>(t+0),make_transforming_iterator<Dereference_functor>(t+4));
+ }
+ };
+ Less_x_2 less_x_2_object()const{ return Less_x_2(*this); }
+ Less_y_2 less_y_2_object()const{ return Less_y_2(*this); }
+ Compare_x_2 compare_x_2_object()const{ return Compare_x_2(*this); }
+ Compare_y_2 compare_y_2_object()const{ return Compare_y_2(*this); }
+ Compare_distance_2 compare_distance_2_object()const{ return Compare_distance_2(*this); }
+ Orientation_2 orientation_2_object()const{ return Orientation_2(*this); }
+ Side_of_oriented_circle_2 side_of_oriented_circle_2_object()const{ return Side_of_oriented_circle_2(*this); }
+};
+}
+
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Kernel_3_interface.h b/include/gudhi_patches/CGAL/NewKernel_d/Kernel_3_interface.h
new file mode 100644
index 00000000..96076aa8
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Kernel_3_interface.h
@@ -0,0 +1,102 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KD_KERNEL_3_INTERFACE_H
+#define CGAL_KD_KERNEL_3_INTERFACE_H
+
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/transforming_iterator.h>
+#include <CGAL/NewKernel_d/utils.h>
+#include <CGAL/tuple.h>
+
+
+namespace CGAL {
+template <class Base_> struct Kernel_3_interface : public Base_ {
+ typedef Base_ Base;
+ typedef Kernel_3_interface<Base> Kernel;
+ typedef typename Get_type<Base, RT_tag>::type RT;
+ typedef typename Get_type<Base, FT_tag>::type FT;
+ typedef typename Get_type<Base, Bool_tag>::type Boolean;
+ typedef typename Get_type<Base, Sign_tag>::type Sign;
+ typedef typename Get_type<Base, Comparison_result_tag>::type Comparison_result;
+ typedef typename Get_type<Base, Orientation_tag>::type Orientation;
+ typedef typename Get_type<Base, Oriented_side_tag>::type Oriented_side;
+ typedef typename Get_type<Base, Bounded_side_tag>::type Bounded_side;
+ typedef typename Get_type<Base, Angle_tag>::type Angle;
+ typedef typename Get_type<Base, Point_tag>::type Point_3;
+ typedef typename Get_type<Base, Vector_tag>::type Vector_3;
+ typedef typename Get_type<Base, Segment_tag>::type Segment_3;
+ typedef cpp0x::tuple<Point_3,Point_3,Point_3> Triangle_3; // placeholder
+ typedef cpp0x::tuple<Point_3,Point_3,Point_3,Point_3> Tetrahedron_3; // placeholder
+ struct Compare_xyz_3 {
+ typedef typename Get_functor<Base, Compare_lexicographically_tag>::type CL;
+ typedef typename CL::result_type result_type;
+ CL cl;
+ Compare_xyz_3(Kernel const&k):cl(k){}
+ result_type operator()(Point_3 const&a, Point_3 const&b) {
+ return cl(a,b);
+ }
+ };
+ struct Compare_distance_3 {
+ typedef typename Get_functor<Base, Compare_distance_tag>::type CD;
+ typedef typename CD::result_type result_type;
+ CD cd;
+ Compare_distance_3(Kernel const&k):cd(k){}
+ result_type operator()(Point_3 const&a, Point_3 const&b, Point_3 const&c) {
+ return cd(a,b,c);
+ }
+ result_type operator()(Point_3 const&a, Point_3 const&b, Point_3 const&c, Point_3 const&d) {
+ return cd(a,b,c,d);
+ }
+ };
+ struct Orientation_3 {
+ typedef typename Get_functor<Base, Orientation_of_points_tag>::type O;
+ typedef typename O::result_type result_type;
+ O o;
+ Orientation_3(Kernel const&k):o(k){}
+ result_type operator()(Point_3 const&a, Point_3 const&b, Point_3 const&c, Point_3 const&d) {
+ //return o(a,b,c,d);
+ Point_3 const* t[4]={&a,&b,&c,&d};
+ return o(make_transforming_iterator<Dereference_functor>(t+0),make_transforming_iterator<Dereference_functor>(t+4));
+
+ }
+ };
+ struct Side_of_oriented_sphere_3 {
+ typedef typename Get_functor<Base, Side_of_oriented_sphere_tag>::type SOS;
+ typedef typename SOS::result_type result_type;
+ SOS sos;
+ Side_of_oriented_sphere_3(Kernel const&k):sos(k){}
+ result_type operator()(Point_3 const&a, Point_3 const&b, Point_3 const&c, Point_3 const&d, Point_3 const&e) {
+ //return sos(a,b,c,d);
+ Point_3 const* t[5]={&a,&b,&c,&d,&e};
+ return sos(make_transforming_iterator<Dereference_functor>(t+0),make_transforming_iterator<Dereference_functor>(t+5));
+ }
+ };
+
+ // I don't have the Coplanar predicates (yet)
+
+
+ Compare_xyz_3 compare_xyz_3_object()const{ return Compare_xyz_3(*this); }
+ Compare_distance_3 compare_distance_3_object()const{ return Compare_distance_3(*this); }
+ Orientation_3 orientation_3_object()const{ return Orientation_3(*this); }
+ Side_of_oriented_sphere_3 side_of_oriented_sphere_3_object()const{ return Side_of_oriented_sphere_3(*this); }
+};
+}
+
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Kernel_d_interface.h b/include/gudhi_patches/CGAL/NewKernel_d/Kernel_d_interface.h
new file mode 100644
index 00000000..dd888005
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Kernel_d_interface.h
@@ -0,0 +1,298 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KD_KERNEL_D_INTERFACE_H
+#define CGAL_KD_KERNEL_D_INTERFACE_H
+
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/transforming_iterator.h>
+#include <CGAL/NewKernel_d/utils.h>
+#include <CGAL/tuple.h>
+
+
+namespace CGAL {
+template <class Base_> struct Kernel_d_interface : public Base_ {
+ CGAL_CONSTEXPR Kernel_d_interface(){}
+ CGAL_CONSTEXPR Kernel_d_interface(int d):Base_(d){}
+
+ typedef Base_ Base;
+ typedef Kernel_d_interface<Base> Kernel;
+ typedef Base_ R_; // for the macros
+ typedef typename Get_type<Base, RT_tag>::type RT;
+ typedef typename Get_type<Base, FT_tag>::type FT;
+ typedef typename Get_type<Base, Bool_tag>::type Boolean;
+ typedef typename Get_type<Base, Sign_tag>::type Sign;
+ typedef typename Get_type<Base, Comparison_result_tag>::type Comparison_result;
+ typedef typename Get_type<Base, Orientation_tag>::type Orientation;
+ typedef typename Get_type<Base, Oriented_side_tag>::type Oriented_side;
+ typedef typename Get_type<Base, Bounded_side_tag>::type Bounded_side;
+ typedef typename Get_type<Base, Angle_tag>::type Angle;
+ typedef typename Get_type<Base, Flat_orientation_tag>::type Flat_orientation_d;
+ typedef typename Get_type<Base, Point_tag>::type Point_d;
+ typedef typename Get_type<Base, Vector_tag>::type Vector_d;
+ typedef typename Get_type<Base, Segment_tag>::type Segment_d;
+ typedef typename Get_type<Base, Sphere_tag>::type Sphere_d;
+ typedef typename Get_type<Base, Hyperplane_tag>::type Hyperplane_d;
+ typedef Vector_d Direction_d;
+ typedef typename Get_type<Base, Line_tag>::type Line_d;
+ typedef typename Get_type<Base, Ray_tag>::type Ray_d;
+ typedef typename Get_type<Base, Iso_box_tag>::type Iso_box_d;
+ typedef typename Get_type<Base, Aff_transformation_tag>::type Aff_transformation_d;
+ typedef typename Get_type<Base, Weighted_point_tag>::type Weighted_point_d;
+ typedef typename Get_functor<Base, Compute_point_cartesian_coordinate_tag>::type Compute_coordinate_d;
+ typedef typename Get_functor<Base, Compare_lexicographically_tag>::type Compare_lexicographically_d;
+ typedef typename Get_functor<Base, Equal_points_tag>::type Equal_d;
+ typedef typename Get_functor<Base, Less_lexicographically_tag>::type Less_lexicographically_d;
+ typedef typename Get_functor<Base, Less_or_equal_lexicographically_tag>::type Less_or_equal_lexicographically_d;
+ // FIXME: and vectors?
+ typedef typename Get_functor<Base, Orientation_of_points_tag>::type Orientation_d;
+ typedef typename Get_functor<Base, Less_point_cartesian_coordinate_tag>::type Less_coordinate_d;
+ typedef typename Get_functor<Base, Point_dimension_tag>::type Point_dimension_d;
+ typedef typename Get_functor<Base, Side_of_oriented_sphere_tag>::type Side_of_oriented_sphere_d;
+ typedef typename Get_functor<Base, Power_side_of_power_sphere_tag>::type Power_side_of_power_sphere_d;
+ typedef typename Get_functor<Base, Power_center_tag>::type Power_center_d;
+ typedef typename Get_functor<Base, Power_distance_tag>::type Power_distance_d;
+ typedef typename Get_functor<Base, Contained_in_affine_hull_tag>::type Contained_in_affine_hull_d;
+ typedef typename Get_functor<Base, Construct_flat_orientation_tag>::type Construct_flat_orientation_d;
+ typedef typename Get_functor<Base, In_flat_orientation_tag>::type In_flat_orientation_d;
+ typedef typename Get_functor<Base, In_flat_side_of_oriented_sphere_tag>::type In_flat_side_of_oriented_sphere_d;
+ typedef typename Get_functor<Base, In_flat_power_side_of_power_sphere_tag>::type In_flat_power_side_of_power_sphere_d;
+ typedef typename Get_functor<Base, Point_to_vector_tag>::type Point_to_vector_d;
+ typedef typename Get_functor<Base, Vector_to_point_tag>::type Vector_to_point_d;
+ typedef typename Get_functor<Base, Translated_point_tag>::type Translated_point_d;
+ typedef typename Get_functor<Base, Scaled_vector_tag>::type Scaled_vector_d;
+ typedef typename Get_functor<Base, Difference_of_vectors_tag>::type Difference_of_vectors_d;
+ typedef typename Get_functor<Base, Difference_of_points_tag>::type Difference_of_points_d;
+ //typedef typename Get_functor<Base, Construct_ttag<Point_tag> >::type Construct_point_d;
+ struct Construct_point_d : private Store_kernel<Kernel> {
+ typedef Kernel R_; // for the macro
+ CGAL_FUNCTOR_INIT_STORE(Construct_point_d)
+ typedef typename Get_functor<Base, Construct_ttag<Point_tag> >::type CP;
+ typedef Point_d result_type;
+ Point_d operator()(Weighted_point_d const&wp)const{
+ return typename Get_functor<Base, Point_drop_weight_tag>::type(this->kernel())(wp);
+ }
+#ifdef CGAL_CXX11
+ Point_d operator()(Weighted_point_d &wp)const{
+ return typename Get_functor<Base, Point_drop_weight_tag>::type(this->kernel())(wp);
+ }
+ Point_d operator()(Weighted_point_d &&wp)const{
+ return typename Get_functor<Base, Point_drop_weight_tag>::type(this->kernel())(std::move(wp));
+ }
+ Point_d operator()(Weighted_point_d const&&wp)const{
+ return typename Get_functor<Base, Point_drop_weight_tag>::type(this->kernel())(std::move(wp));
+ }
+ template<class...T>
+# if __cplusplus >= 201402L
+ decltype(auto)
+# else
+ Point_d
+# endif
+ operator()(T&&...t)const{
+ return CP(this->kernel())(std::forward<T>(t)...);
+ //return CP(this->kernel())(t...);
+ }
+#else
+# define CGAL_CODE(Z,N,_) template<BOOST_PP_ENUM_PARAMS(N,class T)> \
+ Point_d operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t))const{ \
+ return CP(this->kernel())(BOOST_PP_ENUM_PARAMS(N,t)); \
+ }
+ BOOST_PP_REPEAT_FROM_TO(1,11,CGAL_CODE,_)
+# undef CGAL_CODE
+ Point_d operator()()const{ \
+ return CP(this->kernel())(); \
+ }
+#endif
+ };
+ typedef typename Get_functor<Base, Construct_ttag<Vector_tag> >::type Construct_vector_d;
+ typedef typename Get_functor<Base, Construct_ttag<Segment_tag> >::type Construct_segment_d;
+ typedef typename Get_functor<Base, Construct_ttag<Sphere_tag> >::type Construct_sphere_d;
+ typedef typename Get_functor<Base, Construct_ttag<Hyperplane_tag> >::type Construct_hyperplane_d;
+ typedef Construct_vector_d Construct_direction_d;
+ typedef typename Get_functor<Base, Construct_ttag<Line_tag> >::type Construct_line_d;
+ typedef typename Get_functor<Base, Construct_ttag<Ray_tag> >::type Construct_ray_d;
+ typedef typename Get_functor<Base, Construct_ttag<Iso_box_tag> >::type Construct_iso_box_d;
+ typedef typename Get_functor<Base, Construct_ttag<Aff_transformation_tag> >::type Construct_aff_transformation_d;
+ typedef typename Get_functor<Base, Construct_ttag<Weighted_point_tag> >::type Construct_weighted_point_d;
+ typedef typename Get_functor<Base, Midpoint_tag>::type Midpoint_d;
+ struct Component_accessor_d : private Store_kernel<Kernel> {
+ typedef Kernel R_; // for the macro
+ CGAL_FUNCTOR_INIT_STORE(Component_accessor_d)
+ int dimension(Point_d const&p){
+ return this->kernel().point_dimension_d_object()(p);
+ }
+ FT cartesian(Point_d const&p, int i){
+ return this->kernel().compute_coordinate_d_object()(p,i);
+ }
+ RT homogeneous(Point_d const&p, int i){
+ if (i == dimension(p))
+ return 1;
+ return cartesian(p, i);
+ }
+ };
+ struct Construct_cartesian_const_iterator_d : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Construct_cartesian_const_iterator_d)
+ typedef typename Get_functor<Base, Construct_ttag<Point_cartesian_const_iterator_tag> >::type CPI;
+ typedef typename Get_functor<Base, Construct_ttag<Vector_cartesian_const_iterator_tag> >::type CVI;
+ // FIXME: The following sometimes breaks compilation. The typedef below forces instantiation of this, which forces Point_d, which itself (in the wrapper) needs the derived kernel to tell it what the base kernel is, and that's a cycle. The exact circumstances are not clear, g++ and clang++ are ok in both C++03 and C++11, it is only clang in C++11 without CGAL_CXX11 that breaks. For now, rely on result_type.
+ //typedef typename CGAL::decay<typename boost::result_of<CPI(Point_d,CGAL::Begin_tag)>::type>::type result_type;
+ typedef typename CGAL::decay<typename CPI::result_type>::type result_type;
+ // Kernel_d requires a common iterator type for points and vectors
+ // TODO: provide this mixed functor in preKernel?
+ //CGAL_static_assertion((boost::is_same<typename CGAL::decay<typename boost::result_of<CVI(Vector_d,CGAL::Begin_tag)>::type>::type, result_type>::value));
+ CGAL_static_assertion((boost::is_same<typename CGAL::decay<typename CVI::result_type>::type, result_type>::value));
+ template <class Tag_>
+ result_type operator()(Point_d const&p, Tag_ t)const{
+ return CPI(this->kernel())(p,t);
+ }
+ template <class Tag_>
+ result_type operator()(typename First_if_different<Vector_d,Point_d>::Type const&v, Tag_ t)const{
+ return CVI(this->kernel())(v,t);
+ }
+
+ template <class Obj>
+ result_type operator()(Obj const&o)const{
+ return operator()(o, Begin_tag());
+ }
+ result_type operator()(Point_d const&p, int)const{
+ return operator()(p, End_tag());
+ }
+ result_type operator()(typename First_if_different<Vector_d,Point_d>::Type const&v, int)const{
+ return operator()(v, End_tag());
+ }
+ };
+ struct Compute_squared_radius_d : private Store_kernel<Kernel> {
+ typedef Kernel R_; // for the macro
+ CGAL_FUNCTOR_INIT_STORE(Compute_squared_radius_d)
+ typedef FT result_type;
+ template<class S> FT operator()(CGAL_FORWARDABLE(S) s)const{
+ return typename Get_functor<Base, Squared_radius_tag>::type(this->kernel())(CGAL_FORWARD(S,s));
+ }
+ template<class I> FT operator()(I b, I e)const{
+ return typename Get_functor<Base, Squared_circumradius_tag>::type(this->kernel())(b,e);
+ }
+ };
+ typedef typename Construct_cartesian_const_iterator_d::result_type Cartesian_const_iterator_d;
+ typedef typename Get_functor<Base, Squared_distance_tag>::type Squared_distance_d;
+ typedef typename Get_functor<Base, Squared_length_tag>::type Squared_length_d;
+ typedef typename Get_functor<Base, Scalar_product_tag>::type Scalar_product_d;
+ typedef typename Get_functor<Base, Affine_rank_tag>::type Affine_rank_d;
+ typedef typename Get_functor<Base, Affinely_independent_tag>::type Affinely_independent_d;
+ typedef typename Get_functor<Base, Contained_in_linear_hull_tag>::type Contained_in_linear_hull_d;
+ typedef typename Get_functor<Base, Contained_in_simplex_tag>::type Contained_in_simplex_d;
+ typedef typename Get_functor<Base, Has_on_positive_side_tag>::type Has_on_positive_side_d;
+ typedef typename Get_functor<Base, Linear_rank_tag>::type Linear_rank_d;
+ typedef typename Get_functor<Base, Linearly_independent_tag>::type Linearly_independent_d;
+ typedef typename Get_functor<Base, Oriented_side_tag>::type Oriented_side_d;
+ typedef typename Get_functor<Base, Side_of_bounded_circumsphere_tag>::type Side_of_bounded_sphere_d;
+
+ typedef typename Get_functor<Base, Center_of_sphere_tag>::type Center_of_sphere_d;
+ typedef Center_of_sphere_d Construct_center_d; // RangeSearchTraits
+ typedef typename Get_functor<Base, Construct_circumcenter_tag>::type Construct_circumcenter_d;
+ typedef typename Get_functor<Base, Value_at_tag>::type Value_at_d;
+ typedef typename Get_functor<Base, Point_of_sphere_tag>::type Point_of_sphere_d;
+ typedef typename Get_functor<Base, Orthogonal_vector_tag>::type Orthogonal_vector_d;
+ typedef typename Get_functor<Base, Linear_base_tag>::type Linear_base_d;
+ typedef typename Get_functor<Base, Construct_min_vertex_tag>::type Construct_min_vertex_d;
+ typedef typename Get_functor<Base, Construct_max_vertex_tag>::type Construct_max_vertex_d;
+
+ typedef typename Get_functor<Base, Point_weight_tag>::type Compute_weight_d;
+ typedef typename Get_functor<Base, Point_drop_weight_tag>::type Point_drop_weight_d;
+
+ //TODO:
+ //typedef ??? Intersect_d;
+
+
+ Compute_coordinate_d compute_coordinate_d_object()const{ return Compute_coordinate_d(*this); }
+ Has_on_positive_side_d has_on_positive_side_d_object()const{ return Has_on_positive_side_d(*this); }
+ Compare_lexicographically_d compare_lexicographically_d_object()const{ return Compare_lexicographically_d(*this); }
+ Equal_d equal_d_object()const{ return Equal_d(*this); }
+ Less_lexicographically_d less_lexicographically_d_object()const{ return Less_lexicographically_d(*this); }
+ Less_or_equal_lexicographically_d less_or_equal_lexicographically_d_object()const{ return Less_or_equal_lexicographically_d(*this); }
+ Less_coordinate_d less_coordinate_d_object()const{ return Less_coordinate_d(*this); }
+ Orientation_d orientation_d_object()const{ return Orientation_d(*this); }
+ Oriented_side_d oriented_side_d_object()const{ return Oriented_side_d(*this); }
+ Point_dimension_d point_dimension_d_object()const{ return Point_dimension_d(*this); }
+ Point_of_sphere_d point_of_sphere_d_object()const{ return Point_of_sphere_d(*this); }
+ Side_of_oriented_sphere_d side_of_oriented_sphere_d_object()const{ return Side_of_oriented_sphere_d(*this); }
+ Power_side_of_power_sphere_d power_side_of_power_sphere_d_object()const{ return Power_side_of_power_sphere_d(*this); }
+ Power_center_d power_center_d_object()const{ return Power_center_d(*this); }
+ Power_distance_d power_distance_d_object()const{ return Power_distance_d(*this); }
+ Side_of_bounded_sphere_d side_of_bounded_sphere_d_object()const{ return Side_of_bounded_sphere_d(*this); }
+ Contained_in_affine_hull_d contained_in_affine_hull_d_object()const{ return Contained_in_affine_hull_d(*this); }
+ Contained_in_linear_hull_d contained_in_linear_hull_d_object()const{ return Contained_in_linear_hull_d(*this); }
+ Contained_in_simplex_d contained_in_simplex_d_object()const{ return Contained_in_simplex_d(*this); }
+ Construct_flat_orientation_d construct_flat_orientation_d_object()const{ return Construct_flat_orientation_d(*this); }
+ In_flat_orientation_d in_flat_orientation_d_object()const{ return In_flat_orientation_d(*this); }
+ In_flat_side_of_oriented_sphere_d in_flat_side_of_oriented_sphere_d_object()const{ return In_flat_side_of_oriented_sphere_d(*this); }
+ In_flat_power_side_of_power_sphere_d in_flat_power_side_of_power_sphere_d_object()const{ return In_flat_power_side_of_power_sphere_d(*this); }
+ Point_to_vector_d point_to_vector_d_object()const{ return Point_to_vector_d(*this); }
+ Vector_to_point_d vector_to_point_d_object()const{ return Vector_to_point_d(*this); }
+ Translated_point_d translated_point_d_object()const{ return Translated_point_d(*this); }
+ Scaled_vector_d scaled_vector_d_object()const{ return Scaled_vector_d(*this); }
+ Difference_of_vectors_d difference_of_vectors_d_object()const{ return Difference_of_vectors_d(*this); }
+ Difference_of_points_d difference_of_points_d_object()const{ return Difference_of_points_d(*this); }
+ Affine_rank_d affine_rank_d_object()const{ return Affine_rank_d(*this); }
+ Affinely_independent_d affinely_independent_d_object()const{ return Affinely_independent_d(*this); }
+ Linear_base_d linear_base_d_object()const{ return Linear_base_d(*this); }
+ Linear_rank_d linear_rank_d_object()const{ return Linear_rank_d(*this); }
+ Linearly_independent_d linearly_independent_d_object()const{ return Linearly_independent_d(*this); }
+ Midpoint_d midpoint_d_object()const{ return Midpoint_d(*this); }
+ Value_at_d value_at_d_object()const{ return Value_at_d(*this); }
+ /// Intersect_d intersect_d_object()const{ return Intersect_d(*this); }
+ Component_accessor_d component_accessor_d_object()const{ return Component_accessor_d(*this); }
+ Orthogonal_vector_d orthogonal_vector_d_object()const{ return Orthogonal_vector_d(*this); }
+ Construct_cartesian_const_iterator_d construct_cartesian_const_iterator_d_object()const{ return Construct_cartesian_const_iterator_d(*this); }
+ Construct_point_d construct_point_d_object()const{ return Construct_point_d(*this); }
+ Construct_vector_d construct_vector_d_object()const{ return Construct_vector_d(*this); }
+ Construct_segment_d construct_segment_d_object()const{ return Construct_segment_d(*this); }
+ Construct_sphere_d construct_sphere_d_object()const{ return Construct_sphere_d(*this); }
+ Construct_hyperplane_d construct_hyperplane_d_object()const{ return Construct_hyperplane_d(*this); }
+ Compute_squared_radius_d compute_squared_radius_d_object()const{ return Compute_squared_radius_d(*this); }
+ Squared_distance_d squared_distance_d_object()const{ return Squared_distance_d(*this); }
+ Squared_length_d squared_length_d_object()const{ return Squared_length_d(*this); }
+ Scalar_product_d scalar_product_d_object()const{ return Scalar_product_d(*this); }
+ Center_of_sphere_d center_of_sphere_d_object()const{ return Center_of_sphere_d(*this); }
+ Construct_circumcenter_d construct_circumcenter_d_object()const{ return Construct_circumcenter_d(*this); }
+ Construct_direction_d construct_direction_d_object()const{ return Construct_direction_d(*this); }
+ Construct_line_d construct_line_d_object()const{ return Construct_line_d(*this); }
+ Construct_ray_d construct_ray_d_object()const{ return Construct_ray_d(*this); }
+ Construct_iso_box_d construct_iso_box_d_object()const{ return Construct_iso_box_d(*this); }
+ Construct_aff_transformation_d construct_aff_transformation_d_object()const{ return Construct_aff_transformation_d(*this); }
+ Construct_min_vertex_d construct_min_vertex_d_object()const{ return Construct_min_vertex_d(*this); }
+ Construct_max_vertex_d construct_max_vertex_d_object()const{ return Construct_max_vertex_d(*this); }
+ Construct_weighted_point_d construct_weighted_point_d_object()const{ return Construct_weighted_point_d(*this); }
+
+ Compute_weight_d compute_weight_d_object()const{ return Compute_weight_d(*this); }
+ Point_drop_weight_d point_drop_weight_d_object()const{ return Point_drop_weight_d(*this); }
+
+ // Dummies for those required functors missing a concept.
+ typedef Null_functor Position_on_line_d;
+ Position_on_line_d position_on_line_d_object()const{return Null_functor();}
+ typedef Null_functor Barycentric_coordinates_d;
+ Barycentric_coordinates_d barycentric_coordinates_d_object()const{return Null_functor();}
+
+ /* Not provided because they don't make sense here:
+ Lift_to_paraboloid_d
+ Project_along_d_axis_d
+ */
+};
+}
+
+#endif // CGAL_KD_KERNEL_D_INTERFACE_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Kernel_object_converter.h b/include/gudhi_patches/CGAL/NewKernel_d/Kernel_object_converter.h
new file mode 100644
index 00000000..99918ed2
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Kernel_object_converter.h
@@ -0,0 +1,134 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KD_KO_CONVERTER_H
+#define CGAL_KD_KO_CONVERTER_H
+#include <CGAL/NewKernel_d/utils.h>
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/Kernel/mpl.h> // First_if_different
+#include <CGAL/Dimension.h>
+namespace CGAL {
+template <class Tag_, class K1, class K2> struct KO_converter;
+//TODO: It would probably be better if this was a Misc Functor in K1.
+// This way K1 could chose how it wants to present its points (sparse
+// iterator?) and derived classes would inherit it.
+
+namespace internal {
+template <class D /*=Dynamic_dimension_tag*/, class K1, class K2>
+struct Point_converter_help {
+ typedef typename Get_type<K1, Point_tag>::type argument_type;
+ typedef typename Get_type<K2, Point_tag>::type result_type;
+ template <class C>
+ result_type operator()(K1 const& k1, K2 const& k2, C const& conv, argument_type const& p) const {
+ typename Get_functor<K1, Construct_ttag<Point_cartesian_const_iterator_tag> >::type i(k1);
+ typename Get_functor<K2, Construct_ttag<Point_tag> >::type cp(k2);
+ return cp(conv(i(p,Begin_tag())),conv(i(p,End_tag())));
+ }
+};
+#ifdef CGAL_CXX11
+// This doesn't seem so useful, the compiler should be able to handle
+// the iterators just as efficiently.
+template <int d, class K1, class K2>
+struct Point_converter_help<Dimension_tag<d>,K1,K2> {
+ typedef typename Get_type<K1, Point_tag>::type argument_type;
+ typedef typename Get_type<K2, Point_tag>::type result_type;
+ template <class C,int...I>
+ result_type help(Indices<I...>, K1 const& k1, K2 const& k2, C const& conv, argument_type const& p) const {
+ typename Get_functor<K1, Compute_point_cartesian_coordinate_tag>::type cc(k1);
+ typename Get_functor<K2, Construct_ttag<Point_tag> >::type cp(k2);
+ return cp(conv(cc(p,I))...);
+ }
+ template <class C>
+ result_type operator()(K1 const& k1, K2 const& k2, C const& conv, argument_type const& p) const {
+ return help(typename N_increasing_indices<d>::type(),k1,k2,conv,p);
+ }
+};
+#endif
+}
+template <class K1, class K2> struct KO_converter<Point_tag,K1,K2>
+: internal::Point_converter_help<typename K1::Default_ambient_dimension,K1,K2>
+{};
+
+template <class K1, class K2> struct KO_converter<Vector_tag,K1,K2>{
+ typedef typename Get_type<K1, Vector_tag>::type K1_Vector;
+
+ // Disabling is now done in KernelD_converter
+ // // can't use vector without at least a placeholder point because of this
+ // typedef typename K1:: Point K1_Point;
+ // typedef typename First_if_different<K1_Vector,K1_Point>::Type argument_type;
+
+ typedef K1_Vector argument_type;
+ typedef typename Get_type<K2, Vector_tag>::type result_type;
+ template <class C>
+ result_type operator()(K1 const& k1, K2 const& k2, C const& conv, argument_type const& v) const {
+ typename Get_functor<K1, Construct_ttag<Vector_cartesian_const_iterator_tag> >::type i(k1);
+ typename Get_functor<K2, Construct_ttag<Vector_tag> >::type cp(k2);
+ return cp(conv(i(v,Begin_tag())),conv(i(v,End_tag())));
+ }
+};
+
+template <class K1, class K2> struct KO_converter<Segment_tag,K1,K2>{
+ typedef typename Get_type<K1, Segment_tag>::type argument_type;
+ typedef typename Get_type<K2, Segment_tag>::type result_type;
+ template <class C>
+ result_type operator()(K1 const& k1, K2 const& k2, C const& conv, argument_type const& s) const {
+ typename Get_functor<K1, Segment_extremity_tag>::type f(k1);
+ typename Get_functor<K2, Construct_ttag<Segment_tag> >::type cs(k2);
+ return cs(conv(f(s,0)),conv(f(s,1)));
+ }
+};
+
+template <class K1, class K2> struct KO_converter<Hyperplane_tag,K1,K2>{
+ typedef typename Get_type<K1, Hyperplane_tag>::type argument_type;
+ typedef typename Get_type<K2, Hyperplane_tag>::type result_type;
+ template <class C>
+ result_type operator()(K1 const& k1, K2 const& k2, C const& conv, argument_type const& h) const {
+ typename Get_functor<K1, Orthogonal_vector_tag>::type ov(k1);
+ typename Get_functor<K1, Hyperplane_translation_tag>::type ht(k1);
+ typename Get_functor<K2, Construct_ttag<Hyperplane_tag> >::type ch(k2);
+ return ch(conv(ov(h)),conv(ht(h)));
+ }
+};
+
+template <class K1, class K2> struct KO_converter<Sphere_tag,K1,K2>{
+ typedef typename Get_type<K1, Sphere_tag>::type argument_type;
+ typedef typename Get_type<K2, Sphere_tag>::type result_type;
+ template <class C>
+ result_type operator()(K1 const& k1, K2 const& k2, C const& conv, argument_type const& s) const {
+ typename Get_functor<K1, Center_of_sphere_tag>::type cos(k1);
+ typename Get_functor<K1, Squared_radius_tag>::type sr(k1);
+ typename Get_functor<K2, Construct_ttag<Sphere_tag> >::type cs(k2);
+ return cs(conv(cos(s)),conv(sr(s)));
+ }
+};
+
+template <class K1, class K2> struct KO_converter<Weighted_point_tag,K1,K2>{
+ typedef typename Get_type<K1, Weighted_point_tag>::type argument_type;
+ typedef typename Get_type<K2, Weighted_point_tag>::type result_type;
+ template <class C>
+ result_type operator()(K1 const& k1, K2 const& k2, C const& conv, argument_type const& s) const {
+ typename Get_functor<K1, Point_drop_weight_tag>::type pdw(k1);
+ typename Get_functor<K1, Point_weight_tag>::type pw(k1);
+ typename Get_functor<K2, Construct_ttag<Weighted_point_tag> >::type cwp(k2);
+ return cwp(conv(pdw(s)),conv(pw(s)));
+ }
+};
+
+}
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/LA_eigen/LA.h b/include/gudhi_patches/CGAL/NewKernel_d/LA_eigen/LA.h
new file mode 100644
index 00000000..ddbdc37b
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/LA_eigen/LA.h
@@ -0,0 +1,175 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_LA_EIGEN_H
+#define CGAL_LA_EIGEN_H
+#include <CGAL/config.h>
+#ifndef CGAL_EIGEN3_ENABLED
+#error Requires Eigen
+#endif
+#include <boost/type_traits/is_arithmetic.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <CGAL/Dimension.h>
+#include <Eigen/Dense>
+#include <CGAL/NewKernel_d/LA_eigen/constructors.h>
+#include <CGAL/iterator_from_indices.h>
+
+namespace CGAL {
+
+//FIXME: where could we use Matrix_base instead of Matrix?
+// Dim_ real dimension
+// Max_dim_ upper bound on the dimension
+template<class NT_,class Dim_,class Max_dim_=Dim_> struct LA_eigen {
+ typedef NT_ NT;
+ typedef Dim_ Dimension;
+ typedef Max_dim_ Max_dimension;
+ enum { dimension = Eigen_dimension<Dimension>::value };
+ enum { max_dimension = Eigen_dimension<Max_dimension>::value };
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef LA_eigen< NT, D2, D3 > Other;
+ };
+ template<class,class=void> struct Property : boost::false_type {};
+ template<class D> struct Property<Has_vector_plus_minus_tag,D> : boost::true_type {};
+ template<class D> struct Property<Has_vector_scalar_ops_tag,D> : boost::true_type {};
+ template<class D> struct Property<Has_dot_product_tag,D> : boost::true_type {};
+
+ typedef Eigen::Matrix<NT,Eigen_dimension<Dim_>::value,1,Eigen::ColMajor|Eigen::AutoAlign,Eigen_dimension<Max_dim_>::value,1> Vector;
+ typedef Eigen::Matrix<NT,Eigen::Dynamic,1> Dynamic_vector;
+ typedef Construct_eigen<Vector> Construct_vector;
+
+#if (EIGEN_WORLD_VERSION>=3)
+ typedef NT const* Vector_const_iterator;
+#else
+ typedef Iterator_from_indices<const type,const NT
+#ifndef CGAL_CXX11
+ ,NT
+#endif
+ > Vector_const_iterator;
+#endif
+
+ template<class Vec_>static Vector_const_iterator vector_begin(Vec_ const&a){
+#if (EIGEN_WORLD_VERSION>=3)
+ return &a[0];
+#else
+ return Vector_const_iterator(a,0);
+#endif
+ }
+
+ template<class Vec_>static Vector_const_iterator vector_end(Vec_ const&a){
+#if (EIGEN_WORLD_VERSION>=3)
+ // FIXME: Isn't that dangerous if a is an expression and not a concrete vector?
+ return &a[0]+a.size();
+#else
+ return Vector_const_iterator(a,a.size());
+#endif
+ }
+
+ typedef Eigen::Matrix<NT,dimension,dimension,Eigen::ColMajor|Eigen::AutoAlign,max_dimension,max_dimension> Square_matrix;
+ typedef Eigen::Matrix<NT,dimension,Eigen::Dynamic,Eigen::ColMajor|Eigen::AutoAlign,max_dimension,Eigen::Dynamic> Dynamic_matrix;
+ //TODO: don't pass on the values of Max_* for an expensive NT
+ // typedef ... Constructor
+ // typedef ... Accessor
+#if 0
+ private:
+ template <class T> class Canonicalize_vector {
+ typedef typename Dimension_eigen<T::SizeAtCompileTime>::type S1;
+ typedef typename Dimension_eigen<T::MaxSizeAtCompileTime>::type S2;
+ public:
+ typedef typename Vector<S1,S2>::type type;
+ };
+ public:
+#endif
+
+ template<class Vec_>static int size_of_vector(Vec_ const&v){
+ return (int)v.size();
+ }
+
+ template<class Vec_>static NT dot_product(Vec_ const&a,Vec_ const&b){
+ return a.dot(b);
+ }
+
+ template<class Vec_> static int rows(Vec_ const&v) {
+ return (int)v.rows();
+ }
+ template<class Vec_> static int columns(Vec_ const&v) {
+ return (int)v.cols();
+ }
+
+ template<class Mat_> static NT determinant(Mat_ const&m,bool=false){
+ return m.determinant();
+ }
+
+ template<class Mat_> static typename
+ Same_uncertainty_nt<CGAL::Sign, NT>::type
+ sign_of_determinant(Mat_ const&m,bool=false)
+ {
+ return CGAL::sign(m.determinant());
+ }
+
+ template<class Mat_> static int rank(Mat_ const&m){
+ // return m.rank();
+ // This one uses sqrt so cannot be used with Gmpq
+ // TODO: use different algo for different NT?
+ // Eigen::ColPivHouseholderQR<Mat_> decomp(m);
+ Eigen::FullPivLU<Mat_> decomp(m);
+ // decomp.setThreshold(0);
+ return static_cast<int>(decomp.rank());
+ }
+
+ // m*a==b
+ template<class DV, class DM, class V>
+ static void solve(DV&a, DM const&m, V const& b){
+ //a = m.colPivHouseholderQr().solve(b);
+ a = m.fullPivLu().solve(b);
+ }
+ template<class DV, class DM, class V>
+ static bool solve_and_check(DV&a, DM const&m, V const& b){
+ //a = m.colPivHouseholderQr().solve(b);
+ a = m.fullPivLu().solve(b);
+ return b.isApprox(m*a);
+ }
+
+ static Dynamic_matrix basis(Dynamic_matrix const&m){
+ return m.fullPivLu().image(m);
+ }
+
+ template<class Vec1,class Vec2> static Vector homogeneous_add(Vec1 const&a,Vec2 const&b){
+ //TODO: use compile-time size when available
+ int d=a.size();
+ Vector v(d);
+ v << b[d-1]*a.topRows(d-1)+a[d-1]*b.topRows(d-1), a[d-1]*b[d-1];
+ return v;
+ }
+
+ template<class Vec1,class Vec2> static Vector homogeneous_sub(Vec1 const&a,Vec2 const&b){
+ int d=a.size();
+ Vector v(d);
+ v << b[d-1]*a.topRows(d-1)-a[d-1]*b.topRows(d-1), a[d-1]*b[d-1];
+ return v;
+ }
+
+ template<class Vec1,class Vec2> static std::pair<NT,NT> homogeneous_dot_product(Vec1 const&a,Vec2 const&b){
+ int d=a.size();
+ return make_pair(a.topRows(d-1).dot(b.topRows(d-1)), a[d-1]*b[d-1]);
+ }
+
+};
+}
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/LA_eigen/constructors.h b/include/gudhi_patches/CGAL/NewKernel_d/LA_eigen/constructors.h
new file mode 100644
index 00000000..3636996f
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/LA_eigen/constructors.h
@@ -0,0 +1,162 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_LA_EIGEN_CONSTRUCTORS_H
+#define CGAL_LA_EIGEN_CONSTRUCTORS_H
+#include <CGAL/config.h>
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable:4003) // not enough actual parameters for macro 'BOOST_PP_EXPAND_I'
+ // http://lists.boost.org/boost-users/2014/11/83291.php
+#endif
+
+#ifndef CGAL_EIGEN3_ENABLED
+#error Requires Eigen
+#endif
+#include <boost/type_traits/is_arithmetic.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <CGAL/Dimension.h>
+#include <Eigen/Dense>
+#include <CGAL/iterator_from_indices.h>
+#include <CGAL/NewKernel_d/utils.h>
+#include <boost/preprocessor/repetition.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+
+namespace CGAL {
+ template <class Vector_> struct Construct_eigen {
+ typedef Vector_ result_type;
+ typedef typename Vector_::Scalar NT;
+
+ private:
+ static void check_dim(int CGAL_assertion_code(d)){
+ CGAL_assertion_code(int m = result_type::MaxSizeAtCompileTime;)
+ CGAL_assertion((m == Eigen::Dynamic) || (d <= m));
+ }
+ public:
+
+ struct Dimension {
+ // Initialize with NaN if possible?
+ result_type operator()(int d) const {
+ check_dim(d);
+ return result_type(d);
+ }
+ };
+
+ struct Iterator {
+ template<typename Iter>
+ result_type operator()(int d,Iter const& f,Iter const& e) const {
+ check_dim(d);
+ CGAL_assertion(d==std::distance(f,e));
+ result_type a(d);
+ // TODO: check the right way to do this
+ std::copy(f,e,&a[0]);
+ return a;
+ }
+ };
+
+#if 0
+ struct Iterator_add_one {
+ template<typename Iter>
+ result_type operator()(int d,Iter const& f,Iter const& e) const {
+ check_dim(d);
+ CGAL_assertion(d==std::distance(f,e)+1);
+ result_type a(d);
+ std::copy(f,e,&a[0]);
+ a[d-1]=1;
+ return a;
+ }
+ };
+#endif
+
+ struct Iterator_and_last {
+ template<typename Iter,typename T>
+ result_type operator()(int d,Iter const& f,Iter const& e,CGAL_FORWARDABLE(T) t) const {
+ check_dim(d);
+ CGAL_assertion(d==std::distance(f,e)+1);
+ result_type a(d);
+ std::copy(f,e,&a[0]);
+ a[d-1]=CGAL_FORWARD(T,t);
+ return a;
+ }
+ };
+
+#ifdef CGAL_CXX11
+ struct Initializer_list {
+ // Fix T==NT?
+ template<class T>
+ result_type operator()(std::initializer_list<T> l) const {
+ return Iterator()(l.size(),l.begin(),l.end());
+ }
+ };
+#endif
+
+ struct Values {
+#ifdef CGAL_CXX11
+ // TODO avoid going through Initializer_list which may cause extra copies. Possibly use forward_as_tuple.
+ template<class...U>
+ result_type operator()(U&&...u) const {
+ check_dim(sizeof...(U)); // TODO: use static_assert
+ return Initializer_list()({forward_safe<NT,U>(u)...});
+ }
+#else
+
+#define CGAL_CODE(Z,N,_) result_type operator()(BOOST_PP_ENUM_PARAMS(N,NT const& t)) const { \
+ check_dim(N); \
+ result_type a(N); \
+ a << BOOST_PP_ENUM_PARAMS(N,t); \
+ return a; \
+}
+BOOST_PP_REPEAT_FROM_TO(1, 11, CGAL_CODE, _ )
+#undef CGAL_CODE
+
+#endif
+ };
+
+ struct Values_divide {
+#ifdef CGAL_CXX11
+ template<class H,class...U>
+ result_type operator()(H const&h,U&&...u) const {
+ check_dim(sizeof...(U)); // TODO: use static_assert
+ return Initializer_list()({Rational_traits<NT>().make_rational(std::forward<U>(u),h)...});
+ }
+#else
+
+#define CGAL_VAR(Z,N,_) ( Rational_traits<NT>().make_rational( t##N ,h) )
+#define CGAL_CODE(Z,N,_) template <class H> result_type \
+ operator()(H const&h, BOOST_PP_ENUM_PARAMS(N,NT const& t)) const { \
+ check_dim(N); \
+ result_type a(N); \
+ a << BOOST_PP_ENUM(N,CGAL_VAR,); \
+ return a; \
+ }
+ BOOST_PP_REPEAT_FROM_TO(1, 11, CGAL_CODE, _ )
+#undef CGAL_CODE
+#undef CGAL_VAR
+
+#endif
+ };
+ };
+}
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Lazy_cartesian.h b/include/gudhi_patches/CGAL/NewKernel_d/Lazy_cartesian.h
new file mode 100644
index 00000000..9ecc2b63
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Lazy_cartesian.h
@@ -0,0 +1,188 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KERNEL_D_LAZY_CARTESIAN_H
+#define CGAL_KERNEL_D_LAZY_CARTESIAN_H
+
+#include <CGAL/basic.h>
+#include <CGAL/algorithm.h>
+#include <CGAL/Lazy.h>
+#include <CGAL/Default.h>
+#include <CGAL/NewKernel_d/Filtered_predicate2.h>
+#include <CGAL/iterator_from_indices.h>
+#include <CGAL/NewKernel_d/Define_kernel_types.h>
+
+namespace CGAL {
+
+template<class K,class T>
+struct Nth_iterator_element : private Store_kernel<K> {
+ Nth_iterator_element(){}
+ Nth_iterator_element(K const&k):Store_kernel<K>(k){}
+ typedef typename Get_type<K, typename iterator_tag_traits<T>::value_tag>::type result_type;
+ template<class U> result_type operator()(CGAL_FORWARDABLE(U) u, int i) const {
+ typename Get_functor<K, Construct_ttag<T> >::type ci(this->kernel());
+ return *cpp0x::next(ci(CGAL_FORWARD(U,u),Begin_tag()),i);
+ }
+};
+ //typedef typename Functor<typename iterator_tag_traits<T>::nth_element>::type nth_elem;
+template<class K, class T, bool = iterator_tag_traits<T>::has_nth_element>
+struct Select_nth_element_functor {
+ typedef Nth_iterator_element<K, T> type;
+};
+template<class K, class T>
+struct Select_nth_element_functor <K, T, true> :
+ Get_functor<K, typename iterator_tag_traits<T>::nth_element> {};
+
+namespace internal {
+ template<class A,class B,class C,bool/*is_NT=false*/>
+ struct Lazy_construction_maybe_nt {
+ typedef Lazy_construction<A,B,C> type;
+ };
+ template<class A,class B,class C>
+ struct Lazy_construction_maybe_nt<A,B,C,true> {
+ typedef Lazy_construction_nt<A,B,C> type;
+ };
+}
+
+template <class EK_, class AK_, class E2A_, class Kernel_>
+struct Lazy_cartesian_types
+{
+ typedef typename typeset_intersection<
+ typename AK_::Object_list,
+ typename EK_::Object_list
+ >::type Object_list;
+
+ typedef typename typeset_intersection<
+ typename AK_::Iterator_list,
+ typename EK_::Iterator_list
+ >::type Iterator_list;
+
+ template <class T,class=typename Get_type_category<Kernel_,T>::type> struct Type {};
+ template <class T> struct Type<T,Object_tag> {
+ typedef Lazy<
+ typename Get_type<AK_,T>::type,
+ typename Get_type<EK_,T>::type,
+ typename Get_type<EK_, FT_tag>::type,
+ E2A_> type;
+ };
+ template <class T> struct Type<T,Number_tag> {
+ typedef CGAL::Lazy_exact_nt<typename Get_type<EK_,T>::type> type;
+ };
+
+ template <class T> struct Iterator {
+ typedef typename iterator_tag_traits<T>::value_tag Vt;
+ typedef typename Type<Vt>::type V;
+ typedef typename Select_nth_element_functor<AK_,T>::type AF;
+ typedef typename Select_nth_element_functor<EK_,T>::type EF;
+
+ typedef typename internal::Lazy_construction_maybe_nt<
+ Kernel_, AF, EF, is_NT_tag<Vt>::value
+ >::type nth_elem;
+
+ typedef Iterator_from_indices<
+ const typename Type<typename iterator_tag_traits<T>::container>::type,
+ const V, V, nth_elem
+ > type;
+ };
+};
+
+template <class EK_, class AK_, class E2A_/*, class Kernel_=Default*/>
+struct Lazy_cartesian : Dimension_base<typename EK_::Default_ambient_dimension>,
+ Lazy_cartesian_types<EK_,AK_,E2A_,Lazy_cartesian<EK_,AK_,E2A_> >
+{
+ //CGAL_CONSTEXPR Lazy_cartesian(){}
+ //CGAL_CONSTEXPR Lazy_cartesian(int d):Base_(d){}
+
+ //TODO: Do we want to store an AK and an EK? Or just references?
+ //FIXME: references would be better I guess.
+ //TODO: In any case, make sure that we don't end up storing this kernel for
+ //nothing (it is not empty but references empty kernels or something)
+ AK_ ak; EK_ ek;
+ AK_ const& approximate_kernel()const{return ak;}
+ EK_ const& exact_kernel()const{return ek;}
+
+ typedef Lazy_cartesian Self;
+ typedef Lazy_cartesian_types<EK_,AK_,E2A_,Self> Base;
+ //typedef typename Default::Get<Kernel_,Self>::type Kernel;
+ typedef Self Kernel;
+ typedef AK_ Approximate_kernel;
+ typedef EK_ Exact_kernel;
+ typedef E2A_ E2A;
+ typedef Approx_converter<Kernel, Approximate_kernel> C2A;
+ typedef Exact_converter<Kernel, Exact_kernel> C2E;
+
+ typedef typename Exact_kernel::Rep_tag Rep_tag;
+ typedef typename Exact_kernel::Kernel_tag Kernel_tag;
+ typedef typename Exact_kernel::Default_ambient_dimension Default_ambient_dimension;
+ typedef typename Exact_kernel::Max_ambient_dimension Max_ambient_dimension;
+ //typedef typename Exact_kernel::Flat_orientation Flat_orientation;
+ // Check that Approximate_kernel agrees with all that...
+
+ template<class T,class D=void,class=typename Get_functor_category<Lazy_cartesian,T,D>::type> struct Functor {
+ typedef Null_functor type;
+ };
+ //FIXME: what do we do with D here?
+ template<class T,class D> struct Functor<T,D,Predicate_tag> {
+ typedef typename Get_functor<Approximate_kernel, T>::type FA;
+ typedef typename Get_functor<Exact_kernel, T>::type FE;
+ typedef Filtered_predicate2<FE,FA,C2E,C2A> type;
+ };
+ template<class T,class D> struct Functor<T,D,Compute_tag> {
+ typedef typename Get_functor<Approximate_kernel, T>::type FA;
+ typedef typename Get_functor<Exact_kernel, T>::type FE;
+ typedef Lazy_construction_nt<Kernel,FA,FE> type;
+ };
+ template<class T,class D> struct Functor<T,D,Construct_tag> {
+ typedef typename Get_functor<Approximate_kernel, T>::type FA;
+ typedef typename Get_functor<Exact_kernel, T>::type FE;
+ typedef Lazy_construction<Kernel,FA,FE> type;
+ };
+
+ //typedef typename Iterator<Point_cartesian_const_iterator_tag>::type Point_cartesian_const_iterator;
+ //typedef typename Iterator<Vector_cartesian_const_iterator_tag>::type Vector_cartesian_const_iterator;
+
+ template<class U>
+ struct Construct_iter : private Store_kernel<Kernel> {
+ Construct_iter(){}
+ Construct_iter(Kernel const&k):Store_kernel<Kernel>(k){}
+ //FIXME: pass the kernel to the functor in the iterator
+ typedef U result_type;
+ template<class T>
+ result_type operator()(T const& t,Begin_tag)const{
+ return result_type(t,0,this->kernel());
+ }
+ template<class T>
+ result_type operator()(T const& t,End_tag)const{
+ return result_type(t,Self().dimension(),this->kernel());
+ }
+ };
+ template<class T,class D> struct Functor<T,D,Construct_iterator_tag> {
+ typedef Construct_iter<typename Base::template Iterator<typename map_result_tag<T>::type>::type> type;
+ };
+
+
+ //TODO: what about other functors of the Misc category?
+ // for Point_dimension, we should apply it to the approximate point
+ // for printing, we should??? just not do printing this way?
+};
+
+
+} //namespace CGAL
+
+#endif // CGAL_KERNEL_D_LAZY_CARTESIAN_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Types/Aff_transformation.h b/include/gudhi_patches/CGAL/NewKernel_d/Types/Aff_transformation.h
new file mode 100644
index 00000000..6d9f070f
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Types/Aff_transformation.h
@@ -0,0 +1,59 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KD_TYPE_AFF_TRANSFORMATION_H
+#define CGAL_KD_TYPE_AFF_TRANSFORMATION_H
+#include <CGAL/config.h>
+#include <CGAL/NewKernel_d/store_kernel.h>
+#include <boost/preprocessor/repetition.hpp>
+
+// Dummy, that's all the Kernel_d concept requires, so a useful class will wait.
+
+namespace CGAL {
+template<class R_>
+struct Aff_transformation {
+ typedef R_ R;
+};
+namespace CartesianDKernelFunctors {
+template<class R_> struct Construct_aff_transformation {
+ CGAL_FUNCTOR_INIT_IGNORE(Construct_aff_transformation)
+ typedef R_ R;
+ typedef typename Get_type<R, Aff_transformation_tag>::type result_type;
+#ifdef CGAL_CXX11
+ template<class...T>
+ result_type operator()(T&&...)const{return result_type();}
+#else
+ result_type operator()()const{
+ return result_type();
+ }
+#define CGAL_CODE(Z,N,_) template<BOOST_PP_ENUM_PARAMS(N,class U)> \
+ result_type operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,U,const& BOOST_PP_INTERCEPT))const{ \
+ return result_type(); \
+ }
+ BOOST_PP_REPEAT_FROM_TO(1, 9, CGAL_CODE, _ )
+#undef CGAL_CODE
+
+#endif
+};
+}
+CGAL_KD_DEFAULT_TYPE(Aff_transformation_tag,(CGAL::Aff_transformation<K>),(),());
+CGAL_KD_DEFAULT_FUNCTOR(Construct_ttag<Aff_transformation_tag>,(CartesianDKernelFunctors::Construct_aff_transformation<K>),(Aff_transformation_tag),());
+
+}
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Types/Hyperplane.h b/include/gudhi_patches/CGAL/NewKernel_d/Types/Hyperplane.h
new file mode 100644
index 00000000..14e35b01
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Types/Hyperplane.h
@@ -0,0 +1,159 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KD_TYPE_HYPERPLANE_H
+#define CGAL_KD_TYPE_HYPERPLANE_H
+#include <CGAL/enum.h>
+#include <CGAL/number_utils.h>
+#include <CGAL/NewKernel_d/store_kernel.h>
+#include <boost/iterator/transform_iterator.hpp>
+#include <boost/iterator/counting_iterator.hpp>
+namespace CGAL {
+template <class R_> class Hyperplane {
+ typedef typename Get_type<R_, FT_tag>::type FT_;
+ typedef typename Get_type<R_, Vector_tag>::type Vector_;
+ Vector_ v_;
+ FT_ s_;
+
+ public:
+ Hyperplane(Vector_ const&v, FT_ const&s): v_(v), s_(s) {}
+ // TODO: Add a piecewise constructor?
+
+ Vector_ const& orthogonal_vector()const{return v_;}
+ FT_ translation()const{return s_;}
+};
+namespace CartesianDKernelFunctors {
+template <class R_> struct Construct_hyperplane : Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Construct_hyperplane)
+ typedef typename Get_type<R_, Hyperplane_tag>::type result_type;
+ typedef typename Get_type<R_, Point_tag>::type Point;
+ typedef typename Get_type<R_, Vector_tag>::type Vector;
+ typedef typename Get_type<R_, FT_tag>::type FT;
+ private:
+ struct One {
+ typedef int result_type;
+ template<class T>int const& operator()(T const&)const{
+ static const int one = 1;
+ return one;
+ }
+ };
+ public:
+
+ result_type operator()(Vector const&a, FT const&b)const{
+ return result_type(a,b);
+ }
+ // Not really needed
+ result_type operator()()const{
+ typename Get_functor<R_, Construct_ttag<Vector_tag> >::type cv(this->kernel());
+ return result_type(cv(),0);
+ }
+
+ template <class Iter>
+ result_type through(Iter f, Iter e)const{
+ typedef typename R_::LA LA;
+ typedef typename R_::Default_ambient_dimension D1;
+ typedef typename R_::Max_ambient_dimension D2;
+ typedef typename Increment_dimension<D1>::type D1i;
+ typedef typename Increment_dimension<D2>::type D2i;
+
+ typedef Eigen::Matrix<FT, Eigen_dimension<D1>::value, Eigen_dimension<D1i>::value,
+ Eigen::ColMajor|Eigen::AutoAlign, Eigen_dimension<D2>::value, Eigen_dimension<D2i>::value> Matrix;
+ typedef Eigen::Matrix<FT, Eigen_dimension<D1i>::value, 1,
+ Eigen::ColMajor|Eigen::AutoAlign, Eigen_dimension<D2i>::value, 1> Vec;
+ typename Get_functor<R_, Compute_point_cartesian_coordinate_tag>::type c(this->kernel());
+ typename Get_functor<R_, Construct_ttag<Vector_tag> >::type cv(this->kernel());
+ typename Get_functor<R_, Point_dimension_tag>::type pd(this->kernel());
+
+ Point const& p0=*f;
+ int d = pd(p0);
+ Matrix m(d,d+1);
+ for(int j=0;j<d;++j)
+ m(0,j)=c(p0,j);
+ // Write the point coordinates in lines.
+ int i;
+ for (i=1; ++f!=e; ++i) {
+ Point const& p=*f;
+ for(int j=0;j<d;++j)
+ m(i,j)=c(p,j);
+ }
+ CGAL_assertion (i == d);
+ for(i=0;i<d;++i)
+ m(i,d)=-1;
+ Eigen::FullPivLU<Matrix> lu(m);
+ Vec res = lu.kernel().col(0);
+ return this->operator()(cv(d,LA::vector_begin(res),LA::vector_end(res)-1),res(d));
+ }
+ template <class Iter>
+ result_type operator()(Iter f, Iter e, Point const&p, CGAL::Oriented_side s=ON_ORIENTED_BOUNDARY)const{
+ result_type ret = through(f, e);
+ // I don't really like using ON_ORIENTED_BOUNDARY to mean that we don't care, we might as well not pass 'p' at all.
+ if (s == ON_ORIENTED_BOUNDARY)
+ return ret;
+ typename Get_functor<R_, Oriented_side_tag>::type os(this->kernel());
+ CGAL::Oriented_side o = os(ret, p);
+ if (o == ON_ORIENTED_BOUNDARY || o == s)
+ return ret;
+ typename Get_functor<R_, Opposite_vector_tag>::type ov(this->kernel());
+ typename Get_functor<R_, Construct_ttag<Vector_tag> >::type cv(this->kernel());
+ return this->operator()(ov(ret.orthogonal_vector()), -ret.translation());
+ }
+};
+template <class R_> struct Orthogonal_vector {
+ CGAL_FUNCTOR_INIT_IGNORE(Orthogonal_vector)
+ typedef typename Get_type<R_, Hyperplane_tag>::type Hyperplane;
+ typedef typename Get_type<R_, Vector_tag>::type const& result_type;
+ result_type operator()(Hyperplane const&s)const{
+ return s.orthogonal_vector();
+ }
+};
+template <class R_> struct Hyperplane_translation {
+ CGAL_FUNCTOR_INIT_IGNORE(Hyperplane_translation)
+ typedef typename Get_type<R_, Hyperplane_tag>::type Hyperplane;
+ typedef typename Get_type<R_, FT_tag>::type result_type;
+ // TODO: Is_exact?
+ result_type operator()(Hyperplane const&s)const{
+ return s.translation();
+ }
+};
+template <class R_> struct Value_at : Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Value_at)
+ typedef typename Get_type<R_, Hyperplane_tag>::type Hyperplane;
+ typedef typename Get_type<R_, Vector_tag>::type Vector;
+ typedef typename Get_type<R_, Point_tag>::type Point;
+ typedef typename Get_type<R_, FT_tag>::type FT;
+ typedef FT result_type;
+ typedef typename Get_functor<R_, Scalar_product_tag>::type Dot;
+ typedef typename Get_functor<R_, Point_to_vector_tag>::type P2V;
+ result_type operator()(Hyperplane const&h, Point const&p)const{
+ Dot dot(this->kernel());
+ P2V p2v(this->kernel());
+ return dot(h.orthogonal_vector(),p2v(p));
+ // Use Orthogonal_vector to make it generic?
+ // Copy the code from Scalar_product to avoid p2v?
+ }
+};
+}
+//TODO: Add a condition that the hyperplane type is the one from this file.
+CGAL_KD_DEFAULT_TYPE(Hyperplane_tag,(CGAL::Hyperplane<K>),(Vector_tag),());
+CGAL_KD_DEFAULT_FUNCTOR(Construct_ttag<Hyperplane_tag>,(CartesianDKernelFunctors::Construct_hyperplane<K>),(Vector_tag,Hyperplane_tag),(Opposite_vector_tag,Oriented_side_tag));
+CGAL_KD_DEFAULT_FUNCTOR(Orthogonal_vector_tag,(CartesianDKernelFunctors::Orthogonal_vector<K>),(Vector_tag,Hyperplane_tag),());
+CGAL_KD_DEFAULT_FUNCTOR(Hyperplane_translation_tag,(CartesianDKernelFunctors::Hyperplane_translation<K>),(Hyperplane_tag),());
+CGAL_KD_DEFAULT_FUNCTOR(Value_at_tag,(CartesianDKernelFunctors::Value_at<K>),(Point_tag,Vector_tag,Hyperplane_tag),(Scalar_product_tag,Point_to_vector_tag));
+} // namespace CGAL
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Types/Iso_box.h b/include/gudhi_patches/CGAL/NewKernel_d/Types/Iso_box.h
new file mode 100644
index 00000000..d053f351
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Types/Iso_box.h
@@ -0,0 +1,88 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KERNELD_TYPES_ISO_BOX_H
+#define CGAL_KERNELD_TYPES_ISO_BOX_H
+#include <utility>
+#include <CGAL/basic.h>
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/Kernel/mpl.h>
+#include <CGAL/transforming_pair_iterator.h>
+namespace CGAL {
+template <class R_> class Iso_box {
+ typedef typename Get_type<R_, FT_tag>::type FT_;
+ typedef typename Get_type<R_, Point_tag>::type Point_;
+ typedef std::pair<Point_,Point_> Data_;
+ Data_ data;
+ public:
+ Iso_box(){}
+ Iso_box(Point_ const&a, Point_ const&b): data(a,b) {}
+ Point_ min BOOST_PREVENT_MACRO_SUBSTITUTION ()const{
+ return data.first;
+ }
+ Point_ max BOOST_PREVENT_MACRO_SUBSTITUTION ()const{
+ return data.second;
+ }
+};
+namespace CartesianDKernelFunctors {
+ template <class R_> struct Construct_iso_box : Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Construct_iso_box)
+ typedef typename Get_type<R_, Iso_box_tag>::type result_type;
+ typedef typename Get_type<R_, RT_tag>::type RT;
+ typedef typename Get_type<R_, Point_tag>::type Point;
+ typedef typename Get_functor<R_, Construct_ttag<Point_tag> >::type Cp_;
+ typedef typename Get_functor<R_, Construct_ttag<Point_cartesian_const_iterator_tag> >::type Ci_;
+ result_type operator()(Point const&a, Point const&b)const{
+ Cp_ cp(this->kernel());
+ Ci_ ci(this->kernel());
+ return result_type(cp(
+ make_transforming_pair_iterator(ci(a,Begin_tag()), ci(b,Begin_tag()), Min<RT>()),
+ make_transforming_pair_iterator(ci(a,End_tag()), ci(b,End_tag()), Min<RT>())),
+ cp(
+ make_transforming_pair_iterator(ci(a,Begin_tag()), ci(b,Begin_tag()), Max<RT>()),
+ make_transforming_pair_iterator(ci(a,End_tag()), ci(b,End_tag()), Max<RT>())));
+ }
+ };
+
+ template <class R_> struct Construct_min_vertex {
+ CGAL_FUNCTOR_INIT_IGNORE(Construct_min_vertex)
+ typedef typename Get_type<R_, Iso_box_tag>::type argument_type;
+ //TODO: make result_type a reference
+ typedef typename Get_type<R_, Point_tag>::type result_type;
+ result_type operator()(argument_type const&b)const{
+ return b.min BOOST_PREVENT_MACRO_SUBSTITUTION ();
+ }
+ };
+ template <class R_> struct Construct_max_vertex {
+ CGAL_FUNCTOR_INIT_IGNORE(Construct_max_vertex)
+ typedef typename Get_type<R_, Iso_box_tag>::type argument_type;
+ typedef typename Get_type<R_, Point_tag>::type result_type;
+ result_type operator()(argument_type const&b)const{
+ return b.max BOOST_PREVENT_MACRO_SUBSTITUTION ();
+ }
+ };
+}
+//TODO (other types as well) only enable these functors if the Iso_box type is the one defined in this file...
+CGAL_KD_DEFAULT_TYPE(Iso_box_tag,(CGAL::Iso_box<K>),(Point_tag),());
+CGAL_KD_DEFAULT_FUNCTOR(Construct_ttag<Iso_box_tag>,(CartesianDKernelFunctors::Construct_iso_box<K>),(Iso_box_tag,Point_tag),(Construct_ttag<Point_cartesian_const_iterator_tag>,Construct_ttag<Point_tag>));
+CGAL_KD_DEFAULT_FUNCTOR(Construct_min_vertex_tag,(CartesianDKernelFunctors::Construct_min_vertex<K>),(Iso_box_tag),());
+CGAL_KD_DEFAULT_FUNCTOR(Construct_max_vertex_tag,(CartesianDKernelFunctors::Construct_max_vertex<K>),(Iso_box_tag),());
+} // namespace CGAL
+
+#endif // CGAL_KERNELD_TYPES_ISO_BOX_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Types/Line.h b/include/gudhi_patches/CGAL/NewKernel_d/Types/Line.h
new file mode 100644
index 00000000..6a09571c
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Types/Line.h
@@ -0,0 +1,66 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KERNELD_TYPES_LINE_H
+#define CGAL_KERNELD_TYPES_LINE_H
+#include <utility>
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/Kernel/mpl.h>
+namespace CGAL {
+template <class R_> class Line {
+ typedef typename Get_type<R_, FT_tag>::type FT_;
+ typedef typename Get_type<R_, Point_tag>::type Point_;
+ typedef std::pair<Point_,Point_> Data_;
+ Data_ data;
+ public:
+ Line(){}
+ Line(Point_ const&a, Point_ const&b): data(a,b) {}
+ Point_ point(int i)const{
+ if(i==0) return data.first;
+ if(i==1) return data.second;
+ throw "not implemented";
+ }
+ Line opposite()const{
+ return Line(data.second,data.first);
+ }
+};
+namespace CartesianDKernelFunctors {
+ template <class R_> struct Construct_line : Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Construct_line)
+ typedef typename Get_type<R_, Line_tag>::type result_type;
+ typedef typename Get_type<R_, Point_tag>::type Point;
+ typedef typename Get_type<R_, Vector_tag>::type Vector;
+ typedef typename Get_functor<R_, Translated_point_tag>::type Tp_;
+ //typedef typename Get_functor<R_, Difference_of_points_tag>::type Dp_;
+ //typedef typename Get_functor<R_, Scaled_vector_tag>::type Sv_;
+ result_type operator()(Point const&a, Point const&b)const{
+ return result_type(a,b);
+ }
+ result_type operator()(Point const&a, typename First_if_different<Vector,Point>::Type const&b)const{
+ Tp_ tp(this->kernel());
+ return result_type(a,tp(a,b));
+ }
+ };
+}
+CGAL_KD_DEFAULT_TYPE(Line_tag,(CGAL::Line<K>),(Point_tag),());
+CGAL_KD_DEFAULT_FUNCTOR(Construct_ttag<Line_tag>,(CartesianDKernelFunctors::Construct_line<K>),(Line_tag,Point_tag,Vector_tag),(Translated_point_tag));
+
+} // namespace CGAL
+
+#endif // CGAL_KERNELD_TYPES_LINE_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Types/Ray.h b/include/gudhi_patches/CGAL/NewKernel_d/Types/Ray.h
new file mode 100644
index 00000000..be845e76
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Types/Ray.h
@@ -0,0 +1,66 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KERNELD_TYPES_RAY_H
+#define CGAL_KERNELD_TYPES_RAY_H
+#include <utility>
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/Kernel/mpl.h>
+namespace CGAL {
+template <class R_> class Ray {
+ typedef typename Get_type<R_, FT_tag>::type FT_;
+ typedef typename Get_type<R_, Point_tag>::type Point_;
+ typedef typename Get_type<R_, Vector_tag>::type Vector_;
+ typedef std::pair<Point_,Vector_> Data_;
+ Data_ data;
+ public:
+ Ray(){}
+ Ray(Point_ const&a, Vector_ const&b): data(a,b) {}
+ Point_ source()const{
+ return data.first;
+ }
+ // FIXME: return a R_::Direction?
+ Vector_ direction()const{
+ return data.second;
+ }
+};
+namespace CartesianDKernelFunctors {
+ template <class R_> struct Construct_ray : Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Construct_ray)
+ typedef typename Get_type<R_, Ray_tag>::type result_type;
+ typedef typename Get_type<R_, Point_tag>::type Point;
+ typedef typename Get_type<R_, Vector_tag>::type Vector;
+ typedef typename Get_functor<R_, Difference_of_points_tag>::type Dp_;
+ //typedef typename Get_functor<R_, Translated_point_tag>::type Tp_;
+ //typedef typename Get_functor<R_, Scaled_vector_tag>::type Sv_;
+ result_type operator()(Point const&a, Vector const&b)const{
+ return result_type(a,b);
+ }
+ result_type operator()(Point const&a, typename First_if_different<Point,Vector>::Type const&b)const{
+ Dp_ dp(this->kernel());
+ return result_type(a,dp(b,a));
+ }
+ };
+}
+CGAL_KD_DEFAULT_TYPE(Ray_tag,(CGAL::Ray<K>),(Point_tag,Vector_tag),());
+CGAL_KD_DEFAULT_FUNCTOR(Construct_ttag<Ray_tag>,(CartesianDKernelFunctors::Construct_ray<K>),(Point_tag,Ray_tag,Vector_tag),(Difference_of_points_tag));
+
+} // namespace CGAL
+
+#endif // CGAL_KERNELD_TYPES_RAY_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Types/Segment.h b/include/gudhi_patches/CGAL/NewKernel_d/Types/Segment.h
new file mode 100644
index 00000000..38361c2b
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Types/Segment.h
@@ -0,0 +1,121 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KERNELD_SEGMENTD_H
+#define CGAL_KERNELD_SEGMENTD_H
+#include <CGAL/config.h>
+#include <utility>
+#include <CGAL/NewKernel_d/functor_tags.h>
+namespace CGAL {
+template <class R_> class Segment {
+ typedef typename Get_type<R_, FT_tag>::type FT_;
+ typedef typename Get_type<R_, Point_tag>::type Point_;
+ //typedef typename R_::Vector Vector_;
+ //typedef typename Get_functor<R_, Construct_ttag<Vector_tag> >::type Cv_;
+// typedef typename R_::Squared_distance Csd_;
+ typedef std::pair<Point_,Point_> Data_;
+ Data_ data;
+ public:
+ //typedef Segmentd<R_> Segment;
+#ifdef CGAL_CXX11
+ //FIXME: don't forward directly, piecewise_constuct should call the point construction functor (I guess? or is it unnecessary?)
+ template<class...U,class=typename std::enable_if<!std::is_same<std::tuple<typename std::decay<U>::type...>,std::tuple<Segment>>::value>::type>
+ Segment(U&&...u):data(std::forward<U>(u)...){}
+#else
+ Segment(){}
+ Segment(Point_ const&a, Point_ const&b): data(a,b) {}
+ //template<class A,class T1,class T2>
+ //Segment(A const&,T1 const&t1,T2 const&t2)
+#endif
+ Point_ source()const{return data.first;}
+ Point_ target()const{return data.second;}
+ Point_ operator[](int i)const{
+ if((i%2)==0)
+ return source();
+ else
+ return target();
+ }
+ Segment opposite()const{
+ return Segment(target(),source());
+ }
+ //Vector_ vector()const{
+ // return Cv_()(data.first,data.second);
+ //}
+// FT_ squared_length()const{
+// return Csd_()(data.first,data.second);
+// }
+};
+
+namespace CartesianDKernelFunctors {
+
+template<class R_> struct Construct_segment : Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Construct_segment)
+ typedef R_ R;
+ typedef typename Get_type<R_, Point_tag>::type Point;
+ typedef typename Get_type<R_, Segment_tag>::type Segment;
+ typedef typename Get_functor<R_, Construct_ttag<Point_tag> >::type CP;
+ typedef Segment result_type;
+ result_type operator()(Point const&a, Point const&b)const{
+ return result_type(a,b);
+ }
+ // Not really needed, especially since it forces us to store the kernel
+ result_type operator()()const{
+ Point p = typename Get_functor<R_, Construct_ttag<Point_tag> >::type (this->kernel()) ();
+ return result_type (p, p);
+ }
+ // T should only be std::piecewise_construct_t, but we shouldn't fail if it doesn't exist.
+ template<class T,class U,class V>
+ result_type operator()(CGAL_FORWARDABLE(T),CGAL_FORWARDABLE(U) u,CGAL_FORWARDABLE(V) v)const{
+ CP cp(this->kernel());
+ result_type r = {{
+ call_on_tuple_elements<Point>(cp, CGAL_FORWARD(U,u)),
+ call_on_tuple_elements<Point>(cp, CGAL_FORWARD(V,v)) }};
+ return r;
+ }
+};
+
+// This should be part of Construct_point, according to Kernel_23 conventions
+template<class R_> struct Segment_extremity {
+ CGAL_FUNCTOR_INIT_IGNORE(Segment_extremity)
+ typedef R_ R;
+ typedef typename Get_type<R_, Point_tag>::type Point;
+ typedef typename Get_type<R_, Segment_tag>::type Segment;
+ typedef Point result_type;
+ result_type operator()(Segment const&s, int i)const{
+ if(i==0) return s.source();
+ CGAL_assertion(i==1);
+ return s.target();
+ }
+#ifdef CGAL_CXX11
+ result_type operator()(Segment &&s, int i)const{
+ if(i==0) return std::move(s.source());
+ CGAL_assertion(i==1);
+ return std::move(s.target());
+ }
+#endif
+};
+} // CartesianDKernelFunctors
+
+CGAL_KD_DEFAULT_TYPE(Segment_tag,(CGAL::Segment<K>),(Point_tag),());
+CGAL_KD_DEFAULT_FUNCTOR(Construct_ttag<Segment_tag>,(CartesianDKernelFunctors::Construct_segment<K>),(Segment_tag,Point_tag),(Construct_ttag<Point_tag>));
+CGAL_KD_DEFAULT_FUNCTOR(Segment_extremity_tag,(CartesianDKernelFunctors::Segment_extremity<K>),(Segment_tag,Point_tag),());
+
+} // namespace CGAL
+
+#endif // CGAL_KERNELD_SEGMENTD_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Types/Sphere.h b/include/gudhi_patches/CGAL/NewKernel_d/Types/Sphere.h
new file mode 100644
index 00000000..114410b4
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Types/Sphere.h
@@ -0,0 +1,132 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KD_TYPE_SPHERE_H
+#define CGAL_KD_TYPE_SPHERE_H
+#include <CGAL/NewKernel_d/store_kernel.h>
+#include <boost/iterator/counting_iterator.hpp>
+namespace CGAL {
+template <class R_> class Sphere {
+ typedef typename Get_type<R_, FT_tag>::type FT_;
+ typedef typename Get_type<R_, Point_tag>::type Point_;
+ Point_ c_;
+ FT_ r2_;
+
+ public:
+ Sphere(Point_ const&p, FT_ const&r2): c_(p), r2_(r2) {}
+ // TODO: Add a piecewise constructor?
+
+ Point_ const& center()const{return c_;}
+ FT_ const& squared_radius()const{return r2_;}
+};
+
+namespace CartesianDKernelFunctors {
+template <class R_> struct Construct_sphere : Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Construct_sphere)
+ typedef typename Get_type<R_, Sphere_tag>::type result_type;
+ typedef typename Get_type<R_, Point_tag>::type Point;
+ typedef typename Get_type<R_, FT_tag>::type FT;
+ result_type operator()(Point const&a, FT const&b)const{
+ return result_type(a,b);
+ }
+ // Not really needed
+ result_type operator()()const{
+ typename Get_functor<R_, Construct_ttag<Point_tag> >::type cp(this->kernel());
+ return result_type(cp(),0);
+ }
+ template <class Iter>
+ result_type operator()(Iter f, Iter e)const{
+ typename Get_functor<R_, Construct_circumcenter_tag>::type cc(this->kernel());
+ typename Get_functor<R_, Squared_distance_tag>::type sd(this->kernel());
+
+ // It should be possible to avoid copying the center by moving this code to a constructor.
+ Point center = cc(f, e);
+ FT const& r2 = sd(center, *f);
+ return this->operator()(CGAL_MOVE(center), r2);
+ }
+};
+
+template <class R_> struct Center_of_sphere : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Center_of_sphere)
+ typedef typename Get_type<R_, Sphere_tag>::type Sphere;
+ // No reference because of the second overload
+ typedef typename Get_type<R_, Point_tag>::type result_type;
+
+ result_type const& operator()(Sphere const&s)const{
+ return s.center();
+ }
+
+ template<class Iter>
+ result_type operator()(Iter b, Iter e)const{
+ typename Get_functor<R_, Construct_ttag<Sphere_tag> >::type cs(this->kernel());
+ return operator()(cs(b,e)); // computes the radius needlessly
+ }
+};
+
+template <class R_> struct Squared_radius {
+ CGAL_FUNCTOR_INIT_IGNORE(Squared_radius)
+ typedef typename Get_type<R_, Sphere_tag>::type Sphere;
+ typedef typename Get_type<R_, FT_tag>::type const& result_type;
+ // TODO: Is_exact?
+ result_type operator()(Sphere const&s)const{
+ return s.squared_radius();
+ }
+};
+
+// FIXME: Move it to the generic functors, using the two above and conditional to the existence of sqrt(FT)
+template<class R_> struct Point_of_sphere : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Point_of_sphere)
+ typedef R_ R;
+ typedef typename Get_type<R, FT_tag>::type FT;
+ typedef typename Get_type<R, RT_tag>::type RT;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_type<R, Sphere_tag>::type Sphere;
+ typedef typename Get_functor<R, Construct_ttag<Point_tag> >::type CP;
+ typedef typename Get_functor<R, Construct_ttag<Point_cartesian_const_iterator_tag> >::type CI;
+ typedef typename Get_functor<R, Point_dimension_tag>::type PD;
+ typedef Point result_type;
+ typedef Sphere first_argument_type;
+ typedef int second_argument_type;
+ struct Trans : std::binary_function<FT,int,FT> {
+ FT const& r_; int idx; bool sgn;
+ Trans (int n, FT const& r, bool b) : r_(r), idx(n), sgn(b) {}
+ FT operator()(FT const&x, int i)const{
+ return (i == idx) ? sgn ? x + r_ : x - r_ : x;
+ }
+ };
+ result_type operator()(Sphere const&s, int i)const{
+ CI ci(this->kernel());
+ PD pd(this->kernel());
+ typedef boost::counting_iterator<int,std::random_access_iterator_tag> Count;
+ Point const&c = s.center();
+ int d=pd(c);
+ bool last = (i == d);
+ FT r = sqrt(s.squared_radius());
+ Trans t(last ? 0 : i, r, !last);
+ return CP(this->kernel())(make_transforming_pair_iterator(ci(c,Begin_tag()),Count(0),t),make_transforming_pair_iterator(ci(c,End_tag()),Count(d),t));
+ }
+};
+}
+CGAL_KD_DEFAULT_TYPE(Sphere_tag,(CGAL::Sphere<K>),(Point_tag),());
+CGAL_KD_DEFAULT_FUNCTOR(Construct_ttag<Sphere_tag>,(CartesianDKernelFunctors::Construct_sphere<K>),(Sphere_tag,Point_tag),(Construct_ttag<Point_tag>,Compute_point_cartesian_coordinate_tag,Squared_distance_tag,Squared_distance_to_origin_tag,Point_dimension_tag));
+CGAL_KD_DEFAULT_FUNCTOR(Center_of_sphere_tag,(CartesianDKernelFunctors::Center_of_sphere<K>),(Sphere_tag,Point_tag),(Construct_ttag<Sphere_tag>));
+CGAL_KD_DEFAULT_FUNCTOR(Squared_radius_tag,(CartesianDKernelFunctors::Squared_radius<K>),(Sphere_tag),());
+CGAL_KD_DEFAULT_FUNCTOR(Point_of_sphere_tag,(CartesianDKernelFunctors::Point_of_sphere<K>),(Sphere_tag,Point_tag),(Construct_ttag<Point_tag>, Construct_ttag<Point_cartesian_const_iterator_tag>));
+} // namespace CGAL
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Types/Weighted_point.h b/include/gudhi_patches/CGAL/NewKernel_d/Types/Weighted_point.h
new file mode 100644
index 00000000..1caf8701
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Types/Weighted_point.h
@@ -0,0 +1,205 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KD_TYPE_WP_H
+#define CGAL_KD_TYPE_WP_H
+#include <CGAL/NewKernel_d/store_kernel.h>
+#include <boost/iterator/counting_iterator.hpp>
+namespace CGAL {
+namespace KerD {
+template <class R_> class Weighted_point {
+ typedef typename Get_type<R_, FT_tag>::type FT_;
+ typedef typename Get_type<R_, Point_tag>::type Point_;
+ Point_ c_;
+ FT_ w_;
+
+ public:
+ Weighted_point(Point_ const&p, FT_ const&w): c_(p), w_(w) {}
+ // TODO: Add a piecewise constructor?
+
+ Point_ const& point()const{return c_;}
+ FT_ const& weight()const{return w_;}
+};
+}
+
+namespace CartesianDKernelFunctors {
+template <class R_> struct Construct_weighted_point : Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Construct_weighted_point)
+ typedef typename Get_type<R_, Weighted_point_tag>::type result_type;
+ typedef typename Get_type<R_, Point_tag>::type Point;
+ typedef typename Get_type<R_, FT_tag>::type FT;
+ result_type operator()(Point const&a, FT const&b)const{
+ return result_type(a,b);
+ }
+ // Not really needed
+ result_type operator()()const{
+ typename Get_functor<R_, Construct_ttag<Point_tag> >::type cp(this->kernel());
+ return result_type(cp(),0);
+ }
+};
+
+template <class R_> struct Point_drop_weight {
+ CGAL_FUNCTOR_INIT_IGNORE(Point_drop_weight)
+ typedef typename Get_type<R_, Weighted_point_tag>::type argument_type;
+ typedef typename Get_type<R_, Point_tag>::type const& result_type;
+ // Returning a reference is fragile
+
+ result_type operator()(argument_type const&s)const{
+ return s.point();
+ }
+};
+
+template <class R_> struct Point_weight {
+ CGAL_FUNCTOR_INIT_IGNORE(Point_weight)
+ typedef typename Get_type<R_, Weighted_point_tag>::type argument_type;
+ typedef typename Get_type<R_, FT_tag>::type result_type;
+
+ result_type operator()(argument_type const&s)const{
+ return s.weight();
+ }
+};
+
+template <class R_> struct Power_distance : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Power_distance)
+ typedef typename Get_type<R_, Weighted_point_tag>::type first_argument_type;
+ typedef first_argument_type second_argument_type;
+ typedef typename Get_type<R_, FT_tag>::type result_type;
+
+ result_type operator()(first_argument_type const&a, second_argument_type const&b)const{
+ typename Get_functor<R_, Point_drop_weight_tag>::type pdw(this->kernel());
+ typename Get_functor<R_, Point_weight_tag>::type pw(this->kernel());
+ typename Get_functor<R_, Squared_distance_tag>::type sd(this->kernel());
+ return sd(pdw(a),pdw(b))-pw(a)-pw(b);
+ }
+};
+template <class R_> struct Power_distance_to_point : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Power_distance_to_point)
+ typedef typename Get_type<R_, Weighted_point_tag>::type first_argument_type;
+ typedef typename Get_type<R_, Point_tag>::type second_argument_type;
+ typedef typename Get_type<R_, FT_tag>::type result_type;
+
+ result_type operator()(first_argument_type const&a, second_argument_type const&b)const{
+ typename Get_functor<R_, Point_drop_weight_tag>::type pdw(this->kernel());
+ typename Get_functor<R_, Point_weight_tag>::type pw(this->kernel());
+ typename Get_functor<R_, Squared_distance_tag>::type sd(this->kernel());
+ return sd(pdw(a),b)-pw(a);
+ }
+};
+
+template<class R_> struct Power_side_of_power_sphere : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Power_side_of_power_sphere)
+ typedef R_ R;
+ typedef typename Get_type<R, Oriented_side_tag>::type result_type;
+
+ template<class Iter, class Pt>
+ result_type operator()(Iter const& f, Iter const& e, Pt const& p0) const {
+ typename Get_functor<R, Power_side_of_power_sphere_raw_tag>::type ptr(this->kernel());
+ typename Get_functor<R, Point_drop_weight_tag>::type pdw(this->kernel());
+ typename Get_functor<R, Point_weight_tag>::type pw(this->kernel());
+ return ptr (
+ make_transforming_iterator (f, pdw),
+ make_transforming_iterator (e, pdw),
+ make_transforming_iterator (f, pw),
+ pdw (p0),
+ pw (p0));
+ }
+};
+
+template<class R_> struct In_flat_power_side_of_power_sphere : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(In_flat_power_side_of_power_sphere)
+ typedef R_ R;
+ typedef typename Get_type<R, Oriented_side_tag>::type result_type;
+
+ template<class Fo, class Iter, class Pt>
+ result_type operator()(Fo const& fo, Iter const& f, Iter const& e, Pt const& p0) const {
+ typename Get_functor<R, In_flat_power_side_of_power_sphere_raw_tag>::type ptr(this->kernel());
+ typename Get_functor<R, Point_drop_weight_tag>::type pdw(this->kernel());
+ typename Get_functor<R, Point_weight_tag>::type pw(this->kernel());
+ return ptr (
+ fo,
+ make_transforming_iterator (f, pdw),
+ make_transforming_iterator (e, pdw),
+ make_transforming_iterator (f, pw),
+ pdw (p0),
+ pw (p0));
+ }
+};
+
+// Construct a point at (weighted) distance 0 from all the input
+template <class R_> struct Power_center : Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Power_center)
+ typedef typename Get_type<R_, Weighted_point_tag>::type WPoint;
+ typedef WPoint result_type;
+ typedef typename Get_type<R_, Point_tag>::type Point;
+ typedef typename Get_type<R_, FT_tag>::type FT;
+ template <class Iter>
+ result_type operator()(Iter f, Iter e)const{
+ // 2*(x-y).c == (x^2-wx^2)-(y^2-wy^2)
+ typedef typename R_::LA LA;
+ typedef typename LA::Square_matrix Matrix;
+ typedef typename LA::Vector Vec;
+ typedef typename LA::Construct_vector CVec;
+ typename Get_functor<R_, Compute_point_cartesian_coordinate_tag>::type c(this->kernel());
+ typename Get_functor<R_, Construct_ttag<Point_tag> >::type cp(this->kernel());
+ typename Get_functor<R_, Point_dimension_tag>::type pd(this->kernel());
+ typename Get_functor<R_, Squared_distance_to_origin_tag>::type sdo(this->kernel());
+ typename Get_functor<R_, Power_distance_to_point_tag>::type pdp(this->kernel());
+ typename Get_functor<R_, Point_drop_weight_tag>::type pdw(this->kernel());
+ typename Get_functor<R_, Point_weight_tag>::type pw(this->kernel());
+ typename Get_functor<R_, Construct_ttag<Weighted_point_tag> >::type cwp(this->kernel());
+
+ WPoint const& wp0 = *f;
+ Point const& p0 = pdw(wp0);
+ int d = pd(p0);
+ FT const& n0 = sdo(p0) - pw(wp0);
+ Matrix m(d,d);
+ Vec b = typename CVec::Dimension()(d);
+ // Write the point coordinates in lines.
+ int i;
+ for(i=0; ++f!=e; ++i) {
+ WPoint const& wp=*f;
+ Point const& p=pdw(wp);
+ FT const& np = sdo(p) - pw(wp);
+ for(int j=0;j<d;++j) {
+ m(i,j)=2*(c(p,j)-c(p0,j));
+ b[i] = np - n0;
+ }
+ }
+ CGAL_assertion (i == d);
+ Vec res = typename CVec::Dimension()(d);;
+ //std::cout << "Mat: " << m << "\n Vec: " << one << std::endl;
+ LA::solve(res, CGAL_MOVE(m), CGAL_MOVE(b));
+ //std::cout << "Sol: " << res << std::endl;
+ Point center = cp(d,LA::vector_begin(res),LA::vector_end(res));
+ FT const& r2 = pdp (wp0, center);
+ return cwp(CGAL_MOVE(center), r2);
+ }
+};
+}
+CGAL_KD_DEFAULT_TYPE(Weighted_point_tag,(CGAL::KerD::Weighted_point<K>),(Point_tag),());
+CGAL_KD_DEFAULT_FUNCTOR(Construct_ttag<Weighted_point_tag>,(CartesianDKernelFunctors::Construct_weighted_point<K>),(Weighted_point_tag,Point_tag),());
+CGAL_KD_DEFAULT_FUNCTOR(Point_drop_weight_tag,(CartesianDKernelFunctors::Point_drop_weight<K>),(Weighted_point_tag,Point_tag),());
+CGAL_KD_DEFAULT_FUNCTOR(Point_weight_tag,(CartesianDKernelFunctors::Point_weight<K>),(Weighted_point_tag,Point_tag),());
+CGAL_KD_DEFAULT_FUNCTOR(Power_side_of_power_sphere_tag,(CartesianDKernelFunctors::Power_side_of_power_sphere<K>),(Weighted_point_tag),(Power_side_of_power_sphere_raw_tag,Point_drop_weight_tag,Point_weight_tag));
+CGAL_KD_DEFAULT_FUNCTOR(In_flat_power_side_of_power_sphere_tag,(CartesianDKernelFunctors::In_flat_power_side_of_power_sphere<K>),(Weighted_point_tag),(In_flat_power_side_of_power_sphere_raw_tag,Point_drop_weight_tag,Point_weight_tag));
+CGAL_KD_DEFAULT_FUNCTOR(Power_distance_tag,(CartesianDKernelFunctors::Power_distance<K>),(Weighted_point_tag,Point_tag),(Squared_distance_tag,Point_drop_weight_tag,Point_weight_tag));
+CGAL_KD_DEFAULT_FUNCTOR(Power_distance_to_point_tag,(CartesianDKernelFunctors::Power_distance_to_point<K>),(Weighted_point_tag,Point_tag),(Squared_distance_tag,Point_drop_weight_tag,Point_weight_tag));
+CGAL_KD_DEFAULT_FUNCTOR(Power_center_tag,(CartesianDKernelFunctors::Power_center<K>),(Weighted_point_tag,Point_tag),(Compute_point_cartesian_coordinate_tag,Construct_ttag<Point_tag>,Construct_ttag<Weighted_point_tag>,Point_dimension_tag,Squared_distance_to_origin_tag,Point_drop_weight_tag,Point_weight_tag,Power_distance_to_point_tag));
+} // namespace CGAL
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Vector/array.h b/include/gudhi_patches/CGAL/NewKernel_d/Vector/array.h
new file mode 100644
index 00000000..0ad9bb36
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Vector/array.h
@@ -0,0 +1,165 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_VECTOR_ARRAY_H
+#define CGAL_VECTOR_ARRAY_H
+#include <boost/type_traits/is_arithmetic.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <CGAL/Dimension.h>
+#include <CGAL/NewKernel_d/utils.h>
+#include <CGAL/array.h>
+#include <boost/preprocessor/repetition.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+
+#include <CGAL/NewKernel_d/Vector/determinant_of_points_from_vectors.h>
+#include <CGAL/NewKernel_d/Vector/determinant_of_vectors_small_dim.h>
+#include <CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_iterator_to_vectors.h>
+#include <CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_points.h>
+#include <CGAL/NewKernel_d/Vector/determinant_of_iterator_to_vectors_from_vectors.h>
+
+
+
+namespace CGAL {
+
+// May not be safe to use with dim!=max_dim.
+// In that case, we should store the real dim next to the array.
+template<class NT_,class Dim_,class Max_dim_=Dim_> struct Array_vector {
+ typedef NT_ NT;
+ typedef Dim_ Dimension;
+ typedef Max_dim_ Max_dimension;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef Array_vector< NT, D2, D3 > Other;
+ };
+ template<class> struct Property : boost::false_type {};
+
+ static const unsigned d_=Max_dim_::value;
+ CGAL_static_assertion(d_ != (unsigned)UNKNOWN_DIMENSION);
+
+ typedef cpp0x::array<NT,d_> Vector;
+ struct Construct_vector {
+ struct Dimension {
+ // Initialize with NaN if possible?
+ Vector operator()(unsigned CGAL_assertion_code(d)) const {
+ CGAL_assertion(d<=d_);
+ return Vector();
+ }
+ };
+
+ struct Iterator {
+ template<typename Iter>
+ Vector operator()(unsigned CGAL_assertion_code(d),Iter const& f,Iter const& e) const {
+ CGAL_assertion(d==(unsigned) std::distance(f,e));
+ CGAL_assertion(d<=d_);
+ //TODO: optimize for forward iterators
+ Vector a;
+ std::copy(f,e,a.begin());
+ return a;
+ }
+ };
+
+#if 0
+ struct Iterator_add_one {
+ template<typename Iter>
+ Vector operator()(unsigned d,Iter const& f,Iter const& e) const {
+ CGAL_assertion(d==std::distance(f,e)+1);
+ CGAL_assertion(d<=d_);
+ //TODO: optimize
+ Vector a;
+ std::copy(f,e,a.begin());
+ a.back()=1;
+ return a;
+ }
+ };
+#endif
+
+ struct Iterator_and_last {
+ template<typename Iter,typename T>
+ Vector operator()(unsigned CGAL_assertion_code(d),Iter const& f,Iter const& e,CGAL_FORWARDABLE(T) t) const {
+ CGAL_assertion(d==std::distance(f,e)+1);
+ CGAL_assertion(d<=d_);
+ //TODO: optimize for forward iterators
+ Vector a;
+ std::copy(f,e,a.begin());
+ a.back()=CGAL_FORWARD(T,t);
+ return a;
+ }
+ };
+
+ struct Values {
+#ifdef CGAL_CXX11
+ template<class...U>
+ Vector operator()(U&&...u) const {
+ static_assert(sizeof...(U)<=d_,"too many arguments");
+ Vector a={{forward_safe<NT,U>(u)...}};
+ return a;
+ }
+#else
+
+#define CGAL_CODE(Z,N,_) Vector operator()(BOOST_PP_ENUM_PARAMS(N,NT const& t)) const { \
+ CGAL_assertion(N<=d_); \
+ Vector a={{BOOST_PP_ENUM_PARAMS(N,t)}}; \
+ return a; \
+}
+BOOST_PP_REPEAT_FROM_TO(1, 11, CGAL_CODE, _ )
+#undef CGAL_CODE
+
+#endif
+ };
+
+ struct Values_divide {
+#ifdef CGAL_CXX11
+ template<class H,class...U>
+ Vector operator()(H const& h,U&&...u) const {
+ static_assert(sizeof...(U)<=d_,"too many arguments");
+ Vector a={{Rational_traits<NT>().make_rational(std::forward<U>(u),h)...}};
+ return a;
+ }
+#else
+
+#define CGAL_VAR(Z,N,_) Rational_traits<NT>().make_rational( t##N , h)
+#define CGAL_CODE(Z,N,_) template <class H> Vector \
+ operator()(H const&h, BOOST_PP_ENUM_PARAMS(N,NT const& t)) const { \
+ CGAL_assertion(N<=d_); \
+ Vector a={{BOOST_PP_ENUM(N,CGAL_VAR,_)}}; \
+ return a; \
+ }
+ BOOST_PP_REPEAT_FROM_TO(1, 11, CGAL_CODE, _ )
+#undef CGAL_CODE
+#undef CGAL_VAR
+
+#endif
+ };
+ };
+
+ typedef NT const* Vector_const_iterator;
+ static Vector_const_iterator vector_begin(Vector const&a){
+ return &a[0];
+ }
+ static Vector_const_iterator vector_end(Vector const&a){
+ return &a[0]+d_; // Don't know the real size
+ }
+ static unsigned size_of_vector(Vector const&){
+ return d_; // Don't know the real size
+ }
+
+};
+
+}
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Vector/avx4.h b/include/gudhi_patches/CGAL/NewKernel_d/Vector/avx4.h
new file mode 100644
index 00000000..954a3c1b
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Vector/avx4.h
@@ -0,0 +1,213 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_VECTOR_AVX4_H
+#define CGAL_VECTOR_AVX4_H
+
+#if !defined __AVX__ || (__GNUC__ * 100 + __GNUC_MINOR__ < 408)
+#error Requires AVX and gcc 4.8+
+#endif
+#include <x86intrin.h>
+
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/Dimension.h>
+#include <CGAL/enum.h> // CGAL::Sign
+#include <CGAL/number_utils.h> // CGAL::sign
+
+
+
+namespace CGAL {
+
+ struct Avx_vector_4 {
+ typedef double NT;
+ typedef Dimension_tag<4> Dimension;
+ typedef Dimension_tag<4> Max_dimension;
+ // No Rebind_dimension, this is a building block
+ template<class,bool=true> struct Property : boost::false_type {};
+ template<bool b> struct Property<Has_vector_plus_minus_tag,b>
+ : boost::true_type {};
+ /* MAYBE?
+ template<bool b> struct Property<Has_vector_scalar_ops_tag,b>
+ : boost::true_type {};
+ */
+ template<bool b> struct Property<Has_determinant_of_vectors_tag,b>
+ : boost::true_type {};
+ template<bool b> struct Property<Has_dot_product_tag,b>
+ : boost::true_type {};
+ template<bool b> struct Property<Has_determinant_of_vectors_omit_last_tag,b>
+ : boost::true_type {};
+
+ typedef __m256d Vector;
+ struct Construct_vector {
+ struct Dimension {
+ // Initialize with NaN?
+ Vector operator()(unsigned d) const {
+ CGAL_assertion(d==4);
+ return Vector();
+ }
+ };
+
+ struct Iterator {
+ template<typename Iter>
+ Vector operator()(unsigned d,Iter const& f,Iter const& e) const {
+ CGAL_assertion(d==4);
+ double x0 = *f;
+ double x1 = *++f;
+ double x2 = *++f;
+ double x3 = *++f;
+ CGAL_assertion(++f==e);
+ Vector a = { x0, x1, x2, x3 };
+ return a;
+ }
+ };
+
+ struct Iterator_and_last {
+ template<typename Iter,typename T>
+ Vector operator()(unsigned d,Iter const& f,Iter const& e,double t) const {
+ CGAL_assertion(d==4);
+ double x0 = *f;
+ double x1 = *++f;
+ double x2 = *++f;
+ CGAL_assertion(++f==e);
+ Vector a = { x0, x1, x2, t };
+ return a;
+ }
+ };
+
+ struct Values {
+ Vector operator()(double a,double b,double c,double d) const {
+ Vector r = { a, b, c, d };
+ return r;
+ }
+ };
+
+ struct Values_divide {
+ Vector operator()(double h,double a,double b,double c,double d) const {
+ // {a,b,c,d}/{h,h,h,h} should be roughly the same
+ Vector r = { a/h, b/h, c/h, d/h };
+ return r;
+ }
+ };
+ };
+
+ public:
+ typedef double const* Vector_const_iterator;
+ static inline Vector_const_iterator vector_begin(Vector const&a){
+ return (Vector_const_iterator)(&a);
+ }
+ static inline Vector_const_iterator vector_end(Vector const&a){
+ return (Vector_const_iterator)(&a)+4;
+ }
+ static inline unsigned size_of_vector(Vector){
+ return 4;
+ }
+ static inline double dot_product(__m256d x, __m256d y){
+ __m256d p=x*y;
+ __m256d z=_mm256_hadd_pd(p,p);
+ return z[0]+z[2];
+ }
+ private:
+ static inline __m256d avx_sym(__m256d x){
+#if 0
+ return __builtin_shuffle(x,(__m256i){2,3,0,1});
+#else
+ return _mm256_permute2f128_pd(x,x,1);
+#endif
+ }
+ static inline __m256d avx_left(__m256d x){
+#if 0
+ return __builtin_shuffle(x,(__m256i){1,2,3,0});
+#else
+#ifdef __AVX2__
+ return _mm256_permute4x64_pd(x,1+2*4+3*16+0*64);
+#else
+ __m256d s = _mm256_permute2f128_pd(x,x,1);
+ return _mm256_shuffle_pd(x,s,5);
+#endif
+#endif
+ }
+ static inline __m256d avx_right(__m256d x){
+#if 0
+ return __builtin_shuffle(x,(__m256i){3,0,1,2});
+#else
+#ifdef __AVX2__
+ return _mm256_permute4x64_pd(x,3+0*4+1*16+2*64);
+#else
+ __m256d s = _mm256_permute2f128_pd(x,x,1);
+ return _mm256_shuffle_pd(s,x,5);
+#endif
+#endif
+ }
+ static inline double avx_altprod(__m256d x, __m256d y){
+ __m256d p=x*y;
+ __m256d z=_mm256_hsub_pd(p,p);
+ return z[0]+z[2];
+ }
+ public:
+ static double
+ determinant_of_vectors(Vector a, Vector b, Vector c, Vector d) {
+ __m256d x=a*avx_left(b)-avx_left(a)*b;
+ __m256d yy=a*avx_sym(b);
+ __m256d y=yy-avx_sym(yy);
+ __m256d z0=x*avx_sym(c);
+ __m256d z1=avx_left(x)*c;
+ __m256d z2=y*avx_left(c);
+ __m256d z=z0+z1-z2;
+ return avx_altprod(z,avx_right(d));
+ }
+ static CGAL::Sign
+ sign_of_determinant_of_vectors(Vector a, Vector b, Vector c, Vector d) {
+ return CGAL::sign(determinant_of_vectors(a,b,c,d));
+ }
+
+ private:
+ static inline __m256d avx3_right(__m256d x){
+#if 0
+ return __builtin_shuffle(x,(__m256i){2,0,1,3}); // can replace 3 with anything
+#else
+#ifdef __AVX2__
+ return _mm256_permute4x64_pd(x,2+0*4+1*16+3*64);
+#else
+ __m256d s = _mm256_permute2f128_pd(x,x,1);
+ return _mm256_shuffle_pd(s,x,12);
+#endif
+#endif
+ }
+ public:
+ static inline double dot_product_omit_last(__m256d x, __m256d y){
+ __m256d p=x*y;
+ __m128d q=_mm256_extractf128_pd(p,0);
+ double z=_mm_hadd_pd(q,q)[0];
+ return z+p[2];
+ }
+ // Note: without AVX2, is it faster than the scalar computation?
+ static double
+ determinant_of_vectors_omit_last(Vector a, Vector b, Vector c) {
+ __m256d x=a*avx3_right(b)-avx3_right(a)*b;
+ return dot_product_omit_last(c,avx3_right(x));
+ }
+ static CGAL::Sign
+ sign_of_determinant_of_vectors_omit_last(Vector a, Vector b, Vector c) {
+ return CGAL::sign(determinant_of_vectors_omit_last(a,b,c));
+ }
+
+ };
+
+}
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_iterator_to_vectors.h b/include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_iterator_to_vectors.h
new file mode 100644
index 00000000..b8efbe28
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_iterator_to_vectors.h
@@ -0,0 +1,76 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_VECTOR_DET_ITER_PTS_ITER_VEC_H
+#define CGAL_VECTOR_DET_ITER_PTS_ITER_VEC_H
+#include <functional>
+#include <CGAL/transforming_iterator.h>
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/Dimension.h>
+
+namespace CGAL {
+
+template <class LA, class Dim_=typename LA::Dimension,
+ class Max_dim_=typename LA::Max_dimension,
+ bool = LA::template Property<Has_determinant_of_iterator_to_points_tag>::value,
+ bool = LA::template Property<Has_determinant_of_iterator_to_vectors_tag>::value>
+struct Add_determinant_of_iterator_to_points_from_iterator_to_vectors : LA {
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_iterator_to_points_from_iterator_to_vectors<LA2> Other;
+ };
+};
+
+template <class LA, class Dim_,class Max_dim_>
+struct Add_determinant_of_iterator_to_points_from_iterator_to_vectors
+<LA, Dim_, Max_dim_, false, true> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_iterator_to_points_from_iterator_to_vectors<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<Has_determinant_of_iterator_to_points_tag, D> :
+ boost::true_type {};
+
+ // TODO: use std::minus, boost::bind, etc
+ template<class T> struct Minus_fixed {
+ T const& a;
+ Minus_fixed(T const&a_):a(a_){}
+ T operator()(T const&b)const{return b-a;}
+ };
+ template<class Iter>
+ static NT determinant_of_iterator_to_points(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Minus_fixed<Vector> f(a);
+ return LA::determinant_of_iterator_to_vectors(make_transforming_iterator(first,f),make_transforming_iterator(end,f));
+ }
+ template<class Iter>
+ static Sign sign_of_determinant_of_iterator_to_points(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Minus_fixed<Vector> f(a);
+ return LA::sign_of_determinant_of_iterator_to_vectors(make_transforming_iterator(first,f),make_transforming_iterator(end,f));
+ }
+};
+
+}
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_points.h b/include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_points.h
new file mode 100644
index 00000000..71a31d81
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_points.h
@@ -0,0 +1,211 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_VECTOR_DET_ITER_PTS_PTS_H
+#define CGAL_VECTOR_DET_ITER_PTS_PTS_H
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/Dimension.h>
+
+namespace CGAL {
+
+template <class LA, class Dim_=typename LA::Dimension,
+ class Max_dim_=typename LA::Max_dimension,
+ bool = LA::template Property<Has_determinant_of_iterator_to_points_tag>::value,
+ bool = LA::template Property<Has_determinant_of_points_tag>::value>
+struct Add_determinant_of_iterator_to_points_from_points : LA {
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_iterator_to_points_from_points<LA2> Other;
+ };
+};
+
+//FIXME: Use variadics and boost so it works in any dimension.
+template <class LA, class Max_dim_>
+struct Add_determinant_of_iterator_to_points_from_points
+<LA, Dimension_tag<2>, Max_dim_, false, true> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_iterator_to_points_from_points<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<Has_determinant_of_iterator_to_points_tag, D> :
+ boost::true_type {};
+
+ template<class Iter>
+ static NT determinant_of_iterator_to_points(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; ++first;
+ Vector const&c=*first; CGAL_assertion(++first==end);
+ return LA::determinant_of_points(a,b,c);
+ }
+ template<class Iter>
+ static Sign sign_of_determinant_of_iterator_to_points(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; ++first;
+ Vector const&c=*first; CGAL_assertion(++first==end);
+ return LA::sign_of_determinant_of_points(a,b,c);
+ }
+};
+
+template <class LA, class Max_dim_>
+struct Add_determinant_of_iterator_to_points_from_points
+<LA, Dimension_tag<3>, Max_dim_, false, true> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_iterator_to_points_from_points<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<Has_determinant_of_iterator_to_points_tag, D> :
+ boost::true_type {};
+
+ template<class Iter>
+ static NT determinant_of_iterator_to_points(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; ++first;
+ Vector const&c=*first; ++first;
+ Vector const&d=*first; CGAL_assertion(++first==end);
+ return LA::determinant_of_points(a,b,c,d);
+ }
+ template<class Iter>
+ static Sign sign_of_determinant_of_iterator_to_points(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; ++first;
+ Vector const&c=*first; ++first;
+ Vector const&d=*first; CGAL_assertion(++first==end);
+ return LA::sign_of_determinant_of_points(a,b,c,d);
+ }
+};
+
+template <class LA, class Max_dim_>
+struct Add_determinant_of_iterator_to_points_from_points
+<LA, Dimension_tag<4>, Max_dim_, false, true> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_iterator_to_points_from_points<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<Has_determinant_of_iterator_to_points_tag, D> :
+ boost::true_type {};
+
+ template<class Iter>
+ static NT determinant_of_iterator_to_points(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; ++first;
+ Vector const&c=*first; ++first;
+ Vector const&d=*first; ++first;
+ Vector const&e=*first; CGAL_assertion(++first==end);
+ return LA::determinant_of_points(a,b,c,d,e);
+ }
+ template<class Iter>
+ static Sign sign_of_determinant_of_iterator_to_points(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; ++first;
+ Vector const&c=*first; ++first;
+ Vector const&d=*first; ++first;
+ Vector const&e=*first; CGAL_assertion(++first==end);
+ return LA::sign_of_determinant_of_points(a,b,c,d,e);
+ }
+};
+
+template <class LA, class Max_dim_>
+struct Add_determinant_of_iterator_to_points_from_points
+<LA, Dimension_tag<5>, Max_dim_, false, true> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_iterator_to_points_from_points<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<Has_determinant_of_iterator_to_points_tag, D> :
+ boost::true_type {};
+
+ template<class Iter>
+ static NT determinant_of_iterator_to_points(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; ++first;
+ Vector const&c=*first; ++first;
+ Vector const&d=*first; ++first;
+ Vector const&e=*first; ++first;
+ Vector const&f=*first; CGAL_assertion(++first==end);
+ return LA::determinant_of_points(a,b,c,d,e,f);
+ }
+ template<class Iter>
+ static Sign sign_of_determinant_of_iterator_to_points(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; ++first;
+ Vector const&c=*first; ++first;
+ Vector const&d=*first; ++first;
+ Vector const&e=*first; ++first;
+ Vector const&f=*first; CGAL_assertion(++first==end);
+ return LA::sign_of_determinant_of_points(a,b,c,d,e,f);
+ }
+};
+
+template <class LA, class Max_dim_>
+struct Add_determinant_of_iterator_to_points_from_points
+<LA, Dimension_tag<6>, Max_dim_, false, true> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_iterator_to_points_from_points<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<Has_determinant_of_iterator_to_points_tag, D> :
+ boost::true_type {};
+
+ template<class Iter>
+ static NT determinant_of_iterator_to_points(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; ++first;
+ Vector const&c=*first; ++first;
+ Vector const&d=*first; ++first;
+ Vector const&e=*first; ++first;
+ Vector const&f=*first; ++first;
+ Vector const&g=*first; CGAL_assertion(++first==end);
+ return LA::determinant_of_points(a,b,c,d,e,f,g);
+ }
+ template<class Iter>
+ static Sign sign_of_determinant_of_iterator_to_points(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; ++first;
+ Vector const&c=*first; ++first;
+ Vector const&d=*first; ++first;
+ Vector const&e=*first; ++first;
+ Vector const&f=*first; ++first;
+ Vector const&g=*first; CGAL_assertion(++first==end);
+ return LA::sign_of_determinant_of_points(a,b,c,d,e,f,g);
+ }
+};
+
+}
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_vectors_from_vectors.h b/include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_vectors_from_vectors.h
new file mode 100644
index 00000000..f096d6c7
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_iterator_to_vectors_from_vectors.h
@@ -0,0 +1,201 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_VECTOR_DET_ITER_VEC_VEC_H
+#define CGAL_VECTOR_DET_ITER_VEC_VEC_H
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/Dimension.h>
+
+namespace CGAL {
+
+template <class LA, class Dim_=typename LA::Dimension,
+ class Max_dim_=typename LA::Max_dimension,
+ bool = LA::template Property<Has_determinant_of_iterator_to_vectors_tag>::value,
+ bool = LA::template Property<Has_determinant_of_vectors_tag>::value>
+struct Add_determinant_of_iterator_to_vectors_from_vectors : LA {
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_iterator_to_vectors_from_vectors<LA2> Other;
+ };
+};
+
+//FIXME: Use variadics and boost so it works in any dimension.
+template <class LA, class Max_dim_>
+struct Add_determinant_of_iterator_to_vectors_from_vectors
+<LA, Dimension_tag<2>, Max_dim_, false, true> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_iterator_to_vectors_from_vectors<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<Has_determinant_of_iterator_to_vectors_tag, D> :
+ boost::true_type {};
+
+ template<class Iter>
+ static NT determinant_of_iterator_to_vectors(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; CGAL_assertion(++first==end);
+ return LA::determinant_of_vectors(a,b);
+ }
+ template<class Iter>
+ static Sign sign_of_determinant_of_iterator_to_vectors(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; CGAL_assertion(++first==end);
+ return LA::sign_of_determinant_of_vectors(a,b);
+ }
+};
+
+template <class LA, class Max_dim_>
+struct Add_determinant_of_iterator_to_vectors_from_vectors
+<LA, Dimension_tag<3>, Max_dim_, false, true> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_iterator_to_vectors_from_vectors<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<Has_determinant_of_iterator_to_vectors_tag, D> :
+ boost::true_type {};
+
+ template<class Iter>
+ static NT determinant_of_iterator_to_vectors(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; ++first;
+ Vector const&c=*first; CGAL_assertion(++first==end);
+ return LA::determinant_of_vectors(a,b,c);
+ }
+ template<class Iter>
+ static Sign sign_of_determinant_of_iterator_to_vectors(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; ++first;
+ Vector const&c=*first; CGAL_assertion(++first==end);
+ return LA::sign_of_determinant_of_vectors(a,b,c);
+ }
+};
+
+template <class LA, class Max_dim_>
+struct Add_determinant_of_iterator_to_vectors_from_vectors
+<LA, Dimension_tag<4>, Max_dim_, false, true> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_iterator_to_vectors_from_vectors<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<Has_determinant_of_iterator_to_vectors_tag, D> :
+ boost::true_type {};
+
+ template<class Iter>
+ static NT determinant_of_iterator_to_vectors(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; ++first;
+ Vector const&c=*first; ++first;
+ Vector const&d=*first; CGAL_assertion(++first==end);
+ return LA::determinant_of_vectors(a,b,c,d);
+ }
+ template<class Iter>
+ static Sign sign_of_determinant_of_iterator_to_vectors(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; ++first;
+ Vector const&c=*first; ++first;
+ Vector const&d=*first; CGAL_assertion(++first==end);
+ return LA::sign_of_determinant_of_vectors(a,b,c,d);
+ }
+};
+
+template <class LA, class Max_dim_>
+struct Add_determinant_of_iterator_to_vectors_from_vectors
+<LA, Dimension_tag<5>, Max_dim_, false, true> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_iterator_to_vectors_from_vectors<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<Has_determinant_of_iterator_to_vectors_tag, D> :
+ boost::true_type {};
+
+ template<class Iter>
+ static NT determinant_of_iterator_to_vectors(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; ++first;
+ Vector const&c=*first; ++first;
+ Vector const&d=*first; ++first;
+ Vector const&e=*first; CGAL_assertion(++first==end);
+ return LA::determinant_of_vectors(a,b,c,d,e);
+ }
+ template<class Iter>
+ static Sign sign_of_determinant_of_iterator_to_vectors(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; ++first;
+ Vector const&c=*first; ++first;
+ Vector const&d=*first; ++first;
+ Vector const&e=*first; CGAL_assertion(++first==end);
+ return LA::sign_of_determinant_of_vectors(a,b,c,d,e);
+ }
+};
+
+template <class LA, class Max_dim_>
+struct Add_determinant_of_iterator_to_vectors_from_vectors
+<LA, Dimension_tag<6>, Max_dim_, false, true> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_iterator_to_vectors_from_vectors<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<Has_determinant_of_iterator_to_vectors_tag, D> :
+ boost::true_type {};
+
+ template<class Iter>
+ static NT determinant_of_iterator_to_vectors(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; ++first;
+ Vector const&c=*first; ++first;
+ Vector const&d=*first; ++first;
+ Vector const&e=*first; ++first;
+ Vector const&f=*first; CGAL_assertion(++first==end);
+ return LA::determinant_of_vectors(a,b,c,d,e,f);
+ }
+ template<class Iter>
+ static Sign sign_of_determinant_of_iterator_to_vectors(Iter const&first, Iter const&end){
+ Vector const&a=*first; ++first;
+ Vector const&b=*first; ++first;
+ Vector const&c=*first; ++first;
+ Vector const&d=*first; ++first;
+ Vector const&e=*first; ++first;
+ Vector const&f=*first; CGAL_assertion(++first==end);
+ return LA::sign_of_determinant_of_vectors(a,b,c,d,e,f);
+ }
+};
+
+}
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_points_from_vectors.h b/include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_points_from_vectors.h
new file mode 100644
index 00000000..7ddb73c3
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_points_from_vectors.h
@@ -0,0 +1,164 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_VECTOR_DETPTS_H
+#define CGAL_VECTOR_DETPTS_H
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/Dimension.h>
+
+namespace CGAL {
+
+template <class LA, class Dim_=typename LA::Dimension,
+ class Max_dim_=typename LA::Max_dimension,
+ bool = LA::template Property<Has_determinant_of_points_tag>::value,
+ bool = LA::template Property<Has_determinant_of_vectors_tag>::value
+ && LA::template Property<Has_vector_plus_minus_tag>::value>
+struct Add_determinant_of_points_from_vectors_and_minus : LA {
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_points_from_vectors_and_minus<LA2> Other;
+ };
+};
+
+//FIXME: Use variadics and boost so it works in any dimension.
+template <class LA, class Max_dim_>
+struct Add_determinant_of_points_from_vectors_and_minus
+<LA, Dimension_tag<2>, Max_dim_, false, true> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_points_from_vectors_and_minus<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<Has_determinant_of_points_tag, D> :
+ boost::true_type {};
+
+ static NT determinant_of_points(Vector const&a, Vector const&b,
+ Vector const&c){
+ return LA::determinant_of_vectors(b-a,c-a);
+ }
+ static Sign sign_of_determinant_of_points(Vector const&a, Vector const&b,
+ Vector const&c){
+ return LA::sign_of_determinant_of_vectors(b-a,c-a);
+ }
+};
+
+template <class LA, class Max_dim_>
+struct Add_determinant_of_points_from_vectors_and_minus
+<LA, Dimension_tag<3>, Max_dim_, false, true> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_points_from_vectors_and_minus<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<Has_determinant_of_points_tag, D> :
+ boost::true_type {};
+
+ static NT determinant_of_points(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d){
+ return LA::determinant_of_vectors(b-a,c-a,d-a);
+ }
+ static Sign sign_of_determinant_of_points(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d){
+ return LA::sign_of_determinant_of_vectors(b-a,c-a,d-a);
+ }
+};
+
+template <class LA, class Max_dim_>
+struct Add_determinant_of_points_from_vectors_and_minus
+<LA, Dimension_tag<4>, Max_dim_, false, true> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_points_from_vectors_and_minus<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<Has_determinant_of_points_tag, D> :
+ boost::true_type {};
+
+ static NT determinant_of_points(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d, Vector const&e){
+ return LA::determinant_of_vectors(b-a,c-a,d-a,e-a);
+ }
+ static Sign sign_of_determinant_of_points(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d, Vector const&e){
+ return LA::sign_of_determinant_of_vectors(b-a,c-a,d-a,e-a);
+ }
+};
+
+template <class LA, class Max_dim_>
+struct Add_determinant_of_points_from_vectors_and_minus
+<LA, Dimension_tag<5>, Max_dim_, false, true> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_points_from_vectors_and_minus<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<Has_determinant_of_points_tag, D> :
+ boost::true_type {};
+
+ static NT determinant_of_points(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d, Vector const&e, Vector const&f){
+ return LA::determinant_of_vectors(b-a,c-a,d-a,e-a,f-a);
+ }
+ static Sign sign_of_determinant_of_points(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d, Vector const&e, Vector const&f){
+ return LA::sign_of_determinant_of_vectors(b-a,c-a,d-a,e-a,f-a);
+ }
+};
+
+template <class LA, class Max_dim_>
+struct Add_determinant_of_points_from_vectors_and_minus
+<LA, Dimension_tag<6>, Max_dim_, false, true> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef Add_determinant_of_points_from_vectors_and_minus<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<Has_determinant_of_points_tag, D> :
+ boost::true_type {};
+
+ static NT determinant_of_points(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d, Vector const&e, Vector const&f,
+ Vector const&g){
+ return LA::determinant_of_vectors(b-a,c-a,d-a,e-a,f-a,g-a);
+ }
+ static Sign sign_of_determinant_of_points(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d, Vector const&e, Vector const&f,
+ Vector const&g){
+ return LA::sign_of_determinant_of_vectors(b-a,c-a,d-a,e-a,f-a,g-a);
+ }
+};
+
+}
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_vectors_small_dim.h b/include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_vectors_small_dim.h
new file mode 100644
index 00000000..64eafe69
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_vectors_small_dim.h
@@ -0,0 +1,58 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_VECTOR_DETVEC_SMALL_H
+#define CGAL_VECTOR_DETVEC_SMALL_H
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/Dimension.h>
+#include <CGAL/determinant_of_vectors.h>
+
+#define CGAL_ALLOWED_INCLUSION 1
+
+#define CGAL_CLASS Add_determinant_of_vectors_small_dim
+#define CGAL_TAG Has_determinant_of_vectors_tag
+#define CGAL_FUNC determinant_of_vectors
+#define CGAL_SIGN_FUNC sign_of_determinant_of_vectors
+#define CGAL_SHIFT 0
+
+#include <CGAL/NewKernel_d/Vector/determinant_of_vectors_small_dim_internal.h>
+
+#undef CGAL_CLASS
+#undef CGAL_TAG
+#undef CGAL_FUNC
+#undef CGAL_SIGN_FUNC
+#undef CGAL_SHIFT
+
+#define CGAL_CLASS Add_determinant_of_vectors_omit_last_small_dim
+#define CGAL_TAG Has_determinant_of_vectors_omit_last_tag
+#define CGAL_FUNC determinant_of_vectors_omit_last
+#define CGAL_SIGN_FUNC sign_of_determinant_of_vectors_omit_last
+#define CGAL_SHIFT 1
+
+#include <CGAL/NewKernel_d/Vector/determinant_of_vectors_small_dim_internal.h>
+
+#undef CGAL_CLASS
+#undef CGAL_TAG
+#undef CGAL_FUNC
+#undef CGAL_SIGN_FUNC
+#undef CGAL_SHIFT
+
+#undef CGAL_ALLOWED_INCLUSION
+
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_vectors_small_dim_internal.h b/include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_vectors_small_dim_internal.h
new file mode 100644
index 00000000..b4856742
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Vector/determinant_of_vectors_small_dim_internal.h
@@ -0,0 +1,164 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_ALLOWED_INCLUSION
+#error Must not include this header directly
+#endif
+#if !defined(CGAL_TAG) \
+ || ! defined(CGAL_CLASS) \
+ || ! defined(CGAL_FUNC) \
+ || ! defined(CGAL_SIGN_FUNC) \
+ || ! defined(CGAL_SHIFT)
+
+#error Forgot one macro
+#endif
+
+namespace CGAL {
+
+template <class LA, class Dim_=typename LA::Dimension,
+ class Max_dim_=typename LA::Max_dimension,
+ bool=LA::template Property<CGAL_TAG>::value>
+struct CGAL_CLASS : LA {
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef CGAL_CLASS<LA2> Other;
+ };
+};
+
+template <class LA, class Max_dim_>
+struct CGAL_CLASS
+<LA, Dimension_tag<2+CGAL_SHIFT>, Max_dim_, false> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef CGAL_CLASS<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<CGAL_TAG, D> :
+ boost::true_type {};
+
+ static NT CGAL_FUNC(Vector const&a, Vector const&b){
+ return CGAL::determinant_of_vectors<NT>(a,b);
+ }
+ template <class V1, class V2>
+ static Sign CGAL_SIGN_FUNC(V1 const&a, V2 const&b){
+ return CGAL::sign_of_determinant_of_vectors<NT>(a,b);
+ }
+};
+
+template <class LA, class Max_dim_>
+struct CGAL_CLASS
+<LA, Dimension_tag<3+CGAL_SHIFT>, Max_dim_, false> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef CGAL_CLASS<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<CGAL_TAG, D> :
+ boost::true_type {};
+
+ static NT CGAL_FUNC(Vector const&a, Vector const&b,
+ Vector const&c){
+ return CGAL::determinant_of_vectors<NT>(a,b,c);
+ }
+ static Sign CGAL_SIGN_FUNC(Vector const&a, Vector const&b,
+ Vector const&c){
+ return CGAL::sign_of_determinant_of_vectors<NT>(a,b,c);
+ }
+};
+
+template <class LA, class Max_dim_>
+struct CGAL_CLASS
+<LA, Dimension_tag<4+CGAL_SHIFT>, Max_dim_, false> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef CGAL_CLASS<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<CGAL_TAG, D> :
+ boost::true_type {};
+
+ static NT CGAL_FUNC(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d){
+ return CGAL::determinant_of_vectors<NT>(a,b,c,d);
+ }
+ static Sign CGAL_SIGN_FUNC(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d){
+ return CGAL::sign_of_determinant_of_vectors<NT>(a,b,c,d);
+ }
+};
+
+template <class LA, class Max_dim_>
+struct CGAL_CLASS
+<LA, Dimension_tag<5+CGAL_SHIFT>, Max_dim_, false> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef CGAL_CLASS<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<CGAL_TAG, D> :
+ boost::true_type {};
+
+ static NT CGAL_FUNC(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d, Vector const&e){
+ return CGAL::determinant_of_vectors<NT>(a,b,c,d,e);
+ }
+ static Sign CGAL_SIGN_FUNC(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d, Vector const&e){
+ return CGAL::sign_of_determinant_of_vectors<NT>(a,b,c,d,e);
+ }
+};
+
+template <class LA, class Max_dim_>
+struct CGAL_CLASS
+<LA, Dimension_tag<6+CGAL_SHIFT>, Max_dim_, false> : LA {
+ typedef typename LA::NT NT;
+ typedef typename LA::Vector Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef typename LA::template Rebind_dimension<D2,D3> LA2;
+ typedef CGAL_CLASS<LA2> Other;
+ };
+ template<class P,class=void> struct Property : LA::template Property<P> {};
+ template<class D> struct Property<CGAL_TAG, D> :
+ boost::true_type {};
+
+ static NT CGAL_FUNC(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d, Vector const&e, Vector const&f){
+ return CGAL::determinant_of_vectors<NT>(a,b,c,d,e,f);
+ }
+ static Sign CGAL_SIGN_FUNC(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d, Vector const&e, Vector const&f){
+ return CGAL::sign_of_determinant_of_vectors<NT>(a,b,c,d,e,f);
+ }
+};
+
+}
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Vector/mix.h b/include/gudhi_patches/CGAL/NewKernel_d/Vector/mix.h
new file mode 100644
index 00000000..d4cfeeb1
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Vector/mix.h
@@ -0,0 +1,46 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KD_MIX_VECTOR_H
+#define CGAL_KD_MIX_VECTOR_H
+#include <CGAL/Dimension.h>
+namespace CGAL {
+
+template <class Static_, class Dynamic_, class NT_ ,class Dim_, class Max_dim_ = Dim_>
+struct Mix_vector
+: Dynamic_::template Rebind_dimension<Dim_, Max_dim_>::Other
+{
+ template <class D2, class D3 = D2>
+ struct Rebind_dimension {
+ typedef Mix_vector<Static_, Dynamic_, NT_, D2, D3> Other;
+ };
+};
+
+template <class Static_, class Dynamic_, class NT_, int d, class Max_dim_>
+struct Mix_vector<Static_, Dynamic_, NT_, Dimension_tag<d>, Max_dim_>
+: Static_::template Rebind_dimension<Dimension_tag<d>, Max_dim_>::Other
+{
+ template <class D2, class D3 = D2>
+ struct Rebind_dimension {
+ typedef Mix_vector<Static_, Dynamic_, NT_, D2, D3> Other;
+ };
+};
+}
+#endif
+
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Vector/sse2.h b/include/gudhi_patches/CGAL/NewKernel_d/Vector/sse2.h
new file mode 100644
index 00000000..2a75385c
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Vector/sse2.h
@@ -0,0 +1,145 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_VECTOR_SSE2_H
+#define CGAL_VECTOR_SSE2_H
+
+// Check what needs adapting for clang, intel and microsoft
+#if !defined __SSE2__ || (__GNUC__ * 100 + __GNUC_MINOR__ < 408)
+#error Requires SSE2 and gcc 4.8+
+#endif
+#include <x86intrin.h> // FIXME: other platforms call it differently
+
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/Dimension.h>
+#include <CGAL/enum.h> // CGAL::Sign
+#include <CGAL/number_utils.h> // CGAL::sign
+
+
+
+namespace CGAL {
+
+ struct Sse_vector_2 {
+ typedef double NT;
+ typedef Dimension_tag<2> Dimension;
+ typedef Dimension_tag<2> Max_dimension;
+ // No Rebind_dimension, this is a building block
+ template<class,bool=true> struct Property : boost::false_type {};
+ template<bool b> struct Property<Has_vector_plus_minus_tag,b>
+ : boost::true_type {};
+ /* MAYBE?
+ template<bool b> struct Property<Has_vector_scalar_ops_tag,b>
+ : boost::true_type {};
+ */
+ template<bool b> struct Property<Has_determinant_of_vectors_tag,b>
+ : boost::true_type {};
+ template<bool b> struct Property<Has_dot_product_tag,b>
+ : boost::true_type {};
+
+ typedef __m128d Vector;
+ struct Construct_vector {
+ struct Dimension {
+ // Initialize with NaN?
+ Vector operator()(unsigned d) const {
+ CGAL_assertion(d==2);
+ return Vector();
+ }
+ };
+
+ struct Iterator {
+ template<typename Iter>
+ Vector operator()(unsigned d,Iter const& f,Iter const& e) const {
+ CGAL_assertion(d==2);
+ double x0 = *f;
+ double x1 = *++f;
+ CGAL_assertion(++f==e);
+ Vector a = { x0, x1 };
+ return a;
+ }
+ };
+
+ struct Iterator_and_last {
+ template<typename Iter,typename T>
+ Vector operator()(unsigned d,Iter const& f,Iter const& e,double t) const {
+ CGAL_assertion(d==2);
+ Vector a = { *f, t };
+ CGAL_assertion(++f==e);
+ return a;
+ }
+ };
+
+ struct Values {
+ Vector operator()(double a,double b) const {
+ Vector r = { a, b };
+ return r;
+ }
+ };
+
+ struct Values_divide {
+ Vector operator()(double h,double a,double b) const {
+ // {a,b}/{h,h} is probably slower
+ Vector r = { a/h, b/h };
+ return r;
+ }
+ };
+ };
+
+ typedef double const* Vector_const_iterator;
+ static inline Vector_const_iterator vector_begin(Vector const&a){
+ return (Vector_const_iterator)(&a);
+ }
+ static inline Vector_const_iterator vector_end(Vector const&a){
+ return (Vector_const_iterator)(&a)+2;
+ }
+ static inline unsigned size_of_vector(Vector){
+ return 2;
+ }
+ public:
+
+ static double determinant_of_vectors(Vector a, Vector b) {
+ __m128d c = _mm_shuffle_pd (b, b, 1); // b1, b0
+ __m128d d = a * c; // a0*b1, a1*b0
+#ifdef __SSE3__
+ __m128d e = _mm_hsub_pd (d, d);
+ return e[0];
+#else
+ return d[0]-d[1];
+#endif
+ }
+ static CGAL::Sign sign_of_determinant_of_vectors(Vector a, Vector b) {
+ return CGAL::sign(determinant_of_vectors(a,b));
+ }
+
+ static double dot_product(Vector a,Vector b){
+#ifdef __SSE4_1__
+ return _mm_dp_pd (a, b, 1+16+32)[0];
+#else
+ __m128d p = a * b;
+#if defined __SSE3__
+ __m128d s = _mm_hadd_pd (p, p);
+ return s[0];
+#else
+ return p[0]+p[1];
+#endif
+#endif
+ };
+ };
+
+}
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Vector/v2int.h b/include/gudhi_patches/CGAL/NewKernel_d/Vector/v2int.h
new file mode 100644
index 00000000..b85a3734
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Vector/v2int.h
@@ -0,0 +1,181 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_VECTOR_2INT_H
+#define CGAL_VECTOR_2INT_H
+
+#include <stdint.h>
+#include <cmath>
+#include <CGAL/array.h>
+#include <CGAL/Dimension.h>
+#include <CGAL/enum.h>
+#include <CGAL/number_utils.h>
+#include <CGAL/NT_converter.h>
+#include <CGAL/transforming_iterator.h>
+#include <CGAL/determinant_of_vectors.h>
+#include <CGAL/NewKernel_d/functor_tags.h>
+
+
+// What are the pros and cons of having NT be int vs double?
+
+namespace CGAL {
+ struct Vector_2_int_prop1 {
+ typedef double NT; // try lying a bit
+ typedef int32_t NT1; // what is really stored
+ typedef int32_t NT1b; // slightly longer
+ typedef int_fast64_t NT2; // longer type for computations
+ typedef int_fast64_t NT2b; // slightly longer
+ bool check_limits(int32_t x){return std::abs(x)<(1<<30);}
+ // TODO: find nice bounds
+ };
+#ifdef __SIZEOF_INT128__
+ struct Vector_2_int_prop2 {
+ typedef double NT;
+ typedef int32_t NT1;
+ typedef int_fast64_t NT1b;
+ typedef int_fast64_t NT2;
+ typedef __int128 NT2b;
+ bool check_limits(int32_t){return true;}
+ // take a template/int64_t input and still check the limits?
+ };
+ struct Vector_2_int_prop3 {
+ typedef long double NT;
+ typedef int64_t NT1;
+ typedef int64_t NT1b;
+ typedef __int128 NT2;
+ typedef __int128 NT2b;
+ enum { has_limit=true };
+ bool check_limits(int32_t x){return std::abs(x)<(1L<<62);}
+ // TODO: find nice bounds
+ };
+#endif
+
+ template<class Prop=Vector_2_int_prop1>
+ struct Vector_2_int : Prop {
+ using typename Prop::NT;
+ using typename Prop::NT1;
+ using typename Prop::NT1b;
+ using typename Prop::NT2;
+ using typename Prop::NT2b;
+ using Prop::check_limits;
+
+ typedef Dimension_tag<2> Dimension;
+ typedef Dimension_tag<2> Max_dimension;
+ // No Rebind_dimension, this is a building block
+ template<class,bool=true> struct Property : boost::false_type {};
+ //template<bool b> struct Property<Has_vector_plus_minus_tag,b>
+ // : boost::true_type {};
+ template<bool b> struct Property<Has_determinant_of_vectors_tag,b>
+ : boost::true_type {};
+ //template<bool b> struct Property<Has_determinant_of_points_tag,b>
+ // : boost::true_type {};
+ // Advertise somehow that the sign_of_determinant* are exact?
+
+ typedef cpp0x::array<NT1,2> Vector;
+ struct Construct_vector {
+ struct Dimension {
+ Vector operator()(unsigned d) const {
+ CGAL_assertion(d==2);
+ return Vector();
+ }
+ };
+
+ // TODO (for all constructors): check that input fits in NT1...
+ struct Iterator {
+ template<typename Iter>
+ Vector operator()(unsigned d,Iter const& f,Iter const& e) const {
+ CGAL_assertion(d==2);
+ NT1 x0 = *f;
+ NT1 x1 = *++f;
+ CGAL_assertion (++f == e);
+ CGAL_assertion (check_limits(x0) && check_limits(x1));
+ Vector a = { x0, x1 };
+ return a;
+ }
+ };
+
+ struct Iterator_and_last {
+ template<typename Iter,typename T>
+ Vector operator()(unsigned d,Iter const& f,Iter const& e,double t) const {
+ CGAL_assertion(d==2);
+ NT1 x = *f;
+ CGAL_assertion (++f == e);
+ CGAL_assertion (check_limits(x) && check_limits(t));
+ Vector a = { x, t };
+ return a;
+ }
+ };
+
+ struct Values {
+ Vector operator()(NT1 a,NT1 b) const {
+ CGAL_assertion (check_limits(a) && check_limits(b));
+ Vector r = { a, b };
+ return r;
+ }
+ };
+
+ /*
+ // Maybe safer not to provide it
+ struct Values_divide {
+ Vector operator()(double h,double a,double b) const {
+ Vector r = { a/h, b/h };
+ return r;
+ }
+ };
+ */
+ };
+
+ // Since we lie about NT, be consistent about it
+ typedef transforming_iterator<NT_converter<NT1,NT>,NT1 const*> Vector_const_iterator;
+ static inline Vector_const_iterator vector_begin(Vector const&a){
+ return Vector_const_iterator(a.begin());
+ }
+ static inline Vector_const_iterator vector_end(Vector const&a){
+ return Vector_const_iterator(a.end());
+ }
+ static inline unsigned size_of_vector(Vector){
+ return 2;
+ }
+
+ // for unsigned NT1, check what changes to do.
+ // return NT or NT2?
+ static NT determinant_of_vectors(Vector a, Vector b) {
+ return CGAL::determinant_of_vectors<NT2>(a,b);
+ }
+ static CGAL::Sign sign_of_determinant_of_vectors(Vector a, Vector b) {
+ return CGAL::sign_of_determinant_of_vectors<NT2>(a,b);
+ }
+
+ static NT determinant_of_points(Vector a, Vector b, Vector c) {
+ // could be faster to convert to NT directly
+ NT1b a0=a[0]; NT1b a1=a[1];
+ NT1b x0=b[0]-a0; NT1b x1=b[1]-a1;
+ NT1b y0=c[0]-a0; NT1b y1=c[1]-a1;
+ return CGAL::determinant<NT>(x0,x1,y0,y1);
+ }
+ static CGAL::Sign sign_of_determinant_of_points(Vector a, Vector b, Vector c) {
+ NT1b a0=a[0]; NT1b a1=a[1];
+ NT1b x0=b[0]-a0; NT1b x1=b[1]-a1;
+ NT2b y0=c[0]-a0; NT2b y1=c[1]-a1;
+ return CGAL::compare(x0*y1,x1*y0);
+ }
+ };
+
+}
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Vector/vector.h b/include/gudhi_patches/CGAL/NewKernel_d/Vector/vector.h
new file mode 100644
index 00000000..f9cc4e3c
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Vector/vector.h
@@ -0,0 +1,167 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_VECTOR_VECTOR_H
+#define CGAL_VECTOR_VECTOR_H
+#include <boost/type_traits/is_arithmetic.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <CGAL/Dimension.h>
+#include <CGAL/NewKernel_d/utils.h>
+#include <vector>
+#include <boost/preprocessor/repetition.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+namespace CGAL {
+
+//Derive from a class that doesn't depend on Dim, or still use Dim for checking?
+template<class NT_,class Dim_,class Max_dim_=Dim_> struct Vector_vector {
+ typedef NT_ NT;
+ typedef Dim_ Dimension;
+ typedef Max_dim_ Max_dimension;
+ typedef std::vector<NT> Vector;
+ template< class D2, class D3=D2 >
+ struct Rebind_dimension {
+ typedef Vector_vector< NT, D2, D3 > Other;
+ };
+ template<class> struct Property : boost::false_type {};
+
+ struct Construct_vector {
+ struct Dimension {
+ Vector operator()(int d) const {
+ return Vector(d);
+ }
+ };
+
+ struct Iterator {
+ template<typename Iter>
+ Vector operator()(int CGAL_assertion_code(d),Iter const& f,Iter const& e) const {
+ CGAL_assertion(d==std::distance(f,e));
+ return Vector(f,e);
+ }
+ };
+
+ // unneeded thanks to Iterator_and_last?
+#if 0
+ struct Iterator_add_one {
+ template<typename Iter>
+ Vector operator()(int CGAL_assertion_code(d),Iter const& f,Iter const& e) const {
+ CGAL_assertion(d==std::distance(f,e)+1);
+ Vector a;
+ a.reserve(d+1);
+ a.insert(a.end(),f,e);
+ a.push_back(1);
+ return a;
+ }
+ };
+#endif
+
+ struct Iterator_and_last {
+ template<typename Iter,typename T>
+ Vector operator()(int d,Iter const& f,Iter const& e,CGAL_FORWARDABLE(T) t) const {
+ CGAL_assertion(d==std::distance(f,e)+1);
+ Vector a;
+ a.reserve(d+1);
+ a.insert(a.end(),f,e);
+ a.push_back(CGAL_FORWARD(T,t));
+ return a;
+ }
+ };
+
+ // useless, use a transform_iterator?
+#if 0
+ struct Iterator_and_last_divide {
+ template<typename Iter,typename T>
+ Vector operator()(int d,Iter f,Iter const& e,T const&t) const {
+ CGAL_assertion(d==std::distance(f,e)+1);
+ Vector a;
+ a.reserve(d+1);
+ for(;f!=e;++f){
+ a.push_back(*f/t);
+ }
+ return a;
+ }
+ };
+#endif
+
+ struct Values {
+#ifdef CGAL_CXX11
+ template<class...U>
+ Vector operator()(U&&...u) const {
+ //TODO: check the right number of {}, g++ accepts one and two
+ Vector a={forward_safe<NT,U>(u)...};
+ return a;
+ }
+#else
+
+#define CGAL_VAR(Z,N,_) a.push_back(t##N);
+#define CGAL_CODE(Z,N,_) Vector operator()(BOOST_PP_ENUM_PARAMS(N,NT const& t)) const { \
+ Vector a; \
+ a.reserve(N); \
+ BOOST_PP_REPEAT(N,CGAL_VAR,) \
+ return a; \
+}
+BOOST_PP_REPEAT_FROM_TO(1, 11, CGAL_CODE, _ )
+#undef CGAL_CODE
+#undef CGAL_VAR
+
+#endif
+ };
+
+ struct Values_divide {
+#ifdef CGAL_CXX11
+ template<class H,class...U>
+ Vector operator()(H const&h,U&&...u) const {
+ //TODO: do we want to cast at some point?
+ //e.g. to avoid 1/2 in integers
+ // ==> use Rational_traits<NT>().make_rational(x,y) ?
+ Vector a={Rational_traits<NT>().make_rational(std::forward<U>(u),h)...};
+ return a;
+ }
+#else
+
+#define CGAL_VAR(Z,N,_) a.push_back(Rational_traits<NT>().make_rational( t##N ,h));
+#define CGAL_CODE(Z,N,_) template<class H> Vector \
+ operator()(H const&h, BOOST_PP_ENUM_PARAMS(N,NT const& t)) const { \
+ Vector a; \
+ a.reserve(N); \
+ BOOST_PP_REPEAT(N,CGAL_VAR,) \
+ return a; \
+ }
+ BOOST_PP_REPEAT_FROM_TO(1, 11, CGAL_CODE, _ )
+#undef CGAL_CODE
+#undef CGAL_VAR
+
+#endif
+ };
+ };
+ typedef typename Vector::const_iterator Vector_const_iterator;
+ static Vector_const_iterator vector_begin(Vector const&a){
+ return a.begin();
+ }
+ static Vector_const_iterator vector_end(Vector const&a){
+ return a.end();
+ }
+ static int size_of_vector(Vector const&a){
+ return (int)a.size();
+ }
+};
+
+
+}
+#endif
+
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Cartesian_wrap.h b/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Cartesian_wrap.h
new file mode 100644
index 00000000..44e9aa96
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Cartesian_wrap.h
@@ -0,0 +1,305 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KERNEL_D_CARTESIAN_WRAP_H
+#define CGAL_KERNEL_D_CARTESIAN_WRAP_H
+
+#include <CGAL/basic.h>
+#include <CGAL/is_iterator.h>
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable:4003) // not enough actual parameters for macro 'BOOST_PP_EXPAND_I'
+ // http://lists.boost.org/boost-users/2014/11/83291.php
+#endif
+#include <CGAL/NewKernel_d/Wrapper/Point_d.h>
+#include <CGAL/NewKernel_d/Wrapper/Vector_d.h>
+#include <CGAL/NewKernel_d/Wrapper/Segment_d.h>
+#include <CGAL/NewKernel_d/Wrapper/Sphere_d.h>
+#include <CGAL/NewKernel_d/Wrapper/Hyperplane_d.h>
+#include <CGAL/NewKernel_d/Wrapper/Weighted_point_d.h>
+
+#include <CGAL/NewKernel_d/Wrapper/Ref_count_obj.h>
+
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/contains.hpp>
+#include <boost/mpl/vector.hpp>
+
+//TODO: do we want to store the kernel ref in the Object wrappers? It would allow for additions and operator[] and things like that to work, but objects would still need to be created by functors.
+
+namespace CGAL {
+namespace internal {
+BOOST_MPL_HAS_XXX_TRAIT_DEF(Is_wrapper)
+template<class T,bool=has_Is_wrapper<T>::value> struct Is_wrapper {
+ enum { value=false };
+ typedef Tag_false type;
+};
+template<class T> struct Is_wrapper<T,true> {
+ typedef typename T::Is_wrapper type;
+ enum { value=type::value };
+};
+
+template<class T,bool=is_iterator_type<T,std::input_iterator_tag>::value> struct Is_wrapper_iterator {
+ enum { value=false };
+ typedef Tag_false type;
+};
+template<class T> struct Is_wrapper_iterator<T,true> :
+ Is_wrapper<typename std::iterator_traits<typename CGAL::decay<T>::type>::value_type>
+{ };
+
+struct Forward_rep {
+//TODO: make a good C++0X version with perfect forwarding
+//#ifdef CGAL_CXX11
+//template <class T,class=typename std::enable_if<!Is_wrapper<typename std::decay<T>::type>::value&&!Is_wrapper_iterator<typename std::decay<T>::type>::value>::type>
+//T&& operator()(typename std::remove_reference<T>::type&& t) const {return static_cast<T&&>(t);};
+//template <class T,class=typename std::enable_if<!Is_wrapper<typename std::decay<T>::type>::value&&!Is_wrapper_iterator<typename std::decay<T>::type>::value>::type>
+//T&& operator()(typename std::remove_reference<T>::type& t) const {return static_cast<T&&>(t);};
+//
+//template <class T,class=typename std::enable_if<Is_wrapper<typename std::decay<T>::type>::value>::type>
+//typename Type_copy_cvref<T,typename std::decay<T>::type::Rep>::type&&
+//operator()(T&& t) const {
+// return static_cast<typename Type_copy_cvref<T,typename std::decay<T>::type::Rep>::type&&>(t.rep());
+//};
+//
+//template <class T,class=typename std::enable_if<Is_wrapper_iterator<typename std::decay<T>::type>::value>::type>
+//transforming_iterator<Forward_rep,typename std::decay<T>::type>
+//operator()(T&& t) const {
+// return make_transforming_iterator(std::forward<T>(t),Forward_rep());
+//};
+//#else
+template <class T,bool=Is_wrapper<T>::value,bool=Is_wrapper_iterator<T>::value> struct result_;
+template <class T> struct result_<T,false,false>{typedef T const& type;};
+template <class T> struct result_<T,true,false>{typedef typename decay<T>::type::Rep const& type;};
+template <class T> struct result_<T,false,true>{typedef transforming_iterator<Forward_rep,typename decay<T>::type> type;};
+template<class> struct result;
+template<class T> struct result<Forward_rep(T)> : result_<T> {};
+
+template <class T> typename boost::disable_if<boost::mpl::or_<Is_wrapper<T>,Is_wrapper_iterator<T> >,T>::type const& operator()(T const& t) const {return t;}
+template <class T> typename boost::disable_if<boost::mpl::or_<Is_wrapper<T>,Is_wrapper_iterator<T> >,T>::type& operator()(T& t) const {return t;}
+
+template <class T> typename T::Rep const& operator()(T const& t, typename boost::enable_if<Is_wrapper<T> >::type* = 0) const {return t.rep();}
+
+template <class T> transforming_iterator<Forward_rep,typename boost::enable_if<Is_wrapper_iterator<T>,T>::type> operator()(T const& t) const {return make_transforming_iterator(t,Forward_rep());}
+//#endif
+};
+}
+
+template <class B, class K, class T, bool = Provides_type<B, T>::value>
+struct Map_wrapping_type : Get_type<B, T> {};
+#define CGAL_REGISTER_OBJECT_WRAPPER(X) \
+ template <class B, class K> \
+ struct Map_wrapping_type <B, K, X##_tag, true> { \
+ typedef Wrap::X##_d<K> type; \
+ }
+CGAL_REGISTER_OBJECT_WRAPPER(Point);
+CGAL_REGISTER_OBJECT_WRAPPER(Vector);
+CGAL_REGISTER_OBJECT_WRAPPER(Segment);
+CGAL_REGISTER_OBJECT_WRAPPER(Sphere);
+CGAL_REGISTER_OBJECT_WRAPPER(Hyperplane);
+CGAL_REGISTER_OBJECT_WRAPPER(Weighted_point);
+#undef CGAL_REGISTER_OBJECT_WRAPPER
+
+// Note: this tends to be an all or nothing thing currently, wrapping
+// only some types breaks, probably because we don't check whether the
+// return type is indeed wrapped.
+template < typename Base_ , typename Derived_ = Default >
+struct Cartesian_wrap : public Base_
+{
+ CGAL_CONSTEXPR Cartesian_wrap(){}
+ CGAL_CONSTEXPR Cartesian_wrap(int d):Base_(d){}
+ typedef Base_ Kernel_base;
+ typedef Cartesian_wrap Self;
+ // TODO: pass the 2 types Self and Derived to the wrappers, they can use Self for most purposes and Derived only for Kernel_traits' typedef R.
+ typedef typename Default::Get<Derived_, Self>::type Derived;
+ // FIXME: The list doesn't belong here.
+ typedef boost::mpl::vector<Point_tag,Segment_tag,Sphere_tag,Vector_tag,Hyperplane_tag> Wrapped_list;
+
+ template <class T>
+ struct Type : Map_wrapping_type<Base_, Derived, T> {};
+
+ //Translate the arguments
+ template <class T, class D = void,
+ class=typename Get_functor_category<Derived,T>::type,
+ bool=Provides_functor<Kernel_base, T>::value,
+ bool=boost::mpl::contains<Wrapped_list,typename map_result_tag<T>::type>::type::value>
+ struct Functor {
+ typedef typename Get_functor<Kernel_base, T>::type B;
+ struct type {
+ B b;
+ type(){}
+ type(Self const&k):b(k){}
+ typedef typename B::result_type result_type;
+#ifdef CGAL_CXX11
+ template<class...U> result_type operator()(U&&...u)const{
+ return b(internal::Forward_rep()(u)...);
+ }
+#else
+#define CGAL_VAR(Z,N,_) internal::Forward_rep()(u##N)
+#define CGAL_CODE(Z,N,_) template<BOOST_PP_ENUM_PARAMS(N,class U)> result_type \
+ operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,U,const&u))const{ \
+ return b(BOOST_PP_ENUM(N,CGAL_VAR,)); \
+ }
+ BOOST_PP_REPEAT_FROM_TO(1,11,CGAL_CODE,_)
+#undef CGAL_CODE
+#undef CGAL_VAR
+// In case the last argument needs to be non-const. Fragile...
+#define CGAL_VAR(Z,N,_) internal::Forward_rep()(u##N)
+#define CGAL_CODE(Z,N,_) template<BOOST_PP_ENUM_PARAMS(N,class U),class V> result_type \
+ operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,U,const&u),V&v)const{ \
+ return b(BOOST_PP_ENUM(N,CGAL_VAR,),internal::Forward_rep()(v)); \
+ }
+ BOOST_PP_REPEAT_FROM_TO(1,8,CGAL_CODE,_)
+#undef CGAL_CODE
+#undef CGAL_VAR
+#endif
+ };
+ };
+
+ // Preserve the difference between Null_functor and nothing.
+ template <class T, class D, class C, bool b>
+ struct Functor <T, D, C, false, b>
+ : Get_functor <Kernel_base, T> {};
+
+ //Translate both the arguments and the result
+ //TODO: Check Is_wrapper instead of relying on map_result_tag?
+ template<class T,class D> struct Functor<T,D,Construct_tag,true,true> {
+ typedef typename Get_functor<Kernel_base, T>::type B;
+ struct type {
+ B b;
+ type(){}
+ type(Self const&k):b(k){}
+ typedef typename map_result_tag<T>::type result_tag;
+ // FIXME: Self or Derived?
+ typedef typename Get_type<Self,result_tag>::type result_type;
+#ifdef CGAL_CXX11
+ template<class...U> result_type operator()(U&&...u)const{
+ return result_type(Eval_functor(),b,internal::Forward_rep()(u)...);
+ }
+#else
+#define CGAL_VAR(Z,N,_) internal::Forward_rep()(u##N)
+#define CGAL_CODE(Z,N,_) template<BOOST_PP_ENUM_PARAMS(N,class U)> result_type \
+ operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,U,const&u))const{ \
+ return result_type(Eval_functor(),b,BOOST_PP_ENUM(N,CGAL_VAR,)); \
+ }
+ BOOST_PP_REPEAT_FROM_TO(1,11,CGAL_CODE,_)
+#undef CGAL_CODE
+#undef CGAL_VAR
+#endif
+ };
+ };
+
+};
+
+template < typename Base_ >
+struct Cartesian_refcount : public Base_
+{
+ CGAL_CONSTEXPR Cartesian_refcount(){}
+ CGAL_CONSTEXPR Cartesian_refcount(int d):Base_(d){}
+ typedef Base_ Kernel_base;
+ typedef Cartesian_refcount Self;
+
+ // FIXME: Use object_list, or a list passed as argument, or anything
+ // automatic.
+ template <class T, class=void> struct Type : Get_type<Base_, T> {};
+#define CGAL_Kernel_obj(X,Y) \
+ template <class D> struct Type<X##_tag, D> { typedef Ref_count_obj<Cartesian_refcount, X##_tag> type; };
+
+ CGAL_Kernel_obj(Point,point)
+ CGAL_Kernel_obj(Vector,vector)
+#undef CGAL_Kernel_obj
+
+ template<class T> struct Dispatch {
+ //typedef typename map_functor_type<T>::type f_t;
+ typedef typename map_result_tag<T>::type r_t;
+ enum {
+ is_nul = boost::is_same<typename Get_functor<Kernel_base, T>::type,Null_functor>::value,
+ ret_rcobj = boost::is_same<r_t,Point_tag>::value || boost::is_same<r_t,Vector_tag>::value
+ };
+ };
+
+ //Translate the arguments
+ template<class T,class D=void,bool=Dispatch<T>::is_nul,bool=Dispatch<T>::ret_rcobj> struct Functor {
+ typedef typename Get_functor<Kernel_base, T>::type B;
+ struct type {
+ B b;
+ type(){}
+ type(Self const&k):b(k){}
+ typedef typename B::result_type result_type;
+#ifdef CGAL_CXX11
+ template<class...U> result_type operator()(U&&...u)const{
+ return b(internal::Forward_rep()(u)...);
+ }
+#else
+ result_type operator()()const{
+ return b();
+ }
+#define CGAL_VAR(Z,N,_) internal::Forward_rep()(u##N)
+#define CGAL_CODE(Z,N,_) template<BOOST_PP_ENUM_PARAMS(N,class U)> result_type \
+ operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,U,const&u))const{ \
+ return b(BOOST_PP_ENUM(N,CGAL_VAR,)); \
+ }
+ BOOST_PP_REPEAT_FROM_TO(1,11,CGAL_CODE,_)
+#undef CGAL_CODE
+#undef CGAL_VAR
+#endif
+ };
+ };
+
+ //Translate both the arguments and the result
+ template<class T,class D,bool b> struct Functor<T,D,true,b> {
+ typedef Null_functor type;
+ };
+
+ template<class T,class D> struct Functor<T,D,false,true> {
+ typedef typename Get_functor<Kernel_base, T>::type B;
+ struct type {
+ B b;
+ type(){}
+ type(Self const&k):b(k){}
+ typedef typename map_result_tag<T>::type result_tag;
+ typedef typename Get_type<Self,result_tag>::type result_type;
+#ifdef CGAL_CXX11
+ template<class...U> result_type operator()(U&&...u)const{
+ return result_type(Eval_functor(),b,internal::Forward_rep()(u)...);
+ }
+#else
+ result_type operator()()const{
+ return result_type(Eval_functor(),b);
+ }
+#define CGAL_VAR(Z,N,_) internal::Forward_rep()(u##N)
+#define CGAL_CODE(Z,N,_) template<BOOST_PP_ENUM_PARAMS(N,class U)> result_type \
+ operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,U,const&u))const{ \
+ return result_type(Eval_functor(),b,BOOST_PP_ENUM(N,CGAL_VAR,)); \
+ }
+ BOOST_PP_REPEAT_FROM_TO(1,11,CGAL_CODE,_)
+#undef CGAL_CODE
+#undef CGAL_VAR
+#endif
+ };
+ };
+
+};
+
+} //namespace CGAL
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif // CGAL_KERNEL_D_CARTESIAN_WRAP_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Hyperplane_d.h b/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Hyperplane_d.h
new file mode 100644
index 00000000..54fd50bd
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Hyperplane_d.h
@@ -0,0 +1,131 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_WRAPPER_HYPERPLANE_D_H
+#define CGAL_WRAPPER_HYPERPLANE_D_H
+
+#include <CGAL/representation_tags.h>
+#include <CGAL/assertions.h>
+#include <boost/type_traits.hpp>
+#include <CGAL/Kernel/Return_base_tag.h>
+#include <CGAL/Dimension.h>
+#ifndef CGAL_CXX11
+#include <boost/preprocessor/repetition.hpp>
+#endif
+#include <boost/utility/result_of.hpp>
+
+namespace CGAL {
+namespace Wrap {
+
+template <class R_>
+class Hyperplane_d : public Get_type<typename R_::Kernel_base, Hyperplane_tag>::type
+{
+ typedef typename Get_type<R_, FT_tag>::type FT_;
+ typedef typename R_::Kernel_base Kbase;
+ typedef typename Get_type<R_, Vector_tag>::type Vector_;
+ typedef typename Get_functor<Kbase, Construct_ttag<Hyperplane_tag> >::type CHBase;
+ typedef typename Get_functor<Kbase, Orthogonal_vector_tag>::type OVBase;
+ typedef typename Get_functor<Kbase, Hyperplane_translation_tag>::type HTBase;
+
+ typedef Hyperplane_d Self;
+ CGAL_static_assertion((boost::is_same<Self, typename Get_type<R_, Hyperplane_tag>::type>::value));
+
+public:
+
+ typedef Tag_true Is_wrapper;
+ typedef typename R_::Default_ambient_dimension Ambient_dimension;
+ typedef typename Increment_dimension<Ambient_dimension,-1>::type Feature_dimension;
+
+ typedef typename Get_type<Kbase, Hyperplane_tag>::type Rep;
+
+ const Rep& rep() const
+ {
+ return *this;
+ }
+
+ Rep& rep()
+ {
+ return *this;
+ }
+
+ typedef R_ R;
+
+#ifdef CGAL_CXX11
+ template<class...U,class=typename std::enable_if<!std::is_same<std::tuple<typename std::decay<U>::type...>,std::tuple<Hyperplane_d> >::value>::type> explicit Hyperplane_d(U&&...u)
+ : Rep(CHBase()(std::forward<U>(u)...)){}
+
+// // called from Construct_point_d
+// template<class...U> explicit Point_d(Eval_functor&&,U&&...u)
+// : Rep(Eval_functor(), std::forward<U>(u)...){}
+ template<class F,class...U> explicit Hyperplane_d(Eval_functor&&,F&&f,U&&...u)
+ : Rep(std::forward<F>(f)(std::forward<U>(u)...)){}
+
+#if 0
+ // the new standard may make this necessary
+ Point_d(Point_d const&)=default;
+ Point_d(Point_d &);//=default;
+ Point_d(Point_d &&)=default;
+#endif
+
+ // try not to use these
+ Hyperplane_d(Rep const& v) : Rep(v) {}
+ Hyperplane_d(Rep& v) : Rep(static_cast<Rep const&>(v)) {}
+ Hyperplane_d(Rep&& v) : Rep(std::move(v)) {}
+
+#else
+
+ Hyperplane_d() : Rep(CHBase()()) {}
+
+ Hyperplane_d(Rep const& v) : Rep(v) {} // try not to use it
+
+#define CGAL_CODE(Z,N,_) template<BOOST_PP_ENUM_PARAMS(N,class T)> \
+ explicit Hyperplane_d(BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : Rep(CHBase()( \
+ BOOST_PP_ENUM_PARAMS(N,t))) {} \
+ \
+ template<class F,BOOST_PP_ENUM_PARAMS(N,class T)> \
+ Hyperplane_d(Eval_functor,F const& f,BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : Rep(f(BOOST_PP_ENUM_PARAMS(N,t))) {}
+ /*
+ template<BOOST_PP_ENUM_PARAMS(N,class T)> \
+ Point_d(Eval_functor,BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : Rep(Eval_functor(), BOOST_PP_ENUM_PARAMS(N,t)) {}
+ */
+
+ BOOST_PP_REPEAT_FROM_TO(1,11,CGAL_CODE,_)
+#undef CGAL_CODE
+
+#endif
+
+ //TODO: if OVBase returns a reference to a base vector, cast it to a
+ //reference to a wrapper vector. Ugly but should be safe.
+ Vector_ orthogonal_vector()const{
+ return Vector_(Eval_functor(),OVBase(),rep());
+ }
+ FT_ translation()const{
+ return HTBase()(rep());
+ }
+
+
+};
+
+} //namespace Wrap
+} //namespace CGAL
+
+#endif // CGAL_WRAPPER_SPHERE_D_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Point_d.h b/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Point_d.h
new file mode 100644
index 00000000..0718c947
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Point_d.h
@@ -0,0 +1,284 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_WRAPPER_POINT_D_H
+#define CGAL_WRAPPER_POINT_D_H
+
+#include <ostream>
+#include <CGAL/Origin.h>
+#include <CGAL/Kernel/mpl.h>
+#include <CGAL/representation_tags.h>
+#include <CGAL/assertions.h>
+#include <boost/type_traits.hpp>
+#include <CGAL/Kernel/Return_base_tag.h>
+#include <CGAL/Dimension.h>
+#ifndef CGAL_CXX11
+#include <boost/preprocessor/repetition.hpp>
+#endif
+#include <boost/utility/result_of.hpp>
+
+namespace CGAL {
+namespace Wrap {
+
+template <class R_>
+class Point_d : public Get_type<typename R_::Kernel_base, Point_tag>::type
+ // Deriving won't work if the point is just a __m256d.
+ // Test boost/std::is_class for instance
+{
+ typedef typename Get_type<R_, RT_tag>::type RT_;
+ typedef typename Get_type<R_, FT_tag>::type FT_;
+ typedef typename R_::Kernel_base Kbase;
+ typedef typename Get_type<R_, Vector_tag>::type Vector_;
+ typedef typename Get_functor<Kbase, Construct_ttag<Point_tag> >::type CPBase;
+ typedef typename Get_functor<Kbase, Compute_point_cartesian_coordinate_tag>::type CCBase;
+ typedef typename Get_functor<Kbase, Construct_ttag<Point_cartesian_const_iterator_tag> >::type CPI;
+
+
+ typedef Point_d Self;
+ CGAL_static_assertion((boost::is_same<Self, typename Get_type<R_, Point_tag>::type>::value));
+
+public:
+
+ typedef Tag_true Is_wrapper;
+ typedef typename R_::Default_ambient_dimension Ambient_dimension;
+ typedef Dimension_tag<0> Feature_dimension;
+
+ typedef typename Get_type<Kbase, Point_tag>::type Rep;
+ //typedef typename CGAL::decay<typename boost::result_of<CPI(Rep,Begin_tag)>::type>::type Cartesian_const_iterator;
+
+ const Rep& rep() const
+ {
+ return *this;
+ }
+
+ Rep& rep()
+ {
+ return *this;
+ }
+
+ typedef R_ R;
+
+#ifdef CGAL_CXX11
+ template<class...U,class=typename std::enable_if<!std::is_same<std::tuple<typename std::decay<U>::type...>,std::tuple<Point_d> >::value>::type> explicit Point_d(U&&...u)
+ : Rep(CPBase()(std::forward<U>(u)...)){}
+
+// // called from Construct_point_d
+// template<class...U> explicit Point_d(Eval_functor&&,U&&...u)
+// : Rep(Eval_functor(), std::forward<U>(u)...){}
+ template<class F,class...U> explicit Point_d(Eval_functor&&,F&&f,U&&...u)
+ : Rep(std::forward<F>(f)(std::forward<U>(u)...)){}
+
+#if 0
+ // the new standard may make this necessary
+ Point_d(Point_d const&)=default;
+ Point_d(Point_d &);//=default;
+ Point_d(Point_d &&)=default;
+#endif
+
+ // try not to use these
+ Point_d(Rep const& v) : Rep(v) {}
+ Point_d(Rep& v) : Rep(static_cast<Rep const&>(v)) {}
+ Point_d(Rep&& v) : Rep(std::move(v)) {}
+
+ // this one should be implicit
+ Point_d(Origin const& v)
+ : Rep(CPBase()(v)) {}
+ Point_d(Origin& v)
+ : Rep(CPBase()(v)) {}
+ Point_d(Origin&& v)
+ : Rep(CPBase()(std::move(v))) {}
+
+#else
+
+ Point_d() : Rep(CPBase()()) {}
+
+ Point_d(Rep const& v) : Rep(v) {} // try not to use it
+
+#define CGAL_CODE(Z,N,_) template<BOOST_PP_ENUM_PARAMS(N,class T)> \
+ explicit Point_d(BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : Rep(CPBase()( \
+ BOOST_PP_ENUM_PARAMS(N,t))) {} \
+ \
+ template<class F,BOOST_PP_ENUM_PARAMS(N,class T)> \
+ Point_d(Eval_functor,F const& f,BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : Rep(f(BOOST_PP_ENUM_PARAMS(N,t))) {}
+ /*
+ template<BOOST_PP_ENUM_PARAMS(N,class T)> \
+ Point_d(Eval_functor,BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : Rep(Eval_functor(), BOOST_PP_ENUM_PARAMS(N,t)) {}
+ */
+
+ BOOST_PP_REPEAT_FROM_TO(1,11,CGAL_CODE,_)
+#undef CGAL_CODE
+
+ // this one should be implicit
+ Point_d(Origin const& o)
+ : Rep(CPBase()(o)) {}
+
+#endif
+
+ typename boost::result_of<CCBase(Rep,int)>::type cartesian(int i)const{
+ return CCBase()(rep(),i);
+ }
+ typename boost::result_of<CCBase(Rep,int)>::type operator[](int i)const{
+ return CCBase()(rep(),i);
+ }
+
+ typename boost::result_of<CPI(Rep,Begin_tag)>::type cartesian_begin()const{
+ return CPI()(rep(),Begin_tag());
+ }
+
+ typename boost::result_of<CPI(Rep,End_tag)>::type cartesian_end()const{
+ return CPI()(rep(),End_tag());
+ }
+
+ int dimension() const {
+ typedef typename Get_functor<Kbase, Point_dimension_tag>::type PDBase;
+ return PDBase()(rep());
+ }
+
+ /*
+ Direction_d direction() const
+ {
+ return R().construct_direction_d_object()(*this);
+ }
+
+ Vector_d transform(const Aff_transformation_d &t) const
+ {
+ return t.transform(*this);
+ }
+
+ Vector_d operator/(const RT& c) const
+ {
+ return R().construct_divided_vector_d_object()(*this,c);
+ }
+
+ Vector_d operator/(const typename First_if_different<FT_,RT>::Type & c) const
+ {
+ return R().construct_divided_vector_d_object()(*this,c);
+ }
+
+ typename Qualified_result_of<typename R::Compute_x_3, Vector_3>::type
+ x() const
+ {
+ return R().compute_x_3_object()(*this);
+ }
+
+ typename Qualified_result_of<typename R::Compute_y_3, Vector_3>::type
+ y() const
+ {
+ return R().compute_y_3_object()(*this);
+ }
+
+ typename Qualified_result_of<typename R::Compute_z_3, Vector_3>::type
+ z() const
+ {
+ return R().compute_z_3_object()(*this);
+ }
+
+ typename Qualified_result_of<typename R::Compute_hx_3, Vector_3>::type
+ hx() const
+ {
+ return R().compute_hx_3_object()(*this);
+ }
+
+ typename Qualified_result_of<typename R::Compute_hy_3, Vector_3>::type
+ hy() const
+ {
+ return R().compute_hy_3_object()(*this);
+ }
+
+ typename Qualified_result_of<typename R::Compute_hz_3, Vector_3>::type
+ hz() const
+ {
+ return R().compute_hz_3_object()(*this);
+ }
+
+ typename Qualified_result_of<typename R::Compute_hw_3, Vector_3>::type
+ hw() const
+ {
+ return R().compute_hw_3_object()(*this);
+ }
+
+ typename Qualified_result_of<typename R::Compute_x_3, Vector_3>::type
+ cartesian(int i) const
+ {
+ CGAL_kernel_precondition( (i == 0) || (i == 1) || (i == 2) );
+ if (i==0) return x();
+ if (i==1) return y();
+ return z();
+ }
+
+ typename Qualified_result_of<typename R::Compute_hw_3, Vector_3>::type
+ homogeneous(int i) const
+ {
+ CGAL_kernel_precondition( (i >= 0) || (i <= 3) );
+ if (i==0) return hx();
+ if (i==1) return hy();
+ if (i==2) return hz();
+ return hw();
+ }
+
+ typename Qualified_result_of<typename R::Compute_squared_length_3, Vector_3>::type
+ squared_length() const
+ {
+ return R().compute_squared_length_3_object()(*this);
+ }
+*/
+};
+#if 0
+template <class R_> Point_d<R_>::Point_d(Point_d &)=default;
+#endif
+
+//TODO: IO
+
+template <class R_>
+std::ostream& operator <<(std::ostream& os, const Point_d<R_>& p)
+{
+ typedef typename R_::Kernel_base Kbase;
+ typedef typename Get_functor<Kbase, Construct_ttag<Point_cartesian_const_iterator_tag> >::type CPI;
+ // Should just be "auto"...
+ typename CGAL::decay<typename boost::result_of<
+ CPI(typename Point_d<R_>::Rep,Begin_tag)
+ >::type>::type
+ b = p.cartesian_begin(),
+ e = p.cartesian_end();
+ os << p.dimension();
+ for(; b != e; ++b){
+ os << " " << *b;
+ }
+ return os;
+}
+
+//template <class R_>
+//Vector_d<R_> operator+(const Vector_d<R_>& v,const Vector_d<R_>& w) const
+//{
+// return typename R::template Construct<Sum_of_vectors_tag>::type()(v,w);
+//}
+//
+//template <class R_>
+//Vector_d<R_> operator-(const Vector_d<R_>& v,const Vector_d<R_>& w) const
+//{
+// return typename R::template Construct<Difference_of_vectors_tag>::type()(v,w);
+//}
+
+} //namespace Wrap
+} //namespace CGAL
+
+#endif // CGAL_WRAPPER_POINT_D_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Ref_count_obj.h b/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Ref_count_obj.h
new file mode 100644
index 00000000..f33e14c0
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Ref_count_obj.h
@@ -0,0 +1,120 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_WRAPPER_REF_COUNT_OBJ_H
+#define CGAL_WRAPPER_REF_COUNT_OBJ_H
+
+#include <CGAL/Origin.h>
+#include <CGAL/Handle_for.h>
+#include <CGAL/Kernel/mpl.h>
+#include <CGAL/representation_tags.h>
+#include <CGAL/assertions.h>
+#include <boost/type_traits.hpp>
+#include <CGAL/Kernel/Return_base_tag.h>
+#include <CGAL/Dimension.h>
+#ifndef CGAL_CXX11
+#include <boost/preprocessor/repetition.hpp>
+#endif
+#include <boost/utility/result_of.hpp>
+
+// no need for a fancy interface here, people can use the Point_d wrapper on
+// top.
+
+namespace CGAL {
+
+template <class R_, class Tag_>
+class Ref_count_obj
+{
+ typedef typename R_::Kernel_base Kbase;
+ typedef typename Get_functor<Kbase, Construct_ttag<Tag_> >::type CBase;
+
+ typedef Ref_count_obj Self;
+ CGAL_static_assertion((boost::is_same<Self, typename Get_type<R_, Tag_>::type>::value));
+
+public:
+ typedef R_ R;
+
+ typedef Tag_true Is_wrapper;
+ typedef typename R_::Default_ambient_dimension Ambient_dimension;
+ //typedef Dimension_tag<0> Feature_dimension;
+
+ typedef typename Get_type<Kbase, Tag_>::type Rep;
+ typedef Handle_for<Rep> Data;
+
+private:
+ Data data;
+public:
+
+ const Rep& rep() const
+ {
+ return CGAL::get_pointee_or_identity(data);
+ }
+
+#ifdef CGAL_CXX11
+ template<class...U,class=typename std::enable_if<!std::is_same<std::tuple<typename std::decay<U>::type...>,std::tuple<Ref_count_obj> >::value>::type> explicit Ref_count_obj(U&&...u)
+ : data(Eval_functor(),CBase(),std::forward<U>(u)...){}
+
+ template<class F,class...U> explicit Ref_count_obj(Eval_functor&&,F&&f,U&&...u)
+ : data(Eval_functor(),std::forward<F>(f),std::forward<U>(u)...){}
+
+ // try not to use these
+ Ref_count_obj(Rep const& v) : data(v) {}
+ Ref_count_obj(Rep& v) : data(static_cast<Rep const&>(v)) {}
+ Ref_count_obj(Rep&& v) : data(std::move(v)) {}
+
+ // Do we really need this for point?
+// // this one should be implicit
+// Ref_count_obj(Origin const& v)
+// : data(Eval_functor(),CBase(),v) {}
+// Ref_count_obj(Origin& v)
+// : data(Eval_functor(),CBase(),v) {}
+// Ref_count_obj(Origin&& v)
+// : data(Eval_functor(),CBase(),std::move(v)) {}
+
+#else
+
+ Ref_count_obj() : data(Eval_functor(),CBase()) {}
+
+ Ref_count_obj(Rep const& v) : data(v) {} // try not to use it
+
+#define CGAL_CODE(Z,N,_) template<BOOST_PP_ENUM_PARAMS(N,class T)> \
+ explicit Ref_count_obj(BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : data(Eval_functor(),CBase(),BOOST_PP_ENUM_PARAMS(N,t)) {} \
+ \
+ template<class F,BOOST_PP_ENUM_PARAMS(N,class T)> \
+ Ref_count_obj(Eval_functor,F const& f,BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : data(Eval_functor(),f,BOOST_PP_ENUM_PARAMS(N,t)) {}
+
+ BOOST_PP_REPEAT_FROM_TO(1,11,CGAL_CODE,_)
+#undef CGAL_CODE
+ template<class F>
+ Ref_count_obj(Eval_functor,F const& f)
+ : data(Eval_functor(),f) {}
+
+// // this one should be implicit
+// Ref_count_obj(Origin const& o)
+// : data(Eval_functor(),CBase(),o) {}
+
+#endif
+
+};
+
+} //namespace CGAL
+
+#endif
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Segment_d.h b/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Segment_d.h
new file mode 100644
index 00000000..bfb20a77
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Segment_d.h
@@ -0,0 +1,133 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_WRAPPER_SEGMENT_D_H
+#define CGAL_WRAPPER_SEGMENT_D_H
+
+#include <CGAL/Origin.h>
+#include <CGAL/Kernel/mpl.h>
+#include <CGAL/representation_tags.h>
+#include <CGAL/assertions.h>
+#include <boost/type_traits.hpp>
+#include <CGAL/Kernel/Return_base_tag.h>
+#include <CGAL/Dimension.h>
+#ifndef CGAL_CXX11
+#include <boost/preprocessor/repetition.hpp>
+#endif
+#include <boost/utility/result_of.hpp>
+
+namespace CGAL {
+namespace Wrap {
+
+template <class R_>
+class Segment_d : public Get_type<typename R_::Kernel_base, Segment_tag>::type
+{
+ typedef typename Get_type<R_, RT_tag>::type RT_;
+ typedef typename Get_type<R_, FT_tag>::type FT_;
+ typedef typename R_::Kernel_base Kbase;
+ typedef typename Get_type<R_, Point_tag>::type Point_;
+ typedef typename Get_functor<Kbase, Construct_ttag<Point_tag> >::type CPBase;
+ typedef typename Get_functor<Kbase, Construct_ttag<Segment_tag> >::type CSBase;
+ typedef typename Get_functor<Kbase, Segment_extremity_tag>::type CSEBase;
+
+ typedef Segment_d Self;
+ CGAL_static_assertion((boost::is_same<Self, typename Get_type<R_, Segment_tag>::type>::value));
+
+public:
+
+ typedef Tag_true Is_wrapper;
+ typedef typename R_::Default_ambient_dimension Ambient_dimension;
+ typedef Dimension_tag<1> Feature_dimension;
+
+ typedef typename Get_type<Kbase, Segment_tag>::type Rep;
+
+ const Rep& rep() const
+ {
+ return *this;
+ }
+
+ Rep& rep()
+ {
+ return *this;
+ }
+
+ typedef R_ R;
+
+#ifdef CGAL_CXX11
+ template<class...U,class=typename std::enable_if<!std::is_same<std::tuple<typename std::decay<U>::type...>,std::tuple<Segment_d> >::value>::type> explicit Segment_d(U&&...u)
+ : Rep(CSBase()(std::forward<U>(u)...)){}
+
+// // called from Construct_point_d
+// template<class...U> explicit Point_d(Eval_functor&&,U&&...u)
+// : Rep(Eval_functor(), std::forward<U>(u)...){}
+ template<class F,class...U> explicit Segment_d(Eval_functor&&,F&&f,U&&...u)
+ : Rep(std::forward<F>(f)(std::forward<U>(u)...)){}
+
+#if 0
+ // the new standard may make this necessary
+ Point_d(Point_d const&)=default;
+ Point_d(Point_d &);//=default;
+ Point_d(Point_d &&)=default;
+#endif
+
+ // try not to use these
+ Segment_d(Rep const& v) : Rep(v) {}
+ Segment_d(Rep& v) : Rep(static_cast<Rep const&>(v)) {}
+ Segment_d(Rep&& v) : Rep(std::move(v)) {}
+
+#else
+
+ Segment_d() : Rep(CSBase()()) {}
+
+ Segment_d(Rep const& v) : Rep(v) {} // try not to use it
+
+#define CGAL_CODE(Z,N,_) template<BOOST_PP_ENUM_PARAMS(N,class T)> \
+ explicit Segment_d(BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : Rep(CSBase()( \
+ BOOST_PP_ENUM_PARAMS(N,t))) {} \
+ \
+ template<class F,BOOST_PP_ENUM_PARAMS(N,class T)> \
+ Segment_d(Eval_functor,F const& f,BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : Rep(f(BOOST_PP_ENUM_PARAMS(N,t))) {}
+ /*
+ template<BOOST_PP_ENUM_PARAMS(N,class T)> \
+ Point_d(Eval_functor,BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : Rep(Eval_functor(), BOOST_PP_ENUM_PARAMS(N,t)) {}
+ */
+
+ BOOST_PP_REPEAT_FROM_TO(1,11,CGAL_CODE,_)
+#undef CGAL_CODE
+
+#endif
+
+ //TODO: if CSEBase returns a reference to a base point, cast it to a
+ //reference to a wrapper point. Ugly but should be safe.
+ Point_ source()const{
+ return Point_(Eval_functor(),CSEBase(),rep(),0);
+ }
+ Point_ target()const{
+ return Point_(Eval_functor(),CSEBase(),rep(),1);
+ }
+
+};
+
+} //namespace Wrap
+} //namespace CGAL
+
+#endif // CGAL_WRAPPER_SEGMENT_D_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Sphere_d.h b/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Sphere_d.h
new file mode 100644
index 00000000..87f0c66e
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Sphere_d.h
@@ -0,0 +1,130 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_WRAPPER_SPHERE_D_H
+#define CGAL_WRAPPER_SPHERE_D_H
+
+#include <CGAL/representation_tags.h>
+#include <CGAL/assertions.h>
+#include <boost/type_traits.hpp>
+#include <CGAL/Kernel/Return_base_tag.h>
+#include <CGAL/Dimension.h>
+#ifndef CGAL_CXX11
+#include <boost/preprocessor/repetition.hpp>
+#endif
+#include <boost/utility/result_of.hpp>
+
+namespace CGAL {
+namespace Wrap {
+
+template <class R_>
+class Sphere_d : public Get_type<typename R_::Kernel_base, Sphere_tag>::type
+{
+ typedef typename Get_type<R_, FT_tag>::type FT_;
+ typedef typename R_::Kernel_base Kbase;
+ typedef typename Get_type<R_, Point_tag>::type Point_;
+ typedef typename Get_functor<Kbase, Construct_ttag<Sphere_tag> >::type CSBase;
+ typedef typename Get_functor<Kbase, Center_of_sphere_tag>::type COSBase;
+ typedef typename Get_functor<Kbase, Squared_radius_tag>::type SRBase;
+
+ typedef Sphere_d Self;
+ CGAL_static_assertion((boost::is_same<Self, typename Get_type<R_, Sphere_tag>::type>::value));
+
+public:
+
+ typedef Tag_true Is_wrapper;
+ typedef typename R_::Default_ambient_dimension Ambient_dimension;
+ typedef typename Increment_dimension<Ambient_dimension,-1>::type Feature_dimension;
+
+ typedef typename Get_type<Kbase, Sphere_tag>::type Rep;
+
+ const Rep& rep() const
+ {
+ return *this;
+ }
+
+ Rep& rep()
+ {
+ return *this;
+ }
+
+ typedef R_ R;
+
+#ifdef CGAL_CXX11
+ template<class...U,class=typename std::enable_if<!std::is_same<std::tuple<typename std::decay<U>::type...>,std::tuple<Sphere_d> >::value>::type> explicit Sphere_d(U&&...u)
+ : Rep(CSBase()(std::forward<U>(u)...)){}
+
+// // called from Construct_point_d
+// template<class...U> explicit Point_d(Eval_functor&&,U&&...u)
+// : Rep(Eval_functor(), std::forward<U>(u)...){}
+ template<class F,class...U> explicit Sphere_d(Eval_functor&&,F&&f,U&&...u)
+ : Rep(std::forward<F>(f)(std::forward<U>(u)...)){}
+
+#if 0
+ // the new standard may make this necessary
+ Point_d(Point_d const&)=default;
+ Point_d(Point_d &);//=default;
+ Point_d(Point_d &&)=default;
+#endif
+
+ // try not to use these
+ Sphere_d(Rep const& v) : Rep(v) {}
+ Sphere_d(Rep& v) : Rep(static_cast<Rep const&>(v)) {}
+ Sphere_d(Rep&& v) : Rep(std::move(v)) {}
+
+#else
+
+ Sphere_d() : Rep(CSBase()()) {}
+
+ Sphere_d(Rep const& v) : Rep(v) {} // try not to use it
+
+#define CGAL_CODE(Z,N,_) template<BOOST_PP_ENUM_PARAMS(N,class T)> \
+ explicit Sphere_d(BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : Rep(CSBase()( \
+ BOOST_PP_ENUM_PARAMS(N,t))) {} \
+ \
+ template<class F,BOOST_PP_ENUM_PARAMS(N,class T)> \
+ Sphere_d(Eval_functor,F const& f,BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : Rep(f(BOOST_PP_ENUM_PARAMS(N,t))) {}
+ /*
+ template<BOOST_PP_ENUM_PARAMS(N,class T)> \
+ Point_d(Eval_functor,BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : Rep(Eval_functor(), BOOST_PP_ENUM_PARAMS(N,t)) {}
+ */
+
+ BOOST_PP_REPEAT_FROM_TO(1,11,CGAL_CODE,_)
+#undef CGAL_CODE
+
+#endif
+
+ //TODO: if COSBase returns a reference to a base point, cast it to a
+ //reference to a wrapper point. Ugly but should be safe.
+ Point_ center()const{
+ return Point_(Eval_functor(),COSBase(),rep());
+ }
+ FT_ squared_radius()const{
+ return SRBase()(rep());
+ }
+
+};
+
+} //namespace Wrap
+} //namespace CGAL
+
+#endif // CGAL_WRAPPER_SPHERE_D_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Vector_d.h b/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Vector_d.h
new file mode 100644
index 00000000..b7d1f0d0
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Vector_d.h
@@ -0,0 +1,266 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_WRAPPER_VECTOR_D_H
+#define CGAL_WRAPPER_VECTOR_D_H
+
+#include <CGAL/Origin.h>
+#include <CGAL/Kernel/mpl.h>
+#include <CGAL/representation_tags.h>
+#include <CGAL/assertions.h>
+#include <boost/type_traits.hpp>
+#include <CGAL/Kernel/Return_base_tag.h>
+#include <CGAL/Dimension.h>
+#ifndef CGAL_CXX11
+#include <boost/preprocessor/repetition.hpp>
+#endif
+#include <boost/utility/result_of.hpp>
+
+namespace CGAL {
+namespace Wrap {
+
+template <class R_>
+class Vector_d : public Get_type<typename R_::Kernel_base, Vector_tag>::type
+{
+ typedef typename Get_type<R_, RT_tag>::type RT_;
+ typedef typename Get_type<R_, FT_tag>::type FT_;
+ typedef typename R_::Kernel_base Kbase;
+ typedef typename Get_type<R_, Point_tag>::type Point_;
+ typedef typename Get_functor<Kbase, Construct_ttag<Vector_tag> >::type CVBase;
+ typedef typename Get_functor<Kbase, Compute_vector_cartesian_coordinate_tag>::type CCBase;
+ typedef typename Get_functor<Kbase, Construct_ttag<Vector_cartesian_const_iterator_tag> >::type CVI;
+ typedef typename Get_functor<Kbase, Squared_length_tag>::type SLBase;
+
+ typedef Vector_d Self;
+ CGAL_static_assertion((boost::is_same<Self, typename Get_type<R_, Vector_tag>::type>::value));
+
+public:
+
+ typedef Tag_true Is_wrapper;
+ typedef typename R_::Default_ambient_dimension Ambient_dimension;
+ typedef Dimension_tag<0> Feature_dimension;
+
+ //typedef typename R_::Vector_cartesian_const_iterator Cartesian_const_iterator;
+ typedef typename Get_type<Kbase, Vector_tag>::type Rep;
+
+ const Rep& rep() const
+ {
+ return *this;
+ }
+
+ Rep& rep()
+ {
+ return *this;
+ }
+
+ typedef R_ R;
+
+#ifdef CGAL_CXX11
+ template<class...U,class=typename std::enable_if<!std::is_same<std::tuple<typename std::decay<U>::type...>,std::tuple<Vector_d> >::value>::type> explicit Vector_d(U&&...u)
+ : Rep(CVBase()(std::forward<U>(u)...)){}
+
+// // called from Construct_vector_d
+// template<class...U> explicit Vector_d(Eval_functor&&,U&&...u)
+// : Rep(Eval_functor(), std::forward<U>(u)...){}
+ template<class F,class...U> explicit Vector_d(Eval_functor&&,F&&f,U&&...u)
+ : Rep(std::forward<F>(f)(std::forward<U>(u)...)){}
+
+#if 0
+ // the new standard may make this necessary
+ Vector_d(Vector_d const&)=default;
+ Vector_d(Vector_d &);//=default;
+ Vector_d(Vector_d &&)=default;
+#endif
+
+ // try not to use these
+ Vector_d(Rep const& v) : Rep(v) {}
+ Vector_d(Rep& v) : Rep(static_cast<Rep const&>(v)) {}
+ Vector_d(Rep&& v) : Rep(std::move(v)) {}
+
+ // this one should be implicit
+ Vector_d(Null_vector const& v)
+ : Rep(CVBase()(v)) {}
+ Vector_d(Null_vector& v)
+ : Rep(CVBase()(v)) {}
+ Vector_d(Null_vector&& v)
+ : Rep(CVBase()(std::move(v))) {}
+
+#else
+
+ Vector_d() : Rep(CVBase()()) {}
+
+ Vector_d(Rep const& v) : Rep(v) {} // try not to use it
+
+#define CGAL_CODE(Z,N,_) template<BOOST_PP_ENUM_PARAMS(N,class T)> \
+ explicit Vector_d(BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : Rep(CVBase()( \
+ BOOST_PP_ENUM_PARAMS(N,t))) {} \
+ \
+ template<class F,BOOST_PP_ENUM_PARAMS(N,class T)> \
+ Vector_d(Eval_functor,F const& f,BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : Rep(f(BOOST_PP_ENUM_PARAMS(N,t))) {}
+ /*
+ template<BOOST_PP_ENUM_PARAMS(N,class T)> \
+ Vector_d(Eval_functor,BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : Rep(Eval_functor(), BOOST_PP_ENUM_PARAMS(N,t)) {}
+ */
+
+ BOOST_PP_REPEAT_FROM_TO(1,11,CGAL_CODE,_)
+#undef CGAL_CODE
+
+ // this one should be implicit
+ Vector_d(Null_vector const& v)
+ : Rep(CVBase()(v)) {}
+
+#endif
+
+ typename boost::result_of<CCBase(Rep,int)>::type cartesian(int i)const{
+ return CCBase()(rep(),i);
+ }
+
+ typename boost::result_of<CCBase(Rep,int)>::type operator[](int i)const{
+ return CCBase()(rep(),i);
+ }
+
+ typename boost::result_of<CVI(Rep,Begin_tag)>::type cartesian_begin()const{
+ return CVI()(rep(),Begin_tag());
+ }
+
+ typename boost::result_of<CVI(Rep,End_tag)>::type cartesian_end()const{
+ return CVI()(rep(),End_tag());
+ }
+
+ Vector_d operator-() const
+ {
+ return typename Get_functor<R, Opposite_vector_tag>::type()(*this);
+ }
+
+ /*
+ Direction_d direction() const
+ {
+ return R().construct_direction_d_object()(*this);
+ }
+
+ Vector_d transform(const Aff_transformation_d &t) const
+ {
+ return t.transform(*this);
+ }
+
+ Vector_d operator/(const RT& c) const
+ {
+ return R().construct_divided_vector_d_object()(*this,c);
+ }
+
+ Vector_d operator/(const typename First_if_different<FT_,RT>::Type & c) const
+ {
+ return R().construct_divided_vector_d_object()(*this,c);
+ }
+
+ typename Qualified_result_of<typename R::Compute_x_3, Vector_3>::type
+ x() const
+ {
+ return R().compute_x_3_object()(*this);
+ }
+
+ typename Qualified_result_of<typename R::Compute_y_3, Vector_3>::type
+ y() const
+ {
+ return R().compute_y_3_object()(*this);
+ }
+
+ typename Qualified_result_of<typename R::Compute_z_3, Vector_3>::type
+ z() const
+ {
+ return R().compute_z_3_object()(*this);
+ }
+
+ typename Qualified_result_of<typename R::Compute_hx_3, Vector_3>::type
+ hx() const
+ {
+ return R().compute_hx_3_object()(*this);
+ }
+
+ typename Qualified_result_of<typename R::Compute_hy_3, Vector_3>::type
+ hy() const
+ {
+ return R().compute_hy_3_object()(*this);
+ }
+
+ typename Qualified_result_of<typename R::Compute_hz_3, Vector_3>::type
+ hz() const
+ {
+ return R().compute_hz_3_object()(*this);
+ }
+
+ typename Qualified_result_of<typename R::Compute_hw_3, Vector_3>::type
+ hw() const
+ {
+ return R().compute_hw_3_object()(*this);
+ }
+
+ typename Qualified_result_of<typename R::Compute_x_3, Vector_3>::type
+ cartesian(int i) const
+ {
+ CGAL_kernel_precondition( (i == 0) || (i == 1) || (i == 2) );
+ if (i==0) return x();
+ if (i==1) return y();
+ return z();
+ }
+
+ typename Qualified_result_of<typename R::Compute_hw_3, Vector_3>::type
+ homogeneous(int i) const
+ {
+ CGAL_kernel_precondition( (i >= 0) || (i <= 3) );
+ if (i==0) return hx();
+ if (i==1) return hy();
+ if (i==2) return hz();
+ return hw();
+ }
+
+ int dimension() const // bad idea?
+ {
+ return rep.dimension();
+ }
+*/
+ typename boost::result_of<SLBase(Rep)>::type squared_length()const{
+ return SLBase()(rep());
+ }
+};
+#if 0
+template <class R_> Vector_d<R_>::Vector_d(Vector_d &)=default;
+#endif
+
+//TODO: IO
+
+template <class R_>
+Vector_d<R_> operator+(const Vector_d<R_>& v,const Vector_d<R_>& w)
+{
+ return typename Get_functor<R_, Sum_of_vectors_tag>::type()(v,w);
+}
+
+template <class R_>
+Vector_d<R_> operator-(const Vector_d<R_>& v,const Vector_d<R_>& w)
+{
+ return typename Get_functor<R_, Difference_of_vectors_tag>::type()(v,w);
+}
+
+} //namespace Wrap
+} //namespace CGAL
+
+#endif // CGAL_WRAPPER_VECTOR_D_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Weighted_point_d.h b/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Weighted_point_d.h
new file mode 100644
index 00000000..877eea21
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/Wrapper/Weighted_point_d.h
@@ -0,0 +1,129 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_WRAPPER_WEIGHTED_POINT_D_H
+#define CGAL_WRAPPER_WEIGHTED_POINT_D_H
+
+#include <CGAL/representation_tags.h>
+#include <boost/static_assert.hpp>
+#include <boost/type_traits.hpp>
+#include <CGAL/Kernel/Return_base_tag.h>
+#include <CGAL/Dimension.h>
+#ifndef CGAL_CXX11
+#include <boost/preprocessor/repetition.hpp>
+#endif
+#include <boost/utility/result_of.hpp>
+
+namespace CGAL {
+namespace Wrap {
+
+template <class R_>
+class Weighted_point_d : public Get_type<typename R_::Kernel_base, Weighted_point_tag>::type
+{
+ typedef typename Get_type<R_, FT_tag>::type FT_;
+ typedef typename R_::Kernel_base Kbase;
+ typedef typename Get_type<R_, Point_tag>::type Point_;
+ typedef typename Get_functor<Kbase, Construct_ttag<Weighted_point_tag> >::type CWPBase;
+ typedef typename Get_functor<Kbase, Point_drop_weight_tag>::type PDWBase;
+ typedef typename Get_functor<Kbase, Point_weight_tag>::type PWBase;
+
+ typedef Weighted_point_d Self;
+ BOOST_STATIC_ASSERT((boost::is_same<Self, typename Get_type<R_, Weighted_point_tag>::type>::value));
+
+public:
+
+ typedef Tag_true Is_wrapper;
+ typedef typename R_::Default_ambient_dimension Ambient_dimension;
+ typedef Dimension_tag<0> Feature_dimension;
+
+ typedef typename Get_type<Kbase, Weighted_point_tag>::type Rep;
+
+ const Rep& rep() const
+ {
+ return *this;
+ }
+
+ Rep& rep()
+ {
+ return *this;
+ }
+
+ typedef R_ R;
+
+#ifdef CGAL_CXX11
+ template<class...U,class=typename std::enable_if<!std::is_same<std::tuple<typename std::decay<U>::type...>,std::tuple<Weighted_point_d> >::value>::type> explicit Weighted_point_d(U&&...u)
+ : Rep(CWPBase()(std::forward<U>(u)...)){}
+
+// // called from Construct_point_d
+// template<class...U> explicit Point_d(Eval_functor&&,U&&...u)
+// : Rep(Eval_functor(), std::forward<U>(u)...){}
+ template<class F,class...U> explicit Weighted_point_d(Eval_functor&&,F&&f,U&&...u)
+ : Rep(std::forward<F>(f)(std::forward<U>(u)...)){}
+
+#if 0
+ // the new standard may make this necessary
+ Point_d(Point_d const&)=default;
+ Point_d(Point_d &);//=default;
+ Point_d(Point_d &&)=default;
+#endif
+
+ // try not to use these
+ Weighted_point_d(Rep const& v) : Rep(v) {}
+ Weighted_point_d(Rep& v) : Rep(static_cast<Rep const&>(v)) {}
+ Weighted_point_d(Rep&& v) : Rep(std::move(v)) {}
+
+#else
+
+ Weighted_point_d() : Rep(CWPBase()()) {}
+
+ Weighted_point_d(Rep const& v) : Rep(v) {} // try not to use it
+
+#define CGAL_CODE(Z,N,_) template<BOOST_PP_ENUM_PARAMS(N,class T)> \
+ explicit Weighted_point_d(BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : Rep(CWPBase()( \
+ BOOST_PP_ENUM_PARAMS(N,t))) {} \
+ \
+ template<class F,BOOST_PP_ENUM_PARAMS(N,class T)> \
+ Weighted_point_d(Eval_functor,F const& f,BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : Rep(f(BOOST_PP_ENUM_PARAMS(N,t))) {}
+ /*
+ template<BOOST_PP_ENUM_PARAMS(N,class T)> \
+ Point_d(Eval_functor,BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t)) \
+ : Rep(Eval_functor(), BOOST_PP_ENUM_PARAMS(N,t)) {}
+ */
+
+ BOOST_PP_REPEAT_FROM_TO(1,11,CGAL_CODE,_)
+#undef CGAL_CODE
+
+#endif
+
+ //TODO: use references?
+ Point_ point()const{
+ return Point_(Eval_functor(),PDWBase(),rep());
+ }
+ FT_ weight()const{
+ return PWBase()(rep());
+ }
+
+};
+
+} //namespace Wrap
+} //namespace CGAL
+
+#endif // CGAL_WRAPPER_SPHERE_D_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/function_objects_cartesian.h b/include/gudhi_patches/CGAL/NewKernel_d/function_objects_cartesian.h
new file mode 100644
index 00000000..5a132ad2
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/function_objects_cartesian.h
@@ -0,0 +1,1355 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_KERNEL_D_FUNCTION_OBJECTS_CARTESIAN_H
+#define CGAL_KERNEL_D_FUNCTION_OBJECTS_CARTESIAN_H
+
+#include <CGAL/NewKernel_d/utils.h>
+#include <CGAL/Dimension.h>
+#include <CGAL/Uncertain.h>
+#include <CGAL/NewKernel_d/store_kernel.h>
+#include <CGAL/is_iterator.h>
+#include <CGAL/iterator_from_indices.h>
+#include <CGAL/number_utils.h>
+#include <CGAL/Kernel/Return_base_tag.h>
+#include <CGAL/transforming_iterator.h>
+#include <CGAL/transforming_pair_iterator.h>
+#include <CGAL/NewKernel_d/functor_tags.h>
+#include <CGAL/NewKernel_d/functor_properties.h>
+#include <CGAL/predicates/sign_of_determinant.h>
+#include <functional>
+#ifdef CGAL_CXX11
+#include <initializer_list>
+#endif
+
+namespace CGAL {
+namespace CartesianDKernelFunctors {
+namespace internal {
+template<class,int> struct Dimension_at_most { enum { value = false }; };
+template<int a,int b> struct Dimension_at_most<Dimension_tag<a>,b> {
+ enum { value = (a <= b) };
+};
+}
+
+template<class R_,class D_=typename R_::Default_ambient_dimension,bool=internal::Dimension_at_most<D_,6>::value> struct Orientation_of_points : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Orientation_of_points)
+ typedef R_ R;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_type<R, Orientation_tag>::type result_type;
+ typedef typename R::LA::Square_matrix Matrix;
+
+ template<class Iter>
+ result_type operator()(Iter f, Iter e)const{
+ typename Get_functor<R, Compute_point_cartesian_coordinate_tag>::type c(this->kernel());
+ typename Get_functor<R, Point_dimension_tag>::type pd(this->kernel());
+ Point const& p0=*f++;
+ int d=pd(p0);
+ Matrix m(d,d);
+ // FIXME: this writes the vector coordinates in lines ? check all the other uses in this file, this may be wrong for some.
+ for(int i=0;f!=e;++f,++i) {
+ Point const& p=*f;
+ for(int j=0;j<d;++j){
+ m(i,j)=c(p,j)-c(p0,j);
+ // should we cache the coordinates of p0 in case they are computed?
+ }
+ }
+ return R::LA::sign_of_determinant(CGAL_MOVE(m));
+ }
+
+#ifdef CGAL_CXX11
+ // Since the dimension is at least 2, there are at least 3 points and no ambiguity with iterators.
+ // template <class...U,class=typename std::enable_if<std::is_same<Dimension_tag<sizeof...(U)-1>,typename R::Default_ambient_dimension>::value>::type>
+ template <class...U,class=typename std::enable_if<(sizeof...(U)>=3)>::type>
+ result_type operator()(U&&...u) const {
+ return operator()({std::forward<U>(u)...});
+ }
+
+ template <class P>
+ result_type operator()(std::initializer_list<P> l) const {
+ return operator()(l.begin(),l.end());
+ }
+#else
+ //should we make it template to avoid instantiation for wrong dim?
+ //or iterate outside the class?
+#define CGAL_VAR(Z,J,I) m(I,J)=c(p##I,J)-c(x,J);
+#define CGAL_VAR2(Z,I,N) BOOST_PP_REPEAT(N,CGAL_VAR,I)
+#define CGAL_CODE(Z,N,_) \
+ result_type operator()(Point const&x, BOOST_PP_ENUM_PARAMS(N,Point const&p)) const { \
+ typename Get_functor<R, Compute_point_cartesian_coordinate_tag>::type c(this->kernel()); \
+ Matrix m(N,N); \
+ BOOST_PP_REPEAT(N,CGAL_VAR2,N) \
+ return R::LA::sign_of_determinant(CGAL_MOVE(m)); \
+ }
+
+BOOST_PP_REPEAT_FROM_TO(7, 10, CGAL_CODE, _ )
+ // No need to do it for <=6, since that uses a different code path
+#undef CGAL_CODE
+#undef CGAL_VAR2
+#undef CGAL_VAR
+#endif
+};
+
+#ifdef CGAL_CXX11
+template<class R_,int d> struct Orientation_of_points<R_,Dimension_tag<d>,true> : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Orientation_of_points)
+ typedef R_ R;
+ typedef typename Get_type<R, RT_tag>::type RT;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_type<R, Orientation_tag>::type result_type;
+ template<class>struct Help;
+ template<int...I>struct Help<Indices<I...> > {
+ template<class C,class P,class T> result_type operator()(C const&c,P const&x,T&&t)const{
+ return sign_of_determinant<RT>(c(std::get<I/d>(t),I%d)-c(x,I%d)...);
+ }
+ };
+ template<class P0,class...P> result_type operator()(P0 const&x,P&&...p)const{
+ static_assert(d==sizeof...(P),"Wrong number of arguments");
+ typename Get_functor<R, Compute_point_cartesian_coordinate_tag>::type c(this->kernel());
+ return Help<typename N_increasing_indices<d*d>::type>()(c,x,std::forward_as_tuple(std::forward<P>(p)...));
+ }
+
+
+ template<int N,class Iter,class...U> result_type help2(Dimension_tag<N>, Iter f, Iter const&e, U&&...u)const{
+ auto const&p=*f;
+ return help2(Dimension_tag<N-1>(),++f,e,std::forward<U>(u)...,p);
+ }
+ template<class Iter,class...U> result_type help2(Dimension_tag<0>, Iter CGAL_assertion_code(f), Iter const& CGAL_assertion_code(e), U&&...u)const{
+ CGAL_assertion(f==e);
+ return operator()(std::forward<U>(u)...);
+ }
+ template<class Iter>
+ result_type operator()(Iter f, Iter e)const{
+ return help2(Dimension_tag<d+1>(),f,e);
+ }
+};
+#else
+#define CGAL_VAR(Z,J,I) c(p##I,J)-x##J
+#define CGAL_VAR2(Z,I,N) BOOST_PP_ENUM(N,CGAL_VAR,I)
+#define CGAL_VAR3(Z,N,_) Point const&p##N=*++f;
+#define CGAL_VAR4(Z,N,_) RT const&x##N=c(x,N);
+#define CGAL_CODE(Z,N,_) \
+template<class R_> struct Orientation_of_points<R_,Dimension_tag<N>,true> : private Store_kernel<R_> { \
+ CGAL_FUNCTOR_INIT_STORE(Orientation_of_points) \
+ typedef R_ R; \
+ typedef typename Get_type<R, RT_tag>::type RT; \
+ typedef typename Get_type<R, Point_tag>::type Point; \
+ typedef typename Get_type<R, Orientation_tag>::type result_type; \
+ result_type operator()(Point const&x, BOOST_PP_ENUM_PARAMS(N,Point const&p)) const { \
+ typename Get_functor<R, Compute_point_cartesian_coordinate_tag>::type c(this->kernel()); \
+ BOOST_PP_REPEAT(N,CGAL_VAR4,) \
+ return sign_of_determinant<RT>(BOOST_PP_ENUM(N,CGAL_VAR2,N)); \
+ } \
+ template<class Iter> \
+ result_type operator()(Iter f, Iter CGAL_assertion_code(e))const{ \
+ Point const&x=*f; \
+ BOOST_PP_REPEAT(N,CGAL_VAR3,) \
+ CGAL_assertion(++f==e); \
+ return operator()(x,BOOST_PP_ENUM_PARAMS(N,p)); \
+ } \
+};
+
+ BOOST_PP_REPEAT_FROM_TO(2, 7, CGAL_CODE, _ )
+#undef CGAL_CODE
+#undef CGAL_VAR4
+#undef CGAL_VAR3
+#undef CGAL_VAR2
+#undef CGAL_VAR
+
+#endif
+
+template<class R_> struct Orientation_of_points<R_,Dimension_tag<1>,true> : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Orientation_of_points)
+ typedef R_ R;
+ typedef typename Get_type<R, RT_tag>::type RT;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_type<R, Orientation_tag>::type result_type;
+ result_type operator()(Point const&x, Point const&y) const {
+ typename Get_functor<R, Compute_point_cartesian_coordinate_tag>::type c(this->kernel());
+ // No sign_of_determinant(RT) :-(
+ return CGAL::compare(c(y,0),c(x,0));
+ }
+ template<class Iter>
+ result_type operator()(Iter f, Iter CGAL_assertion_code(e))const{
+ Point const&x=*f;
+ Point const&y=*++f;
+ CGAL_assertion(++f==e);
+ return operator()(x,y);
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Orientation_of_points_tag,(CartesianDKernelFunctors::Orientation_of_points<K>),(Point_tag),(Point_dimension_tag,Compute_point_cartesian_coordinate_tag));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Orientation_of_vectors : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Orientation_of_vectors)
+ typedef R_ R;
+ typedef typename Get_type<R, Vector_tag>::type Vector;
+ typedef typename Get_type<R, Orientation_tag>::type result_type;
+ typedef typename R::LA::Square_matrix Matrix;
+
+ template<class Iter>
+ result_type operator()(Iter f, Iter e)const{
+ typename Get_functor<R, Compute_vector_cartesian_coordinate_tag>::type c(this->kernel());
+ typename Get_functor<R, Point_dimension_tag>::type vd(this->kernel());
+ // FIXME: Uh? Using it on a vector ?!
+ Vector const& v0=*f;
+ int d=vd(v0);
+ Matrix m(d,d);
+ for(int j=0;j<d;++j){
+ m(0,j)=c(v0,j);
+ }
+ for(int i=1;++f!=e;++i) {
+ Vector const& v=*f;
+ for(int j=0;j<d;++j){
+ m(i,j)=c(v,j);
+ }
+ }
+ return R::LA::sign_of_determinant(CGAL_MOVE(m));
+ }
+
+#ifdef CGAL_CXX11
+ template <class...U,class=typename std::enable_if<(sizeof...(U)>=3)>::type>
+ result_type operator()(U&&...u) const {
+ return operator()({std::forward<U>(u)...});
+ }
+
+ template <class V>
+ result_type operator()(std::initializer_list<V> l) const {
+ return operator()(l.begin(),l.end());
+ }
+#else
+ //TODO
+#endif
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Orientation_of_vectors_tag,(CartesianDKernelFunctors::Orientation_of_vectors<K>),(Vector_tag),(Point_dimension_tag,Compute_vector_cartesian_coordinate_tag));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Linear_rank : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Linear_rank)
+ typedef R_ R;
+ typedef typename Get_type<R, Vector_tag>::type Vector;
+ // Computing a sensible Uncertain<int> is not worth it
+ typedef int result_type;
+ typedef typename R::LA::Dynamic_matrix Matrix;
+
+ template<class Iter>
+ result_type operator()(Iter f, Iter e)const{
+ typename Get_functor<R, Compute_vector_cartesian_coordinate_tag>::type c(this->kernel());
+ typename Get_functor<R, Point_dimension_tag>::type vd(this->kernel());
+ std::ptrdiff_t n=std::distance(f,e);
+ if (n==0) return 0;
+ Vector const& v0 = *f;
+ // FIXME: Uh? Using it on a vector ?!
+ int d=vd(v0);
+ Matrix m(d,n);
+ for(int j=0;j<d;++j){
+ m(j,0)=c(v0,j);
+ }
+ for(int i=1; ++f!=e; ++i){
+ Vector const& v = *f;
+ for(int j=0;j<d;++j){
+ m(j,i)=c(v,j);
+ }
+ }
+ return R::LA::rank(CGAL_MOVE(m));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Linear_rank_tag,(CartesianDKernelFunctors::Linear_rank<K>),(Vector_tag),(Point_dimension_tag,Compute_vector_cartesian_coordinate_tag));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Linearly_independent : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Linearly_independent)
+ typedef R_ R;
+ typedef typename Get_type<R, Bool_tag>::type result_type;
+
+ template<class Iter>
+ result_type operator()(Iter f, Iter e)const{
+ typename Get_functor<R, Point_dimension_tag>::type vd(this->kernel());
+ std::ptrdiff_t n=std::distance(f,e);
+ // FIXME: Uh? Using it on a vector ?!
+ int d=vd(*f);
+ if (n>d) return false;
+ typename Get_functor<R, Linear_rank_tag>::type lr(this->kernel());
+ return lr(f,e) == n;
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Linearly_independent_tag,(CartesianDKernelFunctors::Linearly_independent<K>),(Vector_tag),(Point_dimension_tag,Linear_rank_tag));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Contained_in_linear_hull : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Contained_in_linear_hull)
+ typedef R_ R;
+ typedef typename Get_type<R, Vector_tag>::type Vector;
+ // Computing a sensible Uncertain<bool> is not worth it
+ typedef bool result_type;
+ typedef typename R::LA::Dynamic_matrix Matrix;
+
+ template<class Iter,class V>
+ result_type operator()(Iter f, Iter e,V const&w)const{
+ typename Get_functor<R, Compute_vector_cartesian_coordinate_tag>::type c(this->kernel());
+ typename Get_functor<R, Point_dimension_tag>::type vd(this->kernel());
+ std::ptrdiff_t n=std::distance(f,e);
+ if (n==0) return false;
+ // FIXME: Uh? Using it on a vector ?!
+ int d=vd(w);
+ Matrix m(d,n+1);
+ for(int i=0; f!=e; ++f,++i){
+ Vector const& v = *f;
+ for(int j=0;j<d;++j){
+ m(j,i)=c(v,j);
+ }
+ }
+ for(int j=0;j<d;++j){
+ m(j,n)=c(w,j);
+ }
+ int r1 = R::LA::rank(m);
+ // FIXME: Don't use eigen directly, go through an interface in LA...
+ m.conservativeResize(Eigen::NoChange, n);
+ int r2 = R::LA::rank(CGAL_MOVE(m));
+ return r1 == r2;
+ // TODO: This is very very far from optimal...
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Contained_in_linear_hull_tag,(CartesianDKernelFunctors::Contained_in_linear_hull<K>),(Vector_tag),(Point_dimension_tag,Compute_vector_cartesian_coordinate_tag));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Affine_rank : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Affine_rank)
+ typedef R_ R;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ // Computing a sensible Uncertain<int> is not worth it
+ typedef int result_type;
+ typedef typename R::LA::Dynamic_matrix Matrix;
+
+ template<class Iter>
+ result_type operator()(Iter f, Iter e)const{
+ typename Get_functor<R, Compute_point_cartesian_coordinate_tag>::type c(this->kernel());
+ typename Get_functor<R, Point_dimension_tag>::type pd(this->kernel());
+ int n=(int)std::distance(f,e);
+ if (--n<=0) return n;
+ Point const& p0 = *f;
+ int d=pd(p0);
+ Matrix m(d,n);
+ for(int i=0; ++f!=e; ++i){
+ Point const& p = *f;
+ for(int j=0;j<d;++j){
+ m(j,i)=c(p,j)-c(p0,j);
+ // TODO: cache p0[j] in case it is computed?
+ }
+ }
+ return R::LA::rank(CGAL_MOVE(m));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Affine_rank_tag,(CartesianDKernelFunctors::Affine_rank<K>),(Point_tag),(Point_dimension_tag,Compute_point_cartesian_coordinate_tag));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Affinely_independent : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Affinely_independent)
+ typedef R_ R;
+ typedef typename Get_type<R, Bool_tag>::type result_type;
+
+ template<class Iter>
+ result_type operator()(Iter f, Iter e)const{
+ typename Get_functor<R, Point_dimension_tag>::type pd(this->kernel());
+ std::ptrdiff_t n=std::distance(f,e);
+ int d=pd(*f);
+ if (--n>d) return false;
+ typename Get_functor<R, Affine_rank_tag>::type ar(this->kernel());
+ return ar(f,e) == n;
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Affinely_independent_tag,(CartesianDKernelFunctors::Affinely_independent<K>),(Point_tag),(Point_dimension_tag,Affine_rank_tag));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Contained_in_simplex : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Contained_in_simplex)
+ typedef R_ R;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ // Computing a sensible Uncertain<*> is not worth it
+ // typedef typename Get_type<R, Boolean_tag>::type result_type;
+ typedef bool result_type;
+ typedef typename Increment_dimension<typename R::Default_ambient_dimension>::type D1;
+ typedef typename Increment_dimension<typename R::Max_ambient_dimension>::type D2;
+ typedef typename R::LA::template Rebind_dimension<D1,D2>::Other LA;
+ typedef typename LA::Dynamic_matrix Matrix;
+ typedef typename LA::Dynamic_vector DynVec;
+ typedef typename LA::Vector Vec;
+
+ template<class Iter, class P>
+ result_type operator()(Iter f, Iter e, P const&q)const{
+ typename Get_functor<R, Compute_point_cartesian_coordinate_tag>::type c(this->kernel());
+ typename Get_functor<R, Point_dimension_tag>::type pd(this->kernel());
+ std::ptrdiff_t n=std::distance(f,e);
+ if (n==0) return false;
+ int d=pd(q);
+ Matrix m(d+1,n);
+ DynVec a(n);
+ // FIXME: Should use the proper vector constructor (Iterator_and_last)
+ Vec b(d+1);
+ for(int j=0;j<d;++j) b[j]=c(q,j);
+ b[d]=1;
+
+ for(int i=0; f!=e; ++i,++f){
+ Point const& p = *f;
+ for(int j=0;j<d;++j){
+ m(j,i)=c(p,j);
+ }
+ m(d,i)=1;
+ }
+ // If the simplex has full dimension, there must be a solution, only the signs need to be checked.
+ if (n == d+1)
+ LA::solve(a,CGAL_MOVE(m),CGAL_MOVE(b));
+ else if (!LA::solve_and_check(a,CGAL_MOVE(m),CGAL_MOVE(b)))
+ return false;
+ for(int i=0;i<n;++i){
+ if (a[i]<0) return false;
+ }
+ return true;
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Contained_in_simplex_tag,(CartesianDKernelFunctors::Contained_in_simplex<K>),(Point_tag),(Point_dimension_tag,Compute_point_cartesian_coordinate_tag));
+
+namespace CartesianDKernelFunctors {
+ namespace internal {
+ template<class Ref_>
+ struct Matrix_col_access {
+ typedef Ref_ result_type;
+ int col;
+ Matrix_col_access(int r):col(r){}
+ template<class Mat> Ref_ operator()(Mat const& m, std::ptrdiff_t row)const{
+ return m(row,col);
+ }
+ };
+ }
+template<class R_> struct Linear_base : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Linear_base)
+ typedef R_ R;
+ typedef typename Get_type<R, Vector_tag>::type Vector;
+ typedef typename Get_type<R, FT_tag>::type FT;
+ typedef void result_type;
+ typedef typename R::LA::Dynamic_matrix Matrix;
+
+ template<class Iter, class Oter>
+ result_type operator()(Iter f, Iter e, Oter&o)const{
+ typename Get_functor<R, Compute_vector_cartesian_coordinate_tag>::type c(this->kernel());
+ typename Get_functor<R, Point_dimension_tag>::type vd(this->kernel());
+ typename Get_functor<R, Construct_ttag<Vector_tag> >::type cv(this->kernel());
+ std::ptrdiff_t n=std::distance(f,e);
+ if (n==0) return;
+ Vector const& v0 = *f;
+ // FIXME: Uh? Using it on a vector ?!
+ int d=vd(v0);
+ Matrix m(d,n);
+ for(int j=0;j<d;++j){
+ m(0,j)=c(v0,j);
+ }
+ for(int i=1; ++f!=e; ++i){
+ Vector const& v = *f;
+ for(int j=0;j<d;++j){
+ m(i,j)=c(v,j);
+ }
+ }
+ Matrix b = R::LA::basis(CGAL_MOVE(m));
+ for(int i=0; i < R::LA::columns(b); ++i){
+ //*o++ = Vector(b.col(i));
+ typedef
+#ifdef CGAL_CXX11
+ decltype(std::declval<const Matrix>()(0,0))
+#else
+ FT
+#endif
+ Ref;
+ typedef Iterator_from_indices<Matrix, FT, Ref,
+ internal::Matrix_col_access<Ref> > IFI;
+ *o++ = cv(IFI(b,0,i),IFI(b,d,i));
+ }
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Linear_base_tag,(CartesianDKernelFunctors::Linear_base<K>),(Vector_tag),(Point_dimension_tag,Compute_vector_cartesian_coordinate_tag));
+
+#if 0
+namespace CartesianDKernelFunctors {
+template<class R_,bool=boost::is_same<typename R_::Point,typename R_::Vector>::value> struct Orientation : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Orientation)
+ typedef R_ R;
+ typedef typename Get_type<R, Vector_tag>::type Vector;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_type<R, Orientation_tag>::type result_type;
+ typedef typename Get_functor<R, Orientation_of_points_tag>::type OP;
+ typedef typename Get_functor<R, Orientation_of_vectors_tag>::type OV;
+
+ //FIXME!!!
+ //when Point and Vector are distinct types, the dispatch should be made
+ //in a way that doesn't instantiate a conversion from Point to Vector
+ template<class Iter>
+ result_type operator()(Iter const&f, Iter const& e)const{
+ typename Get_functor<R, Point_dimension_tag>::type pd(this->kernel());
+ typename std::iterator_traits<Iter>::difference_type d=std::distance(f,e);
+ int dim=pd(*f); // BAD
+ if(d==dim) return OV(this->kernel())(f,e);
+ CGAL_assertion(d==dim+1);
+ return OP(this->kernel())(f,e);
+ }
+ //TODO: version that takes objects directly instead of iterators
+};
+
+template<class R_> struct Orientation<R_,false> : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Orientation)
+ typedef R_ R;
+ typedef typename Get_type<R, Vector_tag>::type Vector;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_type<R, Orientation_tag>::type result_type;
+ typedef typename Get_functor<R, Orientation_of_points_tag>::type OP;
+ typedef typename Get_functor<R, Orientation_of_vectors_tag>::type OV;
+ typedef typename R::LA::Square_matrix Matrix;
+
+ //FIXME!!!
+ //when Point and Vector are distinct types, the dispatch should be made
+ //in a way that doesn't instantiate a conversion from Point to Vector
+ template<class Iter>
+ typename boost::enable_if<is_iterator_to<Iter,Point>,result_type>::type
+ operator()(Iter const&f, Iter const& e)const{
+ return OP(this->kernel())(f,e);
+ }
+ template<class Iter>
+ typename boost::enable_if<is_iterator_to<Iter,Vector>,result_type>::type
+ operator()(Iter const&f, Iter const& e)const{
+ return OV(this->kernel())(f,e);
+ }
+ //TODO: version that takes objects directly instead of iterators
+};
+}
+#endif
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Power_side_of_power_sphere_raw : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Power_side_of_power_sphere_raw)
+ typedef R_ R;
+ typedef typename Get_type<R, RT_tag>::type RT;
+ typedef typename Get_type<R, FT_tag>::type FT;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_type<R, Oriented_side_tag>::type result_type;
+ typedef typename Increment_dimension<typename R::Default_ambient_dimension>::type D1;
+ typedef typename Increment_dimension<typename R::Max_ambient_dimension>::type D2;
+ typedef typename R::LA::template Rebind_dimension<D1,D2>::Other LA;
+ typedef typename LA::Square_matrix Matrix;
+
+ template<class IterP, class IterW, class Pt, class Wt>
+ result_type operator()(IterP f, IterP const& e, IterW fw, Pt const& p0, Wt const& w0) const {
+ typedef typename Get_functor<R, Squared_distance_to_origin_tag>::type Sqdo;
+ typename Get_functor<R, Compute_point_cartesian_coordinate_tag>::type c(this->kernel());
+ typename Get_functor<R, Point_dimension_tag>::type pd(this->kernel());
+
+ int d=pd(p0);
+ Matrix m(d+1,d+1);
+ if(CGAL::Is_stored<Sqdo>::value) {
+ Sqdo sqdo(this->kernel());
+ FT const& h0 = sqdo(p0) - w0;
+ for(int i=0;f!=e;++f,++fw,++i) {
+ Point const& p=*f;
+ for(int j=0;j<d;++j){
+ RT const& x=c(p,j);
+ m(i,j)=x-c(p0,j);
+ }
+ m(i,d) = sqdo(p) - *fw - h0;
+ }
+ } else {
+ for(int i=0;f!=e;++f,++fw,++i) {
+ Point const& p=*f;
+ m(i,d) = w0 - *fw;
+ for(int j=0;j<d;++j){
+ RT const& x=c(p,j);
+ m(i,j)=x-c(p0,j);
+ m(i,d)+=CGAL::square(m(i,j));
+ }
+ }
+ }
+ if(d%2)
+ return -LA::sign_of_determinant(CGAL_MOVE(m));
+ else
+ return LA::sign_of_determinant(CGAL_MOVE(m));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Power_side_of_power_sphere_raw_tag,(CartesianDKernelFunctors::Power_side_of_power_sphere_raw<K>),(Point_tag),(Point_dimension_tag,Squared_distance_to_origin_tag,Compute_point_cartesian_coordinate_tag));
+
+// TODO: make Side_of_oriented_sphere call Power_side_of_power_sphere_raw
+namespace CartesianDKernelFunctors {
+template<class R_> struct Side_of_oriented_sphere : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Side_of_oriented_sphere)
+ typedef R_ R;
+ typedef typename Get_type<R, RT_tag>::type RT;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_type<R, Oriented_side_tag>::type result_type;
+ typedef typename Increment_dimension<typename R::Default_ambient_dimension>::type D1;
+ typedef typename Increment_dimension<typename R::Max_ambient_dimension>::type D2;
+ typedef typename R::LA::template Rebind_dimension<D1,D2>::Other LA;
+ typedef typename LA::Square_matrix Matrix;
+
+ template<class Iter>
+ result_type operator()(Iter f, Iter const& e)const{
+ Point const& p0=*f++; // *--e ?
+ return this->operator()(f,e,p0);
+ }
+
+ template<class Iter>
+ result_type operator()(Iter f, Iter const& e, Point const& p0) const {
+ typedef typename Get_functor<R, Squared_distance_to_origin_tag>::type Sqdo;
+ typename Get_functor<R, Compute_point_cartesian_coordinate_tag>::type c(this->kernel());
+ typename Get_functor<R, Point_dimension_tag>::type pd(this->kernel());
+
+ int d=pd(p0);
+ Matrix m(d+1,d+1);
+ if(CGAL::Is_stored<Sqdo>::value) {
+ Sqdo sqdo(this->kernel());
+ for(int i=0;f!=e;++f,++i) {
+ Point const& p=*f;
+ for(int j=0;j<d;++j){
+ RT const& x=c(p,j);
+ m(i,j)=x-c(p0,j);
+ }
+ m(i,d) = sqdo(p) - sqdo(p0);
+ }
+ } else {
+ for(int i=0;f!=e;++f,++i) {
+ Point const& p=*f;
+ m(i,d) = 0;
+ for(int j=0;j<d;++j){
+ RT const& x=c(p,j);
+ m(i,j)=x-c(p0,j);
+ m(i,d)+=CGAL::square(m(i,j));
+ }
+ }
+ }
+ if(d%2)
+ return -LA::sign_of_determinant(CGAL_MOVE(m));
+ else
+ return LA::sign_of_determinant(CGAL_MOVE(m));
+ }
+
+#ifdef CGAL_CXX11
+ template <class...U,class=typename std::enable_if<(sizeof...(U)>=4)>::type>
+ result_type operator()(U&&...u) const {
+ return operator()({std::forward<U>(u)...});
+ }
+
+ template <class P>
+ result_type operator()(std::initializer_list<P> l) const {
+ return operator()(l.begin(),l.end());
+ }
+#else
+ //TODO
+#endif
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Side_of_oriented_sphere_tag,(CartesianDKernelFunctors::Side_of_oriented_sphere<K>),(Point_tag),(Point_dimension_tag,Squared_distance_to_origin_tag,Compute_point_cartesian_coordinate_tag));
+
+namespace CartesianDKernelFunctors {
+template <class R_> struct Construct_circumcenter : Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Construct_circumcenter)
+ typedef typename Get_type<R_, Point_tag>::type Point;
+ typedef Point result_type;
+ typedef typename Get_type<R_, FT_tag>::type FT;
+ template <class Iter>
+ result_type operator()(Iter f, Iter e)const{
+ typedef typename Get_type<R_, Point_tag>::type Point;
+ typedef typename R_::LA LA;
+ typename Get_functor<R_, Compute_point_cartesian_coordinate_tag>::type c(this->kernel());
+ typename Get_functor<R_, Construct_ttag<Point_tag> >::type cp(this->kernel());
+ typename Get_functor<R_, Point_dimension_tag>::type pd(this->kernel());
+ typename Get_functor<R_, Squared_distance_to_origin_tag>::type sdo(this->kernel());
+
+ Point const& p0=*f;
+ int d = pd(p0);
+ if (d+1 == std::distance(f,e))
+ {
+ // 2*(x-y).c == x^2-y^2
+ typedef typename LA::Square_matrix Matrix;
+ typedef typename LA::Vector Vec;
+ typedef typename LA::Construct_vector CVec;
+ FT const& n0 = sdo(p0);
+ Matrix m(d,d);
+ Vec b = typename CVec::Dimension()(d);
+ // Write the point coordinates in lines.
+ int i;
+ for(i=0; ++f!=e; ++i) {
+ Point const& p=*f;
+ for(int j=0;j<d;++j) {
+ m(i,j)=2*(c(p,j)-c(p0,j));
+ b[i] = sdo(p) - n0;
+ }
+ }
+ CGAL_assertion (i == d);
+ Vec res = typename CVec::Dimension()(d);;
+ //std::cout << "Mat: " << m << "\n Vec: " << one << std::endl;
+ LA::solve(res, CGAL_MOVE(m), CGAL_MOVE(b));
+ //std::cout << "Sol: " << res << std::endl;
+ return cp(d,LA::vector_begin(res),LA::vector_end(res));
+ }
+ else
+ {
+ /*
+ * Matrix P=(p1, p2, ...) (each point as a column)
+ * Matrix Q=2*t(p2-p1,p3-p1, ...) (each vector as a line)
+ * Matrix M: QP, adding a line of 1 at the top
+ * Vector B: (1, p2^2-p1^2, p3^2-p1^2, ...)
+ * Solve ML=B, the center of the sphere is PL
+ *
+ * It would likely be faster to write P then transpose, multiply,
+ * etc instead of doing it by hand.
+ */
+ // TODO: check for degenerate cases?
+
+ typedef typename R_::Max_ambient_dimension D2;
+ typedef typename R_::LA::template Rebind_dimension<Dynamic_dimension_tag,D2>::Other LAd;
+ typedef typename LAd::Square_matrix Matrix;
+ typedef typename LAd::Vector Vec;
+ typename Get_functor<R_, Scalar_product_tag>::type sp(this->kernel());
+ int k=static_cast<int>(std::distance(f,e));
+ Matrix m(k,k);
+ Vec b(k);
+ Vec l(k);
+ int j,i=0;
+ for(Iter f2=f;f2!=e;++f2,++i){
+ b(i)=m(i,i)=sdo(*f2);
+ j=0;
+ for(Iter f3=f;f3!=e;++f3,++j){
+ m(j,i)=m(i,j)=sp(*f2,*f3);
+ }
+ }
+ for(i=1;i<k;++i){
+ b(i)-=b(0);
+ for(j=0;j<k;++j){
+ m(i,j)=2*(m(i,j)-m(0,j));
+ }
+ }
+ for(j=0;j<k;++j) m(0,j)=1;
+ b(0)=1;
+
+ LAd::solve(l,CGAL_MOVE(m),CGAL_MOVE(b));
+
+ typename LA::Vector center=typename LA::Construct_vector::Dimension()(d);
+ for(i=0;i<d;++i) center(i)=0;
+ j=0;
+ for(Iter f2=f;f2!=e;++f2,++j){
+ for(i=0;i<d;++i){
+ center(i)+=l(j)*c(*f2,i);
+ }
+ }
+
+ return cp(LA::vector_begin(center),LA::vector_end(center));
+ }
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Construct_circumcenter_tag,(CartesianDKernelFunctors::Construct_circumcenter<K>),(Point_tag),(Construct_ttag<Point_tag>,Compute_point_cartesian_coordinate_tag,Scalar_product_tag,Squared_distance_to_origin_tag,Point_dimension_tag));
+
+namespace CartesianDKernelFunctors {
+template <class R_> struct Squared_circumradius : Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Squared_circumradius)
+ typedef typename Get_type<R_, FT_tag>::type result_type;
+ template <class Iter>
+ result_type operator()(Iter f, Iter e)const{
+ typename Get_functor<R_, Construct_circumcenter_tag>::type cc(this->kernel());
+ typename Get_functor<R_, Squared_distance_tag>::type sd(this->kernel());
+ return sd(cc(f, e), *f);
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Squared_circumradius_tag,(CartesianDKernelFunctors::Squared_circumradius<K>),(Point_tag),(Construct_circumcenter_tag,Squared_distance_tag));
+
+namespace CartesianDKernelFunctors {
+// TODO: implement it directly, it should be at least as fast as Side_of_oriented_sphere.
+template<class R_> struct Side_of_bounded_sphere : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Side_of_bounded_sphere)
+ typedef R_ R;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_type<R, Bounded_side_tag>::type result_type;
+
+ template<class Iter>
+ result_type operator()(Iter f, Iter const& e) const {
+ Point const& p0 = *f++; // *--e ?
+ typename Get_functor<R, Point_dimension_tag>::type pd(this->kernel());
+ //FIXME: Doesn't work for non-full dimension.
+ CGAL_assertion (std::distance(f,e) == pd(p0)+1);
+ return operator() (f, e, p0);
+ }
+
+ template<class Iter>
+ result_type operator()(Iter const& f, Iter const& e, Point const& p0) const {
+ typename Get_functor<R, Side_of_oriented_sphere_tag>::type sos (this->kernel());
+ typename Get_functor<R, Orientation_of_points_tag>::type op (this->kernel());
+ // enum_cast is not very generic, but since this function isn't supposed to remain like this...
+ return enum_cast<Bounded_side> (sos (f, e, p0) * op (f, e));
+ }
+
+#ifdef CGAL_CXX11
+ template <class...U,class=typename std::enable_if<(sizeof...(U)>=4)>::type>
+ result_type operator()(U&&...u) const {
+ return operator()({std::forward<U>(u)...});
+ }
+
+ template <class P>
+ result_type operator()(std::initializer_list<P> l) const {
+ return operator()(l.begin(),l.end());
+ }
+#else
+ //TODO
+#endif
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Side_of_bounded_sphere_tag,(CartesianDKernelFunctors::Side_of_bounded_sphere<K>),(Point_tag),(Side_of_oriented_sphere_tag,Orientation_of_points_tag));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Side_of_bounded_circumsphere : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Side_of_bounded_circumsphere)
+ typedef typename Get_type<R_, Bounded_side_tag>::type result_type;
+
+ template<class Iter, class P>
+ result_type operator()(Iter f, Iter const& e, P const& p0) const {
+ // TODO: Special case when the dimension is full.
+ typename Get_functor<R_, Construct_circumcenter_tag>::type cc(this->kernel());
+ typename Get_functor<R_, Compare_distance_tag>::type cd(this->kernel());
+
+ return enum_cast<Bounded_side>(cd(cc(f, e), *f, p0));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Side_of_bounded_circumsphere_tag,(CartesianDKernelFunctors::Side_of_bounded_circumsphere<K>),(Point_tag),(Squared_distance_tag,Construct_circumcenter_tag));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Point_to_vector : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Point_to_vector)
+ typedef R_ R;
+ typedef typename Get_type<R, RT_tag>::type RT;
+ typedef typename Get_type<R, Vector_tag>::type Vector;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_functor<R, Construct_ttag<Vector_tag> >::type CV;
+ typedef typename Get_functor<R, Construct_ttag<Point_cartesian_const_iterator_tag> >::type CI;
+ typedef Vector result_type;
+ typedef Point argument_type;
+ result_type operator()(argument_type const&v)const{
+ CI ci(this->kernel());
+ return CV(this->kernel())(ci(v,Begin_tag()),ci(v,End_tag()));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Point_to_vector_tag,(CartesianDKernelFunctors::Point_to_vector<K>),(Point_tag,Vector_tag),(Construct_ttag<Vector_tag>, Construct_ttag<Point_cartesian_const_iterator_tag>));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Vector_to_point : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Vector_to_point)
+ typedef R_ R;
+ typedef typename Get_type<R, RT_tag>::type RT;
+ typedef typename Get_type<R, Vector_tag>::type Vector;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_functor<R, Construct_ttag<Point_tag> >::type CP;
+ typedef typename Get_functor<R, Construct_ttag<Vector_cartesian_const_iterator_tag> >::type CI;
+ typedef Point result_type;
+ typedef Vector argument_type;
+ result_type operator()(argument_type const&v)const{
+ CI ci(this->kernel());
+ return CP(this->kernel())(ci(v,Begin_tag()),ci(v,End_tag()));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Vector_to_point_tag,(CartesianDKernelFunctors::Vector_to_point<K>),(Point_tag,Vector_tag),(Construct_ttag<Point_tag>, Construct_ttag<Vector_cartesian_const_iterator_tag>));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Opposite_vector : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Opposite_vector)
+ typedef R_ R;
+ typedef typename Get_type<R, RT_tag>::type RT;
+ typedef typename Get_type<R, Vector_tag>::type Vector;
+ typedef typename Get_functor<R, Construct_ttag<Vector_tag> >::type CV;
+ typedef typename Get_functor<R, Construct_ttag<Vector_cartesian_const_iterator_tag> >::type CI;
+ typedef Vector result_type;
+ typedef Vector argument_type;
+ result_type operator()(Vector const&v)const{
+ CI ci(this->kernel());
+ return CV(this->kernel())(make_transforming_iterator(ci(v,Begin_tag()),std::negate<RT>()),make_transforming_iterator(ci(v,End_tag()),std::negate<RT>()));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Opposite_vector_tag,(CartesianDKernelFunctors::Opposite_vector<K>),(Vector_tag),(Construct_ttag<Vector_tag>, Construct_ttag<Vector_cartesian_const_iterator_tag>));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Scaled_vector : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Scaled_vector)
+ typedef R_ R;
+ typedef typename Get_type<R, FT_tag>::type FT;
+ typedef typename Get_type<R, Vector_tag>::type Vector;
+ typedef typename Get_functor<R, Construct_ttag<Vector_tag> >::type CV;
+ typedef typename Get_functor<R, Construct_ttag<Vector_cartesian_const_iterator_tag> >::type CI;
+ typedef Vector result_type;
+ typedef Vector first_argument_type;
+ typedef FT second_argument_type;
+ result_type operator()(Vector const&v,FT const& s)const{
+ CI ci(this->kernel());
+ return CV(this->kernel())(make_transforming_iterator(ci(v,Begin_tag()),Scale<FT>(s)),make_transforming_iterator(ci(v,End_tag()),Scale<FT>(s)));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Scaled_vector_tag,(CartesianDKernelFunctors::Scaled_vector<K>),(Vector_tag),(Construct_ttag<Vector_tag>, Construct_ttag<Vector_cartesian_const_iterator_tag>));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Sum_of_vectors : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Sum_of_vectors)
+ typedef R_ R;
+ typedef typename Get_type<R, RT_tag>::type RT;
+ typedef typename Get_type<R, Vector_tag>::type Vector;
+ typedef typename Get_functor<R, Construct_ttag<Vector_tag> >::type CV;
+ typedef typename Get_functor<R, Construct_ttag<Vector_cartesian_const_iterator_tag> >::type CI;
+ typedef Vector result_type;
+ typedef Vector first_argument_type;
+ typedef Vector second_argument_type;
+ result_type operator()(Vector const&a, Vector const&b)const{
+ CI ci(this->kernel());
+ return CV(this->kernel())(make_transforming_pair_iterator(ci(a,Begin_tag()),ci(b,Begin_tag()),std::plus<RT>()),make_transforming_pair_iterator(ci(a,End_tag()),ci(b,End_tag()),std::plus<RT>()));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Sum_of_vectors_tag,(CartesianDKernelFunctors::Sum_of_vectors<K>),(Vector_tag),(Construct_ttag<Vector_tag>, Construct_ttag<Vector_cartesian_const_iterator_tag>));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Difference_of_vectors : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Difference_of_vectors)
+ typedef R_ R;
+ typedef typename Get_type<R, RT_tag>::type RT;
+ typedef typename Get_type<R, Vector_tag>::type Vector;
+ typedef typename Get_functor<R, Construct_ttag<Vector_tag> >::type CV;
+ typedef typename Get_functor<R, Construct_ttag<Vector_cartesian_const_iterator_tag> >::type CI;
+ typedef Vector result_type;
+ typedef Vector first_argument_type;
+ typedef Vector second_argument_type;
+ result_type operator()(Vector const&a, Vector const&b)const{
+ CI ci(this->kernel());
+ return CV(this->kernel())(make_transforming_pair_iterator(ci(a,Begin_tag()),ci(b,Begin_tag()),std::minus<RT>()),make_transforming_pair_iterator(ci(a,End_tag()),ci(b,End_tag()),std::minus<RT>()));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Difference_of_vectors_tag,(CartesianDKernelFunctors::Difference_of_vectors<K>),(Vector_tag),(Construct_ttag<Vector_tag>, Construct_ttag<Vector_cartesian_const_iterator_tag>));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Translated_point : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Translated_point)
+ typedef R_ R;
+ typedef typename Get_type<R, RT_tag>::type RT;
+ typedef typename Get_type<R, Vector_tag>::type Vector;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_functor<R, Construct_ttag<Point_tag> >::type CP;
+ typedef typename Get_functor<R, Construct_ttag<Vector_cartesian_const_iterator_tag> >::type CVI;
+ typedef typename Get_functor<R, Construct_ttag<Point_cartesian_const_iterator_tag> >::type CPI;
+ typedef Point result_type;
+ typedef Point first_argument_type;
+ typedef Vector second_argument_type;
+ result_type operator()(Point const&a, Vector const&b)const{
+ CVI cvi(this->kernel());
+ CPI cpi(this->kernel());
+ return CP(this->kernel())(make_transforming_pair_iterator(cpi(a,Begin_tag()),cvi(b,Begin_tag()),std::plus<RT>()),make_transforming_pair_iterator(cpi(a,End_tag()),cvi(b,End_tag()),std::plus<RT>()));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Translated_point_tag,(CartesianDKernelFunctors::Translated_point<K>),(Point_tag, Vector_tag),(Construct_ttag<Point_tag>, Construct_ttag<Vector_cartesian_const_iterator_tag>, Construct_ttag<Point_cartesian_const_iterator_tag>));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Difference_of_points : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Difference_of_points)
+ typedef R_ R;
+ typedef typename Get_type<R, RT_tag>::type RT;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_type<R, Vector_tag>::type Vector;
+ typedef typename Get_functor<R, Construct_ttag<Vector_tag> >::type CV;
+ typedef typename Get_functor<R, Construct_ttag<Point_cartesian_const_iterator_tag> >::type CI;
+ typedef Vector result_type;
+ typedef Point first_argument_type;
+ typedef Point second_argument_type;
+ result_type operator()(Point const&a, Point const&b)const{
+ CI ci(this->kernel());
+ return CV(this->kernel())(make_transforming_pair_iterator(ci(a,Begin_tag()),ci(b,Begin_tag()),std::minus<RT>()),make_transforming_pair_iterator(ci(a,End_tag()),ci(b,End_tag()),std::minus<RT>()));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Difference_of_points_tag,(CartesianDKernelFunctors::Difference_of_points<K>),(Point_tag, Vector_tag),(Construct_ttag<Vector_tag>, Construct_ttag<Point_cartesian_const_iterator_tag>));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Midpoint : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Midpoint)
+ typedef R_ R;
+ typedef typename Get_type<R, FT_tag>::type FT;
+ typedef typename Get_type<R, RT_tag>::type RT;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_functor<R, Construct_ttag<Point_tag> >::type CP;
+ typedef typename Get_functor<R, Construct_ttag<Point_cartesian_const_iterator_tag> >::type CI;
+ typedef Point result_type;
+ typedef Point first_argument_type;
+ typedef Point second_argument_type;
+ // There is a division, but it will be cast to RT afterwards anyway, so maybe we could use RT.
+ struct Average : std::binary_function<FT,RT,FT> {
+ FT operator()(FT const&a, RT const&b)const{
+ return (a+b)/2;
+ }
+ };
+ result_type operator()(Point const&a, Point const&b)const{
+ CI ci(this->kernel());
+ //Divide<FT,int> half(2);
+ //return CP(this->kernel())(make_transforming_iterator(make_transforming_pair_iterator(ci.begin(a),ci.begin(b),std::plus<FT>()),half),make_transforming_iterator(make_transforming_pair_iterator(ci.end(a),ci.end(b),std::plus<FT>()),half));
+ return CP(this->kernel())(make_transforming_pair_iterator(ci(a,Begin_tag()),ci(b,Begin_tag()),Average()),make_transforming_pair_iterator(ci(a,End_tag()),ci(b,End_tag()),Average()));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Midpoint_tag,(CartesianDKernelFunctors::Midpoint<K>),(Point_tag),(Construct_ttag<Point_tag>, Construct_ttag<Point_cartesian_const_iterator_tag>));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Squared_length : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Squared_length)
+ typedef R_ R;
+ typedef typename Get_type<R, RT_tag>::type RT;
+ typedef typename Get_type<R, Vector_tag>::type Vector;
+ typedef typename Get_functor<R, Construct_ttag<Vector_cartesian_const_iterator_tag> >::type CI;
+ typedef RT result_type;
+ typedef Vector argument_type;
+ result_type operator()(Vector const&a)const{
+ CI ci(this->kernel());
+ typename Algebraic_structure_traits<RT>::Square f;
+ // TODO: avoid this RT(0)+...
+ return std::accumulate(make_transforming_iterator(ci(a,Begin_tag()),f),make_transforming_iterator(ci(a,End_tag()),f),RT(0));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Squared_length_tag,(CartesianDKernelFunctors::Squared_length<K>),(Vector_tag),(Construct_ttag<Vector_cartesian_const_iterator_tag>));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Squared_distance_to_origin : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Squared_distance_to_origin)
+ typedef R_ R;
+ typedef typename Get_type<R, RT_tag>::type RT;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_functor<R, Construct_ttag<Point_cartesian_const_iterator_tag> >::type CI;
+ typedef RT result_type;
+ typedef Point argument_type;
+ result_type operator()(Point const&a)const{
+ CI ci(this->kernel());
+ typename Algebraic_structure_traits<RT>::Square f;
+ // TODO: avoid this RT(0)+...
+ return std::accumulate(make_transforming_iterator(ci(a,Begin_tag()),f),make_transforming_iterator(ci(a,End_tag()),f),RT(0));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Squared_distance_to_origin_tag,(CartesianDKernelFunctors::Squared_distance_to_origin<K>),(Point_tag),(Construct_ttag<Point_cartesian_const_iterator_tag>));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Squared_distance : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Squared_distance)
+ typedef R_ R;
+ typedef typename Get_type<R, RT_tag>::type RT;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_functor<R, Construct_ttag<Point_cartesian_const_iterator_tag> >::type CI;
+ typedef RT result_type;
+ typedef Point first_argument_type;
+ typedef Point second_argument_type;
+ struct Sq_diff : std::binary_function<RT,RT,RT> {
+ RT operator()(RT const&a, RT const&b)const{
+ return CGAL::square(a-b);
+ }
+ };
+ result_type operator()(Point const&a, Point const&b)const{
+ CI ci(this->kernel());
+ Sq_diff f;
+ // TODO: avoid this RT(0)+...
+ return std::accumulate(make_transforming_pair_iterator(ci(a,Begin_tag()),ci(b,Begin_tag()),f),make_transforming_pair_iterator(ci(a,End_tag()),ci(b,End_tag()),f),RT(0));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Squared_distance_tag,(CartesianDKernelFunctors::Squared_distance<K>),(Point_tag),(Construct_ttag<Point_cartesian_const_iterator_tag>));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Scalar_product : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Scalar_product)
+ typedef R_ R;
+ typedef typename Get_type<R, RT_tag>::type RT;
+ typedef typename Get_type<R, Vector_tag>::type Vector;
+ typedef typename Get_functor<R, Construct_ttag<Vector_cartesian_const_iterator_tag> >::type CI;
+ typedef RT result_type;
+ typedef Vector first_argument_type;
+ typedef Vector second_argument_type;
+ result_type operator()(Vector const&a, Vector const&b)const{
+ CI ci(this->kernel());
+ std::multiplies<RT> f;
+ // TODO: avoid this RT(0)+...
+ return std::accumulate(
+ make_transforming_pair_iterator(ci(a,Begin_tag()),ci(b,Begin_tag()),f),
+ make_transforming_pair_iterator(ci(a, End_tag()),ci(b, End_tag()),f),
+ RT(0));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Scalar_product_tag,(CartesianDKernelFunctors::Scalar_product<K>),(Vector_tag),(Construct_ttag<Vector_cartesian_const_iterator_tag>));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Compare_distance : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Compare_distance)
+ typedef R_ R;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_functor<R, Squared_distance_tag>::type CSD;
+ typedef typename Get_type<R, Comparison_result_tag>::type result_type;
+ typedef Point first_argument_type;
+ typedef Point second_argument_type;
+ typedef Point third_argument_type; // why am I doing this already?
+ typedef Point fourth_argument_type;
+ result_type operator()(Point const&a, Point const&b, Point const&c)const{
+ CSD csd(this->kernel());
+ return CGAL_NTS compare(csd(a,b),csd(a,c));
+ }
+ result_type operator()(Point const&a, Point const&b, Point const&c, Point const&d)const{
+ CSD csd(this->kernel());
+ return CGAL_NTS compare(csd(a,b),csd(c,d));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Compare_distance_tag,(CartesianDKernelFunctors::Compare_distance<K>),(Point_tag),(Squared_distance_tag));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Less_point_cartesian_coordinate : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Less_point_cartesian_coordinate)
+ typedef R_ R;
+ typedef typename Get_type<R, Bool_tag>::type result_type;
+ typedef typename Get_functor<R, Compute_point_cartesian_coordinate_tag>::type Cc;
+ // TODO: This is_exact thing should be reengineered.
+ // the goal is to have a way to tell: don't filter this
+ typedef typename CGAL::Is_exact<Cc> Is_exact;
+
+ template<class V,class W,class I>
+ result_type operator()(V const&a, W const&b, I i)const{
+ Cc c(this->kernel());
+ return c(a,i)<c(b,i);
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Less_point_cartesian_coordinate_tag,(CartesianDKernelFunctors::Less_point_cartesian_coordinate<K>),(),(Compute_point_cartesian_coordinate_tag));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Compare_point_cartesian_coordinate : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Compare_point_cartesian_coordinate)
+ typedef R_ R;
+ typedef typename Get_type<R, Comparison_result_tag>::type result_type;
+ typedef typename Get_functor<R, Compute_point_cartesian_coordinate_tag>::type Cc;
+ // TODO: This is_exact thing should be reengineered.
+ // the goal is to have a way to tell: don't filter this
+ typedef typename CGAL::Is_exact<Cc> Is_exact;
+
+ template<class V,class W,class I>
+ result_type operator()(V const&a, W const&b, I i)const{
+ Cc c(this->kernel());
+ return CGAL_NTS compare(c(a,i),c(b,i));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Compare_point_cartesian_coordinate_tag,(CartesianDKernelFunctors::Compare_point_cartesian_coordinate<K>),(),(Compute_point_cartesian_coordinate_tag));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Compare_lexicographically : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Compare_lexicographically)
+ typedef R_ R;
+ typedef typename Get_type<R, Comparison_result_tag>::type result_type;
+ typedef typename Get_functor<R, Construct_ttag<Point_cartesian_const_iterator_tag> >::type CI;
+ // TODO: This is_exact thing should be reengineered.
+ // the goal is to have a way to tell: don't filter this
+ typedef typename CGAL::Is_exact<CI> Is_exact;
+
+ template<class V,class W>
+ result_type operator()(V const&a, W const&b)const{
+ CI c(this->kernel());
+#ifdef CGAL_CXX11
+ auto
+#else
+ typename CI::result_type
+#endif
+ a_begin=c(a,Begin_tag()),
+ b_begin=c(b,Begin_tag()),
+ a_end=c(a,End_tag());
+ result_type res;
+ // can't we do slightly better for Uncertain<*> ?
+ // after res=...; if(is_uncertain(res))return indeterminate<result_type>();
+ do res=CGAL_NTS compare(*a_begin++,*b_begin++);
+ while(a_begin!=a_end && res==EQUAL);
+ return res;
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Compare_lexicographically_tag,(CartesianDKernelFunctors::Compare_lexicographically<K>),(),(Construct_ttag<Point_cartesian_const_iterator_tag>));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Less_lexicographically : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Less_lexicographically)
+ typedef R_ R;
+ typedef typename Get_type<R, Bool_tag>::type result_type;
+ typedef typename Get_functor<R, Compare_lexicographically_tag>::type CL;
+ typedef typename CGAL::Is_exact<CL> Is_exact;
+
+ template <class V, class W>
+ result_type operator() (V const&a, W const&b) const {
+ CL c (this->kernel());
+ return c(a,b) < 0;
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Less_lexicographically_tag,(CartesianDKernelFunctors::Less_lexicographically<K>),(),(Compare_lexicographically_tag));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Less_or_equal_lexicographically : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Less_or_equal_lexicographically)
+ typedef R_ R;
+ typedef typename Get_type<R, Bool_tag>::type result_type;
+ typedef typename Get_functor<R, Compare_lexicographically_tag>::type CL;
+ typedef typename CGAL::Is_exact<CL> Is_exact;
+
+ template <class V, class W>
+ result_type operator() (V const&a, W const&b) const {
+ CL c (this->kernel());
+ return c(a,b) <= 0;
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Less_or_equal_lexicographically_tag,(CartesianDKernelFunctors::Less_or_equal_lexicographically<K>),(),(Compare_lexicographically_tag));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Equal_points : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Equal_points)
+ typedef R_ R;
+ typedef typename Get_type<R, Bool_tag>::type result_type;
+ typedef typename Get_functor<R, Construct_ttag<Point_cartesian_const_iterator_tag> >::type CI;
+ // TODO: This is_exact thing should be reengineered.
+ // the goal is to have a way to tell: don't filter this
+ typedef typename CGAL::Is_exact<CI> Is_exact;
+
+ template<class V,class W>
+ result_type operator()(V const&a, W const&b)const{
+ CI c(this->kernel());
+#ifdef CGAL_CXX11
+ auto
+#else
+ typename CI::result_type
+#endif
+ a_begin=c(a,Begin_tag()),
+ b_begin=c(b,Begin_tag()),
+ a_end=c(a,End_tag());
+ result_type res = true;
+ // Is using CGAL::possibly for Uncertain really an optimization?
+ do res = res & (*a_begin++ == *b_begin++);
+ while(a_begin!=a_end && possibly(res));
+ return res;
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Equal_points_tag,(CartesianDKernelFunctors::Equal_points<K>),(),(Construct_ttag<Point_cartesian_const_iterator_tag>));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Oriented_side : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Oriented_side)
+ typedef R_ R;
+ typedef typename Get_type<R, Oriented_side_tag>::type result_type;
+ typedef typename Get_type<R, Point_tag>::type Point;
+ typedef typename Get_type<R, Hyperplane_tag>::type Hyperplane;
+ typedef typename Get_type<R, Sphere_tag>::type Sphere;
+ typedef typename Get_functor<R, Value_at_tag>::type VA;
+ typedef typename Get_functor<R, Hyperplane_translation_tag>::type HT;
+ typedef typename Get_functor<R, Squared_distance_tag>::type SD;
+ typedef typename Get_functor<R, Squared_radius_tag>::type SR;
+ typedef typename Get_functor<R, Center_of_sphere_tag>::type CS;
+
+ result_type operator()(Hyperplane const&h, Point const&p)const{
+ HT ht(this->kernel());
+ VA va(this->kernel());
+ return CGAL::compare(va(h,p),ht(h));
+ }
+ result_type operator()(Sphere const&s, Point const&p)const{
+ SD sd(this->kernel());
+ SR sr(this->kernel());
+ CS cs(this->kernel());
+ return CGAL::compare(sd(cs(s),p),sr(s));
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Oriented_side_tag,(CartesianDKernelFunctors::Oriented_side<K>),(Point_tag,Sphere_tag,Hyperplane_tag),(Value_at_tag,Hyperplane_translation_tag,Squared_distance_tag,Squared_radius_tag,Center_of_sphere_tag));
+
+namespace CartesianDKernelFunctors {
+template<class R_> struct Has_on_positive_side : private Store_kernel<R_> {
+ CGAL_FUNCTOR_INIT_STORE(Has_on_positive_side)
+ typedef R_ R;
+ typedef typename Get_type<R, Bool_tag>::type result_type;
+ typedef typename Get_functor<R, Oriented_side_tag>::type OS;
+
+ template <class Obj, class Pt>
+ result_type operator()(Obj const&o, Pt const&p)const{
+ OS os(this->kernel());
+ return os(o,p) == ON_POSITIVE_SIDE;
+ }
+};
+}
+
+CGAL_KD_DEFAULT_FUNCTOR(Has_on_positive_side_tag,(CartesianDKernelFunctors::Has_on_positive_side<K>),(),(Oriented_side_tag));
+
+}
+#include <CGAL/NewKernel_d/Coaffine.h>
+#endif // CGAL_KERNEL_D_FUNCTION_OBJECTS_CARTESIAN_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/functor_properties.h b/include/gudhi_patches/CGAL/NewKernel_d/functor_properties.h
new file mode 100644
index 00000000..c25c4e2b
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/functor_properties.h
@@ -0,0 +1,40 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_EXACTNESS_H
+#define CGAL_EXACTNESS_H
+#include <boost/mpl/has_xxx.hpp>
+#include <CGAL/tags.h>
+namespace CGAL {
+
+#define CGAL_STRAWBERRY(Is_pretty) \
+ namespace internal { \
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(Is_pretty) \
+ } \
+ template<class T,bool=internal::has_##Is_pretty<T>::value> \
+ struct Is_pretty : boost::false_type {}; \
+ template<class T> \
+ struct Is_pretty<T,true> : T::Is_pretty {}
+
+CGAL_STRAWBERRY(Is_exact);
+CGAL_STRAWBERRY(Is_fast);
+CGAL_STRAWBERRY(Is_stored);
+#undef CGAL_STRAWBERRY
+}
+#endif // CGAL_EXACTNESS_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/functor_tags.h b/include/gudhi_patches/CGAL/NewKernel_d/functor_tags.h
new file mode 100644
index 00000000..b8e17886
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/functor_tags.h
@@ -0,0 +1,363 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_FUNCTOR_TAGS_H
+#define CGAL_FUNCTOR_TAGS_H
+#include <CGAL/tags.h> // for Null_tag
+#include <CGAL/NewKernel_d/utils.h>
+#ifdef CGAL_CXX11
+#include <type_traits>
+#include <utility>
+#endif
+#include <boost/type_traits.hpp>
+#include <boost/mpl/has_xxx.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/empty.hpp>
+#include <boost/mpl/front.hpp>
+#include <boost/mpl/pop_front.hpp>
+namespace CGAL {
+
+ // Find a better place for this later
+
+ template <class K, class T, class=void> struct Get_type
+ : K::template Type<T> {};
+ template <class K, class F, class O=void, class=void> struct Get_functor
+ : K::template Functor<F, O> {};
+#ifdef CGAL_CXX11
+ template <class K, class T> using Type = typename Get_type<K, T>::type;
+ template <class K, class T> using Functor = typename Get_functor<K, T>::type;
+#endif
+
+ class Null_type {~Null_type();}; // no such object should be created
+
+ // To construct iterators
+ struct Begin_tag {};
+ struct End_tag {};
+
+ // Functor category
+ struct Predicate_tag {};
+ struct Construct_tag {};
+ struct Construct_iterator_tag {};
+ struct Compute_tag {};
+ struct Misc_tag {};
+
+ struct No_filter_tag {};
+
+ template<class>struct Construct_ttag {};
+ template<class>struct Convert_ttag {};
+
+ template <class K, class F, class=void, class=void> struct Get_functor_category { typedef Misc_tag type; };
+ template<class Tg, class Obj, class Base> struct Typedef_tag_type;
+ //template<class Kernel, class Tg> struct Read_tag_type {};
+
+ template<class Kernel, class Tg>
+ struct Provides_type
+ : Has_type_different_from<Get_type<Kernel, Tg>, Null_type> {};
+
+ template<class Kernel, class Tg, class O=void>
+ struct Provides_functor
+ : Has_type_different_from<Get_functor<Kernel, Tg, O>, Null_functor> {};
+
+ template<class K, class List, bool=boost::mpl::empty<List>::type::value>
+ struct Provides_functors : boost::mpl::and_ <
+ Provides_functor<K, typename boost::mpl::front<List>::type>,
+ Provides_functors<K, typename boost::mpl::pop_front<List>::type> > {};
+ template<class K, class List>
+ struct Provides_functors<K, List, true> : boost::true_type {};
+
+ template<class K, class List, bool=boost::mpl::empty<List>::type::value>
+ struct Provides_types : boost::mpl::and_ <
+ Provides_type<K, typename boost::mpl::front<List>::type>,
+ Provides_types<K, typename boost::mpl::pop_front<List>::type> > {};
+ template<class K, class List>
+ struct Provides_types<K, List, true> : boost::true_type {};
+
+ namespace internal { BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_Type,template Type<Null_tag>,false) }
+ template<class Kernel, class Tg,
+ bool = internal::has_Type<Kernel>::value /* false */>
+ struct Provides_type_i : boost::false_type {};
+ template<class Kernel, class Tg>
+ struct Provides_type_i <Kernel, Tg, true>
+ : Has_type_different_from<typename Kernel::template Type<Tg>, Null_type> {};
+
+ //// This version does not like Functor<T,bool=false>
+ //namespace internal { BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(has_Functor,Functor,false) }
+ // This version lets us use non-type template parameters, but fails with older EDG-based compilers (Intel 14).
+ namespace internal { BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_Functor,template Functor<Null_tag>,false) }
+
+ template<class Kernel, class Tg, class O=void,
+ bool = internal::has_Functor<Kernel>::value /* false */>
+ struct Provides_functor_i : boost::false_type {};
+ template<class Kernel, class Tg, class O>
+ struct Provides_functor_i <Kernel, Tg, O, true>
+ : Has_type_different_from<typename Kernel::template Functor<Tg, O>, Null_functor> {};
+
+ // TODO: Refine this a bit.
+ template <class K, class T, class D=void,
+ //bool=Provides_functor<K,T>::value,
+ //bool=Provides_functor_i<K,T>::value,
+ bool = internal::has_Functor<K>::value
+ >
+ struct Inherit_functor : K::template Functor<T> {};
+ template <class K, class T, class D>
+ struct Inherit_functor <K, T, D, false> {};
+
+ template <class K, class T, bool=internal::has_Type<K>::value>
+ struct Inherit_type : K::template Type<T> {};
+ template <class K, class T>
+ struct Inherit_type <K, T, false> {};
+
+ struct Number_tag {};
+ struct Discrete_tag {};
+ struct Object_tag {};
+ template <class K, class T, class=void> struct Get_type_category {
+ // The lazy kernel uses it too eagerly,
+ // so it currently needs a default.
+ typedef Null_tag type;
+ };
+
+#define CGAL_DECL_OBJ_(X,Y) \
+ template<class Obj,class Base> \
+ struct Typedef_tag_type<X##_tag, Obj, Base> : Base { typedef Obj X; }; \
+ template<class K, class D> \
+ struct Get_type_category <K, X##_tag, D> { typedef Y##_tag type; }
+#define CGAL_DECL_OBJ(X,Y) struct X##_tag {}; \
+ CGAL_DECL_OBJ_(X,Y)
+
+ //namespace has_object { BOOST_MPL_HAS_XXX_TRAIT_DEF(X) }
+ //template<class Kernel>
+ //struct Provides_tag_type<Kernel, X##_tag> : has_object::has_##X<Kernel> {};
+ //template<class Kernel>
+ //struct Read_tag_type<Kernel, X##_tag> { typedef typename Kernel::X type; }
+
+ // Not exactly objects, but the extras can't hurt.
+ CGAL_DECL_OBJ(FT, Number);
+ CGAL_DECL_OBJ(RT, Number);
+
+ CGAL_DECL_OBJ(Bool, Discrete); // Boolean_tag is already taken, and is a template :-(
+ CGAL_DECL_OBJ(Comparison_result, Discrete);
+ CGAL_DECL_OBJ(Sign, Discrete);
+ CGAL_DECL_OBJ(Orientation, Discrete); // Note: duplicate with the functor tag!
+ CGAL_DECL_OBJ(Oriented_side, Discrete);
+ CGAL_DECL_OBJ(Bounded_side, Discrete);
+ CGAL_DECL_OBJ(Angle, Discrete);
+ CGAL_DECL_OBJ(Flat_orientation, Discrete);
+
+ CGAL_DECL_OBJ(Vector, Object);
+ CGAL_DECL_OBJ(Point, Object);
+ CGAL_DECL_OBJ(Segment, Object);
+ CGAL_DECL_OBJ(Sphere, Object);
+ CGAL_DECL_OBJ(Line, Object);
+ CGAL_DECL_OBJ(Direction, Object);
+ CGAL_DECL_OBJ(Hyperplane, Object);
+ CGAL_DECL_OBJ(Ray, Object);
+ CGAL_DECL_OBJ(Iso_box, Object);
+ CGAL_DECL_OBJ(Bbox, Object);
+ CGAL_DECL_OBJ(Aff_transformation, Object);
+ CGAL_DECL_OBJ(Weighted_point, Object);
+#undef CGAL_DECL_OBJ_
+#undef CGAL_DECL_OBJ
+
+// Intel fails with those, and they are not so useful.
+// CGAL_KD_DEFAULT_TYPE(RT_tag,(typename Get_type<K, FT_tag>::type),(),());
+// CGAL_KD_DEFAULT_TYPE(FT_tag,(CGAL::Quotient<typename Get_type<K, RT_tag>::type>),(),());
+
+#define CGAL_SMURF2(A,B) CGAL_KD_DEFAULT_TYPE(A##_tag,(typename Same_uncertainty_nt<B, typename Get_type<K,RT_tag>::type>::type),(RT_tag),())
+#define CGAL_SMURF1(A) CGAL_SMURF2(A,CGAL::A)
+ CGAL_SMURF2(Bool, bool);
+ CGAL_SMURF1(Sign);
+ CGAL_SMURF1(Comparison_result);
+ CGAL_SMURF1(Orientation);
+ CGAL_SMURF1(Oriented_side);
+ CGAL_SMURF1(Bounded_side);
+ CGAL_SMURF1(Angle);
+#undef CGAL_SMURF1
+#undef CGAL_SMURF2
+
+ // TODO: replace with Get_type_category
+ template<class> struct is_NT_tag { enum { value = false }; };
+ template<> struct is_NT_tag<FT_tag> { enum { value = true }; };
+ template<> struct is_NT_tag<RT_tag> { enum { value = true }; };
+
+ template<class> struct iterator_tag_traits {
+ enum { is_iterator = false, has_nth_element = false };
+ typedef Null_tag value_tag;
+ };
+
+#define CGAL_DECL_COMPUTE(X) struct X##_tag {}; \
+ template<class A,class B,class C>struct Get_functor_category<A,X##_tag,B,C>{typedef Compute_tag type;}
+ CGAL_DECL_COMPUTE(Compute_point_cartesian_coordinate);
+ CGAL_DECL_COMPUTE(Compute_vector_cartesian_coordinate);
+ CGAL_DECL_COMPUTE(Compute_homogeneous_coordinate);
+ CGAL_DECL_COMPUTE(Squared_distance);
+ CGAL_DECL_COMPUTE(Squared_distance_to_origin);
+ CGAL_DECL_COMPUTE(Squared_length);
+ CGAL_DECL_COMPUTE(Squared_radius);
+ CGAL_DECL_COMPUTE(Squared_circumradius);
+ CGAL_DECL_COMPUTE(Scalar_product);
+ CGAL_DECL_COMPUTE(Hyperplane_translation);
+ CGAL_DECL_COMPUTE(Value_at);
+ CGAL_DECL_COMPUTE(Point_weight);
+ CGAL_DECL_COMPUTE(Power_distance);
+ CGAL_DECL_COMPUTE(Power_distance_to_point);
+#undef CGAL_DECL_COMPUTE
+
+#define CGAL_DECL_ITER_OBJ(X,Y,Z,C) struct X##_tag {}; \
+ template<>struct iterator_tag_traits<X##_tag> { \
+ enum { is_iterator = true, has_nth_element = true }; \
+ typedef Y##_tag value_tag; \
+ typedef Z##_tag nth_element; \
+ typedef C##_tag container; \
+ }; \
+ template<class Obj,class Base> \
+ struct Typedef_tag_type<X##_tag, Obj, Base> : Base { typedef Obj X; }
+
+ //namespace has_object { BOOST_MPL_HAS_XXX_TRAIT_DEF(X) }
+ //template<class Kernel>
+ //struct Provides_tag_type<Kernel, X##_tag> : has_object::has_##X<Kernel> {};
+ //template<class Kernel>
+ //struct Read_tag_type<Kernel, X##_tag> { typedef typename Kernel::X type; }
+
+ CGAL_DECL_ITER_OBJ(Vector_cartesian_const_iterator, FT, Compute_vector_cartesian_coordinate, Vector);
+ CGAL_DECL_ITER_OBJ(Point_cartesian_const_iterator, FT, Compute_point_cartesian_coordinate, Point);
+#undef CGAL_DECL_ITER_OBJ
+
+ template<class>struct map_result_tag{typedef Null_type type;};
+ template<class T>struct map_result_tag<Construct_ttag<T> >{typedef T type;};
+
+ template<class A,class T,class B,class C>struct Get_functor_category<A,Construct_ttag<T>,B,C> :
+ boost::mpl::if_c<iterator_tag_traits<T>::is_iterator,
+ Construct_iterator_tag,
+ Construct_tag> {};
+
+ // Really?
+ template<class A,class T,class B,class C>struct Get_functor_category<A,Convert_ttag<T>,B,C>{typedef Misc_tag type;};
+
+#define CGAL_DECL_CONSTRUCT(X,Y) struct X##_tag {}; \
+ template<>struct map_result_tag<X##_tag>{typedef Y##_tag type;}; \
+ template<class A,class B,class C>struct Get_functor_category<A,X##_tag,B,C>{typedef Construct_tag type;}
+ CGAL_DECL_CONSTRUCT(Midpoint,Point);
+ CGAL_DECL_CONSTRUCT(Center_of_sphere,Point);
+ CGAL_DECL_CONSTRUCT(Point_of_sphere,Point);
+ CGAL_DECL_CONSTRUCT(Segment_extremity,Point);
+ CGAL_DECL_CONSTRUCT(Sum_of_vectors,Vector);
+ CGAL_DECL_CONSTRUCT(Difference_of_vectors,Vector);
+ CGAL_DECL_CONSTRUCT(Opposite_vector,Vector);
+ CGAL_DECL_CONSTRUCT(Scaled_vector,Vector);
+ CGAL_DECL_CONSTRUCT(Orthogonal_vector,Vector);
+ CGAL_DECL_CONSTRUCT(Difference_of_points,Vector);
+ CGAL_DECL_CONSTRUCT(Translated_point,Point);
+ CGAL_DECL_CONSTRUCT(Point_to_vector,Vector);
+ CGAL_DECL_CONSTRUCT(Vector_to_point,Point);
+ CGAL_DECL_CONSTRUCT(Construct_min_vertex,Point);
+ CGAL_DECL_CONSTRUCT(Construct_max_vertex,Point);
+ CGAL_DECL_CONSTRUCT(Construct_circumcenter,Point);
+ CGAL_DECL_CONSTRUCT(Point_drop_weight,Point);
+ CGAL_DECL_CONSTRUCT(Power_center,Weighted_point);
+#undef CGAL_DECL_CONSTRUCT
+#if 0
+#define CGAL_DECL_ITER_CONSTRUCT(X,Y) struct X##_tag {}; \
+ template<>struct map_result_tag<X##_tag>{typedef Y##_tag type;}; \
+ template<>struct map_functor_type<X##_tag>{typedef Construct_iterator_tag type;}
+ CGAL_DECL_ITER_CONSTRUCT(Construct_point_cartesian_const_iterator,Point_cartesian_const_iterator);
+ CGAL_DECL_ITER_CONSTRUCT(Construct_vector_cartesian_const_iterator,Vector_cartesian_const_iterator);
+#undef CGAL_DECL_ITER_CONSTRUCT
+#endif
+
+ //FIXME: choose a convention: prefix with Predicate_ ?
+#define CGAL_DECL_PREDICATE_(X) \
+ template<class A,class B,class C>struct Get_functor_category<A,X##_tag,B,C>{typedef Predicate_tag type;}
+#define CGAL_DECL_PREDICATE(X) struct X##_tag {}; \
+ CGAL_DECL_PREDICATE_(X)
+ CGAL_DECL_PREDICATE(Less_point_cartesian_coordinate);
+ CGAL_DECL_PREDICATE(Compare_point_cartesian_coordinate);
+ CGAL_DECL_PREDICATE(Compare_distance);
+ CGAL_DECL_PREDICATE(Compare_lexicographically);
+ CGAL_DECL_PREDICATE(Less_lexicographically);
+ CGAL_DECL_PREDICATE(Less_or_equal_lexicographically);
+ CGAL_DECL_PREDICATE(Equal_points);
+ CGAL_DECL_PREDICATE(Has_on_positive_side);
+ CGAL_DECL_PREDICATE_(Orientation); // duplicate with the type
+ CGAL_DECL_PREDICATE_(Oriented_side); // duplicate with the type
+ CGAL_DECL_PREDICATE(Orientation_of_points);
+ CGAL_DECL_PREDICATE(Orientation_of_vectors);
+ CGAL_DECL_PREDICATE(Side_of_oriented_sphere);
+ CGAL_DECL_PREDICATE(Side_of_bounded_sphere);
+ CGAL_DECL_PREDICATE(Side_of_bounded_circumsphere);
+ CGAL_DECL_PREDICATE(Contained_in_affine_hull);
+ CGAL_DECL_PREDICATE(In_flat_orientation);
+ CGAL_DECL_PREDICATE(In_flat_side_of_oriented_sphere);
+ CGAL_DECL_PREDICATE(Construct_flat_orientation); // Making it a predicate is a questionable choice, it should be possible to let it be a construction for some implementations. Not sure how to do that... TODO
+ CGAL_DECL_PREDICATE(Linear_rank);
+ CGAL_DECL_PREDICATE(Affine_rank);
+ CGAL_DECL_PREDICATE(Linearly_independent);
+ CGAL_DECL_PREDICATE(Affinely_independent);
+ CGAL_DECL_PREDICATE(Contained_in_linear_hull);
+ CGAL_DECL_PREDICATE(Contained_in_simplex);
+ CGAL_DECL_PREDICATE(Power_side_of_power_sphere_raw);
+ CGAL_DECL_PREDICATE(Power_side_of_power_sphere);
+ CGAL_DECL_PREDICATE(In_flat_power_side_of_power_sphere_raw);
+ CGAL_DECL_PREDICATE(In_flat_power_side_of_power_sphere);
+#undef CGAL_DECL_PREDICATE
+
+#define CGAL_DECL_MISC(X) struct X##_tag {}; \
+ template<class A,class B,class C>struct Get_functor_category<A,X##_tag,B,C>{typedef Misc_tag type;}
+ //TODO: split into _begin and _end ?
+ //CGAL_DECL_MISC(Construct_point_cartesian_const_iterator);
+ //CGAL_DECL_MISC(Construct_vector_cartesian_const_iterator);
+ CGAL_DECL_MISC(Point_dimension);
+ CGAL_DECL_MISC(Vector_dimension);
+ CGAL_DECL_MISC(Linear_base); // Find a more appropriate category?
+#undef CGAL_DECL_MISC
+
+
+ // Properties for LA
+ struct Has_extra_dimension_tag {};
+ struct Has_vector_plus_minus_tag {};
+ struct Has_vector_scalar_ops_tag {};
+ struct Has_dot_product_tag {};
+ struct Has_determinant_of_vectors_tag {};
+ struct Has_determinant_of_points_tag {};
+ struct Has_determinant_of_iterator_to_vectors_tag {};
+ struct Has_determinant_of_iterator_to_points_tag {};
+ struct Has_determinant_of_vectors_omit_last_tag {};
+ struct Stores_squared_norm_tag {};
+
+ template<class> struct Preserved_by_non_linear_extra_coordinate
+ : boost::false_type {};
+ template<> struct Preserved_by_non_linear_extra_coordinate
+ <Has_extra_dimension_tag> : boost::true_type {};
+ template<> struct Preserved_by_non_linear_extra_coordinate
+ <Has_determinant_of_vectors_tag> : boost::true_type {};
+ template<> struct Preserved_by_non_linear_extra_coordinate
+ <Has_determinant_of_points_tag> : boost::true_type {};
+ template<> struct Preserved_by_non_linear_extra_coordinate
+ <Has_determinant_of_iterator_to_vectors_tag> : boost::true_type {};
+ template<> struct Preserved_by_non_linear_extra_coordinate
+ <Has_determinant_of_iterator_to_points_tag> : boost::true_type {};
+ template<> struct Preserved_by_non_linear_extra_coordinate
+ <Has_determinant_of_vectors_omit_last_tag> : boost::true_type {};
+
+ // Kernel properties
+ struct Point_stores_squared_distance_to_origin_tag {};
+
+}
+#endif // CGAL_FUNCTOR_TAGS_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/static_int.h b/include/gudhi_patches/CGAL/NewKernel_d/static_int.h
new file mode 100644
index 00000000..21858804
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/static_int.h
@@ -0,0 +1,61 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_STATIC_INT_H
+#define CGAL_STATIC_INT_H
+#include <CGAL/constant.h>
+
+namespace CGAL {
+template <class NT> struct static_zero {
+ operator NT() const { return constant<NT,0>(); }
+};
+template <class NT> struct static_one {
+ operator NT() const { return constant<NT,1>(); }
+};
+
+template <class NT> static_zero<NT> operator-(static_zero<NT>) { return static_zero<NT>(); }
+
+template <class NT> NT operator+(NT const& x, static_zero<NT>) { return x; }
+template <class NT> NT operator+(static_zero<NT>, NT const& x) { return x; }
+template <class NT> static_zero<NT> operator+(static_zero<NT>, static_zero<NT>) { return static_zero<NT>(); }
+template <class NT> static_one<NT> operator+(static_zero<NT>, static_one<NT>) { return static_one<NT>(); }
+template <class NT> static_one<NT> operator+(static_one<NT>, static_zero<NT>) { return static_one<NT>(); }
+
+template <class NT> NT operator-(NT const& x, static_zero<NT>) { return x; }
+template <class NT> NT operator-(static_zero<NT>, NT const& x) { return -x; }
+template <class NT> static_zero<NT> operator-(static_zero<NT>, static_zero<NT>) { return static_zero<NT>(); }
+template <class NT> static_zero<NT> operator-(static_one<NT>, static_one<NT>) { return static_zero<NT>(); }
+template <class NT> static_one<NT> operator-(static_one<NT>, static_zero<NT>) { return static_one<NT>(); }
+
+template <class NT> NT operator*(NT const& x, static_one<NT>) { return x; }
+template <class NT> NT operator*(static_one<NT>, NT const& x) { return x; }
+template <class NT> static_zero<NT> operator*(NT const&, static_zero<NT>) { return static_zero<NT>(); }
+template <class NT> static_zero<NT> operator*(static_zero<NT>, NT const&) { return static_zero<NT>(); }
+template <class NT> static_zero<NT> operator*(static_zero<NT>, static_zero<NT>) { return static_zero<NT>(); }
+template <class NT> static_one<NT> operator*(static_one<NT>, static_one<NT>) { return static_one<NT>(); }
+template <class NT> static_zero<NT> operator*(static_zero<NT>, static_one<NT>) { return static_zero<NT>(); }
+template <class NT> static_zero<NT> operator*(static_one<NT>, static_zero<NT>) { return static_zero<NT>(); }
+
+template <class NT> NT operator/(NT const& x, static_one<NT>) { return x; }
+template <class NT> static_zero<NT> operator/(static_zero<NT>, NT const&) { return static_zero<NT>(); }
+template <class NT> static_zero<NT> operator/(static_zero<NT>, static_one<NT>) { return static_zero<NT>(); }
+template <class NT> static_one<NT> operator/(static_one<NT>, static_one<NT>) { return static_one<NT>(); }
+
+}
+#endif // CGAL_STATIC_INT_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/store_kernel.h b/include/gudhi_patches/CGAL/NewKernel_d/store_kernel.h
new file mode 100644
index 00000000..253e1282
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/store_kernel.h
@@ -0,0 +1,104 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_STORE_KERNEL_H
+#define CGAL_STORE_KERNEL_H
+
+#include <CGAL/assertions.h>
+#include <boost/type_traits/is_empty.hpp>
+
+namespace CGAL {
+namespace internal {
+BOOST_MPL_HAS_XXX_TRAIT_DEF(Do_not_store_kernel)
+template<class T,bool=boost::is_empty<T>::value,bool=has_Do_not_store_kernel<T>::value> struct Do_not_store_kernel {
+ enum { value=false };
+ typedef Tag_false type;
+};
+template<class T> struct Do_not_store_kernel<T,true,false> {
+ enum { value=true };
+ typedef Tag_true type;
+};
+template<class T,bool b> struct Do_not_store_kernel<T,b,true> {
+ typedef typename T::Do_not_store_kernel type;
+ enum { value=type::value };
+};
+}
+
+template<class R_,bool=internal::Do_not_store_kernel<R_>::value>
+struct Store_kernel {
+ Store_kernel(){}
+ Store_kernel(R_ const&){}
+ enum { kernel_is_stored = false };
+ R_ kernel()const{return R_();}
+ typedef R_ reference_type;
+ void set_kernel(R_ const&){}
+};
+template<class R_>
+struct Store_kernel<R_,false> {
+ Store_kernel():rp(0){
+ CGAL_warning_msg(true,"I should know my kernel");
+ }
+ Store_kernel(R_ const& r):rp(&r){}
+ enum { kernel_is_stored = true };
+ R_ const& kernel()const{
+ CGAL_warning_msg(rp!=0,"I should know my kernel");
+ return *rp;
+ }
+ typedef R_ const& reference_type;
+ void set_kernel(R_ const&r){rp=&r;}
+ private:
+ R_ const* rp;
+};
+
+//For a second kernel. TODO: find something more elegant
+template<class R_,bool=internal::Do_not_store_kernel<R_>::value>
+struct Store_kernel2 {
+ Store_kernel2(){}
+ Store_kernel2(R_ const&){}
+ enum { kernel2_is_stored = false };
+ R_ kernel2()const{return R_();}
+ typedef R_ reference2_type;
+ void set_kernel2(R_ const&){}
+};
+template<class R_>
+struct Store_kernel2<R_,false> {
+ Store_kernel2(){
+ //CGAL_warning_msg(true,"I should know my kernel");
+ }
+ Store_kernel2(R_ const& r):rp(&r){}
+ enum { kernel2_is_stored = true };
+ R_ const& kernel2()const{
+ CGAL_warning_msg(rp==0,"I should know my kernel");
+ return *rp;
+ }
+ typedef R_ const& reference2_type;
+ void set_kernel2(R_ const&r){rp=&r;}
+ private:
+ R_ const* rp;
+};
+}
+#define CGAL_BASE_INIT(X,Y) \
+ X():Y(){} \
+ X(R_ const&r):Y(r){}
+#define CGAL_FUNCTOR_INIT_STORE(X) CGAL_BASE_INIT(X,Store_kernel<R_>)
+#define CGAL_FUNCTOR_INIT_IGNORE(X) \
+ X(){} \
+ X(R_ const&){}
+
+#endif // CGAL_STORE_KERNEL_H
diff --git a/include/gudhi_patches/CGAL/NewKernel_d/utils.h b/include/gudhi_patches/CGAL/NewKernel_d/utils.h
new file mode 100644
index 00000000..238a2230
--- /dev/null
+++ b/include/gudhi_patches/CGAL/NewKernel_d/utils.h
@@ -0,0 +1,306 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_MARCUTILS
+#define CGAL_MARCUTILS
+
+#include <CGAL/config.h>
+
+#if defined(BOOST_MSVC)
+# pragma warning(push)
+# pragma warning(disable:4003) // not enough actual parameters for macro 'BOOST_PP_EXPAND_I'
+ // http://lists.boost.org/boost-users/2014/11/83291.php
+#endif
+
+#ifdef CGAL_CXX11
+#include <type_traits>
+#include <utility>
+#define CGAL_FORWARDABLE(T) T&&
+#define CGAL_FORWARD(T,t) std::forward<T>(t)
+#define CGAL_MOVE(t) std::move(t)
+#define CGAL_CONSTEXPR constexpr
+#else
+#define CGAL_FORWARDABLE(T) T const&
+#define CGAL_FORWARD(T,t) t
+#define CGAL_MOVE(t) t
+#define CGAL_CONSTEXPR
+#endif
+#include <boost/utility/enable_if.hpp>
+#include <boost/preprocessor/repetition.hpp>
+#include <CGAL/Rational_traits.h>
+#include <CGAL/tuple.h>
+#include <boost/mpl/has_xxx.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/type_traits.hpp>
+
+#ifdef CGAL_CXX11
+#define CGAL_BOOSTD std::
+#else
+#define CGAL_BOOSTD boost::
+#endif
+
+namespace CGAL {
+namespace internal {
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(type)
+}
+
+template <class T, class No, bool=internal::has_type<T>::value /*false*/>
+struct Has_type_different_from : boost::false_type {};
+template <class T, class No>
+struct Has_type_different_from <T, No, true>
+: boost::mpl::not_<boost::is_same<typename T::type, No> > {};
+
+
+ template <class T> struct Wrap_type { typedef T type; };
+
+ // tell a function f(a,b,c) that its real argument is a(b,c)
+ struct Eval_functor {};
+
+ // forget the first argument. Useful to make something dependant
+ // (and thus usable in SFINAE), although that's not a great design.
+ template<class A,class B> struct Second_arg {
+ typedef B type;
+ };
+
+ // like std::forward, except for basic types where it does a cast, to
+ // avoid issues with narrowing conversions
+#ifdef CGAL_CXX11
+ template<class T,class U,class V> inline
+ typename std::conditional<std::is_arithmetic<T>::value&&std::is_arithmetic<typename std::remove_reference<U>::type>::value,T,U&&>::type
+ forward_safe(V&& u) { return std::forward<U>(u); }
+#else
+ template<class T,class U> inline U const& forward_safe(U const& u) {
+ return u;
+ }
+#endif
+
+#ifdef CGAL_CXX11
+ template<class...> struct Constructible_from_each;
+ template<class To,class From1,class...From> struct Constructible_from_each<To,From1,From...>{
+ enum { value=std::is_convertible<From1,To>::value&&Constructible_from_each<To,From...>::value };
+ };
+ template<class To> struct Constructible_from_each<To>{
+ enum { value=true };
+ };
+#else
+// currently only used in C++0X code
+#endif
+
+ template<class T> struct Scale {
+#ifndef CGAL_CXX11
+ template<class> struct result;
+ template<class FT> struct result<Scale(FT)> {
+ typedef FT type;
+ };
+#endif
+ T const& scale;
+ Scale(T const& t):scale(t){}
+ template<class FT>
+#ifdef CGAL_CXX11
+ auto operator()(FT&& x)const->decltype(scale*std::forward<FT>(x))
+#else
+ FT operator()(FT const& x)const
+#endif
+ {
+ return scale*CGAL_FORWARD(FT,x);
+ }
+ };
+ template<class NT,class T> struct Divide {
+#if !defined(CGAL_CXX11) || !defined(BOOST_RESULT_OF_USE_DECLTYPE)
+ // requires boost > 1.44
+ // shouldn't be needed with C++0X
+ //template<class> struct result;
+ //template<class FT> struct result<Divide(FT)> {
+ // typedef FT type;
+ //};
+ typedef NT result_type;
+#endif
+ T const& scale;
+ Divide(T const& t):scale(t){}
+ template<class FT>
+#ifdef CGAL_CXX11
+ //FIXME: gcc complains for Gmpq
+ //auto operator()(FT&& x)const->decltype(Rational_traits<NT>().make_rational(std::forward<FT>(x),scale))
+ NT operator()(FT&& x)const
+#else
+ NT operator()(FT const& x)const
+#endif
+ {
+ return Rational_traits<NT>().
+ make_rational(CGAL_FORWARD(FT,x),scale);
+ }
+ };
+
+ template <class NT> struct has_cheap_constructor : boost::is_arithmetic<NT>{};
+ template <bool p> struct has_cheap_constructor<Interval_nt<p> > {
+ enum { value=true };
+ };
+
+ // like std::multiplies but allows mixing types
+ // in C++11 in doesn't need to be a template
+ template < class Ret >
+ struct multiplies {
+ template<class A,class B>
+#ifdef CGAL_CXX11
+ auto operator()(A&&a,B&&b)const->decltype(std::forward<A>(a)*std::forward<B>(b))
+#else
+ Ret operator()(A const& a, B const& b)const
+#endif
+ {
+ return CGAL_FORWARD(A,a)*CGAL_FORWARD(B,b);
+ }
+ };
+ template < class Ret >
+ struct division {
+ template<class A,class B>
+#ifdef CGAL_CXX11
+ auto operator()(A&&a,B&&b)const->decltype(std::forward<A>(a)/std::forward<B>(b))
+#else
+ Ret operator()(A const& a, B const& b)const
+#endif
+ {
+ return CGAL_FORWARD(A,a)/CGAL_FORWARD(B,b);
+ }
+ };
+
+#ifdef CGAL_CXX11
+ using std::decay;
+#else
+ template<class T> struct decay : boost::remove_cv<typename boost::decay<T>::type> {};
+#endif
+
+ template<class T,class U> struct Type_copy_ref { typedef U type; };
+ template<class T,class U> struct Type_copy_ref<T&,U> { typedef U& type; };
+#ifdef CGAL_CXX11
+ template<class T,class U> struct Type_copy_ref<T&&,U> { typedef U&& type; };
+#endif
+ template<class T,class U> struct Type_copy_cv { typedef U type; };
+ template<class T,class U> struct Type_copy_cv<T const,U> { typedef U const type; };
+ template<class T,class U> struct Type_copy_cv<T volatile,U> { typedef U volatile type; };
+ template<class T,class U> struct Type_copy_cv<T const volatile,U> { typedef U const volatile type; };
+
+ template<class T,class U> struct Type_copy_cvref :
+ Type_copy_ref<T,typename Type_copy_cv<typename boost::remove_reference<T>::type,U>::type> {};
+
+ struct Dereference_functor {
+ template<class> struct result{};
+ template<class It> struct result<Dereference_functor(It)> {
+ typedef typename std::iterator_traits<It>::reference type;
+ };
+ template<class It> typename result<Dereference_functor(It)>::type
+ operator()(It const&i)const{
+ return *i;
+ }
+ };
+
+#ifdef CGAL_CXX11
+ template<int...> struct Indices{};
+ template<class> struct Next_increasing_indices;
+ template<int...I> struct Next_increasing_indices<Indices<I...> > {
+ typedef Indices<I...,sizeof...(I)> type;
+ };
+ template<int N> struct N_increasing_indices {
+ typedef typename Next_increasing_indices<typename N_increasing_indices<N-1>::type>::type type;
+ };
+ template<> struct N_increasing_indices<0> { typedef Indices<> type; };
+ namespace internal {
+ template<class F,class...U,int...I> inline typename std::result_of<F&&(U...)>::type
+ do_call_on_tuple_elements(F&&f, std::tuple<U...>&&t, Indices<I...>&&) {
+ return f(std::get<I>(std::move(t))...);
+ }
+ } // internal
+ template<class/*result type, ignored*/,class F,class...U>
+ inline typename std::result_of<F&&(U...)>::type
+ call_on_tuple_elements(F&&f, std::tuple<U...>&&t) {
+ return internal::do_call_on_tuple_elements(std::forward<F>(f),std::move(t),
+ typename N_increasing_indices<sizeof...(U)>::type());
+ }
+#else
+#define CGAL_VAR(Z,N,_) cpp0x::get<N>(t)
+#define CGAL_CODE(Z,N,_) template<class Res, class F BOOST_PP_COMMA_IF(N) BOOST_PP_ENUM_PARAMS(N,class U)> \
+ inline Res call_on_tuple_elements(F const&f, \
+ cpp0x::tuple<BOOST_PP_ENUM_PARAMS(N,U)> const&t) { \
+ return f(BOOST_PP_ENUM(N,CGAL_VAR,)); \
+ }
+ template<class Res, class F>
+ inline Res call_on_tuple_elements(F const&f, cpp0x::tuple<>) {
+ return f();
+ }
+BOOST_PP_REPEAT_FROM_TO(1, 8, CGAL_CODE, _ )
+#undef CGAL_CODE
+#undef CGAL_VAR
+#endif
+
+ template<class A> struct Factory {
+ typedef A result_type;
+#ifdef CGAL_CXX11
+ template<class...U> result_type operator()(U&&...u)const{
+ return A(std::forward<U>(u)...);
+ }
+#else
+ result_type operator()()const{
+ return A();
+ }
+#define CGAL_CODE(Z,N,_) template<BOOST_PP_ENUM_PARAMS(N,class U)> \
+ result_type operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,U,const&u))const{ \
+ return A(BOOST_PP_ENUM_PARAMS(N,u)); \
+ }
+BOOST_PP_REPEAT_FROM_TO(1, 8, CGAL_CODE, _ )
+#undef CGAL_CODE
+#endif
+ };
+}
+
+// TODO: make a Cartesian-only variant
+// WARNING: do not use the Req* parameters too much, they can cause circular instanciations and are only useful for dispatching.
+#define CGAL_STRIP_PAREN_(...) __VA_ARGS__
+#define CGAL_STRIP_PAREN(...) CGAL_STRIP_PAREN_ __VA_ARGS__
+// What to do with O? pass it down to other functors or drop it?
+#define CGAL_KD_DEFAULT_FUNCTOR(Tg,Name,ReqTyp,ReqFun) \
+ template <class K, class O> \
+ struct Get_functor<K, Tg, O, \
+ typename boost::mpl::if_c< \
+ Provides_functor_i<K, Tg, O>::value \
+ || !Provides_types<K, boost::mpl::vector<CGAL_STRIP_PAREN_ ReqTyp> >::value \
+ || !Provides_functors<K, boost::mpl::vector<CGAL_STRIP_PAREN_ ReqFun> >::value \
+ , int, void>::type> \
+ { \
+ typedef CGAL_STRIP_PAREN_ Name type; \
+ typedef K Bound_kernel; \
+ }
+
+// Not used yet, may need some changes.
+#define CGAL_KD_DEFAULT_TYPE(Tg,Name,ReqTyp,ReqFun) \
+ template <class K> \
+ struct Get_type<K, Tg, \
+ typename boost::mpl::if_c< \
+ Provides_type_i<K, Tg>::value \
+ || !Provides_types<K, boost::mpl::vector<CGAL_STRIP_PAREN_ ReqTyp> >::value \
+ || !Provides_functors<K, boost::mpl::vector<CGAL_STRIP_PAREN_ ReqFun> >::value \
+ , int, void>::type> \
+ { \
+ typedef CGAL_STRIP_PAREN_ Name type; \
+ typedef K Bound_kernel; \
+ }
+
+#if defined(BOOST_MSVC)
+# pragma warning(pop)
+#endif
+
+#endif
diff --git a/include/gudhi_patches/CGAL/Orthogonal_incremental_neighbor_search.h b/include/gudhi_patches/CGAL/Orthogonal_incremental_neighbor_search.h
new file mode 100644
index 00000000..e29ce14f
--- /dev/null
+++ b/include/gudhi_patches/CGAL/Orthogonal_incremental_neighbor_search.h
@@ -0,0 +1,620 @@
+// Copyright (c) 2002,2011 Utrecht University (The Netherlands).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+//
+// Author(s) : Hans Tangelder (<hanst@cs.uu.nl>)
+
+#ifndef CGAL_ORTHOGONAL_INCREMENTAL_NEIGHBOR_SEARCH
+#define CGAL_ORTHOGONAL_INCREMENTAL_NEIGHBOR_SEARCH
+
+#include <CGAL/Kd_tree.h>
+#include <cstring>
+#include <list>
+#include <queue>
+#include <memory>
+#include <CGAL/Euclidean_distance.h>
+#include <CGAL/tuple.h>
+
+namespace CGAL {
+
+ template <class SearchTraits,
+ class Distance_= typename internal::Spatial_searching_default_distance<SearchTraits>::type,
+ class Splitter_ = Sliding_midpoint<SearchTraits>,
+ class Tree_= Kd_tree<SearchTraits, Splitter_, Tag_true> >
+ class Orthogonal_incremental_neighbor_search {
+
+ public:
+ typedef Splitter_ Splitter;
+ typedef Tree_ Tree;
+ typedef Distance_ Distance;
+ typedef typename SearchTraits::Point_d Point_d;
+ typedef typename Distance::Query_item Query_item;
+ typedef typename SearchTraits::FT FT;
+ typedef typename Tree::Point_d_iterator Point_d_iterator;
+ typedef typename Tree::Node_const_handle Node_const_handle;
+
+ typedef std::pair<Point_d,FT> Point_with_transformed_distance;
+ typedef CGAL::cpp11::tuple<Node_const_handle,FT,std::vector<FT> > Node_with_distance;
+ typedef std::vector<Node_with_distance*> Node_with_distance_vector;
+ typedef std::vector<Point_with_transformed_distance*> Point_with_transformed_distance_vector;
+
+ template<class T>
+ struct Object_wrapper
+ {
+ T object;
+ Object_wrapper(const T& t):object(t){}
+ const T& operator* () const { return object; }
+ const T* operator-> () const { return &object; }
+ };
+
+ class Iterator_implementation {
+ SearchTraits traits;
+ public:
+
+ int number_of_neighbours_computed;
+ int number_of_internal_nodes_visited;
+ int number_of_leaf_nodes_visited;
+ int number_of_items_visited;
+
+ private:
+
+ typedef std::vector<FT> Distance_vector;
+
+ Distance_vector dists;
+
+ Distance Orthogonal_distance_instance;
+
+ FT multiplication_factor;
+
+ Query_item query_point;
+
+ FT distance_to_root;
+
+ bool search_nearest_neighbour;
+
+ FT rd;
+
+
+ class Priority_higher {
+ public:
+
+ bool search_nearest;
+
+ Priority_higher(bool search_the_nearest_neighbour)
+ : search_nearest(search_the_nearest_neighbour)
+ {}
+
+ //highest priority is smallest distance
+ bool
+ operator() (Node_with_distance* n1, Node_with_distance* n2) const
+ {
+ return (search_nearest) ? (CGAL::cpp11::get<1>(*n1) > CGAL::cpp11::get<1>(*n2)) : (CGAL::cpp11::get<1>(*n2) > CGAL::cpp11::get<1>(*n1));
+ }
+ };
+
+ class Distance_smaller {
+
+ public:
+
+ bool search_nearest;
+
+ Distance_smaller(bool search_the_nearest_neighbour)
+ : search_nearest(search_the_nearest_neighbour)
+ {}
+
+ //highest priority is smallest distance
+ bool operator() (Point_with_transformed_distance* p1, Point_with_transformed_distance* p2) const
+ {
+ return (search_nearest) ? (p1->second > p2->second) : (p2->second > p1->second);
+ }
+ };
+
+
+ std::priority_queue<Node_with_distance*, Node_with_distance_vector,
+ Priority_higher> PriorityQueue;
+
+ public:
+ std::priority_queue<Point_with_transformed_distance*, Point_with_transformed_distance_vector,
+ Distance_smaller> Item_PriorityQueue;
+
+
+ public:
+
+ int reference_count;
+
+
+
+ // constructor
+ Iterator_implementation(const Tree& tree,const Query_item& q, const Distance& tr,
+ FT Eps=FT(0.0), bool search_nearest=true)
+ : traits(tree.traits()),number_of_neighbours_computed(0), number_of_internal_nodes_visited(0),
+ number_of_leaf_nodes_visited(0), number_of_items_visited(0),
+ Orthogonal_distance_instance(tr), multiplication_factor(Orthogonal_distance_instance.transformed_distance(FT(1.0)+Eps)),
+ query_point(q), search_nearest_neighbour(search_nearest),
+ PriorityQueue(Priority_higher(search_nearest)), Item_PriorityQueue(Distance_smaller(search_nearest)),
+ reference_count(1)
+
+
+ {
+ if (tree.empty()) return;
+
+ typename SearchTraits::Construct_cartesian_const_iterator_d ccci=traits.construct_cartesian_const_iterator_d_object();
+ int dim = static_cast<int>(std::distance(ccci(q), ccci(q,0)));
+
+ dists.resize(dim);
+ for(int i=0 ; i<dim ; ++i){
+ dists[i] = 0;
+ }
+
+ if (search_nearest){
+ distance_to_root=
+ Orthogonal_distance_instance.min_distance_to_rectangle(q, tree.bounding_box(),dists);
+ Node_with_distance *The_Root = new Node_with_distance(tree.root(),
+ distance_to_root, dists);
+ PriorityQueue.push(The_Root);
+
+ // rd is the distance of the top of the priority queue to q
+ rd=CGAL::cpp11::get<1>(*The_Root);
+ Compute_the_next_nearest_neighbour();
+ }
+ else{
+ distance_to_root=
+ Orthogonal_distance_instance.max_distance_to_rectangle(q,
+ tree.bounding_box(), dists);
+ Node_with_distance *The_Root = new Node_with_distance(tree.root(),
+ distance_to_root, dists);
+ PriorityQueue.push(The_Root);
+
+ // rd is the distance of the top of the priority queue to q
+ rd=CGAL::cpp11::get<1>(*The_Root);
+ Compute_the_next_furthest_neighbour();
+ }
+
+
+ }
+
+ // * operator
+ const Point_with_transformed_distance&
+ operator* () const
+ {
+ return *(Item_PriorityQueue.top());
+ }
+
+ // prefix operator
+ Iterator_implementation&
+ operator++()
+ {
+ Delete_the_current_item_top();
+ if(search_nearest_neighbour)
+ Compute_the_next_nearest_neighbour();
+ else
+ Compute_the_next_furthest_neighbour();
+ return *this;
+ }
+
+ // postfix operator
+ Object_wrapper<Point_with_transformed_distance>
+ operator++(int)
+ {
+ Object_wrapper<Point_with_transformed_distance> result( *(Item_PriorityQueue.top()) );
+ ++*this;
+ return result;
+ }
+
+ // Print statistics of the general priority search process.
+ std::ostream&
+ statistics (std::ostream& s) const {
+ s << "Orthogonal priority search statistics:"
+ << std::endl;
+ s << "Number of internal nodes visited:"
+ << number_of_internal_nodes_visited << std::endl;
+ s << "Number of leaf nodes visited:"
+ << number_of_leaf_nodes_visited << std::endl;
+ s << "Number of items visited:"
+ << number_of_items_visited << std::endl;
+ s << "Number of neighbours computed:"
+ << number_of_neighbours_computed << std::endl;
+ return s;
+ }
+
+
+ //destructor
+ ~Iterator_implementation()
+ {
+ while (!PriorityQueue.empty()) {
+ Node_with_distance* The_top=PriorityQueue.top();
+ PriorityQueue.pop();
+ delete The_top;
+ }
+ while (!Item_PriorityQueue.empty()) {
+ Point_with_transformed_distance* The_top=Item_PriorityQueue.top();
+ Item_PriorityQueue.pop();
+ delete The_top;
+ }
+ }
+
+ private:
+
+ void
+ Delete_the_current_item_top()
+ {
+ Point_with_transformed_distance* The_item_top=Item_PriorityQueue.top();
+ Item_PriorityQueue.pop();
+ delete The_item_top;
+ }
+
+ void
+ Compute_the_next_nearest_neighbour()
+ {
+ // compute the next item
+ bool next_neighbour_found=false;
+ if (!(Item_PriorityQueue.empty())) {
+ next_neighbour_found=
+ (multiplication_factor*rd > Item_PriorityQueue.top()->second);
+ }
+ typename SearchTraits::Construct_cartesian_const_iterator_d construct_it=traits.construct_cartesian_const_iterator_d_object();
+ typename SearchTraits::Cartesian_const_iterator_d query_point_it = construct_it(query_point);
+ // otherwise browse the tree further
+ while ((!next_neighbour_found) && (!PriorityQueue.empty())) {
+ Node_with_distance* The_node_top=PriorityQueue.top();
+ Node_const_handle N= CGAL::cpp11::get<0>(*The_node_top);
+ dists = CGAL::cpp11::get<2>(*The_node_top);
+ PriorityQueue.pop();
+ delete The_node_top;
+ FT copy_rd=rd;
+ while (!(N->is_leaf())) { // compute new distance
+ typename Tree::Internal_node_const_handle node =
+ static_cast<typename Tree::Internal_node_const_handle>(N);
+ number_of_internal_nodes_visited++;
+ int new_cut_dim=node->cutting_dimension();
+ FT new_rd,dst = dists[new_cut_dim];
+ FT val = *(query_point_it + new_cut_dim);
+ FT diff1 = val - node->upper_low_value();
+ FT diff2 = val - node->lower_high_value();
+ if (diff1 + diff2 < FT(0.0)) {
+ new_rd=
+ Orthogonal_distance_instance.new_distance(copy_rd,dst,diff1,new_cut_dim);
+
+ CGAL_assertion(new_rd >= copy_rd);
+ dists[new_cut_dim] = diff1;
+ Node_with_distance *Upper_Child =
+ new Node_with_distance(node->upper(), new_rd, dists);
+ PriorityQueue.push(Upper_Child);
+ dists[new_cut_dim] = dst;
+ N=node->lower();
+
+ }
+ else { // compute new distance
+ new_rd=Orthogonal_distance_instance.new_distance(copy_rd,dst,diff2,new_cut_dim);
+ CGAL_assertion(new_rd >= copy_rd);
+ dists[new_cut_dim] = diff2;
+ Node_with_distance *Lower_Child =
+ new Node_with_distance(node->lower(), new_rd, dists);
+ PriorityQueue.push(Lower_Child);
+ dists[new_cut_dim] = dst;
+ N=node->upper();
+ }
+ }
+ // n is a leaf
+ typename Tree::Leaf_node_const_handle node =
+ static_cast<typename Tree::Leaf_node_const_handle>(N);
+ number_of_leaf_nodes_visited++;
+ if (node->size() > 0) {
+ for (typename Tree::iterator it=node->begin(); it != node->end(); it++) {
+ number_of_items_visited++;
+ FT distance_to_query_point=
+ Orthogonal_distance_instance.transformed_distance(query_point,*it);
+ Point_with_transformed_distance *NN_Candidate=
+ new Point_with_transformed_distance(*it,distance_to_query_point);
+ Item_PriorityQueue.push(NN_Candidate);
+ }
+ // old top of PriorityQueue has been processed,
+ // hence update rd
+
+ if (!(PriorityQueue.empty())) {
+ rd = CGAL::cpp11::get<1>(*PriorityQueue.top());
+ next_neighbour_found =
+ (multiplication_factor*rd >
+ Item_PriorityQueue.top()->second);
+ }
+ else // priority queue empty => last neighbour found
+ {
+ next_neighbour_found=true;
+ }
+
+ number_of_neighbours_computed++;
+ }
+ } // next_neighbour_found or priority queue is empty
+ // in the latter case also the item priority quee is empty
+ }
+
+
+ void
+ Compute_the_next_furthest_neighbour()
+ {
+ // compute the next item
+ bool next_neighbour_found=false;
+ if (!(Item_PriorityQueue.empty())) {
+ next_neighbour_found=
+ (rd < multiplication_factor*Item_PriorityQueue.top()->second);
+ }
+ typename SearchTraits::Construct_cartesian_const_iterator_d construct_it=traits.construct_cartesian_const_iterator_d_object();
+ typename SearchTraits::Cartesian_const_iterator_d query_point_it = construct_it(query_point);
+ // otherwise browse the tree further
+ while ((!next_neighbour_found) && (!PriorityQueue.empty())) {
+ Node_with_distance* The_node_top=PriorityQueue.top();
+ Node_const_handle N= CGAL::cpp11::get<0>(*The_node_top);
+ dists = CGAL::cpp11::get<2>(*The_node_top);
+ PriorityQueue.pop();
+ delete The_node_top;
+ FT copy_rd=rd;
+ while (!(N->is_leaf())) { // compute new distance
+ typename Tree::Internal_node_const_handle node =
+ static_cast<typename Tree::Internal_node_const_handle>(N);
+ number_of_internal_nodes_visited++;
+ int new_cut_dim=node->cutting_dimension();
+ FT new_rd,dst = dists[new_cut_dim];
+ FT val = *(query_point_it + new_cut_dim);
+ FT diff1 = val - node->upper_low_value();
+ FT diff2 = val - node->lower_high_value();
+ if (diff1 + diff2 < FT(0.0)) {
+ diff1 = val - node->upper_high_value();
+ new_rd=
+ Orthogonal_distance_instance.new_distance(copy_rd,dst,diff1,new_cut_dim);
+ Node_with_distance *Lower_Child =
+ new Node_with_distance(node->lower(), copy_rd, dists);
+ PriorityQueue.push(Lower_Child);
+ N=node->upper();
+ dists[new_cut_dim] = diff1;
+ copy_rd=new_rd;
+
+ }
+ else { // compute new distance
+ diff2 = val - node->lower_low_value();
+ new_rd=Orthogonal_distance_instance.new_distance(copy_rd,dst,diff2,new_cut_dim);
+ Node_with_distance *Upper_Child =
+ new Node_with_distance(node->upper(), copy_rd, dists);
+ PriorityQueue.push(Upper_Child);
+ N=node->lower();
+ dists[new_cut_dim] = diff2;
+ copy_rd=new_rd;
+ }
+ }
+ // n is a leaf
+ typename Tree::Leaf_node_const_handle node =
+ static_cast<typename Tree::Leaf_node_const_handle>(N);
+ number_of_leaf_nodes_visited++;
+ if (node->size() > 0) {
+ for (typename Tree::iterator it=node->begin(); it != node->end(); it++) {
+ number_of_items_visited++;
+ FT distance_to_query_point=
+ Orthogonal_distance_instance.transformed_distance(query_point,*it);
+ Point_with_transformed_distance *NN_Candidate=
+ new Point_with_transformed_distance(*it,distance_to_query_point);
+ Item_PriorityQueue.push(NN_Candidate);
+ }
+ // old top of PriorityQueue has been processed,
+ // hence update rd
+
+ if (!(PriorityQueue.empty())) {
+ rd = CGAL::cpp11::get<1>(*PriorityQueue.top());
+ next_neighbour_found =
+ (multiplication_factor*rd <
+ Item_PriorityQueue.top()->second);
+ }
+ else // priority queue empty => last neighbour found
+ {
+ next_neighbour_found=true;
+ }
+
+ number_of_neighbours_computed++;
+ }
+ } // next_neighbour_found or priority queue is empty
+ // in the latter case also the item priority quee is empty
+ }
+ }; // class Iterator_implementaion
+
+
+
+
+
+
+
+
+
+ public:
+ class iterator;
+ typedef iterator const_iterator;
+
+ // constructor
+ Orthogonal_incremental_neighbor_search(const Tree& tree,
+ const Query_item& q, FT Eps = FT(0.0),
+ bool search_nearest=true, const Distance& tr=Distance())
+ : m_tree(tree),m_query(q),m_dist(tr),m_Eps(Eps),m_search_nearest(search_nearest)
+ {}
+
+ iterator
+ begin() const
+ {
+ return iterator(m_tree,m_query,m_dist,m_Eps,m_search_nearest);
+ }
+
+ iterator
+ end() const
+ {
+ return iterator();
+ }
+
+ std::ostream&
+ statistics(std::ostream& s)
+ {
+ begin()->statistics(s);
+ return s;
+ }
+
+
+
+
+ class iterator {
+
+ public:
+
+ typedef std::input_iterator_tag iterator_category;
+ typedef Point_with_transformed_distance value_type;
+ typedef Point_with_transformed_distance* pointer;
+ typedef const Point_with_transformed_distance& reference;
+ typedef std::size_t size_type;
+ typedef std::ptrdiff_t difference_type;
+ typedef int distance_type;
+
+ //class Iterator_implementation;
+ Iterator_implementation *Ptr_implementation;
+
+
+ public:
+
+ // default constructor
+ iterator()
+ : Ptr_implementation(0)
+ {}
+
+ int
+ the_number_of_items_visited()
+ {
+ return Ptr_implementation->number_of_items_visited;
+ }
+
+ // constructor
+ iterator(const Tree& tree,const Query_item& q, const Distance& tr=Distance(), FT eps=FT(0.0),
+ bool search_nearest=true)
+ : Ptr_implementation(new Iterator_implementation(tree, q, tr, eps, search_nearest))
+ {}
+
+ // copy constructor
+ iterator(const iterator& Iter)
+ {
+ Ptr_implementation = Iter.Ptr_implementation;
+ if (Ptr_implementation != 0) Ptr_implementation->reference_count++;
+ }
+
+ iterator& operator=(const iterator& Iter)
+ {
+ if (Ptr_implementation != Iter.Ptr_implementation){
+ if (Ptr_implementation != 0 && --(Ptr_implementation->reference_count)==0) {
+ delete Ptr_implementation;
+ }
+ Ptr_implementation = Iter.Ptr_implementation;
+ if (Ptr_implementation != 0) Ptr_implementation->reference_count++;
+ }
+ return *this;
+ }
+
+
+ const Point_with_transformed_distance&
+ operator* () const
+ {
+ return *(*Ptr_implementation);
+ }
+
+ // -> operator
+ const Point_with_transformed_distance*
+ operator-> () const
+ {
+ return &*(*Ptr_implementation);
+ }
+
+ // prefix operator
+ iterator&
+ operator++()
+ {
+ ++(*Ptr_implementation);
+ return *this;
+ }
+
+ // postfix operator
+ Object_wrapper<Point_with_transformed_distance>
+ operator++(int)
+ {
+ return (*Ptr_implementation)++;
+ }
+
+
+ bool
+ operator==(const iterator& It) const
+ {
+ if (
+ ((Ptr_implementation == 0) ||
+ Ptr_implementation->Item_PriorityQueue.empty()) &&
+ ((It.Ptr_implementation == 0) ||
+ It.Ptr_implementation->Item_PriorityQueue.empty())
+ )
+ return true;
+ // else
+ return (Ptr_implementation == It.Ptr_implementation);
+ }
+
+ bool
+ operator!=(const iterator& It) const
+ {
+ return !(*this == It);
+ }
+
+ std::ostream&
+ statistics (std::ostream& s)
+ {
+ Ptr_implementation->statistics(s);
+ return s;
+ }
+
+ ~iterator()
+ {
+ if (Ptr_implementation != 0) {
+ Ptr_implementation->reference_count--;
+ if (Ptr_implementation->reference_count==0) {
+ delete Ptr_implementation;
+ Ptr_implementation = 0;
+ }
+ }
+ }
+
+
+ }; // class iterator
+
+ //data members
+ const Tree& m_tree;
+ Query_item m_query;
+ Distance m_dist;
+ FT m_Eps;
+ bool m_search_nearest;
+ }; // class
+
+ template <class Traits, class Query_item, class Distance>
+ void swap (typename Orthogonal_incremental_neighbor_search<Traits,
+ Query_item, Distance>::iterator& x,
+ typename Orthogonal_incremental_neighbor_search<Traits,
+ Query_item, Distance>::iterator& y)
+ {
+ typename Orthogonal_incremental_neighbor_search<Traits,
+ Query_item, Distance>::iterator::Iterator_implementation
+ *tmp = x.Ptr_implementation;
+ x.Ptr_implementation = y.Ptr_implementation;
+ y.Ptr_implementation = tmp;
+ }
+
+} // namespace CGAL
+
+#endif // CGAL_ORTHOGONAL_INCREMENTAL_NEIGHBOR_SEARCH_H
diff --git a/include/gudhi_patches/CGAL/Regular_triangulation.h b/include/gudhi_patches/CGAL/Regular_triangulation.h
new file mode 100644
index 00000000..111c6ac9
--- /dev/null
+++ b/include/gudhi_patches/CGAL/Regular_triangulation.h
@@ -0,0 +1,1169 @@
+// Copyright (c) 2014 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Clement Jamin
+
+#ifndef CGAL_REGULAR_TRIANGULATION_H
+#define CGAL_REGULAR_TRIANGULATION_H
+
+#include <CGAL/Triangulation.h>
+#include <CGAL/Dimension.h>
+#include <CGAL/Default.h>
+#include <CGAL/spatial_sort.h>
+#include <CGAL/Regular_triangulation_traits_adapter.h>
+
+#include <boost/property_map/function_property_map.hpp>
+
+namespace CGAL {
+
+template< typename Traits_, typename TDS_ = Default >
+class Regular_triangulation
+: public Triangulation<
+ Regular_triangulation_traits_adapter<Traits_>,
+ typename Default::Get<
+ TDS_,
+ Triangulation_data_structure<
+ typename Regular_triangulation_traits_adapter<Traits_>::Dimension,
+ Triangulation_vertex<Regular_triangulation_traits_adapter<Traits_> >,
+ Triangulation_full_cell<Regular_triangulation_traits_adapter<Traits_> >
+ >
+ >::type>
+{
+ typedef Regular_triangulation_traits_adapter<Traits_> RTTraits;
+ typedef typename RTTraits::Dimension Maximal_dimension_;
+ typedef typename Default::Get<
+ TDS_,
+ Triangulation_data_structure<
+ Maximal_dimension_,
+ Triangulation_vertex<RTTraits>,
+ Triangulation_full_cell<RTTraits>
+ > >::type TDS;
+ typedef Triangulation<RTTraits, TDS> Base;
+ typedef Regular_triangulation<Traits_, TDS_> Self;
+
+ typedef typename RTTraits::Orientation_d Orientation_d;
+ typedef typename RTTraits::Power_side_of_power_sphere_d Power_side_of_power_sphere_d;
+ typedef typename RTTraits::In_flat_power_side_of_power_sphere_d
+ In_flat_power_side_of_power_sphere_d;
+ typedef typename RTTraits::Flat_orientation_d Flat_orientation_d;
+ typedef typename RTTraits::Construct_flat_orientation_d Construct_flat_orientation_d;
+
+public: // PUBLIC NESTED TYPES
+
+ typedef RTTraits Geom_traits;
+ typedef typename Base::Triangulation_ds Triangulation_ds;
+
+ typedef typename Base::Vertex Vertex;
+ typedef typename Base::Full_cell Full_cell;
+ typedef typename Base::Facet Facet;
+ typedef typename Base::Face Face;
+
+ typedef Maximal_dimension_ Maximal_dimension;
+ typedef typename RTTraits::Bare_point_d Bare_point;
+ typedef typename RTTraits::Weighted_point_d Weighted_point;
+
+ typedef typename Base::Point_const_iterator Point_const_iterator;
+ typedef typename Base::Vertex_handle Vertex_handle;
+ typedef typename Base::Vertex_iterator Vertex_iterator;
+ typedef typename Base::Vertex_const_handle Vertex_const_handle;
+ typedef typename Base::Vertex_const_iterator Vertex_const_iterator;
+
+ typedef typename Base::Full_cell_handle Full_cell_handle;
+ typedef typename Base::Full_cell_iterator Full_cell_iterator;
+ typedef typename Base::Full_cell_const_handle Full_cell_const_handle;
+ typedef typename Base::Full_cell_const_iterator Full_cell_const_iterator;
+ typedef typename Base::Finite_full_cell_const_iterator
+ Finite_full_cell_const_iterator;
+
+ typedef typename Base::size_type size_type;
+ typedef typename Base::difference_type difference_type;
+
+ typedef typename Base::Locate_type Locate_type;
+
+ //Tag to distinguish Delaunay from Regular triangulations
+ typedef Tag_true Weighted_tag;
+
+protected: // DATA MEMBERS
+
+
+public:
+
+ using typename Base::Rotor;
+ using Base::maximal_dimension;
+ using Base::are_incident_full_cells_valid;
+ using Base::coaffine_orientation_predicate;
+ using Base::reset_flat_orientation;
+ using Base::current_dimension;
+ using Base::geom_traits;
+ using Base::index_of_covertex;
+ //using Base::index_of_second_covertex;
+ using Base::rotate_rotor;
+ using Base::infinite_vertex;
+ using Base::insert_in_hole;
+ using Base::is_infinite;
+ using Base::locate;
+ using Base::points_begin;
+ using Base::set_neighbors;
+ using Base::new_full_cell;
+ using Base::number_of_vertices;
+ using Base::orientation;
+ using Base::tds;
+ using Base::reorient_full_cells;
+ using Base::full_cell;
+ using Base::full_cells_begin;
+ using Base::full_cells_end;
+ using Base::finite_full_cells_begin;
+ using Base::finite_full_cells_end;
+ using Base::vertices_begin;
+ using Base::vertices_end;
+
+private:
+
+ // Wrapper
+ struct Power_side_of_power_sphere_for_non_maximal_dim_d
+ {
+ boost::optional<Flat_orientation_d>* fop;
+ Construct_flat_orientation_d cfo;
+ In_flat_power_side_of_power_sphere_d ifpt;
+
+ Power_side_of_power_sphere_for_non_maximal_dim_d(
+ boost::optional<Flat_orientation_d>& x,
+ Construct_flat_orientation_d const&y,
+ In_flat_power_side_of_power_sphere_d const&z)
+ : fop(&x), cfo(y), ifpt(z) {}
+
+ template<class Iter>
+ CGAL::Orientation operator()(Iter a, Iter b, const Weighted_point & p)const
+ {
+ if(!*fop)
+ *fop=cfo(a,b);
+ return ifpt(fop->get(),a,b,p);
+ }
+ };
+
+public:
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - CREATION / CONSTRUCTORS
+
+ Regular_triangulation(int dim, const Geom_traits &k = Geom_traits())
+ : Base(dim, k)
+ {
+ }
+
+ // With this constructor,
+ // the user can specify a Flat_orientation_d object to be used for
+ // orienting simplices of a specific dimension
+ // (= preset_flat_orientation_.first)
+ // It it used by the dark triangulations created by DT::remove
+ Regular_triangulation(
+ int dim,
+ const std::pair<int, const Flat_orientation_d *> &preset_flat_orientation,
+ const Geom_traits &k = Geom_traits())
+ : Base(dim, preset_flat_orientation, k)
+ {
+ }
+
+ ~Regular_triangulation() {}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ACCESS
+
+ // Not Documented
+ Power_side_of_power_sphere_for_non_maximal_dim_d power_side_of_power_sphere_for_non_maximal_dim_predicate() const
+ {
+ return Power_side_of_power_sphere_for_non_maximal_dim_d (
+ flat_orientation_,
+ geom_traits().construct_flat_orientation_d_object(),
+ geom_traits().in_flat_power_side_of_power_sphere_d_object()
+ );
+ }
+
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - REMOVALS
+
+ // Warning: these functions are not correct since they do not restore hidden
+ // vertices
+
+ Full_cell_handle remove(Vertex_handle);
+ Full_cell_handle remove(const Weighted_point & p, Full_cell_handle hint = Full_cell_handle())
+ {
+ Locate_type lt;
+ Face f(maximal_dimension());
+ Facet ft;
+ Full_cell_handle s = locate(p, lt, f, ft, hint);
+ if( Base::ON_VERTEX == lt )
+ {
+ return remove(s->vertex(f.index(0)));
+ }
+ return Full_cell_handle();
+ }
+
+ template< typename ForwardIterator >
+ void remove(ForwardIterator start, ForwardIterator end)
+ {
+ while( start != end )
+ remove(*start++);
+ }
+
+ // Not documented
+ void remove_decrease_dimension(Vertex_handle);
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - INSERTIONS
+
+ template< typename ForwardIterator >
+ std::ptrdiff_t insert(ForwardIterator start, ForwardIterator end)
+ {
+ size_type n = number_of_vertices();
+ typedef std::vector<Weighted_point> WP_vec;
+ WP_vec points(start, end);
+
+ spatial_sort(points.begin(), points.end(), geom_traits());
+
+ Full_cell_handle hint;
+ for(typename WP_vec::const_iterator p = points.begin(); p != points.end(); ++p )
+ {
+ Locate_type lt;
+ Face f(maximal_dimension());
+ Facet ft;
+ Full_cell_handle c = locate (*p, lt, f, ft, hint);
+ Vertex_handle v = insert (*p, lt, f, ft, c);
+
+ hint = v == Vertex_handle() ? c : v->full_cell();
+ }
+ return number_of_vertices() - n;
+ }
+
+ Vertex_handle insert(const Weighted_point &,
+ Locate_type,
+ const Face &,
+ const Facet &,
+ Full_cell_handle);
+
+ Vertex_handle insert(const Weighted_point & p,
+ Full_cell_handle start = Full_cell_handle())
+ {
+ Locate_type lt;
+ Face f(maximal_dimension());
+ Facet ft;
+ Full_cell_handle s = locate(p, lt, f, ft, start);
+ return insert(p, lt, f, ft, s);
+ }
+
+ Vertex_handle insert(const Weighted_point & p, Vertex_handle hint)
+ {
+ CGAL_assertion( Vertex_handle() != hint );
+ return insert(p, hint->full_cell());
+ }
+
+ Vertex_handle insert_outside_affine_hull(const Weighted_point &);
+ Vertex_handle insert_in_conflicting_cell(
+ const Weighted_point &, Full_cell_handle,
+ Vertex_handle only_if_this_vertex_is_in_the_cz = Vertex_handle());
+
+ Vertex_handle insert_if_in_star(const Weighted_point &,
+ Vertex_handle,
+ Locate_type,
+ const Face &,
+ const Facet &,
+ Full_cell_handle);
+
+ Vertex_handle insert_if_in_star(
+ const Weighted_point & p, Vertex_handle star_center,
+ Full_cell_handle start = Full_cell_handle())
+ {
+ Locate_type lt;
+ Face f(maximal_dimension());
+ Facet ft;
+ Full_cell_handle s = locate(p, lt, f, ft, start);
+ return insert_if_in_star(p, star_center, lt, f, ft, s);
+ }
+
+ Vertex_handle insert_if_in_star(
+ const Weighted_point & p, Vertex_handle star_center,
+ Vertex_handle hint)
+ {
+ CGAL_assertion( Vertex_handle() != hint );
+ return insert_if_in_star(p, star_center, hint->full_cell());
+ }
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - GATHERING CONFLICTING SIMPLICES
+
+ bool is_in_conflict(const Weighted_point &, Full_cell_const_handle) const;
+
+ template< class OrientationPredicate >
+ Oriented_side perturbed_power_side_of_power_sphere(const Weighted_point &,
+ Full_cell_const_handle, const OrientationPredicate &) const;
+
+ template< typename OutputIterator >
+ Facet compute_conflict_zone(const Weighted_point &, Full_cell_handle, OutputIterator) const;
+
+ template < typename OrientationPredicate, typename PowerTestPredicate >
+ class Conflict_predicate
+ {
+ const Self & rt_;
+ const Weighted_point & p_;
+ OrientationPredicate ori_;
+ PowerTestPredicate power_side_of_power_sphere_;
+ int cur_dim_;
+ public:
+ Conflict_predicate(
+ const Self & rt,
+ const Weighted_point & p,
+ const OrientationPredicate & ori,
+ const PowerTestPredicate & power_side_of_power_sphere)
+ : rt_(rt), p_(p), ori_(ori), power_side_of_power_sphere_(power_side_of_power_sphere), cur_dim_(rt.current_dimension()) {}
+
+ inline
+ bool operator()(Full_cell_const_handle s) const
+ {
+ bool ok;
+ if( ! rt_.is_infinite(s) )
+ {
+ Oriented_side power_side_of_power_sphere = power_side_of_power_sphere_(rt_.points_begin(s), rt_.points_begin(s) + cur_dim_ + 1, p_);
+ if( ON_POSITIVE_SIDE == power_side_of_power_sphere )
+ ok = true;
+ else if( ON_NEGATIVE_SIDE == power_side_of_power_sphere )
+ ok = false;
+ else
+ ok = ON_POSITIVE_SIDE == rt_.perturbed_power_side_of_power_sphere<OrientationPredicate>(p_, s, ori_);
+ }
+ else
+ {
+ typedef typename Full_cell::Vertex_handle_const_iterator VHCI;
+ typedef Substitute_point_in_vertex_iterator<VHCI> F;
+ F spivi(rt_.infinite_vertex(), &p_);
+
+ Orientation o = ori_(
+ boost::make_transform_iterator(s->vertices_begin(), spivi),
+ boost::make_transform_iterator(s->vertices_begin() + cur_dim_ + 1,
+ spivi));
+
+ if( POSITIVE == o )
+ ok = true;
+ else if( o == NEGATIVE )
+ ok = false;
+ else
+ ok = (*this)(s->neighbor( s->index( rt_.infinite_vertex() ) ));
+ }
+ return ok;
+ }
+ };
+
+ template < typename ConflictPredicate >
+ class Conflict_traversal_predicate
+ {
+ const Self & rt_;
+ const ConflictPredicate & pred_;
+ public:
+ Conflict_traversal_predicate(const Self & rt, const ConflictPredicate & pred)
+ : rt_(rt), pred_(pred)
+ {}
+ inline
+ bool operator()(const Facet & f) const
+ {
+ return pred_(rt_.full_cell(f)->neighbor(rt_.index_of_covertex(f)));
+ }
+ };
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - VALIDITY
+
+ bool is_valid(bool verbose = false, int level = 0) const;
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MISC
+
+ std::size_t number_of_hidden_vertices() const
+ {
+ return m_hidden_points.size();
+ }
+
+private:
+
+ template<typename InputIterator>
+ bool
+ does_cell_range_contain_vertex(InputIterator cz_begin, InputIterator cz_end,
+ Vertex_handle vh) const
+ {
+ // Check all vertices
+ while(cz_begin != cz_end)
+ {
+ Full_cell_handle fch = *cz_begin;
+ for (int i = 0 ; i <= current_dimension() ; ++i)
+ {
+ if (fch->vertex(i) == vh)
+ return true;
+ }
+ ++cz_begin;
+ }
+ return false;
+ }
+
+ template<typename InputIterator, typename OutputIterator>
+ void
+ process_conflict_zone(InputIterator cz_begin, InputIterator cz_end,
+ OutputIterator vertices_out) const
+ {
+ // Get all vertices
+ while(cz_begin != cz_end)
+ {
+ Full_cell_handle fch = *cz_begin;
+ for (int i = 0 ; i <= current_dimension() ; ++i)
+ {
+ Vertex_handle vh = fch->vertex(i);
+ if (vh->full_cell() != Full_cell_handle())
+ {
+ (*vertices_out++) = vh;
+ vh->set_full_cell(Full_cell_handle());
+ }
+ }
+ ++cz_begin;
+ }
+ }
+
+
+ template<typename InputIterator>
+ void
+ process_cz_vertices_after_insertion(InputIterator vertices_begin,
+ InputIterator vertices_end)
+ {
+ // Get all vertices
+ while(vertices_begin != vertices_end)
+ {
+ Vertex_handle vh = *vertices_begin;
+ if (vh->full_cell() == Full_cell_handle())
+ {
+ m_hidden_points.push_back(vh->point());
+ tds().delete_vertex(vh);
+ }
+ ++vertices_begin;
+ }
+ }
+
+private:
+ // Some internal types to shorten notation
+ using typename Base::Coaffine_orientation_d;
+ using Base::flat_orientation_;
+ typedef Conflict_predicate<Coaffine_orientation_d, Power_side_of_power_sphere_for_non_maximal_dim_d>
+ Conflict_pred_in_subspace;
+ typedef Conflict_predicate<Orientation_d, Power_side_of_power_sphere_d>
+ Conflict_pred_in_fullspace;
+ typedef Conflict_traversal_predicate<Conflict_pred_in_subspace>
+ Conflict_traversal_pred_in_subspace;
+ typedef Conflict_traversal_predicate<Conflict_pred_in_fullspace>
+ Conflict_traversal_pred_in_fullspace;
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MEMBER VARIABLES
+ std::vector<Weighted_point> m_hidden_points;
+
+}; // class Regular_triangulation
+
+
+// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
+// FUNCTIONS THAT ARE MEMBER METHODS:
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - REMOVALS
+
+
+// Warning: this function is not correct since it does not restore hidden
+// vertices
+template< typename Traits, typename TDS >
+typename Regular_triangulation<Traits, TDS>::Full_cell_handle
+Regular_triangulation<Traits, TDS>
+::remove( Vertex_handle v )
+{
+ CGAL_precondition( ! is_infinite(v) );
+ CGAL_expensive_precondition( is_vertex(v) );
+
+ // THE CASE cur_dim == 0
+ if( 0 == current_dimension() )
+ {
+ remove_decrease_dimension(v);
+ return Full_cell_handle();
+ }
+ else if( 1 == current_dimension() )
+ { // THE CASE cur_dim == 1
+ if( 2 == number_of_vertices() )
+ {
+ remove_decrease_dimension(v);
+ return Full_cell_handle();
+ }
+ Full_cell_handle left = v->full_cell();
+ if( 0 == left->index(v) )
+ left = left->neighbor(1);
+ CGAL_assertion( 1 == left->index(v) );
+ Full_cell_handle right = left->neighbor(0);
+ tds().associate_vertex_with_full_cell(left, 1, right->vertex(1));
+ set_neighbors(left, 0, right->neighbor(0), right->mirror_index(0));
+ tds().delete_vertex(v);
+ tds().delete_full_cell(right);
+ return left;
+ }
+
+ // THE CASE cur_dim >= 2
+ // Gather the finite vertices sharing an edge with |v|
+ typedef typename Base::template Full_cell_set<Full_cell_handle> Simplices;
+ Simplices simps;
+ std::back_insert_iterator<Simplices> out(simps);
+ tds().incident_full_cells(v, out);
+ typedef std::set<Vertex_handle> Vertex_set;
+ Vertex_set verts;
+ Vertex_handle vh;
+ for( typename Simplices::iterator it = simps.begin(); it != simps.end(); ++it )
+ for( int i = 0; i <= current_dimension(); ++i )
+ {
+ vh = (*it)->vertex(i);
+ if( is_infinite(vh) )
+ continue;
+ if( vh == v )
+ continue;
+ verts.insert(vh);
+ }
+
+ // After gathering finite neighboring vertices, create their Dark Delaunay triangulation
+ typedef Triangulation_vertex<Geom_traits, Vertex_handle> Dark_vertex_base;
+ typedef Triangulation_full_cell<
+ Geom_traits,
+ internal::Triangulation::Dark_full_cell_data<TDS> > Dark_full_cell_base;
+ typedef Triangulation_data_structure<Maximal_dimension,
+ Dark_vertex_base,
+ Dark_full_cell_base
+ > Dark_tds;
+ typedef Regular_triangulation<Traits, Dark_tds> Dark_triangulation;
+ typedef typename Dark_triangulation::Face Dark_face;
+ typedef typename Dark_triangulation::Facet Dark_facet;
+ typedef typename Dark_triangulation::Vertex_handle Dark_v_handle;
+ typedef typename Dark_triangulation::Full_cell_handle Dark_s_handle;
+
+ // If flat_orientation_ is defined, we give it the Dark triangulation
+ // so that the orientation it uses for "current_dimension()"-simplices is
+ // coherent with the global triangulation
+ Dark_triangulation dark_side(
+ maximal_dimension(),
+ flat_orientation_ ?
+ std::pair<int, const Flat_orientation_d *>(current_dimension(), flat_orientation_.get_ptr())
+ : std::pair<int, const Flat_orientation_d *>(std::numeric_limits<int>::max(), NULL) );
+
+ Dark_s_handle dark_s;
+ Dark_v_handle dark_v;
+ typedef std::map<Vertex_handle, Dark_v_handle> Vertex_map;
+ Vertex_map light_to_dark;
+ typename Vertex_set::iterator vit = verts.begin();
+ while( vit != verts.end() )
+ {
+ dark_v = dark_side.insert((*vit)->point(), dark_s);
+ dark_s = dark_v->full_cell();
+ dark_v->data() = *vit;
+ light_to_dark[*vit] = dark_v;
+ ++vit;
+ }
+
+ if( dark_side.current_dimension() != current_dimension() )
+ {
+ CGAL_assertion( dark_side.current_dimension() + 1 == current_dimension() );
+ // Here, the finite neighbors of |v| span a affine subspace of
+ // dimension one less than the current dimension. Two cases are possible:
+ if( (size_type)(verts.size() + 1) == number_of_vertices() )
+ {
+ remove_decrease_dimension(v);
+ return Full_cell_handle();
+ }
+ else
+ { // |v| is strictly outside the convex hull of the rest of the points. This is an
+ // easy case: first, modify the finite full_cells, then, delete the infinite ones.
+ // We don't even need the Dark triangulation.
+ Simplices infinite_simps;
+ {
+ Simplices finite_simps;
+ for( typename Simplices::iterator it = simps.begin(); it != simps.end(); ++it )
+ if( is_infinite(*it) )
+ infinite_simps.push_back(*it);
+ else
+ finite_simps.push_back(*it);
+ simps.swap(finite_simps);
+ } // now, simps only contains finite simplices
+ // First, modify the finite full_cells:
+ for( typename Simplices::iterator it = simps.begin(); it != simps.end(); ++it )
+ {
+ int v_idx = (*it)->index(v);
+ tds().associate_vertex_with_full_cell(*it, v_idx, infinite_vertex());
+ }
+ // Make the handles to infinite full cells searchable
+ infinite_simps.make_searchable();
+ // Then, modify the neighboring relation
+ for( typename Simplices::iterator it = simps.begin(); it != simps.end(); ++it )
+ {
+ for( int i = 0 ; i <= current_dimension(); ++i )
+ {
+ if (is_infinite((*it)->vertex(i)))
+ continue;
+ (*it)->vertex(i)->set_full_cell(*it);
+ Full_cell_handle n = (*it)->neighbor(i);
+ // Was |n| a finite full cell prior to removing |v| ?
+ if( ! infinite_simps.contains(n) )
+ continue;
+ int n_idx = n->index(v);
+ set_neighbors(*it, i, n->neighbor(n_idx), n->neighbor(n_idx)->index(n));
+ }
+ }
+ Full_cell_handle ret_s;
+ // Then, we delete the infinite full_cells
+ for( typename Simplices::iterator it = infinite_simps.begin(); it != infinite_simps.end(); ++it )
+ tds().delete_full_cell(*it);
+ tds().delete_vertex(v);
+ return simps.front();
+ }
+ }
+ else // From here on, dark_side.current_dimension() == current_dimension()
+ {
+ dark_side.infinite_vertex()->data() = infinite_vertex();
+ light_to_dark[infinite_vertex()] = dark_side.infinite_vertex();
+ }
+
+ // Now, compute the conflict zone of v->point() in
+ // the dark side. This is precisely the set of full_cells
+ // that we have to glue back into the light side.
+ Dark_face dark_f(dark_side.maximal_dimension());
+ Dark_facet dark_ft;
+ typename Dark_triangulation::Locate_type lt;
+ dark_s = dark_side.locate(v->point(), lt, dark_f, dark_ft);
+ CGAL_assertion( lt != Dark_triangulation::ON_VERTEX
+ && lt != Dark_triangulation::OUTSIDE_AFFINE_HULL );
+
+ // |ret_s| is the full_cell that we return
+ Dark_s_handle dark_ret_s = dark_s;
+ Full_cell_handle ret_s;
+
+ typedef typename Base::template Full_cell_set<Dark_s_handle> Dark_full_cells;
+ Dark_full_cells conflict_zone;
+ std::back_insert_iterator<Dark_full_cells> dark_out(conflict_zone);
+
+ dark_ft = dark_side.compute_conflict_zone(v->point(), dark_s, dark_out);
+ // Make the dark simplices in the conflict zone searchable
+ conflict_zone.make_searchable();
+
+ // THE FOLLOWING SHOULD MAYBE GO IN TDS.
+ // Here is the plan:
+ // 1. Pick any Facet from boundary of the light zone
+ // 2. Find corresponding Facet on boundary of dark zone
+ // 3. stitch.
+
+ // 1. Build a facet on the boudary of the light zone:
+ Full_cell_handle light_s = *simps.begin();
+ Facet light_ft(light_s, light_s->index(v));
+
+ // 2. Find corresponding Dark_facet on boundary of the dark zone
+ Dark_full_cells dark_incident_s;
+ for( int i = 0; i <= current_dimension(); ++i )
+ {
+ if( index_of_covertex(light_ft) == i )
+ continue;
+ Dark_v_handle dark_v = light_to_dark[full_cell(light_ft)->vertex(i)];
+ dark_incident_s.clear();
+ dark_out = std::back_inserter(dark_incident_s);
+ dark_side.tds().incident_full_cells(dark_v, dark_out);
+ for(typename Dark_full_cells::iterator it = dark_incident_s.begin();
+ it != dark_incident_s.end();
+ ++it)
+ {
+ (*it)->data().count_ += 1;
+ }
+ }
+
+ for( typename Dark_full_cells::iterator it = dark_incident_s.begin(); it != dark_incident_s.end(); ++it )
+ {
+ if( current_dimension() != (*it)->data().count_ )
+ continue;
+ if( ! conflict_zone.contains(*it) )
+ continue;
+ // We found a full_cell incident to the dark facet corresponding to the light facet |light_ft|
+ int ft_idx = 0;
+ while( light_s->has_vertex( (*it)->vertex(ft_idx)->data() ) )
+ ++ft_idx;
+ dark_ft = Dark_facet(*it, ft_idx);
+ break;
+ }
+ // Pre-3. Now, we are ready to traverse both boundary and do the stiching.
+
+ // But first, we create the new full_cells in the light triangulation,
+ // with as much adjacency information as possible.
+
+ // Create new full_cells with vertices
+ for( typename Dark_full_cells::iterator it = conflict_zone.begin(); it != conflict_zone.end(); ++it )
+ {
+ Full_cell_handle new_s = new_full_cell();
+ (*it)->data().light_copy_ = new_s;
+ for( int i = 0; i <= current_dimension(); ++i )
+ tds().associate_vertex_with_full_cell(new_s, i, (*it)->vertex(i)->data());
+ if( dark_ret_s == *it )
+ ret_s = new_s;
+ }
+
+ // Setup adjacencies inside the hole
+ for( typename Dark_full_cells::iterator it = conflict_zone.begin(); it != conflict_zone.end(); ++it )
+ {
+ Full_cell_handle new_s = (*it)->data().light_copy_;
+ for( int i = 0; i <= current_dimension(); ++i )
+ if( conflict_zone.contains((*it)->neighbor(i)) )
+ tds().set_neighbors(new_s, i, (*it)->neighbor(i)->data().light_copy_, (*it)->mirror_index(i));
+ }
+
+ // 3. Stitch
+ simps.make_searchable();
+ typedef std::queue<std::pair<Facet, Dark_facet> > Queue;
+ Queue q;
+ q.push(std::make_pair(light_ft, dark_ft));
+ dark_s = dark_side.full_cell(dark_ft);
+ int dark_i = dark_side.index_of_covertex(dark_ft);
+ // mark dark_ft as visited:
+ // TODO try by marking with Dark_v_handle (vertex)
+ dark_s->neighbor(dark_i)->set_neighbor(dark_s->mirror_index(dark_i), Dark_s_handle());
+ while( ! q.empty() )
+ {
+ std::pair<Facet, Dark_facet> p = q.front();
+ q.pop();
+ light_ft = p.first;
+ dark_ft = p.second;
+ light_s = full_cell(light_ft);
+ int light_i = index_of_covertex(light_ft);
+ dark_s = dark_side.full_cell(dark_ft);
+ int dark_i = dark_side.index_of_covertex(dark_ft);
+ Full_cell_handle light_n = light_s->neighbor(light_i);
+ set_neighbors(dark_s->data().light_copy_, dark_i, light_n, light_s->mirror_index(light_i));
+ for( int di = 0; di <= current_dimension(); ++di )
+ {
+ if( di == dark_i )
+ continue;
+ int li = light_s->index(dark_s->vertex(di)->data());
+ Rotor light_r(light_s, li, light_i);
+ typename Dark_triangulation::Rotor dark_r(dark_s, di, dark_i);
+
+ while( simps.contains(cpp11::get<0>(light_r)->neighbor(cpp11::get<1>(light_r))) )
+ light_r = rotate_rotor(light_r);
+
+ while( conflict_zone.contains(cpp11::get<0>(dark_r)->neighbor(cpp11::get<1>(dark_r))) )
+ dark_r = dark_side.rotate_rotor(dark_r);
+
+ Dark_s_handle dark_ns = cpp11::get<0>(dark_r);
+ int dark_ni = cpp11::get<1>(dark_r);
+ Full_cell_handle light_ns = cpp11::get<0>(light_r);
+ int light_ni = cpp11::get<1>(light_r);
+ // mark dark_r as visited:
+ // TODO try by marking with Dark_v_handle (vertex)
+ Dark_s_handle outside = dark_ns->neighbor(dark_ni);
+ Dark_v_handle mirror = dark_ns->mirror_vertex(dark_ni, current_dimension());
+ int dn = outside->index(mirror);
+ if( Dark_s_handle() == outside->neighbor(dn) )
+ continue;
+ outside->set_neighbor(dn, Dark_s_handle());
+ q.push(std::make_pair(Facet(light_ns, light_ni), Dark_facet(dark_ns, dark_ni)));
+ }
+ }
+ tds().delete_full_cells(simps.begin(), simps.end());
+ tds().delete_vertex(v);
+ return ret_s;
+}
+
+template< typename Traits, typename TDS >
+void
+Regular_triangulation<Traits, TDS>
+::remove_decrease_dimension(Vertex_handle v)
+{
+ CGAL_precondition( current_dimension() >= 0 );
+ tds().remove_decrease_dimension(v, infinite_vertex());
+ // reset the predicates:
+ reset_flat_orientation();
+ if( 1 <= current_dimension() )
+ {
+ Full_cell_handle inf_v_cell = infinite_vertex()->full_cell();
+ int inf_v_index = inf_v_cell->index(infinite_vertex());
+ Full_cell_handle s = inf_v_cell->neighbor(inf_v_index);
+ Orientation o = orientation(s);
+ CGAL_assertion( ZERO != o );
+ if( NEGATIVE == o )
+ reorient_full_cells();
+ }
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - INSERTIONS
+
+template< typename Traits, typename TDS >
+typename Regular_triangulation<Traits, TDS>::Vertex_handle
+Regular_triangulation<Traits, TDS>
+::insert(const Weighted_point & p, Locate_type lt, const Face & f, const Facet & ft, Full_cell_handle s)
+{
+ switch( lt )
+ {
+ case Base::OUTSIDE_AFFINE_HULL:
+ return insert_outside_affine_hull(p);
+ break;
+ case Base::ON_VERTEX:
+ {
+ Vertex_handle v = s->vertex(f.index(0));
+ typename RTTraits::Compute_weight_d pw =
+ geom_traits().compute_weight_d_object();
+
+ if (pw(p) == pw(v->point()))
+ return v;
+ // If dim == 0 and the new point has a bigger weight,
+ // we just replace the point, and the former point gets hidden
+ else if (current_dimension() == 0)
+ {
+ if (pw(p) > pw(v->point()))
+ {
+ m_hidden_points.push_back(v->point());
+ v->set_point(p);
+ return v;
+ }
+ // Otherwise, the new point is hidden
+ else
+ {
+ m_hidden_points.push_back(p);
+ return Vertex_handle();
+ }
+ }
+ // Otherwise, we apply the "normal" algorithm
+
+ // !NO break here!
+ }
+ default:
+ return insert_in_conflicting_cell(p, s);
+ }
+}
+
+/*
+Inserts the point `p` in the regular triangulation. Returns a handle to the
+newly created vertex at that position.
+\pre The point `p`
+must lie outside the affine hull of the regular triangulation. This implies that
+`rt`.`current_dimension()` must be smaller than `rt`.`maximal_dimension()`.
+*/
+template< typename Traits, typename TDS >
+typename Regular_triangulation<Traits, TDS>::Vertex_handle
+Regular_triangulation<Traits, TDS>
+::insert_outside_affine_hull(const Weighted_point & p)
+{
+ // we don't use Base::insert_outside_affine_hull(...) because here, we
+ // also need to reset the side_of_oriented_subsphere functor.
+ CGAL_precondition( current_dimension() < maximal_dimension() );
+ Vertex_handle v = tds().insert_increase_dimension(infinite_vertex());
+ // reset the predicates:
+ reset_flat_orientation();
+ v->set_point(p);
+ if( current_dimension() >= 1 )
+ {
+ Full_cell_handle inf_v_cell = infinite_vertex()->full_cell();
+ int inf_v_index = inf_v_cell->index(infinite_vertex());
+ Full_cell_handle s = inf_v_cell->neighbor(inf_v_index);
+ Orientation o = orientation(s);
+ CGAL_assertion( ZERO != o );
+ if( NEGATIVE == o )
+ reorient_full_cells();
+
+ // We just inserted the second finite point and the right infinite
+ // cell is like : (inf_v, v), but we want it to be (v, inf_v) to be
+ // consistent with the rest of the cells
+ if (current_dimension() == 1)
+ {
+ // Is "inf_v_cell" the right infinite cell? Then inf_v_index should be 1
+ if (inf_v_cell->neighbor(inf_v_index)->index(inf_v_cell) == 0
+ && inf_v_index == 0)
+ {
+ inf_v_cell->swap_vertices(current_dimension() - 1, current_dimension());
+ }
+ else
+ {
+ inf_v_cell = inf_v_cell->neighbor((inf_v_index + 1) % 2);
+ inf_v_index = inf_v_cell->index(infinite_vertex());
+ // Is "inf_v_cell" the right infinite cell? Then inf_v_index should be 1
+ if (inf_v_cell->neighbor(inf_v_index)->index(inf_v_cell) == 0
+ && inf_v_index == 0)
+ {
+ inf_v_cell->swap_vertices(current_dimension() - 1, current_dimension());
+ }
+ }
+ }
+ }
+ return v;
+}
+
+template< typename Traits, typename TDS >
+typename Regular_triangulation<Traits, TDS>::Vertex_handle
+Regular_triangulation<Traits, TDS>
+::insert_if_in_star(const Weighted_point & p,
+ Vertex_handle star_center,
+ Locate_type lt,
+ const Face & f,
+ const Facet & ft,
+ Full_cell_handle s)
+{
+ switch( lt )
+ {
+ case Base::OUTSIDE_AFFINE_HULL:
+ return insert_outside_affine_hull(p);
+ break;
+ case Base::ON_VERTEX:
+ {
+ Vertex_handle v = s->vertex(f.index(0));
+ typename RTTraits::Compute_weight_d pw =
+ geom_traits().compute_weight_d_object();
+ if (pw(p) == pw(v->point()))
+ return v;
+ // If dim == 0 and the new point has a bigger weight,
+ // we replace the point
+ else if (current_dimension() == 0)
+ {
+ if (pw(p) > pw(v->point()))
+ v->set_point(p);
+ else
+ return v;
+ }
+ // Otherwise, we apply the "normal" algorithm
+
+ // !NO break here!
+ }
+ default:
+ return insert_in_conflicting_cell(p, s, star_center);
+ }
+
+ return Vertex_handle();
+}
+
+/*
+[Undocumented function]
+
+Inserts the point `p` in the regular triangulation. `p` must be
+in conflict with the second parameter `c`, which is used as a
+starting point for `compute_conflict_zone`.
+The function is faster than the standard `insert` function since
+it does not need to call `locate`.
+
+If this insertion creates a vertex, this vertex is returned.
+
+If `p` coincides with an existing vertex and has a greater weight,
+then the existing weighted point becomes hidden and `p` replaces it as vertex
+of the triangulation.
+
+If `p` coincides with an already existing vertex (both point and
+weights being equal), then this vertex is returned and the triangulation
+remains unchanged.
+
+Otherwise if `p` does not appear as a vertex of the triangulation,
+then it is stored as a hidden point and this method returns the default
+constructed handle.
+
+\pre The point `p` must be in conflict with the full cell `c`.
+*/
+
+template< typename Traits, typename TDS >
+typename Regular_triangulation<Traits, TDS>::Vertex_handle
+Regular_triangulation<Traits, TDS>
+::insert_in_conflicting_cell(const Weighted_point & p,
+ Full_cell_handle s,
+ Vertex_handle only_if_this_vertex_is_in_the_cz)
+{
+ typedef std::vector<Full_cell_handle> Full_cell_h_vector;
+
+ bool in_conflict = is_in_conflict(p, s);
+
+ // If p is not in conflict with s, then p is hidden
+ // => we don't insert it
+ if (!in_conflict)
+ {
+ m_hidden_points.push_back(p);
+ return Vertex_handle();
+ }
+ else
+ {
+ Full_cell_h_vector cs; // for storing conflicting full_cells.
+ cs.reserve(64);
+ std::back_insert_iterator<Full_cell_h_vector> out(cs);
+ Facet ft = compute_conflict_zone(p, s, out);
+
+ // Check if the CZ contains "only_if_this_vertex_is_in_the_cz"
+ if (only_if_this_vertex_is_in_the_cz != Vertex_handle()
+ && !does_cell_range_contain_vertex(cs.begin(), cs.end(),
+ only_if_this_vertex_is_in_the_cz))
+ {
+ return Vertex_handle();
+ }
+
+ // Otherwise, proceed with the insertion
+ std::vector<Vertex_handle> cz_vertices;
+ cz_vertices.reserve(64);
+ process_conflict_zone(cs.begin(), cs.end(),
+ std::back_inserter(cz_vertices));
+
+ Vertex_handle ret = insert_in_hole(p, cs.begin(), cs.end(), ft);
+
+ process_cz_vertices_after_insertion(cz_vertices.begin(), cz_vertices.end());
+
+ return ret;
+ }
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GATHERING CONFLICTING SIMPLICES
+
+// NOT DOCUMENTED
+template< typename Traits, typename TDS >
+template< typename OrientationPred >
+Oriented_side
+Regular_triangulation<Traits, TDS>
+::perturbed_power_side_of_power_sphere(const Weighted_point & p, Full_cell_const_handle s,
+ const OrientationPred & ori) const
+{
+ CGAL_precondition_msg( ! is_infinite(s), "full cell must be finite");
+ CGAL_expensive_precondition( POSITIVE == orientation(s) );
+ typedef std::vector<const Weighted_point *> Points;
+ Points points(current_dimension() + 2);
+ int i(0);
+ for( ; i <= current_dimension(); ++i )
+ points[i] = &(s->vertex(i)->point());
+ points[i] = &p;
+ std::sort(points.begin(), points.end(),
+ internal::Triangulation::Compare_points_for_perturbation<Self>(*this));
+ typename Points::const_reverse_iterator cut_pt = points.rbegin();
+ Points test_points;
+ while( cut_pt != points.rend() )
+ {
+ if( &p == *cut_pt )
+ // because the full_cell "s" is assumed to be positively oriented
+ return ON_NEGATIVE_SIDE; // we consider |p| to lie outside the sphere
+ test_points.clear();
+ Point_const_iterator spit = points_begin(s);
+ int adjust_sign = -1;
+ for( i = 0; i < current_dimension(); ++i )
+ {
+ if( &(*spit) == *cut_pt )
+ {
+ ++spit;
+ adjust_sign = (((current_dimension() + i) % 2) == 0) ? -1 : +1;
+ }
+ test_points.push_back(&(*spit));
+ ++spit;
+ }
+ test_points.push_back(&p);
+
+ typedef typename CGAL::Iterator_project<
+ typename Points::iterator,
+ internal::Triangulation::Point_from_pointer<Self>,
+ const Weighted_point &, const Weighted_point *
+ > Point_pointer_iterator;
+
+ Orientation ori_value = ori(
+ Point_pointer_iterator(test_points.begin()),
+ Point_pointer_iterator(test_points.end()));
+
+ if( ZERO != ori_value )
+ return Oriented_side( - adjust_sign * ori_value );
+
+ ++cut_pt;
+ }
+ CGAL_assertion(false); // we should never reach here
+ return ON_NEGATIVE_SIDE;
+}
+
+template< typename Traits, typename TDS >
+bool
+Regular_triangulation<Traits, TDS>
+::is_in_conflict(const Weighted_point & p, Full_cell_const_handle s) const
+{
+ CGAL_precondition( 1 <= current_dimension() );
+ if( current_dimension() < maximal_dimension() )
+ {
+ Conflict_pred_in_subspace c(
+ *this, p,
+ coaffine_orientation_predicate(),
+ power_side_of_power_sphere_for_non_maximal_dim_predicate());
+ return c(s);
+ }
+ else
+ {
+ Orientation_d ori = geom_traits().orientation_d_object();
+ Power_side_of_power_sphere_d side = geom_traits().power_side_of_power_sphere_d_object();
+ Conflict_pred_in_fullspace c(*this, p, ori, side);
+ return c(s);
+ }
+}
+
+template< typename Traits, typename TDS >
+template< typename OutputIterator >
+typename Regular_triangulation<Traits, TDS>::Facet
+Regular_triangulation<Traits, TDS>
+::compute_conflict_zone(const Weighted_point & p, Full_cell_handle s, OutputIterator out) const
+{
+ CGAL_precondition( 1 <= current_dimension() );
+ if( current_dimension() < maximal_dimension() )
+ {
+ Conflict_pred_in_subspace c(
+ *this, p,
+ coaffine_orientation_predicate(),
+ power_side_of_power_sphere_for_non_maximal_dim_predicate());
+ Conflict_traversal_pred_in_subspace tp(*this, c);
+ return tds().gather_full_cells(s, tp, out);
+ }
+ else
+ {
+ Orientation_d ori = geom_traits().orientation_d_object();
+ Power_side_of_power_sphere_d side = geom_traits().power_side_of_power_sphere_d_object();
+ Conflict_pred_in_fullspace c(*this, p, ori, side);
+ Conflict_traversal_pred_in_fullspace tp(*this, c);
+ return tds().gather_full_cells(s, tp, out);
+ }
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - VALIDITY
+
+template< typename Traits, typename TDS >
+bool
+Regular_triangulation<Traits, TDS>
+::is_valid(bool verbose, int level) const
+{
+ if (!Base::is_valid(verbose, level))
+ return false;
+
+ int dim = current_dimension();
+ if (dim == maximal_dimension())
+ {
+ for (Finite_full_cell_const_iterator cit = finite_full_cells_begin() ;
+ cit != finite_full_cells_end() ; ++cit )
+ {
+ Full_cell_const_handle ch = cit.base();
+ for(int i = 0; i < dim+1 ; ++i )
+ {
+ // If the i-th neighbor is not an infinite cell
+ Vertex_handle opposite_vh =
+ ch->neighbor(i)->vertex(ch->neighbor(i)->index(ch));
+ if (!is_infinite(opposite_vh))
+ {
+ Power_side_of_power_sphere_d side =
+ geom_traits().power_side_of_power_sphere_d_object();
+ if (side(Point_const_iterator(ch->vertices_begin()),
+ Point_const_iterator(ch->vertices_end()),
+ opposite_vh->point()) == ON_POSITIVE_SIDE)
+ {
+ if (verbose)
+ CGAL_warning_msg(false, "Non-empty sphere");
+ return false;
+ }
+ }
+ }
+ }
+ }
+ return true;
+}
+
+} //namespace CGAL
+
+#endif //CGAL_REGULAR_TRIANGULATION_H
diff --git a/include/gudhi_patches/CGAL/Regular_triangulation_traits_adapter.h b/include/gudhi_patches/CGAL/Regular_triangulation_traits_adapter.h
new file mode 100644
index 00000000..78bb95a6
--- /dev/null
+++ b/include/gudhi_patches/CGAL/Regular_triangulation_traits_adapter.h
@@ -0,0 +1,288 @@
+// Copyright (c) 2014 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Clement Jamin
+
+#ifndef CGAL_REGULAR_TRIANGULATION_TRAITS_ADAPTER_H
+#define CGAL_REGULAR_TRIANGULATION_TRAITS_ADAPTER_H
+
+#include <CGAL/basic.h>
+
+#include <boost/iterator/transform_iterator.hpp>
+
+namespace CGAL {
+
+// Wrapper class to make a model of `RegularTriangulationTraits` easily usable
+// by the `Regular_triangulation` class. By using this class:
+// - Point_d (used by `Triangulation` and the TDS) becomes a weighted point
+// - Predicates and functors such as Less_coordinate_d or Orientation_d
+// can be called using weighted points instead of bare points (this is
+// needed because `Weighted_point_d` is not convertible to `Point_d`)
+// This way, `Triangulation` works perfectly well with weighted points.
+
+template <class K>
+class Regular_triangulation_traits_adapter
+ : public K
+{
+public:
+ typedef K Base;
+
+ // Required by TriangulationTraits
+ typedef typename K::Dimension Dimension;
+ typedef typename K::FT FT;
+ typedef typename K::Flat_orientation_d Flat_orientation_d;
+ typedef typename K::Weighted_point_d Point_d;
+
+ // Required by RegularTriangulationTraits
+ typedef typename K::Point_d Bare_point_d;
+ typedef typename K::Weighted_point_d Weighted_point_d;
+ typedef typename K::Construct_point_d Construct_point_d;
+ typedef typename K::Compute_weight_d Compute_weight_d;
+ typedef typename K::Power_side_of_power_sphere_d Power_side_of_power_sphere_d;
+ typedef typename K::In_flat_power_side_of_power_sphere_d
+ In_flat_power_side_of_power_sphere_d;
+
+ //===========================================================================
+ // Custom types
+ //===========================================================================
+
+ // Required by SpatialSortingTraits_d
+ class Less_coordinate_d
+ {
+ const K &m_kernel;
+
+ public:
+ typedef bool result_type;
+
+ Less_coordinate_d(const K &kernel)
+ : m_kernel(kernel) {}
+
+ result_type operator()(
+ Weighted_point_d const& p, Weighted_point_d const& q, int i) const
+ {
+ Construct_point_d cp = m_kernel.construct_point_d_object();
+ return m_kernel.less_coordinate_d_object() (cp(p), cp(q), i);
+ }
+ };
+
+ //===========================================================================
+
+ // Required by TriangulationTraits
+ class Orientation_d
+ {
+ const K &m_kernel;
+
+ public:
+ typedef Orientation result_type;
+
+ Orientation_d(const K &kernel)
+ : m_kernel(kernel) {}
+
+ template <typename ForwardIterator>
+ result_type operator()(ForwardIterator start, ForwardIterator end) const
+ {
+ Construct_point_d cp = m_kernel.construct_point_d_object();
+ return m_kernel.orientation_d_object() (
+ boost::make_transform_iterator(start, cp),
+ boost::make_transform_iterator(end, cp)
+ );
+ }
+ };
+
+ //===========================================================================
+
+ // Required by TriangulationTraits
+ class Construct_flat_orientation_d
+ {
+ const K &m_kernel;
+
+ public:
+ typedef Flat_orientation_d result_type;
+
+ Construct_flat_orientation_d(const K &kernel)
+ : m_kernel(kernel) {}
+
+ template <typename ForwardIterator>
+ result_type operator()(ForwardIterator start, ForwardIterator end) const
+ {
+ Construct_point_d cp = m_kernel.construct_point_d_object();
+ return m_kernel.construct_flat_orientation_d_object() (
+ boost::make_transform_iterator(start, cp),
+ boost::make_transform_iterator(end, cp)
+ );
+ }
+ };
+
+
+ //===========================================================================
+
+ // Required by TriangulationTraits
+ class In_flat_orientation_d
+ {
+ const K &m_kernel;
+
+ public:
+ typedef Orientation result_type;
+
+ In_flat_orientation_d(const K &kernel)
+ : m_kernel(kernel) {}
+
+ template <typename ForwardIterator>
+ result_type operator()(Flat_orientation_d orient,
+ ForwardIterator start, ForwardIterator end) const
+ {
+ Construct_point_d cp = m_kernel.construct_point_d_object();
+ return m_kernel.in_flat_orientation_d_object() (
+ orient,
+ boost::make_transform_iterator(start, cp),
+ boost::make_transform_iterator(end, cp)
+ );
+ }
+ };
+
+ //===========================================================================
+
+ // Required by TriangulationTraits
+ class Contained_in_affine_hull_d
+ {
+ const K &m_kernel;
+
+ public:
+ typedef bool result_type;
+
+ Contained_in_affine_hull_d(const K &kernel)
+ : m_kernel(kernel) {}
+
+ template <typename ForwardIterator>
+ result_type operator()(ForwardIterator start, ForwardIterator end,
+ const Weighted_point_d & p) const
+ {
+ Construct_point_d cp = m_kernel.construct_point_d_object();
+ return m_kernel.contained_in_affine_hull_d_object() (
+ boost::make_transform_iterator(start, cp),
+ boost::make_transform_iterator(end, cp),
+ cp(p)
+ );
+ }
+ };
+
+ //===========================================================================
+
+ // Required by TriangulationTraits
+ class Compare_lexicographically_d
+ {
+ const K &m_kernel;
+
+ public:
+ typedef Comparison_result result_type;
+
+ Compare_lexicographically_d(const K &kernel)
+ : m_kernel(kernel) {}
+
+ result_type operator()(
+ const Weighted_point_d & p, const Weighted_point_d & q) const
+ {
+ Construct_point_d cp = m_kernel.construct_point_d_object();
+ return m_kernel.compare_lexicographically_d_object()(cp(p), cp(q));
+ }
+ };
+
+ //===========================================================================
+
+ // Only for Triangulation_off_ostream.h (undocumented)
+ class Compute_coordinate_d
+ {
+ const K &m_kernel;
+
+ public:
+ typedef FT result_type;
+
+ Compute_coordinate_d(const K &kernel)
+ : m_kernel(kernel) {}
+
+ result_type operator()(
+ const Weighted_point_d & p, const int i) const
+ {
+ Construct_point_d cp = m_kernel.construct_point_d_object();
+ return m_kernel.compute_coordinate_d_object()(cp(p), i);
+ }
+ };
+
+ //===========================================================================
+
+ // To satisfy SpatialSortingTraits_d
+ // and also for Triangulation_off_ostream.h (undocumented)
+ class Point_dimension_d
+ {
+ const K &m_kernel;
+
+ public:
+ typedef int result_type;
+
+ Point_dimension_d(const K &kernel)
+ : m_kernel(kernel) {}
+
+ result_type operator()(
+ const Weighted_point_d & p) const
+ {
+ Construct_point_d cp = m_kernel.construct_point_d_object();
+ return m_kernel.point_dimension_d_object()(cp(p));
+ }
+ };
+
+ //===========================================================================
+ // Object creation
+ //===========================================================================
+
+ Less_coordinate_d less_coordinate_d_object() const
+ {
+ return Less_coordinate_d(*this);
+ }
+ Contained_in_affine_hull_d contained_in_affine_hull_d_object() const
+ {
+ return Contained_in_affine_hull_d(*this);
+ }
+ Orientation_d orientation_d_object() const
+ {
+ return Orientation_d(*this);
+ }
+ Construct_flat_orientation_d construct_flat_orientation_d_object() const
+ {
+ return Construct_flat_orientation_d(*this);
+ }
+ In_flat_orientation_d in_flat_orientation_d_object() const
+ {
+ return In_flat_orientation_d(*this);
+ }
+ Compare_lexicographically_d compare_lexicographically_d_object() const
+ {
+ return Compare_lexicographically_d(*this);
+ }
+ Compute_coordinate_d compute_coordinate_d_object() const
+ {
+ return Compute_coordinate_d(*this);
+ }
+ Point_dimension_d point_dimension_d_object() const
+ {
+ return Point_dimension_d(*this);
+ }
+};
+
+
+} //namespace CGAL
+
+#endif // CGAL_REGULAR_TRIANGULATION_TRAITS_ADAPTER_H
diff --git a/include/gudhi_patches/CGAL/TDS_full_cell_default_storage_policy.h b/include/gudhi_patches/CGAL/TDS_full_cell_default_storage_policy.h
new file mode 100644
index 00000000..9a6030e5
--- /dev/null
+++ b/include/gudhi_patches/CGAL/TDS_full_cell_default_storage_policy.h
@@ -0,0 +1,99 @@
+// Copyright (c) 2009-2014 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Samuel Hornus
+
+#ifndef CGAL_TDS_FULL_CELL_DEFAULT_STORAGE_POLICY_H
+#define CGAL_TDS_FULL_CELL_DEFAULT_STORAGE_POLICY_H
+
+#include <CGAL/Dimension.h>
+#include <CGAL/Compact_container.h>
+#include <CGAL/internal/Static_or_dynamic_array.h>
+
+#include <boost/cstdint.hpp>
+
+namespace CGAL {
+
+// POLICY TAG
+
+struct TDS_full_cell_default_storage_policy {}; // stores no additional data. Uses XOR trick.
+
+template< typename V, typename S, typename D, typename StoragePolicy >
+struct TFC_data; // TFC = Triangulation Full Cell
+
+template< typename Vertex_handle, typename Full_cell_handle, typename Dimen >
+struct TFC_data< Vertex_handle, Full_cell_handle, Dimen, TDS_full_cell_default_storage_policy >
+{
+ typedef typename internal::Dimen_plus_one<Dimen>::type Dimen_plus;
+ typedef typename internal::S_or_D_array< Vertex_handle, Dimen_plus, true > Vertex_handle_array;
+ typedef typename internal::S_or_D_array< Full_cell_handle, Dimen_plus > Full_cell_handle_array;
+
+ Vertex_handle_array vertices_;
+ Full_cell_handle_array neighbors_;
+
+ TFC_data(const int dmax)
+ : vertices_(dmax+1), neighbors_(dmax+1)
+ {}
+ void* for_compact_container() const { return vertices_.for_compact_container(); }
+ void* & for_compact_container() { return vertices_.for_compact_container(); }
+ int dimension() const { return ( vertices_.size() - 1 ); }
+ void set_mirror_index(const int, const int) {}
+#ifdef BOOST_NO_INT64_T
+ typedef std::ptrdiff_t Xor_type;
+#else
+ typedef boost::int_least64_t Xor_type;
+#endif
+ Xor_type xor_of_vertices(const int cur_dim) const
+ {
+ Xor_type result(0);
+ for( int i = 0; i <= cur_dim; ++i )
+ result ^= reinterpret_cast<Xor_type>(&(*vertices_[i]));
+ return result;
+ }
+ // ASSUMES |*this| is indeed a neighbor of neighbor(i):
+ // NOT correct when the hole (in insert_in_hole) is doubly covered.
+ int mirror_index(const int i) const
+ {
+ int index = 0;
+ Full_cell_handle n = neighbors_[i];
+ Full_cell_handle o = n->neighbor(index);
+ while( &(o->combinatorics_) != this )
+ o = n->neighbor(++index);
+ return index;
+ }
+ Vertex_handle mirror_vertex(const int i, const int cur_dim) const
+ {
+ Xor_type opp_vertex = xor_of_vertices(cur_dim)
+ ^ neighbors_[i]->xor_of_vertices(cur_dim)
+ ^ reinterpret_cast<Xor_type>(&(*vertices_[i]));
+ Vertex_handle mirror;
+ typedef typename Vertex_handle::pointer pointer;
+ // mirror.set_pointer(reinterpret_cast<pointer>(opp_vertex));
+ mirror = Compact_container<typename Vertex_handle::value_type>
+ ::s_iterator_to(*(reinterpret_cast<pointer>(opp_vertex)));
+ return mirror;
+ }
+ void swap_vertices(const int d1, const int d2)
+ {
+ std::swap(vertices_[d1], vertices_[d2]);
+ std::swap(neighbors_[d1], neighbors_[d2]);
+ }
+};
+
+} //namespace CGAL
+
+#endif // CGAL_TDS_FULL_CELL_DEFAULT_STORAGE_POLICY_H
diff --git a/include/gudhi_patches/CGAL/TDS_full_cell_mirror_storage_policy.h b/include/gudhi_patches/CGAL/TDS_full_cell_mirror_storage_policy.h
new file mode 100644
index 00000000..095dfe68
--- /dev/null
+++ b/include/gudhi_patches/CGAL/TDS_full_cell_mirror_storage_policy.h
@@ -0,0 +1,71 @@
+// Copyright (c) 2009-2014 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Samuel Hornus
+
+#ifndef CGAL_TDS_FULL_CELL_MIRROR_STORAGE_POLICY_H
+#define CGAL_TDS_FULL_CELL_MIRROR_STORAGE_POLICY_H
+
+#include <CGAL/TDS_full_cell_default_storage_policy.h>
+
+namespace CGAL {
+
+// POLICY TAGS
+
+struct TDS_full_cell_mirror_storage_policy {}; // Stores the mirror index of all vertices.
+
+template< typename Vertex_handle, typename Full_cell_handle, typename Maximal_dimension >
+struct TFC_data< Vertex_handle, Full_cell_handle, Maximal_dimension, TDS_full_cell_mirror_storage_policy >
+: public TFC_data< Vertex_handle, Full_cell_handle, Maximal_dimension, TDS_full_cell_default_storage_policy >
+{
+ typedef TFC_data< Vertex_handle, Full_cell_handle, Maximal_dimension, TDS_full_cell_default_storage_policy > Base;
+ typedef typename Base::Vertex_handle_array Vertex_handle_array;
+ typedef typename Base::Full_cell_handle_array Full_cell_handle_array;
+ typedef typename internal::S_or_D_array< int, typename Base::Dimen_plus > Int_array;
+
+private:
+ Int_array mirror_vertices_;
+
+public:
+ TFC_data(const int dmax)
+ : Base(dmax), mirror_vertices_(dmax+1)
+ {}
+
+ void set_mirror_index(const int i, const int index)
+ {
+ mirror_vertices_[i] = index;
+ }
+ int mirror_index(const int i) const
+ {
+ return mirror_vertices_[i];
+ }
+ Vertex_handle mirror_vertex(const int i, const int) const
+ {
+ return Base::neighbors_[i]->vertex(mirror_index(i));
+ }
+ void swap_vertices(const int d1, const int d2)
+ {
+ Base::swap_vertices(d1, d2);
+ std::swap(mirror_vertices_[d1], mirror_vertices_[d2]);
+ Base::neighbors_[d1]->set_mirror_index(mirror_vertices_[d1], d1);
+ Base::neighbors_[d2]->set_mirror_index(mirror_vertices_[d2], d2);
+ }
+};
+
+} //namespace CGAL
+
+#endif // CGAL_TDS_FULL_CELL_MIRROR_STORAGE_POLICY_H
diff --git a/include/gudhi_patches/CGAL/Triangulation.h b/include/gudhi_patches/CGAL/Triangulation.h
new file mode 100644
index 00000000..906df92e
--- /dev/null
+++ b/include/gudhi_patches/CGAL/Triangulation.h
@@ -0,0 +1,1424 @@
+// Copyright (c) 2009-2014 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Samuel Hornus
+
+#ifndef CGAL_TRIANGULATION_H
+#define CGAL_TRIANGULATION_H
+
+#include <CGAL/internal/Triangulation/utilities.h>
+#include <CGAL/Triangulation_data_structure.h>
+#include <CGAL/Triangulation_full_cell.h>
+#include <CGAL/Triangulation_vertex.h>
+#include <CGAL/Iterator_project.h>
+#include <CGAL/spatial_sort.h>
+#include <CGAL/Dimension.h>
+#include <CGAL/iterator.h>
+#include <CGAL/Default.h>
+#include <CGAL/Random.h>
+
+#include <boost/iterator/filter_iterator.hpp>
+#include <boost/iterator/transform_iterator.hpp>
+
+namespace CGAL {
+
+// Iterator which iterates over vertex_handle's, but returns a point when
+// dereferenced. If the current
+// vertex_handle vh == vh_where_point_should_be_substituted, it returns
+// "subtitute_point", otherwise, it returns vh->point()
+template<class VertexHandleConstIter>
+class Substitute_point_in_vertex_iterator
+{
+ typedef typename std::iterator_traits<VertexHandleConstIter>::value_type Vertex_handle;
+ typedef typename Vertex_handle::value_type Vertex;
+ typedef typename Vertex::Point Point;
+
+public:
+ typedef Point const& result_type; // For result_of
+
+ Substitute_point_in_vertex_iterator(
+ Vertex_handle vh_where_point_should_be_substituted,
+ Point const *subtitute_point)
+ : vh_where_point_should_be_substituted_(vh_where_point_should_be_substituted)
+ , subtitute_point_(subtitute_point)
+ {}
+
+ result_type operator()(Vertex_handle vh) const
+ {
+ if (vh == vh_where_point_should_be_substituted_)
+ return *subtitute_point_;
+ else
+ return vh->point();
+ }
+
+private:
+ Vertex_handle vh_where_point_should_be_substituted_;
+ Point const *subtitute_point_;
+
+};
+
+
+template < class TriangulationTraits, class TDS_ = Default >
+class Triangulation
+{
+ typedef typename TriangulationTraits::Dimension Maximal_dimension_;
+ typedef typename Default::Get<TDS_, Triangulation_data_structure
+ < Maximal_dimension_,
+ Triangulation_vertex<TriangulationTraits>,
+ Triangulation_full_cell<TriangulationTraits> >
+ >::type TDS;
+ typedef Triangulation<TriangulationTraits, TDS_> Self;
+
+protected:
+ typedef typename TriangulationTraits::Flat_orientation_d Flat_orientation_d;
+ typedef typename TriangulationTraits::Construct_flat_orientation_d Construct_flat_orientation_d;
+ typedef typename TriangulationTraits::In_flat_orientation_d In_flat_orientation_d;
+
+ // Wrapper
+ struct Coaffine_orientation_d
+ {
+ boost::optional<Flat_orientation_d>* fop;
+ Construct_flat_orientation_d cfo;
+ In_flat_orientation_d ifo;
+
+ Coaffine_orientation_d(
+ boost::optional<Flat_orientation_d>& x,
+ Construct_flat_orientation_d const&y,
+ In_flat_orientation_d const&z)
+ : fop(&x), cfo(y), ifo(z) {}
+
+ template<class Iter>
+ CGAL::Orientation operator()(Iter a, Iter b) const
+ {
+ if (*fop)
+ return ifo(fop->get(),a,b);
+ *fop = cfo(a,b);
+ CGAL_assertion(ifo(fop->get(),a,b) == CGAL::POSITIVE);
+ return CGAL::POSITIVE;
+ }
+ };
+
+ void reset_flat_orientation()
+ {
+ if (current_dimension() == preset_flat_orientation_.first)
+ {
+ CGAL_assertion(preset_flat_orientation_.second != NULL);
+ flat_orientation_ = *preset_flat_orientation_.second;
+ }
+ else
+ flat_orientation_ = boost::none;
+ }
+
+ typedef typename TriangulationTraits::Orientation_d
+ Orientation_d;
+
+public:
+
+ typedef TriangulationTraits Geom_traits;
+ typedef TDS Triangulation_ds;
+
+ typedef typename TDS::Vertex Vertex;
+ typedef typename TDS::Full_cell Full_cell;
+ typedef typename TDS::Facet Facet;
+ typedef typename TDS::Face Face;
+
+ typedef Maximal_dimension_ Maximal_dimension;
+ typedef typename Geom_traits::Point_d Point;
+
+ typedef typename TDS::Vertex_handle Vertex_handle;
+ typedef typename TDS::Vertex_iterator Vertex_iterator;
+ typedef typename TDS::Vertex_const_handle Vertex_const_handle;
+ typedef typename TDS::Vertex_const_iterator Vertex_const_iterator;
+
+ typedef typename TDS::Full_cell_handle Full_cell_handle;
+ typedef typename TDS::Full_cell_iterator Full_cell_iterator;
+ typedef typename TDS::Full_cell_const_handle Full_cell_const_handle;
+ typedef typename TDS::Full_cell_const_iterator Full_cell_const_iterator;
+
+ typedef typename TDS::Facet_iterator Facet_iterator;
+
+ typedef typename TDS::size_type size_type;
+ typedef typename TDS::difference_type difference_type;
+
+ /// The type of location a new point is found lying on
+ enum Locate_type
+ {
+ ON_VERTEX = 0 // simplex of dimension 0
+ , IN_FACE = 1 // simplex of dimension in [ 1, |current_dimension()| - 2 ]
+ , IN_FACET = 2 // simplex of dimension |current_dimension()| - 1
+ , IN_FULL_CELL = 3 /// simplex of dimension |current_dimension()|
+ , OUTSIDE_CONVEX_HULL = 4
+ , OUTSIDE_AFFINE_HULL = 5
+ };
+
+ // Finite elements iterators
+
+ class Finiteness_predicate;
+
+ typedef boost::filter_iterator<Finiteness_predicate, Vertex_iterator>
+ Finite_vertex_iterator;
+ typedef boost::filter_iterator<Finiteness_predicate, Vertex_const_iterator>
+ Finite_vertex_const_iterator;
+ typedef boost::filter_iterator<Finiteness_predicate, Full_cell_iterator>
+ Finite_full_cell_iterator;
+ typedef boost::filter_iterator<Finiteness_predicate, Full_cell_const_iterator>
+ Finite_full_cell_const_iterator;
+ typedef boost::filter_iterator<Finiteness_predicate, Facet_iterator>
+ Finite_facet_iterator;
+
+protected: // DATA MEMBERS
+
+ Triangulation_ds tds_;
+ const Geom_traits kernel_;
+ Vertex_handle infinity_;
+ mutable std::vector<Oriented_side> orientations_;
+ mutable boost::optional<Flat_orientation_d> flat_orientation_;
+ // The user can specify a Flat_orientation_d object to be used for
+ // orienting simplices of a specific dimension
+ // (= preset_flat_orientation_.first)
+ // preset_flat_orientation_.first = numeric_limits<int>::max() otherwise)
+ std::pair<int, const Flat_orientation_d *> preset_flat_orientation_;
+ // for stochastic walk in the locate() function:
+ mutable Random rng_;
+#ifdef CGAL_TRIANGULATION_STATISTICS
+ mutable unsigned long walk_size_;
+#endif
+
+protected: // HELPER FUNCTIONS
+
+ typedef CGAL::Iterator_project<
+ typename Full_cell::Vertex_handle_const_iterator,
+ internal::Triangulation::Point_from_vertex_handle<Vertex_handle, Point>
+ > Point_const_iterator;
+
+ Point_const_iterator points_begin(Full_cell_const_handle c) const
+ { return Point_const_iterator(c->vertices_begin()); }
+ Point_const_iterator points_end(Full_cell_const_handle c) const
+ { return Point_const_iterator(c->vertices_end()); }
+ Point_const_iterator points_begin(Full_cell_handle c) const
+ { return Point_const_iterator(c->vertices_begin()); }
+ Point_const_iterator points_end(Full_cell_handle c) const
+ { return Point_const_iterator(c->vertices_end()); }
+
+public:
+
+ // FACETS OPERATIONS
+
+ Full_cell_handle full_cell(const Facet & f) const
+ {
+ return tds().full_cell(f);
+ }
+
+ int index_of_covertex(const Facet & f) const
+ {
+ return tds().index_of_covertex(f);
+ }
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - UTILITIES
+
+ // A co-dimension 2 sub-simplex. called a Rotor because we can rotate
+ // the two "covertices" around the sub-simplex. Useful for traversing the
+ // boundary of a hole. NOT DOCUMENTED
+ typedef cpp11::tuple<Full_cell_handle, int, int> Rotor;
+
+ // Commented out because it was causing "internal compiler error" in MSVC
+ /*Full_cell_handle full_cell(const Rotor & r) const // NOT DOCUMENTED
+ {
+ return cpp11::get<0>(r);
+ }
+ int index_of_covertex(const Rotor & r) const // NOT DOCUMENTED
+ {
+ return cpp11::get<1>(r);
+ }
+ int index_of_second_covertex(const Rotor & r) const // NOT DOCUMENTED
+ {
+ return cpp11::get<2>(r);
+ }*/
+ Rotor rotate_rotor(Rotor & r) // NOT DOCUMENTED...
+ {
+ int opposite = cpp11::get<0>(r)->mirror_index(cpp11::get<1>(r));
+ Full_cell_handle s = cpp11::get<0>(r)->neighbor(cpp11::get<1>(r));
+ int new_second = s->index(cpp11::get<0>(r)->vertex(cpp11::get<2>(r)));
+ return Rotor(s, new_second, opposite);
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - CREATION / CONSTRUCTORS
+
+ Triangulation(int dim, const Geom_traits &k = Geom_traits())
+ : tds_(dim)
+ , kernel_(k)
+ , infinity_()
+ , preset_flat_orientation_((std::numeric_limits<int>::max)(),
+ (Flat_orientation_d*) NULL)
+ , rng_((long)0)
+#ifdef CGAL_TRIANGULATION_STATISTICS
+ ,walk_size_(0)
+#endif
+ {
+ clear();
+ }
+
+ // With this constructor,
+ // the user can specify a Flat_orientation_d object to be used for
+ // orienting simplices of a specific dimension
+ // (= preset_flat_orientation_.first)
+ // It it used for by dark triangulations created by DT::remove
+ Triangulation(
+ int dim,
+ const std::pair<int, const Flat_orientation_d *> &preset_flat_orientation,
+ const Geom_traits k = Geom_traits())
+ : tds_(dim)
+ , kernel_(k)
+ , infinity_()
+ , preset_flat_orientation_(preset_flat_orientation)
+ , rng_((long)0)
+#ifdef CGAL_TRIANGULATION_STATISTICS
+ ,walk_size_(0)
+#endif
+ {
+ clear();
+ }
+
+ Triangulation(const Triangulation & t2)
+ : tds_(t2.tds_)
+ , kernel_(t2.kernel_)
+ , infinity_()
+ , preset_flat_orientation_((std::numeric_limits<int>::max)(),
+ (Flat_orientation_d*) NULL)
+ , rng_(t2.rng_)
+#ifdef CGAL_TRIANGULATION_STATISTICS
+ ,walk_size_(t2.walk_size_)
+#endif
+ {
+ // We find the vertex at infinity by scanning the vertices of both
+ // triangulations. This works because Compact_container garantees that
+ // the vertices in the copy (*this) are stored in the same order as in
+ // the original triangulation (t2)
+ infinity_ = vertices_begin();
+ Vertex_const_iterator inf2 = t2.vertices_begin();
+ while( inf2 != t2.infinite_vertex() )
+ {
+ ++infinity_;
+ ++inf2;
+ }
+ // A full_cell has at most 1 + maximal_dimension() facets:
+ orientations_.resize(1 + maximal_dimension());
+ // Our coaffine orientation predicates HAS state member variables
+ reset_flat_orientation();
+ }
+
+ ~Triangulation() {}
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ACCESS FUNCTIONS
+
+ /* These three function are no longer needed since we do not use them anymore
+ in the Delaunay_triangulation::remove. *But*, they may reappear in the future
+ if we manage to passe the information that flags/TDS_data is available or not
+ for marking simplices in Delaunay_triangulation::remove. This would be useful
+ to make it a little faster, instead of binary searching if a simplex is marked
+ or not...
+ // NOT DOCUMENTED --
+ bool get_visited(Full_cell_handle s) const
+ {
+ return tds().get_visited(s);
+ }
+ // NOT DOCUMENTED --
+ bool get_visited(Full_cell_const_handle s) const
+ {
+ return tds().get_visited(s);
+ }
+
+ // NOT DOCUMENTED --
+ void set_visited(Full_cell_handle s, bool b) const
+ {
+ tds().set_visited(s, b);
+ } */
+
+ Coaffine_orientation_d coaffine_orientation_predicate() const
+ {
+ return Coaffine_orientation_d (
+ flat_orientation_,
+ geom_traits().construct_flat_orientation_d_object(),
+ geom_traits().in_flat_orientation_d_object()
+ );
+ }
+
+ const Triangulation_ds & tds() const
+ {
+ return tds_;
+ }
+
+ Triangulation_ds & tds()
+ {
+ return tds_;
+ }
+
+ const Geom_traits & geom_traits() const
+ {
+ return kernel_;
+ }
+
+ int maximal_dimension() const { return tds().maximal_dimension(); }
+ int current_dimension() const { return tds().current_dimension(); }
+
+ bool empty() const
+ {
+ return current_dimension() == -1;
+ }
+
+ size_type number_of_vertices() const
+ {
+ return tds().number_of_vertices() - 1;
+ }
+
+ size_type number_of_full_cells() const
+ {
+ return tds().number_of_full_cells();
+ }
+
+ Vertex_handle infinite_vertex() const
+ {
+ return infinity_;
+ }
+
+ Full_cell_handle infinite_full_cell() const
+ {
+ CGAL_assertion(infinite_vertex()->full_cell()->has_vertex(infinite_vertex()));
+ return infinite_vertex()->full_cell();
+ }
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - NON CONSTANT-TIME ACCESS FUNCTIONS
+
+ size_type number_of_finite_full_cells() const
+ {
+ Full_cell_const_iterator s = full_cells_begin();
+ size_type result = number_of_full_cells();
+ for( ; s != full_cells_end(); ++s )
+ {
+ if( is_infinite(s) )
+ --result;
+ }
+ return result;
+ }
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TRAVERSAL
+
+ Vertex_iterator vertices_begin() { return tds().vertices_begin(); }
+ Vertex_iterator vertices_end() { return tds().vertices_end(); }
+
+ Vertex_const_iterator vertices_begin() const { return tds().vertices_begin(); }
+ Vertex_const_iterator vertices_end() const { return tds().vertices_end(); }
+
+ Finite_vertex_iterator finite_vertices_begin()
+ { return Finite_vertex_iterator(Finiteness_predicate(*this), vertices_begin(), vertices_end()); }
+ Finite_vertex_iterator finite_vertices_end()
+ { return Finite_vertex_iterator(Finiteness_predicate(*this), vertices_end(), vertices_end()); }
+ Finite_vertex_const_iterator finite_vertices_begin() const
+ { return Finite_vertex_const_iterator(Finiteness_predicate(*this), vertices_begin(), vertices_end()); }
+ Finite_vertex_const_iterator finite_vertices_end() const
+ { return Finite_vertex_const_iterator(Finiteness_predicate(*this), vertices_end(), vertices_end()); }
+
+ Full_cell_iterator full_cells_begin() { return tds().full_cells_begin(); }
+ Full_cell_iterator full_cells_end() { return tds().full_cells_end(); }
+
+ Full_cell_const_iterator full_cells_begin() const { return tds().full_cells_begin(); }
+ Full_cell_const_iterator full_cells_end() const { return tds().full_cells_end(); }
+
+ Finite_full_cell_iterator finite_full_cells_begin()
+ { return Finite_full_cell_iterator(Finiteness_predicate(*this), full_cells_begin(), full_cells_end()); }
+ Finite_full_cell_iterator finite_full_cells_end()
+ { return Finite_full_cell_iterator(Finiteness_predicate(*this), full_cells_end(), full_cells_end()); }
+ Finite_full_cell_const_iterator finite_full_cells_begin() const
+ { return Finite_full_cell_const_iterator(Finiteness_predicate(*this), full_cells_begin(), full_cells_end()); }
+ Finite_full_cell_const_iterator finite_full_cells_end() const
+ { return Finite_full_cell_const_iterator(Finiteness_predicate(*this), full_cells_end(), full_cells_end()); }
+
+ Facet_iterator facets_begin() { return tds().facets_begin(); }
+ Facet_iterator facets_end() { return tds().facets_end(); }
+ Facet_iterator finite_facets_begin()
+ { return Finite_facet_iterator(Finiteness_predicate(*this), facets_begin(), facets_end()); }
+ Facet_iterator finite_facets_end()
+ { return Finite_facet_iterator(Finiteness_predicate(*this), facets_end(), facets_end()); }
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SOME PREDICATE FUNCTORS
+
+ class Finiteness_predicate
+ {
+ const Self & t_;
+ public:
+ Finiteness_predicate(const Self & t) : t_(t) {}
+ template < class T >
+ bool operator()(const T & t) const
+ {
+ return ! t_.is_infinite(t);
+ }
+ };
+
+ class Point_equality_predicate
+ {
+ const Point & o_;
+ public:
+ Point_equality_predicate(const Point & o) : o_(o) {}
+ bool operator()(const Point & o) const { return (o == o_ );}
+ };
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SIMPLE QUERIES
+/*
+ bool is_vertex(const Point & p, Vertex_handle & v, Full_cell_handle hint = Full_cell_handle()) const
+ {
+ Locate_type lt;
+ Face f(maximal_dimension());
+ Facet ft;
+ Full_cell_handle s = locate(p, lt, f, ft, hint);
+ if( ON_VERTEX == lt )
+ {
+ v = s->vertex(f.index(0));
+ return true;
+ }
+ return false;
+ }
+
+ bool is_vertex(Vertex_const_handle v) const
+ {
+ return tds().is_vertex(v);
+ }
+
+ bool is_full_cell(Full_cell_const_handle s) const
+ {
+ return tds().is_full_cell(s);
+ }
+*/
+
+ bool is_infinite(Vertex_const_handle v) const
+ {
+ CGAL_precondition(Vertex_const_handle() != v);
+ return (infinite_vertex() == v);
+ }
+
+ bool is_infinite(const Vertex & v) const /* internal use, not documented */
+ {
+ return (&(*infinite_vertex()) == &v);
+ }
+
+ bool is_infinite(Full_cell_const_handle s) const
+ {
+ CGAL_precondition(Full_cell_const_handle() != s);
+ return is_infinite(*s);
+ }
+ bool is_infinite(const Full_cell & s) const /* internal use, not documented */
+ {
+ for(int i = 0; i <= current_dimension(); ++i)
+ if( is_infinite(s.vertex(i)) )
+ return true;
+ return false;
+ }
+ bool is_infinite(const Facet & ft) const
+ {
+ Full_cell_const_handle s = full_cell(ft);
+ CGAL_precondition(s != Full_cell_const_handle());
+ if( is_infinite(s) )
+ return (s->vertex(index_of_covertex(ft)) != infinite_vertex());
+ return false;
+ }
+
+ bool is_infinite(const Face & f) const
+ {
+ Full_cell_const_handle s = f.full_cell();
+ CGAL_precondition(s != Full_cell_const_handle());
+ if( is_infinite(s) )
+ {
+ Vertex_handle v;
+ for( int i(0); i<= f.face_dimension(); ++i)
+ if ( is_infinite( f.vertex(i) )) return true;
+ }
+ return false;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ELEMENT GATHERING
+
+
+ template< typename OutputIterator >
+ OutputIterator incident_full_cells(const Face & f, OutputIterator out) const
+ {
+ return tds().incident_full_cells(f, out);
+ }
+ template< typename OutputIterator >
+ OutputIterator incident_full_cells(Vertex_const_handle v, OutputIterator out) const
+ {
+ return tds().incident_full_cells(v, out);
+ }
+ template< typename OutputIterator >
+ OutputIterator star(const Face & f, OutputIterator out) const
+ {
+ return tds().star(f, out);
+ }
+
+ template< typename OutputIterator >
+ OutputIterator incident_faces(Vertex_const_handle v, int d, OutputIterator out) const
+ {
+ return tds().incident_faces(v, d, out);
+ }
+ /*
+ template< typename OutputIterator, class Comparator >
+ OutputIterator incident_upper_faces( Vertex_const_handle v, int d,
+ OutputIterator out, Comparator cmp = Comparator())
+ {
+ return tds().incident_upper_faces(v, d, out, cmp);
+ }
+ template< typename OutputIterator >
+ OutputIterator incident_upper_faces( Vertex_const_handle v, int d,
+ OutputIterator out)
+ { // FIXME: uncomment this function, since it uses a comparator specific to
+ // *geometric* triangulation (taking infinite vertex into account)
+ internal::Triangulation::Compare_vertices_for_upper_face<Self> cmp(*this);
+ return tds().incident_upper_faces(v, d, out, cmp);
+ }
+ */
+ Orientation orientation(Full_cell_const_handle s, bool in_is_valid = false) const
+ {
+ if( ! in_is_valid )
+ CGAL_assertion( ! is_infinite(s) );
+ if( 0 == current_dimension() )
+ return POSITIVE;
+ if( current_dimension() == maximal_dimension() )
+ {
+ Orientation_d ori = geom_traits().orientation_d_object();
+ return ori(points_begin(s), points_begin(s) + 1 + current_dimension());
+ }
+ else
+ {
+ return coaffine_orientation_predicate()(points_begin(s), points_begin(s) + 1 + current_dimension());
+ }
+ }
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - UPDATE OPERATIONS
+
+ void clear()
+ {
+ tds_.clear();
+ infinity_ = tds().insert_increase_dimension();
+ // A full_cell has at most 1 + maximal_dimension() facets:
+ orientations_.resize(1 + maximal_dimension());
+ // Our coaffine orientation predicates HAS state member variables
+ reset_flat_orientation();
+#ifdef CGAL_TRIANGULATION_STATISTICS
+ walk_size_ = 0;
+#endif
+ }
+
+ void set_current_dimension(int d)
+ {
+ tds().set_current_dimension(d);
+ }
+
+ Full_cell_handle new_full_cell()
+ {
+ return tds().new_full_cell();
+ }
+
+ Vertex_handle new_vertex()
+ {
+ return tds().new_vertex();
+ }
+
+ Vertex_handle new_vertex(const Point & p)
+ {
+ return tds().new_vertex(p);
+ }
+
+ void set_neighbors(Full_cell_handle s, int i, Full_cell_handle s1, int j)
+ {
+ tds().set_neighbors(s, i, s1, j);
+ }
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - VALIDITY
+
+ bool is_valid(bool = false, int = 0) const;
+ bool are_incident_full_cells_valid(Vertex_const_handle, bool = false, int = 0) const;
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - POINT LOCATION
+
+protected:
+ template< typename OrientationPredicate >
+ Full_cell_handle do_locate(const Point &, Locate_type &, Face &, Facet &,
+ Full_cell_handle start,
+ const OrientationPredicate & o) const;
+public:
+ Full_cell_handle locate(const Point &, Locate_type &, Face &, Facet &,
+ Full_cell_handle start = Full_cell_handle()) const;
+ Full_cell_handle locate(const Point &, Locate_type &, Face &, Facet &,
+ Vertex_handle) const;
+ Full_cell_handle locate(const Point & p, Full_cell_handle s = Full_cell_handle()) const;
+ Full_cell_handle locate(const Point & p, Vertex_handle v) const;
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - REMOVALS
+
+ Vertex_handle contract_face(const Point &, const Face &);
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - POINT INSERTION
+
+ template< typename ForwardIterator >
+ size_type insert(ForwardIterator start, ForwardIterator end)
+ {
+ size_type n = number_of_vertices();
+ std::vector<Point> points(start, end);
+ spatial_sort(points.begin(), points.end(), geom_traits());
+ Full_cell_handle hint = Full_cell_handle();
+ typename std::vector<Point>::const_iterator s = points.begin();
+ while( s != points.end() )
+ {
+ hint = insert(*s++, hint)->full_cell();
+ }
+ return number_of_vertices() - n;
+ }
+ Vertex_handle insert(const Point &, Locate_type, const Face &, const Facet &, Full_cell_handle);
+ Vertex_handle insert(const Point &, Full_cell_handle start = Full_cell_handle());
+ Vertex_handle insert(const Point &, Vertex_handle);
+ template< typename ForwardIterator >
+ Vertex_handle insert_in_hole(const Point & p, ForwardIterator start, ForwardIterator end, const Facet & ft)
+ {
+ Emptyset_iterator out;
+ return insert_in_hole(p, start, end, ft, out);
+ }
+ template< typename ForwardIterator, typename OutputIterator >
+ Vertex_handle insert_in_hole(const Point & p, ForwardIterator start, ForwardIterator end, const Facet & ft,
+ OutputIterator out)
+ {
+ Vertex_handle v = tds().insert_in_hole(start, end, ft, out);
+ v->set_point(p);
+ return v;
+ }
+ Vertex_handle insert_in_face(const Point &, const Face &);
+ Vertex_handle insert_in_facet(const Point &, const Facet &);
+ Vertex_handle insert_in_full_cell(const Point &, Full_cell_handle);
+ Vertex_handle insert_outside_convex_hull_1(const Point &, Full_cell_handle);
+ Vertex_handle insert_outside_convex_hull(const Point &, Full_cell_handle);
+ Vertex_handle insert_outside_affine_hull(const Point &);
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - FACET-TRAVERSAL PREDICATES
+
+ template< typename OrientationPredicate >
+ class Outside_convex_hull_traversal_predicate
+ {
+ Triangulation & t_;
+ const Point & p_;
+ OrientationPredicate const& ori_;
+ int cur_dim_;
+ public:
+ Outside_convex_hull_traversal_predicate(Triangulation & t, const Point & p,
+ OrientationPredicate const& ori)
+ : t_(t), p_(p), ori_(ori), cur_dim_(t.current_dimension()) {}
+ // FUTURE change parameter to const reference
+ bool operator()(Facet f) const
+ {
+ Full_cell_handle s = t_.full_cell(f);
+ const int i = t_.index_of_covertex(f);
+ Full_cell_handle n = s->neighbor(i);
+ if( ! t_.is_infinite(n) )
+ return false;
+ int inf_v_index = n->index(t_.infinite_vertex());
+ n->vertex(inf_v_index)->set_point(p_);
+ bool ok = (POSITIVE == ori_(t_.points_begin(n), t_.points_begin(n) + cur_dim_ + 1));
+ return ok;
+ }
+ };
+
+ // make sure all full_cells have positive orientation
+ void reorient_full_cells();
+
+protected:
+ // This is used in the |remove(v)| member function to manage sets of Full_cell_handles
+ template< typename FCH >
+ struct Full_cell_set : public std::vector<FCH>
+ {
+ typedef std::vector<FCH> Base_set;
+ using Base_set::begin;
+ using Base_set::end;
+ void make_searchable()
+ { // sort the full cell handles
+ std::sort(begin(), end());
+ }
+ bool contains(const FCH & fch) const
+ {
+ return std::binary_search(begin(), end(), fch);
+ }
+ bool contains_1st_and_not_2nd(const FCH & fst, const FCH & snd) const
+ {
+ return ( ! contains(snd) ) && ( contains(fst) );
+ }
+ };
+
+ void display_all_full_cells__debugging() const
+ {
+ std::cerr << "ALL FULL CELLS:" << std::endl;
+ for (Full_cell_const_iterator cit = full_cells_begin() ;
+ cit != full_cells_end() ; ++cit )
+ {
+ std::cerr << std::hex << &*cit << ": ";
+ for (int jj = 0 ; jj <= current_dimension() ; ++jj)
+ std::cerr << (is_infinite(cit->vertex(jj)) ? 0xFFFFFFFF : (unsigned int)&*cit->vertex(jj)) << " - ";
+ std::cerr << std::dec << std::endl;
+ }
+ std::cerr << std::endl;
+ }
+
+
+}; // Triangulation<...>
+
+// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
+
+// CLASS MEMBER FUNCTIONS
+
+template < class TT, class TDS >
+void
+Triangulation<TT, TDS>
+::reorient_full_cells()
+{
+ if( current_dimension() < 1 )
+ return;
+
+ Full_cell_iterator sit = full_cells_begin();
+ Full_cell_iterator send = full_cells_end();
+ for ( ; sit != send ; ++sit)
+ {
+ if( ! (is_infinite(sit) && (1 == current_dimension())) )
+ {
+ sit->swap_vertices(current_dimension() - 1, current_dimension());
+ }
+ }
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// - - - - - - - - - - - - - - - - - - - - - - - - THE REMOVAL METHODS
+
+template < class TT, class TDS >
+typename Triangulation<TT, TDS>::Vertex_handle
+Triangulation<TT, TDS>
+::contract_face(const Point & p, const Face & f)
+{
+ CGAL_precondition( ! is_infinite(f) );
+ Vertex_handle v = tds().contract_face(f);
+ v->set_point(p);
+ CGAL_expensive_postcondition_msg(are_incident_full_cells_valid(v), "new point is not where it should be");
+ return v;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// - - - - - - - - - - - - - - - - - - - - - - - - THE INSERTION METHODS
+
+template < class TT, class TDS >
+typename Triangulation<TT, TDS>::Vertex_handle
+Triangulation<TT, TDS>
+::insert(const Point & p, Locate_type lt, const Face & f, const Facet & ft, Full_cell_handle s)
+{
+ switch( lt )
+ {
+ case IN_FULL_CELL:
+ return insert_in_full_cell(p, s);
+ break;
+ case OUTSIDE_CONVEX_HULL:
+ return insert_outside_convex_hull(p, s);
+ break;
+ case OUTSIDE_AFFINE_HULL:
+ return insert_outside_affine_hull(p);
+ break;
+ case IN_FACET:
+ {
+ return insert_in_facet(p, ft);
+ break;
+ }
+ case IN_FACE:
+ return insert_in_face(p, f);
+ break;
+ case ON_VERTEX:
+ s->vertex(f.index(0))->set_point(p);
+ return s->vertex(f.index(0));
+ break;
+ }
+ CGAL_assertion(false);
+ return Vertex_handle();
+}
+
+template < class TT, class TDS >
+typename Triangulation<TT, TDS>::Vertex_handle
+Triangulation<TT, TDS>
+::insert(const Point & p, Full_cell_handle start)
+{
+ Locate_type lt;
+ Face f(maximal_dimension());
+ Facet ft;
+ Full_cell_handle s = locate(p, lt, f, ft, start);
+ return insert(p, lt, f, ft, s);
+}
+
+template < class TT, class TDS >
+typename Triangulation<TT, TDS>::Vertex_handle
+Triangulation<TT, TDS>
+::insert(const Point & p, Vertex_handle v)
+{
+ if( Vertex_handle() == v )
+ v = infinite_vertex();
+ return insert(p, v->full_cell());
+}
+
+template < class TT, class TDS >
+typename Triangulation<TT, TDS>::Vertex_handle
+Triangulation<TT, TDS>
+::insert_in_face(const Point & p, const Face & f)
+{
+ CGAL_precondition( ! is_infinite(f) );
+ Vertex_handle v = tds().insert_in_face(f);
+ v->set_point(p);
+ return v;
+}
+
+template < class TT, class TDS >
+typename Triangulation<TT, TDS>::Vertex_handle
+Triangulation<TT, TDS>
+::insert_in_facet(const Point & p, const Facet & ft)
+{
+ CGAL_precondition( ! is_infinite(ft) );
+ Vertex_handle v = tds().insert_in_facet(ft);
+ v->set_point(p);
+ return v;
+}
+
+template < class TT, class TDS >
+typename Triangulation<TT, TDS>::Vertex_handle
+Triangulation<TT, TDS>
+::insert_in_full_cell(const Point & p, Full_cell_handle s)
+{
+ CGAL_precondition( ! is_infinite(s) );
+ Vertex_handle v = tds().insert_in_full_cell(s);
+ v->set_point(p);
+ return v;
+}
+
+// NOT DOCUMENTED...
+template < class TT, class TDS >
+typename Triangulation<TT, TDS>::Vertex_handle
+Triangulation<TT, TDS>
+::insert_outside_convex_hull_1(const Point & p, Full_cell_handle s)
+{
+ // This is a special case for dimension 1, because in that case, the right
+ // infinite full_cell is not correctly oriented... (sice its first vertex is the
+ // infinite one...
+ CGAL_precondition( is_infinite(s) );
+ CGAL_precondition( 1 == current_dimension() );
+ Vertex_handle v = tds().insert_in_full_cell(s);
+ v->set_point(p);
+ return v;
+}
+
+template < class TT, class TDS >
+typename Triangulation<TT, TDS>::Vertex_handle
+Triangulation<TT, TDS>
+::insert_outside_convex_hull(const Point & p, Full_cell_handle s)
+{
+ if( 1 == current_dimension() )
+ {
+ return insert_outside_convex_hull_1(p, s);
+ }
+ CGAL_precondition( is_infinite(s) );
+ CGAL_assertion( current_dimension() >= 2 );
+ std::vector<Full_cell_handle> simps;
+ simps.reserve(64);
+ std::back_insert_iterator<std::vector<Full_cell_handle> > out(simps);
+ if( current_dimension() < maximal_dimension() )
+ {
+ Coaffine_orientation_d ori = coaffine_orientation_predicate();
+ Outside_convex_hull_traversal_predicate<Coaffine_orientation_d>
+ ochtp(*this, p, ori);
+ tds().gather_full_cells(s, ochtp, out);
+ }
+ else
+ {
+ Orientation_d ori = geom_traits().orientation_d_object();
+ Outside_convex_hull_traversal_predicate<Orientation_d>
+ ochtp(*this, p, ori);
+ tds().gather_full_cells(s, ochtp, out);
+ }
+ int inf_v_index = s->index(infinite_vertex());
+ Vertex_handle v = insert_in_hole(
+ p, simps.begin(), simps.end(), Facet(s, inf_v_index));
+ return v;
+}
+
+template < class TT, class TDS >
+typename Triangulation<TT, TDS>::Vertex_handle
+Triangulation<TT, TDS>
+::insert_outside_affine_hull(const Point & p)
+{
+ CGAL_precondition( current_dimension() < maximal_dimension() );
+ Vertex_handle v = tds().insert_increase_dimension(infinite_vertex());
+ // reset the orientation predicate:
+ reset_flat_orientation();
+ v->set_point(p);
+ if( current_dimension() >= 1 )
+ {
+ Full_cell_handle inf_v_cell = infinite_vertex()->full_cell();
+ int inf_v_index = inf_v_cell->index(infinite_vertex());
+ Full_cell_handle s = inf_v_cell->neighbor(inf_v_index);
+ Orientation o = orientation(s);
+ CGAL_assertion( COPLANAR != o );
+ if( NEGATIVE == o )
+ reorient_full_cells();
+
+
+ // We just inserted the second finite point and the right infinite
+ // cell is like : (inf_v, v), but we want it to be (v, inf_v) to be
+ // consistent with the rest of the cells
+ if (current_dimension() == 1)
+ {
+ // Is "inf_v_cell" the right infinite cell?
+ // Then inf_v_index should be 1
+ if (inf_v_cell->neighbor(inf_v_index)->index(inf_v_cell) == 0
+ && inf_v_index == 0)
+ {
+ inf_v_cell->swap_vertices(
+ current_dimension() - 1, current_dimension());
+ }
+ // Otherwise, let's find the right infinite cell
+ else
+ {
+ inf_v_cell = inf_v_cell->neighbor((inf_v_index + 1) % 2);
+ inf_v_index = inf_v_cell->index(infinite_vertex());
+ // Is "inf_v_cell" the right infinite cell?
+ // Then inf_v_index should be 1
+ if (inf_v_cell->neighbor(inf_v_index)->index(inf_v_cell) == 0
+ && inf_v_index == 0)
+ {
+ inf_v_cell->swap_vertices(
+ current_dimension() - 1, current_dimension());
+ }
+ }
+ }
+ }
+ return v;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// - - - - - - - - - - - - - - - - - - - - THE MAIN LOCATE(...) FUNCTION
+
+template < class TT, class TDS >
+template< typename OrientationPredicate >
+typename Triangulation<TT, TDS>::Full_cell_handle
+Triangulation<TT, TDS>
+::do_locate(const Point & p, // query point
+ Locate_type & loc_type,// type of result (full_cell, face, vertex)
+ Face & face,// the face containing the query in its interior (when appropriate)
+ Facet & facet,// the facet containing the query in its interior (when appropriate)
+ Full_cell_handle start, // starting full_cell for the walk
+ OrientationPredicate const& orientation_pred
+ ) const
+{
+ const int cur_dim = current_dimension();
+
+ if( cur_dim == -1 )
+ {
+ loc_type = OUTSIDE_AFFINE_HULL;
+ return Full_cell_handle();
+ }
+ else if( cur_dim == 0 )
+ {
+ Vertex_handle vit = infinite_full_cell()->neighbor(0)->vertex(0);
+ if( EQUAL != geom_traits().compare_lexicographically_d_object()(p, vit->point()) )
+ {
+ loc_type = OUTSIDE_AFFINE_HULL;
+ return Full_cell_handle();
+ }
+ else
+ {
+ loc_type = ON_VERTEX;
+ face.set_full_cell(vit->full_cell());
+ face.set_index(0, 0);
+ return vit->full_cell();
+ }
+ }
+
+ Full_cell_handle s;
+
+ // if we don't know where to start, we start from any bounded full_cell
+ if( Full_cell_handle() == start )
+ {
+ // THE HACK THAT NOBODY SHOULD DO... BUT DIFFICULT TO WORK AROUND
+ // THIS... TODO: WORK AROUND IT
+ Full_cell_handle inf_c = const_cast<Self*>(this)->infinite_full_cell();
+ int inf_v_index = inf_c->index(infinite_vertex());
+ s = inf_c->neighbor(inf_v_index);
+ }
+ else
+ {
+ s = start;
+ if( is_infinite(s) )
+ {
+ int inf_v_index = s->index(infinite_vertex());
+ s = s->neighbor(inf_v_index);
+ }
+ }
+
+ // Check if query |p| is outside the affine hull
+ if( cur_dim < maximal_dimension() )
+ {
+ if( ! geom_traits().contained_in_affine_hull_d_object()(
+ points_begin(s),
+ points_begin(s) + current_dimension() + 1,
+ p) )
+ {
+ loc_type = OUTSIDE_AFFINE_HULL;
+ return Full_cell_handle();
+ }
+ }
+
+ // we remember the |previous|ly visited full_cell to avoid the evaluation
+ // of one |orientation| predicate
+ Full_cell_handle previous = Full_cell_handle();
+ bool full_cell_not_found = true;
+ while(full_cell_not_found) // we walk until we locate the query point |p|
+ {
+ #ifdef CGAL_TRIANGULATION_STATISTICS
+ ++walk_size_;
+ #endif
+ // For the remembering stochastic walk, we need to start trying
+ // with a random index:
+ int j, i = rng_.get_int(0, cur_dim);
+ // we check |p| against all the full_cell's hyperplanes in turn
+
+ for(j = 0; j <= cur_dim; ++j, i = (i + 1) % (cur_dim + 1) )
+ {
+ Full_cell_handle next = s->neighbor(i);
+ if( previous == next )
+ { // no need to compute the orientation, we already know it
+ orientations_[i] = POSITIVE;
+ continue; // go to next full_cell's facet
+ }
+
+ Substitute_point_in_vertex_iterator<
+ typename Full_cell::Vertex_handle_const_iterator>
+ spivi(s->vertex(i), &p);
+
+ orientations_[i] = orientation_pred(
+ boost::make_transform_iterator(s->vertices_begin(), spivi),
+ boost::make_transform_iterator(s->vertices_begin() + cur_dim + 1,
+ spivi));
+
+ if( orientations_[i] != NEGATIVE )
+ {
+ // from this facet's point of view, we are inside the
+ // full_cell or on its boundary, so we continue to next facet
+ continue;
+ }
+
+ // At this point, we know that we have to jump to the |next|
+ // full_cell because orientation_[i] == NEGATIVE
+ previous = s;
+ s = next;
+ if( is_infinite(next) )
+ { // we have arrived OUTSIDE the convex hull of the triangulation,
+ // so we stop the search
+ full_cell_not_found = false;
+ loc_type = OUTSIDE_CONVEX_HULL;
+ face.set_full_cell(s);
+ }
+ break;
+ } // end of the 'for' loop
+ if( ( cur_dim + 1 ) == j ) // we found the full_cell containing |p|
+ full_cell_not_found = false;
+ }
+ // Here, we know in which full_cell |p| is in.
+ // We now check more precisely where |p| landed:
+ // vertex, facet, face or full_cell.
+ if( ! is_infinite(s) )
+ {
+ face.set_full_cell(s);
+ int num(0);
+ int verts(0);
+ for(int i = 0; i < cur_dim; ++i)
+ {
+ if( orientations_[i] == COPLANAR )
+ {
+ ++num;
+ facet = Facet(s, i);
+ }
+ else
+ face.set_index(verts++, i);
+ }
+ //-- We could put the if{}else{} below in the loop above, but then we would
+ // need to test if (verts < cur_dim) many times... we do it only once
+ // here:
+ if( orientations_[cur_dim] == COPLANAR )
+ {
+ ++num;
+ facet = Facet(s, cur_dim);
+ }
+ else if( verts < cur_dim )
+ face.set_index(verts, cur_dim);
+ //-- end of remark above //
+ if( 0 == num )
+ {
+ loc_type = IN_FULL_CELL;
+ face.clear();
+ }
+ else if( cur_dim == num )
+ loc_type = ON_VERTEX;
+ else if( 1 == num )
+ loc_type = IN_FACET;
+ else
+ loc_type = IN_FACE;
+ }
+ return s;
+}
+
+template < class TT, class TDS >
+typename Triangulation<TT, TDS>::Full_cell_handle
+Triangulation<TT, TDS>
+::locate( const Point & p, // query point
+ Locate_type & loc_type,// type of result (full_cell, face, vertex)
+ Face & face,// the face containing the query in its interior (when appropriate)
+ Facet & facet,// the facet containing the query in its interior (when appropriate)
+ Full_cell_handle start// starting full_cell for the walk
+ ) const
+{
+ if( current_dimension() == maximal_dimension() )
+ {
+ Orientation_d ori = geom_traits().orientation_d_object();
+ return do_locate(p, loc_type, face, facet, start, ori);
+ }
+ else
+ return do_locate(p, loc_type, face, facet, start, coaffine_orientation_predicate());
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// - - - - - - - - - - - - - - - - - - - - the locate(...) variants
+
+template < class TT, class TDS >
+typename Triangulation<TT, TDS>::Full_cell_handle
+Triangulation<TT, TDS>
+::locate( const Point & p,
+ Locate_type & loc_type,
+ Face & face,
+ Facet & facet,
+ Vertex_handle start) const
+{
+ if( Vertex_handle() == start )
+ start = infinite_vertex();
+ return locate(p, loc_type, face, facet, start->full_cell());
+}
+
+template < class TT, class TDS >
+typename Triangulation<TT, TDS>::Full_cell_handle
+Triangulation<TT, TDS>
+::locate(const Point & p, Full_cell_handle s) const
+{
+ Locate_type lt;
+ Face face(maximal_dimension());
+ Facet facet;
+ return locate(p, lt, face, facet, s);
+}
+
+template < class TT, class TDS >
+typename Triangulation<TT, TDS>::Full_cell_handle
+Triangulation<TT, TDS>
+::locate(const Point & p, Vertex_handle v) const
+{
+ if( Vertex_handle() != v )
+ v = infinite_vertex();
+ return this->locate(p, v->full_cell());
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - VALIDITY
+
+template < class TT, class TDS >
+bool
+Triangulation<TT, TDS>
+::is_valid(bool verbose, int level) const
+{
+ if( ! tds().is_valid(verbose, level) )
+ return false;
+
+ Full_cell_const_iterator c;
+ if( current_dimension() < 0 )
+ return true;
+ Orientation o;
+ for( c = full_cells_begin(); c != full_cells_end(); ++c )
+ {
+ if( is_infinite(c) )
+ {
+ if( current_dimension() > 1 )
+ {
+ int i = c->index( infinite_vertex() );
+ Full_cell_handle n = c->neighbor(i);
+ infinite_vertex()->set_point(n->vertex(c->mirror_index(i))->point());
+ o = - orientation(c, true);
+ }
+ else
+ o = POSITIVE;
+ }
+ else
+ o = orientation(c, true);
+ if( NEGATIVE == o )
+ {
+ if( verbose ) CGAL_warning_msg(false, "full_cell is not correctly oriented");
+ return false;
+ }
+ if( COPLANAR == o )
+ {
+ if( verbose ) CGAL_warning_msg(false, "full_cell is flat");
+ return false;
+ }
+ }
+ return true;
+}
+
+template < class TT, class TDS >
+bool Triangulation<TT, TDS>::are_incident_full_cells_valid(Vertex_const_handle v, bool verbose, int) const
+{
+ if( current_dimension() <= 0 )
+ return true;
+ typedef std::vector<Full_cell_const_handle> Simps;
+ Simps simps;
+ simps.reserve(64);
+ std::back_insert_iterator<Simps> out(simps);
+ incident_full_cells(v, out);
+ typename Simps::const_iterator sit = simps.begin();
+ for( ; sit != simps.end(); ++sit )
+ {
+ if( is_infinite(*sit) )
+ continue;
+ Orientation o = orientation(*sit);
+ if( NEGATIVE == o )
+ {
+ if( verbose ) CGAL_warning_msg(false, "full_cell is not correctly oriented");
+ return false;
+ }
+ if( COPLANAR == o )
+ {
+ if( verbose ) CGAL_warning_msg(false, "full_cell is flat");
+ return false;
+ }
+ }
+ return true;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+// FUNCTIONS THAT ARE NOT MEMBER FUNCTIONS:
+
+template < class TT, class TDS >
+std::istream &
+operator>>(std::istream & is, Triangulation<TT, TDS> & tr)
+ // reads :
+ // - the dimensions (maximal and current)
+ // - the number of finite vertices
+ // - the non combinatorial information on vertices (point, etc)
+ // - the number of full_cells
+ // - the full_cells by the indices of their vertices in the preceding list
+ // of vertices, plus the non combinatorial information on each full_cell
+ // - the neighbors of each full_cell by their index in the preceding list
+{
+ typedef Triangulation<TT, TDS> T;
+ typedef typename T::Vertex_handle Vertex_handle;
+
+ // read current dimension and number of vertices
+ size_t n;
+ int cd;
+ if( is_ascii(is) )
+ is >> cd >> n;
+ else
+ {
+ read(is, cd);
+ read(is, n, io_Read_write());
+ }
+
+ CGAL_assertion_msg( cd <= tr.maximal_dimension(), "input Triangulation has too high dimension");
+
+ tr.clear();
+ tr.set_current_dimension(cd);
+
+ if( n == 0 )
+ return is;
+
+ std::vector<Vertex_handle> vertices;
+ vertices.resize(n+1);
+ vertices[0] = tr.infinite_vertex();
+ is >> (*vertices[0]);
+
+ // read the vertices:
+ size_t i(1);
+ while( i <= n )
+ {
+ vertices[i] = tr.new_vertex();
+ is >> (*vertices[i]); // read a vertex
+ ++i;
+ }
+
+ // now, read the combinatorial information
+ return tr.tds().read_full_cells(is, vertices);
+}
+
+template < class TT, class TDS >
+std::ostream &
+operator<<(std::ostream & os, const Triangulation<TT, TDS> & tr)
+ // writes :
+ // - the dimensions (maximal and current)
+ // - the number of finite vertices
+ // - the non combinatorial information on vertices (point, etc)
+ // - the number of full_cells
+ // - the full_cells by the indices of their vertices in the preceding list
+ // of vertices, plus the non combinatorial information on each full_cell
+ // - the neighbors of each full_cell by their index in the preceding list
+{
+ typedef Triangulation<TT, TDS> T;
+ typedef typename T::Vertex_const_handle Vertex_handle;
+ typedef typename T::Vertex_const_iterator Vertex_iterator;
+
+ // outputs dimensions and number of vertices
+ size_t n = tr.number_of_vertices();
+ if( is_ascii(os) )
+ os << tr.current_dimension() << std::endl << n << std::endl;
+ else
+ {
+ write(os, tr.current_dimension());
+ write(os, n, io_Read_write());
+ }
+
+ if( n == 0 )
+ return os;
+
+ size_t i(0);
+ // write the vertices
+ std::map<Vertex_handle, int> index_of_vertex;
+
+ // infinite vertex has index 0 (among all the vertices)
+ index_of_vertex[tr.infinite_vertex()] = i++;
+ os << *tr.infinite_vertex();
+ for( Vertex_iterator it = tr.vertices_begin(); it != tr.vertices_end(); ++it )
+ {
+ if( tr.is_infinite(it) )
+ continue;
+ os << *it; // write the vertex
+ index_of_vertex[it] = i++;
+ }
+ CGAL_assertion( i == n+1 );
+
+ // output the combinatorial information
+ return tr.tds().write_full_cells(os, index_of_vertex);
+}
+
+} //namespace CGAL
+
+#endif // CGAL_TRIANGULATION_H
diff --git a/include/gudhi_patches/CGAL/Triangulation_data_structure.h b/include/gudhi_patches/CGAL/Triangulation_data_structure.h
new file mode 100644
index 00000000..2493c712
--- /dev/null
+++ b/include/gudhi_patches/CGAL/Triangulation_data_structure.h
@@ -0,0 +1,1603 @@
+// Copyright (c) 2009-2014 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Samuel Hornus
+
+#ifndef CGAL_TRIANGULATION_DATA_STRUCTURE_H
+#define CGAL_TRIANGULATION_DATA_STRUCTURE_H
+
+#include <CGAL/basic.h>
+#include <CGAL/Default.h>
+#include <CGAL/iterator.h>
+#include <CGAL/Compact_container.h>
+#include <CGAL/Triangulation_face.h>
+#include <CGAL/Triangulation_ds_vertex.h>
+#include <CGAL/Triangulation_ds_full_cell.h>
+#include <CGAL/internal/Combination_enumerator.h>
+#include <CGAL/internal/Triangulation/utilities.h>
+#include <CGAL/internal/Triangulation/Triangulation_ds_iterators.h>
+
+#include <algorithm>
+#include <vector>
+#include <queue>
+#include <set>
+
+namespace CGAL {
+
+template< class Dimen,
+ class Vb = Default,
+ class Fcb = Default >
+class Triangulation_data_structure
+{
+ typedef Triangulation_data_structure<Dimen, Vb, Fcb> Self;
+ typedef typename Default::Get<Vb, Triangulation_ds_vertex<> >::type V_base;
+ typedef typename Default::Get<Fcb, Triangulation_ds_full_cell<> >::type FC_base;
+
+public:
+ typedef typename V_base::template Rebind_TDS<Self>::Other Vertex; /* Concept */
+ typedef typename FC_base::template Rebind_TDS<Self>::Other Full_cell; /* Concept */
+
+ // Tools to change the Vertex and Cell types of the TDS.
+ template < typename Vb2 >
+ struct Rebind_vertex {
+ typedef Triangulation_data_structure<Dimen, Vb2, Fcb> Other;
+ };
+
+ template < typename Fcb2 >
+ struct Rebind_full_cell {
+ typedef Triangulation_data_structure<Dimen, Vb, Fcb2> Other;
+ };
+
+
+
+ // we want to store an object of this class in every Full_cell:
+ class Full_cell_data
+ {
+ unsigned char bits_;
+ public:
+ Full_cell_data() : bits_(0) {}
+ Full_cell_data(const Full_cell_data & fcd) : bits_(fcd.bits_) {}
+
+ void clear() { bits_ = 0; }
+ void mark_visited() { bits_ = 1; }
+ void clear_visited() { bits_ = 0; }
+
+ bool is_clear() const { return bits_ == 0; }
+ bool is_visited() const { return bits_ == 1; }
+ // WARNING: if we use more bits and several bits can be set at once,
+ // then make sure to use bitwise operation above, instead of direct
+ // affectation.
+ };
+
+protected:
+ typedef Compact_container<Vertex> Vertex_container;
+ typedef Compact_container<Full_cell> Full_cell_container;
+
+public:
+ typedef Dimen Maximal_dimension;
+
+ typedef typename Vertex_container::size_type size_type; /* Concept */
+ typedef typename Vertex_container::difference_type difference_type; /* Concept */
+
+ typedef typename Vertex_container::iterator Vertex_handle; /* Concept */
+ typedef typename Vertex_container::iterator Vertex_iterator; /* Concept */
+ typedef typename Vertex_container::const_iterator Vertex_const_handle;
+ typedef typename Vertex_container::const_iterator Vertex_const_iterator;
+
+ typedef typename Full_cell_container::iterator Full_cell_handle; /* Concept */
+ typedef typename Full_cell_container::iterator Full_cell_iterator; /* Concept */
+ typedef typename Full_cell_container::const_iterator Full_cell_const_handle;
+ typedef typename Full_cell_container::const_iterator Full_cell_const_iterator;
+
+ typedef internal::Triangulation::
+ Triangulation_ds_facet_iterator<Self> Facet_iterator; /* Concept */
+
+ /* The 2 types defined below, |Facet| and |Rotor| are used when traversing
+ the boundary `B' of the union of a set of full cells. |Rotor| makes it
+ easy to rotate around itself, in the search of neighbors in `B' (see
+ |rotate_rotor| and |insert_in_tagged_hole|) */
+
+ // A co-dimension 1 sub-simplex.
+ class Facet /* Concept */
+ {
+ Full_cell_handle full_cell_;
+ int index_of_covertex_;
+ public:
+ Facet() : full_cell_(), index_of_covertex_(0) {}
+ Facet(Full_cell_handle f, int i) : full_cell_(f), index_of_covertex_(i) {}
+ Full_cell_handle full_cell() const { return full_cell_; }
+ int index_of_covertex() const { return index_of_covertex_; }
+ };
+
+ // A co-dimension 2 sub-simplex. called a Rotor because we can rotate
+ // the two "covertices" around the sub-simplex. Useful for traversing the
+ // boundary of a hole. NOT DOCUMENTED
+ class Rotor : public Facet
+ {
+ int index_of_second_covertex_;
+ public:
+ Rotor() : Facet(), index_of_second_covertex_(0) {}
+ Rotor(Full_cell_handle f, int first, int second) : Facet(f, first), index_of_second_covertex_(second) {}
+ int index_of_second_covertex() const { return index_of_second_covertex_; }
+ };
+
+ typedef Triangulation_face<Self> Face; /* Concept */
+
+protected: // DATA MEMBERS
+
+ int dmax_, dcur_; // dimension of the current triangulation
+ Vertex_container vertices_; // list of all vertices
+ Full_cell_container full_cells_; // list of all full cells
+
+private:
+
+ void clean_dynamic_memory()
+ {
+ vertices_.clear();
+ full_cells_.clear();
+ }
+
+ template < class Dim_tag >
+ struct get_maximal_dimension
+ {
+ static int value(int D) { return D; }
+ };
+ // specialization
+ template < int D >
+ struct get_maximal_dimension<Dimension_tag<D> >
+ {
+ static int value(int) { return D; }
+ };
+
+public:
+ Triangulation_data_structure( int dim=0) /* Concept */
+ : dmax_(get_maximal_dimension<Dimen>::value(dim)), dcur_(-2),
+ vertices_(), full_cells_()
+ {
+ CGAL_assertion_msg(dmax_ > 0, "maximal dimension must be positive.");
+ }
+
+ ~Triangulation_data_structure()
+ {
+ clean_dynamic_memory();
+ }
+
+ Triangulation_data_structure(const Triangulation_data_structure & tds)
+ : dmax_(tds.dmax_), dcur_(tds.dcur_),
+ vertices_(tds.vertices_), full_cells_(tds.full_cells_)
+ {
+ typedef std::map<Vertex_const_handle, Vertex_handle> V_map;
+ typedef std::map<Full_cell_const_handle, Full_cell_handle> C_map;
+ V_map vmap;
+ C_map cmap;
+ Vertex_const_iterator vfrom = tds.vertices_begin();
+ Vertex_iterator vto = vertices_begin();
+ Full_cell_const_iterator cfrom = tds.full_cells_begin();
+ Full_cell_iterator cto = full_cells_begin();
+ while( vfrom != tds.vertices_end() )
+ vmap[vfrom++] = vto++;
+ while( cfrom != tds.full_cells_end() )
+ cmap[cfrom++] = cto++;
+ cto = full_cells_begin();
+ while( cto != full_cells_end() )
+ {
+ for( int i = 0; i <= (std::max)(0, current_dimension()); ++i )
+ {
+ associate_vertex_with_full_cell(cto, i, vmap[cto->vertex(i)]);
+ cto->set_neighbor(i, cmap[cto->neighbor(i)]);
+ }
+ ++cto;
+ }
+ }
+
+ // QUERIES
+
+protected:
+
+ bool check_range(int i) const
+ {
+ if( current_dimension() < 0 )
+ {
+ return (0 == i);
+ }
+ return ( (0 <= i) && (i <= current_dimension()) );
+ }
+
+public:
+
+ /* returns the current dimension of the full cells in the triangulation. */
+ int maximal_dimension() const { return dmax_; } /* Concept */
+ int current_dimension() const { return dcur_; } /* Concept */
+
+ size_type number_of_vertices() const /* Concept */
+ {
+ return this->vertices_.size();
+ }
+ size_type number_of_full_cells() const /* Concept */
+ {
+ return this->full_cells_.size();
+ }
+
+ bool empty() const /* Concept */
+ {
+ return current_dimension() == -2;
+ }
+
+ Vertex_container & vertices() { return vertices_; }
+ const Vertex_container & vertices() const { return vertices_; }
+ Full_cell_container & full_cells() { return full_cells_; }
+ const Full_cell_container & full_cells() const { return full_cells_; }
+
+ Vertex_handle vertex(Full_cell_handle s, int i) const /* Concept */
+ {
+ CGAL_precondition(s != Full_cell_handle() && check_range(i));
+ return s->vertex(i);
+ }
+
+ Vertex_const_handle vertex(Full_cell_const_handle s, int i) const /* Concept */
+ {
+ CGAL_precondition(s != Full_cell_handle() && check_range(i));
+ return s->vertex(i);
+ }
+
+ bool is_vertex(Vertex_const_handle v) const /* Concept */
+ {
+ if( Vertex_const_handle() == v )
+ return false;
+ Vertex_const_iterator vit = vertices_begin();
+ while( vit != vertices_end() && ( v != vit ) )
+ ++vit;
+ return v == vit;
+ }
+
+ bool is_full_cell(Full_cell_const_handle s) const /* Concept */
+ {
+ if( Full_cell_const_handle() == s )
+ return false;
+ Full_cell_const_iterator sit = full_cells_begin();
+ while( sit != full_cells_end() && ( s != sit ) )
+ ++sit;
+ return s == sit;
+ }
+
+ Full_cell_handle full_cell(Vertex_handle v) const /* Concept */
+ {
+ CGAL_precondition(v != Vertex_handle());
+ return v->full_cell();
+ }
+
+ Full_cell_const_handle full_cell(Vertex_const_handle v) const /* Concept */
+ {
+ CGAL_precondition(Vertex_const_handle() != v);
+ return v->full_cell();
+ }
+
+ Full_cell_handle neighbor(Full_cell_handle s, int i) const /* Concept */
+ {
+ CGAL_precondition(Full_cell_handle() != s && check_range(i));
+ return s->neighbor(i);
+ }
+
+ Full_cell_const_handle neighbor(Full_cell_const_handle s, int i) const/* Concept */
+ {
+ CGAL_precondition(Full_cell_const_handle() != s && check_range(i));
+ return s->neighbor(i);
+ }
+
+ int mirror_index(Full_cell_handle s, int i) const /* Concept */
+ {
+ CGAL_precondition(Full_cell_handle() != s && check_range(i));
+ return s->mirror_index(i);
+ }
+
+ int mirror_index(Full_cell_const_handle s, int i) const
+ {
+ CGAL_precondition(Full_cell_const_handle() != s && check_range(i)); /* Concept */
+ return s->mirror_index(i);
+ }
+
+ int mirror_vertex(Full_cell_handle s, int i) const /* Concept */
+ {
+ CGAL_precondition(Full_cell_handle() != s && check_range(i));
+ return s->mirror_vertex(i);
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FACETS OPERATIONS
+
+ // works for Face_ = Facet and Face_ = Rotor.
+ // NOT DOCUMENTED for the Rotor case...
+ template< typename Face_ >
+ Full_cell_handle full_cell(const Face_ & f) const /* Concept */
+ {
+ return f.full_cell();
+ }
+
+ // works for Face_ = Facet and Face_ = Rotor.
+ // NOT DOCUMENTED for the Rotor case...
+ template< class Face_ >
+ int index_of_covertex(const Face_ & f) const /* Concept */
+ {
+ return f.index_of_covertex();
+ }
+
+ // NOT DOCUMENTED
+ // A Rotor has two covertices
+ int index_of_second_covertex(const Rotor & f) const
+ {
+ return f.index_of_second_covertex();
+ }
+
+ // works for Face_ = Facet and Face_ = Rotor.
+ // NOT DOCUMENTED...
+ template< class Face_ >
+ bool is_boundary_facet(const Face_ & f) const
+ {
+ if( get_visited(neighbor(full_cell(f), index_of_covertex(f))) )
+ return false;
+ if( ! get_visited(full_cell(f)) )
+ return false;
+ return true;
+ }
+
+ // NOT DOCUMENTED...
+ Rotor rotate_rotor(Rotor & f)
+ {
+ int opposite = mirror_index(full_cell(f), index_of_covertex(f));
+ Full_cell_handle s = neighbor(full_cell(f), index_of_covertex(f));
+ int new_second = s->index(vertex(full_cell(f), index_of_second_covertex(f)));
+ return Rotor(s, new_second, opposite);
+ }
+
+ // NICE UPDATE OPERATIONS
+
+protected:
+ void do_insert_increase_dimension(Vertex_handle, Vertex_handle);
+public:
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - REMOVALS
+
+ Vertex_handle collapse_face(const Face &); /* Concept */
+ void remove_decrease_dimension(Vertex_handle, Vertex_handle); /* Concept */
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - INSERTIONS
+
+ Vertex_handle insert_in_full_cell(Full_cell_handle); /* Concept */
+ Vertex_handle insert_in_face(const Face &); /* Concept */
+ Vertex_handle insert_in_facet(const Facet &); /* Concept */
+ template< typename Forward_iterator >
+ Vertex_handle insert_in_hole(Forward_iterator, Forward_iterator, Facet); /* Concept */
+ template< typename Forward_iterator, typename OutputIterator >
+ Vertex_handle insert_in_hole(Forward_iterator, Forward_iterator, Facet, OutputIterator); /* Concept */
+
+ template< typename OutputIterator >
+ Full_cell_handle insert_in_tagged_hole(Vertex_handle, Facet, OutputIterator);
+
+ Vertex_handle insert_increase_dimension(Vertex_handle=Vertex_handle()); /* Concept */
+
+private:
+
+ // Used by insert_in_tagged_hole
+ struct IITH_task
+ {
+ IITH_task(
+ Facet boundary_facet_,
+ int index_of_inside_cell_in_outside_cell_,
+ Full_cell_handle future_neighbor_ = Full_cell_handle(),
+ int new_cell_index_in_future_neighbor_ = -1,
+ int index_of_future_neighbor_in_new_cell_ = -1)
+ : boundary_facet(boundary_facet_),
+ index_of_inside_cell_in_outside_cell(index_of_inside_cell_in_outside_cell_),
+ future_neighbor(future_neighbor_),
+ new_cell_index_in_future_neighbor(new_cell_index_in_future_neighbor_),
+ index_of_future_neighbor_in_new_cell(index_of_future_neighbor_in_new_cell_)
+ {}
+
+ // "new_cell" is the cell about to be created
+ Facet boundary_facet;
+ int index_of_inside_cell_in_outside_cell;
+ Full_cell_handle future_neighbor;
+ int new_cell_index_in_future_neighbor;
+ int index_of_future_neighbor_in_new_cell;
+ };
+
+ // NOT DOCUMENTED
+ void clear_visited_marks(Full_cell_handle) const;
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DANGEROUS UPDATE OPERATIONS
+
+private:
+
+ // NOT DOCUMENTED
+ template< typename FCH > // FCH = Full_cell_[const_]handle
+ bool get_visited(FCH c) const
+ {
+ return c->tds_data().is_visited();
+ }
+
+ // NOT DOCUMENTED
+ template< typename FCH > // FCH = Full_cell_[const_]handle
+ void set_visited(FCH c, bool m) const
+ {
+ if( m )
+ c->tds_data().mark_visited();
+ else
+ c->tds_data().clear_visited();
+ }
+
+public:
+
+ void clear() /* Concept */
+ {
+ clean_dynamic_memory();
+ dcur_ = -2;
+ }
+
+ void set_current_dimension(int d) /* Concept */
+ {
+ CGAL_precondition(-2<=d && d<=maximal_dimension());
+ dcur_ = d;
+ }
+
+ Full_cell_handle new_full_cell(Full_cell_handle s)
+ {
+ return full_cells_.emplace(*s);
+ }
+
+ Full_cell_handle new_full_cell() /* Concept */
+ {
+ return full_cells_.emplace(dmax_);
+ }
+
+ void delete_full_cell(Full_cell_handle s) /* Concept */
+ {
+ CGAL_precondition(Full_cell_handle() != s);
+ // CGAL_expensive_precondition(is_full_cell(s));
+ full_cells_.erase(s);
+ }
+
+ template< typename Forward_iterator >
+ void delete_full_cells(Forward_iterator start, Forward_iterator end) /* Concept */
+ {
+ Forward_iterator s = start;
+ while( s != end )
+ full_cells_.erase(*s++);
+ }
+
+ template< class T >
+ Vertex_handle new_vertex( const T & t )
+ {
+ return vertices_.emplace(t);
+ }
+
+ Vertex_handle new_vertex() /* Concept */
+ {
+ return vertices_.emplace();
+ }
+
+ void delete_vertex(Vertex_handle v) /* Concept */
+ {
+ CGAL_precondition( Vertex_handle() != v );
+ vertices_.erase(v);
+ }
+
+ void associate_vertex_with_full_cell(Full_cell_handle s, int i, Vertex_handle v) /* Concept */
+ {
+ CGAL_precondition(check_range(i));
+ CGAL_precondition(s != Full_cell_handle());
+ CGAL_precondition(v != Vertex_handle());
+ s->set_vertex(i, v);
+ v->set_full_cell(s);
+ }
+
+ void set_neighbors(Full_cell_handle s, int i, Full_cell_handle s1, int j) /* Concept */
+ {
+ CGAL_precondition(check_range(i));
+ CGAL_precondition(check_range(j));
+ CGAL_precondition(s != Full_cell_handle());
+ CGAL_precondition(s1 != Full_cell_handle());
+ s->set_neighbor(i, s1);
+ s1->set_neighbor(j, s);
+ s->set_mirror_index(i, j);
+ s1->set_mirror_index(j, i);
+ }
+
+ // SANITY CHECKS
+
+ bool is_valid(bool = true, int = 0) const; /* Concept */
+
+ // NOT DOCUMENTED
+ template< class OutStream> void write_graph(OutStream &);
+
+ Vertex_iterator vertices_begin() { return vertices_.begin(); } /* Concept */
+ Vertex_iterator vertices_end() { return vertices_.end(); } /* Concept */
+ Full_cell_iterator full_cells_begin() { return full_cells_.begin(); } /* Concept */
+ Full_cell_iterator full_cells_end() { return full_cells_.end(); } /* Concept */
+
+ Vertex_const_iterator vertices_begin() const { return vertices_.begin(); } /* Concept */
+ Vertex_const_iterator vertices_end() const { return vertices_.end(); } /* Concept */
+ Full_cell_const_iterator full_cells_begin() const { return full_cells_.begin(); } /* Concept */
+ Full_cell_const_iterator full_cells_end() const { return full_cells_.end(); } /* Concept */
+
+ Facet_iterator facets_begin() /* Concept */
+ {
+ if( current_dimension() <= 0 )
+ return facets_end();
+ return Facet_iterator(*this);
+ }
+ Facet_iterator facets_end() /* Concept */
+ {
+ return Facet_iterator(*this, 0);
+ }
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - FULL CELL GATHERING
+
+ // a traversal predicate for gathering full_cells incident to a given face
+ // ``incident'' means that the given face is a subface of the full_cell
+ class Incident_full_cell_traversal_predicate
+ {
+ const Face & f_;
+ int dim_;
+ const Triangulation_data_structure & tds_;
+ public:
+ Incident_full_cell_traversal_predicate(const Triangulation_data_structure & tds,
+ const Face & f)
+ : f_(f), tds_(tds)
+ {
+ dim_ = f.face_dimension();
+ }
+ bool operator()(const Facet & facet) const
+ {
+ Vertex_handle v = tds_.full_cell(facet)->vertex(tds_.index_of_covertex(facet));
+ for( int i = 0; i <= dim_; ++i )
+ {
+ if( v == f_.vertex(i) )
+ return false;
+ }
+ return true;
+ }
+ };
+
+ // a traversal predicate for gathering full_cells having a given face as subface
+ class Star_traversal_predicate
+ {
+ const Face & f_;
+ int dim_;
+ const Triangulation_data_structure & tds_;
+ public:
+ Star_traversal_predicate(const Triangulation_data_structure & tds,
+ const Face & f)
+ : f_(f), tds_(tds)
+ {
+ dim_ = f.face_dimension();
+ }
+ bool operator()(const Facet & facet) const
+ {
+ Full_cell_handle s = tds_.full_cell(facet)->neighbor(tds_.index_of_covertex(facet));
+ for( int j = 0; j <= tds_.current_dimension(); ++j )
+ {
+ for( int i = 0; i <= dim_; ++i )
+ if( s->vertex(j) == f_.vertex(i) )
+ return true;
+ }
+ return false;
+ }
+ };
+
+ template< typename TraversalPredicate, typename OutputIterator >
+ Facet gather_full_cells(Full_cell_handle, TraversalPredicate &, OutputIterator &) const; /* Concept */
+ template< typename OutputIterator >
+ OutputIterator incident_full_cells(const Face &, OutputIterator) const; /* Concept */
+ template< typename OutputIterator >
+ OutputIterator incident_full_cells(Vertex_const_handle, OutputIterator) const; /* Concept */
+ template< typename OutputIterator >
+ OutputIterator star(const Face &, OutputIterator) const; /* Concept */
+#ifndef CGAL_CFG_NO_CPP0X_DEFAULT_TEMPLATE_ARGUMENTS_FOR_FUNCTION_TEMPLATES
+ template< typename OutputIterator, typename Comparator = std::less<Vertex_const_handle> >
+ OutputIterator incident_upper_faces(Vertex_const_handle v, int dim, OutputIterator out, Comparator cmp = Comparator())
+ {
+ return incident_faces(v, dim, out, cmp, true);
+ }
+ template< typename OutputIterator, typename Comparator = std::less<Vertex_const_handle> >
+ OutputIterator incident_faces(Vertex_const_handle, int, OutputIterator, Comparator = Comparator(), bool = false) const;
+#else
+ template< typename OutputIterator, typename Comparator >
+ OutputIterator incident_upper_faces(Vertex_const_handle v, int dim, OutputIterator out, Comparator cmp = Comparator())
+ {
+ return incident_faces(v, dim, out, cmp, true);
+ }
+ template< typename OutputIterator >
+ OutputIterator incident_upper_faces(Vertex_const_handle v, int dim, OutputIterator out)
+ {
+ return incident_faces(v, dim, out, std::less<Vertex_const_handle>(), true);
+ }
+ template< typename OutputIterator, typename Comparator >
+ OutputIterator incident_faces(Vertex_const_handle, int, OutputIterator, Comparator = Comparator(), bool = false) const;
+ template< typename OutputIterator >
+ OutputIterator incident_faces(Vertex_const_handle, int, OutputIterator,
+ std::less<Vertex_const_handle> = std::less<Vertex_const_handle>(), bool = false) const;
+#endif
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - INPUT / OUTPUT
+
+ std::istream & read_full_cells(std::istream &, const std::vector<Vertex_handle> &);
+ std::ostream & write_full_cells(std::ostream &, std::map<Vertex_const_handle, int> &) const;
+
+}; // end of ``declaration/definition'' of Triangulation_data_structure<...>
+
+// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
+
+// FUNCTIONS THAT ARE MEMBER FUNCTIONS:
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// - - - - - - - - - - - - - - - - - - - - - - - - THE GATHERING METHODS
+
+template< class Dim, class Vb, class Fcb >
+template< typename OutputIterator >
+OutputIterator
+Triangulation_data_structure<Dim, Vb, Fcb>
+::incident_full_cells(const Face & f, OutputIterator out) const /* Concept */
+{
+ // CGAL_expensive_precondition_msg(is_full_cell(f.full_cell()), "the facet does not belong to the Triangulation");
+ Incident_full_cell_traversal_predicate tp(*this, f);
+ gather_full_cells(f.full_cell(), tp, out);
+ return out;
+}
+
+template< class Dim, class Vb, class Fcb >
+template< typename OutputIterator >
+OutputIterator
+Triangulation_data_structure<Dim, Vb, Fcb>
+::incident_full_cells(Vertex_const_handle v, OutputIterator out) const /* Concept */
+{
+// CGAL_expensive_precondition(is_vertex(v));
+ CGAL_precondition(Vertex_handle() != v);
+ Face f(v->full_cell());
+ f.set_index(0, v->full_cell()->index(v));
+ return incident_full_cells(f, out);
+}
+
+template< class Dim, class Vb, class Fcb >
+template< typename OutputIterator >
+OutputIterator
+Triangulation_data_structure<Dim, Vb, Fcb>
+::star(const Face & f, OutputIterator out) const /* Concept */
+{
+ // CGAL_precondition_msg(is_full_cell(f.full_cell()), "the facet does not belong to the Triangulation");
+ Star_traversal_predicate tp(*this, f);
+ gather_full_cells(f.full_cell(), tp, out);
+ return out;
+}
+
+template< class Dim, class Vb, class Fcb >
+template< typename TraversalPredicate, typename OutputIterator >
+typename Triangulation_data_structure<Dim, Vb, Fcb>::Facet
+Triangulation_data_structure<Dim, Vb, Fcb>
+::gather_full_cells(Full_cell_handle start,
+ TraversalPredicate & tp,
+ OutputIterator & out) const /* Concept */
+{
+ std::queue<Full_cell_handle> queue;
+ set_visited(start, true);
+ queue.push(start);
+ const int cur_dim = current_dimension();
+ Facet ft;
+ while( ! queue.empty() )
+ {
+ Full_cell_handle s = queue.front();
+ queue.pop();
+ *out = s;
+ ++out;
+ for( int i = 0; i <= cur_dim; ++i )
+ {
+ Full_cell_handle n = s->neighbor(i);
+ if( ! get_visited(n) )
+ {
+ set_visited(n, true);
+ if( tp(Facet(s, i)) )
+ queue.push(n);
+ else
+ ft = Facet(s, i);
+ }
+ }
+ }
+ clear_visited_marks(start);
+ return ft;
+}
+
+#ifdef CGAL_CFG_NO_CPP0X_DEFAULT_TEMPLATE_ARGUMENTS_FOR_FUNCTION_TEMPLATES
+template< class Dim, class Vb, class Fcb >
+template< typename OutputIterator >
+OutputIterator
+Triangulation_data_structure<Dim, Vb, Fcb>
+::incident_faces(Vertex_const_handle v, int dim, OutputIterator out,
+ std::less<Vertex_const_handle> cmp, bool upper_faces) const
+{
+ return incident_faces<OutputIterator, std::less<Vertex_const_handle> >(v, dim, out, cmp, upper_faces);
+}
+#endif
+
+template< class Dim, class Vb, class Fcb >
+template< typename OutputIterator, typename Comparator >
+OutputIterator
+Triangulation_data_structure<Dim, Vb, Fcb>
+::incident_faces(Vertex_const_handle v, int dim, OutputIterator out, Comparator cmp, bool upper_faces) const
+{
+ CGAL_precondition( 0 < dim );
+ if( dim >= current_dimension() )
+ return out;
+ typedef std::vector<Full_cell_handle> Simplices;
+ Simplices simps;
+ simps.reserve(64);
+ // gather incident full_cells
+ std::back_insert_iterator<Simplices> sout(simps);
+ incident_full_cells(v, sout);
+ // for storing the handles to the vertices of a full_cell
+ typedef std::vector<Vertex_const_handle> Vertices;
+ typedef std::vector<int> Indices;
+ Vertices vertices(1 + current_dimension());
+ Indices sorted_idx(1 + current_dimension());
+ // setup Face comparator and Face_set
+ typedef internal::Triangulation::Compare_faces_with_common_first_vertex<Self>
+ Upper_face_comparator;
+ Upper_face_comparator ufc(dim);
+ typedef std::set<Face, Upper_face_comparator> Face_set;
+ Face_set face_set(ufc);
+ for( typename Simplices::const_iterator s = simps.begin(); s != simps.end(); ++s )
+ {
+ int v_idx(0); // the index of |v| in the sorted full_cell
+ // get the vertices of the full_cell and sort them
+ for( int i = 0; i <= current_dimension(); ++i )
+ vertices[i] = (*s)->vertex(i);
+ if( upper_faces )
+ {
+ std::sort(vertices.begin(), vertices.end(), cmp);
+ while( vertices[v_idx] != v )
+ ++v_idx;
+ }
+ else
+ {
+ while( vertices[v_idx] != v )
+ ++v_idx;
+ if( 0 != v_idx )
+ std::swap(vertices[0], vertices[v_idx]);
+ v_idx = 0;
+ typename Vertices::iterator vbegin(vertices.begin());
+ ++vbegin;
+ std::sort(vbegin, vertices.end(), cmp);
+ }
+ if( v_idx + dim > current_dimension() )
+ continue; // |v| is too far to the right
+ // stores the index of the vertices of s in the same order
+ // as in |vertices|:
+ for( int i = 0; i <= current_dimension(); ++i )
+ sorted_idx[i] = (*s)->index(vertices[i]);
+ // init state for enumerating all candidate faces:
+ internal::Combination_enumerator f_idx(dim, v_idx + 1, current_dimension());
+ Face f(*s);
+ f.set_index(0, sorted_idx[v_idx]);
+ while( ! f_idx.end() )
+ {
+ for( int i = 0; i < dim; ++i )
+ f.set_index(1 + i, sorted_idx[f_idx[i]]);
+ face_set.insert(f); // checks if face has already been found
+
+ // compute next sorted face (lexicographic enumeration)
+ ++f_idx;
+ }
+ }
+ typename Face_set::iterator fit = face_set.begin();
+ while( fit != face_set.end() )
+ *out++ = *fit++;
+ return out;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// - - - - - - - - - - - - - - - - - - - - - - - - THE REMOVAL METHODS
+
+template <class Dim, class Vb, class Fcb>
+typename Triangulation_data_structure<Dim, Vb, Fcb>::Vertex_handle
+Triangulation_data_structure<Dim, Vb, Fcb>
+::collapse_face(const Face & f) /* Concept */
+{
+ const int fd = f.face_dimension();
+ CGAL_precondition( (1 <= fd ) && (fd < current_dimension()));
+ std::vector<Full_cell_handle> simps;
+ // save the Face's vertices:
+ Full_cell s;
+ for( int i = 0; i <= fd; ++i )
+ s.set_vertex(i, f.vertex(i));
+ // compute the star of f
+ simps.reserve(64);
+ std::back_insert_iterator<std::vector<Full_cell_handle> > out(simps);
+ star(f, out);
+ Vertex_handle v = insert_in_hole(simps.begin(), simps.end(), Facet(f.full_cell(), f.index(0)));
+ for( int i = 0; i <= fd; ++i )
+ delete_vertex(s.vertex(i));
+ return v;
+}
+
+template <class Dim, class Vb, class Fcb>
+void
+Triangulation_data_structure<Dim, Vb, Fcb>
+::remove_decrease_dimension(Vertex_handle v, Vertex_handle star) /* Concept */
+{
+ CGAL_assertion( current_dimension() >= -1 );
+ if( -1 == current_dimension() )
+ {
+ clear();
+ return;
+ }
+ else if( 0 == current_dimension() )
+ {
+ delete_full_cell(v->full_cell());
+ delete_vertex(v);
+ star->full_cell()->set_neighbor(0, Full_cell_handle());
+ set_current_dimension(-1);
+ return;
+ }
+ else if( 1 == current_dimension() )
+ {
+ Full_cell_handle s = v->full_cell();
+ int star_index;
+ if( s->has_vertex(star, star_index) )
+ s = s->neighbor(star_index);
+ // Here, |star| is not a vertex of |s|, so it's the only finite
+ // full_cell
+ Full_cell_handle inf1 = s->neighbor(0);
+ Full_cell_handle inf2 = s->neighbor(1);
+ Vertex_handle v2 = s->vertex(1 - s->index(v));
+ delete_vertex(v);
+ delete_full_cell(s);
+ inf1->set_vertex(1, Vertex_handle());
+ inf1->set_vertex(1, Vertex_handle());
+ inf2->set_neighbor(1, Full_cell_handle());
+ inf2->set_neighbor(1, Full_cell_handle());
+ associate_vertex_with_full_cell(inf1, 0, star);
+ associate_vertex_with_full_cell(inf2, 0, v2);
+ set_neighbors(inf1, 0, inf2, 0);
+ set_current_dimension(0);
+ return;
+ }
+ typedef std::vector<Full_cell_handle> Simplices;
+ Simplices simps;
+ incident_full_cells(v, std::back_inserter(simps));
+ for( typename Simplices::iterator it = simps.begin(); it != simps.end(); ++it )
+ {
+ int v_idx = (*it)->index(v);
+ if( ! (*it)->has_vertex(star) )
+ {
+ delete_full_cell((*it)->neighbor(v_idx));
+ for( int i = 0; i <= current_dimension(); ++i )
+ (*it)->vertex(i)->set_full_cell(*it);
+ }
+ else
+ star->set_full_cell(*it);
+ if( v_idx != current_dimension() )
+ {
+ (*it)->swap_vertices(v_idx, current_dimension());
+ (*it)->swap_vertices(current_dimension() - 2, current_dimension() - 1);
+ }
+ (*it)->set_vertex(current_dimension(), Vertex_handle());
+ (*it)->set_neighbor(current_dimension(), Full_cell_handle());
+ }
+ set_current_dimension(current_dimension()-1);
+ delete_vertex(v);
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// - - - - - - - - - - - - - - - - - - - - - - - - THE INSERTION METHODS
+
+template <class Dim, class Vb, class Fcb>
+typename Triangulation_data_structure<Dim, Vb, Fcb>::Vertex_handle
+Triangulation_data_structure<Dim, Vb, Fcb>
+::insert_in_full_cell(Full_cell_handle s) /* Concept */
+{
+ CGAL_precondition(0 < current_dimension());
+ CGAL_precondition(Full_cell_handle() != s);
+ // CGAL_expensive_precondition(is_full_cell(s));
+
+ const int cur_dim = current_dimension();
+ Vertex_handle v = new_vertex();
+ // the full_cell 'fc' is just used to store the handle to all the new full_cells.
+ Full_cell fc(maximal_dimension());
+ for( int i = 1; i <= cur_dim; ++i )
+ {
+ Full_cell_handle new_s = new_full_cell(s);
+ fc.set_neighbor(i, new_s);
+ associate_vertex_with_full_cell(new_s, i, v);
+ s->vertex(i-1)->set_full_cell(new_s);
+ set_neighbors(new_s, i, neighbor(s, i), mirror_index(s, i));
+ }
+ fc.set_neighbor(0, s);
+ associate_vertex_with_full_cell(s, 0, v);
+ for( int i = 0; i <= cur_dim; ++i )
+ for( int j = 0; j <= cur_dim; ++j )
+ {
+ if( j == i ) continue;
+ set_neighbors(fc.neighbor(i), j, fc.neighbor(j), i);
+ }
+ return v;
+}
+
+template <class Dim, class Vb, class Fcb >
+typename Triangulation_data_structure<Dim, Vb, Fcb>::Vertex_handle
+Triangulation_data_structure<Dim, Vb, Fcb>
+::insert_in_face(const Face & f) /* Concept */
+{
+ std::vector<Full_cell_handle> simps;
+ simps.reserve(64);
+ std::back_insert_iterator<std::vector<Full_cell_handle> > out(simps);
+ incident_full_cells(f, out);
+ return insert_in_hole(simps.begin(), simps.end(), Facet(f.full_cell(), f.index(0)));
+}
+template <class Dim, class Vb, class Fcb >
+typename Triangulation_data_structure<Dim, Vb, Fcb>::Vertex_handle
+Triangulation_data_structure<Dim, Vb, Fcb>
+::insert_in_facet(const Facet & ft) /* Concept */
+{
+ Full_cell_handle s[2];
+ s[0] = full_cell(ft);
+ int i = index_of_covertex(ft);
+ s[1] = s[0]->neighbor(i);
+ i = ( i + 1 ) % current_dimension();
+ return insert_in_hole(s, s+2, Facet(s[0], i));
+}
+
+template <class Dim, class Vb, class Fcb >
+template < typename OutputIterator >
+typename Triangulation_data_structure<Dim, Vb, Fcb>::Full_cell_handle
+Triangulation_data_structure<Dim, Vb, Fcb>
+::insert_in_tagged_hole(Vertex_handle v, Facet f,
+ OutputIterator new_full_cells)
+{
+ CGAL_assertion_msg(is_boundary_facet(f), "starting facet should be on the hole boundary");
+
+ const int cur_dim = current_dimension();
+ Full_cell_handle new_s;
+
+ std::queue<IITH_task> task_queue;
+ task_queue.push(
+ IITH_task(f, mirror_index(full_cell(f), index_of_covertex(f))) );
+
+ while (!task_queue.empty())
+ {
+ IITH_task task = task_queue.front();
+ task_queue.pop();
+
+ Full_cell_handle old_s = full_cell(task.boundary_facet);
+ const int facet_index = index_of_covertex(task.boundary_facet);
+
+ Full_cell_handle outside_neighbor = neighbor(old_s, facet_index);
+ // Here, "new_s" might actually be a new cell, but it might also be "old_s"
+ // if it has not been treated already in the meantime
+ new_s = neighbor(outside_neighbor, task.index_of_inside_cell_in_outside_cell);
+ // If the cell has not been treated yet
+ if (old_s == new_s)
+ {
+ new_s = new_full_cell();
+
+ int i(0);
+ for ( ; i < facet_index ; ++i)
+ associate_vertex_with_full_cell(new_s, i, old_s->vertex(i));
+ ++i; // skip facet_index
+ for ( ; i <= cur_dim ; ++i)
+ associate_vertex_with_full_cell(new_s, i, old_s->vertex(i));
+ associate_vertex_with_full_cell(new_s, facet_index, v);
+ set_neighbors(new_s,
+ facet_index,
+ outside_neighbor,
+ mirror_index(old_s, facet_index));
+
+ // add the new full_cell to the list of new full_cells
+ *new_full_cells++ = new_s;
+
+ // check all of |Facet f|'s neighbors
+ for (i = 0 ; i <= cur_dim ; ++i)
+ {
+ if (facet_index == i)
+ continue;
+ // we define a |Rotor| because it makes it easy to rotate around
+ // in a self contained fashion. The corresponding potential
+ // boundary facet is Facet(full_cell(rot), index_of_covertex(rot))
+ Rotor rot(old_s, i, facet_index);
+ // |rot| on line above, stands for Candidate Facet
+ while (!is_boundary_facet(rot))
+ rot = rotate_rotor(rot);
+
+ // we did find the |i|-th neighbor of Facet(old_s, facet_index)...
+ // has it already been extruded to center point |v| ?
+ Full_cell_handle inside = full_cell(rot);
+ Full_cell_handle outside = neighbor(inside, index_of_covertex(rot));
+ // "m" is the vertex of outside which is not on the boundary
+ Vertex_handle m = inside->mirror_vertex(index_of_covertex(rot), current_dimension()); // CJTODO: use mirror_index?
+ // "index" is the index of m in "outside"
+ int index = outside->index(m);
+ // new_neighbor is the inside cell which is registered as the neighbor
+ // of the outside cell => it's either a newly created inside cell or an
+ // old inside cell which we are about to delete
+ Full_cell_handle new_neighbor = outside->neighbor(index);
+
+ // Is new_neighbor still the old neighbor?
+ if (new_neighbor == inside)
+ {
+ task_queue.push(IITH_task(
+ Facet(inside, index_of_covertex(rot)), // boundary facet
+ index, // index_of_inside_cell_in_outside_cell
+ new_s, // future_neighbor
+ i, // new_cell_index_in_future_neighbor
+ index_of_second_covertex(rot) // index_of_future_neighbor_in_new_cell
+ ));
+ }
+ }
+ }
+
+ // If there is some neighbor stories to fix
+ if (task.future_neighbor != Full_cell_handle())
+ {
+ // now the new neighboring full_cell exists, we link both
+ set_neighbors(new_s,
+ task.index_of_future_neighbor_in_new_cell,
+ task.future_neighbor,
+ task.new_cell_index_in_future_neighbor);
+ }
+ }
+
+ return new_s;
+}
+
+template< class Dim, class Vb, class Fcb >
+template< typename Forward_iterator, typename OutputIterator >
+typename Triangulation_data_structure<Dim, Vb, Fcb>::Vertex_handle
+Triangulation_data_structure<Dim, Vb, Fcb>
+::insert_in_hole(Forward_iterator start, Forward_iterator end, Facet f,
+ OutputIterator out) /* Concept */
+{
+ CGAL_expensive_precondition(
+ ( std::distance(start, end) == 1 )
+ || ( current_dimension() > 1 ) );
+ Forward_iterator sit = start;
+ while( end != sit )
+ set_visited(*sit++, true);
+ Vertex_handle v = new_vertex();
+ insert_in_tagged_hole(v, f, out);
+ delete_full_cells(start, end);
+ return v;
+}
+
+template< class Dim, class Vb, class Fcb >
+template< typename Forward_iterator >
+typename Triangulation_data_structure<Dim, Vb, Fcb>::Vertex_handle
+Triangulation_data_structure<Dim, Vb, Fcb>
+::insert_in_hole(Forward_iterator start, Forward_iterator end, Facet f) /* Concept */
+{
+ Emptyset_iterator out;
+ return insert_in_hole(start, end, f, out);
+}
+
+template <class Dim, class Vb, class Fcb>
+void
+Triangulation_data_structure<Dim, Vb, Fcb>
+::clear_visited_marks(Full_cell_handle start) const // NOT DOCUMENTED
+{
+ CGAL_precondition(start != Full_cell_handle());
+
+ std::queue<Full_cell_handle> queue;
+ set_visited(start, false);
+ queue.push(start);
+ const int cur_dim = current_dimension();
+ while( ! queue.empty() )
+ {
+ Full_cell_handle s = queue.front();
+ queue.pop();
+ for( int i = 0; i <= cur_dim; ++i )
+ {
+ if( get_visited(s->neighbor(i)) )
+ {
+ set_visited(s->neighbor(i), false);
+ queue.push(s->neighbor(i));
+ }
+ }
+ }
+}
+
+template <class Dim, class Vb, class Fcb>
+void Triangulation_data_structure<Dim, Vb, Fcb>
+::do_insert_increase_dimension(Vertex_handle x, Vertex_handle star)
+{
+ Full_cell_handle start = full_cells_begin();
+ Full_cell_handle swap_me;
+ const int cur_dim = current_dimension();
+ for( Full_cell_iterator S = full_cells_begin(); S != full_cells_end(); ++S )
+ {
+ if( Vertex_handle() != S->vertex(cur_dim) )
+ continue;
+ set_visited(S, true);
+ // extends full_cell |S| to include the new vertex as the
+ // current_dimension()-th vertex
+ associate_vertex_with_full_cell(S, cur_dim, x);
+ if( ! S->has_vertex(star) )
+ { // S is bounded, we create its unbounded "twin" full_cell
+ Full_cell_handle S_new = new_full_cell();
+ set_neighbors(S, cur_dim, S_new, 0);
+ associate_vertex_with_full_cell(S_new, 0, star);
+ // here, we could be clever so as to get consistent orientation
+ for( int k = 1; k <= cur_dim; ++k )
+ associate_vertex_with_full_cell(S_new, k, vertex(S, k - 1));
+ }
+ }
+ // now we setup the neighbors
+ set_visited(start, false);
+ std::queue<Full_cell_handle> queue;
+ queue.push(start);
+ while( ! queue.empty() )
+ {
+ Full_cell_handle S = queue.front();
+ queue.pop();
+ // here, the first visit above ensured that all neighbors exist now.
+ // Now we need to connect them with adjacency relation
+ int star_index;
+ if( S->has_vertex(star, star_index) )
+ {
+ set_neighbors( S, cur_dim, neighbor(neighbor(S, star_index), cur_dim),
+ // this is tricky :-) :
+ mirror_index(S, star_index) + 1);
+ }
+ else
+ {
+ Full_cell_handle S_new = neighbor(S, cur_dim);
+ for( int k = 0 ; k < cur_dim ; ++k )
+ {
+ Full_cell_handle S_opp = neighbor(S, k);
+ if( ! S_opp->has_vertex(star) )
+ set_neighbors(S_new, k + 1, neighbor(S_opp, cur_dim), mirror_index(S, k) + 1);
+ // neighbor of S_new opposite to v is S_new'
+ // the vertex opposite to v remains the same but ...
+ // remember the shifting of the vertices one step to the right
+ }
+ }
+ for( int k = 0 ; k < cur_dim ; ++k )
+ if( get_visited(neighbor(S, k)) )
+ {
+ set_visited(neighbor(S, k), false);
+ queue.push(neighbor(S, k));
+ }
+ }
+ if( ( ( cur_dim % 2 ) == 0 ) && ( cur_dim > 1 ) )
+ {
+ for( Full_cell_iterator S = full_cells_begin(); S != full_cells_end(); ++S )
+ {
+ if( x != S->vertex(cur_dim) )
+ S->swap_vertices(cur_dim - 1, cur_dim);
+ }
+ }
+ if( Full_cell_handle() != swap_me )
+ swap_me->swap_vertices(1, 2);
+}
+
+template <class Dim, class Vb, class Fcb>
+typename Triangulation_data_structure<Dim, Vb, Fcb>::Vertex_handle
+Triangulation_data_structure<Dim, Vb, Fcb>
+::insert_increase_dimension(Vertex_handle star) /* Concept */
+{
+ const int prev_cur_dim = current_dimension();
+ CGAL_precondition(prev_cur_dim < maximal_dimension());
+ if( -2 != current_dimension() )
+ {
+ CGAL_precondition( Vertex_handle() != star );
+ CGAL_expensive_precondition(is_vertex(star));
+ }
+
+ set_current_dimension(prev_cur_dim + 1);
+ Vertex_handle v = new_vertex();
+ switch( prev_cur_dim )
+ {
+ case -2:
+ { // insertion of the first vertex
+ // ( geometrically : infinite vertex )
+ Full_cell_handle s = new_full_cell();
+ associate_vertex_with_full_cell(s, 0, v);
+ break;
+ }
+ case -1:
+ { // insertion of the second vertex
+ // ( geometrically : first finite vertex )
+ //we create a triangulation of the 0-sphere, with
+ // vertices |star| and |v|
+ Full_cell_handle infinite_full_cell = star->full_cell();
+ Full_cell_handle finite_full_cell = new_full_cell();
+ associate_vertex_with_full_cell(finite_full_cell, 0, v);
+ set_neighbors(infinite_full_cell, 0, finite_full_cell, 0);
+ break;
+ }
+ default:
+ do_insert_increase_dimension(v, star);
+ break;
+ }
+ return v;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// - - - - - - - - - - - - - - - - - - - - - - - - VALIDITY CHECKS
+
+template <class Dimen, class Vb, class Fcb>
+bool Triangulation_data_structure<Dimen, Vb, Fcb>
+::is_valid(bool verbose, int /* level */) const /* Concept */
+{
+ Full_cell_const_handle s, t;
+ Vertex_const_handle v;
+ int i, j, k;
+
+ if( current_dimension() == -2 )
+ {
+ if( ! vertices_.empty() || ! full_cells_.empty() )
+ {
+ if( verbose ) CGAL_warning_msg(false, "current dimension is -2 but there are vertices or full_cells");
+ return false;
+ }
+ }
+
+ if( current_dimension() == -1 )
+ {
+ if ( (number_of_vertices() != 1) || (number_of_full_cells() != 1) )
+ {
+ if( verbose ) CGAL_warning_msg(false, "current dimension is -1 but there isn't one vertex and one full_cell");
+ return false;
+ }
+ }
+
+ for( v = vertices_begin(); v != vertices_end(); ++v )
+ {
+ if( ! v->is_valid(verbose) )
+ return false;
+ }
+
+ // FUTURE: for each vertex v, gather incident full_cells. then, check that
+ // any full_cell containing v is among those gathered full_cells...
+
+ if( current_dimension() < 0 )
+ return true;
+
+ for( s = full_cells_begin(); s != full_cells_end(); ++s )
+ {
+ if( ! s->is_valid(verbose) )
+ return false;
+ // check that the full cell has no duplicate vertices
+ for( i = 0; i <= current_dimension(); ++i )
+ for( j = i + 1; j <= current_dimension(); ++j )
+ if( vertex(s,i) == vertex(s,j) )
+ {
+ CGAL_warning_msg(false, "a full_cell has two equal vertices");
+ return false;
+ }
+ }
+
+ for( s = full_cells_begin(); s != full_cells_end(); ++s )
+ {
+ for( i = 0; i <= current_dimension(); ++i )
+ if( (t = neighbor(s,i)) != Full_cell_const_handle() )
+ {
+ int l = mirror_index(s,i);
+ if( s != neighbor(t,l) || i != mirror_index(t,l) )
+ {
+ if( verbose ) CGAL_warning_msg(false, "neighbor relation is not symmetric");
+ return false;
+ }
+ for( j = 0; j <= current_dimension(); ++j )
+ if( j != i )
+ {
+ // j must also occur as a vertex of t
+ for( k = 0; k <= current_dimension() && ( vertex(s,j) != vertex(t,k) || k == l); ++k )
+ ;
+ if( k > current_dimension() )
+ {
+ if( verbose ) CGAL_warning_msg(false, "too few shared vertices between neighbors full_cells.");
+ return false;
+ }
+ }
+ }
+ else
+ {
+ if( verbose ) CGAL_warning_msg(false, "full_cell has a NULL neighbor");
+ return false;
+ }
+ }
+ return true;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+// - - - - - - - - - - - - - - - - - - - - - - - - INPUT / OUTPUT
+
+// NOT DOCUMENTED
+template <class Dim, class Vb, class Fcb>
+template <class OutStream>
+void Triangulation_data_structure<Dim, Vb, Fcb>
+::write_graph(OutStream & os)
+{
+ std::vector<std::set<int> > edges;
+ os << number_of_vertices() + 1; // add the vertex at infinity
+ int count(1);
+ for( Vertex_iterator vit = vertices_begin(); vit != vertices_end(); ++vit )
+ vit->idx_ = count++;
+ edges.resize(number_of_vertices()+1);
+ for( Full_cell_iterator sit = full_cells_begin(); sit != full_cells_end(); ++sit )
+ {
+ int v1 = 0;
+ while( v1 < current_dimension() )
+ {
+ int v2 = v1 + 1;
+ while( v2 <= current_dimension() )
+ {
+ int i1, i2;
+ if( Vertex_handle() != sit-> vertex(v1) )
+ i1 = sit->vertex(v1)->idx_;
+ else
+ i1 = 0;
+ if( Vertex_handle() != sit-> vertex(v2) )
+ i2 = sit->vertex(v2)->idx_;
+ else
+ i2 = 0;
+ edges[i1].insert(i2);
+ edges[i2].insert(i1);
+ ++v2;
+ }
+ ++v1;
+ }
+ }
+ for( std::size_t i = 0; i < edges.size(); ++i )
+ {
+ os << std::endl << edges[i].size();
+ for( std::set<int>::const_iterator nit = edges[i].begin();
+ nit != edges[i].end(); ++nit )
+ {
+ os << ' ' << (*nit);
+ }
+ }
+}
+
+// NOT DOCUMENTED...
+template<class Dimen, class Vb, class Fcb>
+std::istream &
+Triangulation_data_structure<Dimen, Vb, Fcb>
+::read_full_cells(std::istream & is, const std::vector<Vertex_handle> & vertices)
+{
+ std::size_t m; // number of full_cells
+ int index;
+ const int cd = current_dimension();
+ if( is_ascii(is) )
+ is >> m;
+ else
+ read(is, m, io_Read_write());
+
+ std::vector<Full_cell_handle> full_cells;
+ full_cells.reserve(m);
+ // read the vertices of each full_cell
+ std::size_t i = 0;
+ while( i < m )
+ {
+ Full_cell_handle s = new_full_cell();
+ full_cells.push_back(s);
+ for( int j = 0; j <= cd; ++j )
+ {
+ if( is_ascii(is) )
+ is >> index;
+ else
+ read(is, index);
+ s->set_vertex(j, vertices[index]);
+ }
+ // read other non-combinatorial information for the full_cells
+ is >> (*s);
+ ++i;
+ }
+
+ // read the neighbors of each full_cell
+ i = 0;
+ if( is_ascii(is) )
+ while( i < m )
+ {
+ for( int j = 0; j <= cd; ++j )
+ {
+ is >> index;
+ full_cells[i]->set_neighbor(j, full_cells[index]);
+ }
+ ++i;
+ }
+ else
+ while( i < m )
+ {
+ for( int j = 0; j <= cd; ++j )
+ {
+ read(is, index);
+ full_cells[i]->set_neighbor(j, full_cells[index]);
+ }
+ ++i;
+ }
+
+ // compute the mirror indices
+ for( i = 0; i < m; ++i )
+ {
+ Full_cell_handle s = full_cells[i];
+ for( int j = 0; j <= cd; ++j )
+ {
+ if( -1 != s->mirror_index(j) )
+ continue;
+ Full_cell_handle n = s->neighbor(j);
+ int k = 0;
+ Full_cell_handle nn = n->neighbor(k);
+ while( s != nn )
+ nn = n->neighbor(++k);
+ s->set_mirror_index(j,k);
+ n->set_mirror_index(k,j);
+ }
+ }
+ return is;
+}
+
+// NOT DOCUMENTED...
+template<class Dimen, class Vb, class Fcb>
+std::ostream &
+Triangulation_data_structure<Dimen, Vb, Fcb>
+::write_full_cells(std::ostream & os, std::map<Vertex_const_handle, int> & index_of_vertex) const
+{
+ std::map<Full_cell_const_handle, int> index_of_full_cell;
+
+ std::size_t m = number_of_full_cells();
+
+ if( is_ascii(os) )
+ os << std::endl << m;
+ else
+ write(os, m, io_Read_write());
+
+ const int cur_dim = current_dimension();
+ // write the vertex indices of each full_cell
+ int i = 0;
+ for( Full_cell_const_iterator it = full_cells_begin(); it != full_cells_end(); ++it )
+ {
+ index_of_full_cell[it] = i++;
+ if( is_ascii(os) )
+ os << std::endl;
+ for( int j = 0; j <= cur_dim; ++j )
+ {
+ if( is_ascii(os) )
+ os << ' ' << index_of_vertex[it->vertex(j)];
+ else
+ write(os, index_of_vertex[it->vertex(j)]);
+ }
+ // write other non-combinatorial information for the full_cells
+ os << (*it);
+ }
+
+ CGAL_assertion( (std::size_t) i == m );
+
+ // write the neighbors of each full_cell
+ if( is_ascii(os) )
+ for( Full_cell_const_iterator it = full_cells_begin(); it != full_cells_end(); ++it )
+ {
+ os << std::endl;
+ for( int j = 0; j <= cur_dim; ++j )
+ os << ' ' << index_of_full_cell[it->neighbor(j)];
+ }
+ else
+ for( Full_cell_const_iterator it = full_cells_begin(); it != full_cells_end(); ++it )
+ {
+ for( int j = 0; j <= cur_dim; ++j )
+ write(os, index_of_full_cell[it->neighbor(j)]);
+ }
+
+ return os;
+}
+
+// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
+
+// FUNCTIONS THAT ARE NOT MEMBER FUNCTIONS:
+
+template<class Dimen, class Vb, class Fcb>
+std::istream &
+operator>>(std::istream & is, Triangulation_data_structure<Dimen, Vb, Fcb> & tr)
+ // reads :
+ // - the dimensions (maximal and current)
+ // - the number of finite vertices
+ // - the non combinatorial information on vertices (point, etc)
+ // - the number of full_cells
+ // - the full_cells by the indices of their vertices in the preceding list
+ // of vertices, plus the non combinatorial information on each full_cell
+ // - the neighbors of each full_cell by their index in the preceding list
+{
+ typedef Triangulation_data_structure<Dimen, Vb, Fcb> TDS;
+ typedef typename TDS::Vertex_handle Vertex_handle;
+
+ // read current dimension and number of vertices
+ std::size_t n;
+ int cd;
+ if( is_ascii(is) )
+ is >> cd >> n;
+ else
+ {
+ read(is, cd);
+ read(is, n, io_Read_write());
+ }
+
+ CGAL_assertion_msg( cd <= tr.maximal_dimension(), "input Triangulation_data_structure has too high dimension");
+
+ tr.clear();
+ tr.set_current_dimension(cd);
+
+ if( n == 0 )
+ return is;
+
+ std::vector<Vertex_handle> vertices;
+ vertices.resize(n);
+
+ // read the vertices:
+ std::size_t i(0);
+ while( i < n )
+ {
+ vertices[i] = tr.new_vertex();
+ is >> (*vertices[i]); // read a vertex
+ ++i;
+ }
+
+ // now, read the combinatorial information
+ return tr.read_full_cells(is, vertices);
+}
+
+template<class Dimen, class Vb, class Fcb>
+std::ostream &
+operator<<(std::ostream & os, const Triangulation_data_structure<Dimen, Vb, Fcb> & tr)
+ // writes :
+ // - the dimensions (maximal and current)
+ // - the number of finite vertices
+ // - the non combinatorial information on vertices (point, etc)
+ // - the number of full cells
+ // - the full cells by the indices of their vertices in the preceding list
+ // of vertices, plus the non combinatorial information on each full_cell
+ // - the neighbors of each full_cell by their index in the preceding list
+{
+ typedef Triangulation_data_structure<Dimen, Vb, Fcb> TDS;
+ typedef typename TDS::Vertex_const_handle Vertex_handle;
+ typedef typename TDS::Vertex_const_iterator Vertex_iterator;
+
+ // outputs dimension and number of vertices
+ std::size_t n = tr.number_of_vertices();
+ if( is_ascii(os) )
+ os << tr.current_dimension() << std::endl << n;
+ else
+ {
+ write(os, tr.current_dimension());
+ write(os, n, io_Read_write());
+ }
+
+ if( n == 0 )
+ return os;
+
+ // write the vertices
+ std::map<Vertex_handle, int> index_of_vertex;
+ int i = 0;
+ for( Vertex_iterator it = tr.vertices_begin(); it != tr.vertices_end(); ++it, ++i )
+ {
+ os << *it; // write the vertex
+ if (is_ascii(os))
+ os << std::endl;
+ index_of_vertex[it] = i;
+ }
+ CGAL_assertion( (std::size_t) i == n );
+
+ // output the combinatorial information
+ return tr.write_full_cells(os, index_of_vertex);
+}
+
+} //namespace CGAL
+
+#endif // CGAL_TRIANGULATION_DATA_STRUCTURE_H
diff --git a/include/gudhi_patches/CGAL/Triangulation_ds_full_cell.h b/include/gudhi_patches/CGAL/Triangulation_ds_full_cell.h
new file mode 100644
index 00000000..541a6a85
--- /dev/null
+++ b/include/gudhi_patches/CGAL/Triangulation_ds_full_cell.h
@@ -0,0 +1,311 @@
+// Copyright (c) 2009-2014 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Samuel Hornus
+
+#ifndef CGAL_TRIANGULATION_DS_FULL_CELL_H
+#define CGAL_TRIANGULATION_DS_FULL_CELL_H
+
+#include <CGAL/TDS_full_cell_default_storage_policy.h>
+#include <CGAL/TDS_full_cell_mirror_storage_policy.h>
+#include <CGAL/internal/Triangulation/Dummy_TDS.h>
+#include <CGAL/Dimension.h>
+#include <CGAL/Default.h>
+#include <CGAL/array.h>
+
+namespace CGAL {
+
+template< class TDS = void, typename FullCellStoragePolicy = Default >
+class Triangulation_ds_full_cell
+{
+ typedef typename Default::Get<FullCellStoragePolicy, TDS_full_cell_default_storage_policy>::type
+ Storage_policy;
+ typedef Triangulation_ds_full_cell<TDS> Self;
+ typedef typename TDS::Maximal_dimension Maximal_dimension;
+
+public:
+ typedef TDS Triangulation_data_structure;
+ typedef typename TDS::Face Face;
+ typedef typename TDS::Vertex_handle Vertex_handle; /* Concept */
+ typedef typename TDS::Vertex_const_handle Vertex_const_handle;
+ typedef typename TDS::Full_cell_handle Full_cell_handle; /* Concept */
+ typedef typename TDS::Full_cell_const_handle Full_cell_const_handle;
+ typedef typename TDS::Full_cell_data TDS_data; /* data that the TDS wants to be stored here */
+ template< typename TDS2 >
+ struct Rebind_TDS /* Concept */
+ {
+ typedef Triangulation_ds_full_cell<TDS2, FullCellStoragePolicy> Other;
+ };
+
+private: // STORAGE
+ typedef TFC_data< Vertex_handle, Full_cell_handle,
+ Maximal_dimension, Storage_policy > Combinatorics;
+ friend struct TFC_data< Vertex_handle, Full_cell_handle,
+ Maximal_dimension, Storage_policy >;
+ // array of vertices
+ typedef typename Combinatorics::Vertex_handle_array Vertex_handle_array;
+ // neighbor simplices
+ typedef typename Combinatorics::Full_cell_handle_array Full_cell_handle_array;
+
+ // NOT DOCUMENTED...
+ typename Combinatorics::Xor_type xor_of_vertices(const int cur_dim) const
+ {
+ return combinatorics_.xor_of_vertices(cur_dim);
+ }
+
+public:
+ typedef typename Vertex_handle_array::const_iterator Vertex_handle_const_iterator;
+ typedef Vertex_handle_const_iterator Vertex_handle_iterator; /* Concept */
+
+ Triangulation_ds_full_cell(const int dmax) /* Concept */
+ : combinatorics_(dmax), tds_data_()
+ {
+ CGAL_assertion( dmax > 0 );
+ for( int i = 0; i <= dmax; ++i )
+ {
+ set_neighbor(i, Full_cell_handle());
+ set_vertex(i, Vertex_handle());
+ set_mirror_index(i, -1);
+ }
+ }
+
+ Triangulation_ds_full_cell(const Triangulation_ds_full_cell & s) /* Concept */
+ : combinatorics_(s.combinatorics_), tds_data_(s.tds_data_)
+ {}
+
+ ~Triangulation_ds_full_cell() {}
+
+ int maximal_dimension() const /* Concept */
+ {
+ return static_cast<int>(vertices().size() - 1);
+ }
+
+ Vertex_handle_const_iterator vertices_begin() const /* Concept */
+ {
+ return vertices().begin();
+ }
+
+ Vertex_handle_const_iterator vertices_end() const /* Concept */
+ {
+ return vertices().end();
+ }
+
+ Vertex_handle vertex(const int i) const /* Concept */
+ {
+ CGAL_precondition(0<=i && i<=maximal_dimension());
+ return vertices()[i];
+ }
+
+ Full_cell_handle neighbor(const int i) const /* Concept */
+ {
+ CGAL_precondition(0<=i && i<=maximal_dimension());
+ return neighbors()[i];
+ }
+
+ int mirror_index(const int i) const /* Concept */
+ {
+ CGAL_precondition(0<=i && i<=maximal_dimension());
+ return combinatorics_.mirror_index(i);
+ }
+
+ // Advanced...
+ Vertex_handle mirror_vertex(const int i, const int cur_dim) const /* Concept */
+ {
+ CGAL_precondition(0<=i && i<=maximal_dimension());
+ return combinatorics_.mirror_vertex(i, cur_dim);
+ }
+
+ int index(Full_cell_const_handle s) const /* Concept */
+ {
+ // WE ASSUME THE FULL CELL WE ARE LOOKING FOR INDEED EXISTS !
+ CGAL_precondition(has_neighbor(s));
+ int index(0);
+ while( neighbor(index) != s )
+ ++index;
+ return index;
+ }
+
+ int index(Vertex_const_handle v) const /* Concept */
+ {
+ // WE ASSUME THE VERTEX WE ARE LOOKING FOR INDEED EXISTS !
+ CGAL_precondition(has_vertex(v));
+ int index(0);
+ while( vertex(index) != v )
+ ++index;
+ return index;
+ }
+
+ void set_vertex(const int i, Vertex_handle v) /* Concept */
+ {
+ CGAL_precondition(0<=i && i<=maximal_dimension());
+ vertices()[i] = v;
+ }
+
+ void set_neighbor(const int i, Full_cell_handle s) /* Concept */
+ {
+ CGAL_precondition(0<=i && i<=maximal_dimension());
+ neighbors()[i] = s;
+ }
+
+ void set_mirror_index(const int i, const int index) /* Concept */
+ {
+ CGAL_precondition(0<=i && i<=maximal_dimension());
+ combinatorics_.set_mirror_index(i, index);
+ }
+
+ bool has_vertex(Vertex_const_handle v) const /* Concept */
+ {
+ int index;
+ return has_vertex(v, index);
+ }
+
+ bool has_vertex(Vertex_const_handle v, int & index) const /* Concept */
+ {
+ const int d = maximal_dimension();
+ index = 0;
+ while( (index <= d) && (vertex(index) != v) )
+ ++index;
+ return (index <= d);
+ }
+
+ bool has_neighbor(Full_cell_const_handle s) const /* Concept */
+ {
+ int index;
+ return has_neighbor(s, index);
+ }
+
+ bool has_neighbor(Full_cell_const_handle s, int & index) const /* Concept */
+ {
+ const int d = maximal_dimension();
+ index = 0;
+ while( (index <= d) && (neighbor(index) != s) )
+ ++index;
+ return (index <= d);
+ }
+
+ void swap_vertices(const int d1, const int d2) /* Concept */
+ {
+ CGAL_precondition(0 <= d1 && d1<=maximal_dimension());
+ CGAL_precondition(0 <= d2 && d2<=maximal_dimension());
+ combinatorics_.swap_vertices(d1, d2);
+ }
+
+ const TDS_data & tds_data() const { return tds_data_; } /* Concept */
+ TDS_data & tds_data() { return tds_data_; } /* Concept */
+
+ void* for_compact_container() const { return combinatorics_.for_compact_container(); }
+ void* & for_compact_container() { return combinatorics_.for_compact_container(); }
+
+ bool is_valid(bool verbose = false, int = 0) const /* Concept */
+ {
+ const int d = maximal_dimension();
+ int i(0);
+ // test that the non-null Vertex_handles come first, before all null ones
+ while( i <= d && vertex(i) != Vertex_handle() ) ++i;
+ while( i <= d && vertex(i) == Vertex_handle() ) ++i;
+ if( i <= d )
+ {
+ if( verbose ) CGAL_warning_msg(false, "full cell has garbage handles to vertices.");
+ return false;
+ }
+ for( i = 0; i <= d; ++i )
+ {
+ if( Vertex_handle() == vertex(i) )
+ break; // there are no more vertices
+ Full_cell_handle n(neighbor(i));
+ if( Full_cell_handle() != n )
+ {
+ int mirror_idx(mirror_index(i));
+ if( n->neighbor(mirror_idx) == Full_cell_handle() )
+ {
+ if( verbose ) CGAL_warning_msg(false, "neighbor has no back-neighbor.");
+ return false;
+ }
+ if( &(*(n->neighbor(mirror_idx))) != this )
+ {
+ if( verbose ) CGAL_warning_msg(false, "neighbor does not point back to correct full cell.");
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+private:
+ // access to data members:
+ Full_cell_handle_array & neighbors() {return combinatorics_.neighbors_; }
+ const Full_cell_handle_array & neighbors() const {return combinatorics_.neighbors_; }
+ Vertex_handle_array & vertices() {return combinatorics_.vertices_; }
+ const Vertex_handle_array & vertices() const {return combinatorics_.vertices_; }
+
+ // DATA MEMBERS
+ Combinatorics combinatorics_;
+ mutable TDS_data tds_data_;
+};
+
+// FUNCTIONS THAT ARE NOT MEMBER FUNCTIONS:
+
+template < typename TDS, typename SSP >
+std::ostream &
+operator<<(std::ostream & O, const Triangulation_ds_full_cell<TDS,SSP> &) /* Concept */
+{
+ /*if( is_ascii(O) )
+ {
+ // os << '\n';
+ }
+ else {}*/
+ return O;
+}
+
+template < typename TDS, typename SSP >
+std::istream &
+operator>>(std::istream & I, Triangulation_ds_full_cell<TDS,SSP> &) /* Concept */
+{
+ /*if( is_ascii(I) )
+ {}
+ else {}*/
+ return I;
+}
+
+// Special case: specialization when template parameter is void.
+
+// we must declare it for each possible full_cell storage policy because :
+// (GCC error:) default template arguments may not be used in partial specializations
+template< typename StoragePolicy >
+class Triangulation_ds_full_cell<void, StoragePolicy>
+{
+public:
+ typedef internal::Triangulation::Dummy_TDS TDS;
+ typedef TDS Triangulation_data_structure;
+ typedef TDS::Vertex_handle Vertex_handle;
+ typedef TDS::Vertex_const_handle Vertex_const_handle;
+ typedef TDS::Full_cell_handle Full_cell_handle;
+ typedef TDS::Full_cell_const_handle Full_cell_const_handle;
+ typedef TDS::Vertex_handle_const_iterator Vertex_handle_const_iterator;
+ typedef TDS::Full_cell_data TDS_data;
+ template <typename TDS2>
+ struct Rebind_TDS
+ {
+ typedef Triangulation_ds_full_cell<TDS2, StoragePolicy> Other;
+ };
+ Vertex_handle_const_iterator vertices_begin();
+ Vertex_handle_const_iterator vertices_end();
+};
+
+} //namespace CGAL
+
+#endif // CGAL_TRIANGULATION_DS_FULL_CELL_H
diff --git a/include/gudhi_patches/CGAL/Triangulation_ds_vertex.h b/include/gudhi_patches/CGAL/Triangulation_ds_vertex.h
new file mode 100644
index 00000000..381b97e1
--- /dev/null
+++ b/include/gudhi_patches/CGAL/Triangulation_ds_vertex.h
@@ -0,0 +1,154 @@
+// Copyright (c) 2009-2014 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Samuel Hornus
+
+#ifndef CGAL_TRIANGULATION_DS_VERTEX_H
+#define CGAL_TRIANGULATION_DS_VERTEX_H
+
+#include <CGAL/Compact_container.h>
+#include <CGAL/internal/Triangulation/Dummy_TDS.h>
+
+namespace CGAL {
+
+/* The template parameter TDS must be a model of the concept
+ * 'TriangulationDataStructure' that stores vertices of type
+ * 'Triangulation_ds_vertex<TDS>'
+ */
+template< class TDS = void >
+class Triangulation_ds_vertex
+{
+ typedef Triangulation_ds_vertex<TDS> Self;
+
+public:
+ typedef TDS Triangulation_data_structure;
+ typedef typename TDS::Full_cell_handle Full_cell_handle; /* Concept */
+
+ template <typename TDS2>
+ struct Rebind_TDS /* Concept */
+ {
+ typedef Triangulation_ds_vertex<TDS2> Other;
+ };
+
+protected: // DATA MEMBERS
+ Full_cell_handle full_cell_; // A handle to an incident full_cell
+
+public:
+ // Constructs a vertex with incident full_cell 's'
+ Triangulation_ds_vertex(Full_cell_handle s) : full_cell_(s) /* Concept */
+ {
+ CGAL_assertion( Full_cell_handle() != s );
+ }
+ // Constructs a vertex with no incident full_cell
+ Triangulation_ds_vertex() : full_cell_() {} /* Concept */
+
+ ~Triangulation_ds_vertex() {}
+
+ /// Set 's' as an incident full_cell
+ void set_full_cell(Full_cell_handle s) /* Concept */
+ {
+ full_cell_ = s;
+ }
+
+ /// Returns a full_cell incident to the vertex
+ Full_cell_handle full_cell() const /* Concept */
+ {
+ return full_cell_;
+ }
+
+ bool is_valid(bool verbose = false, int /* level */ = 0) const /* Concept */
+ {
+ if( Full_cell_handle() == full_cell() )
+ {
+ if( verbose )
+ CGAL_warning_msg(false, "vertex has no incident full cell.");
+ return false;
+ }
+ bool found(false);
+ // These two typename below are OK because TDS fullfils the
+ // TriangulationDataStructure concept.
+ typename TDS::Full_cell::Vertex_handle_iterator vit(full_cell()->vertices_begin());
+ typedef typename TDS::Vertex_handle Vertex_handle;
+ while( vit != full_cell()->vertices_end() )
+ {
+ if( Vertex_handle() == *vit )
+ break; // The full cell has no more vertices
+ if( this == &(**vit) )
+ {
+ found = true;
+ break;
+ }
+ ++vit;
+ }
+ if( ! found )
+ {
+ if( verbose )
+ CGAL_warning_msg(false, "vertex's adjacent full cell does not contain that vertex.");
+ return false;
+ }
+ return true;
+ }
+
+public: // FOR MEMORY MANAGEMENT
+
+ void* for_compact_container() const { return full_cell_.for_compact_container(); }
+ void* & for_compact_container() { return full_cell_.for_compact_container(); }
+
+}; // end of Triangulation_ds_vertex
+
+// FUNCTIONS THAT ARE NOT MEMBER FUNCTIONS:
+
+template < class TDS >
+std::istream &
+operator>>(std::istream & is, Triangulation_ds_vertex<TDS> &) /* Concept */
+{
+ /*if( is_ascii(is) )
+ {}
+ else {}*/
+ return is;
+}
+
+template< class TDS >
+std::ostream &
+operator<<(std::ostream & os, const Triangulation_ds_vertex<TDS> &) /* Concept */
+{
+ /*if( is_ascii(os) )
+ {
+ os << '\n';
+ }
+ else {}*/
+ return os;
+}
+
+// Special case: specialization when template parameter is void.
+
+template<>
+class Triangulation_ds_vertex<void>
+{
+public:
+ typedef internal::Triangulation::Dummy_TDS Triangulation_data_structure;
+ typedef Triangulation_data_structure::Full_cell_handle Full_cell_handle; /* Concept */
+ template <typename TDS2>
+ struct Rebind_TDS /* Concept */
+ {
+ typedef Triangulation_ds_vertex<TDS2> Other;
+ };
+};
+
+} //namespace CGAL
+
+#endif // CGAL_TRIANGULATION_DS_VERTEX_H
diff --git a/include/gudhi_patches/CGAL/Triangulation_face.h b/include/gudhi_patches/CGAL/Triangulation_face.h
new file mode 100644
index 00000000..bc9c1781
--- /dev/null
+++ b/include/gudhi_patches/CGAL/Triangulation_face.h
@@ -0,0 +1,111 @@
+// Copyright (c) 2009-2014 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Samuel Hornus
+
+#ifndef CGAL_TRIANGULATION_FACE_H
+#define CGAL_TRIANGULATION_FACE_H
+
+#include <CGAL/basic.h>
+#include <CGAL/internal/Static_or_dynamic_array.h>
+
+namespace CGAL {
+
+template< typename TDS >
+class Triangulation_face
+{
+ typedef typename internal::Dimen_plus_one<typename TDS::Maximal_dimension>::type Dimen_plus;
+public:
+ typedef TDS Triangulation_data_structure;
+ typedef typename TDS::Full_cell_handle Full_cell_handle; /* Concept */
+ typedef typename TDS::Vertex_handle Vertex_handle; /* Concept */
+ typedef internal::S_or_D_array<int, Dimen_plus> Indices;
+
+protected:
+ Full_cell_handle full_cell_;
+ Indices indices_;
+
+public:
+ explicit Triangulation_face(Full_cell_handle s) /* Concept */
+ : full_cell_(s), indices_(s->maximal_dimension()+2)
+ {
+ CGAL_assertion( Full_cell_handle() != s );
+ clear();
+ }
+
+ explicit Triangulation_face(const int maximal_dim) /* Concept */
+ : full_cell_(), indices_(maximal_dim+2)
+ {
+ clear();
+ }
+
+ Triangulation_face(const Triangulation_face & f) /* Concept */
+ : full_cell_(f.full_cell_), indices_(f.indices_)
+ {}
+
+ int face_dimension() const /* Concept */
+ {
+ int i(0);
+ while( -1 != indices_[i] ) ++i;
+ return (i-1);
+ }
+
+ Full_cell_handle full_cell() const /* Concept */
+ {
+ return full_cell_;
+ }
+
+ int index(const int i) const /* Concept */
+ {
+ CGAL_precondition( (0 <= i) && (i <= face_dimension()) );
+ return indices_[i];
+ }
+
+ Vertex_handle vertex(const int i) const /* Concept */
+ {
+ int j = index(i);
+ if( j == -1 )
+ return Vertex_handle();
+ return full_cell()->vertex(j);
+ }
+
+// - - - - - - - - - - - - - - - - - - UPDATE FUNCTIONS
+
+ void clear() /* Concept */
+ {
+ const std::size_t d = indices_.size();
+ for(std::size_t i = 0; i < d; ++i )
+ indices_[i] = -1;
+ }
+
+ void set_full_cell(Full_cell_handle s) /* Concept */
+ {
+ CGAL_precondition( Full_cell_handle() != s );
+ full_cell_ = s;
+ }
+
+ void set_index(const int i, const int idx) /* Concept */
+ {
+ CGAL_precondition( (0 <= i) && ((size_t)i+1 < indices_.size()) );
+ CGAL_precondition( (0 <= idx) && ((size_t)idx < indices_.size()) );
+ indices_[i] = idx;
+ }
+};
+
+} //namespace CGAL
+
+#endif // CGAL_TRIANGULATION_FACE_H
diff --git a/include/gudhi_patches/CGAL/Triangulation_full_cell.h b/include/gudhi_patches/CGAL/Triangulation_full_cell.h
new file mode 100644
index 00000000..a0c5246f
--- /dev/null
+++ b/include/gudhi_patches/CGAL/Triangulation_full_cell.h
@@ -0,0 +1,148 @@
+// Copyright (c) 2009-2014 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Samuel Hornus
+
+#ifndef CGAL_TRIANGULATION_SIMPLEX_H
+#define CGAL_TRIANGULATION_SIMPLEX_H
+
+#include <CGAL/Triangulation_ds_full_cell.h>
+#include <CGAL/internal/Triangulation/utilities.h>
+#include <CGAL/Iterator_project.h>
+#include <CGAL/Default.h>
+
+namespace CGAL {
+
+struct No_full_cell_data {};
+
+template< class TriangulationTraits, typename Data_ = No_full_cell_data, class TDSFullCell = Default >
+class Triangulation_full_cell : public Default::Get<TDSFullCell, Triangulation_ds_full_cell<> >::type
+{
+ // The default type for TDSFullCell is Triangulation_ds_full_cell<> :
+ typedef typename Default::Get<TDSFullCell, Triangulation_ds_full_cell<> >::type
+ Base;
+ typedef Triangulation_full_cell<TriangulationTraits, Data_, TDSFullCell> Self;
+public:
+ typedef Data_ Data;
+ typedef typename Base::Vertex_handle Vertex_handle;
+ typedef typename Base::Vertex_const_handle Vertex_const_handle;
+ typedef typename Base::Vertex_handle_const_iterator Vertex_handle_const_iterator;
+ typedef typename Base::Full_cell_const_handle Full_cell_const_handle;
+ typedef typename TriangulationTraits::Point_d Point;
+ typedef typename TriangulationTraits::Point_d Point_d;
+
+private: // DATA MEMBERS
+ Data data_;
+
+public:
+
+ using Base::vertices_begin;
+ using Base::vertices_end;
+
+ template< class TDS2 >
+ struct Rebind_TDS
+ {
+ typedef typename Base::template Rebind_TDS<TDS2>::Other TDSFullCell2;
+ typedef Triangulation_full_cell<TriangulationTraits, Data_, TDSFullCell2> Other;
+ };
+
+ Triangulation_full_cell(const int d)
+ : Base(d), data_() {}
+
+ Triangulation_full_cell(const Self & s)
+ : Base(s), data_(s.data_) {}
+
+ const Data & data() const
+ {
+ return data_;
+ }
+
+ Data & data()
+ {
+ return data_;
+ }
+
+ struct Point_from_vertex_handle
+ {
+ typedef Vertex_handle argument_type;
+ typedef Point result_type;
+ result_type & operator()(argument_type & x) const
+ {
+ return x->point();
+ }
+ const result_type & operator()(const argument_type & x) const
+ {
+ return x->point();
+ }
+ };
+
+protected:
+
+ typedef CGAL::Iterator_project<
+ Vertex_handle_const_iterator,
+ internal::Triangulation::Point_from_vertex_handle<Vertex_handle, Point>
+ > Point_const_iterator;
+
+ Point_const_iterator points_begin() const
+ { return Point_const_iterator(Base::vertices_begin()); }
+ Point_const_iterator points_end() const
+ { return Point_const_iterator(Base::vertices_end()); }
+};
+
+// FUNCTIONS THAT ARE NOT MEMBER FUNCTIONS:
+
+inline
+std::istream &
+operator>>(std::istream & is, No_full_cell_data &)
+{
+ return is;
+}
+
+inline
+std::ostream &
+operator<<(std::ostream & os, const No_full_cell_data &)
+{
+ return os;
+}
+
+template < typename TDS, typename Data, typename SSP >
+std::ostream &
+operator<<(std::ostream & O, const Triangulation_full_cell<TDS, Data, SSP> & s)
+{
+ /*if( is_ascii(O) )
+ {
+ // os << '\n';
+ }
+ else {}*/
+ O << s.data();
+ return O;
+}
+
+template < typename TDS, typename Data, typename SSP >
+std::istream &
+operator>>(std::istream & I, Triangulation_full_cell<TDS, Data, SSP> & s)
+{
+ /*if( is_ascii(I) )
+ {}
+ else {}*/
+ I >> s.data();
+ return I;
+}
+
+} //namespace CGAL
+
+#endif // CGAL_TRIANGULATION_SIMPLEX_H
diff --git a/include/gudhi_patches/CGAL/Triangulation_vertex.h b/include/gudhi_patches/CGAL/Triangulation_vertex.h
new file mode 100644
index 00000000..f364717f
--- /dev/null
+++ b/include/gudhi_patches/CGAL/Triangulation_vertex.h
@@ -0,0 +1,128 @@
+// Copyright (c) 2009-2014 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Samuel Hornus
+
+#ifndef CGAL_TRIANGULATION_VERTEX_H
+#define CGAL_TRIANGULATION_VERTEX_H
+
+#include <CGAL/Triangulation_ds_vertex.h>
+#include <CGAL/Default.h>
+
+namespace CGAL {
+
+struct No_vertex_data {};
+
+template< class TriangulationTraits, typename Data_ = No_vertex_data, class TDSVertex = Default >
+class Triangulation_vertex : public Default::Get<TDSVertex, Triangulation_ds_vertex<> >::type
+{
+ // The default type for TDSVertex is Triangulation_ds_vertex<> :
+ typedef typename Default::Get<TDSVertex, Triangulation_ds_vertex<> >::type
+ Base;
+ typedef Triangulation_vertex<TriangulationTraits, Data_, TDSVertex> Self;
+public:
+ typedef Data_ Data;
+ typedef typename TriangulationTraits::Point_d Point;
+ typedef typename TriangulationTraits::Point_d Point_d;
+ typedef typename Base::Full_cell_handle Full_cell_handle;
+
+ template <typename TDS2>
+ struct Rebind_TDS
+ {
+ typedef typename Base::template Rebind_TDS<TDS2>::Other TDSVertex2;
+ typedef Triangulation_vertex<TriangulationTraits, Data_, TDSVertex2> Other;
+ };
+
+private: // DATA MEMBERS
+ Point point_;
+ Data data_;
+
+public:
+ template< typename T >
+ Triangulation_vertex(Full_cell_handle s, const Point & p, const T & t)
+ : Base(s), point_(p), data_(t) {}
+ Triangulation_vertex(Full_cell_handle s, const Point & p)
+ : Base(s), point_(p), data_() {}
+ template< typename T >
+ Triangulation_vertex(const Point & p, const T & t)
+ : Base(), point_(p), data_(t) {}
+ Triangulation_vertex(const Point & p)
+ : Base(), point_(p), data_() {}
+ Triangulation_vertex() : Base(), point_(), data_() {}
+
+ ~Triangulation_vertex() {}
+
+ /// Set the position in space of the vertex to 'p'
+ void set_point(const Point & p)
+ {
+ point_ = p;
+ }
+
+ /// Returns the position in space of the vertex
+ const Point & point() const
+ {
+ return point_;
+ }
+
+ const Data & data() const
+ {
+ return data_;
+ }
+
+ Data & data()
+ {
+ return data_;
+ }
+
+}; // end of Triangulation_vertex
+
+// NON CLASS-MEMBER FUNCTIONS
+
+inline
+std::istream &
+operator>>(std::istream & is, No_vertex_data &)
+{
+ return is;
+}
+
+inline
+std::ostream &
+operator<<(std::ostream & os, const No_vertex_data &)
+{
+ return os;
+}
+
+template < class A, typename Data, class B >
+std::istream &
+operator>>(std::istream & is, Triangulation_vertex<A, Data, B> & v)
+{
+ is >> v.point();
+ return (is >> v.data());
+}
+
+template< class A, typename Data, class B >
+std::ostream &
+operator<<(std::ostream & os, const Triangulation_vertex<A, Data, B> & v)
+{
+ os << v.point();
+ os << v.data();
+ return os;
+}
+
+} //namespace CGAL
+
+#endif // CGAL_TRIANGULATION_VERTEX_H
diff --git a/include/gudhi_patches/CGAL/argument_swaps.h b/include/gudhi_patches/CGAL/argument_swaps.h
new file mode 100644
index 00000000..aa16f29b
--- /dev/null
+++ b/include/gudhi_patches/CGAL/argument_swaps.h
@@ -0,0 +1,88 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_ARGUMENT_SWAPS_H
+#define CGAL_ARGUMENT_SWAPS_H
+
+#include <CGAL/config.h>
+#include <utility>
+
+#ifndef CGAL_CXX11
+#include <boost/preprocessor/repetition.hpp>
+#include <boost/utility/result_of.hpp>
+#endif
+
+namespace CGAL {
+
+#ifdef CGAL_CXX11
+
+namespace internal {
+
+template<int,class...> struct Apply_to_last_then_rest_;
+
+template<int d,class F,class T,class... U>
+struct Apply_to_last_then_rest_<d,F,T,U...> {
+ typedef typename Apply_to_last_then_rest_<d-1,F,U...,T>::result_type result_type;
+ inline result_type operator()(F&&f,T&&t,U&&...u)const{
+ return Apply_to_last_then_rest_<d-1,F,U...,T>()(
+ std::forward<F>(f),
+ std::forward<U>(u)...,
+ std::forward<T>(t));
+ }
+};
+
+template<class F,class T,class... U>
+struct Apply_to_last_then_rest_<0,F,T,U...> {
+ typedef decltype(std::declval<F>()(std::declval<T>(), std::declval<U>()...)) result_type;
+ inline result_type operator()(F&&f,T&&t,U&&...u)const{
+ return std::forward<F>(f)(std::forward<T>(t), std::forward<U>(u)...);
+ }
+};
+
+} // namespace internal
+
+
+struct Apply_to_last_then_rest {
+ template<class F,class T,class...U> inline
+ typename internal::Apply_to_last_then_rest_<sizeof...(U),F,T,U...>::result_type
+ operator()(F&&f,T&&t,U&&...u)const{
+ return internal::Apply_to_last_then_rest_<sizeof...(U),F,T,U...>()(
+ std::forward<F>(f),
+ std::forward<T>(t),
+ std::forward<U>(u)...);
+ }
+};
+
+#else // CGAL_CXX11
+
+struct Apply_to_last_then_rest {
+#define CGAL_CODE(Z,N,_) template<class F,class T,BOOST_PP_ENUM_PARAMS(N,class T)> \
+ typename boost::result_of<F(T,BOOST_PP_ENUM_PARAMS(N,T))>::type \
+ operator()(F const&f, BOOST_PP_ENUM_BINARY_PARAMS(N,T,const&t), T const&t) const { \
+ return f(t,BOOST_PP_ENUM_PARAMS(N,t)); \
+ }
+ BOOST_PP_REPEAT_FROM_TO(1,11,CGAL_CODE,_)
+#undef CGAL_CODE
+};
+
+#endif // CGAL_CXX11
+
+} // namespace CGAL
+
+#endif // CGAL_ARGUMENT_SWAPS_H
diff --git a/include/gudhi_patches/CGAL/determinant_of_vectors.h b/include/gudhi_patches/CGAL/determinant_of_vectors.h
new file mode 100644
index 00000000..e1bad64e
--- /dev/null
+++ b/include/gudhi_patches/CGAL/determinant_of_vectors.h
@@ -0,0 +1,117 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_DETVEC_H
+#define CGAL_DETVEC_H
+#include <CGAL/determinant.h>
+#include <CGAL/predicates/sign_of_determinant.h>
+
+namespace CGAL {
+ // TODO: determine whether it is better to pass them by lines or columns.
+
+ template <class NT, class Vector> inline
+ NT determinant_of_vectors(Vector const&a, Vector const&b){
+ return determinant<NT>(a[0],a[1],b[0],b[1]);
+ }
+ template <class NT, class Vector> inline
+ typename Sgn<NT>::result_type
+ sign_of_determinant_of_vectors(Vector const&a, Vector const&b){
+ return sign_of_determinant<NT>(a[0],a[1],b[0],b[1]);
+ }
+
+ template <class NT, class Vector>
+ NT determinant_of_vectors(Vector const&a, Vector const&b,
+ Vector const&c){
+ return determinant<NT>(a[0],a[1],a[2],b[0],b[1],b[2],c[0],c[1],c[2]);
+ }
+ template <class NT, class Vector>
+ typename Sgn<NT>::result_type
+ sign_of_determinant_of_vectors(Vector const&a, Vector const&b,
+ Vector const&c){
+ return sign_of_determinant<NT>(a[0],a[1],a[2],b[0],b[1],b[2],c[0],c[1],c[2]);
+ }
+
+ template <class NT, class Vector>
+ NT determinant_of_vectors(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d){
+ return determinant<NT>(
+ a[0],a[1],a[2],a[3],
+ b[0],b[1],b[2],b[3],
+ c[0],c[1],c[2],c[3],
+ d[0],d[1],d[2],d[3]);
+ }
+ template <class NT, class Vector>
+ typename Sgn<NT>::result_type
+ sign_of_determinant_of_vectors(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d){
+ return sign_of_determinant<NT>(
+ a[0],a[1],a[2],a[3],
+ b[0],b[1],b[2],b[3],
+ c[0],c[1],c[2],c[3],
+ d[0],d[1],d[2],d[3]);
+ }
+
+ template <class NT, class Vector>
+ NT determinant_of_vectors(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d, Vector const&e){
+ return determinant<NT>(
+ a[0],a[1],a[2],a[3],a[4],
+ b[0],b[1],b[2],b[3],b[4],
+ c[0],c[1],c[2],c[3],c[4],
+ d[0],d[1],d[2],d[3],d[4],
+ e[0],e[1],e[2],e[3],e[4]);
+ }
+ template <class NT, class Vector>
+ typename Sgn<NT>::result_type
+ sign_of_determinant_of_vectors(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d, Vector const&e){
+ return sign_of_determinant<NT>(
+ a[0],a[1],a[2],a[3],a[4],
+ b[0],b[1],b[2],b[3],b[4],
+ c[0],c[1],c[2],c[3],c[4],
+ d[0],d[1],d[2],d[3],d[4],
+ e[0],e[1],e[2],e[3],e[4]);
+ }
+
+ template <class NT, class Vector>
+ NT determinant_of_vectors(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d, Vector const&e, Vector const&f){
+ return determinant<NT>(
+ a[0],a[1],a[2],a[3],a[4],a[5],
+ b[0],b[1],b[2],b[3],b[4],b[5],
+ c[0],c[1],c[2],c[3],c[4],c[5],
+ d[0],d[1],d[2],d[3],d[4],d[5],
+ e[0],e[1],e[2],e[3],e[4],e[5],
+ f[0],f[1],f[2],f[3],f[4],f[5]);
+ }
+ template <class NT, class Vector>
+ typename Sgn<NT>::result_type
+ sign_of_determinant_of_vectors(Vector const&a, Vector const&b,
+ Vector const&c, Vector const&d, Vector const&e, Vector const&f){
+ return sign_of_determinant<NT>(
+ a[0],a[1],a[2],a[3],a[4],a[5],
+ b[0],b[1],b[2],b[3],b[4],b[5],
+ c[0],c[1],c[2],c[3],c[4],c[5],
+ d[0],d[1],d[2],d[3],d[4],d[5],
+ e[0],e[1],e[2],e[3],e[4],e[5],
+ f[0],f[1],f[2],f[3],f[4],f[5]);
+ }
+
+}
+#endif
diff --git a/include/gudhi_patches/CGAL/internal/Combination_enumerator.h b/include/gudhi_patches/CGAL/internal/Combination_enumerator.h
new file mode 100644
index 00000000..f411e827
--- /dev/null
+++ b/include/gudhi_patches/CGAL/internal/Combination_enumerator.h
@@ -0,0 +1,148 @@
+// Copyright (c) 2009-2014 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Samuel Hornus
+
+#ifndef CGAL_INTERNAL_COMBINATION_ENUMERATOR_H
+#define CGAL_INTERNAL_COMBINATION_ENUMERATOR_H
+
+#include <CGAL/basic.h>
+#include <vector>
+
+namespace CGAL {
+
+namespace internal {
+
+class Combination_enumerator
+{
+ // types and member data
+ typedef std::vector<int> Combination;
+ Combination combi_;
+ const int k_;
+ const int min_;
+ const int max_;
+ const int max_at_pos_0_;
+
+public:
+
+ // For generating all the combinations of |k| distinct elements in the
+ // interval [min, max] (both included)
+ Combination_enumerator(const int k, const int min, const int max)
+ : combi_(k), k_(k), min_(min), max_(max), max_at_pos_0_(max + 1 - k)
+ {
+ CGAL_assertion_msg( min <= max, "min is larger than max");
+ CGAL_assertion_msg( 1 <= k && k <= ( max - min + 1 ), "wrong value of k");
+ init();
+ }
+
+ Combination_enumerator(const Combination_enumerator & c)
+ : combi_(c.combi_), k_(c.k_), min_(c.min_), max_(c.max_), max_at_pos_0_(c.max_at_pos_0_)
+ {}
+
+ int number_of_elements()
+ {
+ return k_;
+ }
+
+ void init()
+ {
+ combi_.resize(k_);
+ for( int i = 0; i < k_; ++i )
+ element(i) = min_ + i;
+ }
+
+ bool end() const
+ {
+ return ( element(0) > max_at_pos_0_ );
+ }
+
+ int element(const int i) const
+ {
+ CGAL_assertion( 0 <= i && i < k_ );
+ return combi_[i];
+ }
+
+ int & element(const int i)
+ {
+ CGAL_assertion( 0 <= i && i < k_ );
+ return combi_[i];
+ }
+
+ int operator[](const int i) const
+ {
+ return element(i);
+ }
+
+ int & operator[](const int i)
+ {
+ return element(i);
+ }
+
+ void operator++()
+ {
+ int i = k_ - 1;
+ int max_at_pos_i(max_);
+ while( ( i >= 0 ) && ( element(i) >= max_at_pos_i ) )
+ {
+ --i;
+ --max_at_pos_i;
+ }
+ if( -1 == i )
+ {
+ if( element(0) == max_at_pos_0_ )
+ ++element(0); // mark then end of the enumeration with an impossible value
+ // Note than when we have arrived at the end of the enumeration, applying
+ // operator++() again does not change anything, so it is safe to
+ // apply it too many times.
+ }
+ else
+ {
+ ++element(i);
+ for( int j = i + 1; j < k_; ++j )
+ element(j) = element(i) + j - i;
+ }
+ }
+
+ Combination_enumerator operator++(int)
+ {
+ Combination_enumerator tmp(*this);
+ ++(*this);
+ return tmp;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - TESTING
+#if 0
+ void test()
+ {
+ std::cerr << '\n';
+ while( ! end() )
+ {
+ std::cerr << '\n';
+ for( int i = 0; i < k_; ++i )
+ std::cerr << element(i) << ' ';
+ ++(*this);
+ }
+ init();
+ }
+#endif
+};
+
+} // end of namespace internal
+
+} // end of namespace CGAL
+
+#endif // CGAL_INTERNAL_COMBINATION_ENUMERATOR_H
diff --git a/include/gudhi_patches/CGAL/internal/Static_or_dynamic_array.h b/include/gudhi_patches/CGAL/internal/Static_or_dynamic_array.h
new file mode 100644
index 00000000..ee6195d9
--- /dev/null
+++ b/include/gudhi_patches/CGAL/internal/Static_or_dynamic_array.h
@@ -0,0 +1,116 @@
+// Copyright (c) 2009-2014 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Samuel Hornus
+
+#ifndef CGAL_INTERNAL_STATIC_OR_DYNAMIC_ARRAY_H
+#define CGAL_INTERNAL_STATIC_OR_DYNAMIC_ARRAY_H
+
+#include <CGAL/Compact_container.h>
+#include <CGAL/Dimension.h>
+#include <CGAL/array.h>
+#include <vector>
+
+namespace CGAL {
+
+namespace internal {
+
+// Utility for adding one to an Dimension_tag:
+
+template<typename D>
+struct Dimen_plus_one;
+
+template<>
+struct Dimen_plus_one<Dynamic_dimension_tag>
+{
+ typedef Dynamic_dimension_tag type;
+};
+
+template<int D>
+struct Dimen_plus_one<Dimension_tag<D> >
+{
+ typedef Dimension_tag<D+1> type;
+};
+
+// A SMALL CONTAINER UTILITY FOR DYNAMIC/STATIC MEMORY MANAGEMENT
+
+// stores an array of static or dynamic size, depending on template parameter <B>.
+
+template< typename Containee, typename D, bool WithCompactContainerHelper = false>
+ struct S_or_D_array; // S = static, D = dynamic
+
+// The case of static size:
+template< typename Containee, int D, bool WithCompactContainerHelper >
+struct S_or_D_array< Containee, Dimension_tag< D >, WithCompactContainerHelper >
+: public array<Containee, D>
+{
+ typedef array<Containee, D> Base;
+ S_or_D_array(const int)
+ : Base()
+ {}
+ S_or_D_array(const int, const Containee & c)
+ : Base()
+ {
+ assign(c);
+ }
+ void* for_compact_container() const
+ {
+ return (*this)[0].for_compact_container();
+ }
+ void* & for_compact_container()
+ {
+ return (*this)[0].for_compact_container();
+ }
+};
+
+// The case of dynamic size
+template< typename Containee >
+struct S_or_D_array< Containee, Dynamic_dimension_tag, false >
+: public std::vector<Containee>
+{
+ typedef std::vector<Containee> Base;
+ // TODO: maybe we should use some "small-vector-optimized" class.
+ S_or_D_array(const int d)
+ : Base(d)
+ {}
+ S_or_D_array(const int d, const Containee & c)
+ : Base(d, c)
+ {}
+};
+
+// The case of dynamic size with for_compact_container
+template< typename Containee >
+struct S_or_D_array< Containee, Dynamic_dimension_tag, true >
+: public std::vector<Containee>
+{
+ typedef std::vector<Containee> Base;
+ S_or_D_array(const int d)
+ : Base(d), fcc_(NULL)
+ {}
+ S_or_D_array(const int d, const Containee & c)
+ : Base(d, c), fcc_(NULL)
+ {}
+ void* fcc_;
+ void* for_compact_container() const { return fcc_; }
+ void* & for_compact_container() { return fcc_; }
+};
+
+} // end of namespace internal
+
+} // end of namespace CGAL
+
+#endif // CGAL_INTERNAL_STATIC_OR_DYNAMIC_ARRAY_H
diff --git a/include/gudhi_patches/CGAL/internal/Triangulation/Dummy_TDS.h b/include/gudhi_patches/CGAL/internal/Triangulation/Dummy_TDS.h
new file mode 100644
index 00000000..b3a0ec98
--- /dev/null
+++ b/include/gudhi_patches/CGAL/internal/Triangulation/Dummy_TDS.h
@@ -0,0 +1,49 @@
+// Copyright (c) 2009-2014 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Samuel Hornus
+
+#ifndef CGAL_INTERNAL_TRIANGULATION_DUMMY_TDS_H
+#define CGAL_INTERNAL_TRIANGULATION_DUMMY_TDS_H
+
+namespace CGAL {
+
+namespace internal {
+namespace Triangulation {
+
+struct Dummy_TDS
+{
+ struct Vertex {};
+ struct Vertex_handle {};
+ struct Vertex_iterator {};
+ struct Vertex_const_handle {};
+ struct Vertex_const_iterator {};
+ struct Full_cell {};
+ struct Full_cell_handle {};
+ struct Full_cell_iterator {};
+ struct Full_cell_const_handle {};
+ struct Full_cell_const_iterator {};
+ struct Vertex_handle_const_iterator {};
+ struct Full_cell_data {};
+};
+
+} // namespace Triangulation
+} // namespace internal
+
+} //namespace CGAL
+
+#endif // CGAL_INTERNAL_TRIANGULATION_DUMMY_TDS_H
diff --git a/include/gudhi_patches/CGAL/internal/Triangulation/Triangulation_ds_iterators.h b/include/gudhi_patches/CGAL/internal/Triangulation/Triangulation_ds_iterators.h
new file mode 100644
index 00000000..7e360026
--- /dev/null
+++ b/include/gudhi_patches/CGAL/internal/Triangulation/Triangulation_ds_iterators.h
@@ -0,0 +1,154 @@
+// Copyright (c) 2009-2014 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Samuel Hornus (Well... `copy, paste and hack' of Monique Teillaud's work)
+
+#ifndef CGAL_INTERNAL_TRIANGULATION_TRIANGULATION_DS_ITERATORS_H
+#define CGAL_INTERNAL_TRIANGULATION_TRIANGULATION_DS_ITERATORS_H
+
+namespace CGAL {
+
+namespace internal {
+namespace Triangulation {
+
+template< typename TDS >
+class Triangulation_ds_facet_iterator
+{
+ typedef typename TDS::Full_cell_handle Full_cell_handle;
+ typedef typename TDS::Facet Facet;
+
+ typedef Facet value_type;
+ typedef const Facet * pointer;
+ typedef const Facet & reference;
+ typedef std::size_t size_type;
+ typedef std::ptrdiff_t difference_type;
+ typedef std::bidirectional_iterator_tag iterator_category;
+
+ typedef Triangulation_ds_facet_iterator<TDS> Facet_iterator;
+
+ TDS & tds_;
+ Facet ft_;
+ const int cur_dim_;
+
+public:
+ Triangulation_ds_facet_iterator(TDS & tds)
+ : tds_(tds), ft_(tds.full_cells_begin(), 0), cur_dim_(tds.current_dimension())
+ {
+ CGAL_assertion( cur_dim_ > 0 );
+ while( ! canonical() )
+ raw_increment();
+ }
+
+ Triangulation_ds_facet_iterator(TDS & tds, int)
+ : tds_(tds), ft_(tds.full_cells_end(), 0), cur_dim_(tds.current_dimension())
+ {
+ CGAL_assertion( cur_dim_ > 0 );
+ CGAL_assertion( canonical() );
+ }
+
+ Facet_iterator & operator++()
+ {
+ increment();
+ return (*this);
+ }
+
+ Facet_iterator operator++(int)
+ {
+ Facet_iterator tmp(*this);
+ increment();
+ return tmp;
+ }
+
+ Facet_iterator & operator--()
+ {
+ decrement();
+ return (*this);
+ }
+
+ Facet_iterator operator--(int)
+ {
+ Facet_iterator tmp(*this);
+ decrement();
+ return tmp;
+ }
+
+ bool operator==(const Facet_iterator & fi) const
+ {
+ return (&tds_ == &fi.tds_) &&
+ (tds_.index_of_covertex(ft_) == fi.tds_.index_of_covertex(fi.ft_)) &&
+ (tds_.full_cell(ft_) == fi.tds_.full_cell(fi.ft_));
+ }
+
+ bool operator!=(const Facet_iterator & fi) const
+ {
+ return !(*this == fi);
+ }
+
+ reference operator*() const
+ {
+ return ft_;
+ }
+
+ pointer operator->() const
+ {
+ return &ft_;
+ }
+
+private:
+ bool canonical()
+ {
+ if( tds_.full_cells_end() == tds_.full_cell(ft_) )
+ return ( 0 == tds_.index_of_covertex(ft_) );
+ return ( tds_.full_cell(ft_) <
+ tds_.full_cell(ft_)->neighbor(tds_.index_of_covertex(ft_)) );
+ }
+
+ void raw_decrement()
+ {
+ int i = tds_.index_of_covertex(ft_);
+ if( i == 0 )
+ ft_ = Facet(--tds_.full_cell(ft_), cur_dim_);
+ else
+ ft_ = Facet(tds_.full_cell(ft_), i - 1);
+ }
+
+ void raw_increment()
+ {
+ int i = tds_.index_of_covertex(ft_);
+ if( i == cur_dim_ )
+ ft_ = Facet(++tds_.full_cell(ft_), 0);
+ else
+ ft_ = Facet(tds_.full_cell(ft_), i + 1);
+ }
+
+ void decrement()
+ {
+ do { raw_decrement(); } while( ! canonical() );
+ }
+
+ void increment()
+ {
+ do { raw_increment(); } while( ! canonical() );
+ }
+};
+
+} // namespace Triangulation
+} // namespace internal
+
+} //namespace CGAL
+
+#endif // CGAL_INTERNAL_TRIANGULATION_TRIANGULATION_DS_ITERATORS_H
diff --git a/include/gudhi_patches/CGAL/internal/Triangulation/utilities.h b/include/gudhi_patches/CGAL/internal/Triangulation/utilities.h
new file mode 100644
index 00000000..a1ffc775
--- /dev/null
+++ b/include/gudhi_patches/CGAL/internal/Triangulation/utilities.h
@@ -0,0 +1,154 @@
+// Copyright (c) 2009-2014 INRIA Sophia-Antipolis (France).
+// All rights reserved.
+//
+// This file is part of CGAL (www.cgal.org).
+// 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.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Samuel Hornus
+
+#ifndef CGAL_INTERNAL_TRIANGULATION_UTILITIES_H
+#define CGAL_INTERNAL_TRIANGULATION_UTILITIES_H
+
+#include <CGAL/basic.h>
+
+namespace CGAL {
+
+namespace internal {
+namespace Triangulation {
+
+template< class TDS >
+struct Dark_full_cell_data
+{
+ typedef typename TDS::Full_cell_handle Full_cell_handle;
+ Full_cell_handle light_copy_;
+ int count_;
+ Dark_full_cell_data() : light_copy_(), count_(0) {}
+};
+
+template< class TDS >
+struct Compare_faces_with_common_first_vertex
+{
+ typedef typename TDS::Face Face;
+
+ const int d_;
+
+public:
+
+ Compare_faces_with_common_first_vertex(const int d)
+ : d_(d)
+ {
+ CGAL_assertion( 0 < d );
+ }
+
+ explicit Compare_faces_with_common_first_vertex();
+
+ bool operator()(const Face & left, const Face & right) const
+ {
+ CGAL_assertion( d_ == left.face_dimension() );
+ CGAL_assertion( d_ == right.face_dimension() );
+ for( int i = 1; i <= d_; ++i )
+ {
+ if( left.vertex(i) < right.vertex(i) )
+ return true;
+ if( right.vertex(i) < left.vertex(i) )
+ return false;
+ }
+ return false;
+ }
+};
+
+template< class T >
+struct Compare_vertices_for_upper_face
+{
+ typedef typename T::Vertex_const_handle VCH;
+
+ const T & t_;
+
+public:
+
+ Compare_vertices_for_upper_face(const T & t)
+ : t_(t)
+ {}
+
+ explicit Compare_vertices_for_upper_face();
+
+ bool operator()(const VCH & left, const VCH & right) const
+ {
+ if( left == right )
+ return false;
+ if( t_.is_infinite(left) )
+ return true;
+ if( t_.is_infinite(right) )
+ return false;
+ return left < right;
+ }
+};
+
+template< class T >
+struct Compare_points_for_perturbation
+{
+ typedef typename T::Geom_traits::Point_d Point;
+
+ const T & t_;
+
+public:
+
+ Compare_points_for_perturbation(const T & t)
+ : t_(t)
+ {}
+
+ explicit Compare_points_for_perturbation();
+
+ bool operator()(const Point * left, const Point * right) const
+ {
+ return (SMALLER == t_.geom_traits().compare_lexicographically_d_object()(*left, *right));
+ }
+};
+
+template< class T >
+struct Point_from_pointer
+{
+ typedef const typename T::Geom_traits::Point_d * argument_type;
+ typedef const typename T::Geom_traits::Point_d result_type;
+ result_type & operator()(argument_type & x) const
+ {
+ return (*x);
+ }
+ const result_type & operator()(const argument_type & x) const
+ {
+ return (*x);
+ }
+};
+
+template< typename Vertex_handle, typename Point >
+struct Point_from_vertex_handle
+{
+ typedef Vertex_handle argument_type;
+ typedef Point result_type;
+ result_type & operator()(argument_type & x) const
+ {
+ return x->point();
+ }
+ const result_type & operator()(const argument_type & x) const
+ {
+ return x->point();
+ }
+};
+
+} // namespace Triangulation
+} // namespace internal
+
+} //namespace CGAL
+
+#endif // CGAL_INTERNAL_TRIANGULATION_UTILITIES_H
diff --git a/include/gudhi_patches/CGAL/iterator_from_indices.h b/include/gudhi_patches/CGAL/iterator_from_indices.h
new file mode 100644
index 00000000..110bb4be
--- /dev/null
+++ b/include/gudhi_patches/CGAL/iterator_from_indices.h
@@ -0,0 +1,75 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_ITERATOR_FROM_INDICES_H
+#define CGAL_ITERATOR_FROM_INDICES_H
+#include <CGAL/config.h>
+#include <boost/iterator/iterator_facade.hpp>
+namespace CGAL {
+template <class Ref_>
+struct Default_coordinate_access {
+ typedef Ref_ result_type;
+ template<class T> Ref_ operator()(T const& t, std::ptrdiff_t i)const{
+ return t[i];
+ }
+};
+
+//TODO: default type for Value_: typename same_cv<Container_,typename remove_cv<Container_>::type::value_type>::type
+template <class Container_, class Value_, class Ref_=
+#ifdef CGAL_CXX11
+ decltype(std::declval<Container_>()[0])
+#else
+ Value_&
+#endif
+ , class Coord_access = Default_coordinate_access<Ref_>
+ >
+class Iterator_from_indices
+: public boost::iterator_facade<Iterator_from_indices<Container_,Value_,Ref_,Coord_access>,
+ Value_, std::bidirectional_iterator_tag, Ref_>
+{
+ friend class boost::iterator_core_access;
+ //FIXME: use int to save space
+ //TODO: use a tuple to save space when Coord_access is empty
+ typedef std::ptrdiff_t index_t;
+ Container_* cont;
+ index_t index;
+ Coord_access ca;
+ void increment(){ ++index; }
+ void decrement(){ --index; }
+ void advance(std::ptrdiff_t n){ index+=n; }
+ ptrdiff_t distance_to(Iterator_from_indices const& other)const{
+ return other.index-index;
+ }
+ bool equal(Iterator_from_indices const& other)const{
+ return index==other.index;
+ }
+ Ref_ dereference()const{
+ //FIXME: use the functor properly
+ //Uh, and what did I mean by that?
+ return ca(*cont,index);
+ }
+ public:
+ Iterator_from_indices(Container_& cont_,std::size_t n)
+ : cont(&cont_), index(n) {}
+ template<class T>
+ Iterator_from_indices(Container_& cont_,std::size_t n,T const&t)
+ : cont(&cont_), index(n), ca(t) {}
+};
+}
+#endif // CGAL_ITERATOR_FROM_INDICES_H
diff --git a/include/gudhi_patches/CGAL/transforming_iterator.h b/include/gudhi_patches/CGAL/transforming_iterator.h
new file mode 100644
index 00000000..15ea19a5
--- /dev/null
+++ b/include/gudhi_patches/CGAL/transforming_iterator.h
@@ -0,0 +1,123 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_TRANSFORMING_ITERATOR_H
+#define CGAL_TRANSFORMING_ITERATOR_H
+#include <boost/iterator/iterator_adaptor.hpp>
+#include <boost/utility/result_of.hpp>
+#include <boost/type_traits/is_empty.hpp>
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/or.hpp>
+#include <CGAL/Default.h>
+#include <utility>
+
+// Inspired by the boost version, but more compact and
+// without any iterator_category games.
+
+namespace CGAL {
+namespace internal {
+
+// non-empty case
+template<class T,bool=boost::is_empty<T>::value> struct Functor_as_base {
+ Functor_as_base(){}
+ Functor_as_base(T const& t):f(t){}
+ //template<class T2> Functor_as_base(Functor_as_base<T2> const&g):f(g.functor()){}
+ T const& functor()const{return f;}
+ T & functor() {return f;}
+ private:
+ T f;
+};
+
+// empty case
+template<class T> struct Functor_as_base<T,true> : public T {
+ Functor_as_base(){}
+ Functor_as_base(T const& t):T(t){}
+ //template<class T2> Functor_as_base(Functor_as_base<T2> const&g):T(g.functor()){}
+ T const& functor()const{return *this;}
+ T & functor() {return *this;}
+};
+
+template <typename Derived, typename F, typename Iter, typename Ref, typename Val>
+class transforming_iterator_helper
+{
+ typedef std::iterator_traits<Iter> Iter_traits;
+ typedef typename Iter_traits::reference Iter_ref;
+ typedef typename Default::Get<Ref,
+#ifdef CGAL_CXX11
+ decltype(std::declval<F>()(std::declval<Iter_ref>()))
+#else
+ typename boost::result_of<F(typename Iter_traits::value_type)>::type
+ // should be reference instead of value_type
+#endif
+ >::type reference_;
+
+ typedef typename Default::Get<Val,typename boost::remove_cv<typename boost::remove_reference<reference_>::type>::type>::type value_type;
+
+ // Crappy heuristic. If we have *it that returns a Weighted_point and F that returns a reference to the Point contained in the Weighted_point it takes as argument, we do NOT want the transformed iterator to return a reference to the temporary *it. On the other hand, if *it returns an int n, and F returns a reference to array[n] it is not so good to lose the reference. This probably should be done elsewhere and should at least be made optional...
+ typedef typename boost::mpl::if_<
+ boost::mpl::or_<boost::is_reference<Iter_ref>,
+ boost::is_integral<Iter_ref> >,
+ reference_, value_type>::type reference;
+
+ public:
+ typedef boost::iterator_adaptor<
+ Derived,
+ Iter,
+ value_type,
+ typename Iter_traits::iterator_category,
+ reference
+ > type;
+};
+}
+
+template <typename F, typename Iter, typename Ref=Default, typename Val=Default>
+class transforming_iterator
+: public internal::transforming_iterator_helper<transforming_iterator<F,Iter,Ref,Val>,F,Iter,Ref,Val>::type,
+private internal::Functor_as_base<F>
+{
+ friend class boost::iterator_core_access;
+ typedef typename internal::transforming_iterator_helper<transforming_iterator,F,Iter,Ref,Val>::type Base;
+ typedef internal::Functor_as_base<F> Functor_base;
+ typename Base::reference dereference()const{
+ return functor()(*this->base_reference());
+ }
+ public:
+ using Functor_base::functor;
+ transforming_iterator(){}
+ explicit transforming_iterator(Iter i,F const& f=F())
+ :Base(i),Functor_base(f){}
+ template<class F2,class I2,class R2,class V2>
+ transforming_iterator(
+ transforming_iterator<F2,I2,R2,V2> const&i,
+ typename boost::enable_if_convertible<I2, Iter>::type* = 0,
+ typename boost::enable_if_convertible<F2, F>::type* = 0)
+ : Base(i.base()),Functor_base(i.functor()) {}
+
+};
+
+template <typename F, typename Iter> inline
+transforming_iterator<F,Iter> make_transforming_iterator(Iter i, F const&f=F()) {
+ return transforming_iterator<F,Iter>(i,f);
+}
+
+}
+
+#endif // CGAL_TRANSFORMING_ITERATOR_H
diff --git a/include/gudhi_patches/CGAL/transforming_pair_iterator.h b/include/gudhi_patches/CGAL/transforming_pair_iterator.h
new file mode 100644
index 00000000..48dac132
--- /dev/null
+++ b/include/gudhi_patches/CGAL/transforming_pair_iterator.h
@@ -0,0 +1,127 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_TRANSFORMING_PAIR_ITERATOR_H
+#define CGAL_TRANSFORMING_PAIR_ITERATOR_H
+// Should be a combination of transform_iterator and zip_iterator,
+// but boost's iterator_category games are a pain.
+
+#include <CGAL/transforming_iterator.h>
+#include <CGAL/assertions.h>
+#include <boost/type_traits/is_convertible.hpp>
+
+
+
+
+namespace CGAL {
+namespace internal {
+template <class Cat1, class Cat2, bool=boost::is_convertible<Cat1,Cat2>::value>
+struct Min_category {
+ CGAL_static_assertion((boost::is_convertible<Cat2,Cat1>::value));
+ typedef Cat1 type;
+};
+
+template <class Cat1, class Cat2>
+struct Min_category<Cat1,Cat2,true> {
+ typedef Cat2 type;
+};
+
+
+template <typename Derived, typename F, typename It1, typename It2, typename Ref, typename Val>
+class transforming_pair_iterator_helper
+{
+ typedef typename Min_category<
+ typename std::iterator_traits<It1>::iterator_category,
+ typename std::iterator_traits<It1>::iterator_category>
+ ::type iterator_category;
+
+ typedef typename Default::Get<Ref,
+#ifdef CGAL_CXX11
+ decltype(std::declval<F>()(std::declval<typename std::iterator_traits<It1>::reference>(),std::declval<typename std::iterator_traits<It2>::reference>()))
+#else
+ typename boost::result_of<F(typename std::iterator_traits<It1>::value_type,typename std::iterator_traits<It2>::value_type)>::type
+ // should be reference instead of value_type
+#endif
+ >::type reference;
+
+ typedef typename Default::Get<Val,typename boost::remove_cv<typename boost::remove_reference<reference>::type>::type>::type value_type;
+
+ public:
+ typedef boost::iterator_facade<
+ Derived,
+ value_type,
+ iterator_category,
+ reference
+ // expect ptrdiff_t is good enough for difference
+ > type;
+};
+}
+
+template <typename F, typename It1, typename It2, typename Ref=Default, typename Val=Default>
+class transforming_pair_iterator
+: public internal::transforming_pair_iterator_helper<transforming_pair_iterator<F,It1,It2,Ref,Val>,F,It1,It2,Ref,Val>::type,
+private internal::Functor_as_base<F>
+{
+ It1 iter1; It2 iter2;
+ friend class boost::iterator_core_access;
+ typedef typename internal::transforming_pair_iterator_helper<transforming_pair_iterator,F,It1,It2,Ref,Val>::type Base;
+ typedef internal::Functor_as_base<F> Functor_base;
+ typename Base::reference dereference()const{
+ return functor()(*iter1,*iter2);
+ }
+ bool equal(transforming_pair_iterator const&i)const{
+ bool b=(iter1==i.iter1);
+ CGAL_assertion(b==(iter2==i.iter2));
+ //FIXME: or do we want only one driving iterator
+ return b;
+ }
+ void increment(){ ++iter1; ++iter2; }
+ void decrement(){ --iter1; --iter2; }
+ void advance(std::ptrdiff_t n){
+ std::advance(iter1,n);
+ std::advance(iter2,n);
+ }
+ std::ptrdiff_t distance_to(transforming_pair_iterator const&i)const{
+ std::ptrdiff_t dist=std::distance(iter1,i.iter1);
+ CGAL_assertion(dist==std::distance(iter2,i.iter2));
+ return dist;
+ }
+ public:
+ using Functor_base::functor;
+ transforming_pair_iterator(){}
+ explicit transforming_pair_iterator(It1 i1,It2 i2,F const& f=F())
+ :Functor_base(f),iter1(i1),iter2(i2){}
+ template<class F2,class J1,class J2,class R2,class V2>
+ transforming_pair_iterator(
+ transforming_pair_iterator<F2,J1,J2,R2,V2> const&i,
+ typename boost::enable_if_convertible<J1, It1>::type* = 0,
+ typename boost::enable_if_convertible<J2, It2>::type* = 0,
+ typename boost::enable_if_convertible<F2, F>::type* = 0)
+ : Functor_base(i.functor()),iter1(i.iter1),iter2(i.iter2) {}
+
+};
+
+template <typename F, typename It1, typename It2> inline
+transforming_pair_iterator<F,It1,It2> make_transforming_pair_iterator(It1 i1, It2 i2, F const&f=F()) {
+ return transforming_pair_iterator<F,It1,It2>(i1,i2,f);
+}
+
+}
+
+#endif // CGAL_TRANSFORMING_PAIR_ITERATOR_H
diff --git a/include/gudhi_patches/CGAL/typeset.h b/include/gudhi_patches/CGAL/typeset.h
new file mode 100644
index 00000000..d4e24281
--- /dev/null
+++ b/include/gudhi_patches/CGAL/typeset.h
@@ -0,0 +1,117 @@
+// Copyright (c) 2014
+// INRIA Saclay-Ile de France (France)
+//
+// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation; either version 3 of the License,
+// or (at your option) any later version.
+//
+// Licensees holding a valid commercial license may use this file in
+// accordance with the commercial license agreement provided with the software.
+//
+// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// $URL$
+// $Id$
+//
+// Author(s) : Marc Glisse
+
+#ifndef CGAL_TYPESET_H
+#define CGAL_TYPESET_H
+#include <CGAL/config.h>
+#ifdef CGAL_CXX11
+#include <type_traits>
+#else
+#include <boost/type_traits.hpp>
+#endif
+
+// Sometimes using tuple just to list types is overkill (takes forever to
+// instantiate).
+
+namespace CGAL {
+#ifdef CGAL_CXX11
+ template<class...> struct typeset;
+ template<class H,class...U> struct typeset<H,U...> {
+ typedef H head;
+ typedef typeset<U...> tail;
+ typedef typeset type;
+ template<class X> using contains = typename
+ std::conditional<
+ std::is_same<H,X>::value,
+ std::true_type,
+ typename tail::template contains<X>
+ >::type;
+ template<class X> using add = typename
+ std::conditional<
+ contains<X>::value,
+ typeset<H,U...>,
+ typeset<H,U...,X>
+ >::type;
+ };
+ template<> struct typeset<> {
+ typedef typeset type;
+ template<class X> using contains = std::false_type;
+ template<class X> using add = typeset<X>;
+ };
+#else
+ template<class,class> struct typeset;
+ template<class H=void, class T=typename
+ boost::mpl::if_<boost::is_same<H,void>, void, typeset<void, void> >::type >
+ struct typeset {
+ typedef typeset type;
+ typedef H head;
+ typedef T tail;
+ template<class X> struct contains :
+ boost::mpl::if_<boost::is_same<H,X>,boost::true_type,typename tail::template contains<X> >::type
+ {};
+ template<class X,class=void> struct add;
+ //boost::mpl::if_<boost::is_same<H,X>,typeset,typeset<X,typeset> >::type
+ };
+ template<> struct typeset<> {
+ typedef typeset type;
+ template<class X> struct contains : boost::false_type {};
+ template<class X> struct add : CGAL::typeset<X> {};
+ };
+
+ template<class H,class T>
+ template<class X,class>
+ struct typeset<H,T>::add : typeset<H,typename T::template add<X>::type> {};
+ template<class H,class T>
+ template<class V>
+ struct typeset<H,T>::add<H,V> : typeset<H,T> {};
+#endif
+
+ template<class T1, class T2> struct typeset_union_ :
+ typeset_union_<typename T1::template add<typename T2::head>::type, typename T2::tail>
+ {};
+ template<class T> struct typeset_union_ <T, typeset<> > : T {};
+
+ template<class T1, class T2>
+ struct typeset_intersection_ {
+ typedef typename T1::head H;
+ typedef typename typeset_intersection_<typename T1::tail,T2>::type U;
+ typedef typename
+#ifdef CGAL_CXX11
+ std::conditional<T2::template contains<H>::value,
+#else
+ boost::mpl::if_<typename T2::template contains<H>,
+#endif
+ typename U::template add<H>::type, U>::type type;
+ };
+ template<class T>
+ struct typeset_intersection_<typeset<>,T> : typeset<> {};
+
+#ifdef CGAL_CXX11
+ template<class T1, class T2>
+ using typeset_union = typename typeset_union_<T1,T2>::type;
+ template<class T1, class T2>
+ using typeset_intersection = typename typeset_intersection_<T1,T2>::type;
+#else
+ template<class T1, class T2>
+ struct typeset_union : typeset_union_<T1,T2>::type {};
+ template<class T1, class T2>
+ struct typeset_intersection : typeset_intersection_<T1,T2>::type {};
+#endif
+}
+#endif
diff --git a/include/gudhi_patches/Tangential_complex_CGAL_patches.txt b/include/gudhi_patches/Tangential_complex_CGAL_patches.txt
new file mode 100644
index 00000000..5b9581a0
--- /dev/null
+++ b/include/gudhi_patches/Tangential_complex_CGAL_patches.txt
@@ -0,0 +1,82 @@
+CGAL/Regular_triangulation_traits_adapter.h
+CGAL/Triangulation_ds_vertex.h
+CGAL/Triangulation_data_structure.h
+CGAL/transforming_pair_iterator.h
+CGAL/NewKernel_d/static_int.h
+CGAL/NewKernel_d/Cartesian_LA_functors.h
+CGAL/NewKernel_d/Cartesian_change_FT.h
+CGAL/NewKernel_d/Wrapper/Vector_d.h
+CGAL/NewKernel_d/Wrapper/Hyperplane_d.h
+CGAL/NewKernel_d/Wrapper/Ref_count_obj.h
+CGAL/NewKernel_d/Wrapper/Cartesian_wrap.h
+CGAL/NewKernel_d/Wrapper/Point_d.h
+CGAL/NewKernel_d/Wrapper/Segment_d.h
+CGAL/NewKernel_d/Wrapper/Weighted_point_d.h
+CGAL/NewKernel_d/Wrapper/Sphere_d.h
+CGAL/NewKernel_d/Cartesian_per_dimension.h
+CGAL/NewKernel_d/Kernel_object_converter.h
+CGAL/NewKernel_d/KernelD_converter.h
+CGAL/NewKernel_d/Vector/sse2.h
+CGAL/NewKernel_d/Vector/avx4.h
+CGAL/NewKernel_d/Vector/determinant_of_vectors_small_dim_internal.h
+CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_points.h
+CGAL/NewKernel_d/Vector/determinant_of_points_from_vectors.h
+CGAL/NewKernel_d/Vector/array.h
+CGAL/NewKernel_d/Vector/determinant_of_iterator_to_points_from_iterator_to_vectors.h
+CGAL/NewKernel_d/Vector/determinant_of_iterator_to_vectors_from_vectors.h
+CGAL/NewKernel_d/Vector/determinant_of_vectors_small_dim.h
+CGAL/NewKernel_d/Vector/vector.h
+CGAL/NewKernel_d/Vector/v2int.h
+CGAL/NewKernel_d/Vector/mix.h
+CGAL/NewKernel_d/Cartesian_static_filters.h
+CGAL/NewKernel_d/Cartesian_LA_base.h
+CGAL/NewKernel_d/Lazy_cartesian.h
+CGAL/NewKernel_d/Coaffine.h
+CGAL/NewKernel_d/store_kernel.h
+CGAL/NewKernel_d/Dimension_base.h
+CGAL/NewKernel_d/Kernel_3_interface.h
+CGAL/NewKernel_d/Cartesian_complete.h
+CGAL/NewKernel_d/Cartesian_base.h
+CGAL/NewKernel_d/Cartesian_filter_K.h
+CGAL/NewKernel_d/functor_tags.h
+CGAL/NewKernel_d/Filtered_predicate2.h
+CGAL/NewKernel_d/functor_properties.h
+CGAL/NewKernel_d/Define_kernel_types.h
+CGAL/NewKernel_d/LA_eigen/LA.h
+CGAL/NewKernel_d/LA_eigen/constructors.h
+CGAL/NewKernel_d/Types/Aff_transformation.h
+CGAL/NewKernel_d/Types/Sphere.h
+CGAL/NewKernel_d/Types/Hyperplane.h
+CGAL/NewKernel_d/Types/Line.h
+CGAL/NewKernel_d/Types/Ray.h
+CGAL/NewKernel_d/Types/Iso_box.h
+CGAL/NewKernel_d/Types/Weighted_point.h
+CGAL/NewKernel_d/Types/Segment.h
+CGAL/NewKernel_d/Kernel_d_interface.h
+CGAL/NewKernel_d/utils.h
+CGAL/NewKernel_d/Kernel_2_interface.h
+CGAL/NewKernel_d/Cartesian_filter_NT.h
+CGAL/NewKernel_d/function_objects_cartesian.h
+CGAL/Convex_hull.h
+CGAL/Triangulation_ds_full_cell.h
+CGAL/Regular_triangulation.h
+CGAL/Epick_d.h
+CGAL/transforming_iterator.h
+CGAL/iterator_from_indices.h
+CGAL/Delaunay_triangulation.h
+CGAL/IO/Triangulation_off_ostream.h
+CGAL/typeset.h
+CGAL/Triangulation_full_cell.h
+CGAL/Triangulation.h
+CGAL/internal/Static_or_dynamic_array.h
+CGAL/internal/Combination_enumerator.h
+CGAL/internal/Triangulation/utilities.h
+CGAL/internal/Triangulation/Triangulation_ds_iterators.h
+CGAL/internal/Triangulation/Dummy_TDS.h
+CGAL/argument_swaps.h
+CGAL/Epeck_d.h
+CGAL/determinant_of_vectors.h
+CGAL/TDS_full_cell_default_storage_policy.h
+CGAL/TDS_full_cell_mirror_storage_policy.h
+CGAL/Triangulation_face.h
+CGAL/Triangulation_vertex.h