summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeGUDHIVersion.txt6
-rw-r--r--CMakeLists.txt162
-rw-r--r--Conventions.txt76
-rw-r--r--GUDHIVersion.cmake.in1
-rw-r--r--Version.txt1
-rw-r--r--biblio/bibliography.bib27
-rw-r--r--biblio/how_to_cite_cgal.bib947
-rw-r--r--biblio/how_to_cite_gudhi.bib70
-rw-r--r--data/bitmap/2d_torus.txt12
-rw-r--r--data/bitmap/3d_torus.txt31
-rw-r--r--data/bitmap/CubicalOneSphere.txt12
-rw-r--r--data/bitmap/CubicalTwoSphere.txt31
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/asian_mug.off0
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__0.pngbin10925 -> 10925 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__1.pngbin10529 -> 10529 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__10.pngbin10627 -> 10627 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__11.pngbin10654 -> 10654 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__12.pngbin10509 -> 10509 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__13.pngbin10511 -> 10511 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__14.pngbin10487 -> 10487 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__15.pngbin10448 -> 10448 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__16.pngbin10433 -> 10433 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__17.pngbin10330 -> 10330 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__18.pngbin10523 -> 10523 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__19.pngbin10404 -> 10404 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__2.pngbin10826 -> 10826 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__20.pngbin10349 -> 10349 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__21.pngbin10149 -> 10149 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__22.pngbin10352 -> 10352 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__23.pngbin10128 -> 10128 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__24.pngbin10179 -> 10179 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__25.pngbin10123 -> 10123 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__26.pngbin10153 -> 10153 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__27.pngbin10101 -> 10101 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__28.pngbin10089 -> 10089 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__29.pngbin10126 -> 10126 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__3.pngbin10886 -> 10886 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__30.pngbin10202 -> 10202 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__31.pngbin10043 -> 10043 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__32.pngbin10127 -> 10127 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__33.pngbin10060 -> 10060 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__34.pngbin10024 -> 10024 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__35.pngbin9900 -> 9900 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__36.pngbin10124 -> 10124 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__37.pngbin9968 -> 9968 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__38.pngbin10055 -> 10055 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__39.pngbin10118 -> 10118 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__4.pngbin10730 -> 10730 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__40.pngbin10035 -> 10035 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__41.pngbin10131 -> 10131 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__42.pngbin10073 -> 10073 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__43.pngbin10111 -> 10111 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__44.pngbin9919 -> 9919 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__45.pngbin10169 -> 10169 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__46.pngbin10003 -> 10003 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__47.pngbin9974 -> 9974 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__48.pngbin9559 -> 9559 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__49.pngbin10247 -> 10247 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__5.pngbin10744 -> 10744 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__50.pngbin10169 -> 10169 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__51.pngbin10362 -> 10362 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__52.pngbin10363 -> 10363 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__53.pngbin10366 -> 10366 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__54.pngbin10300 -> 10300 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__55.pngbin10485 -> 10485 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__56.pngbin10850 -> 10850 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__57.pngbin10852 -> 10852 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__58.pngbin10893 -> 10893 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__59.pngbin10758 -> 10758 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__6.pngbin10715 -> 10715 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__60.pngbin10874 -> 10874 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__61.pngbin10895 -> 10895 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__62.pngbin10990 -> 10990 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__63.pngbin10831 -> 10831 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__64.pngbin10994 -> 10994 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__65.pngbin10898 -> 10898 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__66.pngbin10877 -> 10877 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__67.pngbin10936 -> 10936 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__68.pngbin10900 -> 10900 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__69.pngbin10821 -> 10821 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__7.pngbin10627 -> 10627 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__70.pngbin10781 -> 10781 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__71.pngbin10795 -> 10795 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__8.pngbin10631 -> 10631 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/asian mug/obj12__9.pngbin10676 -> 10676 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__0.pngbin4705 -> 4705 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__1.pngbin4637 -> 4637 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__10.pngbin5367 -> 5367 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__11.pngbin5791 -> 5791 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__12.pngbin6327 -> 6327 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__13.pngbin7108 -> 7108 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__14.pngbin8092 -> 8092 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__15.pngbin9676 -> 9676 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__16.pngbin11771 -> 11771 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__17.pngbin13525 -> 13525 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__18.pngbin12569 -> 12569 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__19.pngbin10386 -> 10386 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__2.pngbin4569 -> 4569 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__20.pngbin8640 -> 8640 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__21.pngbin7666 -> 7666 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__22.pngbin6850 -> 6850 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__23.pngbin6126 -> 6126 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__24.pngbin5574 -> 5574 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__25.pngbin5285 -> 5285 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__26.pngbin4892 -> 4892 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__27.pngbin4736 -> 4736 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__28.pngbin4607 -> 4607 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__29.pngbin4475 -> 4475 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__3.pngbin4523 -> 4523 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__30.pngbin4480 -> 4480 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__31.pngbin4491 -> 4491 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__32.pngbin4485 -> 4485 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__33.pngbin4537 -> 4537 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__34.pngbin4673 -> 4673 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__35.pngbin4817 -> 4817 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__36.pngbin4672 -> 4672 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__37.pngbin4506 -> 4506 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__38.pngbin4521 -> 4521 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__39.pngbin4494 -> 4494 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__4.pngbin4514 -> 4514 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__40.pngbin4420 -> 4420 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__41.pngbin4413 -> 4413 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__42.pngbin4475 -> 4475 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__43.pngbin4511 -> 4511 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__44.pngbin4778 -> 4778 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__45.pngbin5026 -> 5026 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__46.pngbin5298 -> 5298 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__47.pngbin5801 -> 5801 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__48.pngbin6422 -> 6422 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__49.pngbin7211 -> 7211 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__5.pngbin4493 -> 4493 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__50.pngbin8521 -> 8521 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__51.pngbin9900 -> 9900 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__52.pngbin10951 -> 10951 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__53.pngbin10703 -> 10703 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__54.pngbin11112 -> 11112 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__55.pngbin10947 -> 10947 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__56.pngbin9299 -> 9299 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__57.pngbin7912 -> 7912 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__58.pngbin6818 -> 6818 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__59.pngbin6234 -> 6234 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__6.pngbin4507 -> 4507 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__60.pngbin5626 -> 5626 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__61.pngbin5161 -> 5161 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__62.pngbin4896 -> 4896 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__63.pngbin4576 -> 4576 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__64.pngbin4414 -> 4414 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__65.pngbin4268 -> 4268 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__66.pngbin4177 -> 4177 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__67.pngbin4117 -> 4117 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__68.pngbin4172 -> 4172 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__69.pngbin4235 -> 4235 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__7.pngbin4669 -> 4669 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__70.pngbin4408 -> 4408 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__71.pngbin4603 -> 4603 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__8.pngbin4791 -> 4791 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/little car/obj3__9.pngbin5050 -> 5050 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__0.pngbin8798 -> 8798 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__1.pngbin8603 -> 8603 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__10.pngbin7095 -> 7095 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__11.pngbin7062 -> 7062 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__12.pngbin7054 -> 7054 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__13.pngbin6954 -> 6954 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__14.pngbin6963 -> 6963 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__15.pngbin6944 -> 6944 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__16.pngbin6908 -> 6908 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__17.pngbin6856 -> 6856 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__18.pngbin6814 -> 6814 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__19.pngbin6684 -> 6684 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__2.pngbin8342 -> 8342 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__20.pngbin6622 -> 6622 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__21.pngbin6555 -> 6555 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__22.pngbin6550 -> 6550 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__23.pngbin6582 -> 6582 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__24.pngbin6644 -> 6644 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__25.pngbin6617 -> 6617 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__26.pngbin6676 -> 6676 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__27.pngbin6802 -> 6802 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__28.pngbin6827 -> 6827 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__29.pngbin6871 -> 6871 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__3.pngbin8124 -> 8124 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__30.pngbin6878 -> 6878 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__31.pngbin6910 -> 6910 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__32.pngbin7011 -> 7011 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__33.pngbin7113 -> 7113 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__34.pngbin7205 -> 7205 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__35.pngbin7170 -> 7170 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__36.pngbin7193 -> 7193 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__37.pngbin7156 -> 7156 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__38.pngbin6991 -> 6991 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__39.pngbin6864 -> 6864 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__4.pngbin7870 -> 7870 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__40.pngbin6810 -> 6810 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__41.pngbin6622 -> 6622 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__42.pngbin6480 -> 6480 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__43.pngbin6291 -> 6291 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__44.pngbin6147 -> 6147 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__45.pngbin6085 -> 6085 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__46.pngbin6053 -> 6053 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__47.pngbin5996 -> 5996 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__48.pngbin6029 -> 6029 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__49.pngbin6016 -> 6016 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__50.pngbin6104 -> 6104 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__51.pngbin6219 -> 6219 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__52.pngbin6234 -> 6234 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__53.pngbin6287 -> 6287 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__54.pngbin6349 -> 6349 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__55.pngbin6395 -> 6395 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__56.pngbin6436 -> 6436 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__57.pngbin6489 -> 6489 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__58.pngbin6591 -> 6591 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__59.pngbin6787 -> 6787 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__6.pngbin7575 -> 7575 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__60.pngbin7084 -> 7084 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__61.pngbin7293 -> 7293 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__62.pngbin7655 -> 7655 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__63.pngbin7922 -> 7922 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__64.pngbin8190 -> 8190 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__65.pngbin8491 -> 8491 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__66.pngbin8697 -> 8697 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__67.pngbin8815 -> 8815 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__68.pngbin8933 -> 8933 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__69.pngbin8936 -> 8936 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__7.pngbin7408 -> 7408 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__70.pngbin8879 -> 8879 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__71.pngbin8847 -> 8847 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__8.pngbin7322 -> 7322 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/lucky cat/obj4__9.pngbin7208 -> 7208 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__0.pngbin8798 -> 8798 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__1.pngbin9015 -> 9015 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__10.pngbin10539 -> 10539 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__11.pngbin10430 -> 10430 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__12.pngbin10340 -> 10340 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__13.pngbin10180 -> 10180 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__14.pngbin10262 -> 10262 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__15.pngbin10530 -> 10530 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__16.pngbin10597 -> 10597 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__17.pngbin10387 -> 10387 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__18.pngbin10101 -> 10101 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__19.pngbin10029 -> 10029 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__2.pngbin9112 -> 9112 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__20.pngbin9964 -> 9964 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__21.pngbin9810 -> 9810 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__22.pngbin9754 -> 9754 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__23.pngbin9729 -> 9729 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__24.pngbin9996 -> 9996 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__25.pngbin10146 -> 10146 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__26.pngbin10412 -> 10412 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__27.pngbin10534 -> 10534 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__28.pngbin10334 -> 10334 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__29.pngbin10140 -> 10140 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__3.pngbin9447 -> 9447 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__30.pngbin9766 -> 9766 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__31.pngbin9482 -> 9482 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__32.pngbin9242 -> 9242 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__33.pngbin9101 -> 9101 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__34.pngbin8974 -> 8974 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__35.pngbin8984 -> 8984 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__36.pngbin8970 -> 8970 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__37.pngbin9095 -> 9095 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__38.pngbin9257 -> 9257 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__39.pngbin9419 -> 9419 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__4.pngbin9795 -> 9795 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__40.pngbin9638 -> 9638 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__41.pngbin9831 -> 9831 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__42.pngbin10252 -> 10252 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__43.pngbin10760 -> 10760 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__44.pngbin11361 -> 11361 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__45.pngbin11797 -> 11797 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__46.pngbin11669 -> 11669 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__47.pngbin11490 -> 11490 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__48.pngbin11216 -> 11216 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__49.pngbin11092 -> 11092 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__5.pngbin10078 -> 10078 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__50.pngbin11029 -> 11029 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__51.pngbin10943 -> 10943 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__52.pngbin10954 -> 10954 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__53.pngbin10977 -> 10977 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__54.pngbin11049 -> 11049 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__55.pngbin11039 -> 11039 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__56.pngbin11050 -> 11050 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__57.pngbin10966 -> 10966 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__58.pngbin11140 -> 11140 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__59.pngbin11316 -> 11316 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__6.pngbin10480 -> 10480 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__60.pngbin11584 -> 11584 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__61.pngbin11718 -> 11718 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__62.pngbin11234 -> 11234 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__63.pngbin10707 -> 10707 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__64.pngbin10242 -> 10242 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__65.pngbin9884 -> 9884 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__66.pngbin9735 -> 9735 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__67.pngbin9488 -> 9488 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__68.pngbin9203 -> 9203 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__69.pngbin9202 -> 9202 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__7.pngbin11082 -> 11082 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__70.pngbin9072 -> 9072 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__71.pngbin8853 -> 8853 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__8.pngbin11039 -> 11039 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/images/money pig/obj13__9.pngbin10732 -> 10732 bytes
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/little_car.off0
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/lucky_cat.off0
-rw-r--r--[-rwxr-xr-x]data/points/COIL_database/money_pig.off0
-rw-r--r--[-rwxr-xr-x]data/points/SO3_10000.off0
-rw-r--r--[-rwxr-xr-x]data/points/SO3_50000.off0
-rw-r--r--data/points/alphacomplexdoc.off10
-rw-r--r--data/points/generator/CMakeLists.txt18
-rw-r--r--data/points/generator/README20
-rwxr-xr-xdata/points/generator/aurelien_alvarez_surfaces_in_R8.py90
-rw-r--r--data/points/generator/hypergenerator.cpp16
-rw-r--r--data/points/grid_10_10_10_in_0_1.off1002
-rw-r--r--data/points/iso_cuboid_3_in_0_1.txt1
-rw-r--r--[-rwxr-xr-x]data/points/sphere3D_2646.off0
-rw-r--r--data/points/spiral_3d_10k.off10002
-rw-r--r--data/points/spiral_4d_10k.off10002
-rw-r--r--[-rwxr-xr-x]data/points/tore3D_1307.off0
-rw-r--r--data/points/tore3D_1307.txt1307
-rw-r--r--data/points/tore3D_300.off302
-rwxr-xr-xscripts/generate_version.sh47
-rw-r--r--src/Alpha_complex/doc/Intro_alpha_complex.h170
-rw-r--r--src/Alpha_complex/doc/alpha_complex_doc.ipe595
-rw-r--r--src/Alpha_complex/doc/alpha_complex_doc.pngbin0 -> 25554 bytes
-rw-r--r--src/Alpha_complex/doc/alpha_complex_doc_420.ipe514
-rw-r--r--src/Alpha_complex/doc/alpha_complex_doc_420.pngbin0 -> 80794 bytes
-rw-r--r--src/Alpha_complex/doc/alpha_complex_representation.ipe321
-rw-r--r--src/Alpha_complex/doc/alpha_complex_representation.pngbin0 -> 14606 bytes
-rw-r--r--src/Alpha_complex/example/Alpha_complex_from_off.cpp56
-rw-r--r--src/Alpha_complex/example/Alpha_complex_from_points.cpp62
-rw-r--r--src/Alpha_complex/example/CMakeLists.txt33
-rw-r--r--src/Alpha_complex/example/alphaoffreader_for_doc_32.txt22
-rw-r--r--src/Alpha_complex/example/alphaoffreader_for_doc_60.txt27
-rw-r--r--src/Alpha_complex/include/gudhi/Alpha_complex.h419
-rw-r--r--src/Alpha_complex/test/Alpha_complex_unit_test.cpp243
-rw-r--r--src/Alpha_complex/test/CMakeLists.txt38
-rw-r--r--src/Alpha_complex/test/README (renamed from src/Alpha_shapes/test/README)4
-rw-r--r--src/Alpha_shapes/example/CMakeLists.txt40
-rw-r--r--src/Alpha_shapes/example/Delaunay_triangulation_off_rw.cpp105
-rw-r--r--src/Alpha_shapes/example/Simplex_tree_from_delaunay_triangulation.cpp103
-rw-r--r--src/Alpha_shapes/include/gudhi/Alpha_shapes.h200
-rw-r--r--src/Alpha_shapes/include/gudhi/Alpha_shapes/Delaunay_triangulation_off_io.h213
-rw-r--r--src/Alpha_shapes/test/Alpha_shapes_unit_test.cpp126
-rw-r--r--src/Alpha_shapes/test/CMakeLists.txt56
-rw-r--r--src/Alpha_shapes/test/S4_100.off102
-rw-r--r--src/Alpha_shapes/test/S8_10.off12
-rw-r--r--src/Bitmap_cubical_complex/doc/Cubical_complex_representation.ipe732
-rw-r--r--src/Bitmap_cubical_complex/doc/Cubical_complex_representation.pngbin0 -> 19167 bytes
-rw-r--r--src/Bitmap_cubical_complex/doc/Gudhi_Cubical_Complex_doc.h159
-rw-r--r--src/Bitmap_cubical_complex/doc/bitmapAllCubes.pngbin0 -> 38944 bytes
-rw-r--r--src/Bitmap_cubical_complex/doc/exampleBitmap.pngbin0 -> 2549 bytes
-rw-r--r--src/Bitmap_cubical_complex/example/Bitmap_cubical_complex.cpp72
-rw-r--r--src/Bitmap_cubical_complex/example/Bitmap_cubical_complex_periodic_boundary_conditions.cpp74
-rw-r--r--src/Bitmap_cubical_complex/example/CMakeLists.txt26
-rw-r--r--src/Bitmap_cubical_complex/example/Random_bitmap_cubical_complex.cpp83
-rw-r--r--src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex.h595
-rw-r--r--src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex/counter.h144
-rw-r--r--src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_base.h817
-rw-r--r--src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h308
-rw-r--r--src/Bitmap_cubical_complex/test/Bitmap_test.cpp1378
-rw-r--r--src/Bitmap_cubical_complex/test/CMakeLists.txt24
-rw-r--r--src/Bottleneck_distance/example/CMakeLists.txt26
-rw-r--r--src/Bottleneck_distance/example/bottleneck_example.cpp2
-rw-r--r--src/Bottleneck_distance/include/gudhi/Planar_neighbors_finder.h4
-rw-r--r--src/Bottleneck_distance/test/CMakeLists.txt65
-rw-r--r--src/CMakeLists.txt175
-rw-r--r--src/Contraction/doc/sphere_contraction_representation.pngbin0 -> 44839 bytes
-rw-r--r--src/Contraction/example/CMakeLists.txt8
-rw-r--r--src/Contraction/example/Garland_heckbert.cpp49
-rw-r--r--[-rwxr-xr-x]src/Contraction/example/Garland_heckbert/Error_quadric.h346
-rw-r--r--src/Contraction/example/Rips_contraction.cpp101
-rw-r--r--src/Contraction/include/gudhi/Contraction/CGAL_queue/Modifiable_priority_queue.h124
-rw-r--r--src/Contraction/include/gudhi/Contraction/Edge_profile.h200
-rw-r--r--src/Contraction/include/gudhi/Contraction/policies/Contraction_visitor.h164
-rw-r--r--src/Contraction/include/gudhi/Contraction/policies/Cost_policy.h76
-rw-r--r--src/Contraction/include/gudhi/Contraction/policies/Dummy_valid_contraction.h84
-rw-r--r--src/Contraction/include/gudhi/Contraction/policies/Edge_length_cost.h90
-rw-r--r--src/Contraction/include/gudhi/Contraction/policies/First_vertex_placement.h81
-rw-r--r--src/Contraction/include/gudhi/Contraction/policies/Link_condition_valid_contraction.h96
-rw-r--r--src/Contraction/include/gudhi/Contraction/policies/Middle_placement.h87
-rw-r--r--src/Contraction/include/gudhi/Contraction/policies/Placement_policy.h76
-rw-r--r--src/Contraction/include/gudhi/Contraction/policies/Valid_contraction_policy.h80
-rw-r--r--src/Contraction/include/gudhi/Edge_contraction.h47
-rw-r--r--src/Contraction/include/gudhi/Skeleton_blocker_contractor.h1026
-rw-r--r--src/Doxyfile55
-rw-r--r--src/GUDHIConfig.cmake.in7
-rw-r--r--src/GUDHIConfigVersion.cmake.in11
-rw-r--r--src/GudhUI/CMakeLists.txt115
-rw-r--r--src/GudhUI/gui/MainWindow.cpp385
-rw-r--r--src/GudhUI/gui/MainWindow.h144
-rw-r--r--src/GudhUI/gui/MenuEdgeContraction.ui236
-rw-r--r--src/GudhUI/gui/Menu_edge_contraction.cpp118
-rw-r--r--src/GudhUI/gui/Menu_edge_contraction.h75
-rw-r--r--src/GudhUI/gui/Menu_k_nearest_neighbors.cpp82
-rw-r--r--src/GudhUI/gui/Menu_k_nearest_neighbors.h58
-rw-r--r--src/GudhUI/gui/Menu_persistence.cpp45
-rw-r--r--src/GudhUI/gui/Menu_persistence.h42
-rw-r--r--src/GudhUI/gui/Menu_uniform_neighbors.cpp87
-rw-r--r--src/GudhUI/gui/Menu_uniform_neighbors.h57
-rw-r--r--src/GudhUI/gui/Viewer.cpp0
-rw-r--r--src/GudhUI/gui/Viewer_instructor.cpp0
-rw-r--r--src/GudhUI/gui/gudhui.cpp55
-rw-r--r--src/GudhUI/model/Complex_typedefs.h50
-rw-r--r--src/GudhUI/model/Model.h651
-rw-r--r--src/GudhUI/utils/Bar_code_persistence.h90
-rw-r--r--src/GudhUI/utils/Critical_points.h203
-rw-r--r--src/GudhUI/utils/Edge_collapsor.h156
-rw-r--r--src/GudhUI/utils/Edge_contractor.h158
-rw-r--r--src/GudhUI/utils/Furthest_point_epsilon_net.h244
-rw-r--r--src/GudhUI/utils/Is_manifold.h117
-rw-r--r--src/GudhUI/utils/K_nearest_builder.h143
-rw-r--r--src/GudhUI/utils/Lloyd_builder.h133
-rw-r--r--src/GudhUI/utils/MClock.h109
-rw-r--r--src/GudhUI/utils/Persistence_compute.h132
-rw-r--r--src/GudhUI/utils/Rips_builder.h99
-rw-r--r--src/GudhUI/utils/UI_utils.h52
-rw-r--r--src/GudhUI/utils/Vertex_collapsor.h140
-rw-r--r--src/GudhUI/view/Color.h42
-rw-r--r--src/GudhUI/view/FirstCoordProjector.h46
-rw-r--r--src/GudhUI/view/Projector3D.h47
-rw-r--r--src/GudhUI/view/View_parameter.h264
-rw-r--r--src/GudhUI/view/Viewer.cpp303
-rw-r--r--[-rwxr-xr-x]src/GudhUI/view/Viewer.h216
-rw-r--r--src/GudhUI/view/Viewer_instructor.cpp272
-rw-r--r--[-rwxr-xr-x]src/GudhUI/view/Viewer_instructor.h225
-rw-r--r--src/Hasse_complex/example/CMakeLists.txt5
-rw-r--r--src/Hasse_complex/example/hasse_complex_from_simplex_tree.cpp124
-rw-r--r--src/Hasse_complex/include/gudhi/Hasse_complex.h348
-rw-r--r--src/Persistent_cohomology/concept/FilteredComplex.h17
-rw-r--r--src/Persistent_cohomology/doc/3DTorus_poch.pngbin0 -> 40164 bytes
-rw-r--r--src/Persistent_cohomology/doc/Intro_persistent_cohomology.h206
-rw-r--r--src/Persistent_cohomology/example/CMakeLists.txt107
-rw-r--r--src/Persistent_cohomology/example/README108
-rw-r--r--src/Persistent_cohomology/example/alpha_complex_3d_persistence.cpp (renamed from src/Persistent_cohomology/example/alpha_shapes_persistence.cpp)271
-rw-r--r--src/Persistent_cohomology/example/alpha_complex_persistence.cpp117
-rw-r--r--src/Persistent_cohomology/example/custom_persistence_sort.cpp116
-rw-r--r--src/Persistent_cohomology/example/performance_rips_persistence.cpp227
-rw-r--r--src/Persistent_cohomology/example/periodic_alpha_complex_3d_persistence.cpp313
-rw-r--r--src/Persistent_cohomology/example/persistence_from_file.cpp239
-rw-r--r--src/Persistent_cohomology/example/persistence_from_simple_simplex_tree.cpp135
-rw-r--r--src/Persistent_cohomology/example/plain_homology.cpp95
-rw-r--r--src/Persistent_cohomology/example/rips_multifield_persistence.cpp237
-rw-r--r--src/Persistent_cohomology/example/rips_persistence.cpp224
-rw-r--r--src/Persistent_cohomology/example/rips_persistence_via_boundary_matrix.cpp180
-rw-r--r--src/Persistent_cohomology/include/gudhi/Persistent_cohomology.h409
-rw-r--r--src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Field_Zp.h27
-rw-r--r--src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Multi_field.h20
-rw-r--r--src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Persistent_cohomology_column.h34
-rw-r--r--src/Persistent_cohomology/test/CMakeLists.txt26
-rw-r--r--src/Persistent_cohomology/test/betti_numbers_unit_test.cpp234
-rw-r--r--src/Persistent_cohomology/test/persistent_cohomology_unit_test.cpp56
-rw-r--r--src/Persistent_cohomology/test/persistent_cohomology_unit_test_multi_field.cpp95
-rw-r--r--src/Persistent_cohomology/test/simplex_tree_file_for_multi_field_unit_test.txt58
-rw-r--r--src/Persistent_cohomology/test/simplex_tree_file_for_multi_field_unit_test.txt.REMOVED.git-id1
-rw-r--r--src/Simplex_tree/concept/IndexingTag.h2
-rw-r--r--src/Simplex_tree/concept/SimplexKey.h4
-rw-r--r--src/Simplex_tree/concept/SimplexTreeOptions.h43
-rw-r--r--src/Simplex_tree/concept/VertexHandle.h3
-rw-r--r--src/Simplex_tree/doc/Intro_simplex_tree.h84
-rw-r--r--src/Simplex_tree/doc/Simplex_tree_representation.pngbin0 -> 39217 bytes
-rw-r--r--src/Simplex_tree/example/CMakeLists.txt34
-rw-r--r--src/Simplex_tree/example/README4
-rw-r--r--src/Simplex_tree/example/mini_simplex_tree.cpp69
-rw-r--r--src/Simplex_tree/example/simple_simplex_tree.cpp140
-rw-r--r--src/Simplex_tree/example/simplex_tree_from_alpha_shapes_3.cpp443
-rw-r--r--src/Simplex_tree/example/simplex_tree_from_cliques_of_graph.cpp114
-rw-r--r--src/Simplex_tree/example/simplex_tree_from_file.cpp104
-rw-r--r--src/Simplex_tree/include/gudhi/Simplex_tree.h964
-rw-r--r--src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_iterators.h104
-rw-r--r--src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h49
-rw-r--r--src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_siblings.h44
-rw-r--r--src/Simplex_tree/include/gudhi/Simplex_tree/indexing_tag.h6
-rw-r--r--src/Simplex_tree/test/CMakeLists.txt12
-rw-r--r--src/Simplex_tree/test/simplex_tree_unit_test.cpp1109
-rw-r--r--src/Skeleton_blocker/concept/SkeletonBlockerDS.h9
-rw-r--r--src/Skeleton_blocker/concept/SkeletonBlockerGeometricDS.h9
-rw-r--r--src/Skeleton_blocker/example/CMakeLists.txt8
-rw-r--r--src/Skeleton_blocker/example/Skeleton_blocker_from_simplices.cpp117
-rw-r--r--src/Skeleton_blocker/example/Skeleton_blocker_iteration.cpp132
-rw-r--r--src/Skeleton_blocker/example/Skeleton_blocker_link.cpp98
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h67
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_complex_visitor.h26
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.h20
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h26
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h18
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h17
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h21
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h59
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Top_faces.h105
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Trie.h466
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h231
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h281
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_iterators.h19
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h679
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_triangles_iterators.h413
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_vertices_iterators.h324
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h266
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker_geometric_complex.h64
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker_link_complex.h69
-rw-r--r--src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h123
-rw-r--r--src/Skeleton_blocker/test/CMakeLists.txt10
-rw-r--r--src/Skeleton_blocker/test/TestGeometricComplex.cpp156
-rw-r--r--src/Skeleton_blocker/test/TestSimplifiable.cpp622
-rw-r--r--src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp1656
-rw-r--r--src/Witness_complex/concept/Simplicial_complex_for_witness.h87
-rw-r--r--src/Witness_complex/doc/Witness_complex_doc.h42
-rw-r--r--src/Witness_complex/doc/Witness_complex_representation.pngbin0 -> 48899 bytes
-rw-r--r--src/Witness_complex/doc/bench_Cy8.pngbin0 -> 15254 bytes
-rw-r--r--src/Witness_complex/doc/bench_sphere.pngbin0 -> 16614 bytes
-rw-r--r--src/Witness_complex/example/CMakeLists.txt16
-rw-r--r--src/Witness_complex/example/generators.h147
-rw-r--r--src/Witness_complex/example/witness_complex_from_file.cpp100
-rw-r--r--src/Witness_complex/example/witness_complex_sphere.cpp90
-rw-r--r--src/Witness_complex/include/gudhi/Landmark_choice_by_furthest_point.h105
-rw-r--r--src/Witness_complex/include/gudhi/Landmark_choice_by_random_point.h96
-rw-r--r--src/Witness_complex/include/gudhi/Witness_complex.h265
-rw-r--r--src/Witness_complex/test/CMakeLists.txt30
-rw-r--r--src/Witness_complex/test/simple_witness_complex.cpp59
-rw-r--r--src/Witness_complex/test/witness_complex_points.cpp64
-rw-r--r--src/cmake/modules/FindEigen3.cmake86
-rw-r--r--src/cmake/modules/FindQGLViewer.cmake61
-rw-r--r--src/cmake/modules/FindTBB.cmake425
-rw-r--r--src/cmake/modules/GUDHI_doxygen_target.txt11
-rw-r--r--src/cmake/modules/GUDHI_user_version_target.txt115
-rw-r--r--src/cmake/modules/UseEigen3.cmake9
-rw-r--r--src/cmake/modules/UseTBB.cmake6
-rw-r--r--src/common/doc/Gudhi_banner.jpgbin34437 -> 0 bytes
-rw-r--r--src/common/doc/Gudhi_banner.pngbin0 -> 34877 bytes
-rw-r--r--src/common/doc/footer.html29
-rw-r--r--src/common/doc/header.html83
-rw-r--r--src/common/doc/main_page.h398
-rw-r--r--src/common/doc/stylesheet.css1367
-rw-r--r--src/common/example/CGAL_3D_points_off_reader.cpp41
-rw-r--r--src/common/example/CGAL_points_off_reader.cpp46
-rw-r--r--src/common/example/CMakeLists.txt17
-rw-r--r--src/common/example/cgal3Doffreader_result.txt8
-rw-r--r--src/common/example/cgaloffreader_result.txt7
-rw-r--r--src/common/include/gudhi/Clock.h151
-rw-r--r--src/common/include/gudhi/Debug_utils.h55
-rw-r--r--src/common/include/gudhi/Off_reader.h306
-rw-r--r--src/common/include/gudhi/Point.h286
-rw-r--r--src/common/include/gudhi/Points_3D_off_io.h202
-rw-r--r--src/common/include/gudhi/Points_off_io.h184
-rw-r--r--src/common/include/gudhi/Simple_object_pool.h81
-rw-r--r--src/common/include/gudhi/Test.h156
-rw-r--r--src/common/include/gudhi/Utils.h48
-rw-r--r--src/common/include/gudhi/allocator.h55
-rw-r--r--src/common/include/gudhi/distance_functions.h66
-rw-r--r--src/common/include/gudhi/graph_simplicial_complex.h125
-rw-r--r--src/common/include/gudhi/reader_utils.h199
-rw-r--r--src/common/test/CMakeLists.txt35
-rw-r--r--src/common/test/README14
-rw-r--r--src/common/test/dtoffrw_alphashapedoc_result.off7
-rw-r--r--src/common/test/points_off_reader_unit_test.cpp78
-rw-r--r--src/debian/changelog5
-rw-r--r--src/debian/compat1
-rw-r--r--src/debian/control26
-rw-r--r--src/debian/copyright28
-rw-r--r--src/debian/docs2
-rwxr-xr-xsrc/debian/rules28
-rw-r--r--src/debian/source/format1
559 files changed, 48622 insertions, 11336 deletions
diff --git a/CMakeGUDHIVersion.txt b/CMakeGUDHIVersion.txt
new file mode 100644
index 00000000..a00ae1b2
--- /dev/null
+++ b/CMakeGUDHIVersion.txt
@@ -0,0 +1,6 @@
+set (GUDHI_MAJOR_VERSION 1)
+set (GUDHI_MINOR_VERSION 3)
+set (GUDHI_PATCH_VERSION 1)
+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 dccd59d8..7f029b9d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,50 +1,104 @@
cmake_minimum_required(VERSION 2.6)
project(GUDHIdev)
-find_package(Boost REQUIRED COMPONENTS system filesystem unit_test_framework chrono timer program_options thread REQUIRED)
+include(CMakeGUDHIVersion.txt)
+# Generate GUDHI official version file
+configure_file(GUDHIVersion.cmake.in "${CMAKE_SOURCE_DIR}/GUDHIVersion.cmake" @ONLY)
-set(CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/src/cmake/modules/")
-set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/src/cmake/modules/")
-message("CMAKE_PREFIX_PATH = ${CMAKE_PREFIX_PATH}")
-message("CMAKE_MODULE_PATH = ${CMAKE_MODULE_PATH}")
-
-enable_testing()
-
-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} -O0 -g -std=c++11 -Wall -Wpedantic -Wsign-compare")
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -ggdb -O0")
- set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
-endif()
-
-set(Boost_USE_STATIC_LIBS ON)
-set(Boost_USE_MULTITHREADED ON)
-set(Boost_USE_STATIC_RUNTIME OFF)
-
-find_package(Boost)
-find_package(GMP)
-if(GMP_FOUND)
- find_package(GMPXX)
-endif()
-
-find_package(CGAL)
-
-# 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_package(Boost REQUIRED COMPONENTS system filesystem unit_test_framework chrono timer date_time program_options thread REQUIRED)
if(NOT Boost_FOUND)
message(FATAL_ERROR "NOTICE: This demo requires Boost and will not be compiled.")
else()
+
+ set(CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/src/cmake/modules/")
+ set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/src/cmake/modules/")
+ message("CMAKE_PREFIX_PATH = ${CMAKE_PREFIX_PATH}")
+ message("CMAKE_MODULE_PATH = ${CMAKE_MODULE_PATH}")
+
+ enable_testing()
+
+ # For "make user_version"
+ include(${CMAKE_MODULE_PATH}/GUDHI_user_version_target.txt)
+ # For "make doxygen"
+ 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_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} )
+ 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)
+
+ # 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
@@ -54,17 +108,27 @@ else()
LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})
message(STATUS "boost include dirs:" ${Boost_INCLUDE_DIRS})
+ message(STATUS "boost library dirs:" ${Boost_LIBRARY_DIRS})
+
+ if (DEBUG_TRACES)
+ # For programs to be more verbose
+ message(STATUS "DEBUG_TRACES are activated")
+ add_definitions(-DDEBUG_TRACES)
+ endif()
include_directories(src/common/include/)
- include_directories(src/Alpha_shapes/include/)
+ include_directories(src/Alpha_complex/include/)
+ include_directories(src/Bitmap_cubical_complex/include/)
include_directories(src/Bottleneck_distance/include/)
- include_directories(src/Bottleneck/include/)
include_directories(src/Contraction/include/)
include_directories(src/Hasse_complex/include/)
include_directories(src/Persistent_cohomology/include/)
include_directories(src/Simplex_tree/include/)
include_directories(src/Skeleton_blocker/include/)
+ include_directories(src/Witness_complex/include/)
+ add_subdirectory(src/common/example)
+ add_subdirectory(src/common/test)
add_subdirectory(src/Simplex_tree/test)
add_subdirectory(src/Simplex_tree/example)
add_subdirectory(src/Persistent_cohomology/test)
@@ -72,14 +136,22 @@ else()
add_subdirectory(src/Skeleton_blocker/test)
add_subdirectory(src/Skeleton_blocker/example)
add_subdirectory(src/Contraction/example)
- add_subdirectory(src/Hasse_complex/example)
- add_subdirectory(src/Alpha_shapes/example)
- add_subdirectory(src/Alpha_shapes/test)
+ add_subdirectory(src/Witness_complex/test)
+ add_subdirectory(src/Witness_complex/example)
+ add_subdirectory(src/Bitmap_cubical_complex/test)
+ add_subdirectory(src/Bitmap_cubical_complex/example)
+ add_subdirectory(src/Alpha_complex/example)
+ add_subdirectory(src/Alpha_complex/test)
add_subdirectory(src/Bottleneck_distance/example)
add_subdirectory(src/Bottleneck_distance/test)
# data points generator
add_subdirectory(data/points/generator)
-endif()
+ # Please let GudhUI in last compilation position as QT is known to modify CMAKE_CXX_FLAGS
+ # GudhUI
+ add_subdirectory(src/GudhUI)
+
+endif()
+
diff --git a/Conventions.txt b/Conventions.txt
index f7d6831e..e4ae7925 100644
--- a/Conventions.txt
+++ b/Conventions.txt
@@ -1,75 +1 @@
-Please read this convention before adding your package(s) into Gudhi library.
-
-
-Compilation:
-*********************
-CMake is used for compilation purpose.
-
-
-
-Naming conventions:
-*********************
-
-All headers are named *.h and all sources are named *.cpp.
-Concepts are named with camel case starting with uppercase that is "PersistentHomology.h"
-for instance for the concept of Persitence homology.
-Classes and methods are named with underscore separator that is :
-- "Skeleton_blocker_contractor.h" for the class Skeleton_blocker_contractor
-- "int num_vertices() const" for a method
-
-
-Package organization:
-*********************
-The Gudhi directories are organised by 2 manners (Internal for svn developpers and User for external User/Developper).
-
-Internal:
---------
-
-src/common/concept/common_concept.h
- doc/MainPage.h
- include/gudhi/io.h
- ....h
- package1/concept/package1_concept1.h
- ....h
- doc/Intro_package.h
- include/gudhi/*.h
- source/*.cpp
- test/*.cpp
- CMakeLists.txt
- example/*.cpp
- CMakeLists.txt
- package2/...
- ...
- cmake/modules/*.cmake
-
-data/points/kl.txt
- sphere_3D.txt
- ....txt
- meshes/sphere.off
- Paris.off
-scripts/generate_version.sh
- ....sh
- ....py
-Doxyfile
-CMakeLists.txt
-Version.txt
-Conventions.txt
-README
-COPYING
-
-User:
---------
-
-include/gudhi/*.h
-source/*.cpp
-example/package1/*.cpp
- CMakeLists.txt
- package2/*.cpp
- CMakeLists.txt
- ...
-cmake/modules/*.cmake
-CMakeLists.txt
-Version.txt
-Conventions.txt
-README
-COPYING
+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/GUDHIVersion.cmake.in b/GUDHIVersion.cmake.in
new file mode 100644
index 00000000..2f433c1c
--- /dev/null
+++ b/GUDHIVersion.cmake.in
@@ -0,0 +1 @@
+@GUDHI_VERSION@
diff --git a/Version.txt b/Version.txt
deleted file mode 100644
index 9084fa2f..00000000
--- a/Version.txt
+++ /dev/null
@@ -1 +0,0 @@
-1.1.0
diff --git a/biblio/bibliography.bib b/biblio/bibliography.bib
index 3fd1c10a..9fc01a5d 100644
--- a/biblio/bibliography.bib
+++ b/biblio/bibliography.bib
@@ -927,3 +927,30 @@ misc{jplex_cite,
year = "2009",
note = "http://comptop.stanford.edu/programs/jplex/"
}
+
+@book{kaczynski2004computational,
+ title={Computational Homology},
+ author={Kaczynski, T. and Mischaikow, K. and Mrozek, M.},
+ isbn={9780387408538},
+ lccn={03061109},
+ series={Applied Mathematical Sciences},
+ url={https://books.google.fr/books?id=AShKtpi3GecC},
+ year={2004},
+ publisher={Springer New York}
+}
+
+@ARTICLE{peikert2012topological,
+year={2012},
+isbn={978-3-642-23174-2},
+booktitle={Topological Methods in Data Analysis and Visualization II},
+series={Mathematics and Visualization},
+editor={Peikert, Ronald and Hauser, Helwig and Carr, Hamish and Fuchs, Raphael},
+doi={10.1007/978-3-642-23175-9_7},
+title={Efficient Computation of Persistent Homology for Cubical Data},
+url={http://dx.doi.org/10.1007/978-3-642-23175-9_7},
+publisher={Springer Berlin Heidelberg},
+author={Wagner, Hubert and Chen, Chao and Vucini, Erald},
+pages={91-106},
+language={English}
+}
+
diff --git a/biblio/how_to_cite_cgal.bib b/biblio/how_to_cite_cgal.bib
new file mode 100644
index 00000000..7336ee81
--- /dev/null
+++ b/biblio/how_to_cite_cgal.bib
@@ -0,0 +1,947 @@
+@book{ cgal:eb-15b
+, title = "{CGAL} User and Reference Manual"
+, author = "{The CGAL Project}"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, year = 2015
+, url = "http://doc.cgal.org/4.7/Manual/packages.html"
+}
+@incollection{cgal:h-af-15b
+, author = "Michael Hemmer"
+, title = "Algebraic Foundations"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgAlgebraicFoundationsSummary"
+, year = 2015
+}
+
+@incollection{cgal:hhkps-nt-15b
+, author = "Michael Hemmer and Susan Hert and Sylvain Pion and Stefan Schirra"
+, title = "Number Types"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgNumberTypesSummary"
+, year = 2015
+}
+
+@incollection{cgal:h-ma-15b
+, author = "Michael Hemmer and Sylvain Pion"
+, title = "Modular Arithmetic"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgModularArithmeticSummary"
+, year = 2015
+}
+
+@incollection{cgal:h-p-15b
+, author = "Michael Hemmer"
+, title = "Polynomial"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgPolynomialSummary"
+, year = 2015
+}
+
+@incollection{cgal:bht-ak-15b
+, author = "Eric Berberich and Michael Hemmer and Michael Kerber and Sylvain Lazard and Luis Pe{\~n}aranda and Monique Teillaud"
+, title = "Algebraic Kernel"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgAlgebraicKerneldSummary"
+, year = 2015
+}
+
+@incollection{cgal:h-msms-15b
+, author = "Michael Hoffmann"
+, title = "Monotone and Sorted Matrix Search"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgMatrixSearchSummary"
+, year = 2015
+}
+
+@incollection{cgal:fgsw-lqps-15b
+, author = "Kaspar Fischer and Bernd G{\"a}rtner and Sven Sch{\"o}nherr and Frans Wessendorp"
+, title = "Linear and Quadratic Programming Solver"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgQPSolverSummary"
+, year = 2015
+}
+
+@incollection{cgal:bfghhkps-lgk23-15b
+, author = "Herv{\'e} Br{\"o}nnimann and Andreas Fabri and Geert-Jan Giezeman and Susan Hert and Michael Hoffmann and Lutz Kettner and Sylvain Pion and Stefan Schirra"
+, title = "{2D} and {3D} Linear Geometry Kernel"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgKernel23Summary"
+, year = 2015
+}
+
+@incollection{cgal:s-gkd-15b
+, author = "Michael Seel"
+, title = "{dD} Geometry Kernel"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgKernelDSummary"
+, year = 2015
+}
+
+@incollection{cgal:cpt-cgk2-15b
+, author = "Pedro Machado Manh{\~a}es de Castro and Sylvain Pion and Monique Teillaud"
+, title = "{2D} Circular Geometry Kernel"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgCircularKernel2Summary"
+, year = 2015
+}
+
+@incollection{cgal:cclt-sgk3-15b
+, author = "Pedro Machado Manh{\~a}es de Castro and Fr{\'e}d{\'e}ric Cazals and S{\'e}bastien Loriot and Monique Teillaud"
+, title = "{3D} Spherical Geometry Kernel"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgSphericalKernel3Summary"
+, year = 2015
+}
+
+@incollection{cgal:hs-chep2-15b
+, author = "Susan Hert and Stefan Schirra"
+, title = "{2D} Convex Hulls and Extreme Points"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgConvexHull2Summary"
+, year = 2015
+}
+
+@incollection{cgal:hs-ch3-15b
+, author = "Susan Hert and Stefan Schirra"
+, title = "{3D} Convex Hulls"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgConvexHull3Summary"
+, year = 2015
+}
+
+@incollection{cgal:hs-chdt3-15b
+, author = "Susan Hert and Michael Seel"
+, title = "{dD} Convex Hulls and Delaunay Triangulations"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgConvexHullDSummary"
+, year = 2015
+}
+
+@incollection{cgal:gw-p2-15b
+, author = "Geert-Jan Giezeman and Wieger Wesselink"
+, title = "{2D} Polygons"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgPolygon2Summary"
+, year = 2015
+}
+
+@incollection{cgal:fwzh-rbso2-15b
+, author = "Efi Fogel and Ophir Setter and Ron Wein and Guy Zucker and Baruch Zukerman and Dan Halperin"
+, title = "{2D} Regularized Boolean Set-Operations"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgBooleanSetOperations2Summary"
+, year = 2015
+}
+
+@incollection{cgal:s-bonp2-15b
+, author = "Michael Seel"
+, title = "{2D} Boolean Operations on Nef Polygons"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgNef2Summary"
+, year = 2015
+}
+
+@incollection{cgal:hk-bonpes2-15b
+, author = "Peter Hachenberger and Lutz Kettner"
+, title = "{2D} Boolean Operations on Nef Polygons Embedded on the Sphere"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgNefS2Summary"
+, year = 2015
+}
+
+@incollection{cgal:h-pp2-15b
+, author = "Susan Hert"
+, title = "{2D} Polygon Partitioning"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgPolygonPartitioning2Summary"
+, year = 2015
+}
+
+@incollection{cgal:c-sspo2-15b
+, author = "Fernando Cacciola"
+, title = "{2D} Straight Skeleton and Polygon Offsetting"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgStraightSkeleton2Summary"
+, year = 2015
+}
+
+@incollection{cgal:w-rms2-15b
+, author = "Ron Wein and Alon Baram and Eyal Flato and Efi Fogel and Michael Hemmer and Sebastian Morr"
+, title = "{2D} Minkowski Sums"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgMinkowskiSum2Summary"
+, year = 2015
+}
+
+@incollection{cgal:f-ps2-15b
+, author = "Andreas Fabri"
+, title = "{2D} Polyline Simplification"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgPolylineSimplification2Summary"
+, year = 2015
+}
+
+@incollection{hhb-visibility-2-15b
+, author = "Michael Hemmer and Kan Huang and Francisc Bungiu and Ning Xu"
+, title = "{2D} Visibility Computation"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgVisibility_2Summary"
+, year = 2015
+}
+
+@incollection{cgal:k-ps-15b
+, author = "Lutz Kettner"
+, title = "{3D} Polyhedral Surface"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgPolyhedronSummary"
+, year = 2015
+}
+
+@incollection{cgal:k-hds-15b
+, author = "Lutz Kettner"
+, title = "Halfedge Data Structures"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgHDSSummary"
+, year = 2015
+}
+
+@incollection{cgal:bsmf-sm-15b
+, author = "Mario Botsch and Daniel Sieger and Philipp Moeller and Andreas Fabri"
+, title = "Surface Mesh"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgSurfaceMeshSummary"
+, year = 2015
+}
+
+@incollection{cgal:d-cm-15b
+, author = "Guillaume Damiand"
+, title = "Combinatorial Maps"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgCombinatorialMapsSummary"
+, year = 2015
+}
+
+@incollection{cgal:d-lcc-12-15b
+, author = "Guillaume Damiand"
+, title = "Linear Cell Complex"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgLinearCellComplexSummary"
+, year = 2015
+}
+
+@incollection{cgal:hk-bonp3-15b
+, author = "Peter Hachenberger and Lutz Kettner"
+, title = "{3D} Boolean Operations on Nef Polyhedra"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgNef3Summary"
+, year = 2015
+}
+
+@incollection{cgal:h-emspe-15b
+, author = "Peter Hachenberger"
+, title = "Convex Decomposition of Polyhedra"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgConvexDecomposition3Summary"
+, year = 2015
+}
+
+@incollection{cgal:h-msp3-15b
+, author = "Peter Hachenberger"
+, title = "{3D} Minkowski Sum of Polyhedra"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgMinkowskiSum3Summary"
+, year = 2015
+}
+
+@incollection{cgal:wfzh-a2-15b
+, author = "Ron Wein and Eric Berberich and Efi Fogel and Dan Halperin and Michael Hemmer and Oren Salzman and Baruch Zukerman"
+, title = "{2D} Arrangements"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgArrangement2Summary"
+, year = 2015
+}
+
+@incollection{cgal:wfz-ic2-15b
+, author = "Baruch Zukerman and Ron Wein and Efi Fogel"
+, title = "{2D} Intersection of Curves"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgIntersectionOfCurves2Summary"
+, year = 2015
+}
+
+@incollection{cgal:p-sr2-15b
+, author = "Eli Packer"
+, title = "{2D} Snap Rounding"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgSnapRounding2Summary"
+, year = 2015
+}
+
+@incollection{cgal:w-e2-15b
+, author = "Ron Wein"
+, title = "{2D} Envelopes"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgEnvelope2Summary"
+, year = 2015
+}
+
+@incollection{cgal:mwz-e3-15b
+, author = "Dan Halperin and Michal Meyerovitch and Ron Wein and Baruch Zukerman"
+, title = "{3D} Envelopes"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgEnvelope3Summary"
+, year = 2015
+}
+
+@incollection{cgal:y-t2-15b
+, author = "Mariette Yvinec"
+, title = "{2D} Triangulation"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgTriangulation2Summary"
+, year = 2015
+}
+
+@incollection{cgal:py-tds2-15b
+, author = "Sylvain Pion and Mariette Yvinec"
+, title = "{2D} Triangulation Data Structure"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgTDS2Summary"
+, year = 2015
+}
+
+@incollection{cgal:k-pt2-13-15b
+, author = "Nico Kruithof"
+, title = "{2D} Periodic Triangulations"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgPeriodic2Triangulation2Summary"
+, year = 2015
+}
+
+@incollection{cgal:pt-t3-15b
+, author = "Cl{\'e}ment Jamin and Sylvain Pion and Monique Teillaud"
+, title = "{3D} Triangulations"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgTriangulation3Summary"
+, year = 2015
+}
+
+@incollection{cgal:pt-tds3-15b
+, author = "Cl{\'e}ment Jamin and Sylvain Pion and Monique Teillaud"
+, title = "{3D} Triangulation Data Structure"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgTDS3Summary"
+, year = 2015
+}
+
+@incollection{cgal:ct-pt3-15b
+, author = "Manuel Caroli and Monique Teillaud"
+, title = "{3D} Periodic Triangulations"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgPeriodic3Triangulation3Summary"
+, year = 2015
+}
+
+@incollection{cgal:hdj-t-15b
+, author = "Samuel Hornus and Olivier Devillers and Cl{\'e}ment Jamin"
+, title = "{dD} Triangulations"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgTriangulationsSummary"
+, year = 2015
+}
+
+@incollection{cgal:d-as2-15b
+, author = "Tran Kai Frank Da"
+, title = "{2D} Alpha Shapes"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgAlphaShape2Summary"
+, year = 2015
+}
+
+@incollection{cgal:dy-as3-15b
+, author = "Tran Kai Frank Da and S{\'e}bastien Loriot and Mariette Yvinec"
+, title = "{3D} Alpha Shapes"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgAlphaShapes3Summary"
+, year = 2015
+}
+
+@incollection{cgal:k-sdg2-15b
+, author = "Menelaos Karavelas"
+, title = "{2D} Segment Delaunay Graphs"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgSegmentDelaunayGraph2Summary"
+, year = 2015
+}
+
+@incollection{cgal:cdp-sdglinf2-15b
+, author = "Panagiotis Cheilaris and Sandeep Kumar Dey and Evanthia Papadopoulou"
+, title = "L Infinity Segment Delaunay Graphs"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgSDGLinfSummary"
+, year = 2015
+}
+
+@incollection{cgal:ky-ag2-15b
+, author = "Menelaos Karavelas and Mariette Yvinec"
+, title = "{2D} Apollonius Graphs (Delaunay Graphs of Disks)"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgApolloniusGraph2Summary"
+, year = 2015
+}
+
+@incollection{cgal:k-vda2-15b
+, author = "Menelaos Karavelas"
+, title = "{2D} Voronoi Diagram Adaptor"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgVoronoiDiagramAdaptor2Summary"
+, year = 2015
+}
+
+@incollection{cgal:r-ctm2-15b
+, author = "Laurent Rineau"
+, title = "{2D} Conforming Triangulations and Meshes"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgMesh2Summary"
+, year = 2015
+}
+
+@incollection{cgal:ry-smg-15b
+, author = "Laurent Rineau and Mariette Yvinec"
+, title = "{3D} Surface Mesh Generation"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgSurfaceMesher3Summary"
+, year = 2015
+}
+
+@incollection{cgal:asg-srps-15b
+, author = "Pierre Alliez and Laurent Saboret and Ga{\"e}l Guennebaud"
+, title = "Surface Reconstruction from Point Sets"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgSurfaceReconstructionFromPointSetsSummary"
+, year = 2015
+}
+
+@incollection{cgal:ssr3-15b
+, author = "Thijs van Lankveld"
+, title = "Scale-Space Surface Reconstruction"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgScaleSpaceReconstruction3Summary"
+, year = 2015
+}
+
+@incollection{cgal:dc-afsr-15b
+, author = "Tran Kai Frank Da and David Cohen-Steiner"
+, title = "Advancing Front Surface Reconstruction"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgAdvancingFrontSurfaceReconstructionSummary"
+, year = 2015
+}
+
+@incollection{cgal:k-ssm3-15b
+, author = "Nico Kruithof"
+, title = "{3D} Skin Surface Meshing"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgSkinSurface3Summary"
+, year = 2015
+}
+
+@incollection{cgal:rty-m3-15b
+, author = "Pierre Alliez and Cl{\'e}ment Jamin and Laurent Rineau and St{\'e}phane Tayeb and Jane Tournois and Mariette Yvinec"
+, title = "{3D} Mesh Generation"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgMesh_3Summary"
+, year = 2015
+}
+
+@incollection{cgal:lty-pmp-15b
+, author = "S{\'e}bastien Loriot and Jane Tournois and Ilker O. Yaz"
+, title = "Polygon Mesh Processing"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgPolygonMeshProcessingSummary"
+, year = 2015
+}
+
+@incollection{cgal:s-ssm2-15b
+, author = "Le-Jeng Andy Shiue"
+, title = "{3D} Surface Subdivision Methods"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgSurfaceSubdivisionMethods3Summary"
+, year = 2015
+}
+
+@incollection{cgal:y-smsimpl-15b
+, author = "Ilker O. Yaz and S{\'e}bastien Loriot"
+, title = "Triangulated Surface Mesh Segmentation"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgSurfaceSegmentationSummary"
+, year = 2015
+}
+
+@incollection{cgal:c-tsms-12-15b
+, author = "Fernando Cacciola"
+, title = "Triangulated Surface Mesh Simplification"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgSurfaceMeshSimplificationSummary"
+, year = 2015
+}
+
+@incollection{cgal:lsxy-tsmd-15b
+, author = "S{\'e}bastien Loriot and Olga Sorkine-Hornung and Yin Xu and Ilker O. Yaz"
+, title = "Triangulated Surface Mesh Deformation"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgSurfaceModelingSummary"
+, year = 2015
+}
+
+@incollection{cgal:sal-pptsm2-15b
+, author = "Laurent Saboret and Pierre Alliez and Bruno L{\'e}vy"
+, title = "Planar Parameterization of Triangulated Surface Meshes"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgSurfaceParameterizationSummary"
+, year = 2015
+}
+
+@incollection{cgal:klcdv-tsmsp-15b
+, author = "Stephen Kiazyk and S{\'e}bastien Loriot and {\'E}ric Colin de Verdi{\`e}re"
+, title = "Triangulated Surface Mesh Shortest Paths"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgSurfaceMeshShortestPathSummary"
+, year = 2015
+}
+
+@incollection{cgal:glt-tsms-15b
+, author = "Xiang Gao and S{\'e}bastien Loriot and Andrea Tagliasacchi"
+, title = "Triangulated Surface Mesh Skeletonization"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgMeanCurvatureSkeleton3Summary"
+, year = 2015
+}
+
+@incollection{cgal:cp-arutsm-15b
+, author = "Marc Pouget and Fr{\'e}d{\'e}ric Cazals"
+, title = "Approximation of Ridges and Umbilics on Triangulated Surface Meshes"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgRidges_3Summary"
+, year = 2015
+}
+
+@incollection{cgal:pc-eldp-15b
+, author = "Marc Pouget and Fr{\'e}d{\'e}ric Cazals"
+, title = "Estimation of Local Differential Properties of Point-Sampled Surfaces"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgJet_fitting_3Summary"
+, year = 2015
+}
+
+@incollection{cgal:ass-psp-15b
+, author = "Pierre Alliez and Cl{\'e}ment Jamin and Quentin M{\'e}rigot and Jocelyn Meyron and Laurent Saboret and Nader Salman and Shihao Wu"
+, title = "Point Set Processing"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgPointSetProcessingSummary"
+, year = 2015
+}
+
+@incollection{cgal:ovja-pssd-15b
+, author = "Sven Oesau and Yannick Verdie and Cl{\'e}ment Jamin and Pierre Alliez"
+, title = "Point Set Shape Detection"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgPointSetShapeDetection3Summary"
+, year = 2015
+}
+
+@incollection{cgal:m-ps-15b
+, author = "Abdelkrim Mebarki"
+, title = "{2D} Placement of Streamlines"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgPlacementOfStreamlines2Summary"
+, year = 2015
+}
+
+@incollection{cgal:b-ss2-15b
+, author = "Matthias B{\"a}sken"
+, title = "{2D} Range and Neighbor Search"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgPointSet2Summary"
+, year = 2015
+}
+
+@incollection{cgal:f-isl-15b
+, author = "Andreas Fabri"
+, title = "Interval Skip List"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgIntervalSkipListSummary"
+, year = 2015
+}
+
+@incollection{cgal:tf-ssd-15b
+, author = "Hans Tangelder and Andreas Fabri"
+, title = "{dD} Spatial Searching"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgSpatialSearchingDSummary"
+, year = 2015
+}
+
+@incollection{cgal:n-rstd-15b
+, author = "Gabriele Neyer"
+, title = "{dD} Range and Segment Trees"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgRangeSegmentTreesDSummary"
+, year = 2015
+}
+
+@incollection{cgal:kmz-isiobd-15b
+, author = "Lutz Kettner and Andreas Meyer and Afra Zomorodian"
+, title = "Intersecting Sequences of {dD} Iso-oriented Boxes"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgBoxIntersectionDSummary"
+, year = 2015
+}
+
+@incollection{cgal:atw-aabb-15b
+, author = "Pierre Alliez and St{\'e}phane Tayeb and Camille Wormser"
+, title = "{3D} Fast Intersection and Distance Computation"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgAABB_treeSummary"
+, year = 2015
+}
+
+@incollection{cgal:dd-ss-15b
+, author = "Christophe Delage and Olivier Devillers"
+, title = "Spatial Sorting"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgSpatialSortingSummary"
+, year = 2015
+}
+
+@incollection{cgal:fghhs-bv-15b
+, author = "Kaspar Fischer and Bernd G{\"a}rtner and Thomas Herrmann and Michael Hoffmann and Sven Sch{\"o}nherr"
+, title = "Bounding Volumes"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgBoundingVolumesSummary"
+, year = 2015
+}
+
+@incollection{cgal:hp-ia-15b
+, author = "Michael Hoffmann and Eli Packer"
+, title = "Inscribed Areas"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgInscribedAreasSummary"
+, year = 2015
+}
+
+@incollection{cgal:fghhs-od-15b
+, author = "Kaspar Fischer and Bernd G{\"a}rtner and Thomas Herrmann and Michael Hoffmann and Sven Sch{\"o}nherr"
+, title = "Optimal Distances"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgOptimalDistancesSummary"
+, year = 2015
+}
+
+@incollection{cgal:ap-pcad-15b
+, author = "Pierre Alliez and Sylvain Pion and Ankit Gupta"
+, title = "Principal Component Analysis"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgPrincipalComponentAnalysisDSummary"
+, year = 2015
+}
+
+@incollection{cgal:f-i-15b
+, author = "Julia Fl{\"o}totto"
+, title = "{2D} and Surface Function Interpolation"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgInterpolation2Summary"
+, year = 2015
+}
+
+@incollection{cgal:abha-gbc-15b
+, author = "Dmitry Anisimov and David Bommes and Kai Hormann and Pierre Alliez"
+, title = "{2D} Generalized Barycentric Coordinates"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgBarycentric_coordinates_2Summary"
+, year = 2015
+}
+
+@incollection{cgal:r-kds-15b
+, author = "Daniel Russel"
+, title = "Kinetic Data Structures"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgKdsSummary"
+, year = 2015
+}
+
+@incollection{cgal:r-kdsf-15b
+, author = "Daniel Russel"
+, title = "Kinetic Framework"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgKdsFrameworkSummary"
+, year = 2015
+}
+
+@incollection{cgal:hkpw-se-15b
+, author = "Michael Hoffmann and Lutz Kettner and Sylvain Pion and Ron Wein"
+, title = "STL Extensions for {CGAL}"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgStlExtensionSummary"
+, year = 2015
+}
+
+@incollection{cgal:cfw-cbgl-15b
+, author = "Andreas Fabri and Fernando Cacciola and Philipp Moeller and Ron Wein"
+, title = "{CGAL} and the {Boost} Graph Library"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgBGLSummary"
+, year = 2015
+}
+
+@incollection{cgal:fs-cbpm-15b
+, author = "Andreas Fabri and Laurent Saboret"
+, title = "{CGAL} and {Boost} Property Maps"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgProperty_mapSummary"
+, year = 2015
+}
+
+@incollection{cgal:dksy-hc-15b
+, author = "Olivier Devillers and Lutz Kettner and Sylvain Pion and Michael Seel and Mariette Yvinec"
+, title = "Handles and Circulators"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgHandlesAndCirculatorsSummary"
+, year = 2015
+}
+
+@incollection{cgal:dhhk-gog-15b
+, author = "Pedro M. M. de Castro and Olivier Devillers and Susan Hert and Michael Hoffmann and Lutz Kettner and Sven Sch{\"o}nherr and Alexandru Tifrea"
+, title = "Geometric Object Generators"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgGeneratorsSummary"
+, year = 2015
+}
+
+@incollection{cgal:kps-pthum-15b
+, author = "Lutz Kettner and Sylvain Pion and Michael Seel"
+, title = "Profiling tools, Hash Map, Union-find, Modifiers"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgProfilingToolsSummary"
+, year = 2015
+}
+
+@incollection{cgal:fgk-ios-12-15b
+, author = "Andreas Fabri and Geert-Jan Giezeman and Lutz Kettner"
+, title = "IO Streams"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgIOstreamsSummary"
+, year = 2015
+}
+
+@incollection{cgal:fp-gv-15b
+, author = "Andreas Fabri and Sylvain Pion"
+, title = "Geomview"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgGeomviewSummary"
+, year = 2015
+}
+
+@incollection{cgal:fr-cqgvf-15b
+, author = "Andreas Fabri and Laurent Rineau"
+, title = "{CGAL} and the {Qt} Graphics View Framework"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgGraphicsViewSummary"
+, year = 2015
+}
+
+@incollection{cgal:lp-gi-15b
+, author = "Olivier Devillers and S{\'e}bastien Loriot and Sylvain Pion"
+, title = "{CGAL} Ipelets"
+, publisher = "{CGAL Editorial Board}"
+, edition = "{4.7}"
+, booktitle = "{CGAL} User and Reference Manual"
+, url = "http://doc.cgal.org/4.7/Manual/packages.html#PkgCGALIpeletsSummary"
+, year = 2015
+}
diff --git a/biblio/how_to_cite_gudhi.bib b/biblio/how_to_cite_gudhi.bib
new file mode 100644
index 00000000..3c0d0b20
--- /dev/null
+++ b/biblio/how_to_cite_gudhi.bib
@@ -0,0 +1,70 @@
+@book{gudhi:urm
+, title = "{GUDHI} User and Reference Manual"
+, author = "{The GUDHI Project}"
+, publisher = "{GUDHI Editorial Board}"
+, year = 2015
+, url = "http://gudhi.gforge.inria.fr/doc/latest/"
+}
+
+@incollection{gudhi:FilteredComplexes
+, author = "Cl\'ement Maria"
+, title = "Filtered Complexes"
+, publisher = "{GUDHI Editorial Board}"
+, booktitle = "{GUDHI} User and Reference Manual"
+, url = "http://gudhi.gforge.inria.fr/doc/latest/group__simplex__tree.html"
+, year = 2015
+}
+
+@incollection{gudhi:PersistentCohomology
+, author = "Cl\'ement Maria"
+, title = "Persistent Cohomology"
+, publisher = "{GUDHI Editorial Board}"
+, booktitle = "{GUDHI} User and Reference Manual"
+, url = "http://gudhi.gforge.inria.fr/doc/latest/group__persistent__cohomology.html"
+, year = 2015
+}
+
+@incollection{gudhi:Contraction
+, author = "David Salinas"
+, title = "Contraction"
+, publisher = "{GUDHI Editorial Board}"
+, booktitle = "{GUDHI} User and Reference Manual"
+, url = "http://gudhi.gforge.inria.fr/doc/latest/group__contr.html"
+, year = 2015
+}
+
+@incollection{gudhi:Skeleton-Blocker
+, author = "David Salinas"
+, title = "Skeleton-Blocker"
+, publisher = "{GUDHI Editorial Board}"
+, booktitle = "{GUDHI} User and Reference Manual"
+, url = "http://gudhi.gforge.inria.fr/doc/latest/group__skbl.html"
+, year = 2015
+}
+
+@incollection{gudhi:Alpha complex
+, author = "Vincent Rouvreau"
+, title = "Alpha complex"
+, publisher = "{GUDHI Editorial Board}"
+, booktitle = "{GUDHI} User and Reference Manual"
+, url = "http://gudhi.gforge.inria.fr/doc/latest/group__alpha__complex.html"
+, year = 2015
+}
+
+@incollection{gudhi:Cubical complex
+, author = "Pawel Dlotko"
+, title = "Cubical complex"
+, publisher = "{GUDHI Editorial Board}"
+, booktitle = "{GUDHI} User and Reference Manual"
+, url = "http://gudhi.gforge.inria.fr/doc/latest/group__cubical__complex.html"
+, year = 2015
+}
+
+@incollection{gudhi:Witness complex
+, author = "Siargey Kachanovich"
+, title = "Witness complex"
+, publisher = "{GUDHI Editorial Board}"
+, booktitle = "{GUDHI} User and Reference Manual"
+, url = "http://gudhi.gforge.inria.fr/doc/latest/group__witness__complex.html"
+, year = 2015
+}
diff --git a/data/bitmap/2d_torus.txt b/data/bitmap/2d_torus.txt
new file mode 100644
index 00000000..f8c45da0
--- /dev/null
+++ b/data/bitmap/2d_torus.txt
@@ -0,0 +1,12 @@
+2
+-3
+-3
+0
+0
+0
+0
+10
+0
+0
+0
+0
diff --git a/data/bitmap/3d_torus.txt b/data/bitmap/3d_torus.txt
new file mode 100644
index 00000000..53ed8450
--- /dev/null
+++ b/data/bitmap/3d_torus.txt
@@ -0,0 +1,31 @@
+3
+-3
+-3
+-3
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+10
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
diff --git a/data/bitmap/CubicalOneSphere.txt b/data/bitmap/CubicalOneSphere.txt
new file mode 100644
index 00000000..5b2d8998
--- /dev/null
+++ b/data/bitmap/CubicalOneSphere.txt
@@ -0,0 +1,12 @@
+2
+3
+3
+0
+0
+0
+0
+100
+0
+0
+0
+0
diff --git a/data/bitmap/CubicalTwoSphere.txt b/data/bitmap/CubicalTwoSphere.txt
new file mode 100644
index 00000000..fb1f0e01
--- /dev/null
+++ b/data/bitmap/CubicalTwoSphere.txt
@@ -0,0 +1,31 @@
+3
+3
+3
+3
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+100
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
diff --git a/data/points/COIL_database/asian_mug.off b/data/points/COIL_database/asian_mug.off
index f6a9a972..f6a9a972 100755..100644
--- a/data/points/COIL_database/asian_mug.off
+++ b/data/points/COIL_database/asian_mug.off
diff --git a/data/points/COIL_database/images/asian mug/obj12__0.png b/data/points/COIL_database/images/asian mug/obj12__0.png
index 6660990f..6660990f 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__0.png
+++ b/data/points/COIL_database/images/asian mug/obj12__0.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__1.png b/data/points/COIL_database/images/asian mug/obj12__1.png
index 41791863..41791863 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__1.png
+++ b/data/points/COIL_database/images/asian mug/obj12__1.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__10.png b/data/points/COIL_database/images/asian mug/obj12__10.png
index 031373fb..031373fb 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__10.png
+++ b/data/points/COIL_database/images/asian mug/obj12__10.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__11.png b/data/points/COIL_database/images/asian mug/obj12__11.png
index 37d14235..37d14235 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__11.png
+++ b/data/points/COIL_database/images/asian mug/obj12__11.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__12.png b/data/points/COIL_database/images/asian mug/obj12__12.png
index 8899ef20..8899ef20 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__12.png
+++ b/data/points/COIL_database/images/asian mug/obj12__12.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__13.png b/data/points/COIL_database/images/asian mug/obj12__13.png
index 98e8bfb5..98e8bfb5 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__13.png
+++ b/data/points/COIL_database/images/asian mug/obj12__13.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__14.png b/data/points/COIL_database/images/asian mug/obj12__14.png
index f95b07f9..f95b07f9 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__14.png
+++ b/data/points/COIL_database/images/asian mug/obj12__14.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__15.png b/data/points/COIL_database/images/asian mug/obj12__15.png
index fc644f9d..fc644f9d 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__15.png
+++ b/data/points/COIL_database/images/asian mug/obj12__15.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__16.png b/data/points/COIL_database/images/asian mug/obj12__16.png
index 40974226..40974226 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__16.png
+++ b/data/points/COIL_database/images/asian mug/obj12__16.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__17.png b/data/points/COIL_database/images/asian mug/obj12__17.png
index 0bca0fe2..0bca0fe2 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__17.png
+++ b/data/points/COIL_database/images/asian mug/obj12__17.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__18.png b/data/points/COIL_database/images/asian mug/obj12__18.png
index 67257fc3..67257fc3 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__18.png
+++ b/data/points/COIL_database/images/asian mug/obj12__18.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__19.png b/data/points/COIL_database/images/asian mug/obj12__19.png
index 3254e9de..3254e9de 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__19.png
+++ b/data/points/COIL_database/images/asian mug/obj12__19.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__2.png b/data/points/COIL_database/images/asian mug/obj12__2.png
index e8a21605..e8a21605 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__2.png
+++ b/data/points/COIL_database/images/asian mug/obj12__2.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__20.png b/data/points/COIL_database/images/asian mug/obj12__20.png
index f306dc46..f306dc46 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__20.png
+++ b/data/points/COIL_database/images/asian mug/obj12__20.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__21.png b/data/points/COIL_database/images/asian mug/obj12__21.png
index 27c3b6fb..27c3b6fb 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__21.png
+++ b/data/points/COIL_database/images/asian mug/obj12__21.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__22.png b/data/points/COIL_database/images/asian mug/obj12__22.png
index 0707b03c..0707b03c 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__22.png
+++ b/data/points/COIL_database/images/asian mug/obj12__22.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__23.png b/data/points/COIL_database/images/asian mug/obj12__23.png
index bb57fff5..bb57fff5 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__23.png
+++ b/data/points/COIL_database/images/asian mug/obj12__23.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__24.png b/data/points/COIL_database/images/asian mug/obj12__24.png
index 64f2d0dd..64f2d0dd 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__24.png
+++ b/data/points/COIL_database/images/asian mug/obj12__24.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__25.png b/data/points/COIL_database/images/asian mug/obj12__25.png
index 0354f980..0354f980 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__25.png
+++ b/data/points/COIL_database/images/asian mug/obj12__25.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__26.png b/data/points/COIL_database/images/asian mug/obj12__26.png
index 761e8de0..761e8de0 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__26.png
+++ b/data/points/COIL_database/images/asian mug/obj12__26.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__27.png b/data/points/COIL_database/images/asian mug/obj12__27.png
index f949d666..f949d666 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__27.png
+++ b/data/points/COIL_database/images/asian mug/obj12__27.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__28.png b/data/points/COIL_database/images/asian mug/obj12__28.png
index 07e10afa..07e10afa 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__28.png
+++ b/data/points/COIL_database/images/asian mug/obj12__28.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__29.png b/data/points/COIL_database/images/asian mug/obj12__29.png
index 0e776c4d..0e776c4d 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__29.png
+++ b/data/points/COIL_database/images/asian mug/obj12__29.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__3.png b/data/points/COIL_database/images/asian mug/obj12__3.png
index ae63aaf8..ae63aaf8 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__3.png
+++ b/data/points/COIL_database/images/asian mug/obj12__3.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__30.png b/data/points/COIL_database/images/asian mug/obj12__30.png
index b204e0d4..b204e0d4 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__30.png
+++ b/data/points/COIL_database/images/asian mug/obj12__30.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__31.png b/data/points/COIL_database/images/asian mug/obj12__31.png
index 4bbe8c9b..4bbe8c9b 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__31.png
+++ b/data/points/COIL_database/images/asian mug/obj12__31.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__32.png b/data/points/COIL_database/images/asian mug/obj12__32.png
index 050c77bb..050c77bb 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__32.png
+++ b/data/points/COIL_database/images/asian mug/obj12__32.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__33.png b/data/points/COIL_database/images/asian mug/obj12__33.png
index 34b3ca96..34b3ca96 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__33.png
+++ b/data/points/COIL_database/images/asian mug/obj12__33.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__34.png b/data/points/COIL_database/images/asian mug/obj12__34.png
index 73d49afe..73d49afe 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__34.png
+++ b/data/points/COIL_database/images/asian mug/obj12__34.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__35.png b/data/points/COIL_database/images/asian mug/obj12__35.png
index 7907a57a..7907a57a 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__35.png
+++ b/data/points/COIL_database/images/asian mug/obj12__35.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__36.png b/data/points/COIL_database/images/asian mug/obj12__36.png
index 7274dd5d..7274dd5d 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__36.png
+++ b/data/points/COIL_database/images/asian mug/obj12__36.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__37.png b/data/points/COIL_database/images/asian mug/obj12__37.png
index 5520913e..5520913e 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__37.png
+++ b/data/points/COIL_database/images/asian mug/obj12__37.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__38.png b/data/points/COIL_database/images/asian mug/obj12__38.png
index 791eafab..791eafab 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__38.png
+++ b/data/points/COIL_database/images/asian mug/obj12__38.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__39.png b/data/points/COIL_database/images/asian mug/obj12__39.png
index 770c4941..770c4941 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__39.png
+++ b/data/points/COIL_database/images/asian mug/obj12__39.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__4.png b/data/points/COIL_database/images/asian mug/obj12__4.png
index 46b66f9e..46b66f9e 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__4.png
+++ b/data/points/COIL_database/images/asian mug/obj12__4.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__40.png b/data/points/COIL_database/images/asian mug/obj12__40.png
index 9b667921..9b667921 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__40.png
+++ b/data/points/COIL_database/images/asian mug/obj12__40.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__41.png b/data/points/COIL_database/images/asian mug/obj12__41.png
index 83adef3c..83adef3c 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__41.png
+++ b/data/points/COIL_database/images/asian mug/obj12__41.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__42.png b/data/points/COIL_database/images/asian mug/obj12__42.png
index 35229086..35229086 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__42.png
+++ b/data/points/COIL_database/images/asian mug/obj12__42.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__43.png b/data/points/COIL_database/images/asian mug/obj12__43.png
index 74b32497..74b32497 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__43.png
+++ b/data/points/COIL_database/images/asian mug/obj12__43.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__44.png b/data/points/COIL_database/images/asian mug/obj12__44.png
index b9b10f6f..b9b10f6f 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__44.png
+++ b/data/points/COIL_database/images/asian mug/obj12__44.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__45.png b/data/points/COIL_database/images/asian mug/obj12__45.png
index a2ca620e..a2ca620e 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__45.png
+++ b/data/points/COIL_database/images/asian mug/obj12__45.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__46.png b/data/points/COIL_database/images/asian mug/obj12__46.png
index 11e2005b..11e2005b 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__46.png
+++ b/data/points/COIL_database/images/asian mug/obj12__46.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__47.png b/data/points/COIL_database/images/asian mug/obj12__47.png
index b7d0937a..b7d0937a 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__47.png
+++ b/data/points/COIL_database/images/asian mug/obj12__47.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__48.png b/data/points/COIL_database/images/asian mug/obj12__48.png
index 7bfc9f9e..7bfc9f9e 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__48.png
+++ b/data/points/COIL_database/images/asian mug/obj12__48.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__49.png b/data/points/COIL_database/images/asian mug/obj12__49.png
index 57fbc63b..57fbc63b 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__49.png
+++ b/data/points/COIL_database/images/asian mug/obj12__49.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__5.png b/data/points/COIL_database/images/asian mug/obj12__5.png
index 4737b6a9..4737b6a9 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__5.png
+++ b/data/points/COIL_database/images/asian mug/obj12__5.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__50.png b/data/points/COIL_database/images/asian mug/obj12__50.png
index 1bc9aa2a..1bc9aa2a 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__50.png
+++ b/data/points/COIL_database/images/asian mug/obj12__50.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__51.png b/data/points/COIL_database/images/asian mug/obj12__51.png
index 4c2a2824..4c2a2824 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__51.png
+++ b/data/points/COIL_database/images/asian mug/obj12__51.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__52.png b/data/points/COIL_database/images/asian mug/obj12__52.png
index e34aa96d..e34aa96d 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__52.png
+++ b/data/points/COIL_database/images/asian mug/obj12__52.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__53.png b/data/points/COIL_database/images/asian mug/obj12__53.png
index 969132e3..969132e3 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__53.png
+++ b/data/points/COIL_database/images/asian mug/obj12__53.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__54.png b/data/points/COIL_database/images/asian mug/obj12__54.png
index 7d03c9d3..7d03c9d3 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__54.png
+++ b/data/points/COIL_database/images/asian mug/obj12__54.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__55.png b/data/points/COIL_database/images/asian mug/obj12__55.png
index fb0bf92f..fb0bf92f 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__55.png
+++ b/data/points/COIL_database/images/asian mug/obj12__55.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__56.png b/data/points/COIL_database/images/asian mug/obj12__56.png
index eb6ea4eb..eb6ea4eb 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__56.png
+++ b/data/points/COIL_database/images/asian mug/obj12__56.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__57.png b/data/points/COIL_database/images/asian mug/obj12__57.png
index 87655e6a..87655e6a 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__57.png
+++ b/data/points/COIL_database/images/asian mug/obj12__57.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__58.png b/data/points/COIL_database/images/asian mug/obj12__58.png
index 7fbf2bda..7fbf2bda 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__58.png
+++ b/data/points/COIL_database/images/asian mug/obj12__58.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__59.png b/data/points/COIL_database/images/asian mug/obj12__59.png
index b7d87fb0..b7d87fb0 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__59.png
+++ b/data/points/COIL_database/images/asian mug/obj12__59.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__6.png b/data/points/COIL_database/images/asian mug/obj12__6.png
index c49f4462..c49f4462 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__6.png
+++ b/data/points/COIL_database/images/asian mug/obj12__6.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__60.png b/data/points/COIL_database/images/asian mug/obj12__60.png
index 68188277..68188277 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__60.png
+++ b/data/points/COIL_database/images/asian mug/obj12__60.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__61.png b/data/points/COIL_database/images/asian mug/obj12__61.png
index ff308aef..ff308aef 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__61.png
+++ b/data/points/COIL_database/images/asian mug/obj12__61.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__62.png b/data/points/COIL_database/images/asian mug/obj12__62.png
index 184b1f06..184b1f06 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__62.png
+++ b/data/points/COIL_database/images/asian mug/obj12__62.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__63.png b/data/points/COIL_database/images/asian mug/obj12__63.png
index 78742130..78742130 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__63.png
+++ b/data/points/COIL_database/images/asian mug/obj12__63.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__64.png b/data/points/COIL_database/images/asian mug/obj12__64.png
index 0e2178c3..0e2178c3 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__64.png
+++ b/data/points/COIL_database/images/asian mug/obj12__64.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__65.png b/data/points/COIL_database/images/asian mug/obj12__65.png
index 78a4baed..78a4baed 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__65.png
+++ b/data/points/COIL_database/images/asian mug/obj12__65.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__66.png b/data/points/COIL_database/images/asian mug/obj12__66.png
index 0ac96479..0ac96479 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__66.png
+++ b/data/points/COIL_database/images/asian mug/obj12__66.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__67.png b/data/points/COIL_database/images/asian mug/obj12__67.png
index a3a0ea03..a3a0ea03 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__67.png
+++ b/data/points/COIL_database/images/asian mug/obj12__67.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__68.png b/data/points/COIL_database/images/asian mug/obj12__68.png
index 9d26c431..9d26c431 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__68.png
+++ b/data/points/COIL_database/images/asian mug/obj12__68.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__69.png b/data/points/COIL_database/images/asian mug/obj12__69.png
index dd97b204..dd97b204 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__69.png
+++ b/data/points/COIL_database/images/asian mug/obj12__69.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__7.png b/data/points/COIL_database/images/asian mug/obj12__7.png
index 0c01e6d5..0c01e6d5 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__7.png
+++ b/data/points/COIL_database/images/asian mug/obj12__7.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__70.png b/data/points/COIL_database/images/asian mug/obj12__70.png
index a791d36a..a791d36a 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__70.png
+++ b/data/points/COIL_database/images/asian mug/obj12__70.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__71.png b/data/points/COIL_database/images/asian mug/obj12__71.png
index 739cc06b..739cc06b 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__71.png
+++ b/data/points/COIL_database/images/asian mug/obj12__71.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__8.png b/data/points/COIL_database/images/asian mug/obj12__8.png
index 02d721b4..02d721b4 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__8.png
+++ b/data/points/COIL_database/images/asian mug/obj12__8.png
Binary files differ
diff --git a/data/points/COIL_database/images/asian mug/obj12__9.png b/data/points/COIL_database/images/asian mug/obj12__9.png
index d54ea9ff..d54ea9ff 100755..100644
--- a/data/points/COIL_database/images/asian mug/obj12__9.png
+++ b/data/points/COIL_database/images/asian mug/obj12__9.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__0.png b/data/points/COIL_database/images/little car/obj3__0.png
index c0e60889..c0e60889 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__0.png
+++ b/data/points/COIL_database/images/little car/obj3__0.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__1.png b/data/points/COIL_database/images/little car/obj3__1.png
index 0addb36b..0addb36b 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__1.png
+++ b/data/points/COIL_database/images/little car/obj3__1.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__10.png b/data/points/COIL_database/images/little car/obj3__10.png
index 357362de..357362de 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__10.png
+++ b/data/points/COIL_database/images/little car/obj3__10.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__11.png b/data/points/COIL_database/images/little car/obj3__11.png
index 701588cd..701588cd 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__11.png
+++ b/data/points/COIL_database/images/little car/obj3__11.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__12.png b/data/points/COIL_database/images/little car/obj3__12.png
index 14ac602a..14ac602a 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__12.png
+++ b/data/points/COIL_database/images/little car/obj3__12.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__13.png b/data/points/COIL_database/images/little car/obj3__13.png
index eb162414..eb162414 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__13.png
+++ b/data/points/COIL_database/images/little car/obj3__13.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__14.png b/data/points/COIL_database/images/little car/obj3__14.png
index 8df1d931..8df1d931 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__14.png
+++ b/data/points/COIL_database/images/little car/obj3__14.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__15.png b/data/points/COIL_database/images/little car/obj3__15.png
index a29ac360..a29ac360 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__15.png
+++ b/data/points/COIL_database/images/little car/obj3__15.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__16.png b/data/points/COIL_database/images/little car/obj3__16.png
index 12fda4e9..12fda4e9 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__16.png
+++ b/data/points/COIL_database/images/little car/obj3__16.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__17.png b/data/points/COIL_database/images/little car/obj3__17.png
index a8bfe2e1..a8bfe2e1 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__17.png
+++ b/data/points/COIL_database/images/little car/obj3__17.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__18.png b/data/points/COIL_database/images/little car/obj3__18.png
index 8a329194..8a329194 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__18.png
+++ b/data/points/COIL_database/images/little car/obj3__18.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__19.png b/data/points/COIL_database/images/little car/obj3__19.png
index 591b2c9c..591b2c9c 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__19.png
+++ b/data/points/COIL_database/images/little car/obj3__19.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__2.png b/data/points/COIL_database/images/little car/obj3__2.png
index e9979aa8..e9979aa8 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__2.png
+++ b/data/points/COIL_database/images/little car/obj3__2.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__20.png b/data/points/COIL_database/images/little car/obj3__20.png
index 2b804725..2b804725 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__20.png
+++ b/data/points/COIL_database/images/little car/obj3__20.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__21.png b/data/points/COIL_database/images/little car/obj3__21.png
index d6d71cac..d6d71cac 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__21.png
+++ b/data/points/COIL_database/images/little car/obj3__21.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__22.png b/data/points/COIL_database/images/little car/obj3__22.png
index 40a6d707..40a6d707 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__22.png
+++ b/data/points/COIL_database/images/little car/obj3__22.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__23.png b/data/points/COIL_database/images/little car/obj3__23.png
index 8ef3acfc..8ef3acfc 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__23.png
+++ b/data/points/COIL_database/images/little car/obj3__23.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__24.png b/data/points/COIL_database/images/little car/obj3__24.png
index 0b2d2d36..0b2d2d36 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__24.png
+++ b/data/points/COIL_database/images/little car/obj3__24.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__25.png b/data/points/COIL_database/images/little car/obj3__25.png
index 6d40218f..6d40218f 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__25.png
+++ b/data/points/COIL_database/images/little car/obj3__25.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__26.png b/data/points/COIL_database/images/little car/obj3__26.png
index 2850d83b..2850d83b 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__26.png
+++ b/data/points/COIL_database/images/little car/obj3__26.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__27.png b/data/points/COIL_database/images/little car/obj3__27.png
index 9e0ab4b7..9e0ab4b7 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__27.png
+++ b/data/points/COIL_database/images/little car/obj3__27.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__28.png b/data/points/COIL_database/images/little car/obj3__28.png
index 2a9559c6..2a9559c6 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__28.png
+++ b/data/points/COIL_database/images/little car/obj3__28.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__29.png b/data/points/COIL_database/images/little car/obj3__29.png
index fc312951..fc312951 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__29.png
+++ b/data/points/COIL_database/images/little car/obj3__29.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__3.png b/data/points/COIL_database/images/little car/obj3__3.png
index d85dfcf3..d85dfcf3 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__3.png
+++ b/data/points/COIL_database/images/little car/obj3__3.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__30.png b/data/points/COIL_database/images/little car/obj3__30.png
index c898dada..c898dada 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__30.png
+++ b/data/points/COIL_database/images/little car/obj3__30.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__31.png b/data/points/COIL_database/images/little car/obj3__31.png
index 35596130..35596130 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__31.png
+++ b/data/points/COIL_database/images/little car/obj3__31.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__32.png b/data/points/COIL_database/images/little car/obj3__32.png
index 476990f0..476990f0 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__32.png
+++ b/data/points/COIL_database/images/little car/obj3__32.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__33.png b/data/points/COIL_database/images/little car/obj3__33.png
index 6e40c8ff..6e40c8ff 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__33.png
+++ b/data/points/COIL_database/images/little car/obj3__33.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__34.png b/data/points/COIL_database/images/little car/obj3__34.png
index 842fb9c8..842fb9c8 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__34.png
+++ b/data/points/COIL_database/images/little car/obj3__34.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__35.png b/data/points/COIL_database/images/little car/obj3__35.png
index 8eb2fefe..8eb2fefe 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__35.png
+++ b/data/points/COIL_database/images/little car/obj3__35.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__36.png b/data/points/COIL_database/images/little car/obj3__36.png
index c0fe2be6..c0fe2be6 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__36.png
+++ b/data/points/COIL_database/images/little car/obj3__36.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__37.png b/data/points/COIL_database/images/little car/obj3__37.png
index 8d36e234..8d36e234 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__37.png
+++ b/data/points/COIL_database/images/little car/obj3__37.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__38.png b/data/points/COIL_database/images/little car/obj3__38.png
index 5f3e18b3..5f3e18b3 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__38.png
+++ b/data/points/COIL_database/images/little car/obj3__38.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__39.png b/data/points/COIL_database/images/little car/obj3__39.png
index f37d7758..f37d7758 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__39.png
+++ b/data/points/COIL_database/images/little car/obj3__39.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__4.png b/data/points/COIL_database/images/little car/obj3__4.png
index db88ac72..db88ac72 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__4.png
+++ b/data/points/COIL_database/images/little car/obj3__4.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__40.png b/data/points/COIL_database/images/little car/obj3__40.png
index 027bf398..027bf398 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__40.png
+++ b/data/points/COIL_database/images/little car/obj3__40.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__41.png b/data/points/COIL_database/images/little car/obj3__41.png
index f5a8940c..f5a8940c 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__41.png
+++ b/data/points/COIL_database/images/little car/obj3__41.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__42.png b/data/points/COIL_database/images/little car/obj3__42.png
index de8d09e6..de8d09e6 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__42.png
+++ b/data/points/COIL_database/images/little car/obj3__42.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__43.png b/data/points/COIL_database/images/little car/obj3__43.png
index ddb4452a..ddb4452a 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__43.png
+++ b/data/points/COIL_database/images/little car/obj3__43.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__44.png b/data/points/COIL_database/images/little car/obj3__44.png
index 241b46ce..241b46ce 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__44.png
+++ b/data/points/COIL_database/images/little car/obj3__44.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__45.png b/data/points/COIL_database/images/little car/obj3__45.png
index 5ed91f2a..5ed91f2a 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__45.png
+++ b/data/points/COIL_database/images/little car/obj3__45.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__46.png b/data/points/COIL_database/images/little car/obj3__46.png
index 9194cad0..9194cad0 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__46.png
+++ b/data/points/COIL_database/images/little car/obj3__46.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__47.png b/data/points/COIL_database/images/little car/obj3__47.png
index 5a0a161f..5a0a161f 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__47.png
+++ b/data/points/COIL_database/images/little car/obj3__47.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__48.png b/data/points/COIL_database/images/little car/obj3__48.png
index 6adb25ad..6adb25ad 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__48.png
+++ b/data/points/COIL_database/images/little car/obj3__48.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__49.png b/data/points/COIL_database/images/little car/obj3__49.png
index e4ceda7f..e4ceda7f 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__49.png
+++ b/data/points/COIL_database/images/little car/obj3__49.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__5.png b/data/points/COIL_database/images/little car/obj3__5.png
index 61498fdd..61498fdd 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__5.png
+++ b/data/points/COIL_database/images/little car/obj3__5.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__50.png b/data/points/COIL_database/images/little car/obj3__50.png
index 802a85c9..802a85c9 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__50.png
+++ b/data/points/COIL_database/images/little car/obj3__50.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__51.png b/data/points/COIL_database/images/little car/obj3__51.png
index d55e1d14..d55e1d14 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__51.png
+++ b/data/points/COIL_database/images/little car/obj3__51.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__52.png b/data/points/COIL_database/images/little car/obj3__52.png
index db83bd8c..db83bd8c 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__52.png
+++ b/data/points/COIL_database/images/little car/obj3__52.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__53.png b/data/points/COIL_database/images/little car/obj3__53.png
index a5065832..a5065832 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__53.png
+++ b/data/points/COIL_database/images/little car/obj3__53.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__54.png b/data/points/COIL_database/images/little car/obj3__54.png
index 1845ebdb..1845ebdb 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__54.png
+++ b/data/points/COIL_database/images/little car/obj3__54.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__55.png b/data/points/COIL_database/images/little car/obj3__55.png
index c0db9bec..c0db9bec 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__55.png
+++ b/data/points/COIL_database/images/little car/obj3__55.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__56.png b/data/points/COIL_database/images/little car/obj3__56.png
index 6444a1f4..6444a1f4 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__56.png
+++ b/data/points/COIL_database/images/little car/obj3__56.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__57.png b/data/points/COIL_database/images/little car/obj3__57.png
index 1531d701..1531d701 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__57.png
+++ b/data/points/COIL_database/images/little car/obj3__57.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__58.png b/data/points/COIL_database/images/little car/obj3__58.png
index 23a21786..23a21786 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__58.png
+++ b/data/points/COIL_database/images/little car/obj3__58.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__59.png b/data/points/COIL_database/images/little car/obj3__59.png
index bf85b274..bf85b274 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__59.png
+++ b/data/points/COIL_database/images/little car/obj3__59.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__6.png b/data/points/COIL_database/images/little car/obj3__6.png
index fb1b79e5..fb1b79e5 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__6.png
+++ b/data/points/COIL_database/images/little car/obj3__6.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__60.png b/data/points/COIL_database/images/little car/obj3__60.png
index a3ca1beb..a3ca1beb 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__60.png
+++ b/data/points/COIL_database/images/little car/obj3__60.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__61.png b/data/points/COIL_database/images/little car/obj3__61.png
index c76ef420..c76ef420 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__61.png
+++ b/data/points/COIL_database/images/little car/obj3__61.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__62.png b/data/points/COIL_database/images/little car/obj3__62.png
index 6d620f20..6d620f20 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__62.png
+++ b/data/points/COIL_database/images/little car/obj3__62.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__63.png b/data/points/COIL_database/images/little car/obj3__63.png
index 3ea0e4d8..3ea0e4d8 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__63.png
+++ b/data/points/COIL_database/images/little car/obj3__63.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__64.png b/data/points/COIL_database/images/little car/obj3__64.png
index eead8dfa..eead8dfa 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__64.png
+++ b/data/points/COIL_database/images/little car/obj3__64.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__65.png b/data/points/COIL_database/images/little car/obj3__65.png
index 3476cbc6..3476cbc6 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__65.png
+++ b/data/points/COIL_database/images/little car/obj3__65.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__66.png b/data/points/COIL_database/images/little car/obj3__66.png
index d4d02eee..d4d02eee 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__66.png
+++ b/data/points/COIL_database/images/little car/obj3__66.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__67.png b/data/points/COIL_database/images/little car/obj3__67.png
index d6f6390e..d6f6390e 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__67.png
+++ b/data/points/COIL_database/images/little car/obj3__67.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__68.png b/data/points/COIL_database/images/little car/obj3__68.png
index f14fe4f1..f14fe4f1 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__68.png
+++ b/data/points/COIL_database/images/little car/obj3__68.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__69.png b/data/points/COIL_database/images/little car/obj3__69.png
index 0cb85f63..0cb85f63 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__69.png
+++ b/data/points/COIL_database/images/little car/obj3__69.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__7.png b/data/points/COIL_database/images/little car/obj3__7.png
index 8630ad07..8630ad07 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__7.png
+++ b/data/points/COIL_database/images/little car/obj3__7.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__70.png b/data/points/COIL_database/images/little car/obj3__70.png
index a9d4b268..a9d4b268 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__70.png
+++ b/data/points/COIL_database/images/little car/obj3__70.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__71.png b/data/points/COIL_database/images/little car/obj3__71.png
index 108d8d1b..108d8d1b 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__71.png
+++ b/data/points/COIL_database/images/little car/obj3__71.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__8.png b/data/points/COIL_database/images/little car/obj3__8.png
index 86857d5e..86857d5e 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__8.png
+++ b/data/points/COIL_database/images/little car/obj3__8.png
Binary files differ
diff --git a/data/points/COIL_database/images/little car/obj3__9.png b/data/points/COIL_database/images/little car/obj3__9.png
index a71aaddb..a71aaddb 100755..100644
--- a/data/points/COIL_database/images/little car/obj3__9.png
+++ b/data/points/COIL_database/images/little car/obj3__9.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__0.png b/data/points/COIL_database/images/lucky cat/obj4__0.png
index ff874d3e..ff874d3e 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__0.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__0.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__1.png b/data/points/COIL_database/images/lucky cat/obj4__1.png
index 5eca4e00..5eca4e00 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__1.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__1.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__10.png b/data/points/COIL_database/images/lucky cat/obj4__10.png
index d1495175..d1495175 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__10.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__10.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__11.png b/data/points/COIL_database/images/lucky cat/obj4__11.png
index e061610d..e061610d 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__11.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__11.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__12.png b/data/points/COIL_database/images/lucky cat/obj4__12.png
index 4394d9c4..4394d9c4 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__12.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__12.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__13.png b/data/points/COIL_database/images/lucky cat/obj4__13.png
index 7ca2c89c..7ca2c89c 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__13.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__13.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__14.png b/data/points/COIL_database/images/lucky cat/obj4__14.png
index 1c4fae8b..1c4fae8b 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__14.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__14.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__15.png b/data/points/COIL_database/images/lucky cat/obj4__15.png
index a8c1f13f..a8c1f13f 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__15.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__15.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__16.png b/data/points/COIL_database/images/lucky cat/obj4__16.png
index 7ddaa507..7ddaa507 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__16.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__16.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__17.png b/data/points/COIL_database/images/lucky cat/obj4__17.png
index 417a62fe..417a62fe 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__17.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__17.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__18.png b/data/points/COIL_database/images/lucky cat/obj4__18.png
index 7af8ef0c..7af8ef0c 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__18.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__18.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__19.png b/data/points/COIL_database/images/lucky cat/obj4__19.png
index efe4e992..efe4e992 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__19.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__19.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__2.png b/data/points/COIL_database/images/lucky cat/obj4__2.png
index 6148787f..6148787f 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__2.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__2.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__20.png b/data/points/COIL_database/images/lucky cat/obj4__20.png
index edd9f2c9..edd9f2c9 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__20.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__20.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__21.png b/data/points/COIL_database/images/lucky cat/obj4__21.png
index 93c0447d..93c0447d 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__21.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__21.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__22.png b/data/points/COIL_database/images/lucky cat/obj4__22.png
index c3836121..c3836121 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__22.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__22.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__23.png b/data/points/COIL_database/images/lucky cat/obj4__23.png
index de488bb4..de488bb4 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__23.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__23.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__24.png b/data/points/COIL_database/images/lucky cat/obj4__24.png
index 585878c6..585878c6 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__24.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__24.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__25.png b/data/points/COIL_database/images/lucky cat/obj4__25.png
index 7dbc21be..7dbc21be 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__25.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__25.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__26.png b/data/points/COIL_database/images/lucky cat/obj4__26.png
index 03da4c47..03da4c47 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__26.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__26.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__27.png b/data/points/COIL_database/images/lucky cat/obj4__27.png
index d57e6e3e..d57e6e3e 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__27.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__27.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__28.png b/data/points/COIL_database/images/lucky cat/obj4__28.png
index aedb06bb..aedb06bb 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__28.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__28.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__29.png b/data/points/COIL_database/images/lucky cat/obj4__29.png
index 0db062ec..0db062ec 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__29.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__29.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__3.png b/data/points/COIL_database/images/lucky cat/obj4__3.png
index 6797caae..6797caae 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__3.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__3.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__30.png b/data/points/COIL_database/images/lucky cat/obj4__30.png
index dd498573..dd498573 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__30.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__30.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__31.png b/data/points/COIL_database/images/lucky cat/obj4__31.png
index 87df2769..87df2769 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__31.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__31.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__32.png b/data/points/COIL_database/images/lucky cat/obj4__32.png
index 94af5ef3..94af5ef3 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__32.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__32.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__33.png b/data/points/COIL_database/images/lucky cat/obj4__33.png
index 239581d5..239581d5 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__33.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__33.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__34.png b/data/points/COIL_database/images/lucky cat/obj4__34.png
index 4ca299ee..4ca299ee 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__34.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__34.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__35.png b/data/points/COIL_database/images/lucky cat/obj4__35.png
index ba95aef4..ba95aef4 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__35.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__35.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__36.png b/data/points/COIL_database/images/lucky cat/obj4__36.png
index d5b80e1a..d5b80e1a 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__36.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__36.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__37.png b/data/points/COIL_database/images/lucky cat/obj4__37.png
index e940a2fd..e940a2fd 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__37.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__37.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__38.png b/data/points/COIL_database/images/lucky cat/obj4__38.png
index 1da47bc0..1da47bc0 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__38.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__38.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__39.png b/data/points/COIL_database/images/lucky cat/obj4__39.png
index 7ee6c9f9..7ee6c9f9 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__39.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__39.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__4.png b/data/points/COIL_database/images/lucky cat/obj4__4.png
index 7e6182c4..7e6182c4 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__4.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__4.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__40.png b/data/points/COIL_database/images/lucky cat/obj4__40.png
index d2529b59..d2529b59 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__40.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__40.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__41.png b/data/points/COIL_database/images/lucky cat/obj4__41.png
index ce1b7093..ce1b7093 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__41.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__41.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__42.png b/data/points/COIL_database/images/lucky cat/obj4__42.png
index 4ba64574..4ba64574 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__42.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__42.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__43.png b/data/points/COIL_database/images/lucky cat/obj4__43.png
index a0f5b8f4..a0f5b8f4 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__43.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__43.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__44.png b/data/points/COIL_database/images/lucky cat/obj4__44.png
index 36a0aa8d..36a0aa8d 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__44.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__44.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__45.png b/data/points/COIL_database/images/lucky cat/obj4__45.png
index 2c6ace8d..2c6ace8d 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__45.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__45.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__46.png b/data/points/COIL_database/images/lucky cat/obj4__46.png
index f06f423b..f06f423b 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__46.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__46.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__47.png b/data/points/COIL_database/images/lucky cat/obj4__47.png
index 8591b0a6..8591b0a6 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__47.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__47.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__48.png b/data/points/COIL_database/images/lucky cat/obj4__48.png
index 37ba4167..37ba4167 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__48.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__48.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__49.png b/data/points/COIL_database/images/lucky cat/obj4__49.png
index 1dc4483c..1dc4483c 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__49.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__49.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__50.png b/data/points/COIL_database/images/lucky cat/obj4__50.png
index d41be68b..d41be68b 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__50.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__50.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__51.png b/data/points/COIL_database/images/lucky cat/obj4__51.png
index 12ba90ed..12ba90ed 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__51.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__51.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__52.png b/data/points/COIL_database/images/lucky cat/obj4__52.png
index 04058abd..04058abd 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__52.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__52.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__53.png b/data/points/COIL_database/images/lucky cat/obj4__53.png
index c7d6d02a..c7d6d02a 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__53.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__53.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__54.png b/data/points/COIL_database/images/lucky cat/obj4__54.png
index b1e22cfa..b1e22cfa 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__54.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__54.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__55.png b/data/points/COIL_database/images/lucky cat/obj4__55.png
index dea5770f..dea5770f 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__55.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__55.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__56.png b/data/points/COIL_database/images/lucky cat/obj4__56.png
index f1acf69d..f1acf69d 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__56.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__56.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__57.png b/data/points/COIL_database/images/lucky cat/obj4__57.png
index 88a0ab16..88a0ab16 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__57.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__57.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__58.png b/data/points/COIL_database/images/lucky cat/obj4__58.png
index 18f4d10e..18f4d10e 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__58.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__58.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__59.png b/data/points/COIL_database/images/lucky cat/obj4__59.png
index ee7f3b81..ee7f3b81 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__59.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__59.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__6.png b/data/points/COIL_database/images/lucky cat/obj4__6.png
index 69f4e861..69f4e861 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__6.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__6.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__60.png b/data/points/COIL_database/images/lucky cat/obj4__60.png
index 1a2a32b6..1a2a32b6 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__60.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__60.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__61.png b/data/points/COIL_database/images/lucky cat/obj4__61.png
index bc85f8f8..bc85f8f8 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__61.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__61.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__62.png b/data/points/COIL_database/images/lucky cat/obj4__62.png
index 2da189bb..2da189bb 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__62.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__62.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__63.png b/data/points/COIL_database/images/lucky cat/obj4__63.png
index 4c13ce00..4c13ce00 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__63.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__63.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__64.png b/data/points/COIL_database/images/lucky cat/obj4__64.png
index ee6d8e02..ee6d8e02 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__64.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__64.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__65.png b/data/points/COIL_database/images/lucky cat/obj4__65.png
index a353c06c..a353c06c 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__65.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__65.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__66.png b/data/points/COIL_database/images/lucky cat/obj4__66.png
index 6bfd49f5..6bfd49f5 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__66.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__66.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__67.png b/data/points/COIL_database/images/lucky cat/obj4__67.png
index 0999d86b..0999d86b 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__67.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__67.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__68.png b/data/points/COIL_database/images/lucky cat/obj4__68.png
index 381d9c3c..381d9c3c 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__68.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__68.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__69.png b/data/points/COIL_database/images/lucky cat/obj4__69.png
index 7a1eab1a..7a1eab1a 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__69.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__69.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__7.png b/data/points/COIL_database/images/lucky cat/obj4__7.png
index 54b788b6..54b788b6 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__7.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__7.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__70.png b/data/points/COIL_database/images/lucky cat/obj4__70.png
index 380e3859..380e3859 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__70.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__70.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__71.png b/data/points/COIL_database/images/lucky cat/obj4__71.png
index f93c3ead..f93c3ead 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__71.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__71.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__8.png b/data/points/COIL_database/images/lucky cat/obj4__8.png
index cb4ccfa0..cb4ccfa0 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__8.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__8.png
Binary files differ
diff --git a/data/points/COIL_database/images/lucky cat/obj4__9.png b/data/points/COIL_database/images/lucky cat/obj4__9.png
index 4881ec2d..4881ec2d 100755..100644
--- a/data/points/COIL_database/images/lucky cat/obj4__9.png
+++ b/data/points/COIL_database/images/lucky cat/obj4__9.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__0.png b/data/points/COIL_database/images/money pig/obj13__0.png
index 79b4d2dd..79b4d2dd 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__0.png
+++ b/data/points/COIL_database/images/money pig/obj13__0.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__1.png b/data/points/COIL_database/images/money pig/obj13__1.png
index 9f37fc0d..9f37fc0d 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__1.png
+++ b/data/points/COIL_database/images/money pig/obj13__1.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__10.png b/data/points/COIL_database/images/money pig/obj13__10.png
index 9d4c399d..9d4c399d 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__10.png
+++ b/data/points/COIL_database/images/money pig/obj13__10.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__11.png b/data/points/COIL_database/images/money pig/obj13__11.png
index f9122c7e..f9122c7e 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__11.png
+++ b/data/points/COIL_database/images/money pig/obj13__11.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__12.png b/data/points/COIL_database/images/money pig/obj13__12.png
index 903b0fa2..903b0fa2 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__12.png
+++ b/data/points/COIL_database/images/money pig/obj13__12.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__13.png b/data/points/COIL_database/images/money pig/obj13__13.png
index 3862e98a..3862e98a 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__13.png
+++ b/data/points/COIL_database/images/money pig/obj13__13.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__14.png b/data/points/COIL_database/images/money pig/obj13__14.png
index fb52d5a7..fb52d5a7 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__14.png
+++ b/data/points/COIL_database/images/money pig/obj13__14.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__15.png b/data/points/COIL_database/images/money pig/obj13__15.png
index 418686c6..418686c6 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__15.png
+++ b/data/points/COIL_database/images/money pig/obj13__15.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__16.png b/data/points/COIL_database/images/money pig/obj13__16.png
index 8c120be1..8c120be1 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__16.png
+++ b/data/points/COIL_database/images/money pig/obj13__16.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__17.png b/data/points/COIL_database/images/money pig/obj13__17.png
index d06e1cd7..d06e1cd7 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__17.png
+++ b/data/points/COIL_database/images/money pig/obj13__17.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__18.png b/data/points/COIL_database/images/money pig/obj13__18.png
index 0c94b6d6..0c94b6d6 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__18.png
+++ b/data/points/COIL_database/images/money pig/obj13__18.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__19.png b/data/points/COIL_database/images/money pig/obj13__19.png
index 81c53e3d..81c53e3d 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__19.png
+++ b/data/points/COIL_database/images/money pig/obj13__19.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__2.png b/data/points/COIL_database/images/money pig/obj13__2.png
index fd81df13..fd81df13 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__2.png
+++ b/data/points/COIL_database/images/money pig/obj13__2.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__20.png b/data/points/COIL_database/images/money pig/obj13__20.png
index 9b402f18..9b402f18 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__20.png
+++ b/data/points/COIL_database/images/money pig/obj13__20.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__21.png b/data/points/COIL_database/images/money pig/obj13__21.png
index 9124d2ee..9124d2ee 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__21.png
+++ b/data/points/COIL_database/images/money pig/obj13__21.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__22.png b/data/points/COIL_database/images/money pig/obj13__22.png
index 3bb3acd5..3bb3acd5 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__22.png
+++ b/data/points/COIL_database/images/money pig/obj13__22.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__23.png b/data/points/COIL_database/images/money pig/obj13__23.png
index 124cf765..124cf765 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__23.png
+++ b/data/points/COIL_database/images/money pig/obj13__23.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__24.png b/data/points/COIL_database/images/money pig/obj13__24.png
index be8724ec..be8724ec 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__24.png
+++ b/data/points/COIL_database/images/money pig/obj13__24.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__25.png b/data/points/COIL_database/images/money pig/obj13__25.png
index 1b12d8a9..1b12d8a9 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__25.png
+++ b/data/points/COIL_database/images/money pig/obj13__25.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__26.png b/data/points/COIL_database/images/money pig/obj13__26.png
index da5e58ce..da5e58ce 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__26.png
+++ b/data/points/COIL_database/images/money pig/obj13__26.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__27.png b/data/points/COIL_database/images/money pig/obj13__27.png
index b25c9b05..b25c9b05 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__27.png
+++ b/data/points/COIL_database/images/money pig/obj13__27.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__28.png b/data/points/COIL_database/images/money pig/obj13__28.png
index fcc4b6bb..fcc4b6bb 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__28.png
+++ b/data/points/COIL_database/images/money pig/obj13__28.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__29.png b/data/points/COIL_database/images/money pig/obj13__29.png
index b7a646bc..b7a646bc 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__29.png
+++ b/data/points/COIL_database/images/money pig/obj13__29.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__3.png b/data/points/COIL_database/images/money pig/obj13__3.png
index 5da5acae..5da5acae 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__3.png
+++ b/data/points/COIL_database/images/money pig/obj13__3.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__30.png b/data/points/COIL_database/images/money pig/obj13__30.png
index 79ff0d69..79ff0d69 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__30.png
+++ b/data/points/COIL_database/images/money pig/obj13__30.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__31.png b/data/points/COIL_database/images/money pig/obj13__31.png
index 6f5dfdd0..6f5dfdd0 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__31.png
+++ b/data/points/COIL_database/images/money pig/obj13__31.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__32.png b/data/points/COIL_database/images/money pig/obj13__32.png
index bf828c5a..bf828c5a 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__32.png
+++ b/data/points/COIL_database/images/money pig/obj13__32.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__33.png b/data/points/COIL_database/images/money pig/obj13__33.png
index 76235e64..76235e64 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__33.png
+++ b/data/points/COIL_database/images/money pig/obj13__33.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__34.png b/data/points/COIL_database/images/money pig/obj13__34.png
index eb870a3c..eb870a3c 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__34.png
+++ b/data/points/COIL_database/images/money pig/obj13__34.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__35.png b/data/points/COIL_database/images/money pig/obj13__35.png
index 328a2b4c..328a2b4c 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__35.png
+++ b/data/points/COIL_database/images/money pig/obj13__35.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__36.png b/data/points/COIL_database/images/money pig/obj13__36.png
index add58bb8..add58bb8 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__36.png
+++ b/data/points/COIL_database/images/money pig/obj13__36.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__37.png b/data/points/COIL_database/images/money pig/obj13__37.png
index dd7804d0..dd7804d0 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__37.png
+++ b/data/points/COIL_database/images/money pig/obj13__37.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__38.png b/data/points/COIL_database/images/money pig/obj13__38.png
index 28034b0f..28034b0f 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__38.png
+++ b/data/points/COIL_database/images/money pig/obj13__38.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__39.png b/data/points/COIL_database/images/money pig/obj13__39.png
index 2344a060..2344a060 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__39.png
+++ b/data/points/COIL_database/images/money pig/obj13__39.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__4.png b/data/points/COIL_database/images/money pig/obj13__4.png
index 2546b4fe..2546b4fe 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__4.png
+++ b/data/points/COIL_database/images/money pig/obj13__4.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__40.png b/data/points/COIL_database/images/money pig/obj13__40.png
index 11a27474..11a27474 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__40.png
+++ b/data/points/COIL_database/images/money pig/obj13__40.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__41.png b/data/points/COIL_database/images/money pig/obj13__41.png
index 8402ffe2..8402ffe2 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__41.png
+++ b/data/points/COIL_database/images/money pig/obj13__41.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__42.png b/data/points/COIL_database/images/money pig/obj13__42.png
index e4c3dc5d..e4c3dc5d 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__42.png
+++ b/data/points/COIL_database/images/money pig/obj13__42.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__43.png b/data/points/COIL_database/images/money pig/obj13__43.png
index 1df2c809..1df2c809 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__43.png
+++ b/data/points/COIL_database/images/money pig/obj13__43.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__44.png b/data/points/COIL_database/images/money pig/obj13__44.png
index 1962650d..1962650d 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__44.png
+++ b/data/points/COIL_database/images/money pig/obj13__44.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__45.png b/data/points/COIL_database/images/money pig/obj13__45.png
index 13367c88..13367c88 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__45.png
+++ b/data/points/COIL_database/images/money pig/obj13__45.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__46.png b/data/points/COIL_database/images/money pig/obj13__46.png
index 7c35654b..7c35654b 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__46.png
+++ b/data/points/COIL_database/images/money pig/obj13__46.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__47.png b/data/points/COIL_database/images/money pig/obj13__47.png
index eea56f6b..eea56f6b 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__47.png
+++ b/data/points/COIL_database/images/money pig/obj13__47.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__48.png b/data/points/COIL_database/images/money pig/obj13__48.png
index 7b721615..7b721615 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__48.png
+++ b/data/points/COIL_database/images/money pig/obj13__48.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__49.png b/data/points/COIL_database/images/money pig/obj13__49.png
index babbff81..babbff81 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__49.png
+++ b/data/points/COIL_database/images/money pig/obj13__49.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__5.png b/data/points/COIL_database/images/money pig/obj13__5.png
index b7a30479..b7a30479 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__5.png
+++ b/data/points/COIL_database/images/money pig/obj13__5.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__50.png b/data/points/COIL_database/images/money pig/obj13__50.png
index 83b831a4..83b831a4 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__50.png
+++ b/data/points/COIL_database/images/money pig/obj13__50.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__51.png b/data/points/COIL_database/images/money pig/obj13__51.png
index 63af5d96..63af5d96 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__51.png
+++ b/data/points/COIL_database/images/money pig/obj13__51.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__52.png b/data/points/COIL_database/images/money pig/obj13__52.png
index 5ee92b85..5ee92b85 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__52.png
+++ b/data/points/COIL_database/images/money pig/obj13__52.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__53.png b/data/points/COIL_database/images/money pig/obj13__53.png
index 12b418de..12b418de 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__53.png
+++ b/data/points/COIL_database/images/money pig/obj13__53.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__54.png b/data/points/COIL_database/images/money pig/obj13__54.png
index 8a217df3..8a217df3 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__54.png
+++ b/data/points/COIL_database/images/money pig/obj13__54.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__55.png b/data/points/COIL_database/images/money pig/obj13__55.png
index 08a492b4..08a492b4 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__55.png
+++ b/data/points/COIL_database/images/money pig/obj13__55.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__56.png b/data/points/COIL_database/images/money pig/obj13__56.png
index c2c31c4f..c2c31c4f 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__56.png
+++ b/data/points/COIL_database/images/money pig/obj13__56.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__57.png b/data/points/COIL_database/images/money pig/obj13__57.png
index ffb62d35..ffb62d35 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__57.png
+++ b/data/points/COIL_database/images/money pig/obj13__57.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__58.png b/data/points/COIL_database/images/money pig/obj13__58.png
index fadce354..fadce354 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__58.png
+++ b/data/points/COIL_database/images/money pig/obj13__58.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__59.png b/data/points/COIL_database/images/money pig/obj13__59.png
index 7c2075a2..7c2075a2 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__59.png
+++ b/data/points/COIL_database/images/money pig/obj13__59.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__6.png b/data/points/COIL_database/images/money pig/obj13__6.png
index f5a5d1b4..f5a5d1b4 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__6.png
+++ b/data/points/COIL_database/images/money pig/obj13__6.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__60.png b/data/points/COIL_database/images/money pig/obj13__60.png
index fc9d81e4..fc9d81e4 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__60.png
+++ b/data/points/COIL_database/images/money pig/obj13__60.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__61.png b/data/points/COIL_database/images/money pig/obj13__61.png
index b60c31cf..b60c31cf 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__61.png
+++ b/data/points/COIL_database/images/money pig/obj13__61.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__62.png b/data/points/COIL_database/images/money pig/obj13__62.png
index 42f1b0ff..42f1b0ff 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__62.png
+++ b/data/points/COIL_database/images/money pig/obj13__62.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__63.png b/data/points/COIL_database/images/money pig/obj13__63.png
index 05164aeb..05164aeb 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__63.png
+++ b/data/points/COIL_database/images/money pig/obj13__63.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__64.png b/data/points/COIL_database/images/money pig/obj13__64.png
index 6384ed8d..6384ed8d 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__64.png
+++ b/data/points/COIL_database/images/money pig/obj13__64.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__65.png b/data/points/COIL_database/images/money pig/obj13__65.png
index dd7d0b2b..dd7d0b2b 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__65.png
+++ b/data/points/COIL_database/images/money pig/obj13__65.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__66.png b/data/points/COIL_database/images/money pig/obj13__66.png
index 517c2dfa..517c2dfa 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__66.png
+++ b/data/points/COIL_database/images/money pig/obj13__66.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__67.png b/data/points/COIL_database/images/money pig/obj13__67.png
index d672e0c0..d672e0c0 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__67.png
+++ b/data/points/COIL_database/images/money pig/obj13__67.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__68.png b/data/points/COIL_database/images/money pig/obj13__68.png
index dce1c0aa..dce1c0aa 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__68.png
+++ b/data/points/COIL_database/images/money pig/obj13__68.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__69.png b/data/points/COIL_database/images/money pig/obj13__69.png
index a39e05f8..a39e05f8 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__69.png
+++ b/data/points/COIL_database/images/money pig/obj13__69.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__7.png b/data/points/COIL_database/images/money pig/obj13__7.png
index dea00fee..dea00fee 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__7.png
+++ b/data/points/COIL_database/images/money pig/obj13__7.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__70.png b/data/points/COIL_database/images/money pig/obj13__70.png
index 32f86cdd..32f86cdd 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__70.png
+++ b/data/points/COIL_database/images/money pig/obj13__70.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__71.png b/data/points/COIL_database/images/money pig/obj13__71.png
index ee26c5a9..ee26c5a9 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__71.png
+++ b/data/points/COIL_database/images/money pig/obj13__71.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__8.png b/data/points/COIL_database/images/money pig/obj13__8.png
index 6ffa666d..6ffa666d 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__8.png
+++ b/data/points/COIL_database/images/money pig/obj13__8.png
Binary files differ
diff --git a/data/points/COIL_database/images/money pig/obj13__9.png b/data/points/COIL_database/images/money pig/obj13__9.png
index ab971710..ab971710 100755..100644
--- a/data/points/COIL_database/images/money pig/obj13__9.png
+++ b/data/points/COIL_database/images/money pig/obj13__9.png
Binary files differ
diff --git a/data/points/COIL_database/little_car.off b/data/points/COIL_database/little_car.off
index 056c56db..056c56db 100755..100644
--- a/data/points/COIL_database/little_car.off
+++ b/data/points/COIL_database/little_car.off
diff --git a/data/points/COIL_database/lucky_cat.off b/data/points/COIL_database/lucky_cat.off
index 35ac5fc5..35ac5fc5 100755..100644
--- a/data/points/COIL_database/lucky_cat.off
+++ b/data/points/COIL_database/lucky_cat.off
diff --git a/data/points/COIL_database/money_pig.off b/data/points/COIL_database/money_pig.off
index 5acb05dd..5acb05dd 100755..100644
--- a/data/points/COIL_database/money_pig.off
+++ b/data/points/COIL_database/money_pig.off
diff --git a/data/points/SO3_10000.off b/data/points/SO3_10000.off
index fbf9b273..fbf9b273 100755..100644
--- a/data/points/SO3_10000.off
+++ b/data/points/SO3_10000.off
diff --git a/data/points/SO3_50000.off b/data/points/SO3_50000.off
index 635e8988..635e8988 100755..100644
--- a/data/points/SO3_50000.off
+++ b/data/points/SO3_50000.off
diff --git a/data/points/alphacomplexdoc.off b/data/points/alphacomplexdoc.off
new file mode 100644
index 00000000..bb790193
--- /dev/null
+++ b/data/points/alphacomplexdoc.off
@@ -0,0 +1,10 @@
+nOFF
+2 7 0 0
+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
+
diff --git a/data/points/generator/CMakeLists.txt b/data/points/generator/CMakeLists.txt
index 0f2674c4..f559610c 100644
--- a/data/points/generator/CMakeLists.txt
+++ b/data/points/generator/CMakeLists.txt
@@ -1,17 +1,11 @@
cmake_minimum_required(VERSION 2.6)
-project(GUDHIPointsGenerator)
+project(Data_points_generator)
if(CGAL_FOUND)
if (NOT CGAL_VERSION VERSION_LESS 4.6.0)
- message(STATUS "CGAL version: ${CGAL_VERSION}.")
- include( ${CGAL_USE_FILE} )
-
- find_package(Eigen3 3.1.0)
if (EIGEN3_FOUND)
- include( ${EIGEN3_USE_FILE} )
- include_directories (BEFORE "../../include")
-
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)
@@ -19,8 +13,6 @@ if(CGAL_FOUND)
# 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()
- else()
- message(WARNING "CGAL version: ${CGAL_VERSION} is too old to compile Alpha shapes feature. Version 4.6.0 is required.")
- endif ()
-endif()
+ endif(EIGEN3_FOUND)
+ endif(NOT CGAL_VERSION VERSION_LESS 4.6.0)
+endif(CGAL_FOUND)
diff --git a/data/points/generator/README b/data/points/generator/README
index e6b28eb0..41cb9165 100644
--- a/data/points/generator/README
+++ b/data/points/generator/README
@@ -1,10 +1,13 @@
-To build the example, run in a Terminal:
+=========================== C++ generators =====================================
+
+To build the C++ generators, run in a Terminal:
cd /path-to-gudhi/
cmake .
cd /path-to-data-generator/
make
+=========================== hypergenerator =====================================
Example of use :
@@ -24,3 +27,18 @@ Example of use :
!! Warning: hypegenerator on cube is not available !!
+===================== aurelien_alvarez_surfaces_in_R8 ==========================
+
+This generator is written in Python.
+
+This code generates points on a family of surfaces living in CP^2. You can move
+in the family thanks to the parameter "degre". The parameter "nombrePoints"
+allows to choose the number of points on the chosen surface. Finally, to compute
+the points, we choose a chart in C^2 and take points randomly in the x-variable,
+so that you may also modify the window for x in the complex plane (parameter
+"module_x").
+
+After that, the program computes points in C^2, then maps them in R^8, so that
+the points live on a surface which is compact (which is not the case for the
+intersection of the surface with C^2). We end off with a bunch of points on a
+compact surface in R^8.
diff --git a/data/points/generator/aurelien_alvarez_surfaces_in_R8.py b/data/points/generator/aurelien_alvarez_surfaces_in_R8.py
new file mode 100755
index 00000000..57773c4c
--- /dev/null
+++ b/data/points/generator/aurelien_alvarez_surfaces_in_R8.py
@@ -0,0 +1,90 @@
+# This file is part of the Gudhi Library. The Gudhi library
+# (Geometric Understanding in Higher Dimensions) is a generic C++
+# library for computational topology.
+#
+# Author(s): Aurélien Alvarez
+#
+# Copyright (C) 2016 Université d'Orléans (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/>.
+
+import numpy as np
+import random
+from math import factorial
+
+I = complex(0,1)
+
+#################################################
+#################################################
+
+#Surface réelle d'équation x.conj(y)^d + y.conj(z)^d + z.conj(x)^d = 0 dans P2(C)
+#Équation affine (z=1) multipliée par sa conjuguée (d = 2) : x.conj(x)^2.y^4 + 2x^3.conj(x).y^2 + y + conj(x)^2 + x^5 = 0
+def equationAffineSurfaceReelle(x):
+ polynome = [0]*(degre**2+1)
+ for k in range(degre+1):
+ polynome[k*degre] = (-1)**degre*x*factorial(degre)/(factorial(k)*factorial(degre-k))*x**(k*degre)*np.conjugate(x)**(degre-k)
+ polynome[-2] += 1
+ polynome[-1] += np.conjugate(x)**degre
+ return polynome
+
+#################################################
+#################################################
+
+def calculRacines(equation,nombrePoints,module_x):
+ racines = [[1,0,0],[0,1,0],[0,0,1]]
+ for _ in range(nombrePoints):
+ x = module_x*(2*random.random()-1+I*(2*random.random()-1))
+ fool = [[[x,y,1],[y,1,x],[1,x,y]] for y in np.roots(equation(x)) if abs(x*np.conjugate(y)**degre+y+np.conjugate(x)**degre) < 0.0001]
+ for bar in fool:
+ racines += bar
+ return racines
+
+#################################################
+#################################################
+
+def plongementDansR8(pointDansCP2):
+ z0 = pointDansCP2[0]
+ z1 = pointDansCP2[1]
+ z2 = pointDansCP2[2]
+ a = z0*np.conjugate(z0)
+ b = z1*np.conjugate(z1)
+ c = z2*np.conjugate(z2)
+ normeCarree = a+b+c
+ a = a/normeCarree
+ b = b/normeCarree
+ u = z0*np.conjugate(z1)/normeCarree
+ v = z0*np.conjugate(z2)/normeCarree
+ w = z1*np.conjugate(z2)/normeCarree
+ return [a.real,b.real,u.real,u.imag,v.real,v.imag,w.real,w.imag]
+
+def plongementListeDansR8(listePointsDansCP2):
+ listePointsDansR8 = []
+ for point in listePointsDansCP2:
+ listePointsDansR8 += [plongementDansR8(point)]
+ return listePointsDansR8
+
+#################################################
+#################################################
+
+degre = 3
+nombrePoints = 10**4
+module_x = 10
+
+with open("surface.txt","w") as fichier:
+ bar = calculRacines(equationAffineSurfaceReelle,nombrePoints,module_x)
+ listePoints = plongementListeDansR8(bar)
+ fichier.write(str(len(bar)) + "\n")
+ for point in listePoints:
+ fichier.write(str(point[0]) + " " + str(point[1]) + " " + str(point[2]) + " " + str(point[3]) + " " + str(point[4]) + " " + str(point[5]) + " " + str(point[6]) + " " + str(point[7]) + "\n")
+
diff --git a/data/points/generator/hypergenerator.cpp b/data/points/generator/hypergenerator.cpp
index f4ea6b07..60890b44 100644
--- a/data/points/generator/hypergenerator.cpp
+++ b/data/points/generator/hypergenerator.cpp
@@ -35,8 +35,9 @@ typedef CGAL::Epick_d< CGAL::Dynamic_dimension_tag > K;
typedef K::Point_d Point;
void usage(char * const progName) {
- std::cerr << "Usage: " << progName << " in|on sphere|cube off_file_name points_number[integer > 0] dimension[integer > 1] radius[double > 0.0 | default = 1.0]" << std::endl;
- exit(-1); // ----- >>
+ std::cerr << "Usage: " << progName << " in|on sphere|cube off_file_name points_number[integer > 0] " <<
+ "dimension[integer > 1] radius[double > 0.0 | default = 1.0]" << std::endl;
+ exit(-1);
}
int main(int argc, char **argv) {
@@ -86,8 +87,13 @@ int main(int argc, char **argv) {
}
std::ofstream diagram_out(argv[3]);
- diagram_out << "OFF" << std::endl;
- diagram_out << points_number << " 0 0" << std::endl;
+ if (dimension == 3) {
+ diagram_out << "OFF" << std::endl;
+ diagram_out << points_number << " 0 0" << std::endl;
+ } else {
+ diagram_out << "nOFF" << std::endl;
+ diagram_out << dimension << " " << points_number << " 0 0" << std::endl;
+ }
if (diagram_out.is_open()) {
// Instanciate a random point generator
@@ -114,7 +120,7 @@ int main(int argc, char **argv) {
for (auto thePoint : points) {
int i = 0;
- for (;i < dimension - 1; i++) {
+ for (; i < dimension - 1; i++) {
diagram_out << thePoint[i] << " ";
}
diagram_out << thePoint[i] << std::endl; // last point + Carriage Return
diff --git a/data/points/grid_10_10_10_in_0_1.off b/data/points/grid_10_10_10_in_0_1.off
new file mode 100644
index 00000000..ea86cf1b
--- /dev/null
+++ b/data/points/grid_10_10_10_in_0_1.off
@@ -0,0 +1,1002 @@
+OFF
+1000 0 0
+0 0 0
+0 0 0.1
+0 0 0.2
+0 0 0.3
+0 0 0.4
+0 0 0.5
+0 0 0.6
+0 0 0.7
+0 0 0.8
+0 0 0.9
+0 0.1 0
+0 0.1 0.1
+0 0.1 0.2
+0 0.1 0.3
+0 0.1 0.4
+0 0.1 0.5
+0 0.1 0.6
+0 0.1 0.7
+0 0.1 0.8
+0 0.1 0.9
+0 0.2 0
+0 0.2 0.1
+0 0.2 0.2
+0 0.2 0.3
+0 0.2 0.4
+0 0.2 0.5
+0 0.2 0.6
+0 0.2 0.7
+0 0.2 0.8
+0 0.2 0.9
+0 0.3 0
+0 0.3 0.1
+0 0.3 0.2
+0 0.3 0.3
+0 0.3 0.4
+0 0.3 0.5
+0 0.3 0.6
+0 0.3 0.7
+0 0.3 0.8
+0 0.3 0.9
+0 0.4 0
+0 0.4 0.1
+0 0.4 0.2
+0 0.4 0.3
+0 0.4 0.4
+0 0.4 0.5
+0 0.4 0.6
+0 0.4 0.7
+0 0.4 0.8
+0 0.4 0.9
+0 0.5 0
+0 0.5 0.1
+0 0.5 0.2
+0 0.5 0.3
+0 0.5 0.4
+0 0.5 0.5
+0 0.5 0.6
+0 0.5 0.7
+0 0.5 0.8
+0 0.5 0.9
+0 0.6 0
+0 0.6 0.1
+0 0.6 0.2
+0 0.6 0.3
+0 0.6 0.4
+0 0.6 0.5
+0 0.6 0.6
+0 0.6 0.7
+0 0.6 0.8
+0 0.6 0.9
+0 0.7 0
+0 0.7 0.1
+0 0.7 0.2
+0 0.7 0.3
+0 0.7 0.4
+0 0.7 0.5
+0 0.7 0.6
+0 0.7 0.7
+0 0.7 0.8
+0 0.7 0.9
+0 0.8 0
+0 0.8 0.1
+0 0.8 0.2
+0 0.8 0.3
+0 0.8 0.4
+0 0.8 0.5
+0 0.8 0.6
+0 0.8 0.7
+0 0.8 0.8
+0 0.8 0.9
+0 0.9 0
+0 0.9 0.1
+0 0.9 0.2
+0 0.9 0.3
+0 0.9 0.4
+0 0.9 0.5
+0 0.9 0.6
+0 0.9 0.7
+0 0.9 0.8
+0 0.9 0.9
+0.1 0 0
+0.1 0 0.1
+0.1 0 0.2
+0.1 0 0.3
+0.1 0 0.4
+0.1 0 0.5
+0.1 0 0.6
+0.1 0 0.7
+0.1 0 0.8
+0.1 0 0.9
+0.1 0.1 0
+0.1 0.1 0.1
+0.1 0.1 0.2
+0.1 0.1 0.3
+0.1 0.1 0.4
+0.1 0.1 0.5
+0.1 0.1 0.6
+0.1 0.1 0.7
+0.1 0.1 0.8
+0.1 0.1 0.9
+0.1 0.2 0
+0.1 0.2 0.1
+0.1 0.2 0.2
+0.1 0.2 0.3
+0.1 0.2 0.4
+0.1 0.2 0.5
+0.1 0.2 0.6
+0.1 0.2 0.7
+0.1 0.2 0.8
+0.1 0.2 0.9
+0.1 0.3 0
+0.1 0.3 0.1
+0.1 0.3 0.2
+0.1 0.3 0.3
+0.1 0.3 0.4
+0.1 0.3 0.5
+0.1 0.3 0.6
+0.1 0.3 0.7
+0.1 0.3 0.8
+0.1 0.3 0.9
+0.1 0.4 0
+0.1 0.4 0.1
+0.1 0.4 0.2
+0.1 0.4 0.3
+0.1 0.4 0.4
+0.1 0.4 0.5
+0.1 0.4 0.6
+0.1 0.4 0.7
+0.1 0.4 0.8
+0.1 0.4 0.9
+0.1 0.5 0
+0.1 0.5 0.1
+0.1 0.5 0.2
+0.1 0.5 0.3
+0.1 0.5 0.4
+0.1 0.5 0.5
+0.1 0.5 0.6
+0.1 0.5 0.7
+0.1 0.5 0.8
+0.1 0.5 0.9
+0.1 0.6 0
+0.1 0.6 0.1
+0.1 0.6 0.2
+0.1 0.6 0.3
+0.1 0.6 0.4
+0.1 0.6 0.5
+0.1 0.6 0.6
+0.1 0.6 0.7
+0.1 0.6 0.8
+0.1 0.6 0.9
+0.1 0.7 0
+0.1 0.7 0.1
+0.1 0.7 0.2
+0.1 0.7 0.3
+0.1 0.7 0.4
+0.1 0.7 0.5
+0.1 0.7 0.6
+0.1 0.7 0.7
+0.1 0.7 0.8
+0.1 0.7 0.9
+0.1 0.8 0
+0.1 0.8 0.1
+0.1 0.8 0.2
+0.1 0.8 0.3
+0.1 0.8 0.4
+0.1 0.8 0.5
+0.1 0.8 0.6
+0.1 0.8 0.7
+0.1 0.8 0.8
+0.1 0.8 0.9
+0.1 0.9 0
+0.1 0.9 0.1
+0.1 0.9 0.2
+0.1 0.9 0.3
+0.1 0.9 0.4
+0.1 0.9 0.5
+0.1 0.9 0.6
+0.1 0.9 0.7
+0.1 0.9 0.8
+0.1 0.9 0.9
+0.2 0 0
+0.2 0 0.1
+0.2 0 0.2
+0.2 0 0.3
+0.2 0 0.4
+0.2 0 0.5
+0.2 0 0.6
+0.2 0 0.7
+0.2 0 0.8
+0.2 0 0.9
+0.2 0.1 0
+0.2 0.1 0.1
+0.2 0.1 0.2
+0.2 0.1 0.3
+0.2 0.1 0.4
+0.2 0.1 0.5
+0.2 0.1 0.6
+0.2 0.1 0.7
+0.2 0.1 0.8
+0.2 0.1 0.9
+0.2 0.2 0
+0.2 0.2 0.1
+0.2 0.2 0.2
+0.2 0.2 0.3
+0.2 0.2 0.4
+0.2 0.2 0.5
+0.2 0.2 0.6
+0.2 0.2 0.7
+0.2 0.2 0.8
+0.2 0.2 0.9
+0.2 0.3 0
+0.2 0.3 0.1
+0.2 0.3 0.2
+0.2 0.3 0.3
+0.2 0.3 0.4
+0.2 0.3 0.5
+0.2 0.3 0.6
+0.2 0.3 0.7
+0.2 0.3 0.8
+0.2 0.3 0.9
+0.2 0.4 0
+0.2 0.4 0.1
+0.2 0.4 0.2
+0.2 0.4 0.3
+0.2 0.4 0.4
+0.2 0.4 0.5
+0.2 0.4 0.6
+0.2 0.4 0.7
+0.2 0.4 0.8
+0.2 0.4 0.9
+0.2 0.5 0
+0.2 0.5 0.1
+0.2 0.5 0.2
+0.2 0.5 0.3
+0.2 0.5 0.4
+0.2 0.5 0.5
+0.2 0.5 0.6
+0.2 0.5 0.7
+0.2 0.5 0.8
+0.2 0.5 0.9
+0.2 0.6 0
+0.2 0.6 0.1
+0.2 0.6 0.2
+0.2 0.6 0.3
+0.2 0.6 0.4
+0.2 0.6 0.5
+0.2 0.6 0.6
+0.2 0.6 0.7
+0.2 0.6 0.8
+0.2 0.6 0.9
+0.2 0.7 0
+0.2 0.7 0.1
+0.2 0.7 0.2
+0.2 0.7 0.3
+0.2 0.7 0.4
+0.2 0.7 0.5
+0.2 0.7 0.6
+0.2 0.7 0.7
+0.2 0.7 0.8
+0.2 0.7 0.9
+0.2 0.8 0
+0.2 0.8 0.1
+0.2 0.8 0.2
+0.2 0.8 0.3
+0.2 0.8 0.4
+0.2 0.8 0.5
+0.2 0.8 0.6
+0.2 0.8 0.7
+0.2 0.8 0.8
+0.2 0.8 0.9
+0.2 0.9 0
+0.2 0.9 0.1
+0.2 0.9 0.2
+0.2 0.9 0.3
+0.2 0.9 0.4
+0.2 0.9 0.5
+0.2 0.9 0.6
+0.2 0.9 0.7
+0.2 0.9 0.8
+0.2 0.9 0.9
+0.3 0 0
+0.3 0 0.1
+0.3 0 0.2
+0.3 0 0.3
+0.3 0 0.4
+0.3 0 0.5
+0.3 0 0.6
+0.3 0 0.7
+0.3 0 0.8
+0.3 0 0.9
+0.3 0.1 0
+0.3 0.1 0.1
+0.3 0.1 0.2
+0.3 0.1 0.3
+0.3 0.1 0.4
+0.3 0.1 0.5
+0.3 0.1 0.6
+0.3 0.1 0.7
+0.3 0.1 0.8
+0.3 0.1 0.9
+0.3 0.2 0
+0.3 0.2 0.1
+0.3 0.2 0.2
+0.3 0.2 0.3
+0.3 0.2 0.4
+0.3 0.2 0.5
+0.3 0.2 0.6
+0.3 0.2 0.7
+0.3 0.2 0.8
+0.3 0.2 0.9
+0.3 0.3 0
+0.3 0.3 0.1
+0.3 0.3 0.2
+0.3 0.3 0.3
+0.3 0.3 0.4
+0.3 0.3 0.5
+0.3 0.3 0.6
+0.3 0.3 0.7
+0.3 0.3 0.8
+0.3 0.3 0.9
+0.3 0.4 0
+0.3 0.4 0.1
+0.3 0.4 0.2
+0.3 0.4 0.3
+0.3 0.4 0.4
+0.3 0.4 0.5
+0.3 0.4 0.6
+0.3 0.4 0.7
+0.3 0.4 0.8
+0.3 0.4 0.9
+0.3 0.5 0
+0.3 0.5 0.1
+0.3 0.5 0.2
+0.3 0.5 0.3
+0.3 0.5 0.4
+0.3 0.5 0.5
+0.3 0.5 0.6
+0.3 0.5 0.7
+0.3 0.5 0.8
+0.3 0.5 0.9
+0.3 0.6 0
+0.3 0.6 0.1
+0.3 0.6 0.2
+0.3 0.6 0.3
+0.3 0.6 0.4
+0.3 0.6 0.5
+0.3 0.6 0.6
+0.3 0.6 0.7
+0.3 0.6 0.8
+0.3 0.6 0.9
+0.3 0.7 0
+0.3 0.7 0.1
+0.3 0.7 0.2
+0.3 0.7 0.3
+0.3 0.7 0.4
+0.3 0.7 0.5
+0.3 0.7 0.6
+0.3 0.7 0.7
+0.3 0.7 0.8
+0.3 0.7 0.9
+0.3 0.8 0
+0.3 0.8 0.1
+0.3 0.8 0.2
+0.3 0.8 0.3
+0.3 0.8 0.4
+0.3 0.8 0.5
+0.3 0.8 0.6
+0.3 0.8 0.7
+0.3 0.8 0.8
+0.3 0.8 0.9
+0.3 0.9 0
+0.3 0.9 0.1
+0.3 0.9 0.2
+0.3 0.9 0.3
+0.3 0.9 0.4
+0.3 0.9 0.5
+0.3 0.9 0.6
+0.3 0.9 0.7
+0.3 0.9 0.8
+0.3 0.9 0.9
+0.4 0 0
+0.4 0 0.1
+0.4 0 0.2
+0.4 0 0.3
+0.4 0 0.4
+0.4 0 0.5
+0.4 0 0.6
+0.4 0 0.7
+0.4 0 0.8
+0.4 0 0.9
+0.4 0.1 0
+0.4 0.1 0.1
+0.4 0.1 0.2
+0.4 0.1 0.3
+0.4 0.1 0.4
+0.4 0.1 0.5
+0.4 0.1 0.6
+0.4 0.1 0.7
+0.4 0.1 0.8
+0.4 0.1 0.9
+0.4 0.2 0
+0.4 0.2 0.1
+0.4 0.2 0.2
+0.4 0.2 0.3
+0.4 0.2 0.4
+0.4 0.2 0.5
+0.4 0.2 0.6
+0.4 0.2 0.7
+0.4 0.2 0.8
+0.4 0.2 0.9
+0.4 0.3 0
+0.4 0.3 0.1
+0.4 0.3 0.2
+0.4 0.3 0.3
+0.4 0.3 0.4
+0.4 0.3 0.5
+0.4 0.3 0.6
+0.4 0.3 0.7
+0.4 0.3 0.8
+0.4 0.3 0.9
+0.4 0.4 0
+0.4 0.4 0.1
+0.4 0.4 0.2
+0.4 0.4 0.3
+0.4 0.4 0.4
+0.4 0.4 0.5
+0.4 0.4 0.6
+0.4 0.4 0.7
+0.4 0.4 0.8
+0.4 0.4 0.9
+0.4 0.5 0
+0.4 0.5 0.1
+0.4 0.5 0.2
+0.4 0.5 0.3
+0.4 0.5 0.4
+0.4 0.5 0.5
+0.4 0.5 0.6
+0.4 0.5 0.7
+0.4 0.5 0.8
+0.4 0.5 0.9
+0.4 0.6 0
+0.4 0.6 0.1
+0.4 0.6 0.2
+0.4 0.6 0.3
+0.4 0.6 0.4
+0.4 0.6 0.5
+0.4 0.6 0.6
+0.4 0.6 0.7
+0.4 0.6 0.8
+0.4 0.6 0.9
+0.4 0.7 0
+0.4 0.7 0.1
+0.4 0.7 0.2
+0.4 0.7 0.3
+0.4 0.7 0.4
+0.4 0.7 0.5
+0.4 0.7 0.6
+0.4 0.7 0.7
+0.4 0.7 0.8
+0.4 0.7 0.9
+0.4 0.8 0
+0.4 0.8 0.1
+0.4 0.8 0.2
+0.4 0.8 0.3
+0.4 0.8 0.4
+0.4 0.8 0.5
+0.4 0.8 0.6
+0.4 0.8 0.7
+0.4 0.8 0.8
+0.4 0.8 0.9
+0.4 0.9 0
+0.4 0.9 0.1
+0.4 0.9 0.2
+0.4 0.9 0.3
+0.4 0.9 0.4
+0.4 0.9 0.5
+0.4 0.9 0.6
+0.4 0.9 0.7
+0.4 0.9 0.8
+0.4 0.9 0.9
+0.5 0 0
+0.5 0 0.1
+0.5 0 0.2
+0.5 0 0.3
+0.5 0 0.4
+0.5 0 0.5
+0.5 0 0.6
+0.5 0 0.7
+0.5 0 0.8
+0.5 0 0.9
+0.5 0.1 0
+0.5 0.1 0.1
+0.5 0.1 0.2
+0.5 0.1 0.3
+0.5 0.1 0.4
+0.5 0.1 0.5
+0.5 0.1 0.6
+0.5 0.1 0.7
+0.5 0.1 0.8
+0.5 0.1 0.9
+0.5 0.2 0
+0.5 0.2 0.1
+0.5 0.2 0.2
+0.5 0.2 0.3
+0.5 0.2 0.4
+0.5 0.2 0.5
+0.5 0.2 0.6
+0.5 0.2 0.7
+0.5 0.2 0.8
+0.5 0.2 0.9
+0.5 0.3 0
+0.5 0.3 0.1
+0.5 0.3 0.2
+0.5 0.3 0.3
+0.5 0.3 0.4
+0.5 0.3 0.5
+0.5 0.3 0.6
+0.5 0.3 0.7
+0.5 0.3 0.8
+0.5 0.3 0.9
+0.5 0.4 0
+0.5 0.4 0.1
+0.5 0.4 0.2
+0.5 0.4 0.3
+0.5 0.4 0.4
+0.5 0.4 0.5
+0.5 0.4 0.6
+0.5 0.4 0.7
+0.5 0.4 0.8
+0.5 0.4 0.9
+0.5 0.5 0
+0.5 0.5 0.1
+0.5 0.5 0.2
+0.5 0.5 0.3
+0.5 0.5 0.4
+0.5 0.5 0.5
+0.5 0.5 0.6
+0.5 0.5 0.7
+0.5 0.5 0.8
+0.5 0.5 0.9
+0.5 0.6 0
+0.5 0.6 0.1
+0.5 0.6 0.2
+0.5 0.6 0.3
+0.5 0.6 0.4
+0.5 0.6 0.5
+0.5 0.6 0.6
+0.5 0.6 0.7
+0.5 0.6 0.8
+0.5 0.6 0.9
+0.5 0.7 0
+0.5 0.7 0.1
+0.5 0.7 0.2
+0.5 0.7 0.3
+0.5 0.7 0.4
+0.5 0.7 0.5
+0.5 0.7 0.6
+0.5 0.7 0.7
+0.5 0.7 0.8
+0.5 0.7 0.9
+0.5 0.8 0
+0.5 0.8 0.1
+0.5 0.8 0.2
+0.5 0.8 0.3
+0.5 0.8 0.4
+0.5 0.8 0.5
+0.5 0.8 0.6
+0.5 0.8 0.7
+0.5 0.8 0.8
+0.5 0.8 0.9
+0.5 0.9 0
+0.5 0.9 0.1
+0.5 0.9 0.2
+0.5 0.9 0.3
+0.5 0.9 0.4
+0.5 0.9 0.5
+0.5 0.9 0.6
+0.5 0.9 0.7
+0.5 0.9 0.8
+0.5 0.9 0.9
+0.6 0 0
+0.6 0 0.1
+0.6 0 0.2
+0.6 0 0.3
+0.6 0 0.4
+0.6 0 0.5
+0.6 0 0.6
+0.6 0 0.7
+0.6 0 0.8
+0.6 0 0.9
+0.6 0.1 0
+0.6 0.1 0.1
+0.6 0.1 0.2
+0.6 0.1 0.3
+0.6 0.1 0.4
+0.6 0.1 0.5
+0.6 0.1 0.6
+0.6 0.1 0.7
+0.6 0.1 0.8
+0.6 0.1 0.9
+0.6 0.2 0
+0.6 0.2 0.1
+0.6 0.2 0.2
+0.6 0.2 0.3
+0.6 0.2 0.4
+0.6 0.2 0.5
+0.6 0.2 0.6
+0.6 0.2 0.7
+0.6 0.2 0.8
+0.6 0.2 0.9
+0.6 0.3 0
+0.6 0.3 0.1
+0.6 0.3 0.2
+0.6 0.3 0.3
+0.6 0.3 0.4
+0.6 0.3 0.5
+0.6 0.3 0.6
+0.6 0.3 0.7
+0.6 0.3 0.8
+0.6 0.3 0.9
+0.6 0.4 0
+0.6 0.4 0.1
+0.6 0.4 0.2
+0.6 0.4 0.3
+0.6 0.4 0.4
+0.6 0.4 0.5
+0.6 0.4 0.6
+0.6 0.4 0.7
+0.6 0.4 0.8
+0.6 0.4 0.9
+0.6 0.5 0
+0.6 0.5 0.1
+0.6 0.5 0.2
+0.6 0.5 0.3
+0.6 0.5 0.4
+0.6 0.5 0.5
+0.6 0.5 0.6
+0.6 0.5 0.7
+0.6 0.5 0.8
+0.6 0.5 0.9
+0.6 0.6 0
+0.6 0.6 0.1
+0.6 0.6 0.2
+0.6 0.6 0.3
+0.6 0.6 0.4
+0.6 0.6 0.5
+0.6 0.6 0.6
+0.6 0.6 0.7
+0.6 0.6 0.8
+0.6 0.6 0.9
+0.6 0.7 0
+0.6 0.7 0.1
+0.6 0.7 0.2
+0.6 0.7 0.3
+0.6 0.7 0.4
+0.6 0.7 0.5
+0.6 0.7 0.6
+0.6 0.7 0.7
+0.6 0.7 0.8
+0.6 0.7 0.9
+0.6 0.8 0
+0.6 0.8 0.1
+0.6 0.8 0.2
+0.6 0.8 0.3
+0.6 0.8 0.4
+0.6 0.8 0.5
+0.6 0.8 0.6
+0.6 0.8 0.7
+0.6 0.8 0.8
+0.6 0.8 0.9
+0.6 0.9 0
+0.6 0.9 0.1
+0.6 0.9 0.2
+0.6 0.9 0.3
+0.6 0.9 0.4
+0.6 0.9 0.5
+0.6 0.9 0.6
+0.6 0.9 0.7
+0.6 0.9 0.8
+0.6 0.9 0.9
+0.7 0 0
+0.7 0 0.1
+0.7 0 0.2
+0.7 0 0.3
+0.7 0 0.4
+0.7 0 0.5
+0.7 0 0.6
+0.7 0 0.7
+0.7 0 0.8
+0.7 0 0.9
+0.7 0.1 0
+0.7 0.1 0.1
+0.7 0.1 0.2
+0.7 0.1 0.3
+0.7 0.1 0.4
+0.7 0.1 0.5
+0.7 0.1 0.6
+0.7 0.1 0.7
+0.7 0.1 0.8
+0.7 0.1 0.9
+0.7 0.2 0
+0.7 0.2 0.1
+0.7 0.2 0.2
+0.7 0.2 0.3
+0.7 0.2 0.4
+0.7 0.2 0.5
+0.7 0.2 0.6
+0.7 0.2 0.7
+0.7 0.2 0.8
+0.7 0.2 0.9
+0.7 0.3 0
+0.7 0.3 0.1
+0.7 0.3 0.2
+0.7 0.3 0.3
+0.7 0.3 0.4
+0.7 0.3 0.5
+0.7 0.3 0.6
+0.7 0.3 0.7
+0.7 0.3 0.8
+0.7 0.3 0.9
+0.7 0.4 0
+0.7 0.4 0.1
+0.7 0.4 0.2
+0.7 0.4 0.3
+0.7 0.4 0.4
+0.7 0.4 0.5
+0.7 0.4 0.6
+0.7 0.4 0.7
+0.7 0.4 0.8
+0.7 0.4 0.9
+0.7 0.5 0
+0.7 0.5 0.1
+0.7 0.5 0.2
+0.7 0.5 0.3
+0.7 0.5 0.4
+0.7 0.5 0.5
+0.7 0.5 0.6
+0.7 0.5 0.7
+0.7 0.5 0.8
+0.7 0.5 0.9
+0.7 0.6 0
+0.7 0.6 0.1
+0.7 0.6 0.2
+0.7 0.6 0.3
+0.7 0.6 0.4
+0.7 0.6 0.5
+0.7 0.6 0.6
+0.7 0.6 0.7
+0.7 0.6 0.8
+0.7 0.6 0.9
+0.7 0.7 0
+0.7 0.7 0.1
+0.7 0.7 0.2
+0.7 0.7 0.3
+0.7 0.7 0.4
+0.7 0.7 0.5
+0.7 0.7 0.6
+0.7 0.7 0.7
+0.7 0.7 0.8
+0.7 0.7 0.9
+0.7 0.8 0
+0.7 0.8 0.1
+0.7 0.8 0.2
+0.7 0.8 0.3
+0.7 0.8 0.4
+0.7 0.8 0.5
+0.7 0.8 0.6
+0.7 0.8 0.7
+0.7 0.8 0.8
+0.7 0.8 0.9
+0.7 0.9 0
+0.7 0.9 0.1
+0.7 0.9 0.2
+0.7 0.9 0.3
+0.7 0.9 0.4
+0.7 0.9 0.5
+0.7 0.9 0.6
+0.7 0.9 0.7
+0.7 0.9 0.8
+0.7 0.9 0.9
+0.8 0 0
+0.8 0 0.1
+0.8 0 0.2
+0.8 0 0.3
+0.8 0 0.4
+0.8 0 0.5
+0.8 0 0.6
+0.8 0 0.7
+0.8 0 0.8
+0.8 0 0.9
+0.8 0.1 0
+0.8 0.1 0.1
+0.8 0.1 0.2
+0.8 0.1 0.3
+0.8 0.1 0.4
+0.8 0.1 0.5
+0.8 0.1 0.6
+0.8 0.1 0.7
+0.8 0.1 0.8
+0.8 0.1 0.9
+0.8 0.2 0
+0.8 0.2 0.1
+0.8 0.2 0.2
+0.8 0.2 0.3
+0.8 0.2 0.4
+0.8 0.2 0.5
+0.8 0.2 0.6
+0.8 0.2 0.7
+0.8 0.2 0.8
+0.8 0.2 0.9
+0.8 0.3 0
+0.8 0.3 0.1
+0.8 0.3 0.2
+0.8 0.3 0.3
+0.8 0.3 0.4
+0.8 0.3 0.5
+0.8 0.3 0.6
+0.8 0.3 0.7
+0.8 0.3 0.8
+0.8 0.3 0.9
+0.8 0.4 0
+0.8 0.4 0.1
+0.8 0.4 0.2
+0.8 0.4 0.3
+0.8 0.4 0.4
+0.8 0.4 0.5
+0.8 0.4 0.6
+0.8 0.4 0.7
+0.8 0.4 0.8
+0.8 0.4 0.9
+0.8 0.5 0
+0.8 0.5 0.1
+0.8 0.5 0.2
+0.8 0.5 0.3
+0.8 0.5 0.4
+0.8 0.5 0.5
+0.8 0.5 0.6
+0.8 0.5 0.7
+0.8 0.5 0.8
+0.8 0.5 0.9
+0.8 0.6 0
+0.8 0.6 0.1
+0.8 0.6 0.2
+0.8 0.6 0.3
+0.8 0.6 0.4
+0.8 0.6 0.5
+0.8 0.6 0.6
+0.8 0.6 0.7
+0.8 0.6 0.8
+0.8 0.6 0.9
+0.8 0.7 0
+0.8 0.7 0.1
+0.8 0.7 0.2
+0.8 0.7 0.3
+0.8 0.7 0.4
+0.8 0.7 0.5
+0.8 0.7 0.6
+0.8 0.7 0.7
+0.8 0.7 0.8
+0.8 0.7 0.9
+0.8 0.8 0
+0.8 0.8 0.1
+0.8 0.8 0.2
+0.8 0.8 0.3
+0.8 0.8 0.4
+0.8 0.8 0.5
+0.8 0.8 0.6
+0.8 0.8 0.7
+0.8 0.8 0.8
+0.8 0.8 0.9
+0.8 0.9 0
+0.8 0.9 0.1
+0.8 0.9 0.2
+0.8 0.9 0.3
+0.8 0.9 0.4
+0.8 0.9 0.5
+0.8 0.9 0.6
+0.8 0.9 0.7
+0.8 0.9 0.8
+0.8 0.9 0.9
+0.9 0 0
+0.9 0 0.1
+0.9 0 0.2
+0.9 0 0.3
+0.9 0 0.4
+0.9 0 0.5
+0.9 0 0.6
+0.9 0 0.7
+0.9 0 0.8
+0.9 0 0.9
+0.9 0.1 0
+0.9 0.1 0.1
+0.9 0.1 0.2
+0.9 0.1 0.3
+0.9 0.1 0.4
+0.9 0.1 0.5
+0.9 0.1 0.6
+0.9 0.1 0.7
+0.9 0.1 0.8
+0.9 0.1 0.9
+0.9 0.2 0
+0.9 0.2 0.1
+0.9 0.2 0.2
+0.9 0.2 0.3
+0.9 0.2 0.4
+0.9 0.2 0.5
+0.9 0.2 0.6
+0.9 0.2 0.7
+0.9 0.2 0.8
+0.9 0.2 0.9
+0.9 0.3 0
+0.9 0.3 0.1
+0.9 0.3 0.2
+0.9 0.3 0.3
+0.9 0.3 0.4
+0.9 0.3 0.5
+0.9 0.3 0.6
+0.9 0.3 0.7
+0.9 0.3 0.8
+0.9 0.3 0.9
+0.9 0.4 0
+0.9 0.4 0.1
+0.9 0.4 0.2
+0.9 0.4 0.3
+0.9 0.4 0.4
+0.9 0.4 0.5
+0.9 0.4 0.6
+0.9 0.4 0.7
+0.9 0.4 0.8
+0.9 0.4 0.9
+0.9 0.5 0
+0.9 0.5 0.1
+0.9 0.5 0.2
+0.9 0.5 0.3
+0.9 0.5 0.4
+0.9 0.5 0.5
+0.9 0.5 0.6
+0.9 0.5 0.7
+0.9 0.5 0.8
+0.9 0.5 0.9
+0.9 0.6 0
+0.9 0.6 0.1
+0.9 0.6 0.2
+0.9 0.6 0.3
+0.9 0.6 0.4
+0.9 0.6 0.5
+0.9 0.6 0.6
+0.9 0.6 0.7
+0.9 0.6 0.8
+0.9 0.6 0.9
+0.9 0.7 0
+0.9 0.7 0.1
+0.9 0.7 0.2
+0.9 0.7 0.3
+0.9 0.7 0.4
+0.9 0.7 0.5
+0.9 0.7 0.6
+0.9 0.7 0.7
+0.9 0.7 0.8
+0.9 0.7 0.9
+0.9 0.8 0
+0.9 0.8 0.1
+0.9 0.8 0.2
+0.9 0.8 0.3
+0.9 0.8 0.4
+0.9 0.8 0.5
+0.9 0.8 0.6
+0.9 0.8 0.7
+0.9 0.8 0.8
+0.9 0.8 0.9
+0.9 0.9 0
+0.9 0.9 0.1
+0.9 0.9 0.2
+0.9 0.9 0.3
+0.9 0.9 0.4
+0.9 0.9 0.5
+0.9 0.9 0.6
+0.9 0.9 0.7
+0.9 0.9 0.8
+0.9 0.9 0.9
diff --git a/data/points/iso_cuboid_3_in_0_1.txt b/data/points/iso_cuboid_3_in_0_1.txt
new file mode 100644
index 00000000..17f3c37b
--- /dev/null
+++ b/data/points/iso_cuboid_3_in_0_1.txt
@@ -0,0 +1 @@
+0.0 0.0 0.0 1.0 1.0 1.0
diff --git a/data/points/sphere3D_2646.off b/data/points/sphere3D_2646.off
index 8035a0a6..8035a0a6 100755..100644
--- a/data/points/sphere3D_2646.off
+++ b/data/points/sphere3D_2646.off
diff --git a/data/points/spiral_3d_10k.off b/data/points/spiral_3d_10k.off
new file mode 100644
index 00000000..2f15b289
--- /dev/null
+++ b/data/points/spiral_3d_10k.off
@@ -0,0 +1,10002 @@
+OFF
+10000 0 0
+5 0 0
+-5 6.12303e-16 1.96479e-15
+3.06152e-16 5 9.82396e-16
+-9.18455e-16 -5 -2.54745e-14
+3.36662 -3.55184 0.448383
+-3.55184 -3.36662 0.448383
+-3.36662 3.55184 0.448383
+3.55184 3.36662 0.448383
+1.19881 2.79144 -0.272952
+-2.79144 1.19881 -0.272952
+-1.19881 -2.79144 -0.272952
+2.79144 -1.19881 -0.272952
+3.05698 1.354 -0.754251
+-1.354 3.05698 -0.754251
+-3.05698 -1.354 -0.754251
+1.354 -3.05698 -0.754251
+3.96417 1.3489 0.982287
+-1.3489 3.96417 0.982287
+-3.96417 -1.3489 0.982287
+1.3489 -3.96417 0.982287
+2.12755 4.4934 -0.236499
+-4.4934 2.12755 -0.236499
+-2.12755 -4.4934 -0.236499
+4.4934 -2.12755 -0.236499
+-0.950922 -3.94994 0.998027
+3.94994 -0.950922 0.998027
+0.950922 3.94994 0.998027
+-3.94994 0.950922 0.998027
+2.43718 2.1189 0.637424
+-2.1189 2.43718 0.637424
+-2.43718 -2.1189 0.637424
+2.1189 -2.43718 0.637424
+2.65984 3.12062 -0.994951
+-3.12062 2.65984 -0.994951
+-2.65984 -3.12062 -0.994951
+3.12062 -2.65984 -0.994951
+4.46448 2.07962 -0.379779
+-2.07962 4.46448 -0.379779
+-4.46448 -2.07962 -0.379779
+2.07962 -4.46448 -0.379779
+-3.73853 0.0685981 -0.965382
+0.0685981 3.73853 -0.965382
+3.73853 -0.0685981 -0.965382
+-0.0685981 -3.73853 -0.965382
+3.05767 0.277408 0.368125
+-0.277408 3.05767 0.368125
+-3.05767 -0.277408 0.368125
+0.277408 -3.05767 0.368125
+2.30952 3.735 0.920232
+-3.735 2.30952 0.920232
+-2.30952 -3.735 0.920232
+3.735 -2.30952 0.920232
+1.32428 3.88063 -0.994951
+-3.88063 1.32428 -0.994951
+-1.32428 -3.88063 -0.994951
+3.88063 -1.32428 -0.994951
+-4.55328 -0.826551 -0.778462
+-0.826551 4.55328 -0.778462
+4.55328 0.826551 -0.778462
+0.826551 -4.55328 -0.778462
+2.19372 2.21533 -0.470704
+-2.21533 2.19372 -0.470704
+-2.19372 -2.21533 -0.470704
+2.21533 -2.19372 -0.470704
+3.71372 3.0316 -0.60793
+-3.0316 3.71372 -0.60793
+-3.71372 -3.0316 -0.60793
+3.0316 -3.71372 -0.60793
+4.41362 0.327834 0.904827
+-0.327834 4.41362 0.904827
+-4.41362 -0.327834 0.904827
+0.327834 -4.41362 0.904827
+1.21463 4.79567 0.320944
+-4.79567 1.21463 0.320944
+-1.21463 -4.79567 0.320944
+4.79567 -1.21463 0.320944
+4.80611 1.24753 0.260842
+-1.24753 4.80611 0.260842
+-4.80611 -1.24753 0.260842
+1.24753 -4.80611 0.260842
+1.54328 2.96592 0.754251
+-2.96592 1.54328 0.754251
+-1.54328 -2.96592 0.754251
+2.96592 -1.54328 0.754251
+3.68001 2.39619 0.920232
+-2.39619 3.68001 0.920232
+-3.68001 -2.39619 0.920232
+2.39619 -3.68001 0.920232
+0.623081 4.61471 -0.754251
+-4.61471 0.623081 -0.754251
+-0.623081 -4.61471 -0.754251
+4.61471 -0.623081 -0.754251
+2.99577 1.27054 0.666012
+-1.27054 2.99577 0.666012
+-2.99577 -1.27054 0.666012
+1.27054 -2.99577 0.666012
+2.93189 4.04395 0.100362
+-4.04395 2.93189 0.100362
+-2.93189 -4.04395 0.100362
+4.04395 -2.93189 0.100362
+3.24262 2.27713 -0.999289
+-2.27713 3.24262 -0.999289
+-3.24262 -2.27713 -0.999289
+2.27713 -3.24262 -0.999289
+3.94818 1.50211 -0.974527
+-1.50211 3.94818 -0.974527
+-3.94818 -1.50211 -0.974527
+1.50211 -3.94818 -0.974527
+0.277408 3.05767 -0.368125
+-3.05767 0.277408 -0.368125
+-0.277408 -3.05767 -0.368125
+3.05767 -0.277408 -0.368125
+0.691675 3.02817 0.448383
+-3.02817 0.691675 0.448383
+-0.691675 -3.02817 0.448383
+3.02817 -0.691675 0.448383
+4.19132 2.67395 0.236499
+-2.67395 4.19132 0.236499
+-4.19132 -2.67395 0.236499
+2.67395 -4.19132 0.236499
+1.774 3.07683 -0.893841
+-3.07683 1.774 -0.893841
+-1.774 -3.07683 -0.893841
+3.07683 -1.774 -0.893841
+2.64796 2.91375 0.998027
+-2.91375 2.64796 0.998027
+-2.64796 -2.91375 0.998027
+2.91375 -2.64796 0.998027
+2.19599 3.8942 -0.882291
+-3.8942 2.19599 -0.882291
+-2.19599 -3.8942 -0.882291
+3.8942 -2.19599 -0.882291
+0.154545 3.59377 0.915241
+-3.59377 0.154545 0.915241
+-0.154545 -3.59377 0.915241
+3.59377 -0.154545 0.915241
+2.58254 1.52907 -0.0502443
+-1.52907 2.58254 -0.0502443
+-2.58254 -1.52907 -0.0502443
+1.52907 -2.58254 -0.0502443
+3.17073 0.523864 -0.61786
+-0.523864 3.17073 -0.61786
+-3.17073 -0.523864 -0.61786
+0.523864 -3.17073 -0.61786
+0.544127 4.62469 0.754251
+-4.62469 0.544127 0.754251
+-0.544127 -4.62469 0.754251
+4.62469 -0.544127 0.754251
+1.65692 4.29973 0.79399
+-4.29973 1.65692 0.79399
+-1.65692 -4.29973 0.79399
+4.29973 -1.65692 0.79399
+3.08428 3.67998 -0.597905
+-3.67998 3.08428 -0.597905
+-3.08428 -3.67998 -0.597905
+3.67998 -3.08428 -0.597905
+1.85586 2.38266 0.19971
+-2.38266 1.85586 0.19971
+-1.85586 -2.38266 0.19971
+2.38266 -1.85586 0.19971
+3.49674 0.740193 0.904827
+-0.740193 3.49674 0.904827
+-3.49674 -0.740193 0.904827
+0.740193 -3.49674 0.904827
+0.916436 3.26593 -0.79399
+-3.26593 0.916436 -0.79399
+-0.916436 -3.26593 -0.79399
+3.26593 -0.916436 -0.79399
+3.85448 0.669222 -0.996134
+-0.669222 3.85448 -0.996134
+-3.85448 -0.669222 -0.996134
+0.669222 -3.85448 -0.996134
+4.29481 2.05802 0.647056
+-2.05802 4.29481 0.647056
+-4.29481 -2.05802 0.647056
+2.05802 -4.29481 0.647056
+1.50351 4.51888 -0.647056
+-4.51888 1.50351 -0.647056
+-1.50351 -4.51888 -0.647056
+4.51888 -1.50351 -0.647056
+2.33766 4.29942 0.448383
+-4.29942 2.33766 0.448383
+-2.33766 -4.29942 0.448383
+4.29942 -2.33766 0.448383
+2.88125 0.838258 -0.0376902
+-0.838258 2.88125 -0.0376902
+-2.88125 -0.838258 -0.0376902
+0.838258 -2.88125 -0.0376902
+3.06837 2.02992 0.947098
+-2.02992 3.06837 0.947098
+-3.06837 -2.02992 0.947098
+2.02992 -3.06837 0.947098
+2.9688 3.64707 0.711536
+-3.64707 2.9688 0.711536
+-2.9688 -3.64707 0.711536
+3.64707 -2.9688 0.711536
+1.62919 3.61188 0.999289
+-3.61188 1.62919 0.999289
+-1.62919 -3.61188 0.999289
+3.61188 -1.62919 0.999289
+3.87977 2.40984 -0.823533
+-2.40984 3.87977 -0.823533
+-3.87977 -2.40984 -0.823533
+2.40984 -3.87977 -0.823533
+-4.92785 -0.609325 -0.260842
+-0.609325 4.92785 -0.260842
+4.92785 0.609325 -0.260842
+0.609325 -4.92785 -0.260842
+4.33907 0.219929 -0.938734
+-0.219929 4.33907 -0.938734
+-4.33907 -0.219929 -0.938734
+0.219929 -4.33907 -0.938734
+4.58969 1.4601 -0.577573
+-1.4601 4.58969 -0.577573
+-4.58969 -1.4601 -0.577573
+1.4601 -4.58969 -0.577573
+4.94415 -0.633431 -0.175023
+0.633431 4.94415 -0.175023
+-4.94415 0.633431 -0.175023
+-0.633431 -4.94415 -0.175023
+4.82857 0.635282 0.492727
+-0.635282 4.82857 0.492727
+-4.82857 -0.635282 0.492727
+0.635282 -4.82857 0.492727
+2.09703 2.65355 0.786288
+-2.65355 2.09703 0.786288
+-2.09703 -2.65355 0.786288
+2.65355 -2.09703 0.786288
+2.63887 4.11464 -0.45958
+-4.11464 2.63887 -0.45958
+-2.63887 -4.11464 -0.45958
+4.11464 -2.63887 -0.45958
+2.76439 1.91444 -0.770513
+-1.91444 2.76439 -0.770513
+-2.76439 -1.91444 -0.770513
+1.91444 -2.76439 -0.770513
+0.0307723 4.80147 -0.597905
+-4.80147 0.0307723 -0.597905
+-0.0307723 -4.80147 -0.597905
+4.80147 -0.0307723 -0.597905
+1.81202 4.61557 0.285019
+-4.61557 1.81202 0.285019
+-1.81202 -4.61557 0.285019
+4.61557 -1.81202 0.285019
+4.6313 1.84309 0.175023
+-1.84309 4.6313 0.175023
+-4.6313 -1.84309 0.175023
+1.84309 -4.6313 0.175023
+3.42329 3.63901 -0.0878512
+-3.63901 3.42329 -0.0878512
+-3.42329 -3.63901 -0.0878512
+3.63901 -3.42329 -0.0878512
+1.01042 3.34719 0.863923
+-3.34719 1.01042 0.863923
+-1.01042 -3.34719 0.863923
+3.34719 -1.01042 0.863923
+3.22574 3.09545 0.882291
+-3.09545 3.22574 0.882291
+-3.22574 -3.09545 0.882291
+3.09545 -3.22574 0.882291
+2.48345 2.53899 -0.893841
+-2.53899 2.48345 -0.893841
+-2.48345 -2.53899 -0.893841
+2.53899 -2.48345 -0.893841
+3.85322 3.18521 -0.0376902
+-3.18521 3.85322 -0.0376902
+-3.85322 -3.18521 -0.0376902
+3.18521 -3.85322 -0.0376902
+0.573665 4.06003 -0.994951
+-4.06003 0.573665 -0.994951
+-0.573665 -4.06003 -0.994951
+4.06003 -0.573665 -0.994951
+4.81625 0.0296565 0.577573
+-0.0296565 4.81625 0.577573
+-4.81625 -0.0296565 0.577573
+0.0296565 -4.81625 0.577573
+4.47797 1.49303 0.693653
+-1.49303 4.47797 0.693653
+-4.47797 -1.49303 0.693653
+1.49303 -4.47797 0.693653
+4.1758 2.62875 -0.356412
+-2.62875 4.1758 -0.356412
+-4.1758 -2.62875 -0.356412
+2.62875 -4.1758 -0.356412
+1.75226 2.60859 -0.51444
+-2.60859 1.75226 -0.51444
+-1.75226 -2.60859 -0.51444
+2.60859 -1.75226 -0.51444
+3.2197 2.95196 -0.929776
+-2.95196 3.2197 -0.929776
+-3.2197 -2.95196 -0.929776
+2.95196 -3.2197 -0.929776
+0.205137 4.18235 0.982287
+-4.18235 0.205137 0.982287
+-0.205137 -4.18235 0.982287
+4.18235 -0.205137 0.982287
+1.10496 4.47349 0.79399
+-4.47349 1.10496 0.79399
+-1.10496 -4.47349 0.79399
+4.47349 -1.10496 0.79399
+1.21967 2.79436 0.309017
+-2.79436 1.21967 0.309017
+-1.21967 -2.79436 0.309017
+2.79436 -1.21967 0.309017
+2.25396 1.98412 0.0753268
+-1.98412 2.25396 0.0753268
+-2.25396 -1.98412 0.0753268
+1.98412 -2.25396 0.0753268
+4.44672 0.894677 0.844328
+-0.894677 4.44672 0.844328
+-4.44672 -0.894677 0.844328
+0.894677 -4.44672 0.844328
+3.55761 1.74452 0.999289
+-1.74452 3.55761 0.999289
+-3.55761 -1.74452 0.999289
+1.74452 -3.55761 0.999289
+1.24789 4.81247 -0.236499
+-4.81247 1.24789 -0.236499
+-1.24789 -4.81247 -0.236499
+4.81247 -1.24789 -0.236499
+3.87481 0.309364 0.993611
+-0.309364 3.87481 0.993611
+-3.87481 -0.309364 0.993611
+0.309364 -3.87481 0.993611
+3.84671 2.83488 0.627691
+-2.83488 3.84671 0.627691
+-3.84671 -2.83488 0.627691
+2.83488 -3.84671 0.627691
+3.47532 1.05482 -0.929776
+-1.05482 3.47532 -0.929776
+-3.47532 -1.05482 -0.929776
+1.05482 -3.47532 -0.929776
+2.99947 0.288478 -0.162637
+-0.288478 2.99947 -0.162637
+-2.99947 -0.288478 -0.162637
+0.288478 -2.99947 -0.162637
+3.33025 1.75311 -0.971632
+-1.75311 3.33025 -0.971632
+-3.33025 -1.75311 -0.971632
+1.75311 -3.33025 -0.971632
+1.75976 3.59211 -1
+-3.59211 1.75976 -1
+-1.75976 -3.59211 -1
+3.59211 -1.75976 -1
+1.95201 3.20343 0.968583
+-3.20343 1.95201 0.968583
+-1.95201 -3.20343 0.968583
+3.20343 -1.95201 0.968583
+4.1872 1.92363 -0.79399
+-1.92363 4.1872 -0.79399
+-4.1872 -1.92363 -0.79399
+1.92363 -4.1872 -0.79399
+3.07127 2.62111 0.999289
+-2.62111 3.07127 0.999289
+-3.07127 -2.62111 0.999289
+2.62111 -3.07127 0.999289
+0.602879 4.90609 0.33282
+-4.90609 0.602879 0.33282
+-0.602879 -4.90609 0.33282
+4.90609 -0.602879 0.33282
+0.287364 2.99579 0.13779
+-2.99579 0.287364 0.13779
+-0.287364 -2.99579 0.13779
+2.99579 -0.287364 0.13779
+2.22843 3.39711 -0.998027
+-3.39711 2.22843 -0.998027
+-2.22843 -3.39711 -0.998027
+3.39711 -2.22843 -0.998027
+3.97889 0.821382 0.998027
+-0.821382 3.97889 0.998027
+-3.97889 -0.821382 0.998027
+0.821382 -3.97889 0.998027
+3.35031 0.286987 0.770513
+-0.286987 3.35031 0.770513
+-3.35031 -0.286987 0.770513
+0.286987 -3.35031 0.770513
+2.67898 3.60662 -0.870184
+-3.60662 2.67898 -0.870184
+-2.67898 -3.60662 -0.870184
+3.60662 -2.67898 -0.870184
+0.520381 3.54766 -0.910106
+-3.54766 0.520381 -0.910106
+-0.520381 -3.54766 -0.910106
+3.54766 -0.520381 -0.910106
+2.67593 1.56624 0.437116
+-1.56624 2.67593 0.437116
+-2.67593 -1.56624 0.437116
+1.56624 -2.67593 0.437116
+0.07707 3.31456 -0.728969
+-3.31456 0.07707 -0.728969
+-0.07707 -3.31456 -0.728969
+3.31456 -0.07707 -0.728969
+2.80908 1.22777 -0.356412
+-1.22777 2.80908 -0.356412
+-2.80908 -1.22777 -0.356412
+1.22777 -2.80908 -0.356412
+4.82103 1.22621 -0.224271
+-1.22621 4.82103 -0.224271
+-4.82103 -1.22621 -0.224271
+1.22621 -4.82103 -0.224271
+2.98136 0.85156 0.437116
+-0.85156 2.98136 0.437116
+-2.98136 -0.85156 0.437116
+0.85156 -2.98136 0.437116
+2.05502 4.28717 -0.656586
+-4.28717 2.05502 -0.656586
+-2.05502 -4.28717 -0.656586
+4.28717 -2.05502 -0.656586
+3.5112 1.2135 0.958522
+-1.2135 3.5112 0.958522
+-3.5112 -1.2135 0.958522
+1.2135 -3.5112 0.958522
+0.120269 3.18872 0.587785
+-3.18872 0.120269 0.587785
+-0.120269 -3.18872 0.587785
+3.18872 -0.120269 0.587785
+0.837786 2.88097 0.0251301
+-2.88097 0.837786 0.0251301
+-0.837786 -2.88097 0.0251301
+2.88097 -0.837786 0.0251301
+1.15621 4.30709 -0.888136
+-4.30709 1.15621 -0.888136
+-1.15621 -4.30709 -0.888136
+4.30709 -1.15621 -0.888136
+2.21179 2.9251 -0.942991
+-2.9251 2.21179 -0.942991
+-2.21179 -2.9251 -0.942991
+2.9251 -2.21179 -0.942991
+3.73933 1.99132 -0.971632
+-1.99132 3.73933 -0.971632
+-3.73933 -1.99132 -0.971632
+1.99132 -3.73933 -0.971632
+0.620692 3.62632 0.947098
+-3.62632 0.620692 0.947098
+-0.620692 -3.62632 0.947098
+3.62632 -0.620692 0.947098
+4.16372 1.01236 -0.958522
+-1.01236 4.16372 -0.958522
+-4.16372 -1.01236 -0.958522
+1.01236 -4.16372 -0.958522
+3.52085 0.371697 -0.888136
+-0.371697 3.52085 -0.888136
+-3.52085 -0.371697 -0.888136
+0.371697 -3.52085 -0.888136
+1.27346 3.00369 -0.675333
+-3.00369 1.27346 -0.675333
+-1.27346 -3.00369 -0.675333
+3.00369 -1.27346 -0.675333
+2.53899 2.48345 0.893841
+-2.48345 2.53899 0.893841
+-2.53899 -2.48345 0.893841
+2.48345 -2.53899 0.893841
+1.6906 4.13873 -0.882291
+-4.13873 1.6906 -0.882291
+-1.6906 -4.13873 -0.882291
+4.13873 -1.6906 -0.882291
+1.52651 2.58341 -0.0376902
+-2.58341 1.52651 -0.0376902
+-1.52651 -2.58341 -0.0376902
+2.58341 -1.52651 -0.0376902
+2.71264 3.36335 0.947098
+-3.36335 2.71264 0.947098
+-2.71264 -3.36335 0.947098
+3.36335 -2.71264 0.947098
+3.96193 1.9206 0.915241
+-1.9206 3.96193 0.915241
+-3.96193 -1.9206 0.915241
+1.9206 -3.96193 0.915241
+2.77668 1.19454 0.212007
+-1.19454 2.77668 0.212007
+-2.77668 -1.19454 0.212007
+1.19454 -2.77668 0.212007
+2.9048 2.63916 -0.997159
+-2.63916 2.9048 -0.997159
+-2.9048 -2.63916 -0.997159
+2.63916 -2.9048 -0.997159
+1.4025 3.35015 -0.929776
+-3.35015 1.4025 -0.929776
+-1.4025 -3.35015 -0.929776
+3.35015 -1.4025 -0.929776
+0.853903 2.99241 -0.45958
+-2.99241 0.853903 -0.45958
+-0.853903 -2.99241 -0.45958
+2.99241 -0.853903 -0.45958
+2.55228 1.75099 -0.425779
+-1.75099 2.55228 -0.425779
+-2.55228 -1.75099 -0.425779
+1.75099 -2.55228 -0.425779
+4.38164 2.40596 -0.0502443
+-2.40596 4.38164 -0.0502443
+-4.38164 -2.40596 -0.0502443
+2.40596 -4.38164 -0.0502443
+3.60926 3.36465 -0.356412
+-3.36465 3.60926 -0.356412
+-3.60926 -3.36465 -0.356412
+3.36465 -3.60926 -0.356412
+3.18215 1.57731 0.893841
+-1.57731 3.18215 0.893841
+-3.18215 -1.57731 0.893841
+1.57731 -3.18215 0.893841
+3.14236 0.93912 -0.693653
+-0.93912 3.14236 -0.693653
+-3.14236 -0.93912 -0.693653
+0.93912 -3.14236 -0.693653
+1.59684 2.67092 0.45958
+-2.67092 1.59684 0.45958
+-1.59684 -2.67092 0.45958
+2.67092 -1.59684 0.45958
+0.935979 4.7665 -0.51444
+-4.7665 0.935979 -0.51444
+-0.935979 -4.7665 -0.51444
+4.7665 -0.935979 -0.51444
+2.40596 4.38164 0.0502443
+-4.38164 2.40596 0.0502443
+-2.40596 -4.38164 0.0502443
+4.38164 -2.40596 0.0502443
+2.76517 1.84587 0.737513
+-1.84587 2.76517 0.737513
+-2.76517 -1.84587 0.737513
+1.84587 -2.76517 0.737513
+0.324442 -4.95798 0.24869
+4.95798 0.324442 0.24869
+-0.324442 4.95798 0.24869
+-4.95798 -0.324442 0.24869
+1.4601 4.58969 0.577573
+-4.58969 1.4601 0.577573
+-1.4601 -4.58969 0.577573
+4.58969 -1.4601 0.577573
+1.00175 3.62773 -0.971632
+-3.62773 1.00175 -0.971632
+-1.00175 -3.62773 -0.971632
+3.62773 -1.00175 -0.971632
+0.326936 4.37919 -0.920232
+-4.37919 0.326936 -0.920232
+-0.326936 -4.37919 -0.920232
+4.37919 -0.326936 -0.920232
+0.547309 3.27931 0.737513
+-3.27931 0.547309 0.737513
+-0.547309 -3.27931 0.737513
+3.27931 -0.547309 0.737513
+2.50373 4.01179 0.684547
+-4.01179 2.50373 0.684547
+-2.50373 -4.01179 0.684547
+4.01179 -2.50373 0.684547
+1.1118 3.02361 0.627691
+-3.02361 1.1118 0.627691
+-1.1118 -3.02361 0.627691
+3.02361 -1.1118 0.627691
+3.12802 3.81028 0.368125
+-3.81028 3.12802 0.368125
+-3.12802 -3.81028 0.368125
+3.81028 -3.12802 0.368125
+3.19147 3.33754 -0.786288
+-3.33754 3.19147 -0.786288
+-3.19147 -3.33754 -0.786288
+3.33754 -3.19147 -0.786288
+0.767225 4.30022 0.929776
+-4.30022 0.767225 0.929776
+-0.767225 -4.30022 0.929776
+4.30022 -0.767225 0.929776
+2.0955 2.35055 0.525175
+-2.35055 2.0955 0.525175
+-2.0955 -2.35055 0.525175
+2.35055 -2.0955 0.525175
+0.486461 3.22602 -0.675333
+-3.22602 0.486461 -0.675333
+-0.486461 -3.22602 -0.675333
+3.22602 -0.486461 -0.675333
+1.2921 4.14806 0.938734
+-4.14806 1.2921 0.938734
+-1.2921 -4.14806 0.938734
+4.14806 -1.2921 0.938734
+1.54379 4.75537 0.0251301
+-4.75537 1.54379 0.0251301
+-1.54379 -4.75537 0.0251301
+4.75537 -1.54379 0.0251301
+4.20952 2.27783 -0.61786
+-2.27783 4.20952 -0.61786
+-4.20952 -2.27783 -0.61786
+2.27783 -4.20952 -0.61786
+4.91038 0.938625 0.0376902
+-0.938625 4.91038 0.0376902
+-4.91038 -0.938625 0.0376902
+0.938625 -4.91038 0.0376902
+1.84627 2.3901 -0.19971
+-2.3901 1.84627 -0.19971
+-1.84627 -2.3901 -0.19971
+2.3901 -1.84627 -0.19971
+0.875244 4.74346 0.567269
+-4.74346 0.875244 0.567269
+-0.875244 -4.74346 0.567269
+4.74346 -0.875244 0.567269
+1.80718 3.96389 0.934329
+-3.96389 1.80718 0.934329
+-1.80718 -3.96389 0.934329
+3.96389 -1.80718 0.934329
+0.932673 4.90935 0.0753268
+-4.90935 0.932673 0.0753268
+-0.932673 -4.90935 0.0753268
+4.90935 -0.932673 0.0753268
+4.31771 1.35448 -0.850994
+-1.35448 4.31771 -0.850994
+-4.31771 -1.35448 -0.850994
+1.35448 -4.31771 -0.850994
+2.33058 3.31254 0.998737
+-3.31254 2.33058 0.998737
+-2.33058 -3.31254 0.998737
+3.31254 -2.33058 0.998737
+2.84297 2.2601 -0.929776
+-2.2601 2.84297 -0.929776
+-2.84297 -2.2601 -0.929776
+2.2601 -2.84297 -0.929776
+4.79447 0.88964 -0.481754
+-0.88964 4.79447 -0.481754
+-4.79447 -0.88964 -0.481754
+0.88964 -4.79447 -0.481754
+4.75537 1.54379 -0.0251301
+-1.54379 4.75537 -0.0251301
+-4.75537 -1.54379 -0.0251301
+1.54379 -4.75537 -0.0251301
+2.00518 4.33739 0.627691
+-4.33739 2.00518 0.627691
+-2.00518 -4.33739 0.627691
+4.33739 -2.00518 0.627691
+0.328688 4.90924 -0.391374
+-4.90924 0.328688 -0.391374
+-0.328688 -4.90924 -0.391374
+4.90924 -0.328688 -0.391374
+3.53642 2.50341 -0.942991
+-2.50341 3.53642 -0.942991
+-3.53642 -2.50341 -0.942991
+2.50341 -3.53642 -0.942991
+3.20024 0.901042 0.737513
+-0.901042 3.20024 0.737513
+-3.20024 -0.901042 0.737513
+0.901042 -3.20024 0.737513
+4.2775 2.37754 0.448383
+-2.37754 4.2775 0.448383
+-4.2775 -2.37754 0.448383
+2.37754 -4.2775 0.448383
+1.82268 4.54175 -0.448383
+-4.54175 1.82268 -0.448383
+-1.82268 -4.54175 -0.448383
+4.54175 -1.82268 -0.448383
+3.11565 0.1132 -0.470704
+-0.1132 3.11565 -0.470704
+-3.11565 -0.1132 -0.470704
+0.1132 -3.11565 -0.470704
+2.02655 2.65923 -0.754251
+-2.65923 2.02655 -0.754251
+-2.02655 -2.65923 -0.754251
+2.65923 -2.02655 -0.754251
+2.46246 2.2064 -0.720309
+-2.2064 2.46246 -0.720309
+-2.46246 -2.2064 -0.720309
+2.2064 -2.46246 -0.720309
+2.64719 4.19691 0.272952
+-4.19691 2.64719 0.272952
+-2.64719 -4.19691 0.272952
+4.19691 -2.64719 0.272952
+4.89108 0.285512 -0.437116
+-0.285512 4.89108 -0.437116
+-4.89108 -0.285512 -0.437116
+0.285512 -4.89108 -0.437116
+1.46665 3.28451 0.915241
+-3.28451 1.46665 0.915241
+-1.46665 -3.28451 0.915241
+3.28451 -1.46665 0.915241
+4.02637 2.26119 0.786288
+-2.26119 4.02637 0.786288
+-4.02637 -2.26119 0.786288
+2.26119 -4.02637 0.786288
+0.0599509 4.11242 -0.993611
+-4.11242 0.0599509 -0.993611
+-0.0599509 -4.11242 -0.993611
+4.11242 -0.0599509 -0.993611
+2.92917 4.00936 -0.260842
+-4.00936 2.92917 -0.260842
+-2.92917 -4.00936 -0.260842
+4.00936 -2.92917 -0.260842
+2.53325 3.91845 -0.745941
+-3.91845 2.53325 -0.745941
+-2.53325 -3.91845 -0.745941
+3.91845 -2.53325 -0.745941
+3.37557 2.21551 0.999289
+-2.21551 3.37557 0.999289
+-3.37557 -2.21551 0.999289
+2.21551 -3.37557 0.999289
+2.954 0.871114 -0.391374
+-0.871114 2.954 -0.391374
+-2.954 -0.871114 -0.391374
+0.871114 -2.954 -0.391374
+2.82522 3.93518 0.535827
+-3.93518 2.82522 0.535827
+-2.82522 -3.93518 0.535827
+3.93518 -2.82522 0.535827
+2.43303 1.8726 0.368125
+-1.8726 2.43303 0.368125
+-2.43303 -1.8726 0.368125
+1.8726 -2.43303 0.368125
+4.03466 2.91898 -0.19971
+-2.91898 4.03466 -0.19971
+-4.03466 -2.91898 -0.19971
+2.91898 -4.03466 -0.19971
+3.5548 2.99308 0.762443
+-2.99308 3.5548 0.762443
+-3.5548 -2.99308 0.762443
+2.99308 -3.5548 0.762443
+3.81131 1.17199 -0.999921
+-1.17199 3.81131 -0.999921
+-3.81131 -1.17199 -0.999921
+1.17199 -3.81131 -0.999921
+4.64973 0.252667 -0.754251
+-0.252667 4.64973 -0.754251
+-4.64973 -0.252667 -0.754251
+0.252667 -4.64973 -0.754251
+2.68067 4.21468 -0.100362
+-4.21468 2.68067 -0.100362
+-2.68067 -4.21468 -0.100362
+4.21468 -2.68067 -0.100362
+4.23983 1.72569 0.816339
+-1.72569 4.23983 0.816339
+-4.23983 -1.72569 0.816339
+1.72569 -4.23983 0.816339
+2.17219 4.04096 0.809017
+-4.04096 2.17219 0.809017
+-2.17219 -4.04096 0.809017
+4.04096 -2.17219 0.809017
+4.63383 1.82389 -0.19971
+-1.82389 4.63383 -0.19971
+-4.63383 -1.82389 -0.19971
+1.82389 -4.63383 -0.19971
+4.74474 0.566716 -0.627691
+-0.566716 4.74474 -0.627691
+-4.74474 -0.566716 -0.627691
+0.566716 -4.74474 -0.627691
+3.80492 3.16789 0.309017
+-3.16789 3.80492 0.309017
+-3.80492 -3.16789 0.309017
+3.16789 -3.80492 0.309017
+3.63632 3.42248 0.112856
+-3.42248 3.63632 0.112856
+-3.63632 -3.42248 0.112856
+3.42248 -3.63632 0.112856
+4.51285 1.81437 0.503623
+-1.81437 4.51285 0.503623
+-4.51285 -1.81437 0.503623
+1.81437 -4.51285 0.503623
+2.2987 2.88779 0.951057
+-2.88779 2.2987 0.951057
+-2.2987 -2.88779 0.951057
+2.88779 -2.2987 0.951057
+0.429588 3.9137 0.998027
+-3.9137 0.429588 0.998027
+-0.429588 -3.9137 0.998027
+3.9137 -0.429588 0.998027
+4.69979 0.332466 0.70265
+-0.332466 4.69979 0.70265
+-4.69979 -0.332466 0.70265
+0.332466 -4.69979 0.70265
+4.47321 2.12212 0.309017
+-2.12212 4.47321 0.309017
+-4.47321 -2.12212 0.309017
+2.12212 -4.47321 0.309017
+3.26991 3.52624 0.587785
+-3.52624 3.26991 0.587785
+-3.26991 -3.52624 0.587785
+3.52624 -3.26991 0.587785
+2.6487 3.7208 0.823533
+-3.7208 2.6487 0.823533
+-2.6487 -3.7208 0.823533
+3.7208 -2.6487 0.823533
+-0.304986 -4.97735 0.162637
+4.97735 -0.304986 0.162637
+0.304986 4.97735 0.162637
+-4.97735 0.304986 0.162637
+0.237023 4.50821 0.857527
+-4.50821 0.237023 0.857527
+-0.237023 -4.50821 0.857527
+4.50821 -0.237023 0.857527
+1.84343 4.64234 -0.100362
+-4.64234 1.84343 -0.100362
+-1.84343 -4.64234 -0.100362
+4.64234 -1.84343 -0.100362
+4.65756 1.22648 0.577573
+-1.22648 4.65756 0.577573
+-4.65756 -1.22648 0.577573
+1.22648 -4.65756 0.577573
+4.67806 1.54017 0.379779
+-1.54017 4.67806 0.379779
+-4.67806 -1.54017 0.379779
+1.54017 -4.67806 0.379779
+3.81931 2.72823 -0.720309
+-2.72823 3.81931 -0.720309
+-3.81931 -2.72823 -0.720309
+2.72823 -3.81931 -0.720309
+2.11585 4.51555 0.162637
+-4.51555 2.11585 0.162637
+-2.11585 -4.51555 0.162637
+4.51555 -2.11585 0.162637
+3.39212 3.63048 0.24869
+-3.63048 3.39212 0.24869
+-3.39212 -3.63048 0.24869
+3.63048 -3.39212 0.24869
+1.11419 3.64618 0.982287
+-3.64618 1.11419 0.982287
+-1.11419 -3.64618 0.982287
+3.64618 -1.11419 0.982287
+3.53165 2.86306 -0.837528
+-2.86306 3.53165 -0.837528
+-3.53165 -2.86306 -0.837528
+2.86306 -3.53165 -0.837528
+4.22902 1.13924 0.925077
+-1.13924 4.22902 0.925077
+-4.22902 -1.13924 0.925077
+1.13924 -4.22902 0.925077
+2.39447 4.31945 -0.344643
+-4.31945 2.39447 -0.344643
+-2.39447 -4.31945 -0.344643
+4.31945 -2.39447 -0.344643
+3.64561 1.64606 -1
+-1.64606 3.64561 -1
+-3.64561 -1.64606 -1
+1.64606 -3.64561 -1
+1.54267 4.69162 -0.344643
+-4.69162 1.54267 -0.344643
+-1.54267 -4.69162 -0.344643
+4.69162 -1.54267 -0.344643
+4.11217 0.459742 -0.990461
+-0.459742 4.11217 -0.990461
+-4.11217 -0.459742 -0.990461
+0.459742 -4.11217 -0.990461
+4.2199 0.589224 0.965382
+-0.589224 4.2199 0.965382
+-4.2199 -0.589224 0.965382
+0.589224 -4.2199 0.965382
+4.59728 1.14412 -0.675333
+-1.14412 4.59728 -0.675333
+-4.59728 -1.14412 -0.675333
+1.14412 -4.59728 -0.675333
+0.0455983 4.5356 -0.844328
+-4.5356 0.0455983 -0.844328
+-0.0455983 -4.5356 -0.844328
+4.5356 -0.0455983 -0.844328
+3.85257 -3.18712 1.37291e-14
+3.18712 3.85257 -3.4289e-15
+-3.18712 -3.85257 -1.5675e-14
+-3.85257 3.18712 -1.66574e-14
+4.47375 0.517821 -0.863923
+-0.517821 4.47375 -0.863923
+-4.47375 -0.517821 -0.863923
+0.517821 -4.47375 -0.863923
+0.281719 4.86816 0.481754
+-4.86816 0.281719 0.481754
+-0.281719 -4.86816 0.481754
+4.86816 -0.281719 0.481754
+2.96991 0.466944 0.112856
+-0.466944 2.96991 0.112856
+-2.96991 -0.466944 0.112856
+0.466944 -2.96991 0.112856
+3.00366 0.0913713 0.100362
+-0.0913713 3.00366 0.100362
+-3.00366 -0.0913713 0.100362
+0.0913713 -3.00366 0.100362
+-4.98411 -0.307915 -0.112856
+-0.307915 4.98411 -0.112856
+4.98411 0.307915 -0.112856
+0.307915 -4.98411 -0.112856
+3.35589 3.53785 -0.481754
+-3.53785 3.35589 -0.481754
+-3.35589 -3.53785 -0.481754
+3.53785 -3.35589 -0.481754
+1.95383 3.67561 0.986686
+-3.67561 1.95383 0.986686
+-1.95383 -3.67561 0.986686
+3.67561 -1.95383 0.986686
+4.83421 0.941707 0.379779
+-0.941707 4.83421 0.379779
+-4.83421 -0.941707 0.379779
+0.941707 -4.83421 0.379779
+4.03502 2.93936 0.125333
+-2.93936 4.03502 0.125333
+-4.03502 -2.93936 0.125333
+2.93936 -4.03502 0.125333
+4.07546 2.61881 0.535827
+-2.61881 4.07546 0.535827
+-4.07546 -2.61881 0.535827
+2.61881 -4.07546 0.535827
+4.95024 0.632314 0.13779
+-0.632314 4.95024 0.13779
+-4.95024 -0.632314 0.13779
+0.632314 -4.95024 0.13779
+4.40988 1.70765 -0.684547
+-1.70765 4.40988 -0.684547
+-4.40988 -1.70765 -0.684547
+1.70765 -4.40988 -0.684547
+3.39393 2.53558 0.971632
+-2.53558 3.39393 0.971632
+-3.39393 -2.53558 0.971632
+2.53558 -3.39393 0.971632
+0.332518 4.72583 -0.675333
+-4.72583 0.332518 -0.675333
+-0.332518 -4.72583 -0.675333
+4.72583 -0.332518 -0.675333
+3.1622 0.480089 0.597905
+-0.480089 3.1622 0.597905
+-3.1622 -0.480089 0.597905
+0.480089 -3.1622 0.597905
+0.858691 4.21037 -0.954865
+-4.21037 0.858691 -0.954865
+-0.858691 -4.21037 -0.954865
+4.21037 -0.858691 -0.954865
+3.23505 2.59978 -0.988652
+-2.59978 3.23505 -0.988652
+-3.23505 -2.59978 -0.988652
+2.59978 -3.23505 -0.988652
+0.466803 2.97144 -0.125333
+-2.97144 0.466803 -0.125333
+-0.466803 -2.97144 -0.125333
+2.97144 -0.466803 -0.125333
+3.66313 2.07905 0.977268
+-2.07905 3.66313 0.977268
+-3.66313 -2.07905 0.977268
+2.07905 -3.66313 0.977268
+1.47775 3.89151 0.986686
+-3.89151 1.47775 0.986686
+-1.47775 -3.89151 0.986686
+3.89151 -1.47775 0.986686
+1.65186 2.84348 -0.70265
+-2.84348 1.65186 -0.70265
+-1.65186 -2.84348 -0.70265
+2.84348 -1.65186 -0.70265
+1.22648 4.65756 -0.577573
+-4.65756 1.22648 -0.577573
+-1.22648 -4.65756 -0.577573
+4.65756 -1.22648 -0.577573
+4.52369 2.12521 -0.0627905
+-2.12521 4.52369 -0.0627905
+-4.52369 -2.12521 -0.0627905
+2.12521 -4.52369 -0.0627905
+4.59557 0.621672 0.770513
+-0.621672 4.59557 0.770513
+-4.59557 -0.621672 0.770513
+0.621672 -4.59557 0.770513
+1.88826 3.88652 -0.947098
+-3.88652 1.88826 -0.947098
+-1.88826 -3.88652 -0.947098
+3.88652 -1.88826 -0.947098
+3.46563 3.2048 -0.693653
+-3.2048 3.46563 -0.693653
+-3.46563 -3.2048 -0.693653
+3.2048 -3.46563 -0.693653
+3.64257 2.70285 0.844328
+-2.70285 3.64257 0.844328
+-3.64257 -2.70285 0.844328
+2.70285 -3.64257 0.844328
+2.8215 1.45913 -0.567269
+-1.45913 2.8215 -0.567269
+-2.8215 -1.45913 -0.567269
+1.45913 -2.8215 -0.567269
+3.80492 -3.16789 -0.309017
+3.16789 3.80492 -0.309017
+-3.16789 -3.80492 -0.309017
+-3.80492 3.16789 -0.309017
+-4.95103 0.0155542 -0.309017
+0.0155542 4.95103 -0.309017
+4.95103 -0.0155542 -0.309017
+-0.0155542 -4.95103 -0.309017
+2.12848 2.13598 -0.175023
+-2.13598 2.12848 -0.175023
+-2.12848 -2.13598 -0.175023
+2.13598 -2.12848 -0.175023
+0.635645 4.84074 -0.470704
+-4.84074 0.635645 -0.470704
+-0.635645 -4.84074 -0.470704
+4.84074 -0.635645 -0.470704
+2.866 3.89714 -0.546394
+-3.89714 2.866 -0.546394
+-2.866 -3.89714 -0.546394
+3.89714 -2.866 -0.546394
+0.900655 4.48809 -0.816339
+-4.48809 0.900655 -0.816339
+-0.900655 -4.48809 -0.816339
+4.48809 -0.900655 -0.816339
+2.38097 1.85407 -0.187381
+-1.85407 2.38097 -0.187381
+-2.38097 -1.85407 -0.187381
+1.85407 -2.38097 -0.187381
+3.1089 3.3738 0.809017
+-3.3738 3.1089 0.809017
+-3.1089 -3.3738 0.809017
+3.3738 -3.1089 0.809017
+3.92045 0.181922 -0.997159
+-0.181922 3.92045 -0.997159
+-3.92045 -0.181922 -0.997159
+0.181922 -3.92045 -0.997159
+3.04625 1.84784 -0.899405
+-1.84784 3.04625 -0.899405
+-3.04625 -1.84784 -0.899405
+1.84784 -3.04625 -0.899405
+0.800838 3.8549 -0.998027
+-3.8549 0.800838 -0.998027
+-0.800838 -3.8549 -0.998027
+3.8549 -0.800838 -0.998027
+2.38442 3.65993 -0.929776
+-3.65993 2.38442 -0.929776
+-2.38442 -3.65993 -0.929776
+3.65993 -2.38442 -0.929776
+2.30567 4.11889 -0.693653
+-4.11889 2.30567 -0.693653
+-2.30567 -4.11889 -0.693653
+4.11889 -2.30567 -0.693653
+3.36279 0.786803 -0.837528
+-0.786803 3.36279 -0.837528
+-3.36279 -0.786803 -0.837528
+0.786803 -3.36279 -0.837528
+3.76039 1.03279 0.994951
+-1.03279 3.76039 0.994951
+-3.76039 -1.03279 0.994951
+1.03279 -3.76039 0.994951
+1.74858 4.49544 0.567269
+-4.49544 1.74858 0.567269
+-1.74858 -4.49544 0.567269
+4.49544 -1.74858 0.567269
+1.40652 2.79597 -0.492727
+-2.79597 1.40652 -0.492727
+-1.40652 -2.79597 -0.492727
+2.79597 -1.40652 -0.492727
+2.82737 2.42835 0.962028
+-2.42835 2.82737 0.962028
+-2.82737 -2.42835 0.962028
+2.42835 -2.82737 0.962028
+2.84555 3.35983 -0.915241
+-3.35983 2.84555 -0.915241
+-2.84555 -3.35983 -0.915241
+3.35983 -2.84555 -0.915241
+0.943184 4.88429 -0.224271
+-4.88429 0.943184 -0.224271
+-0.943184 -4.88429 -0.224271
+4.88429 -0.943184 -0.224271
+0.0149435 -4.95484 0.297042
+4.95484 0.0149435 0.297042
+-0.0149435 4.95484 0.297042
+-4.95484 -0.0149435 0.297042
+4.33619 2.36401 -0.344643
+-2.36401 4.33619 -0.344643
+-4.33619 -2.36401 -0.344643
+2.36401 -4.33619 -0.344643
+3.81931 3.13784 -0.33282
+-3.13784 3.81931 -0.33282
+-3.81931 -3.13784 -0.33282
+3.13784 -3.81931 -0.33282
+4.22166 2.67542 -0.0627905
+-2.67542 4.22166 -0.0627905
+-4.22166 -2.67542 -0.0627905
+2.67542 -4.22166 -0.0627905
+4.67972 0.926271 0.637424
+-0.926271 4.67972 0.637424
+-4.67972 -0.926271 0.637424
+0.926271 -4.67972 0.637424
+3.95937 2.84636 -0.481754
+-2.84636 3.95937 -0.481754
+-3.95937 -2.84636 -0.481754
+2.84636 -3.95937 -0.481754
+3.41609 3.25756 0.693653
+-3.25756 3.41609 0.693653
+-3.41609 -3.25756 0.693653
+3.25756 -3.41609 0.693653
+4.60774 0.04227 0.79399
+-0.04227 4.60774 0.79399
+-4.60774 -0.04227 0.79399
+0.04227 -4.60774 0.79399
+1.76851 4.36703 -0.70265
+-4.36703 1.76851 -0.70265
+-1.76851 -4.36703 -0.70265
+4.36703 -1.76851 -0.70265
+4.05819 2.53765 -0.61786
+-2.53765 4.05819 -0.61786
+-4.05819 -2.53765 -0.61786
+2.53765 -4.05819 -0.61786
+1.9067 3.33014 -0.986686
+-3.33014 1.9067 -0.986686
+-1.9067 -3.33014 -0.986686
+3.33014 -1.9067 -0.986686
+2.16269 2.14914 0.309017
+-2.14914 2.16269 0.309017
+-2.16269 -2.14914 0.309017
+2.14914 -2.16269 0.309017
+0.310876 3.91234 -0.997159
+-3.91234 0.310876 -0.997159
+-0.310876 -3.91234 -0.997159
+3.91234 -0.310876 -0.997159
+0.0903738 3.00818 -0.13779
+-3.00818 0.0903738 -0.13779
+-0.0903738 -3.00818 -0.13779
+3.00818 -0.0903738 -0.13779
+2.79383 2.12026 0.870184
+-2.12026 2.79383 0.870184
+-2.79383 -2.12026 0.870184
+2.12026 -2.79383 0.870184
+4.04978 0.0615828 0.998737
+-0.0615828 4.04978 0.998737
+-4.04978 -0.0615828 0.998737
+0.0615828 -4.04978 0.998737
+3.55765 1.33616 -0.979855
+-1.33616 3.55765 -0.979855
+-3.55765 -1.33616 -0.979855
+1.33616 -3.55765 -0.979855
+1.83366 2.65844 0.637424
+-2.65844 1.83366 0.637424
+-1.83366 -2.65844 0.637424
+2.65844 -1.83366 0.637424
+4.24737 1.43039 0.876307
+-1.43039 4.24737 0.876307
+-4.24737 -1.43039 0.876307
+1.43039 -4.24737 0.876307
+3.28451 1.46665 -0.915241
+-1.46665 3.28451 -0.915241
+-3.28451 -1.46665 -0.915241
+1.46665 -3.28451 -0.915241
+3.33222 2.82433 0.929776
+-2.82433 3.33222 0.929776
+-3.33222 -2.82433 0.929776
+2.82433 -3.33222 0.929776
+3.97823 2.13397 -0.857527
+-2.13397 3.97823 -0.857527
+-3.97823 -2.13397 -0.857527
+2.13397 -3.97823 -0.857527
+3.01256 2.90838 0.982287
+-2.90838 3.01256 0.982287
+-3.01256 -2.90838 0.982287
+2.90838 -3.01256 0.982287
+2.94904 3.05852 -0.968583
+-3.05852 2.94904 -0.968583
+-2.94904 -3.05852 -0.968583
+3.05852 -2.94904 -0.968583
+2.06781 3.6412 -0.982287
+-3.6412 2.06781 -0.982287
+-2.06781 -3.6412 -0.982287
+3.6412 -2.06781 -0.982287
+1.44494 4.29952 -0.844328
+-4.29952 1.44494 -0.844328
+-1.44494 -4.29952 -0.844328
+4.29952 -1.44494 -0.844328
+3.9019 2.52394 0.762443
+-2.52394 3.9019 0.762443
+-3.9019 -2.52394 0.762443
+2.52394 -3.9019 0.762443
+1.38367 4.39528 0.79399
+-4.39528 1.38367 0.79399
+-1.38367 -4.39528 0.79399
+4.39528 -1.38367 0.79399
+2.52177 3.37367 -0.977268
+-3.37367 2.52177 -0.977268
+-2.52177 -3.37367 -0.977268
+3.37367 -2.52177 -0.977268
+0.482522 4.25777 0.958522
+-4.25777 0.482522 0.958522
+-0.482522 -4.25777 0.958522
+4.25777 -0.482522 0.958522
+4.71352 1.51516 -0.309017
+1.51516 4.71352 0.309017
+-1.51516 4.71352 -0.309017
+-4.71352 1.51516 0.309017
+-4.71352 -1.51516 -0.309017
+-1.51516 -4.71352 0.309017
+1.51516 -4.71352 -0.309017
+4.71352 -1.51516 0.309017
+1.16903 4.67231 0.577573
+-4.67231 1.16903 0.577573
+-1.16903 -4.67231 0.577573
+4.67231 -1.16903 0.577573
+0.826551 4.55328 0.778462
+-4.55328 0.826551 0.778462
+-0.826551 -4.55328 0.778462
+4.55328 -0.826551 0.778462
+3.96389 1.80718 -0.934329
+-1.80718 3.96389 -0.934329
+-3.96389 -1.80718 -0.934329
+1.80718 -3.96389 -0.934329
+4.33249 0.0533575 0.942991
+-0.0533575 4.33249 0.942991
+-4.33249 -0.0533575 0.942991
+0.0533575 -4.33249 0.942991
+3.59633 0.297594 0.920232
+-0.297594 3.59633 0.920232
+-3.59633 -0.297594 0.920232
+0.297594 -3.59633 0.920232
+3.03059 0.491717 -0.368125
+-0.491717 3.03059 -0.368125
+-3.03059 -0.491717 -0.368125
+0.491717 -3.03059 -0.368125
+1.19226 2.75325 0.0251301
+-2.75325 1.19226 0.0251301
+-1.19226 -2.75325 0.0251301
+2.75325 -1.19226 0.0251301
+2.75497 1.19465 -0.0753268
+-1.19465 2.75497 -0.0753268
+-2.75497 -1.19465 -0.0753268
+1.19465 -2.75497 -0.0753268
+3.98617 1.63647 0.951057
+-1.63647 3.98617 0.951057
+-3.98617 -1.63647 0.951057
+1.63647 -3.98617 0.951057
+3.09559 2.33032 0.992115
+-2.33032 3.09559 0.992115
+-3.09559 -2.33032 0.992115
+2.33032 -3.09559 0.992115
+3.50435 2.15293 -0.993611
+-2.15293 3.50435 -0.993611
+-3.50435 -2.15293 -0.993611
+2.15293 -3.50435 -0.993611
+4.3116 0.769813 -0.925077
+-0.769813 4.3116 -0.925077
+-4.3116 -0.769813 -0.925077
+0.769813 -4.3116 -0.925077
+3.31916 1.90096 0.984564
+-1.90096 3.31916 0.984564
+-3.31916 -1.90096 0.984564
+1.90096 -3.31916 0.984564
+4.19446 1.6097 -0.870184
+-1.6097 4.19446 -0.870184
+-4.19446 -1.6097 -0.870184
+1.6097 -4.19446 -0.870184
+2.02191 2.90628 0.888136
+-2.90628 2.02191 0.888136
+-2.02191 -2.90628 0.888136
+2.90628 -2.02191 0.888136
+2.49502 1.68966 0.162637
+-1.68966 2.49502 0.162637
+-2.49502 -1.68966 0.162637
+1.68966 -2.49502 0.162637
+1.09732 4.04105 -0.982287
+-4.04105 1.09732 -0.982287
+-1.09732 -4.04105 -0.982287
+4.04105 -1.09732 -0.982287
+0.303925 3.07491 0.414376
+-3.07491 0.303925 0.414376
+-0.303925 -3.07491 0.414376
+3.07491 -0.303925 0.414376
+0.603313 4.37295 -0.910106
+-4.37295 0.603313 -0.910106
+-0.603313 -4.37295 -0.910106
+4.37295 -0.603313 -0.910106
+1.24145 4.8427 0.0376902
+-4.8427 1.24145 0.0376902
+-1.24145 -4.8427 0.0376902
+4.8427 -1.24145 0.0376902
+0.319188 4.9834 -0.112856
+-4.9834 0.319188 -0.112856
+-0.319188 -4.9834 -0.112856
+4.9834 -0.319188 -0.112856
+4.55342 1.77772 -0.45958
+-1.77772 4.55342 -0.45958
+-4.55342 -1.77772 -0.45958
+1.77772 -4.55342 -0.45958
+3.96889 2.90802 0.391374
+-2.90802 3.96889 0.391374
+-3.96889 -2.90802 0.391374
+2.90802 -3.96889 0.391374
+3.70379 3.10107 0.556876
+-3.10107 3.70379 0.556876
+-3.70379 -3.10107 0.556876
+3.10107 -3.70379 0.556876
+4.47186 1.19081 0.778462
+-1.19081 4.47186 0.778462
+-4.47186 -1.19081 0.778462
+1.19081 -4.47186 0.778462
+1.60355 3.89482 -0.977268
+-3.89482 1.60355 -0.977268
+-1.60355 -3.89482 -0.977268
+3.89482 -1.60355 -0.977268
+4.15033 0.319817 0.986686
+-0.319817 4.15033 0.986686
+-4.15033 -0.319817 0.986686
+0.319817 -4.15033 0.986686
+2.48924 2.90416 -0.984564
+-2.90416 2.48924 -0.984564
+-2.48924 -2.90416 -0.984564
+2.90416 -2.48924 -0.984564
+1.54379 2.62922 -0.309017
+-2.62922 1.54379 -0.309017
+-1.54379 -2.62922 -0.309017
+2.62922 -1.54379 -0.309017
+3.72468 0.539177 0.971632
+-0.539177 3.72468 0.971632
+-3.72468 -0.539177 0.971632
+0.539177 -3.72468 0.971632
+2.11399 2.43091 -0.627691
+-2.43091 2.11399 -0.627691
+-2.11399 -2.43091 -0.627691
+2.43091 -2.11399 -0.627691
+2.93529 3.20312 0.938734
+-3.20312 2.93529 0.938734
+-2.93529 -3.20312 0.938734
+3.20312 -2.93529 0.938734
+1.03572 4.24356 0.929776
+-4.24356 1.03572 0.929776
+-1.03572 -4.24356 0.929776
+4.24356 -1.03572 0.929776
+2.50903 1.97158 -0.587785
+-1.97158 2.50903 -0.587785
+-2.50903 -1.97158 -0.587785
+1.97158 -2.50903 -0.587785
+2.36596 3.14704 -0.998027
+-3.14704 2.36596 -0.998027
+-2.36596 -3.14704 -0.998027
+3.14704 -2.36596 -0.998027
+3.67339 0.87312 -0.974527
+-0.87312 3.67339 -0.974527
+-3.67339 -0.87312 -0.974527
+0.87312 -3.67339 -0.974527
+3.75069 0.0683497 0.968583
+-0.0683497 3.75069 0.968583
+-3.75069 -0.0683497 0.968583
+0.0683497 -3.75069 0.968583
+3.27101 1.14062 0.844328
+-1.14062 3.27101 0.844328
+-3.27101 -1.14062 0.844328
+1.14062 -3.27101 0.844328
+2.4961 3.52704 0.947098
+-3.52704 2.4961 0.947098
+-2.4961 -3.52704 0.947098
+3.52704 -2.4961 0.947098
+3.77817 0.409427 -0.979855
+-0.409427 3.77817 -0.979855
+-3.77817 -0.409427 -0.979855
+0.409427 -3.77817 -0.979855
+4.08057 1.26771 -0.962028
+-1.26771 4.08057 -0.962028
+-4.08057 -1.26771 -0.962028
+1.26771 -4.08057 -0.962028
+1.52039 3.05477 -0.809017
+-3.05477 1.52039 -0.809017
+-1.52039 -3.05477 -0.809017
+3.05477 -1.52039 -0.809017
+2.96927 1.08843 -0.546394
+-1.08843 2.96927 -0.546394
+-2.96927 -1.08843 -0.546394
+1.08843 -2.96927 -0.546394
+3.5545 1.47861 0.988652
+-1.47861 3.5545 0.988652
+-3.5545 -1.47861 0.988652
+1.47861 -3.5545 0.988652
+3.25725 1.21027 -0.850994
+-1.21027 3.25725 -0.850994
+-3.25725 -1.21027 -0.850994
+1.21027 -3.25725 -0.850994
+1.49595 3.60129 -0.994951
+-3.60129 1.49595 -0.994951
+-1.49595 -3.60129 -0.994951
+3.60129 -1.49595 -0.994951
+0.35913 3.43488 0.837528
+-3.43488 0.35913 0.837528
+-0.35913 -3.43488 0.837528
+3.43488 -0.35913 0.837528
+4.88851 0.921078 -0.224271
+-0.921078 4.88851 -0.224271
+-4.88851 -0.921078 -0.224271
+0.921078 -4.88851 -0.224271
+0.909745 4.85855 0.33282
+-4.85855 0.909745 0.33282
+-0.909745 -4.85855 0.33282
+4.85855 -0.909745 0.33282
+4.85893 0.33084 0.492727
+-0.33084 4.85893 0.492727
+-4.85893 -0.33084 0.492727
+0.33084 -4.85893 0.492727
+4.35098 2.01279 -0.60793
+-2.01279 4.35098 -0.60793
+-4.35098 -2.01279 -0.60793
+2.01279 -4.35098 -0.60793
+0.26027 4.71313 0.693653
+-4.71313 0.26027 0.693653
+-0.26027 -4.71313 0.693653
+4.71313 -0.26027 0.693653
+4.40444 1.08379 -0.844328
+-1.08379 4.40444 -0.844328
+-4.40444 -1.08379 -0.844328
+1.08379 -4.40444 -0.844328
+1.91417 4.16938 0.809017
+-4.16938 1.91417 0.809017
+-1.91417 -4.16938 0.809017
+4.16938 -1.91417 0.809017
+1.98054 4.10397 -0.830596
+-4.10397 1.98054 -0.830596
+-1.98054 -4.10397 -0.830596
+4.10397 -1.98054 -0.830596
+0.290413 3.43085 -0.830596
+-3.43085 0.290413 -0.830596
+-0.290413 -3.43085 -0.830596
+3.43085 -0.290413 -0.830596
+1.98427 2.25014 0.012566
+-2.25014 1.98427 0.012566
+-1.98427 -2.25014 0.012566
+2.25014 -1.98427 0.012566
+0.17555 3.84577 0.988652
+-3.84577 0.17555 0.988652
+-0.17555 -3.84577 0.988652
+3.84577 -0.17555 0.988652
+3.60312 0.615788 -0.938734
+-0.615788 3.60312 -0.938734
+-3.60312 -0.615788 -0.938734
+0.615788 -3.60312 -0.938734
+2.1599 3.51471 0.992115
+-3.51471 2.1599 0.992115
+-2.1599 -3.51471 0.992115
+3.51471 -2.1599 0.992115
+1.80252 3.41578 0.990461
+-3.41578 1.80252 0.990461
+-1.80252 -3.41578 0.990461
+3.41578 -1.80252 0.990461
+0.690374 3.95273 0.999921
+-3.95273 0.690374 0.999921
+-0.690374 -3.95273 0.999921
+3.95273 -0.690374 0.999921
+0.546895 3.79819 -0.986686
+-3.79819 0.546895 -0.986686
+-0.546895 -3.79819 -0.986686
+3.79819 -0.546895 -0.986686
+3.47404 0.0737899 0.850994
+-0.0737899 3.47404 0.850994
+-3.47404 -0.0737899 0.850994
+0.0737899 -3.47404 0.850994
+2.75134 2.67497 0.986686
+-2.67497 2.75134 0.986686
+-2.75134 -2.67497 0.986686
+2.67497 -2.75134 0.986686
+2.77527 2.86313 -0.999921
+-2.86313 2.77527 -0.999921
+-2.77527 -2.86313 -0.999921
+2.86313 -2.77527 -0.999921
+1.20543 3.90608 0.996134
+-3.90608 1.20543 0.996134
+-1.20543 -3.90608 0.996134
+3.90608 -1.20543 0.996134
+3.3072 0.34032 -0.737513
+-0.34032 3.3072 -0.737513
+-3.3072 -0.34032 -0.737513
+0.34032 -3.3072 -0.737513
+3.2855 2.00655 -0.988652
+-2.00655 3.2855 -0.988652
+-3.2855 -2.00655 -0.988652
+2.00655 -3.2855 -0.988652
+3.06147 1.59837 -0.837528
+-1.59837 3.06147 -0.837528
+-3.06147 -1.59837 -0.837528
+1.59837 -3.06147 -0.837528
+1.37476 3.64928 0.994951
+-3.64928 1.37476 0.994951
+-1.37476 -3.64928 0.994951
+3.64928 -1.37476 0.994951
+2.97147 1.71873 0.823533
+-1.71873 2.97147 0.823533
+-2.97147 -1.71873 0.823533
+1.71873 -2.97147 0.823533
+0.856983 2.91825 0.285019
+-2.91825 0.856983 0.285019
+-0.856983 -2.91825 0.285019
+2.91825 -0.856983 0.285019
+2.54222 3.16913 0.998027
+-3.16913 2.54222 0.998027
+-2.54222 -3.16913 0.998027
+3.16913 -2.54222 0.998027
+0.65531 2.97379 -0.297042
+-2.97379 0.65531 -0.297042
+-0.65531 -2.97379 -0.297042
+2.97379 -0.65531 -0.297042
+1.65386 3.35351 -0.965382
+-3.35351 1.65386 -0.965382
+-1.65386 -3.35351 -0.965382
+3.35351 -1.65386 -0.965382
+1.15634 3.32279 -0.876307
+-3.32279 1.15634 -0.876307
+-1.15634 -3.32279 -0.876307
+3.32279 -1.15634 -0.876307
+2.07375 3.14062 -0.971632
+-3.14062 2.07375 -0.971632
+-2.07375 -3.14062 -0.971632
+3.14062 -2.07375 -0.971632
+2.37725 2.33755 0.745941
+-2.33755 2.37725 0.745941
+-2.37725 -2.33755 0.745941
+2.33755 -2.37725 0.745941
+1.90732 2.86657 -0.830596
+-2.86657 1.90732 -0.830596
+-1.90732 -2.86657 -0.830596
+2.86657 -1.90732 -0.830596
+0.622572 4.95823 0.0753268
+-4.95823 0.622572 0.0753268
+-0.622572 -4.95823 0.0753268
+4.95823 -0.622572 0.0753268
+4.35905 2.40783 0.19971
+-2.40783 4.35905 0.19971
+-4.35905 -2.40783 0.19971
+2.40783 -4.35905 0.19971
+2.07435 4.45608 0.402906
+-4.45608 2.07435 0.402906
+-2.07435 -4.45608 0.402906
+4.45608 -2.07435 0.402906
+4.74032 1.19301 -0.45958
+-1.19301 4.74032 -0.45958
+-4.74032 -1.19301 -0.45958
+1.19301 -4.74032 -0.45958
+0.577118 4.796 0.556876
+-4.796 0.577118 0.556876
+-0.577118 -4.796 0.556876
+4.796 -0.577118 0.556876
+2.9815 3.53924 -0.778462
+-3.53924 2.9815 -0.778462
+-2.9815 -3.53924 -0.778462
+3.53924 -2.9815 -0.778462
+3.92577 0.94406 -0.999289
+-0.94406 3.92577 -0.999289
+-3.92577 -0.94406 -0.999289
+0.94406 -3.92577 -0.999289
+4.22221 0.860554 0.951057
+-0.860554 4.22221 0.951057
+-4.22221 -0.860554 0.951057
+0.860554 -4.22221 0.951057
+3.97261 0.564876 0.999921
+-0.564876 3.97261 0.999921
+-3.97261 -0.564876 0.999921
+0.564876 -3.97261 0.999921
+3.02695 2.41881 -0.992115
+-2.41881 3.02695 -0.992115
+-3.02695 -2.41881 -0.992115
+2.41881 -3.02695 -0.992115
+2.8618 1.22222 0.45958
+-1.22222 2.8618 0.45958
+-2.8618 -1.22222 0.45958
+1.22222 -2.8618 0.45958
+1.54598 2.60066 0.224271
+-2.60066 1.54598 0.224271
+-1.54598 -2.60066 0.224271
+2.60066 -1.54598 0.224271
+1.78166 2.94632 0.830596
+-2.94632 1.78166 0.830596
+-1.78166 -2.94632 0.830596
+2.94632 -1.78166 0.830596
+3.4402 0.141877 -0.830596
+-0.141877 3.4402 -0.830596
+-3.4402 -0.141877 -0.830596
+0.141877 -3.4402 -0.830596
+2.97013 0.654896 0.285019
+-0.654896 2.97013 0.285019
+-2.97013 -0.654896 0.285019
+0.654896 -2.97013 0.285019
+2.79577 1.68152 -0.675333
+-1.68152 2.79577 -0.675333
+-2.79577 -1.68152 -0.675333
+1.68152 -2.79577 -0.675333
+0.866556 3.64985 0.968583
+-3.64985 0.866556 0.968583
+-0.866556 -3.64985 0.968583
+3.64985 -0.866556 0.968583
+2.94852 0.665689 -0.212007
+-0.665689 2.94852 -0.212007
+-2.94852 -0.665689 -0.212007
+0.665689 -2.94852 -0.212007
+1.24892 3.62844 -0.986686
+-3.62844 1.24892 -0.986686
+-1.24892 -3.62844 -0.986686
+3.62844 -1.24892 -0.986686
+0.727081 3.41994 -0.863923
+-3.41994 0.727081 -0.863923
+-0.727081 -3.41994 -0.863923
+3.41994 -0.727081 -0.863923
+0.300126 3.65488 -0.942991
+-3.65488 0.300126 -0.942991
+-0.300126 -3.65488 -0.942991
+3.65488 -0.300126 -0.942991
+2.28622 2.02941 -0.33282
+-2.02941 2.28622 -0.33282
+-2.28622 -2.02941 -0.33282
+2.02941 -2.28622 -0.33282
+0.135181 3.35986 0.770513
+-3.35986 0.135181 0.770513
+-0.135181 -3.35986 0.770513
+3.35986 -0.135181 0.770513
+3.4374 0.508621 0.850994
+-0.508621 3.4374 0.850994
+-3.4374 -0.508621 0.850994
+0.508621 -3.4374 0.850994
+2.17893 3.11359 0.979855
+-3.11359 2.17893 0.979855
+-2.17893 -3.11359 0.979855
+3.11359 -2.17893 0.979855
+3.04557 2.12734 -0.958522
+-2.12734 3.04557 -0.958522
+-3.04557 -2.12734 -0.958522
+2.12734 -3.04557 -0.958522
+2.25808 2.61313 -0.837528
+-2.61313 2.25808 -0.837528
+-2.25808 -2.61313 -0.837528
+2.61313 -2.25808 -0.837528
+2.5887 2.23867 0.816339
+-2.23867 2.5887 0.816339
+-2.5887 -2.23867 0.816339
+2.23867 -2.5887 0.816339
+0.775703 3.32287 0.809017
+-3.32287 0.775703 0.809017
+-0.775703 -3.32287 0.809017
+3.32287 -0.775703 0.809017
+3.66367 0.160318 -0.942991
+-0.160318 3.66367 -0.942991
+-3.66367 -0.160318 -0.942991
+0.160318 -3.66367 -0.942991
+0.67535 3.11121 -0.577573
+-3.11121 0.67535 -0.577573
+-0.67535 -3.11121 -0.577573
+3.11121 -0.67535 -0.577573
+3.73194 0.780187 0.982287
+-0.780187 3.73194 0.982287
+-3.73194 -0.780187 0.982287
+0.780187 -3.73194 0.982287
+1.18213 3.19011 0.801567
+-3.19011 1.18213 0.801567
+-1.18213 -3.19011 0.801567
+3.19011 -1.18213 0.801567
+2.61639 1.558 -0.297042
+-1.558 2.61639 -0.297042
+-2.61639 -1.558 -0.297042
+1.558 -2.61639 -0.297042
+2.31691 2.57535 0.844328
+-2.57535 2.31691 0.844328
+-2.31691 -2.57535 0.844328
+2.57535 -2.31691 0.844328
+0.104321 3.03969 0.285019
+-3.03969 0.104321 0.285019
+-0.104321 -3.03969 0.285019
+3.03969 -0.104321 0.285019
+4.8423 1.24459 0.0251301
+-1.24459 4.8423 0.0251301
+-4.8423 -1.24459 0.0251301
+1.24459 -4.8423 0.0251301
+3.64339 3.41276 -0.125333
+-3.41276 3.64339 -0.125333
+-3.64339 -3.41276 -0.125333
+3.41276 -3.64339 -0.125333
+2.10236 4.41293 -0.45958
+-4.41293 2.10236 -0.45958
+-2.10236 -4.41293 -0.45958
+4.41293 -2.10236 -0.45958
+2.58835 4.12542 0.492727
+-4.12542 2.58835 0.492727
+-2.58835 -4.12542 0.492727
+4.12542 -2.58835 0.492727
+2.2649 4.1894 0.647056
+-4.1894 2.2649 0.647056
+-2.2649 -4.1894 0.647056
+4.1894 -2.2649 0.647056
+1.57338 4.11218 0.915241
+-4.11218 1.57338 0.915241
+-1.57338 -4.11218 0.915241
+4.11218 -1.57338 0.915241
+1.19654 4.50023 -0.754251
+-4.50023 1.19654 -0.754251
+-1.19654 -4.50023 -0.754251
+4.50023 -1.19654 -0.754251
+2.78437 3.76726 -0.728969
+-3.76726 2.78437 -0.728969
+-2.78437 -3.76726 -0.728969
+3.76726 -2.78437 -0.728969
+3.70613 2.28974 -0.934329
+-2.28974 3.70613 -0.934329
+-3.70613 -2.28974 -0.934329
+2.28974 -3.70613 -0.934329
+2.84428 1.03128 -0.224271
+-1.03128 2.84428 -0.224271
+-2.84428 -1.03128 -0.224271
+1.03128 -2.84428 -0.224271
+4.00478 1.08909 0.988652
+-1.08909 4.00478 0.988652
+-4.00478 -1.08909 0.988652
+1.08909 -4.00478 0.988652
+4.08735 0.719709 -0.988652
+-0.719709 4.08735 -0.988652
+-4.08735 -0.719709 -0.988652
+0.719709 -4.08735 -0.988652
+0.319817 4.15033 -0.986686
+-4.15033 0.319817 -0.986686
+-0.319817 -4.15033 -0.986686
+4.15033 -0.319817 -0.986686
+3.53506 1.87172 -1
+-1.87172 3.53506 -1
+-3.53506 -1.87172 -1
+1.87172 -3.53506 -1
+3.73616 1.28127 0.998737
+-1.28127 3.73616 0.998737
+-3.73616 -1.28127 0.998737
+1.28127 -3.73616 0.998737
+2.73776 2.47549 -0.951057
+-2.47549 2.73776 -0.951057
+-2.73776 -2.47549 -0.951057
+2.47549 -2.73776 -0.951057
+3.33923 1.39842 0.925077
+-1.39842 3.33923 0.925077
+-3.33923 -1.39842 0.925077
+1.39842 -3.33923 0.925077
+2.79105 1.62469 0.637424
+-1.62469 2.79105 0.637424
+-2.79105 -1.62469 0.637424
+1.62469 -2.79105 0.637424
+0.483537 2.99924 0.272952
+-2.99924 0.483537 0.272952
+-0.483537 -2.99924 0.272952
+2.99924 -0.483537 0.272952
+1.01533 2.83134 -0.125333
+-2.83134 1.01533 -0.125333
+-1.01533 -2.83134 -0.125333
+2.83134 -1.01533 -0.125333
+0.728468 3.15454 0.647056
+-3.15454 0.728468 0.647056
+-0.728468 -3.15454 0.647056
+3.15454 -0.728468 0.647056
+1.28461 3.43482 0.942991
+-3.43482 1.28461 0.942991
+-1.28461 -3.43482 0.942991
+3.43482 -1.28461 0.942991
+1.46279 2.82771 0.577573
+-2.82771 1.46279 0.577573
+-1.46279 -2.82771 0.577573
+2.82771 -1.46279 0.577573
+3.52239 0.97695 0.938734
+-0.97695 3.52239 0.938734
+-3.52239 -0.97695 0.938734
+0.97695 -3.52239 0.938734
+2.99187 1.49237 0.754251
+-1.49237 2.99187 0.754251
+-2.99187 -1.49237 0.754251
+1.49237 -2.99187 0.754251
+3.2701 0.0780921 0.684547
+-0.0780921 3.2701 0.684547
+-3.2701 -0.0780921 0.684547
+0.0780921 -3.2701 0.684547
+3.12261 0.0824228 0.481754
+-0.0824228 3.12261 0.481754
+-3.12261 -0.0824228 0.481754
+0.0824228 -3.12261 0.481754
+1.05996 3.00203 -0.577573
+-3.00203 1.05996 -0.577573
+-1.05996 -3.00203 -0.577573
+3.00203 -1.05996 -0.577573
+0.280087 3.17132 -0.577573
+-3.17132 0.280087 -0.577573
+-0.280087 -3.17132 -0.577573
+3.17132 -0.280087 -0.577573
+2.01636 2.3034 -0.344643
+-2.3034 2.01636 -0.344643
+-2.01636 -2.3034 -0.344643
+2.3034 -2.01636 -0.344643
+2.99511 1.05794 0.567269
+-1.05794 2.99511 0.567269
+-2.99511 -1.05794 0.567269
+1.05794 -2.99511 0.567269
+2.48387 2.74633 0.954865
+-2.74633 2.48387 0.954865
+-2.48387 -2.74633 0.954865
+2.74633 -2.48387 0.954865
+0.0729439 3.51749 -0.876307
+-3.51749 0.0729439 -0.876307
+-0.0729439 -3.51749 -0.876307
+3.51749 -0.0729439 -0.876307
+3.06304 0.702071 -0.51444
+-0.702071 3.06304 -0.51444
+-3.06304 -0.702071 -0.51444
+0.702071 -3.06304 -0.51444
+0.395239 3.6818 0.954865
+-3.6818 0.395239 0.954865
+-0.395239 -3.6818 0.954865
+3.6818 -0.395239 0.954865
+0.947947 3.16754 0.720309
+-3.16754 0.947947 0.720309
+-0.947947 -3.16754 0.720309
+3.16754 -0.947947 0.720309
+1.68735 3.21611 0.929776
+-3.21611 1.68735 0.929776
+-1.68735 -3.21611 0.929776
+3.21611 -1.68735 0.929776
+0.514284 3.1274 0.556876
+-3.1274 0.514284 0.556876
+-0.514284 -3.1274 0.556876
+3.1274 -0.514284 0.556876
+2.67766 1.36137 0.0878512
+-1.36137 2.67766 0.0878512
+-2.67766 -1.36137 0.0878512
+1.36137 -2.67766 0.0878512
+3.3453 0.561348 -0.79399
+-0.561348 3.3453 -0.79399
+-3.3453 -0.561348 -0.79399
+0.561348 -3.3453 -0.79399
+2.62585 1.76242 0.546394
+-1.76242 2.62585 0.546394
+-2.62585 -1.76242 0.546394
+1.76242 -2.62585 0.546394
+1.90779 2.4373 0.425779
+-2.4373 1.90779 0.425779
+-1.90779 -2.4373 0.425779
+2.4373 -1.90779 0.425779
+0.329838 3.2373 0.666012
+-3.2373 0.329838 0.666012
+-0.329838 -3.2373 0.666012
+3.2373 -0.329838 0.666012
+2.68409 2.12336 -0.816339
+-2.12336 2.68409 -0.816339
+-2.68409 -2.12336 -0.816339
+2.12336 -2.68409 -0.816339
+1.06125 2.90755 0.425779
+-2.90755 1.06125 0.425779
+-1.06125 -2.90755 0.425779
+2.90755 -1.06125 0.425779
+2.87978 1.02576 0.33282
+-1.02576 2.87978 0.33282
+-2.87978 -1.02576 0.33282
+1.02576 -2.87978 0.33282
+2.89474 4.01177 0.320944
+-4.01177 2.89474 0.320944
+-2.89474 -4.01177 0.320944
+4.01177 -2.89474 0.320944
+2.07044 3.87265 0.920232
+-3.87265 2.07044 0.920232
+-2.07044 -3.87265 0.920232
+3.87265 -2.07044 0.920232
+2.84882 3.51589 0.850994
+-3.51589 2.84882 0.850994
+-2.84882 -3.51589 0.850994
+3.51589 -2.84882 0.850994
+4.14192 1.99629 0.801567
+-1.99629 4.14192 0.801567
+-4.14192 -1.99629 0.801567
+1.99629 -4.14192 0.801567
+1.38956 4.10396 -0.942991
+-4.10396 1.38956 -0.942991
+-1.38956 -4.10396 -0.942991
+4.10396 -1.38956 -0.942991
+3.85398 2.17586 0.904827
+-2.17586 3.85398 0.904827
+-3.85398 -2.17586 0.904827
+2.17586 -3.85398 0.904827
+0.0533575 4.33249 -0.942991
+-4.33249 0.0533575 -0.942991
+-0.0533575 -4.33249 -0.942991
+4.33249 -0.0533575 -0.942991
+3.77806 1.56103 0.996134
+-1.56103 3.77806 0.996134
+-3.77806 -1.56103 0.996134
+1.56103 -3.77806 0.996134
+3.06542 2.79778 -0.988652
+-2.79778 3.06542 -0.988652
+-3.06542 -2.79778 -0.988652
+2.79778 -3.06542 -0.988652
+3.76385 1.8351 0.982287
+-1.8351 3.76385 0.982287
+-3.76385 -1.8351 0.982287
+1.8351 -3.76385 0.982287
+0.763862 3.6356 -0.958522
+-3.6356 0.763862 -0.958522
+-0.763862 -3.6356 -0.958522
+3.6356 -0.763862 -0.958522
+2.62551 2.69641 -0.971632
+-2.69641 2.62551 -0.971632
+-2.62551 -2.69641 -0.971632
+2.69641 -2.62551 -0.971632
+3.30723 0.707897 0.786288
+-0.707897 3.30723 0.786288
+-3.30723 -0.707897 0.786288
+0.707897 -3.30723 0.786288
+2.59067 2.33186 -0.857527
+-2.33186 2.59067 -0.857527
+-2.59067 -2.33186 -0.857527
+2.33186 -2.59067 -0.857527
+1.1029 3.14628 -0.745941
+-3.14628 1.1029 -0.745941
+-1.1029 -3.14628 -0.745941
+3.14628 -1.1029 -0.745941
+0.899842 3.03175 0.546394
+-3.03175 0.899842 0.546394
+-0.899842 -3.03175 0.546394
+3.03175 -0.899842 0.546394
+3.24333 0.125186 -0.656586
+-0.125186 3.24333 -0.656586
+-3.24333 -0.125186 -0.656586
+0.125186 -3.24333 -0.656586
+0.473139 3.08765 -0.481754
+-3.08765 0.473139 -0.481754
+-0.473139 -3.08765 -0.481754
+3.08765 -0.473139 -0.481754
+2.35669 2.39852 -0.770513
+-2.39852 2.35669 -0.770513
+-2.35669 -2.39852 -0.770513
+2.39852 -2.35669 -0.770513
+1.32556 2.99988 0.693653
+-2.99988 1.32556 0.693653
+-1.32556 -2.99988 0.693653
+2.99988 -1.32556 0.693653
+1.02535 2.8335 0.162637
+-2.8335 1.02535 0.162637
+-1.02535 -2.8335 0.162637
+2.8335 -1.02535 0.162637
+1.36363 2.68711 -0.162637
+-2.68711 1.36363 -0.162637
+-1.36363 -2.68711 -0.162637
+2.68711 -1.36363 -0.162637
+3.15379 1.32915 0.816339
+-1.32915 3.15379 0.816339
+-3.15379 -1.32915 0.816339
+1.32915 -3.15379 0.816339
+0.661336 2.93783 0.150226
+-2.93783 0.661336 0.150226
+-0.661336 -2.93783 0.150226
+2.93783 -0.661336 0.150226
+2.82717 1.01504 0.0878512
+-1.01504 2.82717 0.0878512
+-2.82717 -1.01504 0.0878512
+1.01504 -2.82717 0.0878512
+1.69061 2.48295 0.0878512
+-2.48295 1.69061 0.0878512
+-1.69061 -2.48295 0.0878512
+2.48295 -1.69061 0.0878512
+2.68621 1.37508 -0.187381
+-1.37508 2.68621 -0.187381
+-2.68621 -1.37508 -0.187381
+1.37508 -2.68621 -0.187381
+2.83241 1.42218 0.556876
+-1.42218 2.83241 0.556876
+-2.83241 -1.42218 0.556876
+1.42218 -2.83241 0.556876
+2.72851 1.3786 0.33282
+-1.3786 2.72851 0.33282
+-2.72851 -1.3786 0.33282
+1.3786 -2.72851 0.33282
+1.72686 2.52255 0.33282
+-2.52255 1.72686 0.33282
+-1.72686 -2.52255 0.33282
+2.52255 -1.72686 0.33282
+3.07692 0.669932 0.525175
+-0.669932 3.07692 0.525175
+-3.07692 -0.669932 0.525175
+0.669932 -3.07692 0.525175
+1.0291 2.89261 -0.368125
+-2.89261 1.0291 -0.368125
+-1.0291 -2.89261 -0.368125
+2.89261 -1.0291 -0.368125
+2.19385 2.4497 0.70265
+-2.4497 2.19385 0.70265
+-2.19385 -2.4497 0.70265
+2.4497 -2.19385 0.70265
+2.6068 1.99022 0.693653
+-1.99022 2.6068 0.693653
+-2.6068 -1.99022 0.693653
+1.99022 -2.6068 0.693653
+3.14666 0.315809 -0.546394
+-0.315809 3.14666 -0.546394
+-3.14666 -0.315809 -0.546394
+0.315809 -3.14666 -0.546394
+1.88927 2.45852 -0.437116
+-2.45852 1.88927 -0.437116
+-1.88927 -2.45852 -0.437116
+2.45852 -1.88927 -0.437116
+1.33275 3.16345 -0.823533
+-3.16345 1.33275 -0.823533
+-1.33275 -3.16345 -0.823533
+3.16345 -1.33275 -0.823533
+2.89947 0.836451 0.187381
+-0.836451 2.89947 0.187381
+-2.89947 -0.836451 0.187381
+0.836451 -2.89947 0.187381
+1.36892 2.67833 0.125333
+-2.67833 1.36892 0.125333
+-1.36892 -2.67833 0.125333
+2.67833 -1.36892 0.125333
+1.26359 2.87723 0.51444
+-2.87723 1.26359 0.51444
+-1.26359 -2.87723 0.51444
+2.87723 -1.26359 0.51444
+4.17168 2.3304 0.627691
+-2.3304 4.17168 0.627691
+-4.17168 -2.3304 0.627691
+2.3304 -4.17168 0.627691
+4.39178 1.7766 0.675333
+-1.7766 4.39178 0.675333
+-4.39178 -1.7766 0.675333
+1.7766 -4.39178 0.675333
+0.331046 4.56559 -0.816339
+-4.56559 0.331046 -0.816339
+-0.331046 -4.56559 -0.816339
+4.56559 -0.331046 -0.816339
+3.68783 2.62243 -0.850994
+-2.62243 3.68783 -0.850994
+-3.68783 -2.62243 -0.850994
+2.62243 -3.68783 -0.850994
+3.35223 3.08669 -0.830596
+-3.08669 3.35223 -0.830596
+-3.35223 -3.08669 -0.830596
+3.08669 -3.35223 -0.830596
+4.41804 0.60727 0.888136
+-0.60727 4.41804 0.888136
+-4.41804 -0.60727 0.888136
+0.60727 -4.41804 0.888136
+0.514188 4.45216 0.876307
+-4.45216 0.514188 0.876307
+-0.514188 -4.45216 0.876307
+4.45216 -0.514188 0.876307
+3.38993 2.73619 -0.934329
+-2.73619 3.38993 -0.934329
+-3.38993 -2.73619 -0.934329
+2.73619 -3.38993 -0.934329
+4.13292 0.20063 -0.990461
+-0.20063 4.13292 -0.990461
+-4.13292 -0.20063 -0.990461
+0.20063 -4.13292 -0.990461
+1.04982 3.83373 -0.999684
+-3.83373 1.04982 -0.999684
+-1.04982 -3.83373 -0.999684
+3.83373 -1.04982 -0.999684
+3.75335 1.41881 -0.999921
+-1.41881 3.75335 -0.999921
+-3.75335 -1.41881 -0.999921
+1.41881 -3.75335 -0.999921
+3.36462 1.65881 0.968583
+-1.65881 3.36462 0.968583
+-3.36462 -1.65881 0.968583
+1.65881 -3.36462 0.968583
+3.13763 1.80591 0.925077
+-1.80591 3.13763 0.925077
+-3.13763 -1.80591 0.925077
+1.80591 -3.13763 0.925077
+3.29684 0.992963 -0.830596
+-0.992963 3.29684 -0.830596
+-3.29684 -0.992963 -0.830596
+0.992963 -3.29684 -0.830596
+1.69109 2.81009 0.693653
+-2.81009 1.69109 0.693653
+-1.69109 -2.81009 0.693653
+2.81009 -1.69109 0.693653
+0.881349 3.11529 -0.647056
+-3.11529 0.881349 -0.647056
+-0.881349 -3.11529 -0.647056
+3.11529 -0.881349 -0.647056
+2.34404 2.04674 0.45958
+-2.04674 2.34404 0.45958
+-2.34404 -2.04674 0.45958
+2.04674 -2.34404 0.45958
+0.698319 3.2505 -0.737513
+-3.2505 0.698319 -0.737513
+-0.698319 -3.2505 -0.737513
+3.2505 -0.698319 -0.737513
+3.0362 0.103819 -0.272952
+-0.103819 3.0362 -0.272952
+-3.0362 -0.103819 -0.272952
+0.103819 -3.0362 -0.272952
+2.2705 2.24214 0.587785
+-2.24214 2.2705 0.587785
+-2.2705 -2.24214 0.587785
+2.24214 -2.2705 0.587785
+3.10177 1.14497 -0.720309
+-1.14497 3.10177 -0.720309
+-3.10177 -1.14497 -0.720309
+1.14497 -3.10177 -0.720309
+0.837112 2.90451 -0.212007
+-2.90451 0.837112 -0.212007
+-0.837112 -2.90451 -0.212007
+2.90451 -0.837112 -0.212007
+1.40921 2.73845 0.391374
+-2.73845 1.40921 0.391374
+-1.40921 -2.73845 0.391374
+2.73845 -1.40921 0.391374
+2.69089 1.61062 -0.503623
+-1.61062 2.69089 -0.503623
+-2.69089 -1.61062 -0.503623
+1.61062 -2.69089 -0.503623
+1.81814 2.71919 -0.684547
+-2.71919 1.81814 -0.684547
+-1.81814 -2.71919 -0.684547
+2.71919 -1.81814 -0.684547
+2.35527 2.10024 -0.535827
+-2.10024 2.35527 -0.535827
+-2.35527 -2.10024 -0.535827
+2.10024 -2.35527 -0.535827
+3.18678 0.737602 -0.684547
+-0.737602 3.18678 -0.684547
+-3.18678 -0.737602 -0.684547
+0.737602 -3.18678 -0.684547
+2.61032 1.53534 0.236499
+-1.53534 2.61032 0.236499
+-2.61032 -1.53534 0.236499
+1.53534 -2.61032 0.236499
+1.45614 2.91008 -0.666012
+-2.91008 1.45614 -0.666012
+-1.45614 -2.91008 -0.666012
+2.91008 -1.45614 -0.666012
+2.92869 0.653481 0.0376902
+-0.653481 2.92869 0.0376902
+-2.92869 -0.653481 0.0376902
+0.653481 -2.92869 0.0376902
+0.0815083 3.14795 -0.525175
+-3.14795 0.0815083 -0.525175
+-0.0815083 -3.14795 -0.525175
+3.14795 -0.0815083 -0.525175
+3.15704 0.279626 0.556876
+-0.279626 3.15704 0.556876
+-3.15704 -0.279626 0.556876
+0.279626 -3.15704 0.556876
+1.9815 2.52035 0.60793
+-2.52035 1.9815 0.60793
+-1.9815 -2.52035 0.60793
+2.52035 -1.9815 0.60793
+2.64591 1.82404 -0.61786
+-1.82404 2.64591 -0.61786
+-2.64591 -1.82404 -0.61786
+1.82404 -2.64591 -0.61786
+2.92718 1.28904 -0.597905
+-1.28904 2.92718 -0.597905
+-2.92718 -1.28904 -0.597905
+1.28904 -2.92718 -0.597905
+1.68755 2.48989 -0.125333
+-2.48989 1.68755 -0.125333
+-1.68755 -2.48989 -0.125333
+2.48989 -1.68755 -0.125333
+2.48564 1.69381 -0.125333
+-1.69381 2.48564 -0.125333
+-2.48564 -1.69381 -0.125333
+1.69381 -2.48564 -0.125333
+2.38268 4.36 0.24869
+-4.36 2.38268 0.24869
+-2.38268 -4.36 0.24869
+4.36 -2.38268 0.24869
+4.95901 0.623303 -0.0627905
+-0.623303 4.95901 -0.0627905
+-4.95901 -0.623303 -0.0627905
+0.623303 -4.95901 -0.0627905
+4.73789 1.54865 0.175023
+-1.54865 4.73789 0.175023
+-4.73789 -1.54865 0.175023
+1.54865 -4.73789 0.175023
+2.1303 4.52269 -0.0376902
+-4.52269 2.1303 -0.0376902
+-2.1303 -4.52269 -0.0376902
+4.52269 -2.1303 -0.0376902
+3.40477 3.60478 -0.285019
+-3.60478 3.40477 -0.285019
+-3.40477 -3.60478 -0.285019
+3.60478 -3.40477 -0.285019
+2.40989 4.36796 -0.150226
+-4.36796 2.40989 -0.150226
+-2.40989 -4.36796 -0.150226
+4.36796 -2.40989 -0.150226
+2.36045 4.23797 -0.525175
+-4.23797 2.36045 -0.525175
+-2.36045 -4.23797 -0.525175
+4.23797 -2.36045 -0.525175
+4.85805 0.59078 -0.448383
+-0.59078 4.85805 -0.448383
+-4.85805 -0.59078 -0.448383
+0.59078 -4.85805 -0.448383
+3.06196 3.74514 0.546394
+-3.74514 3.06196 0.546394
+-3.06196 -3.74514 0.546394
+3.74514 -3.06196 0.546394
+0.922199 4.64689 -0.675333
+-4.64689 0.922199 -0.675333
+-0.922199 -4.64689 -0.675333
+4.64689 -0.922199 -0.675333
+3.55006 3.29615 -0.535827
+-3.29615 3.55006 -0.535827
+-3.55006 -3.29615 -0.535827
+3.29615 -3.55006 -0.535827
+4.7864 0.269746 -0.60793
+-0.269746 4.7864 -0.60793
+-4.7864 -0.269746 -0.60793
+0.269746 -4.7864 -0.60793
+3.28447 3.44864 -0.647056
+-3.44864 3.28447 -0.647056
+-3.28447 -3.44864 -0.647056
+3.44864 -3.28447 -0.647056
+2.41576 3.88822 0.816339
+-3.88822 2.41576 0.816339
+-2.41576 -3.88822 0.816339
+3.88822 -2.41576 0.816339
+2.74517 3.83997 0.693653
+-3.83997 2.74517 0.693653
+-2.74517 -3.83997 0.693653
+3.83997 -2.74517 0.693653
+3.0808 3.20886 -0.893841
+-3.20886 3.0808 -0.893841
+-3.0808 -3.20886 -0.893841
+3.20886 -3.0808 -0.893841
+4.46694 1.41117 -0.728969
+-1.41117 4.46694 -0.728969
+-4.46694 -1.41117 -0.728969
+1.41117 -4.46694 -0.728969
+2.79778 3.06542 0.988652
+-3.06542 2.79778 0.988652
+-2.79778 -3.06542 0.988652
+3.06542 -2.79778 0.988652
+1.71918 3.79104 0.986686
+-3.79104 1.71918 0.986686
+-1.71918 -3.79104 0.986686
+3.79104 -1.71918 0.986686
+3.46673 1.55691 -0.979855
+-1.55691 3.46673 -0.979855
+-3.46673 -1.55691 -0.979855
+1.55691 -3.46673 -0.979855
+0.958294 3.44336 -0.904827
+-3.44336 0.958294 -0.904827
+-0.958294 -3.44336 -0.904827
+3.44336 -0.958294 -0.904827
+2.36911 2.75279 -0.929776
+-2.75279 2.36911 -0.929776
+-2.36911 -2.75279 -0.929776
+2.75279 -2.36911 -0.929776
+0.582942 3.44744 0.863923
+-3.44744 0.582942 0.863923
+-0.582942 -3.44744 0.863923
+3.44744 -0.582942 0.863923
+2.91213 1.93499 0.863923
+-1.93499 2.91213 0.863923
+-2.91213 -1.93499 0.863923
+1.93499 -2.91213 0.863923
+2.8974 2.01519 -0.882291
+-2.01519 2.8974 -0.882291
+-2.8974 -2.01519 -0.882291
+2.01519 -2.8974 -0.882291
+0.502001 3.37509 -0.809017
+-3.37509 0.502001 -0.809017
+-0.502001 -3.37509 -0.809017
+3.37509 -0.502001 -0.809017
+1.92033 2.77215 0.778462
+-2.77215 1.92033 0.778462
+-1.92033 -2.77215 0.778462
+2.77215 -1.92033 0.778462
+1.59407 2.73133 -0.546394
+-2.73133 1.59407 -0.546394
+-1.59407 -2.73133 -0.546394
+2.73133 -1.59407 -0.546394
+3.11978 1.09493 0.720309
+-1.09493 3.11978 0.720309
+-3.11978 -1.09493 0.720309
+1.09493 -3.11978 0.720309
+1.94839 2.54603 -0.60793
+-2.54603 1.94839 -0.60793
+-1.94839 -2.54603 -0.60793
+2.54603 -1.94839 -0.60793
+3.05917 0.470741 0.425779
+-0.470741 3.05917 0.425779
+-3.05917 -0.470741 0.425779
+0.470741 -3.05917 0.425779
+3.00255 0.278496 0.175023
+-0.278496 3.00255 0.175023
+-3.00255 -0.278496 0.175023
+0.278496 -3.00255 0.175023
+0.653233 2.92931 -0.0502443
+-2.92931 0.653233 -0.0502443
+-0.653233 -2.92931 -0.0502443
+2.92931 -0.653233 -0.0502443
+2.96647 0.472518 -0.0878512
+-0.472518 2.96647 -0.0878512
+-2.96647 -0.472518 -0.0878512
+0.472518 -2.96647 -0.0878512
+1.23242 2.89072 -0.51444
+-2.89072 1.23242 -0.51444
+-1.23242 -2.89072 -0.51444
+2.89072 -1.23242 -0.51444
+2.01283 2.271 0.260842
+-2.271 2.01283 0.260842
+-2.01283 -2.271 0.260842
+2.271 -2.01283 0.260842
+2.73845 1.40921 -0.391374
+-1.40921 2.73845 -0.391374
+-2.73845 -1.40921 -0.391374
+1.40921 -2.73845 -0.391374
+2.42231 1.89409 -0.379779
+-1.89409 2.42231 -0.379779
+-2.42231 -1.89409 -0.379779
+1.89409 -2.42231 -0.379779
+0.471984 2.96552 0.0753268
+-2.96552 0.471984 0.0753268
+-0.471984 -2.96552 0.0753268
+2.96552 -0.471984 0.0753268
+2.25375 1.99198 -0.125333
+-1.99198 2.25375 -0.125333
+-2.25375 -1.99198 -0.125333
+1.99198 -2.25375 -0.125333
+0.280633 2.98883 -0.0627905
+-2.98883 0.280633 -0.0627905
+-0.280633 -2.98883 -0.0627905
+2.98883 -0.280633 -0.0627905
+2.37076 1.83847 0.012566
+-1.83847 2.37076 0.012566
+-2.37076 -1.83847 0.012566
+1.83847 -2.37076 0.012566
+0.0856554 3.05581 -0.33282
+-3.05581 0.0856554 -0.33282
+-0.0856554 -3.05581 -0.33282
+3.05581 -0.0856554 -0.33282
+2.28436 2.00274 0.272952
+-2.00274 2.28436 0.272952
+-2.28436 -2.00274 0.272952
+2.00274 -2.28436 0.272952
+3.05099 0.299626 -0.356412
+-0.299626 3.05099 -0.356412
+-3.05099 -0.299626 -0.356412
+0.299626 -3.05099 -0.356412
+2.54581 1.71614 0.368125
+-1.71614 2.54581 0.368125
+-2.54581 -1.71614 0.368125
+1.71614 -2.54581 0.368125
+1.70971 2.53421 -0.33282
+-2.53421 1.70971 -0.33282
+-1.70971 -2.53421 -0.33282
+2.53421 -1.70971 -0.33282
+2.12824 2.12343 0.112856
+-2.12343 2.12824 0.112856
+-2.12824 -2.12343 0.112856
+2.12343 -2.12824 0.112856
+0.0961795 3.00043 0.0627905
+-3.00043 0.0961795 0.0627905
+-0.0961795 -3.00043 0.0627905
+3.00043 -0.0961795 0.0627905
+3.04391 0.0864702 0.297042
+-0.0864702 3.04391 0.297042
+-3.04391 -0.0864702 0.297042
+0.0864702 -3.04391 0.297042
+2.37047 -1.83872 -2.94854e-15
+-2.37047 1.83872 -9.83751e-16
+1.83872 2.37047 -1.35525e-18
+-1.83872 -2.37047 2.64556e-14
+1.83511 4.6469 0.0878512
+-4.6469 1.83511 0.0878512
+-1.83511 -4.6469 0.0878512
+4.6469 -1.83511 0.0878512
+2.67335 4.22073 0.0878512
+-4.22073 2.67335 0.0878512
+-2.67335 -4.22073 0.0878512
+4.22073 -2.67335 0.0878512
+4.64904 1.84001 -0.012566
+-1.84001 4.64904 -0.012566
+-4.64904 -1.84001 -0.012566
+1.84001 -4.64904 -0.012566
+4.51433 2.13121 0.125333
+-2.13121 4.51433 0.125333
+-4.51433 -2.13121 0.125333
+2.13121 -4.51433 0.125333
+1.54872 4.7401 -0.162637
+-4.7401 1.54872 -0.162637
+-1.54872 -4.7401 -0.162637
+4.7401 -1.54872 -0.162637
+3.16859 3.8449 0.187381
+-3.8449 3.16859 0.187381
+-3.16859 -3.8449 0.187381
+3.8449 -3.16859 0.187381
+4.40172 2.09838 0.481754
+-2.09838 4.40172 0.481754
+-4.40172 -2.09838 0.481754
+2.09838 -4.40172 0.481754
+4.90604 0.636068 0.320944
+-0.636068 4.90604 0.320944
+-4.90604 -0.636068 0.320944
+0.636068 -4.90604 0.320944
+2.669 4.17892 -0.285019
+-4.17892 2.669 -0.285019
+-2.669 -4.17892 -0.285019
+4.17892 -2.669 -0.285019
+1.2414 4.75059 -0.414376
+-4.75059 1.2414 -0.414376
+-1.2414 -4.75059 -0.414376
+4.75059 -1.2414 -0.414376
+3.34183 3.5902 0.425779
+-3.5902 3.34183 0.425779
+-3.34183 -3.5902 0.425779
+3.5902 -3.34183 0.425779
+4.69208 0.861497 -0.637424
+-0.861497 4.69208 -0.637424
+-4.69208 -0.861497 -0.637424
+0.861497 -4.69208 -0.637424
+4.59204 1.52145 0.546394
+-1.52145 4.59204 0.546394
+-4.59204 -1.52145 0.546394
+1.52145 -4.59204 0.546394
+4.30502 0.490068 -0.942991
+-0.490068 4.30502 -0.942991
+-4.30502 -0.490068 -0.942991
+0.490068 -4.30502 -0.942991
+3.3919 2.39152 -0.988652
+-2.39152 3.3919 -0.988652
+-3.3919 -2.39152 -0.988652
+2.39152 -3.3919 -0.988652
+3.49686 1.99341 0.999684
+-1.99341 3.49686 0.999684
+-3.49686 -1.99341 0.999684
+1.99341 -3.49686 0.999684
+2.05508 3.35831 0.998027
+-3.35831 2.05508 0.998027
+-2.05508 -3.35831 0.998027
+3.35831 -2.05508 0.998027
+2.41881 3.02695 0.992115
+-3.02695 2.41881 0.992115
+-2.41881 -3.02695 0.992115
+3.02695 -2.41881 0.992115
+2.94465 2.2254 0.951057
+-2.2254 2.94465 0.951057
+-2.94465 -2.2254 0.951057
+2.2254 -2.94465 0.951057
+0.0646048 3.92414 -0.997159
+-3.92414 0.0646048 -0.997159
+-0.0646048 -3.92414 -0.997159
+3.92414 -0.0646048 -0.997159
+1.54598 3.44472 0.974527
+-3.44472 1.54598 0.974527
+-1.54598 -3.44472 0.974527
+3.44472 -1.54598 0.974527
+3.357 0.937899 0.857527
+-0.937899 3.357 0.857527
+-3.357 -0.937899 0.857527
+0.937899 -3.357 0.857527
+0.819091 3.4791 0.904827
+-3.4791 0.819091 0.904827
+-0.819091 -3.4791 0.904827
+3.4791 -0.819091 0.904827
+1.39372 3.13707 0.823533
+-3.13707 1.39372 0.823533
+-1.39372 -3.13707 0.823533
+3.13707 -1.39372 0.823533
+2.11402 2.78488 -0.863923
+-2.78488 2.11402 -0.863923
+-2.11402 -2.78488 -0.863923
+2.78488 -2.11402 -0.863923
+2.93381 1.52469 -0.720309
+-1.52469 2.93381 -0.720309
+-2.93381 -1.52469 -0.720309
+1.52469 -2.93381 -0.720309
+2.9121 1.75896 -0.801567
+-1.75896 2.9121 -0.801567
+-2.9121 -1.75896 -0.801567
+1.75896 -2.9121 -0.801567
+2.26775 2.29932 -0.637424
+-2.29932 2.26775 -0.637424
+-2.26775 -2.29932 -0.637424
+2.29932 -2.26775 -0.637424
+3.28794 0.49284 0.737513
+-0.49284 3.28794 0.737513
+-3.28794 -0.49284 0.737513
+0.49284 -3.28794 0.737513
+2.51001 1.92382 0.546394
+-1.92382 2.51001 0.546394
+-2.51001 -1.92382 0.546394
+1.92382 -2.51001 0.546394
+3.07709 0.872632 0.597905
+-0.872632 3.07709 0.597905
+-3.07709 -0.872632 0.597905
+0.872632 -3.07709 0.597905
+0.467497 3.01289 -0.309017
+-3.01289 0.467497 -0.309017
+-0.467497 -3.01289 -0.309017
+3.01289 -0.467497 -0.309017
+3.0023 0.0969947 -0.0878512
+-0.0969947 3.0023 -0.0878512
+-3.0023 -0.0969947 -0.0878512
+0.0969947 -3.0023 -0.0878512
+2.9403 4.04057 -0.0753268
+-4.04057 2.9403 -0.0753268
+-2.9403 -4.04057 -0.0753268
+4.04057 -2.9403 -0.0753268
+4.98797 0.316963 0.0627905
+-0.316963 4.98797 0.0627905
+-4.98797 -0.316963 0.0627905
+0.316963 -4.98797 0.0627905
+3.84082 3.18635 0.13779
+-3.18635 3.84082 0.13779
+-3.84082 -3.18635 0.13779
+3.18635 -3.84082 0.13779
+1.83939 4.60851 -0.272952
+-4.60851 1.83939 -0.272952
+-1.83939 -4.60851 -0.272952
+4.60851 -1.83939 -0.272952
+4.8871 0.943089 0.212007
+-0.943089 4.8871 0.212007
+-4.8871 -0.943089 0.212007
+0.943089 -4.8871 0.212007
+3.60478 3.40477 0.285019
+-3.40477 3.60478 0.285019
+-3.60478 -3.40477 0.285019
+3.40477 -3.60478 0.285019
+4.58549 1.83421 0.344643
+-1.83421 4.58549 0.344643
+-4.58549 -1.83421 0.344643
+1.83421 -4.58549 0.344643
+4.74532 1.24066 0.425779
+-1.24066 4.74532 0.425779
+-4.74532 -1.24066 0.425779
+1.24066 -4.74532 0.425779
+1.52743 4.61787 -0.503623
+-4.61787 1.52743 -0.503623
+-1.52743 -4.61787 -0.503623
+4.61787 -1.52743 -0.503623
+2.59514 4.03083 -0.60793
+-4.03083 2.59514 -0.60793
+-2.59514 -4.03083 -0.60793
+4.03083 -2.59514 -0.60793
+0.631494 4.74445 -0.61786
+-4.74445 0.631494 -0.61786
+-0.631494 -4.74445 -0.61786
+4.74445 -0.631494 -0.61786
+4.72865 0.630601 0.637424
+-0.630601 4.72865 0.637424
+-4.72865 -0.630601 0.637424
+0.630601 -4.72865 0.637424
+0.0382636 4.68439 -0.728969
+-4.68439 0.0382636 -0.728969
+-0.0382636 -4.68439 -0.728969
+4.68439 -0.0382636 -0.728969
+4.10764 2.21336 -0.745941
+-2.21336 4.10764 -0.745941
+-4.10764 -2.21336 -0.745941
+2.21336 -4.10764 -0.745941
+4.62469 0.544127 -0.754251
+-0.544127 4.62469 -0.754251
+-4.62469 -0.544127 -0.754251
+0.544127 -4.62469 -0.754251
+4.50821 0.237023 -0.857527
+-0.237023 4.50821 -0.857527
+-4.50821 -0.237023 -0.857527
+0.237023 -4.50821 -0.857527
+4.56559 0.331046 0.816339
+-0.331046 4.56559 0.816339
+-4.56559 -0.331046 0.816339
+0.331046 -4.56559 0.816339
+3.53591 2.31123 0.974527
+-2.31123 3.53591 0.974527
+-3.53591 -2.31123 0.974527
+2.31123 -3.53591 0.974527
+0.730369 4.13571 0.979855
+-4.13571 0.730369 0.979855
+-0.730369 -4.13571 0.979855
+4.13571 -0.730369 0.979855
+2.46347 3.79585 -0.850994
+-3.79585 2.46347 -0.850994
+-2.46347 -3.79585 -0.850994
+3.79585 -2.46347 -0.850994
+0.221072 4.3508 0.934329
+-4.3508 0.221072 0.934329
+-0.221072 -4.3508 0.934329
+4.3508 -0.221072 0.934329
+3.81314 1.73036 -0.982287
+-1.73036 3.81314 -0.982287
+-3.81314 -1.73036 -0.982287
+1.73036 -3.81314 -0.982287
+3.25048 2.43734 0.998027
+-2.43734 3.25048 0.998027
+-3.25048 -2.43734 0.998027
+2.43734 -3.25048 0.998027
+0.831488 4.04067 -0.992115
+-4.04067 0.831488 -0.992115
+-0.831488 -4.04067 -0.992115
+4.04067 -0.831488 -0.992115
+0.455945 4.08751 0.993611
+-4.08751 0.455945 0.993611
+-0.455945 -4.08751 0.993611
+4.08751 -0.455945 0.993611
+3.22513 2.1249 0.990461
+-2.1249 3.22513 0.990461
+-3.22513 -2.1249 0.990461
+2.1249 -3.22513 0.990461
+3.64618 1.11419 -0.982287
+-1.11419 3.64618 -0.982287
+-3.64618 -1.11419 -0.982287
+1.11419 -3.64618 -0.982287
+1.98762 3.48569 -0.999921
+-3.48569 1.98762 -0.999921
+-1.98762 -3.48569 -0.999921
+3.48569 -1.98762 -0.999921
+2.88188 2.79203 0.999921
+-2.79203 2.88188 0.999921
+-2.88188 -2.79203 0.999921
+2.79203 -2.88188 0.999921
+1.58654 3.2028 -0.904827
+-3.2028 1.58654 -0.904827
+-1.58654 -3.2028 -0.904827
+3.2028 -1.58654 -0.904827
+1.98734 2.99826 -0.915241
+-2.99826 1.98734 -0.915241
+-1.98734 -2.99826 -0.915241
+2.99826 -1.98734 -0.915241
+3.51228 0.8283 -0.920232
+-0.8283 3.51228 -0.920232
+-3.51228 -0.8283 -0.920232
+0.8283 -3.51228 -0.920232
+3.40223 1.27096 -0.929776
+-1.27096 3.40223 -0.929776
+-3.40223 -1.27096 -0.929776
+1.27096 -3.40223 -0.929776
+2.19314 2.76515 0.882291
+-2.76515 2.19314 0.882291
+-2.19314 -2.76515 0.882291
+2.76515 -2.19314 0.882291
+0.284672 3.29407 -0.720309
+-3.29407 0.284672 -0.720309
+-0.284672 -3.29407 -0.720309
+3.29407 -0.284672 -0.720309
+3.03828 0.902196 -0.556876
+-0.902196 3.03828 -0.556876
+-3.03828 -0.902196 -0.556876
+0.902196 -3.03828 -0.556876
+3.18078 0.686686 0.666012
+-0.686686 3.18078 0.666012
+-3.18078 -0.686686 0.666012
+0.686686 -3.18078 0.666012
+2.89348 1.05488 -0.391374
+-1.05488 2.89348 -0.391374
+-2.89348 -1.05488 -0.391374
+1.05488 -2.89348 -0.391374
+1.77253 2.57951 0.492727
+-2.57951 1.77253 0.492727
+-1.77253 -2.57951 0.492727
+2.57951 -1.77253 0.492727
+1.3786 2.72851 -0.33282
+-2.72851 1.3786 -0.33282
+-1.3786 -2.72851 -0.33282
+2.72851 -1.3786 -0.33282
+2.3901 1.84627 0.19971
+-1.84627 2.3901 0.19971
+-2.3901 -1.84627 0.19971
+1.84627 -2.3901 0.19971
+1.99016 2.26542 -0.175023
+-2.26542 1.99016 -0.175023
+-1.99016 -2.26542 -0.175023
+2.26542 -1.99016 -0.175023
+2.90343 0.85065 -0.224271
+-0.85065 2.90343 -0.224271
+-2.90343 -0.85065 -0.224271
+0.85065 -2.90343 -0.224271
+3.41804 3.64535 0.0753268
+-3.64535 3.41804 0.0753268
+-3.41804 -3.64535 0.0753268
+3.64535 -3.41804 0.0753268
+4.04562 2.93698 -0.0376902
+-2.93698 4.04562 -0.0376902
+-4.04562 -2.93698 -0.0376902
+2.93698 -4.04562 -0.0376902
+0.294498 4.93832 0.320944
+-4.93832 0.294498 0.320944
+-0.294498 -4.93832 0.320944
+4.93832 -0.294498 0.320944
+4.95308 0.297876 -0.272952
+-0.297876 4.95308 -0.272952
+-4.95308 -0.297876 -0.272952
+0.297876 -4.95308 -0.272952
+4.50587 2.10786 -0.224271
+-2.10786 4.50587 -0.224271
+-4.50587 -2.10786 -0.224271
+2.10786 -4.50587 -0.224271
+0.331513 4.83297 -0.535827
+-4.83297 0.331513 -0.535827
+-0.331513 -4.83297 -0.535827
+4.83297 -0.331513 -0.535827
+3.13377 3.75145 -0.45958
+-3.75145 3.13377 -0.45958
+-3.13377 -3.75145 -0.45958
+3.75145 -3.13377 -0.45958
+4.14365 2.65308 0.391374
+-2.65308 4.14365 0.391374
+-4.14365 -2.65308 0.391374
+2.65308 -4.14365 0.391374
+0.0233418 4.88808 -0.45958
+-4.88808 0.0233418 -0.45958
+-0.0233418 -4.88808 -0.45958
+4.88808 -0.0233418 -0.45958
+3.63378 2.95646 -0.728969
+-2.95646 3.63378 -0.728969
+-3.63378 -2.95646 -0.728969
+2.95646 -3.63378 -0.728969
+3.75166 2.7743 0.745941
+-2.7743 3.75166 0.745941
+-3.75166 -2.7743 0.745941
+2.7743 -3.75166 0.745941
+3.4486 2.9133 0.857527
+-2.9133 3.4486 0.857527
+-3.4486 -2.9133 0.857527
+2.9133 -3.4486 0.857527
+3.20867 2.72863 0.977268
+-2.72863 3.20867 0.977268
+-3.20867 -2.72863 0.977268
+2.72863 -3.20867 0.977268
+3.52229 2.62253 0.920232
+-2.62253 3.52229 0.920232
+-3.52229 -2.62253 0.920232
+2.62253 -3.52229 0.920232
+0.589224 4.2199 -0.965382
+-4.2199 0.589224 -0.965382
+-0.589224 -4.2199 -0.965382
+4.2199 -0.589224 -0.965382
+3.95097 0.435187 -0.999684
+-0.435187 3.95097 -0.999684
+-3.95097 -0.435187 -0.999684
+0.435187 -3.95097 -0.999684
+0.19062 4.02061 0.999684
+-4.02061 0.19062 0.999684
+-0.19062 -4.02061 0.999684
+4.02061 -0.19062 0.999684
+1.8252 3.74115 -0.986686
+-3.74115 1.8252 -0.986686
+-1.8252 -3.74115 -0.986686
+3.74115 -1.8252 -0.986686
+0.656169 3.79344 0.988652
+-3.79344 0.656169 0.988652
+-0.656169 -3.79344 0.988652
+3.79344 -0.656169 0.988652
+1.06252 3.49752 0.938734
+-3.49752 1.06252 0.938734
+-1.06252 -3.49752 0.938734
+3.49752 -1.06252 0.938734
+1.20308 3.47679 -0.947098
+-3.47679 1.20308 -0.947098
+-1.20308 -3.47679 -0.947098
+3.47679 -1.20308 -0.947098
+3.19594 1.67575 -0.920232
+-1.67575 3.19594 -0.920232
+-3.19594 -1.67575 -0.920232
+1.67575 -3.19594 -0.920232
+2.70762 2.3332 0.904827
+-2.3332 2.70762 0.904827
+-2.70762 -2.3332 0.904827
+2.3332 -2.70762 0.904827
+1.86674 3.07479 0.915241
+-3.07479 1.86674 0.915241
+-1.86674 -3.07479 0.915241
+3.07479 -1.86674 0.915241
+1.61433 3.08919 0.857527
+-3.08919 1.61433 0.857527
+-1.61433 -3.08919 0.857527
+3.08919 -1.61433 0.857527
+1.7092 2.95328 -0.809017
+-2.95328 1.7092 -0.809017
+-1.7092 -2.95328 -0.809017
+2.95328 -1.7092 -0.809017
+2.58934 2.04153 -0.711536
+-2.04153 2.58934 -0.711536
+-2.58934 -2.04153 -0.711536
+2.04153 -2.58934 -0.711536
+0.112001 3.10414 0.448383
+-3.10414 0.112001 0.448383
+-0.112001 -3.10414 0.448383
+3.10414 -0.112001 0.448383
+2.05766 2.35834 -0.492727
+-2.35834 2.05766 -0.492727
+-2.05766 -2.35834 -0.492727
+2.35834 -2.05766 -0.492727
+2.99374 0.681039 -0.368125
+-0.681039 2.99374 -0.368125
+-2.99374 -0.681039 -0.368125
+0.681039 -2.99374 -0.368125
+2.9868 0.281957 0.012566
+-0.281957 2.9868 0.012566
+-2.9868 -0.281957 0.012566
+0.281957 -2.9868 0.012566
+3.00187 0.466946 0.272952
+-0.466946 3.00187 0.272952
+-3.00187 -0.466946 0.272952
+0.466946 -3.00187 0.272952
+3.83902 -3.18568 -0.150226
+3.18568 3.83902 -0.150226
+-3.18568 -3.83902 -0.150226
+-3.83902 3.18568 -0.150226
+0.940075 4.90794 -0.0753268
+-4.90794 0.940075 -0.0753268
+-0.940075 -4.90794 -0.0753268
+4.90794 -0.940075 -0.0753268
+-4.98865 0.00752271 -0.150226
+0.00752271 4.98865 -0.150226
+4.98865 -0.00752271 -0.150226
+-0.00752271 -4.98865 -0.150226
+4.98865 0.00752271 0.150226
+-0.00752271 4.98865 0.150226
+-4.98865 -0.00752271 0.150226
+0.00752271 -4.98865 0.150226
+3.8449 3.16859 -0.187381
+-3.16859 3.8449 -0.187381
+-3.8449 -3.16859 -0.187381
+3.16859 -3.8449 -0.187381
+4.21602 2.68077 0.0878512
+-2.68077 4.21602 0.0878512
+-4.21602 -2.68077 0.0878512
+2.68077 -4.21602 0.0878512
+4.3687 2.39028 -0.19971
+-2.39028 4.3687 -0.19971
+-4.3687 -2.39028 -0.19971
+2.39028 -4.3687 -0.19971
+0.636068 4.90604 -0.320944
+-4.90604 0.636068 -0.320944
+-0.636068 -4.90604 -0.320944
+4.90604 -0.636068 -0.320944
+0.941997 4.83894 -0.368125
+-4.83894 0.941997 -0.368125
+-0.941997 -4.83894 -0.368125
+4.83894 -0.941997 -0.368125
+4.20813 2.65797 -0.212007
+-2.65797 4.20813 -0.212007
+-4.20813 -2.65797 -0.212007
+2.65797 -4.20813 -0.212007
+4.28489 2.32767 -0.481754
+-2.32767 4.28489 -0.481754
+-4.28489 -2.32767 -0.481754
+2.32767 -4.28489 -0.481754
+2.90557 3.9645 -0.402906
+-3.9645 2.90557 -0.402906
+-2.90557 -3.9645 -0.402906
+3.9645 -2.90557 -0.402906
+1.78551 4.56829 0.425779
+-4.56829 1.78551 0.425779
+-1.78551 -4.56829 0.425779
+4.56829 -1.78551 0.425779
+4.00571 2.88884 -0.344643
+-2.88884 4.00571 -0.344643
+-4.00571 -2.88884 -0.344643
+2.88884 -4.00571 -0.344643
+4.89936 0.0221643 0.437116
+-0.0221643 4.89936 0.437116
+-4.89936 -0.0221643 0.437116
+0.0221643 -4.89936 0.437116
+3.77708 3.09362 -0.470704
+-3.09362 3.77708 -0.470704
+-3.77708 -3.09362 -0.470704
+3.09362 -3.77708 -0.470704
+4.7665 0.935979 0.51444
+-0.935979 4.7665 0.51444
+-4.7665 -0.935979 0.51444
+0.935979 -4.7665 0.51444
+1.70765 4.40988 0.684547
+-4.40988 1.70765 0.684547
+-1.70765 -4.40988 0.684547
+4.40988 -1.70765 0.684547
+4.6613 1.49062 -0.448383
+1.49062 4.6613 0.448383
+-1.49062 4.6613 -0.448383
+-4.6613 1.49062 0.448383
+-4.6613 -1.49062 -0.448383
+-1.49062 -4.6613 0.448383
+1.49062 -4.6613 -0.448383
+4.6613 -1.49062 0.448383
+1.80055 4.46712 -0.577573
+-4.46712 1.80055 -0.577573
+-1.80055 -4.46712 -0.577573
+4.46712 -1.80055 -0.577573
+4.12542 2.58835 -0.492727
+-2.58835 4.12542 -0.492727
+-4.12542 -2.58835 -0.492727
+2.58835 -4.12542 -0.492727
+3.19841 3.45959 0.70265
+-3.45959 3.19841 0.70265
+-3.19841 -3.45959 0.70265
+3.45959 -3.19841 0.70265
+3.9958 2.57614 0.656586
+-2.57614 3.9958 0.656586
+-3.9958 -2.57614 0.656586
+2.57614 -3.9958 0.656586
+3.89675 2.79243 -0.60793
+-2.79243 3.89675 -0.60793
+-3.89675 -2.79243 -0.60793
+2.79243 -3.89675 -0.60793
+3.49059 3.31857 0.577573
+-3.31857 3.49059 0.577573
+-3.49059 -3.31857 0.577573
+3.31857 -3.49059 0.577573
+3.32996 3.18503 0.79399
+-3.18503 3.32996 0.79399
+-3.32996 -3.18503 0.79399
+3.18503 -3.32996 0.79399
+4.57584 0.912881 0.745941
+-0.912881 4.57584 0.745941
+-4.57584 -0.912881 0.745941
+0.912881 -4.57584 0.745941
+2.25684 4.01743 -0.79399
+-4.01743 2.25684 -0.79399
+-2.25684 -4.01743 -0.79399
+4.01743 -2.25684 -0.79399
+1.13881 4.58088 0.693653
+-4.58088 1.13881 0.693653
+-1.13881 -4.58088 0.693653
+4.58088 -1.13881 0.693653
+1.4242 4.50033 0.693653
+-4.50033 1.4242 0.693653
+-1.4242 -4.50033 0.693653
+4.50033 -1.4242 0.693653
+4.72017 0.0361831 0.693653
+-0.0361831 4.72017 0.693653
+-4.72017 -0.0361831 0.693653
+0.0361831 -4.72017 0.693653
+3.97566 2.47772 -0.728969
+-2.47772 3.97566 -0.728969
+-3.97566 -2.47772 -0.728969
+2.47772 -3.97566 -0.728969
+1.47675 4.41622 -0.754251
+-4.41622 1.47675 -0.754251
+-1.47675 -4.41622 -0.754251
+4.41622 -1.47675 -0.754251
+4.4815 0.0478706 0.876307
+-0.0478706 4.4815 0.876307
+-4.4815 -0.0478706 0.876307
+0.0478706 -4.4815 0.876307
+4.36916 1.46407 0.79399
+-1.46407 4.36916 0.79399
+-4.36916 -1.46407 0.79399
+1.46407 -4.36916 0.79399
+1.73228 4.2591 -0.801567
+-4.2591 1.73228 -0.801567
+-1.73228 -4.2591 -0.801567
+4.2591 -1.73228 -0.801567
+4.11533 1.39283 0.938734
+-1.39283 4.11533 0.938734
+-4.11533 -1.39283 0.938734
+1.39283 -4.11533 0.938734
+4.30878 1.66103 -0.786288
+-1.66103 4.30878 -0.786288
+-4.30878 -1.66103 -0.786288
+1.66103 -4.30878 -0.786288
+4.11764 1.6832 0.893841
+-1.6832 4.11764 0.893841
+-4.11764 -1.6832 0.893841
+1.6832 -4.11764 0.893841
+0.881813 4.36011 -0.893841
+-4.36011 0.881813 -0.893841
+-0.881813 -4.36011 -0.893841
+4.36011 -0.881813 -0.893841
+1.33933 4.27695 0.876307
+-4.27695 1.33933 0.876307
+-1.33933 -4.27695 0.876307
+4.27695 -1.33933 0.876307
+2.31123 3.53591 -0.974527
+-3.53591 2.31123 -0.974527
+-2.31123 -3.53591 -0.974527
+3.53591 -2.31123 -0.974527
+0.797709 4.43241 0.863923
+-4.43241 0.797709 0.863923
+-0.797709 -4.43241 0.863923
+4.43241 -0.797709 0.863923
+2.75864 3.24726 -0.965382
+-3.24726 2.75864 -0.965382
+-2.75864 -3.24726 -0.965382
+3.24726 -2.75864 -0.965382
+3.79585 2.46347 0.850994
+-2.46347 3.79585 0.850994
+-3.79585 -2.46347 0.850994
+2.46347 -3.79585 0.850994
+0.995425 4.10531 0.974527
+-4.10531 0.995425 0.974527
+-0.995425 -4.10531 0.974527
+4.10531 -0.995425 0.974527
+3.86269 2.06449 -0.925077
+-2.06449 3.86269 -0.925077
+-3.86269 -2.06449 -0.925077
+2.06449 -3.86269 -0.925077
+2.13395 3.77089 -0.942991
+-3.77089 2.13395 -0.942991
+-2.13395 -3.77089 -0.942991
+3.77089 -2.13395 -0.942991
+2.60296 3.49326 -0.934329
+-3.49326 2.60296 -0.934329
+-2.60296 -3.49326 -0.934329
+3.49326 -2.60296 -0.934329
+3.12172 3.00469 0.942991
+-3.00469 3.12172 0.942991
+-3.12172 -3.00469 0.942991
+3.00469 -3.12172 0.942991
+1.54808 3.74272 -0.998737
+-3.74272 1.54808 -0.998737
+-1.54808 -3.74272 -0.998737
+3.74272 -1.54808 -0.998737
+0.909926 3.80486 0.996134
+-3.80486 0.909926 0.996134
+-0.909926 -3.80486 0.996134
+3.80486 -0.909926 0.996134
+1.87804 3.54593 0.999921
+-3.54593 1.87804 0.999921
+-1.87804 -3.54593 0.999921
+3.54593 -1.87804 0.999921
+2.95295 2.52784 0.993611
+-2.52784 2.95295 0.993611
+-2.95295 -2.52784 0.993611
+2.52784 -2.95295 0.993611
+2.15073 3.26791 -0.996134
+-3.26791 2.15073 -0.996134
+-2.15073 -3.26791 -0.996134
+3.26791 -2.15073 -0.996134
+3.58209 0.524052 0.925077
+-0.524052 3.58209 0.925077
+-3.58209 -0.524052 0.925077
+0.524052 -3.58209 0.925077
+3.89909 0.0651727 0.994951
+-0.0651727 3.89909 0.994951
+-3.89909 -0.0651727 0.994951
+0.0651727 -3.89909 0.994951
+2.64251 2.57692 0.951057
+-2.57692 2.64251 0.951057
+-2.64251 -2.57692 0.951057
+2.57692 -2.64251 0.951057
+1.83879 3.20034 -0.951057
+-3.20034 1.83879 -0.951057
+-1.83879 -3.20034 -0.951057
+3.20034 -1.83879 -0.951057
+3.16311 1.92526 -0.954865
+-1.92526 3.16311 -0.954865
+-3.16311 -1.92526 -0.954865
+1.92526 -3.16311 -0.954865
+3.60792 0.0711907 0.920232
+-0.0711907 3.60792 0.920232
+-3.60792 -0.0711907 0.920232
+0.0711907 -3.60792 0.920232
+1.23132 3.30753 0.882291
+-3.30753 1.23132 0.882291
+-1.23132 -3.30753 0.882291
+3.30753 -1.23132 0.882291
+3.46885 0.58746 -0.876307
+-0.58746 3.46885 -0.876307
+-3.46885 -0.58746 -0.876307
+0.58746 -3.46885 -0.876307
+3.16527 1.40768 -0.844328
+-1.40768 3.16527 -0.844328
+-3.16527 -1.40768 -0.844328
+1.40768 -3.16527 -0.844328
+2.17788 2.51202 -0.737513
+-2.51202 2.17788 -0.737513
+-2.17788 -2.51202 -0.737513
+2.51202 -2.17788 -0.737513
+0.663486 3.03447 -0.448383
+-3.03447 0.663486 -0.448383
+-0.663486 -3.03447 -0.448383
+3.03447 -0.663486 -0.448383
+2.2109 2.18989 0.45958
+-2.18989 2.2109 0.45958
+-2.2109 -2.18989 0.45958
+2.18989 -2.2109 0.45958
+0.496401 3.04976 0.414376
+-3.04976 0.496401 0.414376
+-0.496401 -3.04976 0.414376
+3.04976 -0.496401 0.414376
+0.277908 3.01268 -0.224271
+-3.01268 0.277908 -0.224271
+-0.277908 -3.01268 -0.224271
+3.01268 -0.277908 -0.224271
+0.674451 2.97341 0.309017
+-2.97341 0.674451 0.309017
+-0.674451 -2.97341 0.309017
+2.97341 -0.674451 0.309017
+0.315809 3.14666 0.546394
+-3.14666 0.315809 0.546394
+-0.315809 -3.14666 0.546394
+3.14666 -0.315809 0.546394
+2.15429 2.16895 -0.33282
+-2.16895 2.15429 -0.33282
+-2.15429 -2.16895 -0.33282
+2.16895 -2.15429 -0.33282
+2.5106 1.71683 -0.285019
+-1.71683 2.5106 -0.285019
+-2.5106 -1.71683 -0.285019
+1.71683 -2.5106 -0.285019
+1.19111 2.762 -0.125333
+-2.762 1.19111 -0.125333
+-1.19111 -2.762 -0.125333
+2.762 -1.19111 -0.125333
+2.82386 1.01866 -0.0627905
+-1.01866 2.82386 -0.0627905
+-2.82386 -1.01866 -0.0627905
+1.01866 -2.82386 -0.0627905
+1.22995 4.82809 0.187381
+-4.82809 1.22995 0.187381
+-1.22995 -4.82809 0.187381
+4.82809 -1.22995 0.187381
+0.312679 4.9899 0.0251301
+-4.9899 0.312679 0.0251301
+-0.312679 -4.9899 0.0251301
+4.9899 -0.312679 0.0251301
+4.74513 1.53322 -0.162637
+1.53322 4.74513 0.162637
+-1.53322 4.74513 -0.162637
+-4.74513 1.53322 0.162637
+-4.74513 -1.53322 -0.162637
+-1.53322 -4.74513 0.162637
+1.53322 -4.74513 -0.162637
+4.74513 -1.53322 0.162637
+0.324442 4.95798 -0.24869
+-4.95798 0.324442 -0.24869
+-0.324442 -4.95798 -0.24869
+4.95798 -0.324442 -0.24869
+1.24706 4.83677 -0.100362
+-4.83677 1.24706 -0.100362
+-1.24706 -4.83677 -0.100362
+4.83677 -1.24706 -0.100362
+4.00936 2.92917 0.260842
+-2.92917 4.00936 0.260842
+-4.00936 -2.92917 0.260842
+2.92917 -4.00936 0.260842
+4.85027 0.906932 -0.356412
+-0.906932 4.85027 -0.356412
+-4.85027 -0.906932 -0.356412
+0.906932 -4.85027 -0.356412
+1.195 4.7457 0.448383
+-4.7457 1.195 0.448383
+-1.195 -4.7457 0.448383
+4.7457 -1.195 0.448383
+4.60202 1.80403 -0.33282
+-1.80403 4.60202 -0.33282
+-4.60202 -1.80403 -0.33282
+1.80403 -4.60202 -0.33282
+3.91434 2.87638 0.51444
+-2.87638 3.91434 0.51444
+-3.91434 -2.87638 0.51444
+2.87638 -3.91434 0.51444
+3.76089 3.14004 0.437116
+-3.14004 3.76089 0.437116
+-3.76089 -3.14004 0.437116
+3.14004 -3.76089 0.437116
+4.48895 1.74541 -0.577573
+-1.74541 4.48895 -0.577573
+-4.48895 -1.74541 -0.577573
+1.74541 -4.48895 -0.577573
+0.853195 4.66005 0.675333
+-4.66005 0.853195 0.675333
+-0.853195 -4.66005 0.675333
+4.66005 -0.853195 0.675333
+3.63466 3.05175 0.666012
+-3.05175 3.63466 0.666012
+-3.63466 -3.05175 0.666012
+3.05175 -3.63466 0.666012
+4.36081 1.16769 0.857527
+-1.16769 4.36081 0.857527
+-4.36081 -1.16769 0.857527
+1.16769 -4.36081 0.857527
+4.5714 1.21055 0.684547
+-1.21055 4.5714 0.684547
+-4.5714 -1.21055 0.684547
+1.21055 -4.5714 0.684547
+4.44296 0.800183 -0.857527
+-0.800183 4.44296 -0.857527
+-4.44296 -0.800183 -0.857527
+0.800183 -4.44296 -0.857527
+0.6137 4.49412 -0.844328
+-4.49412 0.6137 -0.844328
+-0.6137 -4.49412 -0.844328
+4.49412 -0.6137 -0.844328
+4.08511 1.86989 -0.870184
+-1.86989 4.08511 -0.870184
+-4.08511 -1.86989 -0.870184
+1.86989 -4.08511 -0.870184
+3.02501 3.29189 0.882291
+-3.29189 3.02501 0.882291
+-3.02501 -3.29189 0.882291
+3.29189 -3.02501 0.882291
+2.57474 3.62751 0.893841
+-3.62751 2.57474 0.893841
+-2.57474 -3.62751 0.893841
+3.62751 -2.57474 0.893841
+1.0713 4.36313 0.870184
+-4.36313 1.0713 0.870184
+-1.0713 -4.36313 0.870184
+4.36313 -1.0713 0.870184
+4.08029 1.55942 -0.929776
+-1.55942 4.08029 -0.929776
+-4.08029 -1.55942 -0.929776
+1.55942 -4.08029 -0.929776
+1.12913 4.18311 -0.942991
+-4.18311 1.12913 -0.942991
+-1.12913 -4.18311 -0.942991
+4.18311 -1.12913 -0.942991
+1.64849 4.01975 -0.938734
+-4.01975 1.64849 -0.938734
+-1.64849 -4.01975 -0.938734
+4.01975 -1.64849 -0.938734
+4.20286 1.31207 -0.915241
+-1.31207 4.20286 -0.915241
+-4.20286 -1.31207 -0.915241
+1.31207 -4.20286 -0.915241
+4.28479 0.324221 0.954865
+-0.324221 4.28479 0.954865
+-4.28479 -0.324221 0.954865
+0.324221 -4.28479 0.954865
+4.28796 1.04885 -0.910106
+-1.04885 4.28796 -0.910106
+-4.28796 -1.04885 -0.910106
+1.04885 -4.28796 -0.910106
+2.23586 3.62708 0.965382
+-3.62708 2.23586 0.965382
+-2.23586 -3.62708 0.965382
+3.62708 -2.23586 0.965382
+3.95319 1.22214 -0.990461
+-1.22214 3.95319 -0.990461
+-3.95319 -1.22214 -0.990461
+1.22214 -3.95319 -0.990461
+4.19932 0.0575231 0.979855
+-0.0575231 4.19932 0.979855
+-4.19932 -0.0575231 0.979855
+0.0575231 -4.19932 0.979855
+2.41422 3.42136 0.982287
+-3.42136 2.41422 0.982287
+-2.41422 -3.42136 0.982287
+3.42136 -2.41422 0.982287
+4.0128 0.3148 0.999684
+-0.3148 4.0128 0.999684
+-4.0128 -0.3148 0.999684
+0.3148 -4.0128 0.999684
+2.44445 3.26082 -0.997159
+-3.26082 2.44445 -0.997159
+-2.44445 -3.26082 -0.997159
+3.26082 -2.44445 -0.997159
+1.15949 3.77573 0.998737
+-3.77573 1.15949 0.998737
+-1.15949 -3.77573 0.998737
+3.77573 -1.15949 0.998737
+3.73899 0.303722 0.968583
+-0.303722 3.73899 0.968583
+-3.73899 -0.303722 0.968583
+0.303722 -3.73899 0.968583
+3.13121 2.50922 -0.999921
+-2.50922 3.13121 -0.999921
+-3.13121 -2.50922 -0.999921
+2.50922 -3.13121 -0.999921
+2.57445 3.01199 -0.999289
+-3.01199 2.57445 -0.999289
+-2.57445 -3.01199 -0.999289
+3.01199 -2.57445 -0.999289
+2.28788 3.03444 -0.979855
+-3.03444 2.28788 -0.979855
+-2.28788 -3.03444 -0.979855
+3.03444 -2.28788 -0.979855
+1.44853 3.47357 -0.971632
+-3.47357 1.44853 -0.971632
+-1.44853 -3.47357 -0.971632
+3.47357 -1.44853 -0.971632
+3.64638 0.390046 -0.942991
+-0.390046 3.64638 -0.942991
+-3.64638 -0.390046 -0.942991
+0.390046 -3.64638 -0.942991
+2.09846 3.00744 0.942991
+-3.00744 2.09846 0.942991
+-2.09846 -3.00744 0.942991
+3.00744 -2.09846 0.942991
+2.69922 2.05435 0.79399
+-2.05435 2.69922 0.79399
+-2.69922 -2.05435 0.79399
+2.05435 -2.69922 0.79399
+0.376586 3.55433 0.904827
+-3.55433 0.376586 0.904827
+-0.376586 -3.55433 0.904827
+3.55433 -0.376586 0.904827
+3.25019 0.282938 0.675333
+-0.282938 3.25019 0.675333
+-3.25019 -0.282938 0.675333
+0.282938 -3.25019 0.675333
+3.47329 0.292246 0.857527
+-0.292246 3.47329 0.857527
+-3.47329 -0.292246 0.857527
+0.292246 -3.47329 0.857527
+3.38731 1.17593 0.910106
+-1.17593 3.38731 0.910106
+-3.38731 -1.17593 0.910106
+1.17593 -3.38731 0.910106
+0.144493 3.47182 0.850994
+-3.47182 0.144493 0.850994
+-0.144493 -3.47182 0.850994
+3.47182 -0.144493 0.850994
+2.87562 1.6686 0.737513
+-1.6686 2.87562 0.737513
+-2.87562 -1.6686 0.737513
+1.6686 -2.87562 0.737513
+1.64157 2.73635 0.587785
+-2.73635 1.64157 0.587785
+-1.64157 -2.73635 0.587785
+2.73635 -1.64157 0.587785
+3.09483 0.506932 -0.503623
+-0.506932 3.09483 -0.503623
+-3.09483 -0.506932 -0.503623
+0.506932 -3.09483 -0.503623
+0.87659 2.96845 0.425779
+-2.96845 0.87659 0.425779
+-0.87659 -2.96845 0.425779
+2.96845 -0.87659 0.425779
+2.98994 0.480881 -0.236499
+-0.480881 2.98994 -0.236499
+-2.98994 -0.480881 -0.236499
+0.480881 -2.98994 -0.236499
+0.294979 3.02714 0.285019
+-3.02714 0.294979 0.285019
+-0.294979 -3.02714 0.285019
+3.02714 -0.294979 0.285019
+2.04957 2.30543 0.402906
+-2.30543 2.04957 0.402906
+-2.04957 -2.30543 0.402906
+2.30543 -2.04957 0.402906
+2.86051 1.25496 -0.481754
+-1.25496 2.86051 -0.481754
+-2.86051 -1.25496 -0.481754
+1.25496 -2.86051 -0.481754
+2.77156 1.2064 -0.212007
+-1.2064 2.77156 -0.212007
+-2.77156 -1.2064 -0.212007
+1.2064 -2.77156 -0.212007
+1.38482 2.70022 0.260842
+-2.70022 1.38482 0.260842
+-1.38482 -2.70022 0.260842
+2.70022 -1.38482 0.260842
+2.58811 1.52709 0.100362
+-1.52709 2.58811 0.100362
+-2.58811 -1.52709 0.100362
+1.52709 -2.58811 0.100362
+1.20244 2.76532 0.175023
+-2.76532 1.20244 0.175023
+-1.20244 -2.76532 0.175023
+2.76532 -1.20244 0.175023
+1.04014 2.86199 0.297042
+-2.86199 1.04014 0.297042
+-1.04014 -2.86199 0.297042
+2.86199 -1.04014 0.297042
+1.53041 2.59821 -0.175023
+-2.59821 1.53041 -0.175023
+-1.53041 -2.59821 -0.175023
+2.59821 -1.53041 -0.175023
+1.01703 2.82268 0.0251301
+-2.82268 1.01703 0.0251301
+-1.01703 -2.82268 0.0251301
+2.82268 -1.01703 0.0251301
+2.12102 2.12262 -0.0376902
+-2.12262 2.12102 -0.0376902
+-2.12102 -2.12262 -0.0376902
+2.12262 -2.12102 -0.0376902
+2.48152 1.68598 0.012566
+-1.68598 2.48152 0.012566
+-2.48152 -1.68598 0.012566
+1.68598 -2.48152 0.012566
+1.36167 2.67326 -0.012566
+-2.67326 1.36167 -0.012566
+-1.36167 -2.67326 -0.012566
+2.67326 -1.36167 -0.012566
+2.75582 1.1905 0.0627905
+-1.1905 2.75582 0.0627905
+-2.75582 -1.1905 0.0627905
+1.1905 -2.75582 0.0627905
+2.67346 1.36389 -0.0502443
+-1.36389 2.67346 -0.0502443
+-2.67346 -1.36389 -0.0502443
+1.36389 -2.67346 -0.0502443
+0.614206 4.94183 0.19971
+-4.94183 0.614206 0.19971
+-0.614206 -4.94183 0.19971
+4.94183 -0.614206 0.19971
+0.923295 4.89351 0.19971
+-4.89351 0.923295 0.19971
+-0.923295 -4.89351 0.19971
+4.89351 -0.923295 0.19971
+4.90846 0.931865 -0.0878512
+-0.931865 4.90846 -0.0878512
+-4.90846 -0.931865 -0.0878512
+0.931865 -4.90846 -0.0878512
+4.37723 2.4107 0.0753268
+-2.4107 4.37723 0.0753268
+-4.37723 -2.4107 0.0753268
+2.4107 -4.37723 0.0753268
+0.629001 4.959 -0.0502443
+-4.959 0.629001 -0.0502443
+-0.629001 -4.959 -0.0502443
+4.959 -0.629001 -0.0502443
+4.83927 1.23733 -0.100362
+-1.23733 4.83927 -0.100362
+-4.83927 -1.23733 -0.100362
+1.23733 -4.83927 -0.100362
+4.32737 2.39743 0.320944
+-2.39743 4.32737 0.320944
+-4.32737 -2.39743 0.320944
+2.39743 -4.32737 0.320944
+2.09826 4.49269 0.285019
+-4.49269 2.09826 0.285019
+-2.09826 -4.49269 0.285019
+4.49269 -2.09826 0.285019
+4.91885 0.328089 0.368125
+-0.328089 4.91885 0.368125
+-4.91885 -0.328089 0.368125
+0.328089 -4.91885 0.368125
+2.04445 4.40633 0.51444
+-4.40633 2.04445 0.51444
+-2.04445 -4.40633 0.51444
+4.40633 -2.04445 0.51444
+4.67914 1.17136 -0.567269
+-1.17136 4.67914 -0.567269
+-4.67914 -1.17136 -0.567269
+1.17136 -4.67914 -0.567269
+4.4173 2.05089 -0.492727
+-2.05089 4.4173 -0.492727
+-4.4173 -2.05089 -0.492727
+2.05089 -4.4173 -0.492727
+4.78787 1.21137 -0.344643
+-1.21137 4.78787 -0.344643
+-4.78787 -1.21137 -0.344643
+1.21137 -4.78787 -0.344643
+0.894653 4.81137 0.448383
+-4.81137 0.894653 0.448383
+-0.894653 -4.81137 0.448383
+4.81137 -0.894653 0.448383
+0.59078 4.85805 0.448383
+-4.85805 0.59078 0.448383
+-0.59078 -4.85805 0.448383
+4.85805 -0.59078 0.448383
+4.79006 0.332198 0.597905
+-0.332198 4.79006 0.597905
+-4.79006 -0.332198 0.597905
+0.332198 -4.79006 0.597905
+0.271799 4.80133 0.587785
+-4.80133 0.271799 0.587785
+-0.271799 -4.80133 0.587785
+4.80133 -0.271799 0.587785
+0.562065 4.72091 0.656586
+-4.72091 0.562065 0.656586
+-0.562065 -4.72091 0.656586
+4.72091 -0.562065 0.656586
+1.96424 4.26288 0.720309
+-4.26288 1.96424 0.720309
+-1.96424 -4.26288 0.720309
+4.26288 -1.96424 0.720309
+4.27863 1.9728 -0.70265
+-1.9728 4.27863 -0.70265
+-4.27863 -1.9728 -0.70265
+1.9728 -4.27863 -0.70265
+2.02217 4.20506 -0.745941
+-4.20506 2.02217 -0.745941
+-2.02217 -4.20506 -0.745941
+4.20506 -2.02217 -0.745941
+0.249357 4.62097 0.778462
+-4.62097 0.249357 0.778462
+-0.249357 -4.62097 0.778462
+4.62097 -0.249357 0.778462
+4.51091 1.11661 -0.762443
+-1.11661 4.51091 -0.762443
+-4.51091 -1.11661 -0.762443
+1.11661 -4.51091 -0.762443
+3.03663 3.61389 -0.693653
+-3.61389 3.03663 -0.693653
+-3.03663 -3.61389 -0.693653
+3.61389 -3.03663 -0.693653
+1.86481 4.07536 0.876307
+-4.07536 1.86481 0.876307
+-1.86481 -4.07536 0.876307
+4.07536 -1.86481 0.876307
+2.9198 3.45717 -0.850994
+-3.45717 2.9198 -0.850994
+-2.9198 -3.45717 -0.850994
+3.45717 -2.9198 -0.850994
+1.93842 4.00383 -0.893841
+-4.00383 1.93842 -0.893841
+-1.93842 -4.00383 -0.893841
+4.00383 -1.93842 -0.893841
+4.33773 0.878422 0.904827
+-0.878422 4.33773 0.904827
+-4.33773 -0.878422 0.904827
+0.878422 -4.33773 0.904827
+1.42865 3.77649 0.999289
+-3.77649 1.42865 0.999289
+-1.42865 -3.77649 0.999289
+3.77649 -1.42865 0.999289
+1.25124 4.03471 0.974527
+-4.03471 1.25124 0.974527
+-1.25124 -4.03471 0.974527
+4.03471 -1.25124 0.974527
+1.28847 3.76024 -0.999684
+-3.76024 1.28847 -0.999684
+-1.28847 -3.76024 -0.999684
+3.76024 -1.28847 -0.999684
+2.63242 3.2723 0.979855
+-3.2723 2.63242 0.979855
+-2.63242 -3.2723 0.979855
+3.2723 -2.63242 0.979855
+4.10197 0.841417 0.982287
+-0.841417 4.10197 0.982287
+-4.10197 -0.841417 0.982287
+0.841417 -4.10197 0.982287
+4.04603 0.978359 -0.986686
+-0.978359 4.04603 -0.986686
+-4.04603 -0.978359 -0.986686
+0.978359 -4.04603 -0.986686
+2.85885 2.95679 -0.993611
+-2.95679 2.85885 -0.993611
+-2.85885 -2.95679 -0.993611
+2.95679 -2.85885 -0.993611
+1.52623 4.004 0.958522
+-4.004 1.52623 0.958522
+-1.52623 -4.004 0.958522
+4.004 -1.52623 0.958522
+3.60691 2.22218 -0.971632
+-2.22218 3.60691 -0.971632
+-3.60691 -2.22218 -0.971632
+2.22218 -3.60691 -0.971632
+0.561053 3.93507 -0.999684
+-3.93507 0.561053 -0.999684
+-0.561053 -3.93507 -0.999684
+3.93507 -0.561053 -0.999684
+3.88274 1.06115 0.999684
+-1.06115 3.88274 0.999684
+-3.88274 -1.06115 0.999684
+1.06115 -3.88274 0.999684
+3.40011 2.083 -0.999921
+-2.083 3.40011 -0.999921
+-3.40011 -2.083 -0.999921
+2.083 -3.40011 -0.999921
+1.70899 3.47741 -0.992115
+-3.47741 1.70899 -0.992115
+-1.70899 -3.47741 -0.992115
+3.47741 -1.70899 -0.992115
+2.25429 3.21267 0.997159
+-3.21267 2.25429 0.997159
+-2.25429 -3.21267 0.997159
+3.21267 -2.25429 0.997159
+4.09731 0.577357 0.990461
+-0.577357 4.09731 0.990461
+-4.09731 -0.577357 0.990461
+0.577357 -4.09731 0.990461
+3.80486 0.909926 -0.996134
+-0.909926 3.80486 -0.996134
+-3.80486 -0.909926 -0.996134
+0.909926 -3.80486 -0.996134
+3.79642 0.171385 -0.979855
+-0.171385 3.79642 -0.979855
+-3.79642 -0.171385 -0.979855
+0.171385 -3.79642 -0.979855
+0.165275 3.72338 0.962028
+-3.72338 0.165275 0.962028
+-0.165275 -3.72338 0.962028
+3.72338 -0.165275 0.962028
+3.14314 2.20137 -0.986686
+-2.20137 3.14314 -0.986686
+-3.14314 -2.20137 -0.986686
+2.20137 -3.14314 -0.986686
+3.8549 0.800838 0.998027
+-0.800838 3.8549 0.998027
+-3.8549 -0.800838 0.998027
+0.800838 -3.8549 0.998027
+0.305784 3.78797 -0.979855
+-3.78797 0.305784 -0.979855
+-0.305784 -3.78797 -0.979855
+3.78797 -0.305784 -0.979855
+0.532805 3.66443 -0.954865
+-3.66443 0.532805 -0.954865
+-0.532805 -3.66443 -0.954865
+3.66443 -0.532805 -0.954865
+3.73297 0.643293 -0.977268
+-0.643293 3.73297 -0.977268
+-3.73297 -0.643293 -0.977268
+0.643293 -3.73297 -0.977268
+3.84774 0.552055 0.993611
+-0.552055 3.84774 0.993611
+-3.84774 -0.552055 0.993611
+0.552055 -3.84774 0.993611
+3.61193 0.759835 0.951057
+-0.759835 3.61193 0.951057
+-3.61193 -0.759835 0.951057
+0.759835 -3.61193 0.951057
+2.40182 2.66233 0.910106
+-2.66233 2.40182 0.910106
+-2.40182 -2.66233 0.910106
+2.66233 -2.40182 0.910106
+2.93352 2.33811 -0.968583
+-2.33811 2.93352 -0.968583
+-2.93352 -2.33811 -0.968583
+2.33811 -2.93352 -0.968583
+3.63964 1.00455 0.974527
+-1.00455 3.63964 0.974527
+-3.63964 -1.00455 0.974527
+1.00455 -3.63964 0.974527
+2.4584 2.41068 0.830596
+-2.41068 2.4584 0.830596
+-2.4584 -2.41068 0.830596
+2.41068 -2.4584 0.830596
+0.295116 3.53933 -0.893841
+-3.53933 0.295116 -0.893841
+-0.295116 -3.53933 -0.893841
+3.53933 -0.295116 -0.893841
+3.40401 0.354604 -0.816339
+-0.354604 3.40401 -0.816339
+-3.40401 -0.354604 -0.816339
+0.354604 -3.40401 -0.816339
+3.54841 0.150807 -0.893841
+-0.150807 3.54841 -0.893841
+-3.54841 -0.150807 -0.893841
+0.150807 -3.54841 -0.893841
+2.51202 2.17788 0.737513
+-2.17788 2.51202 0.737513
+-2.51202 -2.17788 0.737513
+2.17788 -2.51202 0.737513
+0.344471 3.3352 0.762443
+-3.3352 0.344471 0.762443
+-0.344471 -3.3352 0.762443
+3.3352 -0.344471 0.762443
+3.36172 0.0760532 0.770513
+-0.0760532 3.36172 0.770513
+-3.36172 -0.0760532 0.770513
+0.0760532 -3.36172 0.770513
+2.91008 1.45614 0.666012
+-1.45614 2.91008 0.666012
+-2.91008 -1.45614 0.666012
+1.45614 -2.91008 0.666012
+0.0750325 3.41139 -0.809017
+-3.41139 0.0750325 -0.809017
+-0.0750325 -3.41139 -0.809017
+3.41139 -0.0750325 -0.809017
+3.34075 0.133571 -0.754251
+-0.133571 3.34075 -0.754251
+-3.34075 -0.133571 -0.754251
+0.133571 -3.34075 -0.754251
+3.08302 1.533 0.830596
+-1.533 3.08302 0.830596
+-3.08302 -1.533 0.830596
+1.533 -3.08302 0.830596
+0.0791288 3.22852 -0.637424
+-3.22852 0.0791288 -0.637424
+-0.0791288 -3.22852 -0.637424
+3.22852 -0.0791288 -0.637424
+1.14497 3.10177 0.720309
+-3.10177 1.14497 0.720309
+-1.14497 -3.10177 0.720309
+3.10177 -1.14497 0.720309
+2.69046 1.80089 0.647056
+-1.80089 2.69046 0.647056
+-2.69046 -1.80089 0.647056
+1.80089 -2.69046 0.647056
+3.25257 0.541586 -0.711536
+-0.541586 3.25257 -0.711536
+-3.25257 -0.541586 -0.711536
+0.541586 -3.25257 -0.711536
+2.03571 2.58261 0.70265
+-2.58261 2.03571 0.70265
+-2.03571 -2.58261 0.70265
+2.58261 -2.03571 0.70265
+0.127393 3.26855 0.684547
+-3.26855 0.127393 0.684547
+-0.127393 -3.26855 0.684547
+3.26855 -0.127393 0.684547
+3.01833 0.66115 0.414376
+-0.66115 3.01833 0.414376
+-3.01833 -0.66115 0.414376
+0.66115 -3.01833 0.414376
+2.81375 1.20588 0.344643
+-1.20588 2.81375 0.344643
+-2.81375 -1.20588 0.344643
+1.20588 -2.81375 0.344643
+3.18998 0.0801897 0.587785
+-0.0801897 3.18998 0.587785
+-3.18998 -0.0801897 0.587785
+0.0801897 -3.18998 0.587785
+3.22097 0.327355 -0.647056
+-0.327355 3.22097 -0.647056
+-3.22097 -0.327355 -0.647056
+0.327355 -3.22097 -0.647056
+2.93289 1.04011 0.45958
+-1.04011 2.93289 0.45958
+-2.93289 -1.04011 0.45958
+1.04011 -2.93289 0.45958
+1.21335 2.83611 -0.402906
+-2.83611 1.21335 -0.402906
+-1.21335 -2.83611 -0.402906
+2.83611 -1.21335 -0.402906
+2.93054 0.841426 0.309017
+-0.841426 2.93054 0.309017
+-2.93054 -0.841426 0.309017
+0.841426 -2.93054 0.309017
+0.843717 2.9427 -0.344643
+-2.9427 0.843717 -0.344643
+-0.843717 -2.9427 -0.344643
+2.9427 -0.843717 -0.344643
+1.56624 2.67593 -0.437116
+-2.67593 1.56624 -0.437116
+-1.56624 -2.67593 -0.437116
+2.67593 -1.56624 -0.437116
+1.53229 2.58503 0.100362
+-2.58503 1.53229 0.100362
+-1.53229 -2.58503 0.100362
+2.58503 -1.53229 0.100362
+2.92277 1.24392 0.567269
+-1.24392 2.92277 0.567269
+-2.92277 -1.24392 0.567269
+1.24392 -2.92277 0.567269
+0.845414 2.89229 0.162637
+-2.89229 0.845414 0.162637
+-0.845414 -2.89229 0.162637
+2.89229 -0.845414 0.162637
+2.59281 1.53955 -0.175023
+-1.53955 2.59281 -0.175023
+-2.59281 -1.53955 -0.175023
+1.53955 -2.59281 -0.175023
+2.84621 1.01784 0.212007
+-1.01784 2.84621 0.212007
+-2.84621 -1.01784 0.212007
+1.01784 -2.84621 0.212007
+2.6962 1.36653 0.212007
+-1.36653 2.6962 0.212007
+-2.6962 -1.36653 0.212007
+1.36653 -2.6962 0.212007
+0.652619 2.94397 -0.175023
+-2.94397 0.652619 -0.175023
+-0.652619 -2.94397 -0.175023
+2.94397 -0.652619 -0.175023
+1.86325 2.41837 -0.320944
+-2.41837 1.86325 -0.320944
+-1.86325 -2.41837 -0.320944
+2.41837 -1.86325 -0.320944
+1.56757 2.62946 0.344643
+-2.62946 1.56757 0.344643
+-1.56757 -2.62946 0.344643
+2.62946 -1.56757 0.344643
+2.77413 1.39728 0.448383
+-1.39728 2.77413 0.448383
+-2.77413 -1.39728 0.448383
+1.39728 -2.77413 0.448383
+1.70436 2.49641 0.212007
+-2.49641 1.70436 0.212007
+-1.70436 -2.49641 0.212007
+2.49641 -1.70436 0.212007
+1.01968 2.85477 -0.24869
+-2.85477 1.01968 -0.24869
+-1.01968 -2.85477 -0.24869
+2.85477 -1.01968 -0.24869
+2.93095 0.657852 -0.0878512
+-0.657852 2.93095 -0.0878512
+-2.93095 -0.657852 -0.0878512
+0.657852 -2.93095 -0.0878512
+1.99336 2.25473 0.13779
+-2.25473 1.99336 0.13779
+-1.99336 -2.25473 0.13779
+2.25473 -1.99336 0.13779
+2.94181 0.652529 0.162637
+-0.652529 2.94181 0.162637
+-2.94181 -0.652529 0.162637
+0.652529 -2.94181 0.162637
+3.63228 3.39465 -0.236499
+-3.39465 3.63228 -0.236499
+-3.63228 -3.39465 -0.236499
+3.39465 -3.63228 -0.236499
+3.64522 3.42222 -0.012566
+-3.42222 3.64522 -0.012566
+-3.64522 -3.42222 -0.012566
+3.42222 -3.64522 -0.012566
+4.83196 1.24776 0.13779
+-1.24776 4.83196 0.13779
+-4.83196 -1.24776 0.13779
+1.24776 -4.83196 0.13779
+2.11852 4.46127 -0.344643
+-4.46127 2.11852 -0.344643
+-2.11852 -4.46127 -0.344643
+4.46127 -2.11852 -0.344643
+2.61967 4.16486 0.391374
+-4.16486 2.61967 0.391374
+-2.61967 -4.16486 0.391374
+4.16486 -2.61967 0.391374
+2.8655 3.98073 0.425779
+-3.98073 2.8655 0.425779
+-2.8655 -3.98073 0.425779
+3.98073 -2.8655 0.425779
+2.91696 4.03294 0.212007
+-4.03294 2.91696 0.212007
+-2.91696 -4.03294 0.212007
+4.03294 -2.91696 0.212007
+2.30595 4.25256 0.546394
+-4.25256 2.30595 0.546394
+-2.30595 -4.25256 0.546394
+4.25256 -2.30595 0.546394
+2.83064 3.83995 -0.637424
+-3.83995 2.83064 -0.637424
+-2.83064 -3.83995 -0.637424
+3.83995 -2.83064 -0.637424
+2.08255 4.35863 -0.556876
+-4.35863 2.08255 -0.556876
+-2.08255 -4.35863 -0.556876
+4.35863 -2.08255 -0.556876
+1.21374 4.58811 -0.666012
+-4.58811 1.21374 -0.666012
+-1.21374 -4.58811 -0.666012
+4.58811 -1.21374 -0.666012
+2.55124 4.0765 0.587785
+-4.0765 2.55124 0.587785
+-2.55124 -4.0765 0.587785
+4.0765 -2.55124 0.587785
+4.22227 2.02914 0.728969
+-2.02914 4.22227 0.728969
+-4.22227 -2.02914 0.728969
+2.02914 -4.22227 0.728969
+2.22319 4.1234 0.728969
+-4.1234 2.22319 0.728969
+-2.22319 -4.1234 0.728969
+4.1234 -2.22319 0.728969
+2.73705 3.69449 -0.801567
+-3.69449 2.73705 -0.801567
+-2.73705 -3.69449 -0.801567
+3.69449 -2.73705 -0.801567
+1.17858 4.41258 -0.823533
+-4.41258 1.17858 -0.823533
+-1.17858 -4.41258 -0.823533
+4.41258 -1.17858 -0.823533
+1.61854 4.21432 0.857527
+-4.21432 1.61854 0.857527
+-1.61854 -4.21432 0.857527
+4.21432 -1.61854 0.857527
+4.1029 2.29807 0.711536
+-2.29807 4.1029 0.711536
+-4.1029 -2.29807 0.711536
+2.29807 -4.1029 0.711536
+3.94305 2.22027 0.850994
+-2.22027 3.94305 0.850994
+-3.94305 -2.22027 0.850994
+2.22027 -3.94305 0.850994
+3.80041 2.35459 -0.882291
+-2.35459 3.80041 -0.882291
+-3.80041 -2.35459 -0.882291
+2.35459 -3.80041 -0.882291
+2.91122 3.58461 0.786288
+-3.58461 2.91122 0.786288
+-2.91122 -3.58461 0.786288
+3.58461 -2.91122 0.786288
+0.323851 4.27276 -0.958522
+-4.27276 0.323851 -0.958522
+-0.323851 -4.27276 -0.958522
+4.27276 -0.323851 -0.958522
+0.049624 4.43684 -0.899405
+-4.43684 0.049624 -0.899405
+-0.049624 -4.43684 -0.899405
+4.43684 -0.049624 -0.899405
+2.12271 3.95963 0.870184
+-3.95963 2.12271 0.870184
+-2.12271 -3.95963 0.870184
+3.95963 -2.12271 0.870184
+2.78235 3.44181 0.904827
+-3.44181 2.78235 0.904827
+-2.78235 -3.44181 0.904827
+3.44181 -2.78235 0.904827
+4.05478 1.95995 0.863923
+-1.95995 4.05478 0.863923
+-4.05478 -1.95995 0.863923
+1.95995 -4.05478 0.863923
+4.20728 0.746279 -0.962028
+-0.746279 4.20728 -0.962028
+-4.20728 -0.746279 -0.962028
+0.746279 -4.20728 -0.962028
+4.12461 1.11612 0.962028
+-1.11612 4.12461 0.962028
+-4.12461 -1.11612 0.962028
+1.11612 -4.12461 0.962028
+1.41825 4.20435 -0.899405
+-4.20435 1.41825 -0.899405
+-1.41825 -4.20435 -0.899405
+4.20435 -1.41825 -0.899405
+3.86455 1.87879 0.954865
+-1.87879 3.86455 0.954865
+-3.86455 -1.87879 0.954865
+1.87879 -3.86455 0.954865
+1.35927 3.99961 -0.974527
+-3.99961 1.35927 -0.974527
+-1.35927 -3.99961 -0.974527
+3.99961 -1.35927 -0.974527
+3.9773 0.695696 -0.999289
+-0.695696 3.9773 -0.999289
+-3.9773 -0.695696 -0.999289
+0.695696 -3.9773 -0.999289
+2.01603 3.78114 0.958522
+-3.78114 2.01603 0.958522
+-2.01603 -3.78114 0.958522
+3.78114 -2.01603 0.958522
+3.76028 2.12857 0.947098
+-2.12857 3.76028 0.947098
+-3.76028 -2.12857 0.947098
+2.12857 -3.76028 0.947098
+3.14387 2.87591 -0.965382
+-2.87591 3.14387 -0.965382
+-3.14387 -2.87591 -0.965382
+2.87591 -3.14387 -0.965382
+3.8566 1.31716 0.997159
+-1.31716 3.8566 0.997159
+-3.8566 -1.31716 0.997159
+1.31716 -3.8566 0.997159
+0.0567979 4.22389 -0.974527
+-4.22389 0.0567979 -0.974527
+-0.0567979 -4.22389 -0.974527
+4.22389 -0.0567979 -0.974527
+3.6434 1.93495 -0.992115
+-1.93495 3.6434 -0.992115
+-3.6434 -1.93495 -0.992115
+1.93495 -3.6434 -0.992115
+2.98538 2.71854 -0.999289
+-2.71854 2.98538 -0.999289
+-2.98538 -2.71854 -0.999289
+2.71854 -2.98538 -0.999289
+3.67192 1.52204 0.999684
+-1.52204 3.67192 0.999684
+-3.67192 -1.52204 0.999684
+1.52204 -3.67192 0.999684
+3.88325 1.59935 0.979855
+-1.59935 3.88325 0.979855
+-3.88325 -1.59935 0.979855
+1.59935 -3.88325 0.979855
+3.66111 1.79014 0.997159
+-1.79014 3.66111 0.997159
+-3.66111 -1.79014 0.997159
+1.79014 -3.66111 0.997159
+0.315749 4.03792 -0.998737
+-4.03792 0.315749 -0.998737
+-0.315749 -4.03792 -0.998737
+4.03792 -0.315749 -0.998737
+0.411231 3.79038 0.982287
+-3.79038 0.411231 0.982287
+-0.411231 -3.79038 0.982287
+3.79038 -0.411231 0.982287
+3.43738 1.81502 -0.993611
+-1.81502 3.43738 -0.993611
+-3.43738 -1.81502 -0.993611
+1.81502 -3.43738 -0.993611
+1.33139 3.54631 0.977268
+-3.54631 1.33139 0.977268
+-1.33139 -3.54631 0.977268
+3.54631 -1.33139 0.977268
+1.74094 3.30915 0.965382
+-3.30915 1.74094 0.965382
+-1.74094 -3.30915 0.965382
+3.30915 -1.74094 0.965382
+2.82476 2.56062 -0.982287
+-2.56062 2.82476 -0.982287
+-2.82476 -2.56062 -0.982287
+2.56062 -2.82476 -0.982287
+3.45074 1.44003 0.965382
+-1.44003 3.45074 0.965382
+-3.45074 -1.44003 0.965382
+1.44003 -3.45074 0.965382
+2.56928 2.8336 0.984564
+-2.8336 2.56928 0.984564
+-2.56928 -2.8336 0.984564
+2.8336 -2.56928 0.984564
+2.69992 2.77911 -0.992115
+-2.77911 2.69992 -0.992115
+-2.69992 -2.77911 -0.992115
+2.77911 -2.69992 -0.992115
+3.62844 1.24892 0.986686
+-1.24892 3.62844 0.986686
+-3.62844 -1.24892 0.986686
+1.24892 -3.62844 0.986686
+0.782245 3.74413 -0.984564
+-3.74413 0.782245 -0.984564
+-0.782245 -3.74413 -0.984564
+3.74413 -0.782245 -0.984564
+0.0709646 3.61953 -0.925077
+-3.61953 0.0709646 -0.925077
+-0.0709646 -3.61953 -0.925077
+3.61953 -0.0709646 -0.925077
+2.76515 2.19314 -0.882291
+-2.19314 2.76515 -0.882291
+-2.76515 -2.19314 -0.882291
+2.19314 -2.76515 -0.882291
+2.66233 2.40182 -0.910106
+-2.40182 2.66233 -0.910106
+-2.66233 -2.40182 -0.910106
+2.40182 -2.66233 -0.910106
+0.745987 3.53068 -0.920232
+-3.53068 0.745987 -0.920232
+-0.745987 -3.53068 -0.920232
+3.53068 -0.745987 -0.920232
+2.55303 2.61604 -0.938734
+-2.61604 2.55303 -0.938734
+-2.55303 -2.61604 -0.938734
+2.61604 -2.55303 -0.938734
+3.24363 1.3627 0.876307
+-1.3627 3.24363 0.876307
+-3.24363 -1.3627 0.876307
+1.3627 -3.24363 0.876307
+1.36657 3.25399 -0.882291
+-3.25399 1.36657 -0.882291
+-1.36657 -3.25399 -0.882291
+3.25399 -1.36657 -0.882291
+0.979493 3.25804 0.801567
+-3.25804 0.979493 0.801567
+-0.979493 -3.25804 0.801567
+3.25804 -0.979493 0.801567
+2.4177 2.46619 -0.837528
+-2.46619 2.4177 -0.837528
+-2.4177 -2.46619 -0.837528
+2.46619 -2.4177 -0.837528
+3.26573 0.759767 -0.762443
+-0.759767 3.26573 -0.762443
+-3.26573 -0.759767 -0.762443
+0.759767 -3.26573 -0.762443
+1.1285 3.23102 -0.816339
+-3.23102 1.1285 -0.816339
+-1.1285 -3.23102 -0.816339
+3.23102 -1.1285 -0.816339
+3.39868 0.723453 0.850994
+-0.723453 3.39868 0.850994
+-3.39868 -0.723453 0.850994
+0.723453 -3.39868 0.850994
+1.86052 2.78939 -0.762443
+-2.78939 1.86052 -0.762443
+-1.86052 -2.78939 -0.762443
+2.78939 -1.86052 -0.762443
+2.25263 2.50961 0.778462
+-2.50961 2.25263 0.778462
+-2.25263 -2.50961 0.778462
+2.50961 -2.25263 0.778462
+0.479367 3.15477 -0.587785
+-3.15477 0.479367 -0.587785
+-0.479367 -3.15477 -0.587785
+3.15477 -0.479367 -0.587785
+0.752138 3.23847 0.737513
+-3.23847 0.752138 0.737513
+-0.752138 -3.23847 0.737513
+3.23847 -0.752138 0.737513
+2.52374 2.26646 -0.79399
+-2.26646 2.52374 -0.79399
+-2.52374 -2.26646 -0.79399
+2.26646 -2.52374 -0.79399
+0.530696 3.20207 0.656586
+-3.20207 0.530696 0.656586
+-0.530696 -3.20207 0.656586
+3.20207 -0.530696 0.656586
+1.29246 2.93395 0.60793
+-2.93395 1.29246 0.60793
+-1.29246 -2.93395 0.60793
+2.93395 -1.29246 0.60793
+0.866244 3.04873 -0.556876
+-3.04873 0.866244 -0.556876
+-0.866244 -3.04873 -0.556876
+3.04873 -0.866244 -0.556876
+3.07082 1.29828 0.745941
+-1.29828 3.07082 0.745941
+-3.07082 -1.29828 0.745941
+1.29828 -3.07082 0.745941
+1.30156 3.07967 -0.754251
+-3.07967 1.30156 -0.754251
+-1.30156 -3.07967 -0.754251
+3.07967 -1.30156 -0.754251
+1.04333 2.9443 -0.481754
+-2.9443 1.04333 -0.481754
+-1.04333 -2.9443 -0.481754
+2.9443 -1.04333 -0.481754
+2.73133 1.59407 0.546394
+-1.59407 2.73133 0.546394
+-2.73133 -1.59407 0.546394
+1.59407 -2.73133 0.546394
+2.46312 1.931 -0.492727
+-1.931 2.46312 -0.492727
+-2.46312 -1.931 -0.492727
+1.931 -2.46312 -0.492727
+2.14127 2.39643 0.61786
+-2.39643 2.14127 0.61786
+-2.14127 -2.39643 0.61786
+2.39643 -2.14127 0.61786
+0.27833 3.11127 -0.481754
+-3.11127 0.27833 -0.481754
+-0.27833 -3.11127 -0.481754
+3.11127 -0.27833 -0.481754
+1.08572 2.96302 0.535827
+-2.96302 1.08572 0.535827
+-1.08572 -2.96302 0.535827
+2.96302 -1.08572 0.535827
+0.70964 3.08894 0.556876
+-3.08894 0.70964 0.556876
+-0.70964 -3.08894 0.556876
+3.08894 -0.70964 0.556876
+3.17424 0.118924 -0.567269
+-0.118924 3.17424 -0.567269
+-3.17424 -0.118924 -0.567269
+0.118924 -3.17424 -0.567269
+3.03093 1.11492 -0.637424
+-1.11492 3.03093 -0.637424
+-3.03093 -1.11492 -0.637424
+1.11492 -3.03093 -0.637424
+0.922411 3.09495 0.637424
+-3.09495 0.922411 0.637424
+-0.922411 -3.09495 0.637424
+3.09495 -0.922411 0.637424
+1.50265 2.89584 0.675333
+-2.89584 1.50265 0.675333
+-1.50265 -2.89584 0.675333
+2.89584 -1.50265 0.675333
+2.40766 2.15239 -0.637424
+-2.15239 2.40766 -0.637424
+-2.40766 -2.15239 -0.637424
+2.15239 -2.40766 -0.637424
+1.07993 3.06963 -0.666012
+-3.06963 1.07993 -0.666012
+-1.07993 -3.06963 -0.666012
+3.06963 -1.07993 -0.666012
+2.59465 1.78438 -0.525175
+-1.78438 2.59465 -0.525175
+-2.59465 -1.78438 -0.525175
+1.78438 -2.59465 -0.525175
+2.64865 1.58127 -0.402906
+-1.58127 2.64865 -0.402906
+-2.64865 -1.58127 -0.402906
+1.58127 -2.64865 -0.402906
+1.87628 2.40326 0.309017
+-2.40326 1.87628 0.309017
+-1.87628 -2.40326 0.309017
+2.40326 -1.87628 0.309017
+2.31649 2.06096 -0.437116
+-2.06096 2.31649 -0.437116
+-2.31649 -2.06096 -0.437116
+2.06096 -2.31649 -0.437116
+0.83548 2.88657 -0.100362
+-2.88657 0.83548 -0.100362
+-0.83548 -2.88657 -0.100362
+2.88657 -0.83548 -0.100362
+0.100019 3.01378 0.175023
+-3.01378 0.100019 0.175023
+-0.100019 -3.01378 0.175023
+3.01378 -0.100019 0.175023
+1.23925 2.8305 0.414376
+-2.8305 1.23925 0.414376
+-1.23925 -2.8305 0.414376
+2.8305 -1.23925 0.414376
+2.88424 0.835592 0.0753268
+-0.835592 2.88424 0.0753268
+-2.88424 -0.835592 0.0753268
+0.835592 -2.88424 0.0753268
+4.71491 1.54639 0.272952
+-1.54639 4.71491 0.272952
+-4.71491 -1.54639 0.272952
+1.54639 -4.71491 0.272952
+2.39671 4.37521 0.150226
+-4.37521 2.39671 0.150226
+-2.39671 -4.37521 0.150226
+4.37521 -2.39671 0.150226
+2.12521 4.52369 0.0627905
+-4.52369 2.12521 0.0627905
+-2.12521 -4.52369 0.0627905
+4.52369 -2.12521 0.0627905
+2.41036 4.37922 -0.0502443
+-4.37922 2.41036 -0.0502443
+-2.41036 -4.37922 -0.0502443
+4.37922 -2.41036 -0.0502443
+4.94838 0.616914 -0.162637
+-0.616914 4.94838 -0.162637
+-4.94838 -0.616914 -0.162637
+0.616914 -4.94838 -0.162637
+4.95963 0.628447 0.0376902
+-0.628447 4.95963 0.0376902
+-4.95963 -0.628447 0.0376902
+0.628447 -4.95963 0.0376902
+2.13107 4.51256 -0.13779
+-4.51256 2.13107 -0.13779
+-2.13107 -4.51256 -0.13779
+4.51256 -2.13107 -0.13779
+1.82537 4.63586 0.187381
+-4.63586 1.82537 0.187381
+-1.82537 -4.63586 0.187381
+4.63586 -1.82537 0.187381
+4.75141 1.54779 0.0753268
+-1.54779 4.75141 0.0753268
+-4.75141 -1.54779 0.0753268
+1.54779 -4.75141 0.0753268
+3.41745 3.6255 -0.187381
+-3.6255 3.41745 -0.187381
+-3.41745 -3.6255 -0.187381
+3.6255 -3.41745 -0.187381
+2.36136 4.33262 0.356412
+-4.33262 2.36136 0.356412
+-2.36136 -4.33262 0.356412
+4.33262 -2.36136 0.356412
+2.37971 4.28266 -0.437116
+-4.28266 2.37971 -0.437116
+-2.37971 -4.28266 -0.437116
+4.28266 -2.37971 -0.437116
+4.23185 2.35774 0.535827
+-2.35774 4.23185 0.535827
+-4.23185 -2.35774 0.535827
+2.35774 -4.23185 0.535827
+2.40457 4.34797 -0.24869
+-4.34797 2.40457 -0.24869
+-2.40457 -4.34797 -0.24869
+4.34797 -2.40457 -0.24869
+4.89764 0.600591 -0.356412
+-0.600591 4.89764 -0.356412
+-4.89764 -0.600591 -0.356412
+0.600591 -4.89764 -0.356412
+3.38253 3.57312 -0.391374
+-3.57312 3.38253 -0.391374
+-3.38253 -3.57312 -0.391374
+3.57312 -3.38253 -0.391374
+2.33692 4.18582 -0.60793
+-4.18582 2.33692 -0.60793
+-2.33692 -4.18582 -0.60793
+4.18582 -2.33692 -0.60793
+3.02085 3.70245 0.627691
+-3.70245 3.02085 0.627691
+-3.02085 -3.70245 0.627691
+3.70245 -3.02085 0.627691
+3.09779 3.78121 0.45958
+-3.78121 3.09779 0.45958
+-3.09779 -3.78121 0.45958
+3.78121 -3.09779 0.45958
+4.4601 1.79838 0.587785
+-1.79838 4.4601 0.587785
+-4.4601 -1.79838 0.587785
+1.79838 -4.4601 0.587785
+4.80949 0.579968 -0.535827
+-0.579968 4.80949 -0.535827
+-4.80949 -0.579968 -0.535827
+0.579968 -4.80949 -0.535827
+3.58299 3.33344 -0.448383
+-3.33344 3.58299 -0.448383
+-3.58299 -3.33344 -0.448383
+3.33344 -3.58299 -0.448383
+0.929933 4.71066 -0.597905
+-4.71066 0.929933 -0.597905
+-0.929933 -4.71066 -0.597905
+4.71066 -0.929933 -0.597905
+4.53197 1.43672 -0.656586
+-1.43672 4.53197 -0.656586
+-4.53197 -1.43672 -0.656586
+1.43672 -4.53197 -0.656586
+4.352 2.08005 0.567269
+-2.08005 4.352 0.567269
+-4.352 -2.08005 0.567269
+2.08005 -4.352 0.567269
+2.78746 3.89084 0.61786
+-3.89084 2.78746 0.61786
+-2.78746 -3.89084 0.61786
+3.89084 -2.78746 0.61786
+0.332178 4.65417 -0.745941
+-4.65417 0.332178 -0.745941
+-0.332178 -4.65417 -0.745941
+4.65417 -0.332178 -0.745941
+4.32373 1.75414 0.745941
+-1.75414 4.32373 0.745941
+-4.32373 -1.75414 0.745941
+1.75414 -4.32373 0.745941
+3.5108 3.25313 -0.61786
+-3.25313 3.5108 -0.61786
+-3.5108 -3.25313 -0.61786
+3.25313 -3.5108 -0.61786
+4.84303 0.277823 -0.525175
+-0.277823 4.84303 -0.525175
+-4.84303 -0.277823 -0.525175
+0.277823 -4.84303 -0.525175
+3.32308 3.49622 -0.567269
+-3.49622 3.32308 -0.567269
+-3.32308 -3.49622 -0.567269
+3.49622 -3.32308 -0.567269
+3.41501 3.15164 -0.762443
+-3.15164 3.41501 -0.762443
+-3.41501 -3.15164 -0.762443
+3.15164 -3.41501 -0.762443
+0.912881 4.57584 -0.745941
+-4.57584 0.912881 -0.745941
+-0.912881 -4.57584 -0.745941
+4.57584 -0.912881 -0.745941
+0.329415 4.48063 -0.870184
+-4.48063 0.329415 -0.870184
+-0.329415 -4.48063 -0.870184
+4.48063 -0.329415 -0.870184
+0.530323 4.54675 0.816339
+-4.54675 0.530323 0.816339
+-0.530323 -4.54675 0.816339
+4.54675 -0.530323 0.816339
+2.46144 3.95286 0.754251
+-3.95286 2.46144 0.754251
+-2.46144 -3.95286 0.754251
+3.95286 -2.46144 0.754251
+4.51513 0.615413 0.830596
+-0.615413 4.51513 0.830596
+-4.51513 -0.615413 0.830596
+0.615413 -4.51513 0.830596
+3.76033 2.6804 -0.786288
+-2.6804 3.76033 -0.786288
+-3.76033 -2.6804 -0.786288
+2.6804 -3.76033 -0.786288
+4.72174 0.261341 -0.684547
+-0.261341 4.72174 -0.684547
+-4.72174 -0.261341 -0.684547
+0.261341 -4.72174 -0.684547
+2.69877 3.78309 0.762443
+-3.78309 2.69877 0.762443
+-2.69877 -3.78309 0.762443
+3.78309 -2.69877 0.762443
+4.62618 0.844591 -0.711536
+-0.844591 4.62618 -0.711536
+-4.62618 -0.844591 -0.711536
+0.844591 -4.62618 -0.711536
+2.36715 3.81853 0.870184
+-3.81853 2.36715 0.870184
+-2.36715 -3.81853 0.870184
+3.81853 -2.36715 0.870184
+3.24044 3.39557 -0.720309
+-3.39557 3.24044 -0.720309
+-3.24044 -3.39557 -0.720309
+3.39557 -3.24044 -0.720309
+4.39528 1.38367 -0.79399
+-1.38367 4.39528 -0.79399
+-4.39528 -1.38367 -0.79399
+1.38367 -4.39528 -0.79399
+3.61865 2.56776 -0.899405
+-2.56776 3.61865 -0.899405
+-3.61865 -2.56776 -0.899405
+2.56776 -3.61865 -0.899405
+0.499433 4.36288 0.920232
+-4.36288 0.499433 0.920232
+-0.499433 -4.36288 0.920232
+4.36288 -0.499433 0.920232
+3.02026 3.13948 -0.934329
+-3.13948 3.02026 -0.934329
+-3.02026 -3.13948 -0.934329
+3.13948 -3.02026 -0.934329
+3.13807 3.27509 -0.844328
+-3.27509 3.13807 -0.844328
+-3.13807 -3.27509 -0.844328
+3.27509 -3.13807 -0.844328
+3.29189 3.02501 -0.882291
+-3.02501 3.29189 -0.882291
+-3.29189 -3.02501 -0.882291
+3.02501 -3.29189 -0.882291
+4.31516 0.598102 0.934329
+-0.598102 4.31516 0.934329
+-4.31516 -0.598102 0.934329
+0.598102 -4.31516 0.934329
+1.0752 3.94391 -0.996134
+-3.94391 1.0752 -0.996134
+-1.0752 -3.94391 -0.996134
+3.94391 -1.0752 -0.996134
+3.46704 2.80491 -0.888136
+-2.80491 3.46704 -0.888136
+-3.46704 -2.80491 -0.888136
+2.80491 -3.46704 -0.888136
+4.23131 0.20967 -0.971632
+-0.20967 4.23131 -0.971632
+-4.23131 -0.20967 -0.971632
+0.20967 -4.23131 -0.971632
+3.31825 2.67283 -0.965382
+-2.67283 3.31825 -0.965382
+-3.31825 -2.67283 -0.965382
+2.67283 -3.31825 -0.965382
+3.85718 1.46305 -0.992115
+-1.46305 3.85718 -0.992115
+-3.85718 -1.46305 -0.992115
+1.46305 -3.85718 -0.992115
+2.86731 3.13527 0.968583
+-3.13527 2.86731 0.968583
+-2.86731 -3.13527 0.968583
+3.13527 -2.86731 0.968583
+4.20979 0.474942 -0.971632
+-0.474942 4.20979 -0.971632
+-4.20979 -0.474942 -0.971632
+0.474942 -4.20979 -0.971632
+1.76364 3.8787 0.965382
+-3.8787 1.76364 0.965382
+-1.76364 -3.8787 0.965382
+3.8787 -1.76364 0.965382
+2.72737 2.99432 0.998737
+-2.99432 2.72737 0.998737
+-2.72737 -2.99432 0.998737
+2.99432 -2.72737 0.998737
+3.46602 1.70393 0.990461
+-1.70393 3.46602 0.990461
+-3.46602 -1.70393 0.990461
+1.70393 -3.46602 0.990461
+4.02061 0.19062 -0.999684
+-0.19062 4.02061 -0.999684
+-4.02061 -0.19062 -0.999684
+0.19062 -4.02061 -0.999684
+1.02712 3.73605 -0.992115
+-3.73605 1.02712 -0.992115
+-1.02712 -3.73605 -0.992115
+3.73605 -1.02712 -0.992115
+3.64928 1.37476 -0.994951
+-1.37476 3.64928 -0.994951
+-3.64928 -1.37476 -0.994951
+1.37476 -3.64928 -0.994951
+3.23231 1.85554 0.962028
+-1.85554 3.23231 0.962028
+-3.23231 -1.85554 0.962028
+1.85554 -3.23231 0.962028
+1.67422 3.70179 0.998027
+-3.70179 1.67422 0.998027
+-1.67422 -3.70179 0.998027
+3.70179 -1.67422 0.998027
+3.40763 1.94708 0.997159
+-1.94708 3.40763 0.997159
+-3.40763 -1.94708 0.997159
+1.94708 -3.40763 0.997159
+3.27693 1.61967 0.938734
+-1.61967 3.27693 0.938734
+-3.27693 -1.61967 0.938734
+1.61967 -3.27693 0.938734
+3.55575 1.60118 -0.994951
+-1.60118 3.55575 -0.994951
+-3.55575 -1.60118 -0.994951
+1.60118 -3.55575 -0.994951
+3.05705 1.76362 0.882291
+-1.76362 3.05705 0.882291
+-3.05705 -1.76362 0.882291
+1.76362 -3.05705 0.882291
+3.36873 1.50832 -0.951057
+-1.50832 3.36873 -0.951057
+-3.36873 -1.50832 -0.951057
+1.50832 -3.36873 -0.951057
+2.42835 2.82737 -0.962028
+-2.82737 2.42835 -0.962028
+-2.42835 -2.82737 -0.962028
+2.82737 -2.42835 -0.962028
+0.937899 3.357 -0.857527
+-3.357 0.937899 -0.857527
+-0.937899 -3.357 -0.857527
+3.357 -0.937899 -0.857527
+2.96997 2.07009 -0.925077
+-2.07009 2.96997 -0.925077
+-2.96997 -2.07009 -0.925077
+2.07009 -2.96997 -0.925077
+0.565527 3.36502 0.809017
+-3.36502 0.565527 0.809017
+-0.565527 -3.36502 0.809017
+3.36502 -0.565527 0.809017
+3.22068 0.966496 -0.770513
+-0.966496 3.22068 -0.770513
+-3.22068 -0.966496 -0.770513
+0.966496 -3.22068 -0.770513
+0.979666 3.5339 -0.942991
+-3.5339 0.979666 -0.942991
+-0.979666 -3.5339 -0.942991
+3.5339 -0.979666 -0.942991
+2.31215 2.68115 -0.888136
+-2.68115 2.31215 -0.888136
+-2.31215 -2.68115 -0.888136
+2.68115 -2.31215 -0.888136
+1.73708 2.87914 0.770513
+-2.87914 1.73708 0.770513
+-1.73708 -2.87914 0.770513
+2.87914 -1.73708 0.770513
+0.712934 3.3369 -0.809017
+-3.3369 0.712934 -0.809017
+-0.712934 -3.3369 -0.809017
+3.3369 -0.712934 -0.809017
+3.38884 1.02486 -0.888136
+-1.02486 3.38884 -0.888136
+-3.38884 -1.02486 -0.888136
+1.02486 -3.38884 -0.888136
+2.86756 2.17168 0.915241
+-2.17168 2.86756 0.915241
+-2.86756 -2.17168 0.915241
+2.17168 -2.86756 0.915241
+1.48853 2.98324 -0.745941
+-2.98324 1.48853 -0.745941
+-1.48853 -2.98324 -0.745941
+2.98324 -1.48853 -0.745941
+3.18086 1.17825 -0.79399
+-1.17825 3.18086 -0.79399
+-3.18086 -1.17825 -0.79399
+1.17825 -3.18086 -0.79399
+2.84013 1.89127 0.809017
+-1.89127 2.84013 0.809017
+-2.84013 -1.89127 0.809017
+1.89127 -2.84013 0.809017
+2.99212 1.32168 -0.684547
+-1.32168 2.99212 -0.684547
+-2.99212 -1.32168 -0.684547
+1.32168 -2.99212 -0.684547
+3.19243 1.11682 0.786288
+-1.11682 3.19243 0.786288
+-3.19243 -1.11682 0.786288
+1.11682 -3.19243 0.786288
+1.96948 2.837 0.837528
+-2.837 1.96948 0.837528
+-1.96948 -2.837 0.837528
+2.837 -1.96948 0.837528
+0.510906 3.45885 -0.863923
+-3.45885 0.510906 -0.863923
+-0.510906 -3.45885 -0.863923
+3.45885 -0.510906 -0.863923
+0.601376 3.53483 0.910106
+-3.53483 0.601376 0.910106
+-0.601376 -3.53483 0.910106
+3.53483 -0.601376 0.910106
+2.98845 1.98138 0.910106
+-1.98138 2.98845 0.910106
+-2.98845 -1.98138 0.910106
+1.98138 -2.98845 0.910106
+2.82864 1.96314 -0.830596
+-1.96314 2.82864 -0.830596
+-2.82864 -1.96314 -0.830596
+1.96314 -2.82864 -0.830596
+2.31768 2.28414 0.666012
+-2.28414 2.31768 0.666012
+-2.31768 -2.28414 0.666012
+2.28414 -2.31768 0.666012
+1.35825 3.06552 0.762443
+-3.06552 1.35825 0.762443
+-1.35825 -3.06552 0.762443
+3.06552 -1.35825 0.762443
+0.898946 3.19126 -0.728969
+-3.19126 0.898946 -0.728969
+-0.898946 -3.19126 -0.728969
+3.19126 -0.898946 -0.728969
+1.43078 2.85223 -0.587785
+-2.85223 1.43078 -0.587785
+-1.43078 -2.85223 -0.587785
+2.85223 -1.43078 -0.587785
+2.70534 1.86953 -0.70265
+-1.86953 2.70534 -0.70265
+-2.70534 -1.86953 -0.70265
+1.86953 -2.70534 -0.70265
+2.74253 1.64575 -0.597905
+-1.64575 2.74253 -0.597905
+-2.74253 -1.64575 -0.597905
+1.64575 -2.74253 -0.597905
+0.493808 3.29722 -0.745941
+-3.29722 0.493808 -0.745941
+-0.493808 -3.29722 -0.745941
+3.29722 -0.493808 -0.745941
+1.87492 2.71242 0.711536
+-2.71242 1.87492 0.711536
+-1.87492 -2.71242 0.711536
+2.71242 -1.87492 0.711536
+1.62104 2.78398 -0.627691
+-2.78398 1.62104 -0.627691
+-1.62104 -2.78398 -0.627691
+2.78398 -1.62104 -0.627691
+0.686686 3.18078 -0.666012
+-3.18078 0.686686 -0.666012
+-0.686686 -3.18078 -0.666012
+3.18078 -0.686686 -0.666012
+3.11687 0.717707 -0.597905
+-0.717707 3.11687 -0.597905
+-3.11687 -0.717707 -0.597905
+0.717707 -3.11687 -0.597905
+3.2757 0.918733 0.801567
+-0.918733 3.2757 0.801567
+-3.2757 -0.918733 0.801567
+0.918733 -3.2757 0.801567
+2.87427 1.49008 -0.647056
+-1.49008 2.87427 -0.647056
+-2.87427 -1.49008 -0.647056
+1.49008 -2.87427 -0.647056
+1.25141 2.94346 -0.597905
+-2.94346 1.25141 -0.597905
+-1.25141 -2.94346 -0.597905
+2.94346 -1.25141 -0.597905
+2.38974 2.08189 0.556876
+-2.08189 2.38974 0.556876
+-2.38974 -2.08189 0.556876
+2.08189 -2.38974 0.556876
+0.0833712 3.09947 -0.437116
+-3.09947 0.0833712 -0.437116
+-0.0833712 -3.09947 -0.437116
+3.09947 -0.0833712 -0.437116
+1.94378 2.47749 0.525175
+-2.47749 1.94378 0.525175
+-1.94378 -2.47749 0.525175
+2.47749 -1.94378 0.525175
+1.7808 2.65683 -0.597905
+-2.65683 1.7808 -0.597905
+-1.7808 -2.65683 -0.597905
+2.65683 -1.7808 -0.597905
+1.98529 2.59966 -0.684547
+-2.59966 1.98529 -0.684547
+-1.98529 -2.59966 -0.684547
+2.59966 -1.98529 -0.684547
+3.1064 0.474813 0.51444
+-0.474813 3.1064 0.51444
+-3.1064 -0.474813 0.51444
+0.474813 -3.1064 0.51444
+1.43526 2.78133 0.492727
+-2.78133 1.43526 0.492727
+-1.43526 -2.78133 0.492727
+2.78133 -1.43526 0.492727
+3.0538 1.07522 0.647056
+-1.07522 3.0538 0.647056
+-3.0538 -1.07522 0.647056
+1.07522 -3.0538 0.647056
+3.10527 0.278187 0.470704
+-0.278187 3.10527 0.470704
+-3.10527 -0.278187 0.470704
+0.278187 -3.10527 0.470704
+2.26682 2.00811 -0.236499
+-2.00811 2.26682 -0.236499
+-2.26682 -2.00811 -0.236499
+2.00811 -2.26682 -0.236499
+2.22783 2.2543 -0.556876
+-2.2543 2.22783 -0.556876
+-2.22783 -2.2543 -0.556876
+2.2543 -2.22783 -0.556876
+3.09098 0.30669 -0.448383
+-0.30669 3.09098 -0.448383
+-3.09098 -0.30669 -0.448383
+0.30669 -3.09098 -0.448383
+2.70905 1.39064 -0.297042
+-1.39064 2.70905 -0.297042
+-2.70905 -1.39064 -0.297042
+1.39064 -2.70905 -0.297042
+2.64043 1.54903 0.344643
+-1.54903 2.64043 0.344643
+-2.64043 -1.54903 0.344643
+1.54903 -2.64043 0.344643
+1.69621 2.50876 -0.236499
+-2.50876 1.69621 -0.236499
+-1.69621 -2.50876 -0.236499
+2.50876 -1.69621 -0.236499
+1.91626 2.49884 -0.525175
+-2.49884 1.91626 -0.525175
+-1.91626 -2.49884 -0.525175
+2.49884 -1.91626 -0.525175
+2.51736 1.70064 0.272952
+-1.70064 2.51736 0.272952
+-2.51736 -1.70064 0.272952
+1.70064 -2.51736 0.272952
+2.46793 1.89552 0.45958
+-1.89552 2.46793 0.45958
+-2.46793 -1.89552 0.45958
+1.89552 -2.46793 0.45958
+2.77607 1.4321 -0.481754
+-1.4321 2.77607 -0.481754
+-2.77607 -1.4321 -0.481754
+1.4321 -2.77607 -0.481754
+3.02527 0.277536 0.272952
+-0.277536 3.02527 0.272952
+-3.02527 -0.277536 0.272952
+0.277536 -3.02527 0.272952
+0.0878961 3.02709 -0.236499
+-3.02709 0.0878961 -0.236499
+-0.0878961 -3.02709 -0.236499
+3.02709 -0.0878961 -0.236499
+2.58208 1.73682 0.45958
+-1.73682 2.58208 0.45958
+-2.58208 -1.73682 0.45958
+1.73682 -2.58208 0.45958
+3.06832 0.108006 -0.368125
+-0.108006 3.06832 -0.368125
+-3.06832 -0.108006 -0.368125
+0.108006 -3.06832 -0.368125
+2.39784 1.87108 -0.285019
+-1.87108 2.39784 -0.285019
+-2.39784 -1.87108 -0.285019
+1.87108 -2.39784 -0.285019
+2.3726 -1.8442 0.100362
+-2.3726 1.8442 0.100362
+1.8442 2.3726 0.100362
+-1.8442 -2.3726 0.100362
+1.68598 2.48152 -0.012566
+-2.48152 1.68598 -0.012566
+-1.68598 -2.48152 -0.012566
+2.48152 -1.68598 -0.012566
+3.01884 0.0887955 0.19971
+-0.0887955 3.01884 0.19971
+-3.01884 -0.0887955 0.19971
+0.0887955 -3.01884 0.19971
+2.9632 0.468943 0.012566
+-0.468943 2.9632 0.012566
+-2.9632 -0.468943 0.012566
+0.468943 -2.9632 0.012566
+0.468608 2.96349 -0.0251301
+-2.96349 0.468608 -0.0251301
+-0.468608 -2.96349 -0.0251301
+2.96349 -0.468608 -0.0251301
+3.07861 0.0843587 0.391374
+-0.0843587 3.07861 0.391374
+-3.07861 -0.0843587 0.391374
+0.0843587 -3.07861 0.391374
+2.26542 1.99016 0.175023
+-1.99016 2.26542 0.175023
+-2.26542 -1.99016 0.175023
+1.99016 -2.26542 0.175023
+0.656177 2.92865 0.0502443
+-2.92865 0.656177 0.0502443
+-0.656177 -2.92865 0.0502443
+2.92865 -0.656177 0.0502443
+2.3719 1.84318 -0.0878512
+-1.84318 2.3719 -0.0878512
+-2.3719 -1.84318 -0.0878512
+1.84318 -2.3719 -0.0878512
+-1.83943 -2.3763 -0.100362
+1.83943 2.3763 -0.100362
+-2.3763 1.83943 -0.100362
+2.3763 -1.83943 -0.100362
+2.25007 1.98471 -0.0251301
+-1.98471 2.25007 -0.0251301
+-2.25007 -1.98471 -0.0251301
+1.98471 -2.25007 -0.0251301
+2.14196 2.13282 0.212007
+-2.13282 2.14196 0.212007
+-2.14196 -2.13282 0.212007
+2.13282 -2.14196 0.212007
+0.283518 2.98729 0.0376902
+-2.98729 0.283518 0.0376902
+-0.283518 -2.98729 0.0376902
+2.98729 -0.283518 0.0376902
+0.0931239 2.99927 -0.0376902
+-2.99927 0.0931239 -0.0376902
+-0.0931239 -2.99927 -0.0376902
+2.99927 -0.0931239 -0.0376902
+2.31065 2.02168 0.368125
+-2.02168 2.31065 0.368125
+-2.31065 -2.02168 0.368125
+2.02168 -2.31065 0.368125
+0.476957 2.97748 0.175023
+-2.97748 0.476957 0.175023
+-0.476957 -2.97748 0.175023
+2.97748 -0.476957 0.175023
+1.72847 2.56758 -0.425779
+-2.56758 1.72847 -0.425779
+-1.72847 -2.56758 -0.425779
+2.56758 -1.72847 -0.425779
+3.02039 0.293554 -0.260842
+-0.293554 3.02039 -0.260842
+-3.02039 -0.293554 -0.260842
+0.293554 -3.02039 -0.260842
+3.37146 3.61474 0.33282
+-3.61474 3.37146 0.33282
+-3.37146 -3.61474 0.33282
+3.61474 -3.37146 0.33282
+2.67962 4.22124 -0.012566
+-4.22124 2.67962 -0.012566
+-2.67962 -4.22124 -0.012566
+4.22124 -2.67962 -0.012566
+2.66171 4.21171 0.187381
+-4.21171 2.66171 0.187381
+-2.66171 -4.21171 0.187381
+4.21171 -2.66171 0.187381
+4.64603 1.83409 -0.100362
+-1.83409 4.64603 -0.100362
+-4.64603 -1.83409 -0.100362
+1.83409 -4.64603 -0.100362
+4.97833 0.320748 0.150226
+-0.320748 4.97833 0.150226
+-4.97833 -0.320748 0.150226
+0.320748 -4.97833 0.150226
+4.52331 2.1299 0.0251301
+-2.1299 4.52331 0.0251301
+-4.52331 -2.1299 0.0251301
+2.1299 -4.52331 0.0251301
+3.15233 3.83204 0.272952
+-3.83204 3.15233 0.272952
+-3.15233 -3.83204 0.272952
+3.83204 -3.15233 0.272952
+2.93694 4.02744 -0.175023
+-4.02744 2.93694 -0.175023
+-2.93694 -4.02744 -0.175023
+4.02744 -2.93694 -0.175023
+1.54746 4.75243 -0.0627905
+-4.75243 1.54746 -0.0627905
+-1.54746 -4.75243 -0.0627905
+4.75243 -1.54746 -0.0627905
+1.84118 4.64858 -0.012566
+-4.64858 1.84118 -0.012566
+-1.84118 -4.64858 -0.012566
+4.64858 -1.84118 -0.012566
+4.49903 2.12883 0.212007
+-2.12883 4.49903 0.212007
+-4.49903 -2.12883 0.212007
+2.12883 -4.49903 0.212007
+4.64485 1.84308 0.0753268
+-1.84308 4.64485 0.0753268
+-4.64485 -1.84308 0.0753268
+1.84308 -4.64485 0.0753268
+1.54725 4.72153 -0.24869
+-4.72153 1.54725 -0.24869
+-1.54725 -4.72153 -0.24869
+4.72153 -1.54725 -0.24869
+2.93837 4.04539 0.012566
+-4.04539 2.93837 0.012566
+-2.93837 -4.04539 0.012566
+4.04539 -2.93837 0.012566
+-3.85239 3.18127 0.0878512
+-3.18127 -3.85239 0.0878512
+3.18127 3.85239 0.0878512
+3.85239 -3.18127 0.0878512
+3.6233 3.41624 0.19971
+-3.41624 3.6233 0.19971
+-3.6233 -3.41624 0.19971
+3.41624 -3.6233 0.19971
+4.9899 0.312679 -0.0251301
+-0.312679 4.9899 -0.0251301
+-4.9899 -0.312679 -0.0251301
+0.312679 -4.9899 -0.0251301
+2.67679 4.19926 -0.19971
+-4.19926 2.67679 -0.19971
+-2.67679 -4.19926 -0.19971
+4.19926 -2.67679 -0.19971
+4.93388 0.634635 0.224271
+-0.634635 4.93388 0.224271
+-4.93388 -0.634635 0.224271
+0.634635 -4.93388 0.224271
+4.61186 1.84006 0.260842
+-1.84006 4.61186 0.260842
+-4.61186 -1.84006 0.260842
+1.84006 -4.61186 0.260842
+4.90251 0.94159 0.125333
+-0.94159 4.90251 0.125333
+-4.90251 -0.94159 0.125333
+0.94159 -4.90251 0.125333
+1.83315 4.58117 -0.356412
+-4.58117 1.83315 -0.356412
+-1.83315 -4.58117 -0.356412
+4.58117 -1.83315 -0.356412
+1.84283 4.62895 -0.187381
+-4.62895 1.84283 -0.187381
+-1.84283 -4.62895 -0.187381
+4.62895 -1.84283 -0.187381
+3.84999 3.18825 0.0502443
+-3.18825 3.84999 0.0502443
+-3.84999 -3.18825 0.0502443
+3.18825 -3.84999 0.0502443
+3.31082 3.56317 0.503623
+-3.56317 3.31082 0.503623
+-3.31082 -3.56317 0.503623
+3.56317 -3.31082 0.503623
+3.82576 3.17954 0.224271
+-3.17954 3.82576 0.224271
+-3.82576 -3.17954 0.224271
+3.17954 -3.82576 0.224271
+3.40768 3.64071 0.162637
+-3.64071 3.40768 0.162637
+-3.40768 -3.64071 0.162637
+3.64071 -3.40768 0.162637
+4.43873 2.11123 0.402906
+-2.11123 4.43873 0.402906
+-4.43873 -2.11123 0.402906
+2.11123 -4.43873 0.402906
+4.63589 1.53145 0.470704
+-1.53145 4.63589 0.470704
+-4.63589 -1.53145 0.470704
+1.53145 -4.63589 0.470704
+1.24594 4.78763 -0.320944
+-4.78763 1.24594 -0.320944
+-1.24594 -4.78763 -0.320944
+4.78763 -1.24594 -0.320944
+2.65718 4.15236 -0.368125
+-4.15236 2.65718 -0.368125
+-2.65718 -4.15236 -0.368125
+4.15236 -2.65718 -0.368125
+4.86428 0.943124 0.297042
+-0.943124 4.86428 0.297042
+-4.86428 -0.943124 0.297042
+0.943124 -4.86428 0.297042
+4.92569 0.291881 -0.356412
+-0.291881 4.92569 -0.356412
+-4.92569 -0.291881 -0.356412
+0.291881 -4.92569 -0.356412
+4.77922 1.24504 0.344643
+-1.24504 4.77922 0.344643
+-4.77922 -1.24504 0.344643
+1.24504 -4.77922 0.344643
+1.53618 4.65806 -0.425779
+-4.65806 1.53618 -0.425779
+-1.53618 -4.65806 -0.425779
+4.65806 -1.53618 -0.425779
+4.87389 0.63626 0.402906
+-0.63626 4.87389 0.402906
+-4.87389 -0.63626 0.402906
+0.63626 -4.87389 0.402906
+1.23545 4.71088 -0.492727
+-4.71088 1.23545 -0.492727
+-1.23545 -4.71088 -0.492727
+4.71088 -1.23545 -0.492727
+0.288285 4.90678 0.402906
+-4.90678 0.288285 0.402906
+-0.288285 -4.90678 0.402906
+4.90678 -0.288285 0.402906
+3.5809 3.38819 0.368125
+-3.38819 3.5809 0.368125
+-3.5809 -3.38819 0.368125
+3.38819 -3.5809 0.368125
+1.51651 4.57136 -0.577573
+-4.57136 1.51651 -0.577573
+-1.51651 -4.57136 -0.577573
+4.57136 -1.51651 -0.577573
+2.56807 3.98108 -0.675333
+-3.98108 2.56807 -0.675333
+-2.56807 -3.98108 -0.675333
+3.98108 -2.56807 -0.675333
+4.7503 0.877123 -0.556876
+-0.877123 4.7503 -0.556876
+-4.7503 -0.877123 -0.556876
+0.877123 -4.7503 -0.556876
+4.55241 1.82563 0.425779
+-1.82563 4.55241 0.425779
+-4.55241 -1.82563 0.425779
+1.82563 -4.55241 0.425779
+2.61881 4.07546 -0.535827
+-4.07546 2.61881 -0.535827
+-2.61881 -4.07546 -0.535827
+4.07546 -2.61881 -0.535827
+4.70466 1.23446 0.503623
+-1.23446 4.70466 0.503623
+-4.70466 -1.23446 0.503623
+1.23446 -4.70466 0.503623
+0.634036 4.7958 -0.546394
+-4.7958 0.634036 -0.546394
+-0.634036 -4.7958 -0.546394
+4.7958 -0.634036 -0.546394
+0.627492 4.67842 -0.693653
+-4.67842 0.627492 -0.693653
+-0.627492 -4.67842 -0.693653
+4.67842 -0.627492 -0.693653
+4.54208 1.50933 0.61786
+-1.50933 4.54208 0.61786
+-4.54208 -1.50933 0.61786
+1.50933 -4.54208 0.61786
+4.78176 0.633403 0.567269
+-0.633403 4.78176 0.567269
+-4.78176 -0.633403 0.567269
+0.633403 -4.78176 0.567269
+4.66964 0.626913 0.70265
+-0.626913 4.66964 0.70265
+-4.66964 -0.626913 0.70265
+0.626913 -4.66964 0.70265
+0.332275 4.78246 -0.60793
+-4.78246 0.332275 -0.60793
+-0.332275 -4.78246 -0.60793
+4.78246 -0.332275 -0.60793
+0.0345905 4.74582 -0.666012
+-4.74582 0.0345905 -0.666012
+-0.0345905 -4.74582 -0.666012
+4.74582 -0.0345905 -0.666012
+4.16109 2.24689 -0.684547
+-2.24689 4.16109 -0.684547
+-4.16109 -2.24689 -0.684547
+2.24689 -4.16109 -0.684547
+4.68749 0.555696 -0.693653
+-0.555696 4.68749 -0.693653
+-4.68749 -0.555696 -0.693653
+0.555696 -4.68749 -0.693653
+3.58461 2.91122 -0.786288
+-2.91122 3.58461 -0.786288
+-3.58461 -2.91122 -0.786288
+2.91122 -3.58461 -0.786288
+4.0496 2.17749 -0.801567
+-2.17749 4.0496 -0.801567
+-4.0496 -2.17749 -0.801567
+2.17749 -4.0496 -0.801567
+4.54675 0.530323 -0.816339
+-0.530323 4.54675 -0.816339
+-4.54675 -0.530323 -0.816339
+0.530323 -4.54675 -0.816339
+0.0417808 4.61767 -0.786288
+-4.61767 0.0417808 -0.786288
+-0.0417808 -4.61767 -0.786288
+4.61767 -0.0417808 -0.786288
+2.49967 3.85906 -0.801567
+-3.85906 2.49967 -0.801567
+-2.49967 -3.85906 -0.801567
+3.85906 -2.49967 -0.801567
+4.41991 0.227925 -0.904827
+-0.227925 4.41991 -0.904827
+-4.41991 -0.227925 -0.904827
+0.227925 -4.41991 -0.904827
+4.58124 0.244904 -0.809017
+-0.244904 4.58124 -0.809017
+-4.58124 -0.244904 -0.809017
+0.244904 -4.58124 -0.809017
+4.63518 0.331994 0.762443
+-0.331994 4.63518 0.762443
+-4.63518 -0.331994 0.762443
+0.331994 -4.63518 0.762443
+4.39687 0.505003 -0.904827
+-0.505003 4.39687 -0.904827
+-4.39687 -0.505003 -0.904827
+0.505003 -4.39687 -0.904827
+4.49154 0.329649 0.863923
+-0.329649 4.49154 0.863923
+-4.49154 -0.329649 0.863923
+0.329649 -4.49154 0.863923
+0.229065 4.4312 0.899405
+-4.4312 0.229065 0.899405
+-0.229065 -4.4312 0.899405
+4.4312 -0.229065 0.899405
+3.73538 1.69111 -0.994951
+-1.69111 3.73538 -0.994951
+-3.73538 -1.69111 -0.994951
+1.69111 -3.73538 -0.994951
+3.46991 2.45175 -0.968583
+-2.45175 3.46991 -0.968583
+-3.46991 -2.45175 -0.968583
+2.45175 -3.46991 -0.968583
+2.42495 3.72931 -0.893841
+-3.72931 2.42495 -0.893841
+-2.42495 -3.72931 -0.893841
+3.72931 -2.42495 -0.893841
+0.748917 4.21907 0.958522
+-4.21907 0.748917 0.958522
+-0.748917 -4.21907 0.958522
+4.21907 -0.748917 0.958522
+3.60892 2.35442 0.951057
+-2.35442 3.60892 0.951057
+-3.60892 -2.35442 0.951057
+2.35442 -3.60892 0.951057
+3.88951 1.76914 -0.962028
+-1.76914 3.88951 -0.962028
+-3.88951 -1.76914 -0.962028
+1.76914 -3.88951 -0.962028
+0.213083 4.26764 0.962028
+-4.26764 0.213083 0.962028
+-0.213083 -4.26764 0.962028
+4.26764 -0.213083 0.962028
+1.59004 3.53338 0.992115
+-3.53338 1.59004 0.992115
+-1.59004 -3.53338 0.992115
+3.53338 -1.59004 0.992115
+0.845329 4.12631 -0.977268
+-4.12631 0.845329 -0.977268
+-0.845329 -4.12631 -0.977268
+4.12631 -0.845329 -0.977268
+3.3225 2.33821 -0.998027
+-2.33821 3.3225 -0.998027
+-3.3225 -2.33821 -0.998027
+2.33821 -3.3225 -0.998027
+3.46153 2.26696 0.990461
+-2.26696 3.46153 0.990461
+-3.46153 -2.26696 0.990461
+2.26696 -3.46153 0.990461
+3.32263 2.48687 0.988652
+-2.48687 3.32263 0.988652
+-3.32263 -2.48687 0.988652
+2.48687 -3.32263 0.988652
+2.10399 3.43146 0.999684
+-3.43146 2.10399 0.999684
+-2.10399 -3.43146 0.999684
+3.43146 -2.10399 0.999684
+3.02433 2.28085 0.977268
+-2.28085 3.02433 0.977268
+-3.02433 -2.28085 0.977268
+2.28085 -3.02433 0.977268
+0.711702 4.05081 0.993611
+-4.05081 0.711702 0.993611
+-0.711702 -4.05081 0.993611
+4.05081 -0.711702 0.993611
+3.14029 2.67525 0.992115
+-2.67525 3.14029 0.992115
+-3.14029 -2.67525 0.992115
+2.67525 -3.14029 0.992115
+2.48448 3.10273 0.999684
+-3.10273 2.48448 0.999684
+-2.48448 -3.10273 0.999684
+3.10273 -2.48448 0.999684
+0.0622125 4.02465 -0.999684
+-4.02465 0.0622125 -0.999684
+-0.0622125 -4.02465 -0.999684
+4.02465 -0.0622125 -0.999684
+2.02798 3.56374 -0.994951
+-3.56374 2.02798 -0.994951
+-2.02798 -3.56374 -0.994951
+3.56374 -2.02798 -0.994951
+0.4427 4.00071 0.999684
+-4.00071 0.4427 0.999684
+-0.4427 -4.00071 0.999684
+4.00071 -0.4427 0.999684
+3.58596 2.03943 0.992115
+-2.03943 3.58596 0.992115
+-3.58596 -2.03943 0.992115
+2.03943 -3.58596 0.992115
+0.817302 3.95411 -0.999289
+-3.95411 0.817302 -0.999289
+-0.817302 -3.95411 -0.999289
+3.95411 -0.817302 -0.999289
+3.17804 2.38739 0.999684
+-2.38739 3.17804 0.999684
+-3.17804 -2.38739 0.999684
+2.38739 -3.17804 0.999684
+2.94744 2.85053 0.994951
+-2.85053 2.94744 0.994951
+-2.94744 -2.85053 0.994951
+2.85053 -2.94744 0.994951
+0.469244 4.17341 0.979855
+-4.17341 0.469244 0.979855
+-0.469244 -4.17341 0.979855
+4.17341 -0.469244 0.979855
+2.36209 2.96132 0.977268
+-2.96132 2.36209 0.977268
+-2.36209 -2.96132 0.977268
+2.96132 -2.36209 0.977268
+3.7284 1.1429 -0.994951
+-1.1429 3.7284 -0.994951
+-3.7284 -1.1429 -0.994951
+1.1429 -3.7284 -0.994951
+1.94708 3.40763 -0.997159
+-3.40763 1.94708 -0.997159
+-1.94708 -3.40763 -0.997159
+3.40763 -1.94708 -0.997159
+1.99967 3.27516 0.986686
+-3.27516 1.99967 0.986686
+-1.99967 -3.27516 0.986686
+3.27516 -1.99967 0.986686
+3.30014 2.17017 0.998737
+-2.17017 3.30014 0.998737
+-3.30014 -2.17017 0.998737
+2.17017 -3.30014 0.998737
+2.81635 2.73335 0.997159
+-2.73335 2.81635 0.997159
+-2.81635 -2.73335 0.997159
+2.73335 -2.81635 0.997159
+2.16511 2.85814 -0.910106
+-2.85814 2.16511 -0.910106
+-2.16511 -2.85814 -0.910106
+2.85814 -2.16511 -0.910106
+3.5653 1.08605 -0.962028
+-1.08605 3.5653 -0.962028
+-3.5653 -1.08605 -0.962028
+1.08605 -3.5653 -0.962028
+3.15109 2.08009 0.974527
+-2.08009 3.15109 0.974527
+-3.15109 -2.08009 0.974527
+2.08009 -3.15109 0.974527
+0.182997 3.93295 0.998027
+-3.93295 0.182997 0.998027
+-0.182997 -3.93295 0.998027
+3.93295 -0.182997 0.998027
+3.86415 0.422183 -0.993611
+-0.422183 3.86415 -0.993611
+-3.86415 -0.422183 -0.993611
+0.422183 -3.86415 -0.993611
+1.50832 3.36873 0.951057
+-3.36873 1.50832 0.951057
+-1.50832 -3.36873 0.951057
+3.36873 -1.50832 0.951057
+3.44336 0.958294 0.904827
+-0.958294 3.44336 0.904827
+-3.44336 -0.958294 0.904827
+0.958294 -3.44336 0.904827
+0.0665426 3.83679 -0.986686
+-3.83679 0.0665426 -0.986686
+-0.0665426 -3.83679 -0.986686
+3.83679 -0.0665426 -0.986686
+3.47894 1.3031 -0.958522
+-1.3031 3.47894 -0.958522
+-3.47894 -1.3031 -0.958522
+1.3031 -3.47894 -0.958522
+0.843983 3.56874 0.942991
+-3.56874 0.843983 0.942991
+-0.843983 -3.56874 0.942991
+3.56874 -0.843983 0.942991
+2.02992 3.06837 -0.947098
+-3.06837 2.02992 -0.947098
+-2.02992 -3.06837 -0.947098
+3.06837 -2.02992 -0.947098
+1.17926 3.3983 -0.915241
+-3.3983 1.17926 -0.915241
+-1.17926 -3.3983 -0.915241
+3.3983 -1.17926 -0.915241
+3.59169 0.850363 -0.951057
+-0.850363 3.59169 -0.951057
+-3.59169 -0.850363 -0.951057
+0.850363 -3.59169 -0.951057
+0.638202 3.70899 0.971632
+-3.70899 0.638202 0.971632
+-0.638202 -3.70899 0.971632
+3.70899 -0.638202 0.971632
+0.798258 3.40403 0.863923
+-3.40403 0.798258 0.863923
+-0.798258 -3.40403 0.863923
+3.40403 -0.798258 0.863923
+1.55033 3.1218 -0.857527
+-3.1218 1.55033 -0.857527
+-1.55033 -3.1218 -0.857527
+3.1218 -1.55033 -0.857527
+1.61967 3.27693 -0.938734
+-3.27693 1.61967 -0.938734
+-1.61967 -3.27693 -0.938734
+3.27693 -1.61967 -0.938734
+2.98173 1.80511 -0.857527
+-1.80511 2.98173 -0.857527
+-2.98173 -1.80511 -0.857527
+1.80511 -2.98173 -0.857527
+3.36501 0.500935 0.801567
+-0.500935 3.36501 0.801567
+-3.36501 -0.500935 0.801567
+0.500935 -3.36501 0.801567
+1.03593 3.4208 0.904827
+-3.4208 1.03593 0.904827
+-1.03593 -3.4208 0.904827
+3.4208 -1.03593 0.904827
+2.24492 2.82533 0.920232
+-2.82533 2.24492 0.920232
+-2.24492 -2.82533 0.920232
+2.82533 -2.24492 0.920232
+2.99949 1.56266 -0.786288
+-1.56266 2.99949 -0.786288
+-2.99949 -1.56266 -0.786288
+1.56266 -2.99949 -0.786288
+1.43167 3.21378 0.876307
+-3.21378 1.43167 0.876307
+-1.43167 -3.21378 0.876307
+3.21378 -1.43167 0.876307
+1.94635 2.93083 -0.876307
+-2.93083 1.94635 -0.876307
+-1.94635 -2.93083 -0.876307
+2.93083 -1.94635 -0.876307
+1.5777 3.02557 0.809017
+-3.02557 1.5777 0.809017
+-1.5777 -3.02557 0.809017
+3.02557 -1.5777 0.809017
+3.32814 1.23995 -0.893841
+-1.23995 3.32814 -0.893841
+-3.32814 -1.23995 -0.893841
+1.23995 -3.32814 -0.893841
+2.85531 1.72124 -0.745941
+-1.72124 2.85531 -0.745941
+-2.85531 -1.72124 -0.745941
+1.72124 -2.85531 -0.745941
+2.06587 2.71577 -0.809017
+-2.71577 2.06587 -0.809017
+-2.06587 -2.71577 -0.809017
+2.71577 -2.06587 -0.809017
+3.43578 0.807069 -0.882291
+-0.807069 3.43578 -0.882291
+-3.43578 -0.807069 -0.882291
+0.807069 -3.43578 -0.882291
+2.64664 2.28472 0.863923
+-2.28472 2.64664 0.863923
+-2.64664 -2.28472 0.863923
+2.28472 -2.64664 0.863923
+2.55885 1.95718 0.627691
+-1.95718 2.55885 0.627691
+-2.55885 -1.95718 0.627691
+1.95718 -2.55885 0.627691
+3.12713 1.63616 -0.882291
+-1.63616 3.12713 -0.882291
+-3.12713 -1.63616 -0.882291
+1.63616 -3.12713 -0.882291
+1.82318 3.009 0.876307
+-3.009 1.82318 0.876307
+-1.82318 -3.009 0.876307
+3.009 -1.82318 0.876307
+2.30711 2.34334 -0.70265
+-2.34334 2.30711 -0.70265
+-2.30711 -2.34334 -0.70265
+2.34334 -2.30711 -0.70265
+3.13139 0.885054 0.666012
+-0.885054 3.13139 0.666012
+-3.13139 -0.885054 0.666012
+0.885054 -3.13139 0.666012
+3.22602 0.486461 0.675333
+-0.486461 3.22602 0.675333
+-3.22602 -0.486461 0.675333
+0.486461 -3.22602 0.675333
+0.287395 3.36004 -0.778462
+-3.36004 0.287395 -0.778462
+-0.287395 -3.36004 -0.778462
+3.36004 -0.287395 -0.778462
+3.24141 0.696791 0.728969
+-0.696791 3.24141 0.728969
+-3.24141 -0.696791 0.728969
+0.696791 -3.24141 0.728969
+0.282299 3.23345 -0.656586
+-3.23345 0.282299 -0.656586
+-0.282299 -3.23345 -0.656586
+3.23345 -0.282299 -0.656586
+2.14373 2.70774 0.837528
+-2.70774 2.14373 0.837528
+-2.14373 -2.70774 0.837528
+2.70774 -2.14373 0.837528
+1.80125 2.61638 0.567269
+-2.61638 1.80125 0.567269
+-1.80125 -2.61638 0.567269
+2.61638 -1.80125 0.567269
+3.08745 0.919752 -0.627691
+-0.919752 3.08745 -0.627691
+-3.08745 -0.919752 -0.627691
+0.919752 -3.08745 -0.627691
+3.02239 0.860403 0.51444
+-0.860403 3.02239 0.51444
+-3.02239 -0.860403 0.51444
+0.860403 -3.02239 0.51444
+2.99524 0.88655 -0.481754
+-0.88655 2.99524 -0.481754
+-2.99524 -0.88655 -0.481754
+0.88655 -2.99524 -0.481754
+3.12581 0.677698 0.597905
+-0.677698 3.12581 0.597905
+-3.12581 -0.677698 0.597905
+0.677698 -3.12581 0.597905
+3.01604 0.100474 -0.187381
+-0.100474 3.01604 -0.187381
+-3.01604 -0.100474 -0.187381
+0.100474 -3.01604 -0.187381
+2.88888 0.843629 -0.13779
+-0.843629 2.88888 -0.13779
+-2.88888 -0.843629 -0.13779
+0.843629 -2.88888 -0.13779
+1.39101 2.75908 -0.414376
+-2.75908 1.39101 -0.414376
+-1.39101 -2.75908 -0.414376
+2.75908 -1.39101 -0.414376
+1.36944 2.70446 -0.24869
+-2.70446 1.36944 -0.24869
+-1.36944 -2.70446 -0.24869
+2.70446 -1.36944 -0.24869
+0.46648 2.98652 -0.212007
+-2.98652 0.46648 -0.212007
+-0.46648 -2.98652 -0.212007
+2.98652 -0.46648 -0.212007
+2.86543 1.0418 -0.309017
+-1.0418 2.86543 -0.309017
+-2.86543 -1.0418 -0.309017
+1.0418 -2.86543 -0.309017
+0.108006 3.06832 0.368125
+-3.06832 0.108006 0.368125
+-0.108006 -3.06832 0.368125
+3.06832 -0.108006 0.368125
+2.40862 1.85719 0.285019
+-1.85719 2.40862 0.285019
+-2.40862 -1.85719 0.285019
+1.85719 -2.40862 0.285019
+1.74768 2.54815 0.414376
+-2.54815 1.74768 0.414376
+-1.74768 -2.54815 0.414376
+2.54815 -1.74768 0.414376
+1.98451 2.25498 -0.0878512
+-2.25498 1.98451 -0.0878512
+-1.98451 -2.25498 -0.0878512
+2.25498 -1.98451 -0.0878512
+0.469546 3.04376 -0.391374
+-3.04376 0.469546 -0.391374
+-0.469546 -3.04376 -0.391374
+3.04376 -0.469546 -0.391374
+2.99861 0.0938579 0.012566
+-0.0938579 2.99861 0.012566
+-2.99861 -0.0938579 0.012566
+0.0938579 -2.99861 0.012566
+2.3776 1.83995 0.112856
+-1.83995 2.3776 0.112856
+-2.3776 -1.83995 0.112856
+1.83995 -2.3776 0.112856
+2.00082 2.28159 -0.260842
+-2.28159 2.00082 -0.260842
+-2.00082 -2.28159 -0.260842
+2.28159 -2.00082 -0.260842
+2.92818 1.07045 -0.470704
+-1.07045 2.92818 -0.470704
+-2.92818 -1.07045 -0.470704
+1.07045 -2.92818 -0.470704
+2.9893 0.284846 -0.0753268
+-0.284846 2.9893 -0.0753268
+-2.9893 -0.284846 -0.0753268
+0.284846 -2.9893 -0.0753268
+2.92519 0.859822 -0.309017
+-0.859822 2.92519 -0.309017
+-2.92519 -0.859822 -0.309017
+0.859822 -2.92519 -0.309017
+0.299516 4.95955 0.24869
+-4.95955 0.299516 0.24869
+-0.299516 -4.95955 0.24869
+4.95955 -0.299516 0.24869
+0.0112521 4.97451 -0.224271
+-4.97451 0.0112521 -0.224271
+-0.0112521 -4.97451 -0.224271
+4.97451 -0.0112521 -0.224271
+3.42314 3.64436 -0.012566
+-3.64436 3.42314 -0.012566
+-3.42314 -3.64436 -0.012566
+3.64436 -3.42314 -0.012566
+4.0434 2.94003 0.0376902
+-2.94003 4.0434 0.0376902
+-4.0434 -2.94003 0.0376902
+2.94003 -4.0434 0.0376902
+4.22124 2.67962 0.012566
+-2.67962 4.22124 0.012566
+-4.22124 -2.67962 0.012566
+2.67962 -4.22124 0.012566
+-4.91144 0.936907 9.80498e-15
+-0.936907 -4.91144 -1.76343e-14
+0.936907 4.91144 -1.95991e-14
+4.91144 -0.936907 -4.50736e-14
+4.17196 2.66603 0.309017
+-2.66603 4.17196 0.309017
+-4.17196 -2.66603 0.309017
+2.66603 -4.17196 0.309017
+3.18821 3.84797 -0.0753268
+-3.84797 3.18821 -0.0753268
+-3.18821 -3.84797 -0.0753268
+3.84797 -3.18821 -0.0753268
+0.00376777 -4.99716 0.0753268
+-4.99716 0.00376777 -0.0753268
+0.00376777 4.99716 -0.0753268
+4.99716 0.00376777 0.0753268
+4.99716 -0.00376777 -0.0753268
+-0.00376777 4.99716 0.0753268
+-4.99716 -0.00376777 0.0753268
+-0.00376777 -4.99716 -0.0753268
+4.04239 2.92921 -0.125333
+-2.92921 4.04239 -0.125333
+-4.04239 -2.92921 -0.125333
+2.92921 -4.04239 -0.125333
+3.75002 3.06673 -0.535827
+-3.06673 3.75002 -0.535827
+-3.75002 -3.06673 -0.535827
+3.06673 -3.75002 -0.535827
+4.37764 2.39947 -0.125333
+-2.39947 4.37764 -0.125333
+-4.37764 -2.39947 -0.125333
+2.39947 -4.37764 -0.125333
+4.51844 2.11859 -0.13779
+-2.11859 4.51844 -0.13779
+-4.51844 -2.11859 -0.13779
+2.11859 -4.51844 -0.13779
+4.97065 0.302694 -0.19971
+-0.302694 4.97065 -0.19971
+-4.97065 -0.302694 -0.19971
+0.302694 -4.97065 -0.19971
+2.88906 3.93574 -0.470704
+-3.93574 2.88906 -0.470704
+-2.88906 -3.93574 -0.470704
+3.93574 -2.88906 -0.470704
+0.942169 4.89887 -0.150226
+-4.89887 0.942169 -0.150226
+-0.942169 -4.89887 -0.150226
+4.89887 -0.942169 -0.150226
+1.23639 4.83813 0.112856
+-4.83813 1.23639 0.112856
+-1.23639 -4.83813 0.112856
+4.83813 -1.23639 0.112856
+4.21728 2.6682 -0.13779
+-2.6682 4.21728 -0.13779
+-4.21728 -2.6682 -0.13779
+2.6682 -4.21728 -0.13779
+3.83423 3.15495 -0.260842
+-3.15495 3.83423 -0.260842
+-3.83423 -3.15495 -0.260842
+3.15495 -3.83423 -0.260842
+3.17954 3.82576 -0.224271
+-3.82576 3.17954 -0.224271
+-3.17954 -3.82576 -0.224271
+3.82576 -3.17954 -0.224271
+4.20603 2.67887 0.162637
+-2.67887 4.20603 0.162637
+-4.20603 -2.67887 0.162637
+2.67887 -4.20603 0.162637
+3.85124 3.17869 -0.112856
+-3.17869 3.85124 -0.112856
+-3.85124 -3.17869 -0.112856
+3.17869 -3.85124 -0.112856
+4.48964 2.09615 -0.297042
+-2.09615 4.48964 -0.297042
+-4.48964 -2.09615 -0.297042
+2.09615 -4.48964 -0.297042
+4.97451 0.0112521 0.224271
+-0.0112521 4.97451 0.224271
+-4.97451 -0.0112521 0.224271
+0.0112521 -4.97451 0.224271
+4.73196 1.52502 -0.236499
+1.52502 4.73196 0.236499
+-1.52502 4.73196 -0.236499
+-4.73196 1.52502 0.236499
+-4.73196 -1.52502 -0.236499
+-1.52502 -4.73196 0.236499
+1.52502 -4.73196 -0.236499
+4.73196 -1.52502 0.236499
+4.1528 2.6099 -0.425779
+-2.6099 4.1528 -0.425779
+-4.1528 -2.6099 -0.425779
+2.6099 -4.1528 -0.425779
+0.330438 4.8711 -0.470704
+-4.8711 0.330438 -0.470704
+-0.330438 -4.8711 -0.470704
+4.8711 -0.330438 -0.470704
+4.02241 2.9055 -0.272952
+-2.9055 4.02241 -0.272952
+-4.02241 -2.9055 -0.272952
+2.9055 -4.02241 -0.272952
+0.326761 4.9363 -0.320944
+-4.9363 0.326761 -0.320944
+-0.326761 -4.9363 -0.320944
+4.9363 -0.326761 -0.320944
+4.19428 2.6448 -0.285019
+-2.6448 4.19428 -0.285019
+-4.19428 -2.6448 -0.285019
+2.6448 -4.19428 -0.285019
+0.943124 4.86428 -0.297042
+-4.86428 0.943124 -0.297042
+-0.943124 -4.86428 -0.297042
+4.86428 -0.943124 -0.297042
+4.35485 2.37844 -0.272952
+-2.37844 4.35485 -0.272952
+-4.35485 -2.37844 -0.272952
+2.37844 -4.35485 -0.272952
+0.939819 4.80842 -0.437116
+-4.80842 0.939819 -0.437116
+-0.939819 -4.80842 -0.437116
+4.80842 -0.939819 -0.437116
+1.79972 4.59441 0.356412
+-4.59441 1.79972 0.356412
+-1.79972 -4.59441 0.356412
+4.59441 -1.79972 0.356412
+3.15412 3.78258 -0.379779
+-3.78258 3.15412 -0.379779
+-3.15412 -3.78258 -0.379779
+3.78258 -3.15412 -0.379779
+0.019186 4.92504 -0.379779
+-4.92504 0.019186 -0.379779
+-0.019186 -4.92504 -0.379779
+4.92504 -0.019186 -0.379779
+0.636293 4.87892 -0.391374
+-4.87892 0.636293 -0.391374
+-0.636293 -4.87892 -0.391374
+4.87892 -0.636293 -0.391374
+4.68992 1.50367 -0.379779
+1.50367 4.68992 0.379779
+-1.50367 4.68992 -0.379779
+-4.68992 1.50367 0.379779
+-4.68992 -1.50367 -0.379779
+-1.50367 -4.68992 0.379779
+1.50367 -4.68992 -0.379779
+4.68992 -1.50367 0.379779
+0.635116 4.92782 -0.24869
+-4.92782 0.635116 -0.24869
+-0.635116 -4.92782 -0.24869
+4.92782 -0.635116 -0.24869
+3.11276 3.7206 -0.525175
+-3.7206 3.11276 -0.525175
+-3.11276 -3.7206 -0.525175
+3.7206 -3.11276 -0.525175
+2.91897 3.98908 -0.33282
+-3.98908 2.91897 -0.33282
+-2.91897 -3.98908 -0.33282
+3.98908 -2.91897 -0.33282
+4.86386 0.0256711 0.503623
+-0.0256711 4.86386 0.503623
+-4.86386 -0.0256711 0.503623
+0.0256711 -4.86386 0.503623
+4.31283 2.34706 -0.414376
+-2.34706 4.31283 -0.414376
+-4.31283 -2.34706 -0.414376
+2.34706 -4.31283 -0.414376
+0.026822 4.85092 -0.525175
+-4.85092 0.026822 -0.525175
+-0.026822 -4.85092 -0.525175
+4.85092 -0.026822 -0.525175
+1.76948 4.53736 0.492727
+-4.53736 1.76948 0.492727
+-1.76948 -4.53736 0.492727
+4.53736 -1.76948 0.492727
+1.18258 4.71138 0.51444
+-4.71138 1.18258 0.51444
+-1.18258 -4.71138 0.51444
+4.71138 -1.18258 0.51444
+3.52297 3.34429 0.51444
+-3.34429 3.52297 0.51444
+-3.52297 -3.34429 0.51444
+3.34429 -3.52297 0.51444
+3.80022 3.11736 -0.402906
+-3.11736 3.80022 -0.402906
+-3.80022 -3.11736 -0.402906
+3.11736 -3.80022 -0.402906
+4.11464 2.63887 0.45958
+-2.63887 4.11464 0.45958
+-4.11464 -2.63887 0.45958
+2.63887 -4.11464 0.45958
+4.80284 0.939356 0.448383
+-0.939356 4.80284 0.448383
+-4.80284 -0.939356 0.448383
+0.939356 -4.80284 0.448383
+3.98465 2.86909 -0.414376
+-2.86909 3.98465 -0.414376
+-3.98465 -2.86909 -0.414376
+2.86909 -3.98465 -0.414376
+4.92974 0.0185848 0.368125
+-0.0185848 4.92974 0.368125
+-4.92974 -0.0185848 0.368125
+0.0185848 -4.92974 0.368125
+3.80475 2.80838 0.684547
+-2.80838 3.80475 0.684547
+-3.80475 -2.80838 0.684547
+2.80838 -3.80475 0.684547
+3.93001 2.82076 -0.546394
+-2.82076 3.93001 -0.546394
+-3.93001 -2.82076 -0.546394
+2.82076 -3.93001 -0.546394
+4.62783 1.47607 -0.51444
+1.47607 4.62783 0.51444
+-1.47607 4.62783 -0.51444
+-4.62783 1.47607 0.51444
+-4.62783 -1.47607 -0.51444
+-1.47607 -4.62783 0.51444
+1.47607 -4.62783 -0.51444
+4.62783 -1.47607 0.51444
+4.72538 0.931606 0.577573
+-0.931606 4.72538 0.577573
+-4.72538 -0.931606 0.577573
+0.931606 -4.72538 0.577573
+1.72888 4.45474 0.627691
+-4.45474 1.72888 0.627691
+-1.72888 -4.45474 0.627691
+4.45474 -1.72888 0.627691
+1.81255 4.50669 -0.51444
+-4.50669 1.81255 -0.51444
+-1.81255 -4.50669 -0.51444
+4.50669 -1.81255 -0.51444
+4.25256 2.30595 -0.546394
+-2.30595 4.25256 -0.546394
+-4.25256 -2.30595 -0.546394
+2.30595 -4.25256 -0.546394
+3.67876 2.99844 -0.666012
+-2.99844 3.67876 -0.666012
+-3.67876 -2.99844 -0.666012
+2.99844 -3.67876 -0.666012
+1.44278 4.54711 0.637424
+-4.54711 1.44278 0.637424
+-1.44278 -4.54711 0.637424
+4.54711 -1.44278 0.637424
+4.03753 2.59874 0.597905
+-2.59874 4.03753 0.597905
+-4.03753 -2.59874 0.597905
+2.59874 -4.03753 0.597905
+1.78676 4.42327 -0.637424
+-4.42327 1.78676 -0.637424
+-1.78676 -4.42327 -0.637424
+4.42327 -1.78676 -0.637424
+4.7704 0.0329712 0.637424
+-0.0329712 4.7704 0.637424
+-4.7704 -0.0329712 0.637424
+0.0329712 -4.7704 0.637424
+4.09382 2.56423 -0.556876
+-2.56423 4.09382 -0.556876
+-4.09382 -2.56423 -0.556876
+2.56423 -4.09382 -0.556876
+4.01873 2.50876 -0.675333
+-2.50876 4.01873 -0.675333
+-4.01873 -2.50876 -0.675333
+2.50876 -4.01873 -0.675333
+3.15853 3.42162 0.754251
+-3.42162 3.15853 0.754251
+-3.15853 -3.42162 0.754251
+3.42162 -3.15853 0.754251
+3.95051 2.55116 0.711536
+-2.55116 3.95051 0.711536
+-3.95051 -2.55116 0.711536
+2.55116 -3.95051 0.711536
+1.15441 4.62873 0.637424
+-4.62873 1.15441 0.637424
+-1.15441 -4.62873 0.637424
+4.62873 -1.15441 0.637424
+3.70289 2.74256 0.79399
+-2.74256 3.70289 0.79399
+-3.70289 -2.74256 0.79399
+2.74256 -3.70289 0.79399
+2.22968 3.9621 -0.837528
+-3.9621 2.22968 -0.837528
+-2.22968 -3.9621 -0.837528
+3.9621 -2.22968 -0.837528
+3.2356 3.49453 0.647056
+-3.49453 3.2356 0.647056
+-3.2356 -3.49453 0.647056
+3.49453 -3.2356 0.647056
+3.85978 2.76154 -0.666012
+-2.76154 3.85978 -0.666012
+-3.85978 -2.76154 -0.666012
+2.76154 -3.85978 -0.666012
+1.68109 4.35266 0.745941
+-4.35266 1.68109 0.745941
+-1.68109 -4.35266 0.745941
+4.35266 -1.68109 0.745941
+3.4549 3.2896 0.637424
+-3.2896 3.4549 0.637424
+-3.4549 -3.2896 0.637424
+3.2896 -3.4549 0.637424
+4.36114 1.68499 -0.737513
+-1.68499 4.36114 -0.737513
+-4.36114 -1.68499 -0.737513
+1.68499 -4.36114 -0.737513
+1.75114 4.31478 -0.754251
+-4.31478 1.75114 -0.754251
+-1.75114 -4.31478 -0.754251
+4.31478 -1.75114 -0.754251
+4.62978 0.920014 0.693653
+-0.920014 4.62978 0.693653
+-4.62978 -0.920014 0.693653
+0.920014 -4.62978 0.693653
+3.50723 2.95755 0.809017
+-2.95755 3.50723 0.809017
+-3.50723 -2.95755 0.809017
+2.95755 -3.50723 0.809017
+4.5182 0.904925 0.79399
+-0.904925 4.5182 0.79399
+-4.5182 -0.904925 0.79399
+0.904925 -4.5182 0.79399
+3.28312 3.14497 0.837528
+-3.14497 3.28312 0.837528
+-3.28312 -3.14497 0.837528
+3.14497 -3.28312 0.837528
+1.49081 4.46946 -0.70265
+-4.46946 1.49081 -0.70265
+-1.49081 -4.46946 -0.70265
+4.46946 -1.49081 -0.70265
+4.66585 0.0392849 0.745941
+-0.0392849 4.66585 0.745941
+-4.66585 -0.0392849 0.745941
+0.0392849 -4.66585 0.745941
+0.840181 4.60859 0.728969
+-4.60859 0.840181 0.728969
+-0.840181 -4.60859 0.728969
+4.60859 -0.840181 0.728969
+3.85025 2.49466 0.809017
+-2.49466 3.85025 0.809017
+-3.85025 -2.49466 0.809017
+2.49466 -3.85025 0.809017
+3.92926 2.44468 -0.778462
+-2.44468 3.92926 -0.778462
+-3.92926 -2.44468 -0.778462
+2.44468 -3.92926 -0.778462
+1.1223 4.52903 0.745941
+-4.52903 1.1223 0.745941
+-1.1223 -4.52903 0.745941
+4.52903 -1.1223 0.745941
+1.46143 4.35947 -0.801567
+-4.35947 1.46143 -0.801567
+-1.46143 -4.35947 -0.801567
+4.35947 -1.46143 -0.801567
+0.812371 4.49444 0.823533
+-4.49444 0.812371 0.823533
+-0.812371 -4.49444 0.823533
+4.49444 -0.812371 0.823533
+2.28221 4.06979 -0.745941
+-4.06979 2.28221 -0.745941
+-2.28221 -4.06979 -0.745941
+4.06979 -2.28221 -0.745941
+2.64174 3.55088 -0.904827
+-3.55088 2.64174 -0.904827
+-2.64174 -3.55088 -0.904827
+3.55088 -2.64174 -0.904827
+3.37436 3.22263 0.745941
+-3.22263 3.37436 0.745941
+-3.37436 -3.22263 0.745941
+3.22263 -3.37436 0.745941
+1.40446 4.44962 0.745941
+-4.44962 1.40446 0.745941
+-1.40446 -4.44962 0.745941
+4.44962 -1.40446 0.745941
+1.36192 4.33761 0.837528
+-4.33761 1.36192 0.837528
+-1.36192 -4.33761 0.837528
+4.33761 -1.36192 0.837528
+4.18245 1.41204 0.910106
+-1.41204 4.18245 0.910106
+-4.18245 -1.41204 0.910106
+1.41204 -4.18245 0.910106
+1.71206 4.20031 -0.844328
+-4.20031 1.71206 -0.844328
+-1.71206 -4.20031 -0.844328
+4.20031 -1.71206 -0.844328
+4.42534 1.47919 0.745941
+-1.47919 4.42534 0.745941
+-4.42534 -1.47919 0.745941
+1.47919 -4.42534 0.745941
+4.54617 0.0451333 0.837528
+-0.0451333 4.54617 0.837528
+-4.54617 -0.0451333 0.837528
+0.0451333 -4.54617 0.837528
+0.87145 4.29221 -0.925077
+-4.29221 0.87145 -0.925077
+-0.87145 -4.29221 -0.925077
+4.29221 -0.87145 -0.925077
+3.39597 2.87324 0.893841
+-2.87324 3.39597 0.893841
+-3.39597 -2.87324 0.893841
+2.87324 -3.39597 0.893841
+0.618664 4.55609 -0.801567
+-4.55609 0.618664 -0.801567
+-0.618664 -4.55609 -0.801567
+4.55609 -0.618664 -0.801567
+4.30972 1.44777 0.837528
+-1.44777 4.30972 0.837528
+-4.30972 -1.44777 0.837528
+1.44777 -4.30972 0.837528
+4.02562 1.839 -0.904827
+-1.839 4.02562 -0.904827
+-4.02562 -1.839 -0.904827
+1.839 -4.02562 -0.904827
+3.46385 2.58308 0.947098
+-2.58308 3.46385 0.947098
+-3.46385 -2.58308 0.947098
+2.58308 -3.46385 0.947098
+4.41409 0.050479 0.910106
+-0.050479 4.41409 0.910106
+-4.41409 -0.050479 0.910106
+0.050479 -4.41409 0.910106
+3.17452 3.0509 0.915241
+-3.0509 3.17452 0.915241
+-3.17452 -3.0509 0.915241
+3.0509 -3.17452 0.915241
+4.18007 1.70504 0.857527
+-1.70504 4.18007 0.857527
+-4.18007 -1.70504 0.857527
+1.70504 -4.18007 0.857527
+4.05289 1.66029 0.925077
+-1.66029 4.05289 0.925077
+-4.05289 -1.66029 0.925077
+1.66029 -4.05289 0.925077
+0.595942 4.29164 -0.942991
+-4.29164 0.595942 -0.942991
+-0.595942 -4.29164 -0.942991
+4.29164 -0.595942 -0.942991
+2.34833 3.5986 -0.954865
+-3.5986 2.34833 -0.954865
+-2.34833 -3.5986 -0.954865
+3.5986 -2.34833 -0.954865
+0.782636 4.36755 0.899405
+-4.36755 0.782636 0.899405
+-0.782636 -4.36755 0.899405
+4.36755 -0.782636 0.899405
+4.25311 1.63589 -0.830596
+-1.63589 4.25311 -0.830596
+-4.25311 -1.63589 -0.830596
+1.63589 -4.25311 -0.830596
+4.29613 1.15385 0.893841
+-1.15385 4.29613 0.893841
+-4.29613 -1.15385 0.893841
+1.15385 -4.29613 0.893841
+3.58827 2.66675 0.882291
+-2.66675 3.58827 0.882291
+-3.58827 -2.66675 0.882291
+2.66675 -3.58827 0.882291
+1.01572 4.17527 0.954865
+-4.17527 1.01572 0.954865
+-1.01572 -4.17527 0.954865
+4.17527 -1.01572 0.954865
+3.92161 2.09979 -0.893841
+-2.09979 3.92161 -0.893841
+-3.92161 -2.09979 -0.893841
+2.09979 -3.92161 -0.893841
+3.2759 2.78084 0.954865
+-2.78084 3.2759 0.954865
+-3.2759 -2.78084 0.954865
+2.78084 -3.2759 0.954865
+2.71348 3.18923 -0.982287
+-3.18923 2.71348 -0.982287
+-2.71348 -3.18923 -0.982287
+3.18923 -2.71348 -0.982287
+3.739 2.43058 0.888136
+-2.43058 3.739 0.888136
+-3.739 -2.43058 0.888136
+2.43058 -3.739 0.888136
+2.80275 3.30423 -0.942991
+-3.30423 2.80275 -0.942991
+-2.80275 -3.30423 -0.942991
+3.30423 -2.80275 -0.942991
+1.31602 4.21365 0.910106
+-4.21365 1.31602 0.910106
+-1.31602 -4.21365 0.910106
+4.21365 -1.31602 0.910106
+4.37854 0.785173 -0.893841
+-0.785173 4.37854 -0.893841
+-4.37854 -0.785173 -0.893841
+0.785173 -4.37854 -0.893841
+4.04639 1.3729 0.962028
+-1.3729 4.04639 0.962028
+-4.04639 -1.3729 0.962028
+1.3729 -4.04639 0.962028
+2.16558 3.83352 -0.915241
+-3.83352 2.16558 -0.915241
+-2.16558 -3.83352 -0.915241
+3.83352 -2.16558 -0.915241
+1.57818 3.825 -0.990461
+-3.825 1.57818 -0.990461
+-1.57818 -3.825 -0.990461
+3.825 -1.57818 -0.990461
+0.580993 4.1344 -0.984564
+-4.1344 0.580993 -0.984564
+-0.580993 -4.1344 -0.984564
+4.1344 -0.580993 -0.984564
+0.891571 4.42552 -0.857527
+-4.42552 0.891571 -0.857527
+-0.891571 -4.42552 -0.857527
+4.42552 -0.891571 -0.857527
+3.80181 2.02827 -0.951057
+-2.02827 3.80181 -0.951057
+-3.80181 -2.02827 -0.951057
+2.02827 -3.80181 -0.951057
+2.1013 3.70666 -0.965382
+-3.70666 2.1013 -0.965382
+-2.1013 -3.70666 -0.965382
+3.70666 -2.1013 -0.965382
+1.85957 3.82013 -0.968583
+-3.82013 1.85957 -0.968583
+-1.85957 -3.82013 -0.968583
+3.82013 -1.85957 -0.968583
+4.03797 0.448365 -0.998027
+-0.448365 4.03797 -0.998027
+-4.03797 -0.448365 -0.998027
+0.448365 -4.03797 -0.998027
+1.79518 3.67258 -0.996134
+-3.67258 1.79518 -0.996134
+-1.79518 -3.67258 -0.996134
+3.67258 -1.79518 -0.996134
+4.01504 1.53101 -0.954865
+-1.53101 4.01504 -0.954865
+-4.01504 -1.53101 -0.954865
+1.53101 -4.01504 -0.954865
+1.916 3.61102 0.996134
+-3.61102 1.916 0.996134
+-1.916 -3.61102 0.996134
+3.61102 -1.916 0.996134
+1.11347 4.11278 -0.965382
+-4.11278 1.11347 -0.965382
+-1.11347 -4.11278 -0.965382
+4.11278 -1.11347 -0.965382
+3.06764 2.95709 0.965382
+-2.95709 3.06764 0.965382
+-3.06764 -2.95709 0.965382
+2.95709 -3.06764 0.965382
+2.26696 3.46153 -0.990461
+-3.46153 2.26696 -0.990461
+-2.26696 -3.46153 -0.990461
+3.46153 -2.26696 -0.990461
+0.889718 3.73279 0.986686
+-3.73279 0.889718 0.986686
+-0.889718 -3.73279 0.986686
+3.73279 -0.889718 0.986686
+0.974935 4.03409 0.988652
+-4.03409 0.974935 0.988652
+-0.974935 -4.03409 0.988652
+4.03409 -0.974935 0.988652
+0.197271 4.09561 0.994951
+-4.09561 0.197271 0.994951
+-0.197271 -4.09561 0.994951
+4.09561 -0.197271 0.994951
+1.52204 3.67192 -0.999684
+-3.67192 1.52204 -0.999684
+-1.52204 -3.67192 -0.999684
+3.67192 -1.52204 -0.999684
+3.88244 1.19706 -0.998027
+-1.19706 3.88244 -0.998027
+-3.88244 -1.19706 -0.998027
+1.19706 -3.88244 -0.998027
+2.18961 3.33245 -0.999921
+-3.33245 2.18961 -0.999921
+-2.18961 -3.33245 -0.999921
+3.33245 -2.18961 -0.999921
+3.26737 1.71686 -0.951057
+-1.71686 3.26737 -0.951057
+-3.26737 -1.71686 -0.951057
+1.71686 -3.26737 -0.951057
+1.22756 3.55767 -0.971632
+-3.55767 1.22756 -0.971632
+-1.22756 -3.55767 -0.971632
+3.55767 -1.22756 -0.971632
+2.5629 3.43409 -0.958522
+-3.43409 2.5629 -0.958522
+-2.5629 -3.43409 -0.958522
+3.43409 -2.5629 -0.958522
+0.67185 3.86674 0.997159
+-3.86674 0.67185 0.997159
+-0.67185 -3.86674 0.997159
+3.86674 -0.67185 0.997159
+0.930361 3.87738 0.999921
+-3.87738 0.930361 0.999921
+-0.930361 -3.87738 0.999921
+3.87738 -0.930361 0.999921
+3.97436 0.0634334 0.999684
+-0.0634334 3.97436 0.999684
+-3.97436 -0.0634334 0.999684
+0.0634334 -3.97436 0.999684
+1.90548 3.13327 0.942991
+-3.13327 1.90548 0.942991
+-1.90548 -3.13327 0.942991
+3.13327 -1.90548 0.942991
+4.1249 0.0596145 0.992115
+-0.0596145 4.1249 0.992115
+-4.1249 -0.0596145 0.992115
+0.0596145 -4.1249 0.992115
+3.01199 2.57445 0.999289
+-2.57445 3.01199 0.999289
+-3.01199 -2.57445 0.999289
+2.57445 -3.01199 0.999289
+1.08605 3.5653 0.962028
+-3.5653 1.08605 0.962028
+-1.08605 -3.5653 0.962028
+3.5653 -1.08605 0.962028
+3.22379 1.96553 -0.974527
+-1.96553 3.22379 -0.974527
+-3.22379 -1.96553 -0.974527
+1.96553 -3.22379 -0.974527
+1.84015 3.48073 0.998027
+-3.48073 1.84015 0.998027
+-1.84015 -3.48073 0.998027
+3.48073 -1.84015 0.998027
+1.87246 3.26463 -0.971632
+-3.26463 1.87246 -0.971632
+-1.87246 -3.26463 -0.971632
+3.26463 -1.87246 -0.971632
+3.65251 0.531541 0.951057
+-0.531541 3.65251 0.951057
+-3.65251 -0.531541 0.951057
+0.531541 -3.65251 0.951057
+2.89447 2.48156 0.982287
+-2.48156 2.89447 0.982287
+-2.89447 -2.48156 0.982287
+2.48156 -2.89447 0.982287
+2.11204 3.20385 -0.986686
+-3.20385 2.11204 -0.986686
+-2.11204 -3.20385 -0.986686
+3.20385 -2.11204 -0.986686
+1.65292 3.15626 0.899405
+-3.15626 1.65292 0.899405
+-1.65292 -3.15626 0.899405
+3.15626 -1.65292 0.899405
+2.77119 2.38373 0.938734
+-2.38373 2.77119 0.938734
+-2.77119 -2.38373 0.938734
+2.38373 -2.77119 0.938734
+3.66675 0.300637 0.947098
+-0.300637 3.66675 0.947098
+-3.66675 -0.300637 0.947098
+0.300637 -3.66675 0.947098
+3.67839 0.0698067 0.947098
+-0.0698067 3.67839 0.947098
+-3.67839 -0.0698067 0.947098
+0.0698067 -3.67839 0.947098
+1.25752 3.37012 0.915241
+-3.37012 1.25752 0.915241
+-1.25752 -3.37012 0.915241
+3.37012 -1.25752 0.915241
+2.69641 2.62551 0.971632
+-2.62551 2.69641 0.971632
+-2.69641 -2.62551 0.971632
+2.62551 -2.69641 0.971632
+3.51382 0.51677 0.893841
+-0.51677 3.51382 0.893841
+-3.51382 -0.51677 0.893841
+0.51677 -3.51382 0.893841
+3.82439 0.0668085 0.984564
+-0.0668085 3.82439 0.984564
+-3.82439 -0.0668085 0.984564
+0.0668085 -3.82439 0.984564
+2.58994 2.52947 0.925077
+-2.52947 2.58994 0.925077
+-2.58994 -2.52947 0.925077
+2.52947 -2.58994 0.925077
+3.53483 0.601376 -0.910106
+-0.601376 3.53483 -0.910106
+-3.53483 -0.601376 -0.910106
+0.601376 -3.53483 -0.910106
+1.6817 2.90071 -0.762443
+-2.90071 1.6817 -0.762443
+-1.6817 -2.90071 -0.762443
+2.90071 -1.6817 -0.762443
+2.63872 2.08424 -0.770513
+-2.08424 2.63872 -0.770513
+-2.63872 -2.08424 -0.770513
+2.08424 -2.63872 -0.770513
+1.20615 3.24741 0.844328
+-3.24741 1.20615 0.844328
+-1.20615 -3.24741 0.844328
+3.24741 -1.20615 0.844328
+1.74329 3.01829 -0.857527
+-3.01829 1.74329 -0.857527
+-1.74329 -3.01829 -0.857527
+3.01829 -1.74329 -0.857527
+3.22369 1.43657 -0.882291
+-1.43657 3.22369 -0.882291
+-3.22369 -1.43657 -0.882291
+1.43657 -3.22369 -0.882291
+3.10381 1.88596 -0.929776
+-1.88596 3.10381 -0.929776
+-3.10381 -1.88596 -0.929776
+1.88596 -3.10381 -0.929776
+3.53968 0.072514 0.888136
+-0.072514 3.53968 0.888136
+-3.53968 -0.072514 0.888136
+0.072514 -3.53968 0.888136
+1.80591 3.13763 -0.925077
+-3.13763 1.80591 -0.925077
+-1.80591 -3.13763 -0.925077
+3.13763 -1.80591 -0.925077
+2.21978 2.5649 -0.79399
+-2.5649 2.21978 -0.79399
+-2.21978 -2.5649 -0.79399
+2.5649 -2.21978 -0.79399
+3.41016 0.289524 0.816339
+-0.289524 3.41016 0.816339
+-3.41016 -0.289524 0.816339
+0.289524 -3.41016 0.816339
+2.55033 2.00766 -0.656586
+-2.00766 2.55033 -0.656586
+-2.55033 -2.00766 -0.656586
+2.00766 -2.55033 -0.656586
+3.10959 1.38011 -0.801567
+-1.38011 3.10959 -0.801567
+-3.10959 -1.38011 -0.801567
+1.38011 -3.10959 -0.801567
+2.65148 2.02117 0.745941
+-2.02117 2.65148 0.745941
+-2.65148 -2.02117 0.745941
+2.02117 -2.65148 0.745941
+3.40555 0.574099 -0.837528
+-0.574099 3.40555 -0.837528
+-3.40555 -0.574099 -0.837528
+0.574099 -3.40555 -0.837528
+0.322562 3.18974 0.60793
+-3.18974 0.322562 0.60793
+-0.322562 -3.18974 0.60793
+3.18974 -0.322562 0.60793
+2.08189 2.38974 -0.556876
+-2.38974 2.08189 -0.556876
+-2.08189 -2.38974 -0.556876
+2.38974 -2.08189 -0.556876
+2.14461 2.46988 -0.684547
+-2.46988 2.14461 -0.684547
+-2.14461 -2.46988 -0.684547
+2.46988 -2.14461 -0.684547
+0.116314 3.14686 0.525175
+-3.14686 0.116314 0.525175
+-0.116314 -3.14686 0.525175
+3.14686 -0.116314 0.525175
+3.20139 0.281122 0.61786
+-0.281122 3.20139 0.61786
+-3.20139 -0.281122 0.61786
+0.281122 -3.20139 0.61786
+2.18646 2.16895 0.391374
+-2.16895 2.18646 0.391374
+-2.18646 -2.16895 0.391374
+2.16895 -2.18646 0.391374
+2.03664 2.3307 -0.425779
+-2.3307 2.03664 -0.425779
+-2.03664 -2.3307 -0.425779
+2.3307 -2.03664 -0.425779
+0.505532 3.08872 0.492727
+-3.08872 0.505532 0.492727
+-0.505532 -3.08872 0.492727
+3.08872 -0.505532 0.492727
+2.96978 0.673235 -0.297042
+-0.673235 2.96978 -0.297042
+-2.96978 -0.673235 -0.297042
+0.673235 -2.96978 -0.297042
+0.668928 3.07045 -0.51444
+-3.07045 0.668928 -0.51444
+-0.668928 -3.07045 -0.51444
+3.07045 -0.668928 -0.51444
+0.658448 2.99879 -0.368125
+-2.99879 0.658448 -0.368125
+-0.658448 -2.99879 -0.368125
+2.99879 -0.658448 -0.368125
+2.23896 2.21434 0.525175
+-2.21434 2.23896 0.525175
+-2.23896 -2.21434 0.525175
+2.21434 -2.23896 0.525175
+2.49641 1.70436 -0.212007
+-1.70436 2.49641 -0.212007
+-2.49641 -1.70436 -0.212007
+1.70436 -2.49641 -0.212007
+2.14013 2.15145 -0.260842
+-2.15145 2.14013 -0.260842
+-2.14013 -2.15145 -0.260842
+2.15145 -2.14013 -0.260842
+0.489523 3.02187 0.344643
+-3.02187 0.489523 0.344643
+-0.489523 -3.02187 0.344643
+3.02187 -0.489523 0.344643
+3.02817 0.691675 -0.448383
+-0.691675 3.02817 -0.448383
+-3.02817 -0.691675 -0.448383
+0.691675 -3.02817 -0.448383
+0.866018 2.94081 0.356412
+-2.94081 0.866018 0.356412
+-0.866018 -2.94081 0.356412
+2.94081 -0.866018 0.356412
+0.277428 3.03247 -0.297042
+-3.03247 0.277428 -0.297042
+-0.277428 -3.03247 -0.297042
+3.03247 -0.277428 -0.297042
+0.309593 3.10831 0.481754
+-3.10831 0.309593 0.481754
+-0.309593 -3.10831 0.481754
+3.10831 -0.309593 0.481754
+3.02966 0.468539 0.356412
+-0.468539 3.02966 0.356412
+-3.02966 -0.468539 0.356412
+0.468539 -3.02966 0.356412
+2.17219 2.19028 -0.402906
+-2.19028 2.17219 -0.402906
+-2.17219 -2.19028 -0.402906
+2.19028 -2.17219 -0.402906
+0.682459 2.99823 0.379779
+-2.99823 0.682459 0.379779
+-0.682459 -2.99823 0.379779
+2.99823 -0.682459 0.379779
+0.666663 2.95111 0.224271
+-2.95111 0.666663 0.224271
+-0.666663 -2.95111 0.224271
+2.95111 -0.666663 0.224271
+1.19387 2.77416 -0.19971
+-2.77416 1.19387 -0.19971
+-1.19387 -2.77416 -0.19971
+2.77416 -1.19387 -0.19971
+2.02941 2.28622 0.33282
+-2.28622 2.02941 0.33282
+-2.02941 -2.28622 0.33282
+2.28622 -2.02941 0.33282
+1.61794 2.70158 0.525175
+-2.70158 1.61794 0.525175
+-1.61794 -2.70158 0.525175
+2.70158 -1.61794 0.525175
+2.83021 1.02336 -0.13779
+-1.02336 2.83021 -0.13779
+-2.83021 -1.02336 -0.13779
+1.02336 -2.83021 -0.13779
+1.01522 2.82434 -0.0502443
+-2.82434 1.01522 -0.0502443
+-1.01522 -2.82434 -0.0502443
+2.82434 -1.01522 -0.0502443
+1.19056 2.75502 -0.0502443
+-2.75502 1.19056 -0.0502443
+-1.19056 -2.75502 -0.0502443
+2.75502 -1.19056 -0.0502443
+2.58288 1.52664 0.0251301
+-1.52664 2.58288 0.0251301
+-2.58288 -1.52664 0.0251301
+1.52664 -2.58288 0.0251301
+2.82284 1.01589 0.012566
+-1.01589 2.82284 0.012566
+-2.82284 -1.01589 0.012566
+1.01589 -2.82284 0.012566
+1.36137 2.67766 -0.0878512
+-2.67766 1.36137 -0.0878512
+-1.36137 -2.67766 -0.0878512
+2.67766 -1.36137 -0.0878512
+2.99078 0.280058 0.0878512
+-0.280058 2.99078 0.0878512
+-2.99078 -0.280058 0.0878512
+0.280058 -2.99078 0.0878512
+2.12262 2.12102 0.0376902
+-2.12102 2.12262 0.0376902
+-2.12262 -2.12102 0.0376902
+2.12102 -2.12262 0.0376902
+2.97544 0.476248 -0.162637
+-0.476248 2.97544 -0.162637
+-2.97544 -0.476248 -0.162637
+0.476248 -2.97544 -0.162637
+2.48592 1.68624 0.0878512
+-1.68624 2.48592 0.0878512
+-2.48592 -1.68624 0.0878512
+1.68624 -2.48592 0.0878512
+0.290892 3.0087 0.212007
+-3.0087 0.290892 0.212007
+-0.290892 -3.0087 0.212007
+3.0087 -0.290892 0.212007
+2.52926 1.73239 -0.356412
+-1.73239 2.52926 -0.356412
+-2.52926 -1.73239 -0.356412
+1.73239 -2.52926 -0.356412
+1.19622 2.7567 0.100362
+-2.7567 1.19622 0.100362
+-1.19622 -2.7567 0.100362
+2.7567 -1.19622 0.100362
+2.78783 1.21598 -0.285019
+-1.21598 2.78783 -0.285019
+-2.78783 -1.21598 -0.285019
+1.21598 -2.78783 -0.285019
+0.279081 2.99657 -0.13779
+-2.99657 0.279081 -0.13779
+-0.279081 -2.99657 -0.13779
+2.99657 -0.279081 -0.13779
+2.76367 1.19141 0.13779
+-1.19141 2.76367 0.13779
+-2.76367 -1.19141 0.13779
+1.19141 -2.76367 0.13779
+2.98391 0.466456 0.19971
+-0.466456 2.98391 0.19971
+-2.98391 -0.466456 0.19971
+0.466456 -2.98391 0.19971
+3.0602 0.498889 -0.437116
+-0.498889 3.0602 -0.437116
+-3.0602 -0.498889 -0.437116
+0.498889 -3.0602 -0.437116
+1.2481 4.82578 -0.175023
+-4.82578 1.2481 -0.175023
+-1.2481 -4.82578 -0.175023
+4.82578 -1.2481 -0.175023
+1.2451 4.84176 -0.0376902
+-4.84176 1.2451 -0.0376902
+-1.2451 -4.84176 -0.0376902
+4.84176 -1.2451 -0.0376902
+4.90169 0.92739 -0.150226
+-0.92739 4.90169 -0.150226
+-4.90169 -0.92739 -0.150226
+0.92739 -4.90169 -0.150226
+4.61861 1.81388 -0.272952
+-1.81388 4.61861 -0.272952
+-4.61861 -1.81388 -0.272952
+1.81388 -4.61861 -0.272952
+0.322213 4.97186 -0.187381
+-4.97186 0.322213 -0.187381
+-0.322213 -4.97186 -0.187381
+4.97186 -0.322213 -0.187381
+0.309324 4.98655 0.0878512
+-4.98655 0.309324 0.0878512
+-0.309324 -4.98655 0.0878512
+4.98655 -0.309324 0.0878512
+4.82702 0.899447 -0.414376
+-0.899447 4.82702 -0.414376
+-4.82702 -0.899447 -0.414376
+0.899447 -4.82702 -0.414376
+0.315789 4.98931 -0.0376902
+-4.98931 0.315789 -0.0376902
+-0.315789 -4.98931 -0.0376902
+4.98931 -0.315789 -0.0376902
+0.618626 4.95197 0.13779
+-4.95197 0.618626 0.13779
+-0.618626 -4.95197 0.13779
+4.95197 -0.618626 0.13779
+4.8427 1.24145 -0.0376902
+-1.24145 4.8427 -0.0376902
+-4.8427 -1.24145 -0.0376902
+1.24145 -4.8427 -0.0376902
+4.91136 0.935613 -0.0251301
+-0.935613 4.91136 -0.0251301
+-4.91136 -0.935613 -0.0251301
+0.935613 -4.91136 -0.0251301
+4.75296 1.53971 -0.0878512
+1.53971 4.75296 0.0878512
+-1.53971 4.75296 -0.0878512
+-4.75296 1.53971 0.0878512
+-4.75296 -1.53971 -0.0878512
+-1.53971 -4.75296 0.0878512
+1.53971 -4.75296 -0.0878512
+4.75296 -1.53971 0.0878512
+0.609325 4.92785 0.260842
+-4.92785 0.609325 0.260842
+-0.609325 -4.92785 0.260842
+4.92785 -0.609325 0.260842
+0.928342 4.90335 0.13779
+-4.90335 0.928342 0.13779
+-0.928342 -4.90335 0.13779
+4.90335 -0.928342 0.13779
+1.22354 4.81558 0.24869
+-4.81558 1.22354 0.24869
+-1.22354 -4.81558 0.24869
+4.81558 -1.22354 0.24869
+4.38116 2.40928 0.012566
+-2.40928 4.38116 0.012566
+-4.38116 -2.40928 0.012566
+2.40928 -4.38116 0.012566
+0.916313 4.87669 0.272952
+-4.87669 0.916313 0.272952
+-0.916313 -4.87669 0.272952
+4.87669 -0.916313 0.272952
+0.626033 4.96057 0.012566
+-4.96057 0.626033 0.012566
+-0.626033 -4.96057 0.012566
+4.96057 -0.626033 0.012566
+3.99276 2.92089 0.320944
+-2.92089 3.99276 0.320944
+-3.99276 -2.92089 0.320944
+2.92089 -3.99276 0.320944
+4.52601 1.76374 -0.51444
+-1.76374 4.52601 -0.51444
+-4.52601 -1.76374 -0.51444
+1.76374 -4.52601 -0.51444
+4.02523 2.93611 0.187381
+-2.93611 4.02523 0.187381
+-4.02523 -2.93611 0.187381
+2.93611 -4.02523 0.187381
+4.8883 0.329754 0.437116
+-0.329754 4.8883 0.437116
+-4.8883 -0.329754 0.437116
+0.329754 -4.8883 0.437116
+4.36985 2.41022 0.13779
+-2.41022 4.36985 0.13779
+-4.36985 -2.41022 0.13779
+2.41022 -4.36985 0.13779
+0.631468 4.95352 -0.112856
+-4.95352 0.631468 -0.112856
+-0.631468 -4.95352 -0.112856
+4.95352 -0.631468 -0.112856
+4.3066 2.38947 0.379779
+-2.38947 4.3066 0.379779
+-4.3066 -2.38947 0.379779
+2.38947 -4.3066 0.379779
+3.6422 3.4237 0.0502443
+-3.4237 3.6422 0.0502443
+-3.6422 -3.4237 0.0502443
+3.4237 -3.6422 0.0502443
+4.83204 1.23225 -0.162637
+-1.23225 4.83204 -0.162637
+-4.83204 -1.23225 -0.162637
+1.23225 -4.83204 -0.162637
+4.8209 1.24814 0.19971
+-1.24814 4.8209 0.19971
+-4.8209 -1.24814 0.19971
+1.24814 -4.8209 0.19971
+3.78258 3.15412 0.379779
+-3.15412 3.78258 0.379779
+-3.78258 -3.15412 0.379779
+3.15412 -3.78258 0.379779
+1.20622 4.77508 0.379779
+-4.77508 1.20622 0.379779
+-1.20622 -4.77508 0.379779
+4.77508 -1.20622 0.379779
+4.34487 2.40357 0.260842
+-2.40357 4.34487 0.260842
+-4.34487 -2.40357 0.260842
+2.40357 -4.34487 0.260842
+2.10786 4.50587 0.224271
+-4.50587 2.10786 0.224271
+-2.10786 -4.50587 0.224271
+4.50587 -2.10786 0.224271
+0.886179 4.78251 0.503623
+-4.78251 0.886179 0.503623
+-0.886179 -4.78251 0.503623
+4.78251 -0.886179 0.503623
+4.6363 1.15692 -0.627691
+-1.15692 4.6363 -0.627691
+-4.6363 -1.15692 -0.627691
+1.15692 -4.6363 -0.627691
+4.87336 0.915053 -0.285019
+-0.915053 4.87336 -0.285019
+-4.87336 -0.915053 -0.285019
+0.915053 -4.87336 -0.285019
+4.94029 0.326401 0.309017
+-0.326401 4.94029 0.309017
+-4.94029 -0.326401 0.309017
+0.326401 -4.94029 0.309017
+4.80628 1.21925 -0.285019
+-1.21925 4.80628 -0.285019
+-4.80628 -1.21925 -0.285019
+1.21925 -4.80628 -0.285019
+4.76585 1.20262 -0.402906
+-1.20262 4.76585 -0.402906
+-4.76585 -1.20262 -0.402906
+1.20262 -4.76585 -0.402906
+0.902517 4.83675 0.391374
+-4.83675 0.902517 0.391374
+-0.902517 -4.83675 0.391374
+4.83675 -0.902517 0.391374
+4.38293 2.03092 -0.556876
+-2.03092 4.38293 -0.556876
+-4.38293 -2.03092 -0.556876
+2.03092 -4.38293 -0.556876
+4.44251 2.06599 -0.437116
+-2.06599 4.44251 -0.437116
+-4.44251 -2.06599 -0.437116
+2.06599 -4.44251 -0.437116
+3.62215 3.38093 -0.297042
+-3.38093 3.62215 -0.297042
+-3.62215 -3.38093 -0.297042
+3.38093 -3.62215 -0.297042
+2.08707 4.47607 0.344643
+-4.47607 2.08707 0.344643
+-2.08707 -4.47607 0.344643
+4.47607 -2.08707 0.344643
+3.94578 2.89491 0.448383
+-2.89491 3.94578 0.448383
+-3.94578 -2.89491 0.448383
+2.89491 -3.94578 0.448383
+4.58196 1.79285 -0.391374
+-1.79285 4.58196 -0.391374
+-4.58196 -1.79285 -0.391374
+1.79285 -4.58196 -0.391374
+2.63441 4.18247 0.33282
+-4.18247 2.63441 0.33282
+-2.63441 -4.18247 0.33282
+4.18247 -2.63441 0.33282
+3.6675 3.07539 0.61786
+-3.07539 3.6675 0.61786
+-3.6675 -3.07539 0.61786
+3.07539 -3.6675 0.61786
+4.71138 1.18258 -0.51444
+-1.18258 4.71138 -0.51444
+-4.71138 -1.18258 -0.51444
+1.18258 -4.71138 -0.51444
+2.06012 4.43281 0.45958
+-4.43281 2.06012 0.45958
+-2.06012 -4.43281 0.45958
+4.43281 -2.06012 0.45958
+4.23851 1.95107 -0.745941
+-1.95107 4.23851 -0.745941
+-4.23851 -1.95107 -0.745941
+1.95107 -4.23851 -0.745941
+3.88515 2.85869 0.567269
+-2.85869 3.88515 0.567269
+-3.88515 -2.85869 0.567269
+2.85869 -3.88515 0.567269
+2.00391 4.1604 -0.786288
+-4.1604 2.00391 -0.786288
+-2.00391 -4.1604 -0.786288
+4.1604 -2.00391 -0.786288
+0.597034 4.88387 0.391374
+-4.88387 0.597034 0.391374
+-0.597034 -4.88387 0.391374
+4.88387 -0.597034 0.391374
+2.84636 3.95937 0.481754
+-3.95937 2.84636 0.481754
+-2.84636 -3.95937 0.481754
+3.95937 -2.84636 0.481754
+2.11123 4.43873 -0.402906
+-4.43873 2.11123 -0.402906
+-2.11123 -4.43873 -0.402906
+4.43873 -2.11123 -0.402906
+3.7365 3.12366 0.492727
+-3.12366 3.7365 0.492727
+-3.7365 -3.12366 0.492727
+3.12366 -3.7365 0.492727
+2.52827 4.04545 0.637424
+-4.04545 2.52827 0.637424
+-2.52827 -4.04545 0.637424
+4.04545 -2.52827 0.637424
+4.61233 1.21829 0.637424
+-1.21829 4.61233 0.637424
+-4.61233 -1.21829 0.637424
+1.21829 -4.61233 0.637424
+0.584134 4.82872 0.503623
+-4.82872 0.584134 0.503623
+-0.584134 -4.82872 0.503623
+4.82872 -0.584134 0.503623
+0.863523 4.69979 0.627691
+-4.69979 0.863523 0.627691
+-0.863523 -4.69979 0.627691
+4.69979 -0.863523 0.627691
+4.44754 1.72545 -0.637424
+-1.72545 4.44754 -0.637424
+-4.44754 -1.72545 -0.637424
+1.72545 -4.44754 -0.637424
+4.75082 0.332477 0.647056
+-0.332477 4.75082 0.647056
+-4.75082 -0.332477 0.647056
+0.332477 -4.75082 0.647056
+0.554076 4.67884 0.70265
+-4.67884 0.554076 0.70265
+-0.554076 -4.67884 0.70265
+4.67884 -0.554076 0.70265
+0.276833 4.83641 0.535827
+-4.83641 0.276833 0.535827
+-0.276833 -4.83641 0.535827
+4.83641 -0.276833 0.535827
+4.45421 1.09901 -0.809017
+-1.09901 4.45421 -0.809017
+-4.45421 -1.09901 -0.809017
+1.09901 -4.45421 -0.809017
+2.02382 4.3705 0.577573
+-4.3705 2.02382 0.577573
+-2.02382 -4.3705 0.577573
+4.3705 -2.02382 0.577573
+2.28616 4.22238 0.597905
+-4.22238 2.28616 0.597905
+-2.28616 -4.22238 0.597905
+4.22238 -2.28616 0.597905
+4.26657 1.33549 -0.882291
+-1.33549 4.26657 -0.882291
+-4.26657 -1.33549 -0.882291
+1.33549 -4.26657 -0.882291
+0.26663 4.76306 0.637424
+-4.76306 0.26663 0.637424
+-0.26663 -4.76306 0.637424
+4.76306 -0.26663 0.637424
+4.82615 0.331654 0.546394
+-0.331654 4.82615 0.546394
+-4.82615 -0.331654 0.546394
+0.331654 -4.82615 0.546394
+0.569754 4.76001 0.60793
+-4.76001 0.569754 0.60793
+-0.569754 -4.76001 0.60793
+4.76001 -0.569754 0.60793
+2.88679 3.41374 -0.882291
+-3.41374 2.88679 -0.882291
+-2.88679 -3.41374 -0.882291
+3.41374 -2.88679 -0.882291
+3.59961 3.02617 0.711536
+-3.02617 3.59961 0.711536
+-3.59961 -3.02617 0.711536
+3.02617 -3.59961 0.711536
+2.03923 4.24737 -0.70265
+-4.24737 2.03923 -0.70265
+-2.03923 -4.24737 -0.70265
+4.24737 -2.03923 -0.70265
+1.9853 4.30147 0.675333
+-4.30147 1.9853 0.675333
+-1.9853 -4.30147 0.675333
+4.30147 -1.9853 0.675333
+0.242662 4.56082 0.823533
+-4.56082 0.242662 0.823533
+-0.242662 -4.56082 0.823533
+4.56082 -0.242662 0.823533
+1.08993 4.42461 0.830596
+-4.42461 1.08993 0.830596
+-1.08993 -4.42461 0.830596
+4.42461 -1.08993 0.830596
+0.608228 4.42914 -0.882291
+-4.42914 0.608228 -0.882291
+-0.608228 -4.42914 -0.882291
+4.42914 -0.608228 -0.882291
+3.07159 3.33752 0.844328
+-3.33752 3.07159 0.844328
+-3.07159 -3.33752 0.844328
+3.33752 -3.07159 0.844328
+2.06948 4.3243 -0.60793
+-4.3243 2.06948 -0.60793
+-2.06948 -4.3243 -0.60793
+4.3243 -2.06948 -0.60793
+2.80838 3.80475 -0.684547
+-3.80475 2.80838 -0.684547
+-2.80838 -3.80475 -0.684547
+3.80475 -2.80838 -0.684547
+1.94209 4.22178 0.762443
+-4.22178 1.94209 0.762443
+-1.94209 -4.22178 0.762443
+4.22178 -1.94209 0.762443
+3.06144 3.64807 -0.647056
+-3.64807 3.06144 -0.647056
+-3.06144 -3.64807 -0.647056
+3.64807 -3.06144 -0.647056
+2.53234 3.57348 0.925077
+-3.57348 2.53234 0.925077
+-2.53234 -3.57348 0.925077
+3.57348 -2.53234 0.925077
+4.50448 0.81477 -0.816339
+-0.81477 4.50448 -0.816339
+-4.50448 -0.81477 -0.816339
+0.81477 -4.50448 -0.816339
+4.52771 1.20202 0.728969
+-1.20202 4.52771 0.728969
+-4.52771 -1.20202 0.728969
+1.20202 -4.52771 0.728969
+2.19826 4.0833 0.770513
+-4.0833 2.19826 0.770513
+-2.19826 -4.0833 0.770513
+4.0833 -2.19826 0.770513
+3.00994 3.57757 -0.737513
+-3.57757 3.00994 -0.737513
+-3.00994 -3.57757 -0.737513
+3.57757 -3.00994 -0.737513
+1.91606 3.95131 -0.920232
+-3.95131 1.91606 -0.920232
+-1.91606 -3.95131 -0.920232
+3.95131 -1.91606 -0.920232
+0.254857 4.66838 0.737513
+-4.66838 0.254857 0.737513
+-0.254857 -4.66838 0.737513
+4.66838 -0.254857 0.737513
+4.42269 1.18069 0.816339
+-1.18069 4.42269 0.816339
+-4.42269 -1.18069 0.816339
+1.18069 -4.42269 0.816339
+1.20552 4.54551 -0.711536
+-4.54551 1.20552 -0.711536
+-1.20552 -4.54551 -0.711536
+4.54551 -1.20552 -0.711536
+4.31616 1.9934 -0.656586
+-1.9934 4.31616 -0.656586
+-4.31616 -1.9934 -0.656586
+1.9934 -4.31616 -0.656586
+4.142 1.89972 -0.830596
+-1.89972 4.142 -0.830596
+-4.142 -1.89972 -0.830596
+1.89972 -4.142 -0.830596
+1.67187 4.08553 -0.910106
+-4.08553 1.67187 -0.910106
+-1.67187 -4.08553 -0.910106
+4.08553 -1.67187 -0.910106
+4.55543 1.13066 -0.720309
+-1.13066 4.55543 -0.720309
+-4.55543 -1.13066 -0.720309
+1.13066 -4.55543 -0.720309
+1.8899 4.12335 0.844328
+-4.12335 1.8899 0.844328
+-1.8899 -4.12335 0.844328
+4.12335 -1.8899 0.844328
+2.98485 3.25229 0.910106
+-3.25229 2.98485 0.910106
+-2.98485 -3.25229 0.910106
+3.25229 -2.98485 0.910106
+2.60902 3.67092 0.863923
+-3.67092 2.60902 0.863923
+-2.60902 -3.67092 0.863923
+3.67092 -2.60902 0.863923
+4.34201 1.06496 -0.882291
+-1.06496 4.34201 -0.882291
+-4.34201 -1.06496 -0.882291
+1.06496 -4.34201 -0.882291
+4.39315 0.886772 0.876307
+-0.886772 4.39315 0.876307
+-4.39315 -0.886772 0.876307
+0.886772 -4.39315 0.876307
+1.59625 4.16411 0.888136
+-4.16411 1.59625 0.888136
+-1.59625 -4.16411 0.888136
+4.16411 -1.59625 0.888136
+1.23048 3.97661 0.986686
+-3.97661 1.23048 0.986686
+-1.23048 -3.97661 0.986686
+3.97661 -1.23048 0.986686
+3.18803 2.5587 -0.996134
+-2.5587 3.18803 -0.996134
+-3.18803 -2.5587 -0.996134
+2.5587 -3.18803 -0.996134
+1.0521 4.29891 0.904827
+-4.29891 1.0521 0.904827
+-1.0521 -4.29891 0.904827
+4.29891 -1.0521 0.904827
+4.3442 0.325971 0.934329
+-0.325971 4.3442 0.934329
+-4.3442 -0.325971 0.934329
+0.325971 -4.3442 0.934329
+1.16769 4.36081 -0.857527
+-4.36081 1.16769 -0.857527
+-1.16769 -4.36081 -0.857527
+4.36081 -1.16769 -0.857527
+4.14354 1.58717 -0.899405
+-1.58717 4.14354 -0.899405
+-4.14354 -1.58717 -0.899405
+1.58717 -4.14354 -0.899405
+1.95995 4.05478 -0.863923
+-4.05478 1.95995 -0.863923
+-1.95995 -4.05478 -0.863923
+4.05478 -1.95995 -0.863923
+2.62111 3.07127 -0.999289
+-3.07127 2.62111 -0.999289
+-2.62111 -3.07127 -0.999289
+3.07127 -2.62111 -0.999289
+1.83375 4.01548 0.910106
+-4.01548 1.83375 0.910106
+-1.83375 -4.01548 0.910106
+4.01548 -1.83375 0.910106
+2.70869 3.6514 -0.837528
+-3.6514 2.70869 -0.837528
+-2.70869 -3.6514 -0.837528
+3.6514 -2.70869 -0.837528
+4.27259 0.0553048 0.962028
+-0.0553048 4.27259 0.962028
+-4.27259 -0.0553048 0.962028
+0.0553048 -4.27259 0.962028
+3.75398 2.32257 -0.910106
+-2.32257 3.75398 -0.910106
+-3.75398 -2.32257 -0.910106
+2.32257 -3.75398 -0.910106
+4.21199 0.321906 0.974527
+-0.321906 4.21199 0.974527
+-4.21199 -0.321906 0.974527
+0.321906 -4.21199 0.974527
+1.62836 3.96356 -0.958522
+-3.96356 1.62836 -0.958522
+-1.62836 -3.96356 -0.958522
+3.96356 -1.62836 -0.958522
+2.95141 3.49905 -0.816339
+-3.49905 2.95141 -0.816339
+-2.95141 -3.49905 -0.816339
+3.49905 -2.95141 -0.816339
+4.02315 1.2471 -0.977268
+-1.2471 4.02315 -0.977268
+-4.02315 -1.2471 -0.977268
+1.2471 -4.02315 -0.977268
+1.14172 4.24036 -0.920232
+-4.24036 1.14172 -0.920232
+-1.14172 -4.24036 -0.920232
+4.24036 -1.14172 -0.920232
+2.19463 3.5662 0.982287
+-3.5662 2.19463 0.982287
+-2.19463 -3.5662 0.982287
+3.5662 -2.19463 0.982287
+4.23231 1.03241 -0.934329
+-1.03241 4.23231 -0.934329
+-4.23231 -1.03241 -0.934329
+1.03241 -4.23231 -0.934329
+2.27641 3.68663 0.942991
+-3.68663 2.27641 0.942991
+-2.27641 -3.68663 0.942991
+3.68663 -2.27641 0.942991
+2.59158 3.22568 0.990461
+-3.22568 2.59158 0.990461
+-2.59158 -3.22568 0.990461
+3.22568 -2.59158 0.990461
+3.65704 2.25624 -0.954865
+-2.25624 3.65704 -0.954865
+-3.65704 -2.25624 -0.954865
+2.25624 -3.65704 -0.954865
+4.28068 0.869669 0.929776
+-0.869669 4.28068 0.929776
+-4.28068 -0.869669 0.929776
+0.869669 -4.28068 0.929776
+4.14806 1.2921 -0.938734
+-1.2921 4.14806 -0.938734
+-4.14806 -1.2921 -0.938734
+1.2921 -4.14806 -0.938734
+2.47984 3.31236 -0.990461
+-3.31236 2.47984 -0.990461
+-2.47984 -3.31236 -0.990461
+3.31236 -2.47984 -0.990461
+1.55001 4.05874 0.938734
+-4.05874 1.55001 0.938734
+-1.55001 -4.05874 0.938734
+4.05874 -1.55001 0.938734
+4.06509 1.10275 0.977268
+-1.10275 4.06509 0.977268
+-4.06509 -1.10275 0.977268
+1.10275 -4.06509 0.977268
+1.45323 3.8342 0.994951
+-3.8342 1.45323 0.994951
+-1.45323 -3.8342 0.994951
+3.8342 -1.45323 0.994951
+2.45175 3.46991 0.968583
+-3.46991 2.45175 0.968583
+-2.45175 -3.46991 0.968583
+3.46991 -2.45175 0.968583
+2.90838 3.01256 -0.982287
+-3.01256 2.90838 -0.982287
+-2.90838 -3.01256 -0.982287
+3.01256 -2.90838 -0.982287
+3.8003 0.306299 0.982287
+-0.306299 3.8003 0.982287
+-3.8003 -0.306299 0.982287
+0.306299 -3.8003 0.982287
+1.18452 3.84689 0.999684
+-3.84689 1.18452 0.999684
+-1.18452 -3.84689 0.999684
+3.84689 -1.18452 0.999684
+4.08804 0.317601 0.994951
+-0.317601 4.08804 0.994951
+-4.08804 -0.317601 0.994951
+0.317601 -4.08804 0.994951
+4.15899 0.583383 0.979855
+-0.583383 4.15899 0.979855
+-4.15899 -0.583383 0.979855
+0.583383 -4.15899 0.979855
+4.10531 0.995425 -0.974527
+-0.995425 4.10531 -0.974527
+-4.10531 -0.995425 -0.974527
+0.995425 -4.10531 -0.974527
+3.58936 1.90336 -0.998027
+-1.90336 3.58936 -0.998027
+-3.58936 -1.90336 -0.998027
+1.90336 -3.58936 -0.998027
+2.67283 3.31825 0.965382
+-3.31825 2.67283 0.965382
+-2.67283 -3.31825 0.965382
+3.31825 -2.67283 0.965382
+1.30644 3.82049 -0.999289
+-3.82049 1.30644 -0.999289
+-1.30644 -3.82049 -0.999289
+3.82049 -1.30644 -0.999289
+1.34192 3.94041 -0.986686
+-3.94041 1.34192 -0.986686
+-1.34192 -3.94041 -0.986686
+3.94041 -1.34192 -0.986686
+2.40882 3.20909 -0.999921
+-3.20909 2.40882 -0.999921
+-2.40882 -3.20909 -0.999921
+3.20909 -2.40882 -0.999921
+4.16257 0.851121 0.968583
+-0.851121 4.16257 0.968583
+-4.16257 -0.851121 0.968583
+0.851121 -4.16257 0.968583
+3.55595 2.1877 -0.984564
+-2.1877 3.55595 -0.984564
+-3.55595 -2.1877 -0.984564
+2.1877 -3.55595 -0.984564
+2.36872 3.36226 0.993611
+-3.36226 2.36872 0.993611
+-2.36872 -3.36226 0.993611
+3.36226 -2.36872 0.993611
+1.2718 4.09193 0.958522
+-4.09193 1.2718 0.958522
+-1.2718 -4.09193 0.958522
+4.09193 -1.2718 0.958522
+0.303207 3.72684 -0.965382
+-3.72684 0.303207 -0.965382
+-0.303207 -3.72684 -0.965382
+3.72684 -0.303207 -0.965382
+0.567408 3.99762 -0.999289
+-3.99762 0.567408 -0.999289
+-0.567408 -3.99762 -0.999289
+3.99762 -0.567408 -0.999289
+0.321906 4.21199 -0.974527
+-4.21199 0.321906 -0.974527
+-0.321906 -4.21199 -0.974527
+4.21199 -0.321906 -0.974527
+3.9861 0.961218 -0.994951
+-0.961218 3.9861 -0.994951
+-3.9861 -0.961218 -0.994951
+0.961218 -3.9861 -0.994951
+3.34788 2.04811 -0.997159
+-2.04811 3.34788 -0.997159
+-3.34788 -2.04811 -0.997159
+2.04811 -3.34788 -0.997159
+2.29239 3.26261 0.999921
+-3.26261 2.29239 0.999921
+-2.29239 -3.26261 0.999921
+3.26261 -2.29239 0.999921
+4.04067 0.831488 0.992115
+-0.831488 4.04067 0.992115
+-4.04067 -0.831488 0.992115
+0.831488 -4.04067 0.992115
+3.45234 2.11798 -0.998737
+-2.11798 3.45234 -0.998737
+-3.45234 -2.11798 -0.998737
+2.11798 -3.45234 -0.998737
+1.40408 3.71862 0.999684
+-3.71862 1.40408 0.999684
+-1.40408 -3.71862 0.999684
+3.71862 -1.40408 0.999684
+4.14773 0.733029 -0.977268
+-0.733029 4.14773 -0.977268
+-4.14773 -0.733029 -0.977268
+0.733029 -4.14773 -0.977268
+3.45409 1.19619 0.938734
+-1.19619 3.45409 0.938734
+-3.45409 -1.19619 0.938734
+1.19619 -3.45409 0.938734
+1.50211 3.94818 0.974527
+-3.94818 1.50211 0.974527
+-1.50211 -3.94818 0.974527
+3.94818 -1.50211 0.974527
+1.46997 3.53124 -0.984564
+-3.53124 1.46997 -0.984564
+-1.46997 -3.53124 -0.984564
+3.53124 -1.46997 -0.984564
+3.91007 0.558491 0.998737
+-0.558491 3.91007 0.998737
+-3.91007 -0.558491 0.998737
+0.558491 -3.91007 0.998737
+3.91585 0.682412 -0.999684
+-0.682412 3.91585 -0.999684
+-3.91585 -0.682412 -0.999684
+0.682412 -3.91585 -0.999684
+1.9851 3.72878 0.974527
+-3.72878 1.9851 0.974527
+-1.9851 -3.72878 0.974527
+3.72878 -1.9851 0.974527
+3.79639 1.29926 0.999921
+-1.29926 3.79639 0.999921
+-3.79639 -1.29926 0.999921
+1.29926 -3.79639 0.999921
+1.13465 3.70481 0.992115
+-3.70481 1.13465 0.992115
+-1.13465 -3.70481 0.992115
+3.70481 -1.13465 0.992115
+0.553345 3.86018 -0.994951
+-3.86018 0.553345 -0.994951
+-0.553345 -3.86018 -0.994951
+3.86018 -0.553345 -0.994951
+1.67875 3.4094 -0.979855
+-3.4094 1.67875 -0.979855
+-1.67875 -3.4094 -0.979855
+3.4094 -1.67875 -0.979855
+2.25295 2.98421 -0.965382
+-2.98421 2.25295 -0.965382
+-2.25295 -2.98421 -0.965382
+2.98421 -2.25295 -0.965382
+2.97997 2.3782 -0.982287
+-2.3782 2.97997 -0.982287
+-2.97997 -2.3782 -0.982287
+2.3782 -2.97997 -0.982287
+3.91689 0.811149 1
+-0.811149 3.91689 1
+-3.91689 -0.811149 1
+0.811149 -3.91689 1
+3.93742 0.311873 0.998737
+-0.311873 3.93742 0.998737
+-3.93742 -0.311873 0.998737
+0.311873 -3.93742 0.998737
+0.31335 3.9751 -0.999921
+-3.9751 0.31335 -0.999921
+-0.31335 -3.9751 -0.999921
+3.9751 -0.31335 -0.999921
+3.61304 1.50029 0.996134
+-1.50029 3.61304 0.996134
+-3.61304 -1.50029 0.996134
+1.50029 -3.61304 0.996134
+2.53559 2.96276 -0.994951
+-2.96276 2.53559 -0.994951
+-2.53559 -2.96276 -0.994951
+2.96276 -2.53559 -0.994951
+3.57698 0.379895 -0.915241
+-0.379895 3.57698 -0.915241
+-3.57698 -0.379895 -0.915241
+0.379895 -3.57698 -0.915241
+3.82148 1.04699 0.999289
+-1.04699 3.82148 0.999289
+-3.82148 -1.04699 0.999289
+1.04699 -3.82148 0.999289
+2.21642 3.16293 0.990461
+-3.16293 2.21642 0.990461
+-2.21642 -3.16293 0.990461
+3.16293 -2.21642 0.990461
+3.6997 1.01862 0.986686
+-1.01862 3.6997 0.986686
+-3.6997 -1.01862 0.986686
+1.01862 -3.6997 0.986686
+4.0351 0.571176 0.997159
+-0.571176 4.0351 0.997159
+-4.0351 -0.571176 0.997159
+0.571176 -4.0351 0.997159
+2.74976 2.08954 0.837528
+-2.08954 2.74976 0.837528
+-2.74976 -2.08954 0.837528
+2.08954 -2.74976 0.837528
+0.170355 3.78416 0.977268
+-3.78416 0.170355 0.977268
+-0.170355 -3.78416 0.977268
+3.78416 -0.170355 0.977268
+2.33032 3.09559 -0.992115
+-3.09559 2.33032 -0.992115
+-2.33032 -3.09559 -0.992115
+3.09559 -2.33032 -0.992115
+3.72338 0.165275 -0.962028
+0.160318 3.66367 0.942991
+-0.165275 3.72338 -0.962028
+-3.66367 0.160318 0.942991
+-3.72338 -0.165275 -0.962028
+-0.160318 -3.66367 0.942991
+0.165275 -3.72338 -0.962028
+3.66367 -0.160318 0.942991
+3.74476 0.893066 -0.988652
+-0.893066 3.74476 -0.988652
+-3.74476 -0.893066 -0.988652
+0.893066 -3.74476 -0.988652
+1.27047 3.70011 -0.996134
+-3.70011 1.27047 -0.996134
+-1.27047 -3.70011 -0.996134
+3.70011 -1.27047 -0.996134
+1.73435 3.53463 -0.998027
+-3.53463 1.73435 -0.998027
+-1.73435 -3.53463 -0.998027
+3.53463 -1.73435 -0.998027
+3.86528 0.926944 -0.999684
+-0.926944 3.86528 -0.999684
+-3.86528 -0.926944 -0.999684
+0.926944 -3.86528 -0.999684
+3.70566 0.398742 -0.962028
+-0.398742 3.70566 -0.962028
+-3.70566 -0.398742 -0.962028
+0.398742 -3.70566 -0.962028
+2.81715 2.91 -0.998737
+-2.91 2.81715 -0.998737
+-2.81715 -2.91 -0.998737
+2.91 -2.81715 -0.998737
+3.08375 2.46801 -0.998737
+-2.46801 3.08375 -0.998737
+-3.08375 -2.46801 -0.998737
+2.46801 -3.08375 -0.998737
+3.79317 0.7905 0.992115
+-0.7905 3.79317 0.992115
+-3.79317 -0.7905 0.992115
+0.7905 -3.79317 0.992115
+3.19274 2.2391 -0.994951
+-2.2391 3.19274 -0.994951
+-3.19274 -2.2391 -0.994951
+2.2391 -3.19274 -0.994951
+0.420344 3.8518 0.992115
+-3.8518 0.420344 0.992115
+-0.420344 -3.8518 0.992115
+3.8518 -0.420344 0.992115
+3.79344 0.656169 -0.988652
+-0.656169 3.79344 -0.988652
+-3.79344 -0.656169 -0.988652
+0.656169 -3.79344 -0.988652
+3.56939 1.2311 0.974527
+-1.2311 3.56939 0.974527
+-3.56939 -1.2311 0.974527
+1.2311 -3.56939 0.974527
+3.38353 1.78387 -0.984564
+-1.78387 3.38353 -0.984564
+-3.38353 -1.78387 -0.984564
+1.78387 -3.38353 -0.984564
+3.85817 0.176602 -0.990461
+-0.176602 3.85817 -0.990461
+-3.85817 -0.176602 -0.990461
+0.176602 -3.85817 -0.990461
+1.42318 3.40557 -0.951057
+-3.40557 1.42318 -0.951057
+-1.42318 -3.40557 -0.951057
+3.40557 -1.42318 -0.951057
+0.308347 3.84988 -0.990461
+-3.84988 0.308347 -0.990461
+-0.308347 -3.84988 -0.990461
+3.84988 -0.308347 -0.990461
+0.540459 3.73685 -0.974527
+-3.73685 0.540459 -0.974527
+-0.540459 -3.73685 -0.974527
+3.73685 -0.540459 -0.974527
+2.14196 3.06485 0.965382
+-3.06485 2.14196 0.965382
+-2.14196 -3.06485 0.965382
+3.06485 -2.14196 0.965382
+3.67331 0.630635 -0.962028
+-0.630635 3.67331 -0.962028
+-3.67331 -0.630635 -0.962028
+0.630635 -3.67331 -0.962028
+2.36244 2.62199 0.882291
+-2.62199 2.36244 0.882291
+-2.36244 -2.62199 0.882291
+2.62199 -2.36244 0.882291
+3.94391 1.0752 0.996134
+-1.0752 3.94391 0.996134
+-3.94391 -1.0752 0.996134
+1.0752 -3.94391 0.996134
+2.06309 2.96072 0.920232
+-2.96072 2.06309 0.920232
+-2.06309 -2.96072 0.920232
+2.96072 -2.06309 0.920232
+0.366902 3.48803 0.870184
+-3.48803 0.366902 0.870184
+-0.366902 -3.48803 0.870184
+3.48803 -0.366902 0.870184
+3.09401 2.16407 -0.974527
+-2.16407 3.09401 -0.974527
+-3.09401 -2.16407 -0.974527
+2.16407 -3.09401 -0.974527
+2.78092 2.5177 -0.968583
+-2.5177 2.78092 -0.968583
+-2.78092 -2.5177 -0.968583
+2.5177 -2.78092 -0.968583
+3.53933 0.295116 0.893841
+0.297594 3.59633 -0.920232
+-0.295116 3.53933 0.893841
+-3.59633 0.297594 -0.920232
+-3.53933 -0.295116 0.893841
+-0.297594 -3.59633 -0.920232
+0.295116 -3.53933 0.893841
+3.59633 -0.297594 -0.920232
+0.736385 3.47444 -0.893841
+-3.47444 0.736385 -0.893841
+-0.736385 -3.47444 -0.893841
+3.47444 -0.736385 -0.893841
+3.78586 0.545605 0.984564
+-0.545605 3.78586 0.984564
+-3.78586 -0.545605 0.984564
+0.545605 -3.78586 0.984564
+2.88779 2.2987 -0.951057
+-2.2987 2.88779 -0.951057
+-2.88779 -2.2987 -0.951057
+2.2987 -2.88779 -0.951057
+0.526528 3.60534 -0.934329
+-3.60534 0.526528 -0.934329
+-0.526528 -3.60534 -0.934329
+3.60534 -0.526528 -0.934329
+3.60527 0.155493 -0.920232
+-0.155493 3.60527 -0.920232
+-3.60527 -0.155493 -0.920232
+0.155493 -3.60527 -0.920232
+3.33337 1.15955 0.882291
+-1.15955 3.33337 0.882291
+-3.33337 -1.15955 0.882291
+1.15955 -3.33337 0.882291
+3.39439 1.41901 0.947098
+-1.41901 3.39439 0.947098
+-3.39439 -1.41901 0.947098
+1.41901 -3.39439 0.947098
+2.92661 1.69524 0.786288
+-1.69524 2.92661 0.786288
+-2.92661 -1.69524 0.786288
+1.69524 -2.92661 0.786288
+1.30777 3.49007 0.962028
+-3.49007 1.30777 0.962028
+-1.30777 -3.49007 0.962028
+3.49007 -1.30777 0.962028
+0.384929 3.61142 0.929776
+-3.61142 0.384929 0.929776
+-0.384929 -3.61142 0.929776
+3.61142 -0.384929 0.929776
+0.148973 3.52615 0.882291
+-3.52615 0.148973 0.882291
+-0.148973 -3.52615 0.882291
+3.52615 -0.148973 0.882291
+3.4559 0.362205 -0.850994
+-0.362205 3.4559 -0.850994
+-3.4559 -0.362205 -0.850994
+0.362205 -3.4559 -0.850994
+3.29407 0.284672 0.720309
+-0.284672 3.29407 0.720309
+-3.29407 -0.284672 0.720309
+0.284672 -3.29407 0.720309
+3.28594 0.128898 -0.70265
+-0.128898 3.28594 -0.70265
+-3.28594 -0.128898 -0.70265
+0.128898 -3.28594 -0.70265
+2.52623 2.78964 0.971632
+-2.78964 2.52623 0.971632
+-2.52623 -2.78964 0.971632
+2.78964 -2.52623 0.971632
+2.72383 2.15758 -0.850994
+-2.15758 2.72383 -0.850994
+-2.72383 -2.15758 -0.850994
+2.15758 -2.72383 -0.850994
+3.31312 0.772986 -0.801567
+-0.772986 3.31312 -0.801567
+-3.31312 -0.772986 -0.801567
+0.772986 -3.31312 -0.801567
+0.292715 3.4841 -0.863923
+-3.4841 0.292715 -0.863923
+-0.292715 -3.4841 -0.863923
+3.4841 -0.292715 -0.863923
+1.66312 2.76833 0.637424
+-2.76833 1.66312 0.637424
+-1.66312 -2.76833 0.637424
+2.76833 -1.66312 0.637424
+0.337618 3.28906 0.720309
+-3.28906 0.337618 0.720309
+-0.337618 -3.28906 0.720309
+3.28906 -0.337618 0.720309
+2.42046 2.37645 0.79399
+-2.37645 2.42046 0.79399
+-2.42046 -2.37645 0.79399
+2.37645 -2.42046 0.79399
+2.83568 1.64781 0.693653
+-1.64781 2.83568 0.693653
+-2.83568 -1.64781 0.693653
+1.64781 -2.83568 0.693653
+3.13168 1.55474 0.863923
+-1.55474 3.13168 0.863923
+-3.13168 -1.55474 0.863923
+1.55474 -3.13168 0.863923
+3.35438 0.347304 -0.778462
+-0.347304 3.35438 -0.778462
+-3.35438 -0.347304 -0.778462
+0.347304 -3.35438 -0.778462
+2.89506 1.27273 -0.546394
+-1.27273 2.89506 -0.546394
+-2.89506 -1.27273 -0.546394
+1.27273 -2.89506 -0.546394
+3.31456 0.07707 0.728969
+-0.07707 3.31456 0.728969
+-3.31456 -0.07707 0.728969
+0.07707 -3.31456 0.728969
+3.58046 0.990636 0.958522
+-0.990636 3.58046 0.958522
+-3.58046 -0.990636 0.958522
+0.990636 -3.58046 0.958522
+0.351647 3.38387 0.801567
+-3.38387 0.351647 0.801567
+-0.351647 -3.38387 0.801567
+3.38387 -0.351647 0.801567
+3.42161 0.0748271 0.816339
+-0.0748271 3.42161 0.816339
+-3.42161 -0.0748271 0.816339
+0.0748271 -3.42161 0.816339
+2.87309 1.43989 0.61786
+-1.43989 2.87309 0.61786
+-2.87309 -1.43989 0.61786
+1.43989 -2.87309 0.61786
+0.139319 3.40937 0.809017
+-3.40937 0.139319 0.809017
+-0.139319 -3.40937 0.809017
+3.40937 -0.139319 0.809017
+0.0739989 3.46338 -0.844328
+-3.46338 0.0739989 -0.844328
+-0.0739989 -3.46338 -0.844328
+3.46338 -0.0739989 -0.844328
+2.49796 2.44639 0.863923
+-2.44639 2.49796 0.863923
+-2.49796 -2.44639 0.863923
+2.44639 -2.49796 0.863923
+3.55361 0.7499 0.929776
+-0.7499 3.55361 0.929776
+-3.55361 -0.7499 0.929776
+0.7499 -3.55361 0.929776
+2.44234 2.70383 0.934329
+-2.70383 2.44234 0.934329
+-2.44234 -2.70383 0.934329
+2.70383 -2.44234 0.934329
+3.67144 0.769948 0.968583
+-0.769948 3.67144 0.968583
+-3.67144 -0.769948 0.968583
+0.769948 -3.67144 0.968583
+1.77151 3.36213 0.979855
+-3.36213 1.77151 0.979855
+-1.77151 -3.36213 0.979855
+3.36213 -1.77151 0.979855
+2.46988 2.14461 0.684547
+-2.14461 2.46988 0.684547
+-2.46988 -2.14461 0.684547
+2.14461 -2.46988 0.684547
+0.0804056 3.18265 -0.577573
+-3.18265 0.0804056 -0.577573
+-0.0804056 -3.18265 -0.577573
+3.18265 -0.0804056 -0.577573
+2.5494 2.20749 0.778462
+-2.20749 2.5494 0.778462
+-2.5494 -2.20749 0.778462
+2.20749 -2.5494 0.778462
+2.06553 2.61707 0.745941
+-2.61707 2.06553 0.745941
+-2.06553 -2.61707 0.745941
+2.61707 -2.06553 0.745941
+0.0698067 3.67839 -0.947098
+-3.67839 0.0698067 -0.947098
+-0.0698067 -3.67839 -0.947098
+3.67839 -0.0698067 -0.947098
+3.38928 0.137644 -0.79399
+-0.137644 3.38928 -0.79399
+-3.38928 -0.137644 -0.79399
+0.137644 -3.38928 -0.79399
+3.1274 0.514284 -0.556876
+-0.514284 3.1274 -0.556876
+-3.1274 -0.514284 -0.556876
+0.514284 -3.1274 -0.556876
+2.94972 1.47366 0.711536
+-1.47366 2.94972 0.711536
+-2.94972 -1.47366 0.711536
+1.47366 -2.94972 0.711536
+0.131205 3.31286 0.728969
+-3.31286 0.131205 0.728969
+-0.131205 -3.31286 0.728969
+3.31286 -0.131205 0.728969
+0.0760532 3.36172 -0.770513
+-3.36172 0.0760532 -0.770513
+-0.0760532 -3.36172 -0.770513
+3.36172 -0.0760532 -0.770513
+2.95783 1.25665 0.61786
+-1.25665 2.95783 0.61786
+-2.95783 -1.25665 0.61786
+1.25665 -2.95783 0.61786
+1.55494 2.65279 -0.379779
+-2.65279 1.55494 -0.379779
+-1.55494 -2.65279 -0.379779
+2.65279 -1.55494 -0.379779
+2.80174 1.40898 0.503623
+-1.40898 2.80174 0.503623
+-2.80174 -1.40898 0.503623
+1.40898 -2.80174 0.503623
+0.888664 3.001 0.492727
+-3.001 0.888664 0.492727
+-0.888664 -3.001 0.492727
+3.001 -0.888664 0.492727
+0.963324 3.21158 0.762443
+-3.21158 0.963324 0.762443
+-0.963324 -3.21158 0.762443
+3.21158 -0.963324 0.762443
+3.03636 1.51218 0.79399
+-1.51218 3.03636 0.79399
+-3.03636 -1.51218 0.79399
+1.51218 -3.03636 0.79399
+3.49332 0.146267 -0.863923
+-0.146267 3.49332 -0.863923
+-3.49332 -0.146267 -0.863923
+0.146267 -3.49332 -0.863923
+2.72662 1.82261 0.693653
+-1.82261 2.72662 0.693653
+-2.72662 -1.82261 0.693653
+1.82261 -2.72662 0.693653
+3.18224 0.3214 -0.597905
+-0.3214 3.18224 -0.597905
+-3.18224 -0.3214 -0.597905
+0.3214 -3.18224 -0.597905
+3.29766 0.551224 -0.754251
+-0.551224 3.29766 -0.754251
+-3.29766 -0.551224 -0.754251
+0.551224 -3.29766 -0.754251
+2.00766 2.55033 0.656586
+-2.55033 2.00766 0.656586
+-2.00766 -2.55033 0.656586
+2.55033 -2.00766 0.656586
+0.0780921 3.2701 -0.684547
+-3.2701 0.0780921 -0.684547
+-0.0780921 -3.2701 -0.684547
+3.2701 -0.0780921 -0.684547
+1.16308 3.14475 0.762443
+-3.14475 1.16308 0.762443
+-1.16308 -3.14475 0.762443
+3.14475 -1.16308 0.762443
+2.06904 2.32439 0.45958
+-2.32439 2.06904 0.45958
+-2.06904 -2.32439 0.45958
+2.32439 -2.06904 0.45958
+3.22852 0.0791288 0.637424
+-0.0791288 3.22852 0.637424
+-3.22852 -0.0791288 0.637424
+0.0791288 -3.22852 0.637424
+1.12786 3.06133 0.675333
+-3.06133 1.12786 0.675333
+-1.12786 -3.06133 0.675333
+3.06133 -1.12786 0.675333
+0.299626 3.05099 0.356412
+-3.05099 0.299626 0.356412
+-0.299626 -3.05099 0.356412
+3.05099 -0.299626 0.356412
+0.700258 3.0569 0.503623
+-3.0569 0.700258 0.503623
+-0.700258 -3.0569 0.503623
+3.0569 -0.700258 0.503623
+0.739956 3.19513 0.693653
+-3.19513 0.739956 0.693653
+-0.739956 -3.19513 0.693653
+3.19513 -0.739956 0.693653
+0.476023 3.11956 -0.535827
+-3.11956 0.476023 -0.535827
+-0.476023 -3.11956 -0.535827
+3.11956 -0.476023 -0.535827
+3.15463 0.0812845 0.535827
+-0.0812845 3.15463 0.535827
+-3.15463 -0.0812845 0.535827
+0.0812845 -3.15463 0.535827
+1.05088 2.88477 0.368125
+-2.88477 1.05088 0.368125
+-1.05088 -2.88477 0.368125
+2.88477 -1.05088 0.368125
+1.07287 2.93367 0.481754
+-2.93367 1.07287 0.481754
+-1.07287 -2.93367 0.481754
+2.93367 -1.07287 0.481754
+2.8305 1.23925 -0.414376
+-1.23925 2.8305 -0.414376
+-2.8305 -1.23925 -0.414376
+1.23925 -2.8305 -0.414376
+2.65683 1.7808 0.597905
+-1.7808 2.65683 0.597905
+-2.65683 -1.7808 0.597905
+1.7808 -2.65683 0.597905
+1.48199 2.86042 0.627691
+-2.86042 1.48199 0.627691
+-1.48199 -2.86042 0.627691
+2.86042 -1.48199 0.627691
+2.79144 1.19881 0.272952
+-1.19881 2.79144 0.272952
+-2.79144 -1.19881 0.272952
+1.19881 -2.79144 0.272952
+2.98987 0.657278 0.344643
+-0.657278 2.98987 0.344643
+-2.98987 -0.657278 0.344643
+0.657278 -2.98987 0.344643
+3.2102 0.532458 -0.666012
+-0.532458 3.2102 -0.666012
+-3.2102 -0.532458 -0.666012
+0.532458 -3.2102 -0.666012
+3.04592 0.665187 0.470704
+-0.665187 3.04592 0.470704
+-3.04592 -0.665187 0.470704
+0.665187 -3.04592 0.470704
+2.83611 1.21335 0.402906
+1.20588 2.81375 -0.344643
+-1.21335 2.83611 0.402906
+-2.81375 1.20588 -0.344643
+-2.83611 -1.21335 0.402906
+-1.20588 -2.81375 -0.344643
+1.21335 -2.83611 0.402906
+2.81375 -1.20588 -0.344643
+2.9624 1.04848 0.51444
+-1.04848 2.9624 0.51444
+-2.9624 -1.04848 0.51444
+1.04848 -2.9624 0.51444
+1.53655 2.61314 -0.24869
+-2.61314 1.53655 -0.24869
+-1.53655 -2.61314 -0.24869
+2.61314 -1.53655 -0.24869
+1.03563 2.91677 -0.425779
+-2.91677 1.03563 -0.425779
+-1.03563 -2.91677 -0.425779
+2.91677 -1.03563 -0.425779
+3.00989 0.486418 -0.309017
+-0.486418 3.00989 -0.309017
+-3.00989 -0.486418 -0.309017
+0.486418 -3.00989 -0.309017
+1.58127 2.64865 0.402906
+-2.64865 1.58127 0.402906
+-1.58127 -2.64865 0.402906
+2.64865 -1.58127 0.402906
+1.03262 2.84688 0.236499
+-2.84688 1.03262 0.236499
+-1.03262 -2.84688 0.236499
+2.84688 -1.03262 0.236499
+0.123748 3.22712 0.637424
+-3.22712 0.123748 0.637424
+-0.123748 -3.22712 0.637424
+3.22712 -0.123748 0.637424
+0.8401 2.92315 -0.285019
+-2.92315 0.8401 -0.285019
+-0.8401 -2.92315 -0.285019
+2.92315 -0.8401 -0.285019
+2.90187 1.03157 0.391374
+-1.03157 2.90187 0.391374
+-2.90187 -1.03157 0.391374
+1.03157 -2.90187 0.391374
+1.39709 2.71909 0.33282
+-2.71909 1.39709 0.33282
+-1.39709 -2.71909 0.33282
+2.71909 -1.39709 0.33282
+0.522211 3.16319 0.60793
+-3.16319 0.522211 0.60793
+-0.522211 -3.16319 0.60793
+3.16319 -0.522211 0.60793
+2.59821 1.53041 0.175023
+-1.53041 2.59821 0.175023
+-2.59821 -1.53041 0.175023
+1.53041 -2.59821 0.175023
+1.37652 2.68821 0.19971
+-2.68821 1.37652 0.19971
+-1.37652 -2.68821 0.19971
+2.68821 -1.37652 0.19971
+2.00181 2.26142 0.19971
+-2.26142 2.00181 0.19971
+-2.00181 -2.26142 0.19971
+2.26142 -2.00181 0.19971
+1.52745 2.58945 -0.112856
+-2.58945 1.52745 -0.112856
+-1.52745 -2.58945 -0.112856
+2.58945 -1.52745 -0.112856
+2.76187 1.20012 -0.150226
+-1.20012 2.76187 -0.150226
+-2.76187 -1.20012 -0.150226
+1.20012 -2.76187 -0.150226
+1.71453 2.50792 0.272952
+-2.50792 1.71453 0.272952
+-1.71453 -2.50792 0.272952
+2.50792 -1.71453 0.272952
+2.12275 2.12703 -0.100362
+-2.12703 2.12275 -0.100362
+-2.12275 -2.12703 -0.100362
+2.12703 -2.12275 -0.100362
+1.21091 2.77906 0.24869
+-2.77906 1.21091 0.24869
+-1.21091 -2.77906 0.24869
+2.77906 -1.21091 0.24869
+2.83485 1.01578 0.150226
+-1.01578 2.83485 0.150226
+-2.83485 -1.01578 0.150226
+1.01578 -2.83485 0.150226
+2.48181 1.68892 -0.0627905
+-1.68892 2.48181 -0.0627905
+-2.48181 -1.68892 -0.0627905
+1.68892 -2.48181 -0.0627905
+0.840589 2.88386 0.0878512
+-2.88386 0.840589 0.0878512
+-0.840589 -2.88386 0.0878512
+2.88386 -0.840589 0.0878512
+2.71066 1.37172 0.272952
+-1.37172 2.71066 0.272952
+-2.71066 -1.37172 0.272952
+1.37172 -2.71066 0.272952
+2.38029 2.12523 -0.587785
+-2.12523 2.38029 -0.587785
+-2.38029 -2.12523 -0.587785
+2.12523 -2.38029 -0.587785
+1.02378 2.87192 -0.309017
+-2.87192 1.02378 -0.309017
+-1.02378 -2.87192 -0.309017
+2.87192 -1.02378 -0.309017
+1.69638 2.48807 0.150226
+-2.48807 1.69638 0.150226
+-1.69638 -2.48807 0.150226
+2.48807 -1.69638 0.150226
+1.8536 2.40272 -0.260842
+-2.40272 1.8536 -0.260842
+-1.8536 -2.40272 -0.260842
+2.40272 -1.8536 -0.260842
+0.836085 2.88188 -0.0376902
+-2.88188 0.836085 -0.0376902
+-0.836085 -2.88188 -0.0376902
+2.88188 -0.836085 -0.0376902
+1.87516 2.43699 -0.379779
+-2.43699 1.87516 -0.379779
+-1.87516 -2.43699 -0.379779
+2.43699 -1.87516 -0.379779
+1.36455 2.67392 0.0627905
+-2.67392 1.36455 0.0627905
+-1.36455 -2.67392 0.0627905
+2.67392 -1.36455 0.0627905
+1.02001 2.82538 0.0878512
+-2.82538 1.02001 0.0878512
+-1.02001 -2.82538 0.0878512
+2.82538 -1.02001 0.0878512
+2.91317 0.838419 0.24869
+-0.838419 2.91317 0.24869
+-2.91317 -0.838419 0.24869
+0.838419 -2.91317 0.24869
+2.92789 0.655234 -0.0251301
+-0.655234 2.92789 -0.0251301
+-2.92789 -0.655234 -0.0251301
+0.655234 -2.92789 -0.0251301
+2.67326 1.36167 0.012566
+-1.36167 2.67326 0.012566
+-2.67326 -1.36167 0.012566
+1.36167 -2.67326 0.012566
+1.52793 2.58211 0.0251301
+-2.58211 1.52793 0.0251301
+-1.52793 -2.58211 0.0251301
+2.58211 -1.52793 0.0251301
+2.75319 1.19182 -0.012566
+-1.19182 2.75319 -0.012566
+-2.75319 -1.19182 -0.012566
+1.19182 -2.75319 -0.012566
+2.74969 1.38714 0.391374
+-1.38714 2.74969 0.391374
+-2.74969 -1.38714 0.391374
+1.38714 -2.74969 0.391374
+2.93783 0.661336 -0.150226
+-0.661336 2.93783 -0.150226
+-2.93783 -0.661336 -0.150226
+0.661336 -2.93783 -0.150226
+1.53814 2.59118 0.162637
+-2.59118 1.53814 0.162637
+-1.53814 -2.59118 0.162637
+2.59118 -1.53814 0.162637
+0.277726 3.08269 -0.425779
+-3.08269 0.277726 -0.425779
+-0.277726 -3.08269 -0.425779
+3.08269 -0.277726 -0.425779
+2.8612 1.02117 0.272952
+-1.02117 2.8612 0.272952
+-2.8612 -1.02117 0.272952
+1.02117 -2.8612 0.272952
+1.5558 2.61344 0.285019
+-2.61344 1.5558 0.285019
+-1.5558 -2.61344 0.285019
+2.61344 -1.5558 0.285019
+1.01686 2.84123 -0.187381
+-2.84123 1.01686 -0.187381
+-1.01686 -2.84123 -0.187381
+2.84123 -1.01686 -0.187381
+2.67717 1.3679 -0.112856
+-1.3679 2.67717 -0.112856
+-2.67717 -1.3679 -0.112856
+1.3679 -2.67717 -0.112856
+2.70214 1.57931 0.492727
+1.57931 2.70214 -0.492727
+-1.57931 2.70214 0.492727
+-2.70214 1.57931 -0.492727
+-2.70214 -1.57931 0.492727
+-1.57931 -2.70214 -0.492727
+1.57931 -2.70214 0.492727
+2.70214 -1.57931 -0.492727
+2.95152 0.845444 0.368125
+-0.845444 2.95152 0.368125
+-2.95152 -0.845444 0.368125
+0.845444 -2.95152 0.368125
+0.85065 2.90343 0.224271
+-2.90343 0.85065 0.224271
+-0.85065 -2.90343 0.224271
+2.90343 -0.85065 0.224271
+2.60296 1.54778 -0.236499
+-1.54778 2.60296 -0.236499
+-2.60296 -1.54778 -0.236499
+1.54778 -2.60296 -0.236499
+0.848329 2.96582 -0.402906
+-2.96582 0.848329 -0.402906
+-0.848329 -2.96582 -0.402906
+2.96582 -0.848329 -0.402906
+2.89072 1.23242 0.51444
+1.22222 2.8618 -0.45958
+-1.23242 2.89072 0.51444
+-2.8618 1.22222 -0.45958
+-2.89072 -1.23242 0.51444
+-1.22222 -2.8618 -0.45958
+1.23242 -2.89072 0.51444
+2.8618 -1.22222 -0.45958
+0.652505 2.93472 -0.112856
+-2.93472 0.652505 -0.112856
+-0.652505 -2.93472 -0.112856
+2.93472 -0.652505 -0.112856
+2.58599 1.5333 -0.112856
+-1.5333 2.58599 -0.112856
+-2.58599 -1.5333 -0.112856
+1.5333 -2.58599 -0.112856
+2.68519 1.36308 0.150226
+-1.36308 2.68519 0.150226
+-2.68519 -1.36308 0.150226
+1.36308 -2.68519 0.150226
+1.98751 2.25097 0.0753268
+-2.25097 1.98751 0.0753268
+-1.98751 -2.25097 0.0753268
+2.25097 -1.98751 0.0753268
+3.26267 0.333666 -0.693653
+-0.333666 3.26267 -0.693653
+-3.26267 -0.333666 -0.693653
+0.333666 -3.26267 -0.693653
+2.44133 1.91144 -0.437116
+-1.91144 2.44133 -0.437116
+-2.44133 -1.91144 -0.437116
+1.91144 -2.44133 -0.437116
+0.65356 2.957 -0.236499
+-2.957 0.65356 -0.236499
+-0.65356 -2.957 -0.236499
+2.957 -0.65356 -0.236499
+1.89089 2.41884 0.368125
+-2.41884 1.89089 0.368125
+-1.89089 -2.41884 0.368125
+2.41884 -1.89089 0.368125
+2.93334 0.652583 0.100362
+-0.652583 2.93334 0.100362
+-2.93334 -0.652583 0.100362
+0.652583 -2.93334 0.100362
+2.9541 0.653306 0.224271
+-0.653306 2.9541 0.224271
+-2.9541 -0.653306 0.224271
+0.653306 -2.9541 0.224271
+2.41074 4.37469 -0.100362
+-4.37469 2.41074 -0.100362
+-2.41074 -4.37469 -0.100362
+4.37469 -2.41074 -0.100362
+2.88259 3.99917 0.368125
+-3.99917 2.88259 0.368125
+-2.88259 -3.99917 0.368125
+3.99917 -2.88259 0.368125
+2.90797 4.02477 0.260842
+-4.02477 2.90797 0.260842
+-2.90797 -4.02477 0.260842
+4.02477 -2.90797 0.260842
+4.93934 0.613267 -0.212007
+-0.613267 4.93934 -0.212007
+-4.93934 -0.613267 -0.212007
+0.613267 -4.93934 -0.212007
+4.72757 1.54791 0.224271
+-1.54791 4.72757 0.224271
+-4.72757 -1.54791 0.224271
+1.54791 -4.72757 0.224271
+3.63835 3.40376 -0.187381
+-3.40376 3.63835 -0.187381
+-3.63835 -3.40376 -0.187381
+3.40376 -3.63835 -0.187381
+4.75459 1.54618 0.0251301
+-1.54618 4.75459 0.0251301
+-4.75459 -1.54618 0.0251301
+1.54618 -4.75459 0.0251301
+2.12419 4.48048 -0.285019
+-4.48048 2.12419 -0.285019
+-2.12419 -4.48048 -0.285019
+4.48048 -2.12419 -0.285019
+3.64555 3.41909 -0.0627905
+-3.41909 3.64555 -0.0627905
+-3.64555 -3.41909 -0.0627905
+3.41909 -3.64555 -0.0627905
+1.83861 4.64892 0.0376902
+-4.64892 1.83861 0.0376902
+-1.83861 -4.64892 0.0376902
+4.64892 -1.83861 0.0376902
+3.41196 3.61603 -0.236499
+-3.61603 3.41196 -0.236499
+-3.41196 -3.61603 -0.236499
+3.61603 -3.41196 -0.236499
+2.12829 4.52433 0.012566
+-4.52433 2.12829 0.012566
+-2.12829 -4.52433 0.012566
+4.52433 -2.12829 0.012566
+2.39028 4.3687 0.19971
+-4.3687 2.39028 0.19971
+-2.39028 -4.3687 0.19971
+4.3687 -2.39028 0.19971
+4.96057 0.626033 -0.012566
+-0.626033 4.96057 -0.012566
+-4.96057 -0.626033 -0.012566
+0.626033 -4.96057 -0.012566
+2.60649 4.14854 0.437116
+-4.14854 2.60649 0.437116
+-2.60649 -4.14854 0.437116
+4.14854 -2.60649 0.437116
+2.67716 4.22205 0.0376902
+-4.22205 2.67716 0.0376902
+-2.67716 -4.22205 0.0376902
+4.22205 -2.67716 0.0376902
+4.83808 1.24674 0.0878512
+-1.24674 4.83808 0.0878512
+-4.83808 -1.24674 0.0878512
+1.24674 -4.83808 0.0878512
+2.37155 4.34612 0.309017
+-4.34612 2.37155 0.309017
+-2.37155 -4.34612 0.309017
+4.34612 -2.37155 0.309017
+4.95494 0.620262 -0.112856
+-0.620262 4.95494 -0.112856
+-4.95494 -0.620262 -0.112856
+0.620262 -4.95494 -0.112856
+2.12106 4.52076 0.112856
+-4.52076 2.12106 0.112856
+-2.12106 -4.52076 0.112856
+4.52076 -2.12106 0.112856
+-4.38153 2.40877 3.92416e-15
+2.40877 4.38153 2.94177e-15
+-2.40877 -4.38153 -2.35152e-14
+4.38153 -2.40877 -5.09545e-14
+2.13123 4.51876 -0.0878512
+-4.51876 2.13123 -0.0878512
+-2.13123 -4.51876 -0.0878512
+4.51876 -2.13123 -0.0878512
+1.81914 4.62686 0.236499
+-4.62686 1.81914 0.236499
+-1.81914 -4.62686 0.236499
+4.62686 -1.81914 0.236499
+2.92451 4.0391 0.162637
+-4.0391 2.92451 0.162637
+-2.92451 -4.0391 0.162637
+4.0391 -2.92451 0.162637
+2.40193 4.37953 0.100362
+-4.37953 2.40193 0.100362
+-2.40193 -4.37953 0.100362
+4.37953 -2.40193 0.100362
+4.51996 2.1311 0.0753268
+-2.1311 4.51996 0.0753268
+-4.51996 -2.1311 0.0753268
+2.1311 -4.51996 0.0753268
+2.12985 4.5041 -0.187381
+-4.5041 2.12985 -0.187381
+-2.12985 -4.5041 -0.187381
+4.5041 -2.12985 -0.187381
+4.96939 0.32268 0.19971
+-0.32268 4.96939 0.19971
+-4.96939 -0.32268 0.19971
+0.32268 -4.96939 0.19971
+4.63924 1.84355 0.125333
+-1.84355 4.63924 0.125333
+-4.63924 -1.84355 0.125333
+1.84355 -4.63924 0.125333
+2.6682 4.21728 0.13779
+-4.21728 2.6682 0.13779
+-2.6682 -4.21728 0.13779
+4.21728 -2.6682 0.13779
+4.95618 0.630542 0.0878512
+-0.630542 4.95618 0.0878512
+-4.95618 -0.630542 0.0878512
+0.630542 -4.95618 0.0878512
+2.93936 4.03502 -0.125333
+-4.03502 2.93936 -0.125333
+-2.93936 -4.03502 -0.125333
+4.03502 -2.93936 -0.125333
+4.74584 1.54861 0.125333
+-1.54861 4.74584 0.125333
+-4.74584 -1.54861 0.125333
+1.54861 -4.74584 0.125333
+2.40783 4.35905 -0.19971
+-4.35905 2.40783 -0.19971
+-2.40783 -4.35905 -0.19971
+4.35905 -2.40783 -0.19971
+1.54848 4.74746 -0.112856
+-4.74746 1.54848 -0.112856
+-1.54848 -4.74746 -0.112856
+4.74746 -1.54848 -0.112856
+3.17572 3.84961 0.13779
+-3.84961 3.17572 0.13779
+-3.17572 -3.84961 0.13779
+3.84961 -3.17572 0.13779
+4.69995 1.5441 0.320944
+-1.5441 4.69995 0.320944
+-4.69995 -1.5441 0.320944
+1.5441 -4.69995 0.320944
+3.11363 3.79664 0.414376
+-3.79664 3.11363 0.414376
+-3.11363 -3.79664 0.414376
+3.79664 -3.11363 0.414376
+3.39592 3.59178 -0.33282
+-3.59178 3.39592 -0.33282
+-3.39592 -3.59178 -0.33282
+3.59178 -3.39592 -0.33282
+1.8307 4.64255 0.13779
+-4.64255 1.8307 0.13779
+-1.8307 -4.64255 0.13779
+4.64255 -1.8307 0.13779
+4.6411 1.82945 -0.150226
+-1.82945 4.6411 -0.150226
+-4.6411 -1.82945 -0.150226
+1.82945 -4.6411 -0.150226
+2.99266 3.67261 0.675333
+-3.67261 2.99266 0.675333
+-2.99266 -3.67261 0.675333
+3.67261 -2.99266 0.675333
+4.48722 2.12601 0.260842
+-2.12601 4.48722 0.260842
+-4.48722 -2.12601 0.260842
+2.12601 -4.48722 0.260842
+4.85235 0.635929 0.448383
+-0.635929 4.85235 0.448383
+-4.85235 -0.635929 0.448383
+0.635929 -4.85235 0.448383
+3.42123 3.63316 -0.13779
+-3.63316 3.42123 -0.13779
+-3.42123 -3.63316 -0.13779
+3.63316 -3.42123 -0.13779
+2.38766 4.30207 -0.391374
+-4.30207 2.38766 -0.391374
+-2.38766 -4.30207 -0.391374
+4.30207 -2.38766 -0.391374
+1.21973 4.62017 -0.627691
+-4.62017 1.21973 -0.627691
+-1.21973 -4.62017 -0.627691
+4.62017 -1.21973 -0.627691
+2.84713 3.86638 -0.597905
+-3.86638 2.84713 -0.597905
+-2.84713 -3.86638 -0.597905
+3.86638 -2.84713 -0.597905
+2.6794 4.20802 -0.150226
+-4.20802 2.6794 -0.150226
+-2.6794 -4.20802 -0.150226
+4.20802 -2.6794 -0.150226
+4.91394 0.605097 -0.309017
+-0.605097 4.91394 -0.309017
+-4.91394 -0.605097 -0.309017
+0.605097 -4.91394 -0.309017
+1.54534 4.70772 -0.297042
+-4.70772 1.54534 -0.297042
+-1.54534 -4.70772 -0.297042
+4.70772 -1.54534 -0.297042
+3.14093 3.82209 0.320944
+-3.82209 3.14093 0.320944
+-3.14093 -3.82209 0.320944
+3.82209 -3.14093 0.320944
+4.17854 2.01135 0.770513
+-2.01135 4.17854 0.770513
+-4.17854 -2.01135 0.770513
+2.01135 -4.17854 0.770513
+4.92116 0.635514 0.272952
+-0.635514 4.92116 0.272952
+-4.92116 -0.635514 0.272952
+0.635514 -4.92116 0.272952
+1.23125 4.68525 -0.535827
+-4.68525 1.23125 -0.535827
+-1.23125 -4.68525 -0.535827
+4.68525 -1.23125 -0.535827
+2.35005 4.31704 0.402906
+-4.31704 2.35005 0.402906
+-2.35005 -4.31704 0.402906
+4.31704 -2.35005 0.402906
+3.59698 3.34983 -0.402906
+-3.34983 3.59698 -0.402906
+-3.59698 -3.34983 -0.402906
+3.34983 -3.59698 -0.402906
+4.25563 2.36819 0.492727
+-2.36819 4.25563 0.492727
+-4.25563 -2.36819 0.492727
+2.36819 -4.25563 0.492727
+4.43086 1.78918 0.627691
+-1.78918 4.43086 0.627691
+-4.43086 -1.78918 0.627691
+1.78918 -4.43086 0.627691
+4.20622 2.34623 0.577573
+-2.34623 4.20622 0.577573
+-4.20622 -2.34623 0.577573
+2.34623 -4.20622 0.577573
+4.45703 2.11719 0.356412
+-2.11719 4.45703 0.356412
+-4.45703 -2.11719 0.356412
+2.11719 -4.45703 0.356412
+2.37063 4.26128 -0.481754
+-4.26128 2.37063 -0.481754
+-2.37063 -4.26128 -0.481754
+4.26128 -2.37063 -0.481754
+4.78199 0.574213 -0.577573
+-0.574213 4.78199 -0.577573
+-4.78199 -0.574213 -0.577573
+0.574213 -4.78199 -0.577573
+2.32068 4.2746 0.503623
+-4.2746 2.32068 0.503623
+-2.32068 -4.2746 0.503623
+4.2746 -2.32068 0.503623
+1.82836 4.56253 -0.402906
+-4.56253 1.82836 -0.402906
+-1.82836 -4.56253 -0.402906
+4.56253 -1.82836 -0.402906
+4.86816 0.281719 -0.481754
+-0.281719 4.86816 -0.481754
+-4.86816 -0.281719 -0.481754
+0.281719 -4.86816 -0.481754
+2.64866 4.13446 -0.414376
+-4.13446 2.64866 -0.414376
+-2.64866 -4.13446 -0.414376
+4.13446 -2.64866 -0.414376
+2.40011 4.33476 -0.297042
+-4.33476 2.40011 -0.297042
+-2.40011 -4.33476 -0.297042
+4.33476 -2.40011 -0.297042
+3.37 3.5563 -0.437116
+-3.5563 3.37 -0.437116
+-3.37 -3.5563 -0.437116
+3.5563 -3.37 -0.437116
+2.57255 4.10481 0.535827
+-4.10481 2.57255 0.535827
+-2.57255 -4.10481 0.535827
+4.10481 -2.57255 0.535827
+4.72219 0.869478 -0.597905
+-0.869478 4.72219 -0.597905
+-4.72219 -0.869478 -0.597905
+0.869478 -4.72219 -0.597905
+2.33548 3.77274 0.899405
+-3.77274 2.33548 0.899405
+-2.33548 -3.77274 0.899405
+3.77274 -2.33548 0.899405
+4.879 0.595816 -0.402906
+-0.595816 4.879 -0.402906
+-4.879 -0.595816 -0.402906
+0.595816 -4.879 -0.402906
+1.24398 4.77024 -0.368125
+-4.77024 1.24398 -0.368125
+-1.24398 -4.77024 -0.368125
+4.77024 -1.24398 -0.368125
+4.65806 1.53618 0.425779
+-1.53618 4.65806 0.425779
+-4.65806 -1.53618 0.425779
+1.53618 -4.65806 0.425779
+3.04204 3.7246 0.587785
+-3.7246 3.04204 0.587785
+-3.04204 -3.7246 0.587785
+3.7246 -3.04204 0.587785
+3.34024 3.51781 -0.525175
+-3.51781 3.34024 -0.525175
+-3.34024 -3.51781 -0.525175
+3.51781 -3.34024 -0.525175
+3.35744 3.60333 0.379779
+-3.60333 3.35744 0.379779
+-3.35744 -3.60333 0.379779
+3.60333 -3.35744 0.379779
+2.09416 4.39002 -0.503623
+-4.39002 2.09416 -0.503623
+-2.09416 -4.39002 -0.503623
+4.39002 -2.09416 -0.503623
+3.9041 2.20093 0.876307
+-2.20093 3.9041 0.876307
+-3.9041 -2.20093 0.876307
+2.20093 -3.9041 0.876307
+0.907665 4.5378 -0.778462
+-4.5378 0.907665 -0.778462
+-0.907665 -4.5378 -0.778462
+4.5378 -0.907665 -0.778462
+4.66005 0.853195 -0.675333
+-0.853195 4.66005 -0.675333
+-4.66005 -0.853195 -0.675333
+0.853195 -4.66005 -0.675333
+3.99011 2.24347 0.816339
+-2.24347 3.99011 0.816339
+-3.99011 -2.24347 0.816339
+2.24347 -3.99011 0.816339
+4.3243 2.06948 0.60793
+-2.06948 4.3243 0.60793
+-4.3243 -2.06948 0.60793
+2.06948 -4.3243 0.60793
+3.08056 3.76403 0.503623
+-3.76403 3.08056 0.503623
+-3.08056 -3.76403 0.503623
+3.76403 -3.08056 0.503623
+4.50033 1.4242 -0.693653
+-1.4242 4.50033 -0.693653
+-4.50033 -1.4242 -0.693653
+1.4242 -4.50033 -0.693653
+4.48745 1.80678 0.546394
+-1.80678 4.48745 0.546394
+-4.48745 -1.80678 0.546394
+1.80678 -4.48745 0.546394
+2.80693 3.91386 0.577573
+-3.91386 2.80693 0.577573
+-2.80693 -3.91386 0.577573
+3.91386 -2.80693 0.577573
+3.56734 3.31553 -0.492727
+-3.31553 3.56734 -0.492727
+-3.56734 -3.31553 -0.492727
+3.31553 -3.56734 -0.492727
+4.83486 0.585494 -0.492727
+-0.585494 4.83486 -0.492727
+-4.83486 -0.585494 -0.492727
+0.585494 -4.83486 -0.492727
+4.47277 0.61193 0.857527
+-0.61193 4.47277 0.857527
+-4.47277 -0.61193 0.857527
+0.61193 -4.47277 0.857527
+4.75503 0.265581 -0.647056
+-0.265581 4.75503 -0.647056
+-4.75503 -0.265581 -0.647056
+0.265581 -4.75503 -0.647056
+2.34921 4.2128 -0.567269
+-4.2128 2.34921 -0.567269
+-2.34921 -4.2128 -0.567269
+4.2128 -2.34921 -0.567269
+2.75871 3.72763 -0.770513
+-3.72763 2.75871 -0.770513
+-2.75871 -3.72763 -0.770513
+3.72763 -2.75871 -0.770513
+1.43335 4.25794 -0.870184
+-4.25794 1.43335 -0.870184
+-1.43335 -4.25794 -0.870184
+4.25794 -1.43335 -0.870184
+4.13448 2.31303 0.675333
+-2.31303 4.13448 0.675333
+-4.13448 -2.31303 0.675333
+2.31303 -4.13448 0.675333
+3.26031 2.99297 -0.904827
+-2.99297 3.26031 -0.904827
+-3.26031 -2.99297 -0.904827
+2.99297 -3.26031 -0.904827
+3.84521 2.38569 -0.850994
+-2.38569 3.84521 -0.850994
+-3.84521 -2.38569 -0.850994
+2.38569 -3.84521 -0.850994
+3.2631 3.42276 -0.684547
+-3.42276 3.2631 -0.684547
+-3.2631 -3.42276 -0.684547
+3.42276 -3.2631 -0.684547
+2.76686 3.86619 0.656586
+-3.86619 2.76686 0.656586
+-2.76686 -3.86619 0.656586
+3.86619 -2.76686 0.656586
+4.25553 2.04249 0.693653
+-2.04249 4.25553 0.693653
+-4.25553 -2.04249 0.693653
+2.04249 -4.25553 0.693653
+3.53119 3.27533 -0.577573
+-3.27533 3.53119 -0.577573
+-3.53119 -3.27533 -0.577573
+3.27533 -3.53119 -0.577573
+4.35857 1.76572 0.711536
+-1.76572 4.35857 0.711536
+-4.35857 -1.76572 0.711536
+1.76572 -4.35857 0.711536
+2.24225 4.15375 0.693653
+-4.15375 2.24225 0.693653
+-2.24225 -4.15375 0.693653
+4.15375 -2.24225 0.693653
+4.56178 1.44869 -0.61786
+-1.44869 4.56178 -0.61786
+-4.56178 -1.44869 -0.61786
+1.44869 -4.56178 -0.61786
+2.15058 4.00558 0.837528
+-4.00558 2.15058 0.837528
+-2.15058 -4.00558 0.837528
+4.00558 -2.15058 0.837528
+3.29108 3.54549 0.546394
+-3.54549 3.29108 0.546394
+-3.29108 -3.54549 0.546394
+3.54549 -3.29108 0.546394
+2.09398 3.91194 0.899405
+-3.91194 2.09398 0.899405
+-2.09398 -3.91194 0.899405
+3.91194 -2.09398 0.899405
+1.64016 4.26261 0.823533
+-4.26261 1.64016 0.823533
+-1.64016 -4.26261 0.823533
+4.26261 -1.64016 0.823533
+0.33177 4.61578 -0.778462
+-4.61578 0.33177 -0.778462
+-0.33177 -4.61578 -0.778462
+4.61578 -0.33177 -0.778462
+3.16529 3.30683 -0.816339
+-3.30683 3.16529 -0.816339
+-3.16529 -3.30683 -0.816339
+3.30683 -3.16529 -0.816339
+2.81973 3.48357 0.876307
+-3.48357 2.81973 0.876307
+-2.81973 -3.48357 0.876307
+3.48357 -2.81973 0.876307
+3.44097 3.17879 -0.728969
+-3.17879 3.44097 -0.728969
+-3.44097 -3.17879 -0.728969
+3.17879 -3.44097 -0.728969
+3.28154 2.64054 -0.977268
+-2.64054 3.28154 -0.977268
+-3.28154 -2.64054 -0.977268
+2.64054 -3.28154 -0.977268
+0.0513196 4.39107 -0.920232
+-4.39107 0.0513196 -0.920232
+-0.0513196 -4.39107 -0.920232
+4.39107 -0.0513196 -0.920232
+4.06979 2.28221 0.745941
+-2.28221 4.06979 0.745941
+-4.06979 -2.28221 0.745941
+2.28221 -4.06979 0.745941
+4.5865 0.537296 -0.786288
+0.537296 4.5865 0.786288
+-0.537296 4.5865 -0.786288
+-4.5865 0.537296 0.786288
+-4.5865 -0.537296 -0.786288
+-0.537296 -4.5865 0.786288
+0.537296 -4.5865 -0.786288
+4.5865 -0.537296 0.786288
+4.37782 2.08969 0.525175
+-2.08969 4.37782 0.525175
+-4.37782 -2.08969 0.525175
+2.08969 -4.37782 0.525175
+3.30448 3.47315 -0.60793
+-3.47315 3.30448 -0.60793
+-3.30448 -3.47315 -0.60793
+3.47315 -3.30448 -0.60793
+3.72886 2.65514 -0.816339
+-2.65514 3.72886 -0.816339
+-3.72886 -2.65514 -0.816339
+2.65514 -3.72886 -0.816339
+0.926271 4.67972 -0.637424
+-4.67972 0.926271 -0.637424
+-0.926271 -4.67972 -0.637424
+4.67972 -0.926271 -0.637424
+0.332429 4.69089 -0.711536
+-4.69089 0.332429 -0.711536
+-0.332429 -4.69089 -0.711536
+4.69089 -0.332429 -0.711536
+2.32364 4.15711 -0.647056
+-4.15711 2.32364 -0.647056
+-2.32364 -4.15711 -0.647056
+4.15711 -2.32364 -0.647056
+3.38783 3.1234 -0.79399
+-3.1234 3.38783 -0.79399
+-3.38783 -3.1234 -0.79399
+3.1234 -3.38783 -0.79399
+2.43899 3.92122 0.786288
+-3.92122 2.43899 0.786288
+-2.43899 -3.92122 0.786288
+3.92122 -2.43899 0.786288
+0.917731 4.61223 -0.711536
+-4.61223 0.917731 -0.711536
+-0.917731 -4.61223 -0.711536
+4.61223 -0.917731 -0.711536
+0.325635 4.33242 -0.938734
+-4.33242 0.325635 -0.938734
+-0.325635 -4.33242 -0.938734
+4.33242 -0.325635 -0.938734
+2.72246 3.81224 0.728969
+-3.81224 2.72246 0.728969
+-2.72246 -3.81224 0.728969
+3.81224 -2.72246 0.728969
+4.37295 0.603313 0.910106
+-0.603313 4.37295 0.910106
+-4.37295 -0.603313 0.910106
+0.603313 -4.37295 0.910106
+2.48303 3.98308 0.720309
+-3.98308 2.48303 0.720309
+-2.48303 -3.98308 0.720309
+3.98308 -2.48303 0.720309
+2.94385 3.62014 0.745941
+-3.62014 2.94385 0.745941
+-2.94385 -3.62014 0.745941
+3.62014 -2.94385 0.745941
+1.18684 4.45246 -0.79399
+-4.45246 1.18684 -0.79399
+-1.18684 -4.45246 -0.79399
+4.45246 -1.18684 -0.79399
+3.48892 3.2296 -0.656586
+-3.2296 3.48892 -0.656586
+-3.48892 -3.2296 -0.656586
+3.2296 -3.48892 -0.656586
+4.81575 0.273829 -0.567269
+-0.273829 4.81575 -0.567269
+-4.81575 -0.273829 -0.567269
+0.273829 -4.81575 -0.567269
+3.79051 2.70478 -0.754251
+-2.70478 3.79051 -0.754251
+-3.79051 -2.70478 -0.754251
+2.70478 -3.79051 -0.754251
+0.933173 4.7396 -0.556876
+-4.7396 0.933173 -0.556876
+-0.933173 -4.7396 -0.556876
+4.7396 -0.933173 -0.556876
+4.4319 1.39764 -0.762443
+-1.39764 4.4319 -0.762443
+-4.4319 -1.39764 -0.762443
+1.39764 -4.4319 -0.762443
+3.43329 2.77475 -0.910106
+-2.77475 3.43329 -0.910106
+-3.43329 -2.77475 -0.910106
+2.77475 -3.43329 -0.910106
+4.63345 0.624425 0.737513
+-0.624425 4.63345 0.737513
+-4.63345 -0.624425 0.737513
+0.624425 -4.63345 0.737513
+4.27802 1.73872 0.786288
+-1.73872 4.27802 0.786288
+-4.27802 -1.73872 0.786288
+1.73872 -4.27802 0.786288
+3.57348 2.53234 -0.925077
+-2.53234 3.57348 -0.925077
+-3.57348 -2.53234 -0.925077
+2.53234 -3.57348 -0.925077
+4.68661 0.257034 -0.720309
+-0.257034 4.68661 -0.720309
+-4.68661 -0.257034 -0.720309
+0.257034 -4.68661 -0.720309
+4.26575 0.759415 -0.942991
+-0.759415 4.26575 -0.942991
+-4.26575 -0.759415 -0.942991
+0.759415 -4.26575 -0.942991
+3.69696 1.96637 -0.982287
+-1.96637 3.69696 -0.982287
+-3.69696 -1.96637 -0.982287
+1.96637 -3.69696 -0.982287
+0.523222 4.50555 0.844328
+-4.50555 0.523222 0.844328
+-0.523222 -4.50555 0.844328
+4.50555 -0.523222 0.844328
+2.74397 3.3987 0.929776
+-3.3987 2.74397 0.929776
+-2.74397 -3.3987 0.929776
+3.3987 -2.74397 0.929776
+0.330301 4.52378 -0.844328
+-4.52378 0.330301 -0.844328
+-0.330301 -4.52378 -0.844328
+4.52378 -0.330301 -0.844328
+4.51092 1.50149 0.656586
+-1.50149 4.51092 0.656586
+-4.51092 -1.50149 0.656586
+1.50149 -4.51092 0.656586
+3.80242 2.14991 0.929776
+-2.14991 3.80242 0.929776
+-3.80242 -2.14991 0.929776
+2.14991 -3.80242 0.929776
+4.03859 0.709032 -0.994951
+-0.709032 4.03859 -0.994951
+-4.03859 -0.709032 -0.994951
+0.709032 -4.03859 -0.994951
+2.04044 3.8223 0.942991
+-3.8223 2.04044 0.942991
+-2.04044 -3.8223 0.942991
+3.8223 -2.04044 0.942991
+3.70666 2.1013 0.965382
+-2.1013 3.70666 0.965382
+-3.70666 -2.1013 0.965382
+2.1013 -3.70666 0.965382
+0.0474232 4.49248 -0.870184
+-4.49248 0.0474232 -0.870184
+-0.0474232 -4.49248 -0.870184
+4.49248 -0.0474232 -0.870184
+4.01415 1.9428 0.888136
+-1.9428 4.01415 0.888136
+-4.01415 -1.9428 0.888136
+1.9428 -4.01415 0.888136
+4.59056 0.835703 -0.745941
+-0.835703 4.59056 -0.745941
+-4.59056 -0.835703 -0.745941
+0.835703 -4.59056 -0.745941
+1.40572 4.1603 -0.920232
+-4.1603 1.40572 -0.920232
+-1.40572 -4.1603 -0.920232
+4.1603 -1.40572 -0.920232
+0.629635 4.71237 -0.656586
+-4.71237 0.629635 -0.656586
+-0.629635 -4.71237 -0.656586
+4.71237 -0.629635 -0.656586
+3.65375 2.59543 -0.876307
+-2.59543 3.65375 -0.876307
+-3.65375 -2.59543 -0.876307
+2.59543 -3.65375 -0.876307
+2.98896 3.10382 -0.951057
+-3.10382 2.98896 -0.951057
+-2.98896 -3.10382 -0.951057
+3.10382 -2.98896 -0.951057
+2.55116 3.95051 -0.711536
+-3.95051 2.55116 -0.711536
+-2.55116 -3.95051 -0.711536
+3.95051 -2.55116 -0.711536
+3.61512 1.7699 0.999684
+-1.7699 3.61512 0.999684
+-3.61512 -1.7699 0.999684
+1.7699 -3.61512 0.999684
+1.37627 4.05799 -0.958522
+-4.05799 1.37627 -0.958522
+-1.37627 -4.05799 -0.958522
+4.05799 -1.37627 -0.958522
+2.8771 3.54715 0.823533
+-3.54715 2.8771 0.823533
+-2.8771 -3.54715 0.823533
+3.54715 -2.8771 0.823533
+3.21654 3.36714 -0.754251
+-3.36714 3.21654 -0.754251
+-3.21654 -3.36714 -0.754251
+3.36714 -3.21654 -0.754251
+4.55609 0.618664 0.801567
+-0.618664 4.55609 0.801567
+-4.55609 -0.618664 0.801567
+0.618664 -4.55609 0.801567
+2.67416 3.75258 0.79399
+-3.75258 2.67416 0.79399
+-2.67416 -3.75258 0.79399
+3.75258 -2.67416 0.79399
+0.328117 4.42497 -0.899405
+-4.42497 0.328117 -0.899405
+-0.328117 -4.42497 -0.899405
+4.42497 -0.328117 -0.899405
+3.0509 3.17452 -0.915241
+-3.17452 3.0509 -0.915241
+-3.0509 -3.17452 -0.915241
+3.17452 -3.0509 -0.915241
+4.10397 1.98054 0.830596
+-1.98054 4.10397 0.830596
+-4.10397 -1.98054 0.830596
+1.98054 -4.10397 0.830596
+2.39179 3.85396 0.844328
+-3.85396 2.39179 0.844328
+-2.39179 -3.85396 0.844328
+3.85396 -2.39179 0.844328
+0.491948 4.3167 0.938734
+-4.3167 0.491948 0.938734
+-0.491948 -4.3167 0.938734
+4.3167 -0.491948 0.938734
+4.07066 0.195043 -0.997159
+-0.195043 4.07066 -0.997159
+-4.07066 -0.195043 -0.997159
+0.195043 -4.07066 -0.997159
+0.506851 4.40807 0.899405
+-4.40807 0.506851 0.899405
+-0.506851 -4.40807 0.899405
+4.40807 -0.506851 0.899405
+3.10055 2.8327 -0.979855
+-2.8327 3.10055 -0.979855
+-3.10055 -2.8327 -0.979855
+2.8327 -3.10055 -0.979855
+3.10988 3.24241 -0.870184
+-3.24241 3.10988 -0.870184
+-3.10988 -3.24241 -0.870184
+3.24241 -3.10988 -0.870184
+4.01455 2.15605 -0.830596
+-2.15605 4.01455 -0.830596
+-4.01455 -2.15605 -0.830596
+2.15605 -4.01455 -0.830596
+4.18311 1.12913 0.942991
+-1.12913 4.18311 0.942991
+-4.18311 -1.12913 0.942991
+1.12913 -4.18311 0.942991
+3.17796 2.91002 -0.951057
+-2.91002 3.17796 -0.951057
+-3.17796 -2.91002 -0.951057
+2.91002 -3.17796 -0.951057
+0.0437172 4.57736 -0.816339
+-4.57736 0.0437172 -0.816339
+-0.0437172 -4.57736 -0.816339
+4.57736 -0.0437172 -0.816339
+1.78555 3.92166 0.951057
+-3.92166 1.78555 0.951057
+-1.78555 -3.92166 0.951057
+3.92166 -1.78555 0.951057
+3.91655 1.33489 0.990461
+-1.33489 3.91655 0.990461
+-3.91655 -1.33489 0.990461
+1.33489 -3.91655 0.990461
+2.69205 2.95852 1
+-2.95852 2.69205 1
+-2.69205 -2.95852 1
+2.95852 -2.69205 1
+3.73092 1.54375 0.999289
+-1.54375 3.73092 0.999289
+-3.73092 -1.54375 0.999289
+1.54375 -3.73092 0.999289
+4.35718 1.36927 -0.823533
+-1.36927 4.35718 -0.823533
+-4.35718 -1.36927 -0.823533
+1.36927 -4.35718 -0.823533
+3.82013 1.85957 0.968583
+-1.85957 3.82013 0.968583
+-3.82013 -1.85957 0.968583
+1.85957 -3.82013 0.968583
+4.25777 0.482522 -0.958522
+-0.482522 4.25777 -0.958522
+-4.25777 -0.482522 -0.958522
+0.482522 -4.25777 -0.958522
+1.08633 3.99264 -0.990461
+-3.99264 1.08633 -0.990461
+-1.08633 -3.99264 -0.990461
+3.99264 -1.08633 -0.990461
+4.29164 0.215363 -0.954865
+-0.215363 4.29164 -0.954865
+-4.29164 -0.215363 -0.954865
+0.215363 -4.29164 -0.954865
+3.49985 2.83437 -0.863923
+-2.83437 3.49985 -0.863923
+-3.49985 -2.83437 -0.863923
+2.83437 -3.49985 -0.863923
+1.71686 3.26737 0.951057
+-3.26737 1.71686 0.951057
+-1.71686 -3.26737 0.951057
+3.26737 -1.71686 0.951057
+3.91914 1.90229 0.934329
+-1.90229 3.91914 0.934329
+-3.91914 -1.90229 0.934329
+1.90229 -3.91914 0.934329
+2.94061 2.6744 -0.999684
+-2.6744 2.94061 -0.999684
+-2.94061 -2.6744 -0.999684
+2.6744 -2.94061 -0.999684
+3.71836 1.81524 0.990461
+-1.81524 3.71836 0.990461
+-3.71836 -1.81524 0.990461
+1.81524 -3.71836 0.990461
+3.94079 1.62016 0.965382
+-1.62016 3.94079 0.965382
+-3.94079 -1.62016 0.965382
+1.62016 -3.94079 0.965382
+3.02998 2.76264 -0.994951
+-2.76264 3.02998 -0.994951
+-3.02998 -2.76264 -0.994951
+2.76264 -3.02998 -0.994951
+3.9029 1.48263 -0.984564
+-1.48263 3.9029 -0.984564
+-3.9029 -1.48263 -0.984564
+1.48263 -3.9029 -0.984564
+3.79961 1.43848 -0.998027
+-1.43848 3.79961 -0.998027
+-3.79961 -1.43848 -0.998027
+1.43848 -3.79961 -0.998027
+3.32255 3.05627 -0.857527
+-3.05627 3.32255 -0.857527
+-3.32255 -3.05627 -0.857527
+3.05627 -3.32255 -0.857527
+4.46466 0.232482 -0.882291
+-0.232482 4.46466 -0.882291
+-4.46466 -0.232482 -0.882291
+0.232482 -4.46466 -0.882291
+4.26792 0.593741 0.951057
+-0.593741 4.26792 0.951057
+-4.26792 -0.593741 0.951057
+0.593741 -4.26792 0.951057
+4.18235 0.205137 -0.982287
+-0.205137 4.18235 -0.982287
+-4.18235 -0.205137 -0.982287
+0.205137 -4.18235 -0.982287
+0.0549226 4.28467 -0.958522
+-4.28467 0.0549226 -0.958522
+-0.0549226 -4.28467 -0.958522
+4.28467 -0.0549226 -0.958522
+2.8327 3.10055 0.979855
+-3.10055 2.8327 0.979855
+-2.8327 -3.10055 0.979855
+3.10055 -2.8327 0.979855
+2.65841 2.73294 -0.982287
+-2.73294 2.65841 -0.982287
+-2.65841 -2.73294 -0.982287
+2.73294 -2.65841 -0.982287
+3.35441 2.70473 -0.951057
+-2.70473 3.35441 -0.951057
+-3.35441 -2.70473 -0.951057
+2.70473 -3.35441 -0.951057
+1.06115 3.88274 -0.999684
+-3.88274 1.06115 -0.999684
+-1.06115 -3.88274 -0.999684
+3.88274 -1.06115 -0.999684
+3.43113 2.42176 -0.979855
+-2.42176 3.43113 -0.979855
+-3.43113 -2.42176 -0.979855
+2.42176 -3.43113 -0.979855
+0.0582341 4.17462 -0.984564
+-4.17462 0.0582341 -0.984564
+-0.0582341 -4.17462 -0.984564
+4.17462 -0.0582341 -0.984564
+4.16122 0.467344 -0.982287
+-0.467344 4.16122 -0.982287
+-4.16122 -0.467344 -0.982287
+0.467344 -4.16122 -0.982287
+2.74173 2.82569 -0.998027
+-2.82569 2.74173 -0.998027
+-2.74173 -2.82569 -0.998027
+2.82569 -2.74173 -0.998027
+2.61284 2.87801 0.993611
+-2.87801 2.61284 0.993611
+-2.61284 -2.87801 0.993611
+2.87801 -2.61284 0.993611
+3.48073 1.84015 -0.998027
+-1.84015 3.48073 -0.998027
+-3.48073 -1.84015 -0.998027
+1.84015 -3.48073 -0.998027
+3.8367 1.58244 0.988652
+-1.58244 3.8367 0.988652
+-3.8367 -1.58244 0.988652
+1.58244 -3.8367 0.988652
+1.01298 3.67559 -0.982287
+-3.67559 1.01298 -0.982287
+-1.01298 -3.67559 -0.982287
+3.67559 -1.01298 -0.982287
+2.90153 3.16949 0.954865
+-3.16949 2.90153 0.954865
+-2.90153 -3.16949 0.954865
+3.16949 -2.90153 0.954865
+0.402275 3.72968 0.968583
+-3.72968 0.402275 0.968583
+-0.402275 -3.72968 0.968583
+3.72968 -0.402275 0.968583
+1.69674 3.74655 0.993611
+-3.74655 1.69674 0.993611
+-1.69674 -3.74655 0.993611
+3.74655 -1.69674 0.993611
+0.318054 4.10054 -0.993611
+-4.10054 0.318054 -0.993611
+-0.318054 -4.10054 -0.993611
+4.10054 -0.318054 -0.993611
+4.35142 0.497567 -0.925077
+-0.497567 4.35142 -0.925077
+-4.35142 -0.497567 -0.925077
+0.497567 -4.35142 -0.925077
+0.7905 3.79317 -0.992115
+-3.79317 0.7905 -0.992115
+-0.7905 -3.79317 -0.992115
+3.79317 -0.7905 -0.992115
+3.9705 0.186244 -0.999684
+-0.186244 3.9705 -0.999684
+-3.9705 -0.186244 -0.999684
+0.186244 -3.9705 -0.999684
+3.54148 2.01649 0.997159
+-2.01649 3.54148 0.997159
+-3.54148 -2.01649 0.997159
+2.01649 -3.54148 0.997159
+3.41863 2.24132 0.996134
+-2.24132 3.41863 0.996134
+-3.41863 -2.24132 0.996134
+2.24132 -3.41863 0.996134
+2.70383 2.44234 -0.934329
+-2.44234 2.70383 -0.934329
+-2.70383 -2.44234 -0.934329
+2.44234 -2.70383 -0.934329
+2.76264 3.02998 0.994951
+-3.02998 2.76264 0.994951
+-2.76264 -3.02998 0.994951
+3.02998 -2.76264 0.994951
+3.4094 1.67875 0.979855
+-1.67875 3.4094 0.979855
+-3.4094 -1.67875 0.979855
+1.67875 -3.4094 0.979855
+3.27548 1.87813 0.974527
+-1.87813 3.27548 0.974527
+-3.27548 -1.87813 0.974527
+1.87813 -3.27548 0.974527
+0.809092 3.90448 -0.999921
+-3.90448 0.809092 -0.999921
+-0.809092 -3.90448 -0.999921
+3.90448 -0.809092 -0.999921
+1.03847 3.78479 -0.997159
+-3.78479 1.03847 -0.997159
+-1.03847 -3.78479 -0.997159
+3.78479 -1.03847 -0.997159
+1.65169 3.65686 0.999921
+-3.65686 1.65169 0.999921
+-1.65169 -3.65686 0.999921
+3.65686 -1.65169 0.999921
+0.701026 4.00185 0.998027
+-4.00185 0.701026 0.998027
+-0.701026 -4.00185 0.998027
+4.00185 -0.701026 0.998027
+2.593 2.66034 -0.958522
+-2.66034 2.593 -0.958522
+-2.593 -2.66034 -0.958522
+2.66034 -2.593 -0.958522
+2.13197 3.47318 0.997159
+-3.47318 2.13197 0.997159
+-2.13197 -3.47318 0.997159
+3.47318 -2.13197 0.997159
+3.6033 1.35537 -0.988652
+1.35537 3.6033 0.988652
+-1.35537 3.6033 -0.988652
+-3.6033 1.35537 0.988652
+-3.6033 -1.35537 -0.988652
+-1.35537 -3.6033 0.988652
+1.35537 -3.6033 -0.988652
+3.6033 -1.35537 0.988652
+3.69548 1.39428 -0.998737
+-1.39428 3.69548 -0.998737
+-3.69548 -1.39428 -0.998737
+1.39428 -3.69548 -0.998737
+1.7415 3.83513 0.977268
+-3.83513 1.7415 0.977268
+-1.7415 -3.83513 0.977268
+3.83513 -1.7415 0.977268
+0.0634334 3.97436 -0.999684
+-3.97436 0.0634334 -0.999684
+-0.0634334 -3.97436 -0.999684
+3.97436 -0.0634334 -0.999684
+3.2961 1.38231 0.904827
+-1.38231 3.2961 0.904827
+-3.2961 -1.38231 0.904827
+1.38231 -3.2961 0.904827
+1.35125 3.21298 -0.857527
+-3.21298 1.35125 -0.857527
+-1.35125 -3.21298 -0.857527
+3.21298 -1.35125 -0.857527
+3.50808 1.46136 0.979855
+-1.46136 3.50808 0.979855
+-3.50808 -1.46136 0.979855
+1.46136 -3.50808 0.979855
+2.56028 2.30218 -0.830596
+-2.30218 2.56028 -0.830596
+-2.56028 -2.30218 -0.830596
+2.30218 -2.56028 -0.830596
+3.5117 1.7242 0.996134
+-1.7242 3.5117 0.996134
+-3.5117 -1.7242 0.996134
+1.7242 -3.5117 0.996134
+3.4522 1.97025 0.999684
+-1.97025 3.4522 0.999684
+-3.4522 -1.97025 0.999684
+1.97025 -3.4522 0.999684
+2.62995 2.37022 -0.888136
+-2.37022 2.62995 -0.888136
+-2.62995 -2.37022 -0.888136
+2.37022 -2.62995 -0.888136
+3.28259 2.30766 -0.999921
+-2.30766 3.28259 -0.999921
+-3.28259 -2.30766 -0.999921
+2.30766 -3.28259 -0.999921
+3.60064 1.62357 -0.998737
+-1.62357 3.60064 -0.998737
+-3.60064 -1.62357 -0.998737
+1.62357 -3.60064 -0.998737
+0.755837 3.58844 -0.942991
+-3.58844 0.755837 -0.942991
+-0.755837 -3.58844 -0.942991
+3.58844 -0.755837 -0.942991
+2.8602 2.59536 -0.990461
+-2.59536 2.8602 -0.990461
+-2.8602 -2.59536 -0.990461
+2.59536 -2.8602 -0.990461
+0.0720788 3.56216 -0.899405
+-3.56216 0.0720788 -0.899405
+-0.0720788 -3.56216 -0.899405
+3.56216 -0.0720788 -0.899405
+2.80788 2.22991 -0.910106
+-2.22991 2.80788 -0.910106
+-2.80788 -2.22991 -0.910106
+2.22991 -2.80788 -0.910106
+3.51108 1.57894 -0.988652
+-1.57894 3.51108 -0.988652
+-3.51108 -1.57894 -0.988652
+1.57894 -3.51108 -0.988652
+3.32622 1.48728 -0.934329
+1.48728 3.32622 0.934329
+-1.48728 3.32622 -0.934329
+-3.32622 1.48728 0.934329
+-3.32622 -1.48728 -0.934329
+-1.48728 -3.32622 0.934329
+1.48728 -3.32622 -0.934329
+3.32622 -1.48728 0.934329
+0.0675903 3.78739 -0.977268
+-3.78739 0.0675903 -0.977268
+-0.0675903 -3.78739 -0.977268
+3.78739 -0.0675903 -0.977268
+0.992963 3.29684 0.830596
+-3.29684 0.992963 0.830596
+-0.992963 -3.29684 0.830596
+3.29684 -0.992963 0.830596
+2.02728 3.31663 0.993611
+-3.31663 2.02728 0.993611
+-2.02728 -3.31663 0.993611
+3.31663 -2.02728 0.993611
+3.68812 1.26687 0.994951
+-1.26687 3.68812 0.994951
+-3.68812 -1.26687 0.994951
+1.26687 -3.68812 0.994951
+3.36324 1.92397 0.992115
+-1.92397 3.36324 0.992115
+-3.36324 -1.92397 0.992115
+1.92397 -3.36324 0.992115
+3.09686 1.78452 0.904827
+-1.78452 3.09686 0.904827
+-3.09686 -1.78452 0.904827
+1.78452 -3.09686 0.904827
+3.34719 1.01042 -0.863923
+-1.01042 3.34719 -0.863923
+-3.34719 -1.01042 -0.863923
+1.01042 -3.34719 -0.863923
+1.14062 3.27101 -0.844328
+-3.27101 1.14062 -0.844328
+-1.14062 -3.27101 -0.844328
+3.27101 -1.14062 -0.844328
+3.44152 0.730764 0.876307
+-0.730764 3.44152 0.876307
+-3.44152 -0.730764 0.876307
+0.730764 -3.44152 0.876307
+1.3863 3.30679 -0.910106
+-3.30679 1.3863 -0.910106
+-1.3863 -3.30679 -0.910106
+3.30679 -1.3863 -0.910106
+0.610933 3.58012 0.929776
+-3.58012 0.610933 0.929776
+-0.610933 -3.58012 0.929776
+3.58012 -0.610933 0.929776
+0.771987 3.68347 -0.971632
+-3.68347 0.771987 -0.971632
+-0.771987 -3.68347 -0.971632
+3.68347 -0.771987 -0.971632
+3.32043 1.6391 0.954865
+-1.6391 3.32043 0.954865
+-3.32043 -1.6391 0.954865
+1.6391 -3.32043 0.954865
+0.831404 3.52346 0.925077
+-3.52346 0.831404 0.925077
+-0.831404 -3.52346 0.925077
+3.52346 -0.831404 0.925077
+3.69057 1.66859 -0.998737
+-1.66859 3.69057 -0.998737
+-3.69057 -1.66859 -0.998737
+1.66859 -3.69057 -0.998737
+2.80597 1.87056 0.778462
+-1.87056 2.80597 0.778462
+-2.80597 -1.87056 0.778462
+1.87056 -2.80597 0.778462
+0.762361 3.27502 0.770513
+-3.27502 0.762361 0.770513
+-0.762361 -3.27502 0.770513
+3.27502 -0.762361 0.770513
+3.41193 1.52972 -0.965382
+-1.52972 3.41193 -0.965382
+-3.41193 -1.52972 -0.965382
+1.52972 -3.41193 -0.965382
+3.51993 1.0703 -0.947098
+-1.0703 3.51993 -0.947098
+-3.51993 -1.0703 -0.947098
+1.0703 -3.51993 -0.947098
+3.18977 1.83325 0.947098
+-1.83325 3.18977 0.947098
+-3.18977 -1.83325 0.947098
+1.83325 -3.18977 0.947098
+3.20292 1.34749 0.850994
+-1.34749 3.20292 0.850994
+-3.20292 -1.34749 0.850994
+1.34749 -3.20292 0.850994
+3.116 1.31507 0.786288
+-1.31507 3.116 0.786288
+-3.116 -1.31507 0.786288
+1.31507 -3.116 0.786288
+2.90573 2.19829 0.934329
+-2.19829 2.90573 0.934329
+-2.90573 -2.19829 0.934329
+2.19829 -2.90573 0.934329
+0.990636 3.58046 -0.958522
+-3.58046 0.990636 -0.958522
+-0.990636 -3.58046 -0.958522
+3.58046 -0.990636 -0.958522
+1.31854 3.12531 -0.79399
+-3.12531 1.31854 -0.79399
+-1.31854 -3.12531 -0.79399
+3.12531 -1.31854 -0.79399
+3.13672 2.35882 0.997159
+-2.35882 3.13672 0.997159
+-3.13672 -2.35882 0.997159
+2.35882 -3.13672 0.997159
+3.02801 2.00541 0.929776
+-2.00541 3.02801 0.929776
+-3.02801 -2.00541 0.929776
+2.00541 -3.02801 0.929776
+3.10943 2.05484 0.962028
+-2.05484 3.10943 0.962028
+-3.10943 -2.05484 0.962028
+2.05484 -3.10943 0.962028
+2.38317 2.42791 -0.801567
+-2.42791 2.38317 -0.801567
+-2.38317 -2.42791 -0.801567
+2.42791 -2.38317 -0.801567
+2.28472 2.64664 -0.863923
+-2.64664 2.28472 -0.863923
+-2.28472 -2.64664 -0.863923
+2.64664 -2.28472 -0.863923
+2.93326 2.04231 -0.904827
+-2.04231 2.93326 -0.904827
+-2.93326 -2.04231 -0.904827
+2.04231 -2.93326 -0.904827
+2.52169 2.58133 -0.920232
+-2.58133 2.52169 -0.920232
+-2.52169 -2.58133 -0.920232
+2.58133 -2.52169 -0.920232
+2.22578 2.48221 0.745941
+-2.48221 2.22578 0.745941
+-2.22578 -2.48221 0.745941
+2.48221 -2.22578 0.745941
+2.45863 2.86553 -0.974527
+-2.86553 2.45863 -0.974527
+-2.45863 -2.86553 -0.974527
+2.86553 -2.45863 -0.974527
+2.33017 2.92431 0.965382
+-2.92431 2.33017 0.965382
+-2.33017 -2.92431 0.965382
+2.92431 -2.33017 0.965382
+3.14475 1.16308 -0.762443
+-1.16308 3.14475 -0.762443
+-3.14475 -1.16308 -0.762443
+1.16308 -3.14475 -0.762443
+2.48895 2.23239 -0.754251
+-2.23239 2.48895 -0.754251
+-2.48895 -2.23239 -0.754251
+2.23239 -2.48895 -0.754251
+1.11397 3.18301 -0.778462
+-3.18301 1.11397 -0.778462
+-1.11397 -3.18301 -0.778462
+3.18301 -1.11397 -0.778462
+2.33701 2.08185 -0.492727
+-2.08185 2.33701 -0.492727
+-2.33701 -2.08185 -0.492727
+2.08185 -2.33701 -0.492727
+1.5679 3.48886 0.984564
+-3.48886 1.5679 0.984564
+-1.5679 -3.48886 0.984564
+3.48886 -1.5679 0.984564
+1.08979 3.10264 -0.70265
+-3.10264 1.08979 -0.70265
+-1.08979 -3.10264 -0.70265
+3.10264 -1.08979 -0.70265
+3.3996 0.947959 0.882291
+0.947959 3.3996 -0.882291
+-0.947959 3.3996 0.882291
+-3.3996 0.947959 -0.882291
+-3.3996 -0.947959 0.882291
+-0.947959 -3.3996 -0.882291
+0.947959 -3.3996 0.882291
+3.3996 -0.947959 -0.882291
+3.2237 1.59588 0.915241
+-1.59588 3.2237 0.915241
+-3.2237 -1.59588 0.915241
+1.59588 -3.2237 0.915241
+2.98421 2.25295 0.965382
+-2.25295 2.98421 0.965382
+-2.98421 -2.25295 0.965382
+2.25295 -2.98421 0.965382
+0.483145 3.19314 -0.637424
+-3.19314 0.483145 -0.637424
+-0.483145 -3.19314 -0.637424
+3.19314 -0.483145 -0.637424
+3.00744 2.09846 -0.942991
+-2.09846 3.00744 -0.942991
+-3.00744 -2.09846 -0.942991
+2.09846 -3.00744 -0.942991
+1.88081 2.82289 -0.79399
+-2.82289 1.88081 -0.79399
+-1.88081 -2.82289 -0.79399
+2.82289 -1.88081 -0.79399
+2.44639 2.49796 -0.863923
+-2.49796 2.44639 -0.863923
+-2.44639 -2.49796 -0.863923
+2.49796 -2.44639 -0.863923
+2.45156 3.06478 0.997159
+-3.06478 2.45156 0.997159
+-2.45156 -3.06478 0.997159
+3.06478 -2.45156 0.997159
+3.17615 0.950957 -0.728969
+-0.950957 3.17615 -0.728969
+-3.17615 -0.950957 -0.728969
+0.950957 -3.17615 -0.728969
+0.719884 3.37774 -0.837528
+-3.37774 0.719884 -0.837528
+-0.719884 -3.37774 -0.837528
+3.37774 -0.719884 -0.837528
+3.23719 0.909689 0.770513
+-0.909689 3.23719 0.770513
+-3.23719 -0.909689 0.770513
+0.909689 -3.23719 0.770513
+0.704629 3.28792 -0.770513
+-3.28792 0.704629 -0.770513
+-0.704629 -3.28792 -0.770513
+3.28792 -0.704629 -0.770513
+2.83023 2.14565 0.893841
+-2.14565 2.83023 0.893841
+-2.83023 -2.14565 0.893841
+2.14565 -2.83023 0.893841
+3.25804 0.979493 -0.801567
+-0.979493 3.25804 -0.801567
+-3.25804 -0.979493 -0.801567
+0.979493 -3.25804 -0.801567
+0.968874 3.48816 -0.925077
+-3.48816 0.968874 -0.925077
+-0.968874 -3.48816 -0.925077
+3.48816 -0.968874 -0.925077
+3.21839 1.19399 -0.823533
+-1.19399 3.21839 -0.823533
+-3.21839 -1.19399 -0.823533
+1.19399 -3.21839 -0.823533
+0.574099 3.40555 0.837528
+-3.40555 0.574099 0.837528
+-0.574099 -3.40555 0.837528
+3.40555 -0.574099 0.837528
+0.539719 3.24387 0.70265
+-3.24387 0.539719 0.70265
+-0.539719 -3.24387 0.70265
+3.24387 -0.539719 0.70265
+0.874311 3.08449 -0.60793
+-3.08449 0.874311 -0.60793
+-0.874311 -3.08449 -0.60793
+3.08449 -0.874311 -0.60793
+1.94446 2.80398 0.809017
+-2.80398 1.94446 0.809017
+-1.94446 -2.80398 0.809017
+2.80398 -1.94446 0.809017
+3.22959 0.749648 -0.728969
+-0.749648 3.22959 -0.728969
+-3.22959 -0.749648 -0.728969
+0.749648 -3.22959 -0.728969
+1.47006 2.94159 -0.70265
+-2.94159 1.47006 -0.70265
+-1.47006 -2.94159 -0.70265
+2.94159 -1.47006 -0.70265
+1.09975 2.99548 0.587785
+-2.99548 1.09975 0.587785
+-1.09975 -2.99548 0.587785
+2.99548 -1.09975 0.587785
+2.94632 1.78166 -0.830596
+1.75896 2.9121 0.801567
+-1.78166 2.94632 -0.830596
+-2.9121 1.75896 0.801567
+-2.94632 -1.78166 -0.830596
+-1.75896 -2.9121 0.801567
+1.78166 -2.94632 -0.830596
+2.9121 -1.75896 0.801567
+0.933408 3.12611 0.675333
+-3.12611 0.933408 0.675333
+-0.933408 -3.12611 0.675333
+3.12611 -0.933408 0.675333
+2.3403 2.71656 -0.910106
+-2.71656 2.3403 -0.910106
+-2.3403 -2.71656 -0.910106
+2.71656 -2.3403 -0.910106
+3.15532 1.10562 0.754251
+-1.10562 3.15532 0.754251
+-3.15532 -1.10562 0.754251
+1.10562 -3.15532 0.754251
+2.16384 2.41923 0.656586
+-2.41923 2.16384 0.656586
+-2.16384 -2.41923 0.656586
+2.41923 -2.16384 0.656586
+0.719799 3.12416 0.60793
+-3.12416 0.719799 0.60793
+-0.719799 -3.12416 0.60793
+3.12416 -0.719799 0.60793
+0.515581 3.50268 -0.888136
+-3.50268 0.515581 -0.888136
+-0.515581 -3.50268 -0.888136
+3.50268 -0.515581 -0.888136
+3.35715 0.716377 0.823533
+-0.716377 3.35715 0.823533
+-3.35715 -0.716377 0.823533
+0.716377 -3.35715 0.823533
+0.890836 3.15639 -0.693653
+-3.15639 0.890836 -0.693653
+-0.890836 -3.15639 -0.693653
+3.15639 -0.890836 -0.693653
+3.01829 1.74329 0.857527
+-1.74329 3.01829 0.857527
+-3.01829 -1.74329 0.857527
+1.74329 -3.01829 0.857527
+2.11497 2.36999 0.567269
+-2.36999 2.11497 0.567269
+-2.11497 -2.36999 0.567269
+2.36999 -2.11497 0.567269
+2.29338 2.26246 0.627691
+-2.26246 2.29338 0.627691
+-2.29338 -2.26246 0.627691
+2.26246 -2.29338 0.627691
+1.71096 2.83987 0.728969
+-2.83987 1.71096 0.728969
+-1.71096 -2.83987 0.728969
+2.83987 -1.71096 0.728969
+1.56819 3.16176 -0.882291
+-3.16176 1.56819 -0.882291
+-1.56819 -3.16176 -0.882291
+3.16176 -1.56819 -0.882291
+0.909492 3.05863 0.587785
+-3.05863 0.909492 0.587785
+-0.909492 -3.05863 0.587785
+3.05863 -0.909492 0.587785
+3.02376 1.33747 -0.720309
+-1.33747 3.02376 -0.720309
+-3.02376 -1.33747 -0.720309
+1.33747 -3.02376 -0.720309
+3.14677 0.726257 -0.637424
+-0.726257 3.14677 -0.637424
+-3.14677 -0.726257 -0.637424
+0.726257 -3.14677 -0.637424
+1.83639 2.74947 -0.720309
+-2.74947 1.83639 -0.720309
+-1.83639 -2.74947 -0.720309
+2.74947 -1.83639 -0.720309
+1.31035 2.96949 0.656586
+-2.96949 1.31035 0.656586
+-1.31035 -2.96949 0.656586
+2.96949 -1.31035 0.656586
+2.28771 2.54547 0.816339
+-2.54547 2.28771 0.816339
+-2.28771 -2.54547 0.816339
+2.54547 -2.28771 0.816339
+1.34153 3.03192 0.728969
+-3.03192 1.34153 0.728969
+-1.34153 -3.03192 0.728969
+3.03192 -1.34153 0.728969
+1.27588 2.90125 0.556876
+-2.90125 1.27588 0.556876
+-1.27588 -2.90125 0.556876
+2.90125 -1.27588 0.556876
+1.28866 3.04488 -0.720309
+-3.04488 1.28866 -0.720309
+-1.28866 -3.04488 -0.720309
+3.04488 -1.28866 -0.720309
+0.49002 3.26074 -0.711536
+-3.26074 0.49002 -0.711536
+-0.49002 -3.26074 -0.711536
+3.26074 -0.49002 -0.711536
+1.41241 3.17483 0.850994
+-3.17483 1.41241 0.850994
+-1.41241 -3.17483 0.850994
+3.17483 -1.41241 0.850994
+1.52018 2.92602 0.711536
+-2.92602 1.52018 0.711536
+-1.52018 -2.92602 0.711536
+2.92602 -1.52018 0.711536
+0.59204 3.49057 0.888136
+-3.49057 0.59204 0.888136
+-0.59204 -3.49057 0.888136
+3.49057 -0.59204 0.888136
+1.50413 3.01829 -0.778462
+-3.01829 1.50413 -0.778462
+-1.50413 -3.01829 -0.778462
+3.01829 -1.50413 -0.778462
+3.02809 1.28245 0.70265
+-1.28245 3.02809 0.70265
+-3.02809 -1.28245 0.70265
+1.28245 -3.02809 0.70265
+2.36332 2.06148 0.503623
+-2.06148 2.36332 0.503623
+-2.36332 -2.06148 0.503623
+2.06148 -2.36332 0.503623
+2.7634 1.61046 0.597905
+-1.61046 2.7634 0.597905
+-2.7634 -1.61046 0.597905
+1.61046 -2.7634 0.597905
+2.90323 1.50695 -0.684547
+-1.50695 2.90323 -0.684547
+-2.90323 -1.50695 -0.684547
+1.50695 -2.90323 -0.684547
+2.71846 1.62944 -0.556876
+-1.62944 2.71846 -0.556876
+-2.71846 -1.62944 -0.556876
+1.62944 -2.71846 -0.556876
+2.8625 1.98878 -0.857527
+-1.98878 2.8625 -0.857527
+-2.8625 -1.98878 -0.857527
+1.98878 -2.8625 -0.857527
+1.44304 2.88027 -0.627691
+-2.88027 1.44304 -0.627691
+-1.44304 -2.88027 -0.627691
+2.88027 -1.44304 -0.627691
+3.43159 1.03967 -0.910106
+-1.03967 3.43159 -0.910106
+-3.43159 -1.03967 -0.910106
+1.03967 -3.43159 -0.910106
+3.08793 0.11025 -0.414376
+-0.11025 3.08793 -0.414376
+-3.08793 -0.11025 -0.414376
+0.11025 -3.08793 -0.414376
+1.99531 2.87113 0.863923
+-2.87113 1.99531 0.863923
+-1.99531 -2.87113 0.863923
+2.87113 -1.99531 0.863923
+1.92292 2.45408 0.470704
+-2.45408 1.92292 0.470704
+-1.92292 -2.45408 0.470704
+2.45408 -1.92292 0.470704
+2.62208 1.80566 -0.577573
+-1.80566 2.62208 -0.577573
+-2.62208 -1.80566 -0.577573
+1.80566 -2.62208 -0.577573
+0.860403 3.02239 -0.51444
+-3.02239 0.860403 -0.51444
+-0.860403 -3.02239 -0.51444
+3.02239 -0.860403 -0.51444
+1.79674 2.68353 -0.637424
+-2.68353 1.79674 -0.637424
+-1.79674 -2.68353 -0.637424
+2.68353 -1.79674 -0.637424
+0.681406 3.14865 -0.627691
+-3.14865 0.681406 -0.627691
+-0.681406 -3.14865 -0.627691
+3.14865 -0.681406 -0.627691
+0.557242 3.32595 0.778462
+-3.32595 0.557242 0.778462
+-0.557242 -3.32595 0.778462
+3.32595 -0.557242 0.778462
+3.00234 1.10269 -0.597905
+-1.10269 3.00234 -0.597905
+-3.00234 -1.10269 -0.597905
+1.10269 -3.00234 -0.597905
+3.11437 0.310592 -0.492727
+-0.310592 3.11437 -0.492727
+-3.11437 -0.310592 -0.492727
+0.310592 -3.11437 -0.492727
+1.42302 2.76102 0.448383
+-2.76102 1.42302 0.448383
+-1.42302 -2.76102 0.448383
+2.76102 -1.42302 0.448383
+2.96592 1.54328 -0.754251
+-1.54328 2.96592 -0.754251
+-2.96592 -1.54328 -0.754251
+1.54328 -2.96592 -0.754251
+2.34996 2.31305 0.711536
+-2.31305 2.34996 0.711536
+-2.34996 -2.31305 0.711536
+2.31305 -2.34996 0.711536
+1.05029 2.96869 -0.525175
+-2.96869 1.05029 -0.525175
+-1.05029 -2.96869 -0.525175
+2.96869 -1.05029 -0.525175
+3.06133 1.12786 -0.675333
+-1.12786 3.06133 -0.675333
+-3.06133 -1.12786 -0.675333
+1.12786 -3.06133 -0.675333
+2.39848 2.78975 -0.947098
+-2.78975 2.39848 -0.947098
+-2.39848 -2.78975 -0.947098
+2.78975 -2.39848 -0.947098
+2.67797 1.84862 -0.666012
+-1.84862 2.67797 -0.666012
+-2.67797 -1.84862 -0.666012
+1.84862 -2.67797 -0.666012
+2.24709 2.27608 -0.597905
+-2.27608 2.24709 -0.597905
+-2.24709 -2.27608 -0.597905
+2.27608 -2.24709 -0.597905
+0.92576 3.30554 -0.823533
+-3.30554 0.92576 -0.823533
+-0.92576 -3.30554 -0.823533
+3.30554 -0.92576 -0.823533
+3.23102 1.1285 0.816339
+-1.1285 3.23102 0.816339
+-3.23102 -1.1285 0.816339
+1.1285 -3.23102 0.816339
+2.56998 1.76503 -0.470704
+-1.76503 2.56998 -0.470704
+-2.56998 -1.76503 -0.470704
+1.76503 -2.56998 -0.470704
+1.24152 2.91612 -0.556876
+-2.91612 1.24152 -0.556876
+-1.24152 -2.91612 -0.556876
+2.91612 -1.24152 -0.556876
+0.786803 3.36279 0.837528
+-3.36279 0.786803 0.837528
+-0.786803 -3.36279 0.837528
+3.36279 -0.786803 0.837528
+2.48249 1.9482 -0.535827
+-1.9482 2.48249 -0.535827
+-2.48249 -1.9482 -0.535827
+1.9482 -2.48249 -0.535827
+0.907488 3.2278 -0.762443
+-3.2278 0.907488 -0.762443
+-0.907488 -3.2278 -0.762443
+3.2278 -0.907488 -0.762443
+0.692331 3.21476 -0.70265
+-3.21476 0.692331 -0.70265
+-0.692331 -3.21476 -0.70265
+3.21476 -0.692331 -0.70265
+3.21138 0.122336 -0.61786
+-0.122336 3.21138 -0.61786
+-3.21138 -0.122336 -0.61786
+0.122336 -3.21138 -0.61786
+0.279205 3.1433 -0.535827
+-3.1433 0.279205 -0.535827
+-0.279205 -3.1433 -0.535827
+3.1433 -0.279205 -0.535827
+2.41269 2.09974 0.597905
+-2.09974 2.41269 0.597905
+-2.41269 -2.09974 0.597905
+2.09974 -2.41269 0.597905
+0.506374 3.41628 -0.837528
+-3.41628 0.506374 -0.837528
+-0.506374 -3.41628 -0.837528
+3.41628 -0.506374 -0.837528
+1.26207 2.97267 -0.637424
+-2.97267 1.26207 -0.637424
+-1.26207 -2.97267 -0.637424
+2.97267 -1.26207 -0.637424
+2.76833 1.66312 -0.637424
+-1.66312 2.76833 -0.637424
+-2.76833 -1.66312 -0.637424
+1.66312 -2.76833 -0.637424
+1.76596 2.63183 -0.556876
+-2.63183 1.76596 -0.556876
+-1.76596 -2.63183 -0.556876
+2.63183 -1.76596 -0.556876
+2.00541 2.62874 -0.720309
+-2.62874 2.00541 -0.720309
+-2.00541 -2.62874 -0.720309
+2.62874 -2.00541 -0.720309
+2.69501 1.38129 -0.236499
+-1.38129 2.69501 -0.236499
+-2.69501 -1.38129 -0.236499
+1.38129 -2.69501 -0.236499
+1.37565 3.1006 0.79399
+-3.1006 1.37565 0.79399
+-1.37565 -3.1006 0.79399
+3.1006 -1.37565 0.79399
+1.22777 2.80908 0.356412
+-2.80908 1.22777 0.356412
+-1.22777 -2.80908 0.356412
+2.80908 -1.22777 0.356412
+3.14034 0.115678 -0.51444
+-0.115678 3.14034 -0.51444
+-3.14034 -0.115678 -0.51444
+0.115678 -3.14034 -0.51444
+2.847 1.47413 -0.60793
+-1.47413 2.847 -0.60793
+-2.847 -1.47413 -0.60793
+1.47413 -2.847 -0.60793
+1.41672 2.81978 -0.535827
+-2.81978 1.41672 -0.535827
+-1.41672 -2.81978 -0.535827
+2.81978 -1.41672 -0.535827
+2.87554 1.91276 0.837528
+-1.91276 2.87554 0.837528
+-2.87554 -1.91276 0.837528
+1.91276 -2.87554 0.837528
+1.86626 2.3929 0.260842
+-2.3929 1.86626 0.260842
+-1.86626 -2.3929 0.260842
+2.3929 -1.86626 0.260842
+3.31567 0.928147 0.830596
+-0.928147 3.31567 0.830596
+-3.31567 -0.928147 0.830596
+0.928147 -3.31567 0.830596
+1.96627 2.57207 -0.647056
+-2.57207 1.96627 -0.647056
+-1.96627 -2.57207 -0.647056
+2.57207 -1.96627 -0.647056
+3.08894 0.70964 -0.556876
+-0.70964 3.08894 -0.556876
+-3.08894 -0.70964 -0.556876
+0.70964 -3.08894 -0.556876
+3.0235 1.06626 0.60793
+-1.06626 3.0235 0.60793
+-3.0235 -1.06626 0.60793
+1.06626 -3.0235 0.60793
+2.2966 2.01143 0.320944
+-2.01143 2.2966 0.320944
+-2.2966 -2.01143 0.320944
+2.01143 -2.2966 0.320944
+2.43116 2.17561 -0.675333
+-2.17561 2.43116 -0.675333
+-2.43116 -2.17561 -0.675333
+2.17561 -2.43116 -0.675333
+1.70229 2.52048 -0.285019
+-2.52048 1.70229 -0.285019
+-1.70229 -2.52048 -0.285019
+2.52048 -1.70229 -0.285019
+1.44852 2.80358 0.535827
+-2.80358 1.44852 0.535827
+-1.44852 -2.80358 0.535827
+2.80358 -1.44852 0.535827
+2.94979 1.95788 0.888136
+-1.95788 2.94979 0.888136
+-2.94979 -1.95788 0.888136
+1.95788 -2.94979 0.888136
+1.07066 3.03842 -0.627691
+-3.03842 1.07066 -0.627691
+-1.07066 -3.03842 -0.627691
+3.03842 -1.07066 -0.627691
+2.65717 1.55706 0.391374
+-1.55706 2.65717 0.391374
+-2.65717 -1.55706 0.391374
+1.55706 -2.65717 0.391374
+3.13326 0.477307 0.556876
+-0.477307 3.13326 0.556876
+-3.13326 -0.477307 0.556876
+0.477307 -3.13326 0.556876
+1.9021 2.47779 -0.481754
+-2.47779 1.9021 -0.481754
+-1.9021 -2.47779 -0.481754
+2.47779 -1.9021 -0.481754
+3.08168 0.47262 0.470704
+-0.47262 3.08168 0.470704
+-3.08168 -0.47262 0.470704
+0.47262 -3.08168 0.470704
+2.63305 1.57016 -0.356412
+-1.57016 2.63305 -0.356412
+-2.63305 -1.57016 -0.356412
+1.57016 -2.63305 -0.356412
+3.0774 0.277639 0.414376
+-0.277639 3.0774 0.414376
+-3.0774 -0.277639 0.414376
+0.277639 -3.0774 0.414376
+1.73975 2.58715 -0.470704
+-2.58715 1.73975 -0.470704
+-1.73975 -2.58715 -0.470704
+2.58715 -1.73975 -0.470704
+2.21002 2.23404 -0.51444
+-2.23404 2.21002 -0.51444
+-2.21002 -2.23404 -0.51444
+2.23404 -2.21002 -0.51444
+2.96216 1.30667 -0.647056
+-1.30667 2.96216 -0.647056
+-2.96216 -1.30667 -0.647056
+1.30667 -2.96216 -0.647056
+0.471181 3.06458 -0.437116
+-3.06458 0.471181 -0.437116
+-0.471181 -3.06458 -0.437116
+3.06458 -0.471181 -0.437116
+2.67092 1.59684 -0.45958
+-1.59684 2.67092 -0.45958
+-2.67092 -1.59684 -0.45958
+1.59684 -2.67092 -0.45958
+3.04873 0.866244 0.556876
+-0.866244 3.04873 0.556876
+-3.04873 -0.866244 0.556876
+0.866244 -3.04873 0.556876
+2.08954 2.74976 -0.837528
+-2.74976 2.08954 -0.837528
+-2.08954 -2.74976 -0.837528
+2.74976 -2.08954 -0.837528
+1.6915 2.49908 -0.187381
+-2.49908 1.6915 -0.187381
+-1.6915 -2.49908 -0.187381
+2.49908 -1.6915 -0.187381
+1.89713 2.7416 0.745941
+-2.7416 1.89713 0.745941
+-1.89713 -2.7416 0.745941
+2.7416 -1.89713 0.745941
+3.04028 0.277372 0.320944
+-0.277372 3.04028 0.320944
+-3.04028 -0.277372 0.320944
+0.277372 -3.04028 0.320944
+2.27562 2.01795 -0.285019
+-2.01795 2.27562 -0.285019
+-2.27562 -2.01795 -0.285019
+2.01795 -2.27562 -0.285019
+2.30196 2.04596 -0.391374
+-2.04596 2.30196 -0.391374
+-2.30196 -2.04596 -0.391374
+2.04596 -2.30196 -0.391374
+2.50615 1.6949 0.224271
+-1.6949 2.50615 0.224271
+-2.50615 -1.6949 0.224271
+1.6949 -2.50615 0.224271
+0.0982578 3.00628 0.125333
+-3.00628 0.0982578 0.125333
+-0.0982578 -3.00628 0.125333
+3.00628 -0.0982578 0.125333
+2.4881 1.90902 0.503623
+-1.90902 2.4881 0.503623
+-2.4881 -1.90902 0.503623
+1.90902 -2.4881 0.503623
+3.09947 0.0833712 0.437116
+0.0843587 3.07861 -0.391374
+-0.0833712 3.09947 0.437116
+-3.07861 0.0843587 -0.391374
+-3.09947 -0.0833712 0.437116
+-0.0843587 -3.07861 -0.391374
+0.0833712 -3.09947 0.437116
+3.07861 -0.0843587 -0.391374
+2.7959 1.93834 -0.801567
+-1.93834 2.7959 -0.801567
+-2.7959 -1.93834 -0.801567
+1.93834 -2.7959 -0.801567
+2.33132 2.37031 -0.737513
+-2.37031 2.33132 -0.737513
+-2.33132 -2.37031 -0.737513
+2.37031 -2.33132 -0.737513
+2.62574 1.54219 0.297042
+-1.54219 2.62574 0.297042
+-2.62574 -1.54219 0.297042
+1.54219 -2.62574 0.297042
+0.0867484 3.04024 -0.285019
+-3.04024 0.0867484 -0.285019
+-0.0867484 -3.04024 -0.285019
+3.04024 -0.0867484 -0.285019
+3.06984 0.303034 -0.402906
+-0.303034 3.06984 -0.402906
+-3.06984 -0.303034 -0.402906
+0.303034 -3.06984 -0.402906
+2.53059 1.70773 0.320944
+-1.70773 2.53059 0.320944
+-2.53059 -1.70773 0.320944
+1.70773 -2.53059 0.320944
+2.2584 1.99812 -0.175023
+-1.99812 2.2584 -0.175023
+-2.2584 -1.99812 -0.175023
+1.99812 -2.2584 -0.175023
+1.68597 2.48486 -0.0753268
+-2.48486 1.68597 -0.0753268
+-1.68597 -2.48486 -0.0753268
+2.48486 -1.68597 -0.0753268
+3.0087 0.290892 -0.212007
+-0.290892 3.0087 -0.212007
+-3.0087 -0.290892 -0.212007
+0.290892 -3.0087 -0.212007
+2.40914 1.88185 -0.33282
+-1.88185 2.40914 -0.33282
+-2.40914 -1.88185 -0.33282
+1.88185 -2.40914 -0.33282
+0.83596 2.89504 -0.162637
+-2.89504 0.83596 -0.162637
+-0.83596 -2.89504 -0.162637
+2.89504 -0.83596 -0.162637
+2.82479 1.7009 -0.711536
+-1.7009 2.82479 -0.711536
+-2.82479 -1.7009 -0.711536
+1.7009 -2.82479 -0.711536
+2.73417 1.89148 -0.737513
+-1.89148 2.73417 -0.737513
+-2.73417 -1.89148 -0.737513
+1.89148 -2.73417 -0.737513
+0.101872 3.02376 0.224271
+-3.02376 0.101872 0.224271
+-0.101872 -3.02376 0.224271
+3.02376 -0.101872 0.224271
+3.32568 0.496788 0.770513
+-0.496788 3.32568 0.770513
+-3.32568 -0.496788 0.770513
+0.496788 -3.32568 0.770513
+2.88951 0.835543 0.125333
+-0.835543 2.88951 0.125333
+-2.88951 -0.835543 0.125333
+0.835543 -2.88951 0.125333
+1.84209 2.38221 -0.150226
+-2.38221 1.84209 -0.150226
+-1.84209 -2.38221 -0.150226
+2.38221 -1.84209 -0.150226
+2.7227 1.39937 -0.344643
+-1.39937 2.7227 -0.344643
+-2.7227 -1.39937 -0.344643
+1.39937 -2.7227 -0.344643
+2.56299 1.72584 0.414376
+-1.72584 2.56299 0.414376
+-2.56299 -1.72584 0.414376
+1.72584 -2.56299 0.414376
+2.44956 1.88337 0.414376
+-1.88337 2.44956 0.414376
+-2.44956 -1.88337 0.414376
+1.88337 -2.44956 0.414376
+2.88139 0.836337 0.0251301
+-0.836337 2.88139 0.0251301
+-2.88139 -0.836337 0.0251301
+0.836337 -2.88139 0.0251301
+2.13421 2.12725 0.162637
+-2.12725 2.13421 0.162637
+-2.13421 -2.12725 0.162637
+2.12725 -2.13421 0.162637
+1.60705 2.75676 -0.587785
+-2.75676 1.60705 -0.587785
+-1.60705 -2.75676 -0.587785
+2.75676 -1.60705 -0.587785
+0.466808 2.9985 -0.260842
+-2.9985 0.466808 -0.260842
+-0.466808 -2.9985 -0.260842
+2.9985 -0.466808 -0.260842
+3.03015 0.0876038 0.24869
+-0.0876038 3.03015 0.24869
+-3.03015 -0.0876038 0.24869
+0.0876038 -3.03015 0.24869
+3.19314 0.483145 0.637424
+-0.483145 3.19314 0.637424
+-3.19314 -0.483145 0.637424
+0.483145 -3.19314 0.637424
+1.63599 2.8129 -0.666012
+-2.8129 1.63599 -0.666012
+-1.63599 -2.8129 -0.666012
+2.8129 -1.63599 -0.666012
+2.37033 1.84005 -0.0376902
+-1.84005 2.37033 -0.0376902
+-2.37033 -1.84005 -0.0376902
+1.84005 -2.37033 -0.0376902
+0.467511 2.96622 -0.0753268
+-2.96622 0.467511 -0.0753268
+-0.467511 -2.96622 -0.0753268
+2.96622 -0.467511 -0.0753268
+2.96359 0.470532 -0.0376902
+-0.470532 2.96359 -0.0376902
+-2.96359 -0.470532 -0.0376902
+0.470532 -2.96359 -0.0376902
+0.281957 2.9868 -0.012566
+-2.9868 0.281957 -0.012566
+-0.281957 -2.9868 -0.012566
+2.9868 -0.281957 -0.012566
+2.96531 0.467749 0.0627905
+-0.467749 2.96531 0.0627905
+-2.96531 -0.467749 0.0627905
+0.467749 -2.96531 0.0627905
+0.470098 2.96326 0.0251301
+-2.96326 0.470098 0.0251301
+-0.470098 -2.96326 0.0251301
+2.96326 -0.470098 0.0251301
+2.25875 1.98631 0.125333
+-1.98631 2.25875 0.125333
+-2.25875 -1.98631 0.125333
+1.98631 -2.25875 0.125333
+3.01 0.0900499 0.150226
+-0.0900499 3.01 0.150226
+-3.01 -0.0900499 0.150226
+0.0900499 -3.01 0.150226
+2.37318 1.83844 0.0627905
+-1.83844 2.37318 0.0627905
+-2.37318 -1.83844 0.0627905
+1.83844 -2.37318 0.0627905
+2.99919 0.0953853 -0.0376902
+-0.0953853 2.99919 -0.0376902
+-2.99919 -0.0953853 -0.0376902
+0.0953853 -2.99919 -0.0376902
+2.25107 1.98358 0.0251301
+-1.98358 2.25107 0.0251301
+-2.25107 -1.98358 0.0251301
+1.98358 -2.25107 0.0251301
+-0.65443 -2.92775 6.85373e-15
+0.65443 2.92775 8.81852e-15
+2.92775 -0.65443 3.4293e-14
+-2.92775 0.65443 3.62578e-14
+1.98356 2.25161 -0.0376902
+-2.25161 1.98356 -0.0376902
+-1.98356 -2.25161 -0.0376902
+2.25161 -1.98356 -0.0376902
+1.8383 2.37239 -0.0502443
+-2.37239 1.8383 -0.0502443
+-1.8383 -2.37239 -0.0502443
+2.37239 -1.8383 -0.0502443
+2.15145 2.14013 0.260842
+-2.14013 2.15145 0.260842
+-2.15145 -2.14013 0.260842
+2.14013 -2.15145 0.260842
+2.13924 2.82104 -0.888136
+-2.82104 2.13924 -0.888136
+-2.13924 -2.82104 -0.888136
+2.82104 -2.13924 -0.888136
+1.84069 2.37054 0.0502443
+-2.37054 1.84069 0.0502443
+-1.84069 -2.37054 0.0502443
+2.37054 -1.84069 0.0502443
+1.84926 2.37665 0.150226
+-2.37665 1.84926 0.150226
+-1.84926 -2.37665 0.150226
+2.37665 -1.84926 0.150226
+0.0946116 2.99859 0.012566
+-2.99859 0.0946116 0.012566
+-0.0946116 -2.99859 0.012566
+2.99859 -0.0946116 0.012566
+1.68759 2.48119 0.0376902
+-2.48119 1.68759 0.0376902
+-1.68759 -2.48119 0.0376902
+2.48119 -1.68759 0.0376902
+3.00792 0.0986898 -0.13779
+-0.0986898 3.00792 -0.13779
+-3.00792 -0.0986898 -0.13779
+0.0986898 -3.00792 -0.13779
+0.658479 2.93202 0.100362
+-2.93202 0.658479 0.100362
+-0.658479 -2.93202 0.100362
+2.93202 -0.658479 0.100362
+0.0824228 3.12261 -0.481754
+-3.12261 0.0824228 -0.481754
+-0.0824228 -3.12261 -0.481754
+3.12261 -0.0824228 -0.481754
+1.2522 2.85519 0.470704
+-2.85519 1.2522 0.470704
+-1.2522 -2.85519 0.470704
+2.85519 -1.2522 0.470704
+2.25097 1.98751 -0.0753268
+-1.98751 2.25097 -0.0753268
+-2.25097 -1.98751 -0.0753268
+1.98751 -2.25097 -0.0753268
+1.96198 2.49811 0.567269
+-2.49811 1.96198 0.567269
+-1.96198 -2.49811 0.567269
+2.49811 -1.96198 0.567269
+3.01268 0.277908 0.224271
+-0.277908 3.01268 0.224271
+-3.01268 -0.277908 0.224271
+0.277908 -3.01268 0.224271
+2.27396 1.99564 0.224271
+-1.99564 2.27396 0.224271
+-2.27396 -1.99564 0.224271
+1.99564 -2.27396 0.224271
+2.88386 0.840589 -0.0878512
+-0.840589 2.88386 -0.0878512
+-2.88386 -0.840589 -0.0878512
+0.840589 -2.88386 -0.0878512
+0.281122 3.20139 -0.61786
+-3.20139 0.281122 -0.61786
+-0.281122 -3.20139 -0.61786
+3.20139 -0.281122 -0.61786
+1.9317 2.5216 -0.567269
+-2.5216 1.9317 -0.567269
+-1.9317 -2.5216 -0.567269
+2.5216 -1.9317 -0.567269
+0.285319 2.99029 0.0878512
+-2.99029 0.285319 0.0878512
+-0.285319 -2.99029 0.0878512
+2.99029 -0.285319 0.0878512
+0.47427 2.97026 0.125333
+-2.97026 0.47427 0.125333
+-0.47427 -2.97026 0.125333
+2.97026 -0.47427 0.125333
+1.85374 2.68467 0.675333
+-2.68467 1.85374 0.675333
+-1.85374 -2.68467 0.675333
+2.68467 -1.85374 0.675333
+0.089103 3.0164 -0.187381
+-3.0164 0.089103 -0.187381
+-0.089103 -3.0164 -0.187381
+3.0164 -0.089103 -0.187381
+2.60306 1.74902 0.503623
+-1.74902 2.60306 0.503623
+-2.60306 -1.74902 0.503623
+1.74902 -2.60306 0.503623
+3.13008 0.278824 0.51444
+-0.278824 3.13008 0.51444
+-3.13008 -0.278824 0.51444
+0.278824 -3.13008 0.51444
+2.38844 1.86182 -0.236499
+-1.86182 2.38844 -0.236499
+-2.38844 -1.86182 -0.236499
+1.86182 -2.38844 -0.236499
+2.37545 1.84785 -0.13779
+-1.84785 2.37545 -0.13779
+-2.37545 -1.84785 -0.13779
+1.84785 -2.37545 -0.13779
+0.0917127 3.00247 -0.0878512
+-3.00247 0.0917127 -0.0878512
+-0.0917127 -3.00247 -0.0878512
+3.00247 -0.0917127 -0.0878512
+3.16494 0.892821 0.70265
+-0.892821 3.16494 0.70265
+-3.16494 -0.892821 0.70265
+0.892821 -3.16494 0.70265
+0.497807 3.33536 -0.778462
+-3.33536 0.497807 -0.778462
+-0.497807 -3.33536 -0.778462
+3.33536 -0.497807 -0.778462
+2.79784 1.44511 -0.525175
+-1.44511 2.79784 -0.525175
+-2.79784 -1.44511 -0.525175
+1.44511 -2.79784 -0.525175
+2.97354 0.878499 -0.437116
+-0.878499 2.97354 -0.437116
+-2.97354 -0.878499 -0.437116
+0.878499 -2.97354 -0.437116
+3.08592 1.08479 0.684547
+-1.08479 3.08592 0.684547
+-3.08592 -1.08479 0.684547
+1.08479 -3.08592 0.684547
+3.05107 0.105863 -0.320944
+-0.105863 3.05107 -0.320944
+-3.05107 -0.105863 -0.320944
+0.105863 -3.05107 -0.320944
+2.75625 1.42012 -0.437116
+-1.42012 2.75625 -0.437116
+-2.75625 -1.42012 -0.437116
+1.42012 -2.75625 -0.437116
+2.32647 2.03346 0.414376
+-2.03346 2.32647 0.414376
+-2.32647 -2.03346 0.414376
+2.03346 -2.32647 0.414376
+0.480046 2.98715 0.224271
+-2.98715 0.480046 0.224271
+-0.480046 -2.98715 0.224271
+2.98715 -0.480046 0.224271
+3.0345 0.296466 -0.309017
+-0.296466 3.0345 -0.309017
+-3.0345 -0.296466 -0.309017
+0.296466 -3.0345 -0.309017
+3.06007 0.0853901 0.344643
+-0.0853901 3.06007 0.344643
+-3.06007 -0.0853901 0.344643
+0.0853901 -3.06007 0.344643
+1.71844 2.54992 -0.379779
+-2.54992 1.71844 -0.379779
+-1.71844 -2.54992 -0.379779
+2.54992 -1.71844 -0.379779
+2.53361 1.9399 0.587785
+-1.9399 2.53361 0.587785
+-2.53361 -1.9399 0.587785
+1.9399 -2.53361 0.587785
+4.60139 1.83789 0.297042
+-1.83789 4.60139 0.297042
+-4.60139 -1.83789 0.297042
+1.83789 -4.60139 0.297042
+2.58008 4.00301 -0.647056
+-4.00301 2.58008 -0.647056
+-2.58008 -4.00301 -0.647056
+4.00301 -2.58008 -0.647056
+3.1622 3.8401 0.224271
+-3.8401 3.1622 0.224271
+-3.1622 -3.8401 0.224271
+3.8401 -3.1622 0.224271
+1.8417 4.62104 -0.224271
+-4.62104 1.8417 -0.224271
+-1.8417 -4.62104 -0.224271
+4.62104 -1.8417 -0.224271
+4.97927 0.305732 -0.150226
+-0.305732 4.97927 -0.150226
+-4.97927 -0.305732 -0.150226
+0.305732 -4.97927 -0.150226
+1.24701 4.79916 -0.285019
+-4.79916 1.24701 -0.285019
+-1.24701 -4.79916 -0.285019
+4.79916 -1.24701 -0.285019
+4.89313 0.636271 0.356412
+-0.636271 4.89313 0.356412
+-4.89313 -0.636271 0.356412
+0.636271 -4.89313 0.356412
+2.6539 4.20404 0.236499
+-4.20404 2.6539 0.236499
+-2.6539 -4.20404 0.236499
+4.20404 -2.6539 0.236499
+4.50861 2.1306 0.162637
+-2.1306 4.50861 0.162637
+-4.50861 -2.1306 0.162637
+2.1306 -4.50861 0.162637
+4.6482 1.83698 -0.0627905
+-1.83698 4.6482 -0.0627905
+-4.6482 -1.83698 -0.0627905
+1.83698 -4.6482 -0.0627905
+2.93523 4.04533 0.0627905
+-4.04533 2.93523 0.0627905
+-2.93523 -4.04533 0.0627905
+4.04533 -2.93523 0.0627905
+3.83293 3.18306 0.187381
+-3.18306 3.83293 0.187381
+-3.83293 -3.18306 0.187381
+3.18306 -3.83293 0.187381
+4.62382 1.84214 0.212007
+-1.84214 4.62382 0.212007
+-4.62382 -1.84214 0.212007
+1.84214 -4.62382 0.212007
+1.23907 4.73438 -0.448383
+-4.73438 1.23907 -0.448383
+-1.23907 -4.73438 -0.448383
+4.73438 -1.23907 -0.448383
+1.54017 4.67806 -0.379779
+-4.67806 1.54017 -0.379779
+-1.54017 -4.67806 -0.379779
+4.67806 -1.54017 -0.379779
+4.79162 1.24634 0.309017
+-1.24634 4.79162 0.309017
+-4.79162 -1.24634 0.309017
+1.24634 -4.79162 0.309017
+3.38388 3.6244 0.285019
+-3.6244 3.38388 0.285019
+-3.38388 -3.6244 0.285019
+3.6244 -3.38388 0.285019
+4.9834 0.319188 0.112856
+-0.319188 4.9834 0.112856
+-4.9834 -0.319188 0.112856
+0.319188 -4.9834 0.112856
+2.68073 4.21829 -0.0627905
+-4.21829 2.68073 -0.0627905
+-2.68073 -4.21829 -0.0627905
+4.21829 -2.68073 -0.0627905
+3.40164 3.637 0.19971
+-3.637 3.40164 0.19971
+-3.40164 -3.637 0.19971
+3.637 -3.40164 0.19971
+4.7229 1.23734 0.470704
+-1.23734 4.7229 0.470704
+-4.7229 -1.23734 0.470704
+1.23734 -4.7229 0.470704
+3.42088 3.64562 0.0376902
+-3.64562 3.42088 0.0376902
+-3.42088 -3.64562 0.0376902
+3.64562 -3.42088 0.0376902
+4.42363 2.1061 0.437116
+-2.1061 4.42363 0.437116
+-4.42363 -2.1061 0.437116
+2.1061 -4.42363 0.437116
+1.54838 4.73302 -0.19971
+-4.73302 1.54838 -0.19971
+-1.54838 -4.73302 -0.19971
+4.73302 -1.54838 -0.19971
+4.16057 2.66096 0.344643
+-2.66096 4.16057 0.344643
+-4.16057 -2.66096 0.344643
+2.66096 -4.16057 0.344643
+1.77921 4.39981 -0.666012
+-4.39981 1.77921 -0.666012
+-1.77921 -4.39981 -0.666012
+4.39981 -1.77921 -0.666012
+3.63142 3.42045 0.150226
+-3.42045 3.63142 0.150226
+-3.63142 -3.42045 0.150226
+3.42045 -3.63142 0.150226
+0.633059 4.77455 -0.577573
+-4.77455 0.633059 -0.577573
+-0.633059 -4.77455 -0.577573
+4.77455 -0.633059 -0.577573
+2.87638 3.91434 -0.51444
+-3.91434 2.87638 -0.51444
+-2.87638 -3.91434 -0.51444
+3.91434 -2.87638 -0.51444
+4.04454 2.9331 -0.0878512
+-2.9331 4.04454 -0.0878512
+-4.04454 -2.9331 -0.0878512
+2.9331 -4.04454 -0.0878512
+4.64753 1.84211 0.0376902
+-1.84211 4.64753 0.0376902
+-4.64753 -1.84211 0.0376902
+1.84211 -4.64753 0.0376902
+4.94415 0.633431 0.175023
+-0.633431 4.94415 0.175023
+-4.94415 -0.633431 0.175023
+0.633431 -4.94415 0.175023
+4.67852 1.23011 0.546394
+-1.23011 4.67852 0.546394
+-4.67852 -1.23011 0.546394
+1.23011 -4.67852 0.546394
+4.52433 2.12829 -0.012566
+-2.12829 4.52433 -0.012566
+-4.52433 -2.12829 -0.012566
+2.12829 -4.52433 -0.012566
+3.84678 3.18804 0.0878512
+-3.18804 3.84678 0.0878512
+-3.84678 -3.18804 0.0878512
+3.18804 -3.84678 0.0878512
+3.14305 3.76545 -0.425779
+-3.76545 3.14305 -0.425779
+-3.14305 -3.76545 -0.425779
+3.76545 -3.14305 -0.425779
+3.4237 3.6422 -0.0502443
+-3.6422 3.4237 -0.0502443
+-3.4237 -3.6422 -0.0502443
+3.6422 -3.4237 -0.0502443
+1.54566 4.75501 -0.012566
+-4.75501 1.54566 -0.012566
+-1.54566 -4.75501 -0.012566
+4.75501 -1.54566 -0.012566
+-3.85322 3.18521 0.0376902
+-3.18521 -3.85322 0.0376902
+3.18521 3.85322 0.0376902
+-3.85257 -3.18712 -7.83477e-15
+-3.18712 3.85257 -8.81717e-15
+3.85257 3.18712 -9.79956e-15
+3.85322 -3.18521 0.0376902
+3.18712 -3.85257 -3.52741e-14
+2.93976 4.04409 -0.0251301
+-4.04409 2.93976 -0.0251301
+-2.93976 -4.04409 -0.0251301
+4.04409 -2.93976 -0.0251301
+4.84425 0.0273939 0.535827
+-0.0273939 4.84425 0.535827
+-4.84425 -0.0273939 0.535827
+0.0273939 -4.84425 0.535827
+4.98836 0.310694 -0.0627905
+-0.310694 4.98836 -0.0627905
+-4.98836 -0.310694 -0.0627905
+0.310694 -4.98836 -0.0627905
+4.66122 0.550801 -0.720309
+-0.550801 4.66122 -0.720309
+-4.66122 -0.550801 -0.720309
+0.550801 -4.66122 -0.720309
+0.013718 4.96201 -0.272952
+-4.96201 0.013718 -0.272952
+-0.013718 -4.96201 -0.272952
+4.96201 -0.013718 -0.272952
+4.21923 2.68058 0.0502443
+-2.68058 4.21923 0.0502443
+-4.21923 -2.68058 0.0502443
+2.68058 -4.21923 0.0502443
+3.85082 -3.18812 -0.0376902
+3.18812 3.85082 -0.0376902
+-3.18812 -3.85082 -0.0376902
+-3.85082 3.18812 -0.0376902
+1.84249 4.64678 -0.0502443
+-4.64678 1.84249 -0.0502443
+-1.84249 -4.64678 -0.0502443
+4.64678 -1.84249 -0.0502443
+4.22205 2.6779 -0.0251301
+-2.6779 4.22205 -0.0251301
+-4.22205 -2.6779 -0.0251301
+2.6779 -4.22205 -0.0251301
+4.99002 0.314575 0.012566
+-0.314575 4.99002 0.012566
+-4.99002 -0.314575 0.012566
+0.314575 -4.99002 0.012566
+2.67284 4.18841 -0.24869
+-4.18841 2.67284 -0.24869
+-2.67284 -4.18841 -0.24869
+4.18841 -2.67284 -0.24869
+1.83617 4.59372 -0.320944
+-4.59372 1.83617 -0.320944
+-1.83617 -4.59372 -0.320944
+4.59372 -1.83617 -0.320944
+3.61603 3.41196 0.236499
+-3.41196 3.61603 0.236499
+-3.61603 -3.41196 0.236499
+3.41196 -3.61603 0.236499
+3.32468 3.57537 0.470704
+-3.57537 3.32468 0.470704
+-3.32468 -3.57537 0.470704
+3.57537 -3.32468 0.470704
+0.636134 4.8634 -0.425779
+-4.8634 0.636134 -0.425779
+-0.636134 -4.8634 -0.425779
+4.8634 -0.636134 -0.425779
+-4.84292 1.24345 -2.54772e-14
+4.84292 -1.24345 -2.35124e-14
+1.24345 4.84292 1.96208e-15
+-1.24345 -4.84292 3.92687e-15
+0.934922 4.91109 0.0376902
+-4.91109 0.934922 0.0376902
+-0.934922 -4.91109 0.0376902
+4.91109 -0.934922 0.0376902
+4.99929 0.00188469 0.0376902
+0.00188469 4.99929 -0.0376902
+-0.00188469 4.99929 0.0376902
+-4.99929 0.00188469 -0.0376902
+-4.99929 -0.00188469 0.0376902
+-0.00188469 -4.99929 -0.0376902
+0.00188469 -4.99929 0.0376902
+4.99929 -0.00188469 -0.0376902
+4.04057 2.9403 0.0753268
+-2.9403 4.04057 0.0753268
+-4.04057 -2.9403 0.0753268
+2.9403 -4.04057 0.0753268
+3.55479 2.88404 -0.816339
+-2.88404 3.55479 -0.816339
+-3.55479 -2.88404 -0.816339
+2.88404 -3.55479 -0.816339
+4.80262 0.634323 0.535827
+-0.634323 4.80262 0.535827
+-4.80262 -0.634323 0.535827
+0.634323 -4.80262 0.535827
+4.5121 2.11285 -0.187381
+-2.11285 4.5121 -0.187381
+-4.5121 -2.11285 -0.187381
+2.11285 -4.5121 -0.187381
+4.36238 2.38469 -0.236499
+-2.38469 4.36238 -0.236499
+-4.36238 -2.38469 -0.236499
+2.38469 -4.36238 -0.236499
+-4.04508 -2.93893 -4.3117e-14
+-2.93893 4.04508 -1.56777e-14
+2.93893 -4.04508 -1.37129e-14
+4.04508 2.93893 -2.44921e-15
+0.941256 4.9041 -0.112856
+-4.9041 0.941256 -0.112856
+-0.941256 -4.9041 -0.112856
+4.9041 -0.941256 -0.112856
+1.84352 4.63747 -0.13779
+-4.63747 1.84352 -0.13779
+-1.84352 -4.63747 -0.13779
+4.63747 -1.84352 -0.13779
+4.89462 0.942627 0.175023
+-0.942627 4.89462 0.175023
+-4.89462 -0.942627 0.175023
+0.942627 -4.89462 0.175023
+2.66442 4.16829 -0.320944
+-4.16829 2.66442 -0.320944
+-2.66442 -4.16829 -0.320944
+4.16829 -2.66442 -0.320944
+4.99361 0.00564764 0.112856
+0.00564764 4.99361 -0.112856
+-0.00564764 4.99361 0.112856
+-4.99361 0.00564764 -0.112856
+-4.99361 -0.00564764 0.112856
+-0.00564764 -4.99361 -0.112856
+0.00564764 -4.99361 0.112856
+4.99361 -0.00564764 -0.112856
+3.41276 3.64339 0.125333
+-3.64339 3.41276 0.125333
+-3.41276 -3.64339 0.125333
+3.64339 -3.41276 0.125333
diff --git a/data/points/spiral_4d_10k.off b/data/points/spiral_4d_10k.off
new file mode 100644
index 00000000..b8dfd850
--- /dev/null
+++ b/data/points/spiral_4d_10k.off
@@ -0,0 +1,10002 @@
+nOFF
+4 10000 0 0
+-0.131548 0.99131 0.809975 0.586465
+0.449263 -0.893399 -0.862884 0.505403
+0.684747 0.728781 0.999625 -0.0273947
+-0.979174 -0.203024 -0.0241882 0.999707
+-0.869689 0.4936 0.21224 -0.977218
+0.565954 0.824437 -0.892124 0.45179
+-0.554594 0.832121 -0.619417 0.785062
+-0.803871 0.594803 0.644627 -0.764497
+0.992841 -0.11944 0.828817 0.55952
+-0.374775 -0.927116 0.754234 -0.656606
+-0.378772 0.92549 0.41053 0.911847
+0.866634 -0.498945 -0.391067 -0.920362
+-0.604154 -0.796868 -0.450815 -0.892617
+-0.0723752 0.997377 0.572971 0.819576
+-0.587862 -0.808961 0.999955 -0.00947563
+-0.544173 -0.838973 0.547301 -0.836936
+0.913181 -0.407554 -0.420602 0.907245
+0.761465 0.648206 0.16256 0.986699
+-0.0737537 -0.997276 0.454589 -0.890701
+0.147723 0.989029 -0.636076 -0.771626
+0.717588 0.696468 -0.077313 0.997007
+0.154763 0.987952 -0.985716 -0.168419
+-0.984943 -0.172877 0.0961013 -0.995372
+-0.130204 -0.991487 0.881829 -0.471569
+0.898968 0.438015 0.212565 0.977147
+-0.709015 0.705194 -0.963715 -0.266933
+0.467465 -0.884011 -0.0525329 -0.998619
+0.471163 -0.882046 0.358075 -0.933693
+0.490241 -0.871587 0.564355 0.825532
+0.472706 0.88122 0.515174 0.857086
+0.92419 -0.381934 0.0809925 -0.996715
+0.799522 0.600636 -0.0270318 0.999635
+0.999651 -0.0264155 -0.877708 -0.479195
+0.911182 0.412004 0.0536571 -0.998559
+-0.660928 -0.75045 -0.998688 -0.0512032
+-0.856347 0.516401 -0.654563 0.756008
+0.176017 0.984387 0.40327 0.915081
+0.991011 -0.133777 0.658802 -0.752316
+0.381236 -0.924478 0.156017 0.987754
+0.292332 0.956317 -0.177769 0.984072
+-0.495433 -0.868646 0.00291519 -0.999996
+0.711194 0.702996 -0.836631 0.547766
+0.730494 0.682919 0.975222 -0.221227
+-0.392878 0.919591 -0.893928 0.448211
+-0.752625 0.658449 -0.928302 -0.371828
+0.123026 -0.992403 0.973082 -0.230458
+0.985305 -0.170802 -0.114124 0.993467
+-0.418929 0.908019 0.727785 -0.685806
+0.736961 -0.675935 0.385576 0.922676
+-0.243007 -0.970025 0.833003 0.553269
+-0.959942 -0.280198 -0.992112 -0.125353
+0.999602 0.0282278 -0.949724 0.313088
+0.920729 -0.390203 -0.727923 -0.685659
+0.897049 0.441931 -0.220116 0.975474
+-0.102164 -0.994768 -0.689852 0.723951
+0.99862 0.0525128 0.515259 -0.857034
+-0.947668 0.319257 0.472515 -0.881323
+-0.927144 -0.374705 0.759191 0.650868
+0.516832 -0.856087 -0.615706 -0.787976
+-0.186325 0.982488 0.994226 -0.107303
+-0.108069 -0.994143 -0.166735 0.986002
+0.150682 -0.988582 -0.835255 0.549863
+-0.739089 0.673608 0.080388 0.996764
+-0.134292 -0.990942 0.618832 -0.785523
+0.544598 -0.838697 0.504253 0.863556
+0.993993 0.109444 -0.0292451 -0.999572
+0.626724 0.779241 0.188798 0.982016
+0.921461 0.38847 -0.586873 0.809679
+0.999699 -0.0245137 -0.771261 -0.636519
+0.959321 -0.282318 -0.940535 0.339697
+-0.102129 0.994771 -0.692455 -0.721461
+-0.516578 -0.85624 -0.638765 0.769402
+0.880731 0.473616 0.600806 -0.799395
+-0.753953 0.656929 -0.834904 -0.550396
+0.990343 -0.138642 0.226155 -0.974091
+-0.974713 0.223462 -0.854967 0.518682
+0.559183 0.829044 -0.939273 -0.34317
+0.952109 -0.305758 0.941918 0.335844
+0.205428 -0.978672 -0.266517 0.96383
+0.972476 0.233002 -0.0455269 -0.998963
+-0.527962 -0.849268 0.598808 0.800893
+-0.471421 0.881908 0.385233 -0.922819
+0.965511 0.26036 0.356001 0.934486
+-0.817497 -0.575933 0.113253 -0.993566
+-0.812631 0.582779 0.81539 0.578912
+0.160357 -0.987059 -0.922109 -0.38693
+-0.786125 -0.618068 -0.793165 -0.609006
+0.584047 -0.81172 0.895492 -0.445077
+-0.51853 0.855059 -0.448217 -0.893925
+-0.935414 0.353554 0.00847423 0.999964
+0.688682 0.725063 0.842564 -0.538597
+0.906089 0.423088 0.956145 -0.292895
+0.208568 0.978008 -0.556921 -0.830565
+-0.997406 -0.071985 0.604586 0.79654
+0.297575 -0.954699 0.361617 -0.932327
+0.933838 0.357696 0.43641 -0.899748
+-0.983536 -0.180712 0.778518 -0.627622
+0.930438 -0.36645 0.983832 0.179092
+0.721541 0.692371 0.47239 0.881389
+-0.98767 -0.156548 -0.999934 -0.0114814
+0.789133 -0.614222 -0.986166 0.165762
+-0.762441 0.647058 0.308779 -0.951134
+0.376166 0.926552 0.647556 -0.762018
+0.98592 -0.167219 -0.459985 0.887926
+0.149773 -0.98872 -0.781301 0.624155
+0.500993 0.865451 -0.595827 -0.803113
+-0.923622 0.383305 -0.0672795 -0.997734
+0.903444 -0.428707 0.948046 -0.318133
+0.741619 0.670822 -0.2915 -0.956571
+0.185392 0.982665 0.979578 0.201066
+0.978467 -0.206402 -0.360965 -0.932579
+0.178161 -0.984001 0.591558 -0.806262
+-0.954018 -0.29975 0.562914 -0.826516
+0.99846 0.0554705 0.742978 -0.669316
+-0.712365 0.701809 -0.734079 -0.679064
+0.949952 -0.312396 0.937474 -0.348055
+0.214863 -0.976644 -0.944085 0.329702
+0.993774 -0.111419 0.168692 0.985669
+0.301239 -0.953549 0.684589 -0.728929
+0.723676 0.69014 0.717884 0.696163
+-0.890197 0.455576 -0.984204 0.177039
+0.898841 -0.438275 0.184211 -0.982887
+0.363725 0.931507 0.890304 0.455367
+-0.631223 -0.775601 0.695166 0.718849
+-0.928058 0.372435 0.89428 -0.447508
+0.997543 -0.0700545 0.7465 -0.665385
+-0.312031 -0.950072 0.95016 -0.311762
+0.980082 -0.198591 0.415348 -0.909663
+0.90248 -0.430731 0.853596 -0.520935
+0.432659 -0.901557 0.72363 0.690188
+-0.999087 0.0427128 -0.425765 0.904834
+0.447613 -0.894227 -0.755436 0.655223
+0.253483 0.96734 0.879902 -0.475154
+-0.415399 -0.909639 0.413793 0.910371
+0.291779 -0.956486 -0.2343 -0.972164
+0.994394 -0.105742 -0.390898 0.920434
+0.579137 -0.81523 0.484582 -0.874746
+0.0971327 0.995271 -0.954198 0.299176
+0.853047 -0.521835 -0.0777691 0.996971
+0.976373 -0.216092 -0.978012 -0.208548
+-0.96001 0.279965 -0.994865 0.101209
+0.72697 -0.686669 0.957827 -0.287346
+-0.0386834 -0.999252 -0.746695 0.665166
+0.999786 0.0206717 -0.476372 0.879244
+0.763941 -0.645286 0.519319 -0.85458
+0.72884 0.684684 0.999824 0.0187685
+0.956207 -0.292692 -0.140561 0.990072
+-0.466072 -0.884747 -0.208525 0.978017
+0.800589 0.599214 0.150163 0.988661
+0.00895056 -0.99996 0.625466 0.780251
+0.273314 -0.961925 -0.830555 0.556936
+-0.985669 -0.16869 -0.322822 -0.94646
+-0.430212 -0.902728 0.882116 -0.471031
+0.99545 -0.0952821 -0.993057 0.117634
+0.491341 0.870967 0.455946 -0.890007
+0.735469 0.677558 0.578069 -0.815988
+0.98633 -0.164784 -0.663045 0.74858
+0.674168 -0.738578 0.155751 -0.987796
+0.855377 0.518006 -0.502174 -0.864766
+0.819166 -0.573557 -0.176011 0.984388
+-0.374185 -0.927354 0.794471 -0.607302
+-0.876722 -0.480997 0.996278 -0.0861972
+-0.146221 -0.989252 -0.512029 -0.858968
+0.802217 -0.597032 0.410494 -0.911863
+-0.0733447 0.997307 0.490724 0.871315
+-0.98887 -0.148785 -0.71509 0.699033
+0.734589 -0.678513 0.678848 0.734279
+0.770558 0.63737 0.999975 -0.00703634
+0.0520296 -0.998646 0.473203 -0.880953
+0.272567 -0.962137 -0.784848 0.619688
+0.890083 0.455799 -0.979455 -0.201661
+0.229636 0.973276 -0.381613 0.924322
+-0.462521 -0.886608 -0.573684 0.819077
+0.421026 -0.907048 0.865493 -0.500921
+0.209468 0.977816 -0.630915 -0.775852
+-0.925455 -0.378858 0.402042 0.915621
+0.927902 -0.372824 0.874742 -0.484589
+0.486494 0.873684 0.856831 -0.515597
+0.0961359 0.995368 -0.979329 0.202275
+0.966269 0.257534 0.610448 0.792056
+0.878004 -0.478654 0.938214 0.346056
+0.983745 0.179572 0.700732 -0.713424
+-0.908978 -0.416843 0.552583 -0.833458
+-0.809822 -0.586676 0.990617 -0.136667
+0.996379 0.0850222 -0.611944 0.790901
+-0.0835613 -0.996503 -0.489836 -0.871815
+-0.198092 -0.980183 0.461126 -0.887335
+0.996769 -0.0803272 -0.186307 -0.982492
+-0.792329 -0.610094 -0.937468 0.348072
+0.338297 -0.941039 -0.998903 0.0468301
+0.770447 -0.637505 0.999945 -0.0104693
+-0.269296 0.963058 -0.533405 0.84586
+-0.74923 0.66231 -0.991148 0.132759
+-0.743308 -0.668949 -0.520994 -0.853561
+0.358943 0.93336 0.552348 0.833613
+-0.605574 -0.795789 -0.602055 -0.798454
+0.635505 0.772096 0.969224 0.246181
+0.896972 0.442088 -0.237144 0.971475
+0.0405817 -0.999176 -0.607659 -0.794198
+0.804116 -0.594473 0.675514 -0.737347
+0.669834 -0.742511 -0.415889 -0.909415
+0.491544 -0.870853 0.435016 0.900423
+0.763241 0.646114 0.423762 0.905773
+-0.968129 -0.250453 0.98347 0.181071
+-0.582952 -0.812506 0.827544 0.561401
+-0.471906 0.881649 0.435388 -0.900243
+0.801074 0.598566 0.229604 0.973284
+-0.843844 -0.536588 0.995936 0.0900615
+-0.999862 0.0166195 -0.0911082 -0.995841
+-0.518782 0.854907 -0.421729 -0.906722
+-0.677191 -0.735807 0.536634 0.843815
+-0.869927 0.49318 0.259137 -0.965841
+-0.663866 0.747851 -0.942397 -0.334498
+0.308836 0.951115 0.999819 0.0190158
+0.993823 0.110977 0.124707 -0.992194
+-0.725047 0.6887 0.841248 -0.540649
+0.921982 -0.387232 -0.473169 -0.880972
+-0.0880905 -0.996112 -0.822902 -0.568183
+-0.667382 0.744715 -0.687913 -0.725793
+-0.966761 -0.25568 0.750223 0.661185
+-0.967182 -0.254085 0.848608 0.529023
+-0.0394229 0.999223 -0.695474 -0.718551
+0.50658 -0.862193 -0.959443 0.281903
+0.892925 -0.450206 -0.911328 -0.41168
+0.697732 -0.716358 -0.250989 0.96799
+0.986569 0.163343 -0.764945 -0.644095
+-0.899001 -0.437946 0.219962 0.975508
+0.996511 0.083467 -0.481565 0.87641
+0.812713 0.582664 0.807124 -0.590381
+-0.474069 0.880488 0.641085 -0.76747
+0.850929 -0.525281 0.320915 0.947108
+0.977017 -0.21316 -0.872576 -0.488478
+0.533749 0.845643 0.96993 0.243386
+0.988855 0.148881 -0.721873 0.692026
+-0.999265 -0.0383307 -0.769704 -0.638401
+0.37594 -0.926644 0.666022 0.745932
+-0.597908 0.801565 0.308696 0.951161
+-0.777541 -0.628832 0.444619 -0.89572
+-0.814461 0.580219 0.596136 0.802883
+0.584503 -0.811391 0.91908 -0.394071
+0.940967 -0.338499 -0.999678 -0.0253943
+0.978475 0.206367 -0.357578 0.933883
+-0.108314 0.994117 -0.142442 -0.989803
+-0.371529 0.928421 0.933598 0.358321
+0.10591 0.994376 -0.375272 0.926915
+-0.217969 0.975956 -0.99984 0.0178947
+-0.370027 -0.929021 0.979114 -0.203312
+0.482702 0.875785 0.994153 -0.107984
+0.991363 0.131149 0.832938 0.553366
+0.938806 0.344447 -0.821108 -0.570773
+-0.242736 -0.970092 0.817233 0.576307
+-0.925505 -0.378735 0.414094 0.910234
+-0.38119 0.924497 0.16093 0.986966
+-0.959372 -0.282143 -0.946551 -0.322553
+-0.996915 0.0784855 -0.00265049 -0.999996
+0.396303 0.91812 -0.995765 -0.0919385
+-0.900401 -0.435061 0.516305 0.856405
+0.9306 0.366037 0.974922 -0.222548
+0.318287 0.947994 0.560101 -0.828424
+-0.478273 -0.878211 0.922328 0.386408
+-0.76346 0.645856 0.454209 -0.890895
+0.768803 0.639485 0.964352 0.264622
+-0.654481 -0.756079 -0.61605 -0.787707
+-0.953659 -0.300889 0.657382 -0.753557
+0.665028 0.746819 -0.879265 0.476333
+0.625019 0.78061 -0.0286971 0.999588
+-0.637335 0.770587 0.999934 -0.0115237
+-0.996249 0.0865345 -0.724495 -0.68928
+0.00489448 -0.999988 0.882592 0.47014
+0.0719755 -0.997406 0.605349 0.79596
+-0.512098 0.858927 -0.937494 -0.348001
+-0.333889 -0.942612 -0.870368 -0.492401
+0.276258 -0.961084 -0.959793 0.280708
+-0.798407 -0.602118 -0.210914 0.977505
+0.999191 0.0402182 -0.636137 -0.771576
+0.984937 0.172916 0.0999912 -0.994988
+0.761668 -0.647967 0.193388 -0.981122
+-0.332364 -0.943151 -0.779721 -0.626127
+0.323993 0.946059 -0.0080361 -0.999968
+0.84007 -0.542478 0.704 -0.7102
+0.0128399 -0.999918 0.282859 0.959161
+0.83912 -0.543946 0.569721 -0.821838
+-0.982945 0.183902 0.93797 0.346715
+0.919526 0.393029 -0.901139 0.433531
+-0.958499 0.285095 -0.804356 0.594147
+0.965479 -0.260482 0.344228 -0.938886
+0.00356338 0.999994 0.93718 -0.348845
+0.987067 0.160306 -0.924124 -0.382093
+0.993821 0.110996 0.126648 -0.991948
+-0.946854 0.321663 0.235924 -0.971772
+-0.331306 -0.943523 -0.704701 -0.709504
+-0.83043 0.557123 -0.826196 -0.563383
+-0.933644 -0.358203 0.484666 -0.874699
+-0.496545 0.868011 -0.124751 0.992188
+0.959579 -0.281439 -0.967668 0.252228
+-0.353386 -0.935478 -0.00950193 0.999955
+-0.987928 0.154915 -0.988199 -0.153172
+-0.394701 0.91881 -0.964697 0.263363
+0.433011 0.901388 0.696133 -0.717913
+0.150078 0.988674 -0.800164 -0.599781
+0.888018 0.459809 -0.793605 -0.608434
+-0.995971 -0.0896735 -0.902455 0.430784
+0.881827 -0.471573 0.401105 0.916032
+0.687236 -0.726434 0.932488 0.3612
+0.741196 0.671288 -0.230753 -0.973012
+0.900079 -0.435726 0.451631 -0.892205
+0.802496 -0.596657 0.45263 -0.891698
+0.999518 0.0310286 -0.999269 0.0382285
+-0.71011 -0.704091 -0.91078 0.412893
+0.824477 0.565896 -0.895307 -0.44545
+0.856498 -0.516151 -0.676336 0.736593
+-0.71315 0.701011 -0.653653 -0.756794
+0.999652 0.0263833 -0.876163 0.482016
+-0.746968 0.66486 -0.889771 0.456407
+-0.931278 0.36431 0.917126 0.398598
+-0.965687 0.259707 0.418359 -0.908282
+-0.547998 0.836479 0.12223 0.992502
+-0.367626 -0.929974 0.998561 0.0536229
+-0.994831 0.101543 -0.733664 0.679512
+-0.637458 0.770485 0.99999 0.00445342
+0.647226 0.762298 0.287693 -0.957723
+0.425402 0.905005 0.999131 0.041685
+0.100109 -0.994976 -0.823679 -0.567056
+-0.331221 -0.943553 -0.698284 -0.715821
+-0.996785 -0.0801216 -0.166001 0.986126
+-0.183962 -0.982933 0.940075 0.340967
+-0.765624 0.643288 0.722423 -0.691451
+0.997164 -0.0752631 0.31509 -0.949062
+0.975739 0.218938 -0.996686 -0.0813484
+-0.911377 -0.411574 0.00650126 -0.999979
+0.224063 0.974575 -0.821353 0.570421
+0.765804 0.643074 0.741479 0.670976
+0.870798 0.491642 0.424908 0.905236
+0.657168 0.753744 -0.851972 -0.523587
+0.993439 -0.114362 0.449065 0.893499
+0.315398 0.948959 0.782757 -0.622327
+0.91993 0.392084 -0.851924 0.523666
+0.728996 -0.684518 0.999992 0.00399453
+0.285802 0.958289 -0.758395 0.651796
+-0.377189 -0.926136 0.559697 -0.828697
+0.988406 -0.151833 -0.893521 -0.449022
+0.73941 0.673255 0.032821 -0.999461
+0.918224 0.396061 -0.993001 0.118106
+0.992068 -0.125703 0.999305 -0.0372738
+-0.999936 -0.0112965 0.426958 0.904272
+-0.999411 -0.0343252 -0.957784 -0.28749
+-0.925381 0.379037 0.384213 -0.923244
+0.557413 -0.830236 -0.845304 0.534285
+0.335487 0.942045 -0.94099 -0.338435
+0.88211 -0.471044 0.345472 0.938429
+0.284357 0.958719 -0.847675 0.530516
+-0.500982 0.865457 -0.594844 0.803841
+0.801548 0.59793 0.306054 0.952014
+0.982369 -0.186952 0.999044 0.0437049
+0.982541 0.186046 0.990776 -0.135508
+-0.751064 -0.660229 -0.989611 0.143772
+-0.36448 -0.931211 0.924275 0.381727
+-0.871938 0.489616 0.622063 -0.782967
+-0.798625 -0.601829 -0.175368 0.984503
+-0.15176 -0.988417 -0.890159 -0.45565
+0.996177 -0.0873575 -0.778907 -0.62714
+0.407585 -0.913167 -0.417542 -0.908658
+0.519407 -0.854527 -0.354305 -0.93513
+0.910417 0.413692 0.236746 -0.971572
+0.956146 -0.29289 -0.120027 0.992771
+0.418274 -0.908321 0.676432 -0.736505
+-0.105432 0.994426 -0.419321 -0.907838
+0.994424 0.105451 -0.417626 -0.908619
+-0.316842 -0.948478 0.679369 -0.733797
+-0.983081 0.183174 0.909735 0.415188
+-0.277424 -0.960748 -0.986714 -0.162465
+-0.457179 -0.889375 -0.936521 0.350611
+-0.850223 -0.526423 0.444823 -0.895618
+0.125778 -0.992058 0.998996 0.0447921
+-0.56535 -0.824851 -0.922802 0.385276
+0.844222 0.535994 0.999803 0.0198495
+-0.159756 0.987156 -0.943945 -0.330102
+0.835814 0.549013 0.00115142 0.999999
+0.915581 -0.402133 -0.855743 0.517401
+-0.983542 0.180681 0.776524 0.630088
+0.995889 0.0905845 -0.938031 0.346553
+0.645884 0.763436 0.450903 -0.892573
+0.336365 -0.941732 -0.968401 0.249398
+0.74409 0.66808 -0.617011 -0.786955
+0.777222 0.629226 0.489482 -0.872014
+0.505698 -0.862711 -0.925673 0.378324
+-0.117774 -0.99304 0.723742 0.69007
+0.302661 -0.953098 0.785287 -0.619132
+-0.0185408 0.999828 -0.279611 0.960113
+-0.503583 0.863947 -0.806297 0.59151
+-0.987991 -0.154513 -0.981138 0.193311
+0.0688726 0.997625 0.819916 -0.572484
+0.583675 0.811987 0.874144 0.485668
+-0.645205 0.76401 0.528392 0.849
+-0.350006 0.936747 -0.362097 -0.93214
+0.795902 0.605426 -0.587077 0.809531
+0.424094 0.905618 0.982715 0.185127
+-0.894624 -0.446819 -0.694398 0.719591
+0.727621 0.685979 0.980734 0.195348
+0.724589 -0.689182 0.803471 -0.595343
+0.961333 0.275387 -0.930484 0.366332
+0.457193 -0.889367 -0.935967 -0.352088
+-0.944208 -0.329351 -0.543734 0.839258
+-0.672377 -0.740209 -0.0858072 0.996312
+-0.8248 -0.565425 -0.919257 -0.393658
+0.262142 0.965029 0.178413 -0.983956
+-0.170887 -0.985291 -0.105567 0.994412
+0.68993 -0.723876 0.73778 0.675041
+-0.310711 0.950504 0.984161 0.17728
+-0.552679 -0.833394 -0.424172 -0.905582
+-0.547784 0.83662 0.14757 0.989052
+-0.395535 0.918451 -0.984609 0.17477
+0.279277 -0.960211 -0.999558 -0.0297249
+0.603616 0.797276 -0.389575 -0.920995
+-0.907912 0.419161 0.745051 0.667008
+0.82125 -0.570569 -0.515186 0.857078
+0.993065 -0.117565 0.709054 0.705155
+0.523172 0.852227 0.0789425 0.996879
+-0.295248 -0.955421 0.126077 0.99202
+0.0991324 0.995074 -0.875287 0.483603
+-0.999739 0.0228255 -0.653316 -0.757086
+0.144078 0.989566 -0.315467 -0.948937
+-0.985884 0.16743 -0.440807 0.897602
+-0.602057 -0.798453 -0.2034 -0.979096
+-0.848998 -0.528396 0.638957 -0.769242
+0.188226 -0.982126 0.996306 0.0858755
+0.00422614 -0.999991 0.91202 0.410147
+0.11847 -0.992958 0.770321 -0.637657
+-0.607224 0.794531 -0.753628 0.657302
+0.689048 -0.724716 0.814327 0.580406
+-0.598486 -0.801133 0.239306 -0.970944
+-0.802549 0.596587 0.460448 -0.887687
+-0.32951 -0.944152 -0.557829 -0.829956
+0.301241 0.953548 0.684754 0.728774
+0.981214 0.192922 0.844903 0.534919
+-0.262067 0.96505 0.18607 0.982537
+-0.841234 0.540672 0.83925 -0.543745
+0.0224078 -0.999749 -0.621124 0.783712
+0.517768 0.855521 -0.525974 0.850501
+-0.25253 -0.967589 0.922352 -0.38635
+-0.845569 0.533865 0.973179 0.23005
+-0.999371 -0.035466 -0.918807 -0.394707
+0.988568 0.150779 -0.840634 0.541604
+0.276476 0.961021 -0.965911 -0.258875
+-0.57496 -0.818182 -0.00557964 0.999984
+-0.960733 0.277475 -0.987569 -0.157188
+0.775384 0.63149 0.7195 -0.694492
+-0.667162 -0.744913 -0.7091 0.705108
+-0.7391 -0.673595 0.0787361 -0.996895
+0.374408 -0.927264 0.779663 0.626199
+0.675106 -0.73772 0.279674 -0.960095
+0.754283 0.656549 -0.806175 0.591678
+0.971533 0.236903 0.348266 -0.937396
+-0.54206 0.84034 0.738501 0.674253
+0.0701026 -0.99754 0.743285 0.668975
+-0.699651 -0.714484 -0.498557 -0.866857
+0.72329 0.690544 0.677871 0.735181
+-0.997235 -0.0743177 0.403512 0.914974
+-0.792341 0.610079 -0.936806 -0.349849
+-0.987858 0.155361 -0.994098 -0.108487
+-0.741002 0.671503 -0.202465 0.979289
+0.962959 0.269647 -0.563866 0.825866
+0.700118 -0.714028 -0.554033 0.832495
+0.878169 0.478351 0.925708 -0.378239
+0.032962 0.999457 -0.98798 0.154584
+0.824717 -0.565545 -0.913422 0.407015
+-0.691772 0.722116 0.54388 0.839163
+-0.568107 -0.822955 -0.745108 0.666943
+-0.546923 -0.837183 0.248366 -0.968666
+-0.975963 -0.217936 -0.999775 0.0211923
+-0.652818 0.757515 -0.429578 0.90303
+0.909405 0.415913 0.464545 -0.885549
+0.96762 0.252413 0.926965 0.375147
+-0.759572 0.650423 -0.127966 -0.991779
+-0.148273 0.988947 -0.677956 0.735102
+-0.349823 -0.936816 -0.380313 0.924858
+0.54927 -0.835645 -0.0295201 0.999564
+-0.739478 0.673181 0.0227335 0.999742
+-0.464458 0.885595 -0.382445 -0.923978
+-0.968852 0.24764 0.994137 0.10813
+0.34735 0.937736 -0.608313 0.793697
+0.339763 0.940511 -0.994067 0.108771
+-0.893377 -0.449308 -0.865426 0.501037
+0.11531 0.99333 0.532154 0.846648
+-0.974521 -0.224297 -0.807458 -0.589924
+-0.510831 0.859681 -0.978439 -0.206535
+0.629042 -0.777372 0.468613 -0.883404
+-0.549974 -0.835181 -0.113651 -0.993521
+0.573308 -0.81934 -0.205837 -0.978586
+-0.0241569 0.999708 -0.748057 0.663635
+0.673051 0.739596 0.00519691 0.999986
+0.125367 0.99211 0.999994 -0.00344482
+-0.29283 0.956165 -0.126269 -0.991996
+0.999307 0.0372274 -0.835363 -0.549699
+-0.364483 0.93121 0.924399 -0.381426
+-0.965297 -0.261154 0.278098 0.960553
+0.845199 -0.534451 0.986774 0.162102
+-0.420303 -0.907384 0.822841 0.568272
+0.333474 0.942759 -0.847847 -0.53024
+-0.909693 -0.415282 0.402103 -0.915594
+0.212448 0.977172 -0.834699 -0.550706
+-0.931852 -0.362839 0.843039 -0.537852
+-0.654557 -0.756012 -0.624009 -0.781417
+-0.041082 0.999156 -0.567141 -0.82362
+0.943807 -0.330496 -0.64131 -0.767282
+0.844709 -0.535226 0.997472 0.0710564
+0.950396 -0.311041 0.977423 -0.211292
+0.242227 -0.97022 0.785879 -0.618381
+-0.26434 0.96443 -0.048362 0.99883
+-0.165963 0.986132 -0.56904 -0.82231
+0.00558336 0.999984 0.848136 -0.529778
+-0.996198 0.0871141 -0.763349 -0.645986
+-0.983856 0.178962 0.655107 0.755536
+0.444313 -0.895871 -0.468561 0.883431
+-0.201405 -0.979508 0.140703 -0.990052
+0.998929 0.0462738 -0.0832627 -0.996528
+0.543195 0.839607 0.640918 -0.76761
+-0.888134 -0.459585 -0.80868 -0.588248
+-0.510738 -0.859736 -0.980608 0.19598
+0.999341 0.0362917 -0.883097 -0.46919
+0.480905 -0.876772 0.995321 -0.0966251
+0.292105 -0.956386 -0.201073 -0.979576
+0.0892795 0.996007 -0.884708 -0.466145
+0.697515 0.71657 -0.22153 -0.975153
+0.327506 -0.944849 -0.370502 0.928832
+-0.960032 -0.27989 -0.995624 -0.093454
+-0.486175 -0.873862 0.875079 -0.483979
+-0.228168 -0.973622 -0.516167 0.856488
+0.149537 0.988756 -0.766133 -0.642683
+0.661714 -0.749756 -0.998559 -0.0536617
+-0.196765 0.980451 0.576644 0.816996
+-0.934416 0.356182 0.285561 0.958361
+-0.88866 0.458566 -0.870687 0.491838
+0.870027 -0.493004 0.278584 -0.960412
+-0.317494 -0.94826 0.627372 -0.77872
+-0.68717 0.726497 0.935759 0.352641
+0.47105 -0.882106 0.346123 -0.938189
+-0.596693 -0.80247 0.448671 -0.893697
+0.53841 0.842683 0.953459 -0.301522
+0.726212 0.687471 0.920352 0.391091
+0.89037 -0.455238 -0.990208 0.139602
+-0.839664 0.543107 0.648923 -0.760854
+-0.78334 -0.621594 -0.449911 -0.893073
+-0.794526 0.607231 -0.754167 -0.656683
+0.11348 0.99354 0.368102 0.929785
+-0.451088 0.89248 -0.947493 0.319777
+-0.821773 0.569814 -0.591608 0.806225
+-0.772541 0.634965 0.949635 0.313357
+0.810797 -0.585328 0.954327 0.298764
+0.909601 0.415482 0.422132 -0.906535
+-0.795076 0.60651 -0.691596 -0.722284
+-0.123283 -0.992372 0.97873 0.205153
+0.66306 -0.748566 -0.972899 -0.23123
+-0.675072 -0.737752 0.275171 0.961395
+0.625112 -0.780535 -0.016762 -0.99986
+-0.490126 -0.871652 0.575235 -0.817988
+0.441601 0.897211 -0.184121 -0.982904
+-0.985993 -0.166785 -0.49858 -0.866844
+-0.736828 0.67608 0.40368 0.9149
+-0.821088 0.570802 -0.490634 0.871366
+-0.777494 0.62889 0.451345 0.892349
+-0.517881 -0.855453 -0.51469 0.857376
+0.563928 -0.825824 -0.975188 -0.221377
+0.40254 -0.915402 -0.831872 -0.554968
+-0.872312 -0.488949 0.68005 0.733166
+-0.96214 -0.272557 -0.784196 0.620513
+0.388423 0.921481 -0.582727 -0.812668
+-0.842208 0.539153 0.923229 -0.38425
+0.355384 0.934721 0.202705 0.97924
+-0.567385 0.823453 -0.800644 -0.599141
+-0.982273 -0.187454 0.999972 0.00742105
+0.741943 0.670463 -0.337424 -0.941353
+0.0291898 -0.999574 -0.975415 0.220376
+0.652933 0.757415 -0.443271 -0.896387
+-0.996618 -0.0821694 -0.363696 0.931518
+0.996429 -0.0844309 -0.563955 -0.825805
+-0.970508 0.241069 0.706641 0.707573
+0.865816 -0.500363 -0.535848 -0.844315
+-0.716172 0.697924 -0.27678 -0.960933
+-0.64578 0.763523 0.46297 0.886374
+0.995439 -0.0953996 -0.991599 0.129353
+0.146113 -0.989268 -0.502647 0.864492
+0.837312 0.546725 0.27128 0.962501
+0.588623 -0.808407 0.994636 0.10344
+-0.828471 0.560031 -0.969432 -0.245359
+0.950152 -0.311788 0.957818 -0.287375
+-0.993149 -0.116853 0.656762 -0.754098
+-0.868321 -0.496003 -0.0626715 0.998034
+-0.988845 0.14895 -0.726658 -0.686999
+0.810782 -0.585348 0.955046 0.296457
+0.996087 -0.088377 -0.838904 -0.54428
+0.675148 -0.737682 0.28507 -0.958507
+-0.920626 -0.390445 -0.745728 0.66625
+0.488738 -0.872431 0.697599 0.716489
+-0.403502 -0.914979 -0.769082 0.63915
+0.612166 0.79073 -0.995604 -0.0936587
+-0.708021 0.706191 -0.991645 -0.128998
+0.686406 -0.727218 0.967582 0.252559
+-0.941895 -0.335908 -0.955159 0.296092
+-0.911711 -0.410833 -0.0746907 -0.997207
+0.209373 0.977836 -0.62337 -0.781927
+0.862231 0.506516 -0.95733 0.288996
+-0.400989 -0.916083 -0.913521 0.406792
+0.983531 -0.180741 0.780363 0.625327
+0.179336 0.983788 0.683409 0.730035
+0.324359 0.945934 -0.0466909 -0.998909
+0.964759 -0.263136 0.0763085 -0.997084
+-0.411208 -0.911542 -0.0336282 0.999434
+0.754146 0.656707 -0.818374 0.574685
+-0.507284 0.861779 -0.979252 0.202646
+0.961533 0.274689 -0.901442 0.432901
+0.813356 0.581767 0.737162 -0.675716
+0.778409 0.627757 0.317032 -0.948415
+0.654924 0.755694 -0.66121 -0.750201
+0.949065 -0.315081 0.803104 -0.595839
+-0.996454 -0.0841451 -0.540044 0.841637
+0.857894 0.513827 -0.848908 -0.52854
+-0.979381 0.202021 0.0781262 -0.996943
+0.823505 0.567309 -0.806137 -0.591729
+-0.924858 -0.380312 0.253759 0.967267
+-0.675812 0.737074 0.370165 -0.928966
+0.87042 0.49231 0.354206 0.935167
+-0.904965 0.425485 0.999471 0.0325084
+0.909957 -0.414702 0.342881 0.939379
+0.854914 -0.51877 -0.422943 0.906156
+0.754465 0.65634 -0.789453 0.613811
+0.884962 0.465664 -0.253393 -0.967363
+-0.238946 0.971033 0.536302 -0.844026
+0.995172 -0.0981451 -0.918884 0.394529
+-0.67712 -0.735872 0.52846 0.848958
+0.616782 -0.787134 -0.881726 -0.471763
+0.304332 0.952566 0.881297 0.472562
+-0.211103 -0.977464 -0.751256 -0.660011
+-0.968403 -0.249391 0.997384 0.0722857
+0.471488 0.881872 0.392226 0.919869
+0.923759 -0.382975 -0.0315838 -0.999501
+-0.0782035 -0.996937 0.0256384 -0.999671
+0.686925 0.726729 0.947117 -0.320889
+-0.728955 -0.684562 0.999998 0.00204541
+0.595719 -0.803193 0.553515 0.832839
+-0.974745 0.22332 -0.862439 0.50616
+-0.512872 -0.858465 -0.902325 0.431056
+0.951802 -0.306712 0.970793 0.239919
+-0.898941 -0.438069 0.206629 0.978419
+0.312844 -0.949804 0.920005 0.391906
+0.806683 -0.590985 0.9226 -0.385757
+0.858892 0.512157 -0.935062 -0.354483
+0.756422 -0.654084 -0.573861 -0.818952
+-0.670658 0.741766 -0.312499 -0.949918
+0.41675 0.909021 0.544031 0.839065
+-0.948339 0.317258 0.646523 -0.762894
+-0.0934974 -0.99562 -0.998118 -0.0613255
+-0.0847729 0.9964 -0.591967 0.805962
+0.723225 -0.690612 0.670982 -0.741474
+-0.497964 -0.867198 -0.284628 -0.958638
+0.444429 0.895814 -0.47996 -0.87729
+0.998925 -0.0463607 -0.0745844 0.997215
+-0.0368556 -0.999321 -0.855228 0.518251
+-0.976059 0.217505 -0.99786 -0.0653938
+0.989552 -0.144176 -0.324896 -0.94575
+-0.710417 0.703781 -0.891928 -0.452178
+-0.43081 0.902443 0.848988 0.528412
+0.43849 0.898736 0.160595 -0.98702
+0.837892 0.545836 0.371624 0.928383
+0.642258 -0.766488 0.80857 0.5884
+-0.585828 0.810436 0.970919 -0.239408
+0.983052 0.183329 0.916183 -0.40076
+-0.814368 -0.580349 0.608936 -0.793219
+-0.991386 0.130971 0.842751 -0.538304
+-0.5911 -0.806599 0.917001 -0.398885
+-0.951267 0.308369 0.997679 0.0680876
+0.937101 -0.349059 -0.454353 0.890822
+-0.389278 0.92112 -0.655491 0.755203
+-0.810838 0.585271 0.952205 0.305461
+-0.995311 -0.0967315 -0.96548 -0.260479
+0.753101 0.657905 -0.899024 0.4379
+-0.308203 0.951321 0.996338 -0.0855017
+-0.805322 -0.592837 0.810448 0.58581
+0.999987 0.00506319 0.874534 0.484963
+-0.498959 -0.866626 -0.392574 -0.91972
+0.203283 -0.97912 -0.0506235 0.998718
+-0.949933 0.312453 0.935383 -0.353637
+-0.816178 0.5778 0.335433 0.942064
+0.958363 0.285554 -0.774962 -0.632008
+-0.471232 0.882009 0.365412 -0.930846
+0.907494 0.420064 0.807625 -0.589697
+0.170121 0.985423 -0.182505 0.983205
+-0.429835 0.902907 0.900999 0.43382
+0.386333 -0.92236 -0.385092 0.922878
+-0.380382 -0.924829 0.246409 -0.969166
+-0.295166 0.955446 0.117554 -0.993066
+0.374682 0.927153 0.760779 -0.649011
+0.998478 0.0551529 0.721317 -0.692605
+-0.988121 0.153677 -0.961298 -0.275511
+-0.192131 0.981369 0.885254 0.465107
+0.683555 -0.729899 0.990764 -0.135597
+0.454323 -0.890837 -0.999302 -0.0373563
+-0.368788 0.929513 0.997451 0.0713489
+-0.980261 0.197705 0.495754 -0.868463
+-0.333737 0.942666 -0.862271 0.506447
+0.967735 -0.251971 0.943124 -0.332442
+0.871524 -0.490353 0.553735 -0.832693
+0.0163014 0.999867 -0.0593784 -0.998236
+-0.144622 0.989487 -0.367147 0.930163
+-0.419675 0.907674 0.781624 -0.62375
+0.0804937 -0.996755 -0.20269 0.979243
+-0.759904 0.650036 -0.0772441 -0.997012
+-0.734144 -0.678994 0.725431 -0.688295
+-0.655737 0.75499 -0.73792 0.674888
+-0.763185 0.64618 0.415962 -0.909382
+-0.222125 0.975018 -0.917825 -0.396986
+0.605925 0.795522 -0.636667 -0.771139
+0.523074 -0.852287 0.0674918 -0.99772
+-0.382072 -0.924133 0.0661177 -0.997812
+0.353531 0.935423 0.00602603 0.999982
+0.505235 0.862982 -0.904061 -0.427403
+0.0414668 -0.99914 -0.535008 -0.844847
+-0.861644 0.507513 -0.984287 -0.176577
+-0.99636 0.0852407 -0.629142 -0.77729
+-0.905546 -0.424248 0.985718 -0.168404
+0.797117 0.603825 -0.413669 0.910427
+0.212649 -0.977129 -0.845859 0.533406
+0.0540506 -0.998538 0.640618 -0.76786
+0.762601 0.646869 0.332179 0.943216
+-0.0599608 0.998201 0.960082 -0.279719
+0.96955 0.244894 0.924247 -0.381795
+0.993429 -0.114451 0.457008 0.889463
+0.861992 0.506921 -0.969861 0.243659
+-0.585191 0.810896 0.949132 -0.314878
+-0.951193 0.308598 0.999029 0.0440599
+-0.765536 0.643393 0.712883 -0.701283
+-0.361987 0.932183 0.790471 -0.6125
+-0.677666 0.73537 0.589886 -0.807487
+-0.655787 -0.754946 -0.742375 -0.669984
+-0.870032 -0.492996 0.279505 0.960144
+-0.383077 -0.923716 -0.0426002 -0.999092
+-0.805283 0.592891 0.806549 -0.591167
+0.981605 -0.190922 0.935685 -0.352836
+-0.345964 0.938248 -0.718574 -0.69545
+0.0804276 -0.99676 -0.196198 0.980564
+-0.625776 0.780003 0.0683466 -0.997662
+-0.837961 -0.54573 0.383441 0.923565
+0.841678 -0.53998 0.881064 -0.472997
+0.337459 0.94134 -0.990774 -0.135525
+-0.184165 0.982895 0.946897 -0.321538
+0.802669 0.596425 0.478298 0.878198
+-0.641864 0.766819 0.837797 0.545982
+0.974413 0.224764 -0.778248 -0.627957
+-0.994308 -0.106541 -0.315713 -0.948855
+0.574163 -0.818741 -0.102707 -0.994712
+-0.787021 -0.616927 -0.872884 -0.487928
+-0.728248 -0.685314 0.994464 0.105079
+-0.67792 -0.735136 0.617461 0.786601
+-0.658564 0.752525 -0.933846 0.357677
+-0.112053 -0.993702 0.231228 0.9729
+0.774462 -0.632621 0.812841 0.582486
+-0.822799 0.568332 -0.726545 0.687119
+-0.225047 -0.974348 -0.759684 0.650292
+0.988269 -0.152723 -0.93027 -0.366875
+0.020636 -0.999787 -0.473229 0.88094
+0.514745 0.857344 -0.787599 0.616189
+-0.658294 0.752761 -0.920457 0.390844
+0.924515 0.381147 0.165503 0.986209
+-0.97929 -0.202464 0.0329708 0.999456
+0.999994 0.00332638 0.945184 0.326538
+-0.616453 -0.787392 -0.900644 0.434557
+0.188124 0.982145 0.997144 -0.0755183
+-0.807251 0.590209 0.955376 -0.295392
+-0.755444 -0.655213 -0.689392 0.724388
+-0.98658 -0.16328 -0.769041 -0.639199
+0.523371 0.852105 0.102208 0.994763
+0.983807 -0.179231 0.675577 0.73729
+0.737609 0.675228 0.29546 -0.955355
+0.90063 0.434587 0.560572 0.828106
+0.500712 0.865614 -0.569423 -0.822045
+-0.79952 0.600639 -0.027413 -0.999624
+0.463709 0.885988 -0.45912 0.888374
+-0.985158 -0.171651 -0.0282387 -0.999601
+-0.914065 0.405568 -0.606387 0.79517
+-0.366676 -0.930349 0.987888 0.155168
+-0.706179 0.708033 -0.991415 0.130755
+0.969594 0.244721 0.917291 -0.398218
+-0.370551 0.928812 0.966114 0.258114
+0.999233 0.0391475 -0.715012 -0.699112
+-0.822698 0.568479 -0.714175 0.699967
+0.964484 0.264141 -0.0277264 0.999616
+0.798634 -0.601818 -0.173968 -0.984751
+0.35383 -0.93531 0.0379194 -0.999281
+0.0403106 -0.999187 -0.628978 -0.777423
+0.697353 -0.716728 -0.199443 0.979909
+-0.927809 -0.373055 0.862362 0.506293
+0.877396 -0.479766 0.974422 0.224728
+0.0804603 0.996758 -0.199414 -0.979915
+-0.715584 -0.698527 -0.356588 0.934262
+-0.956361 0.292189 -0.192478 0.981301
+0.0771443 0.99702 0.131497 -0.991317
+-0.10889 0.994054 -0.0848316 -0.996395
+-0.466886 -0.884318 -0.117822 0.993035
+-0.650725 -0.759314 -0.167198 -0.985923
+0.733578 -0.679606 0.780259 0.625456
+0.316229 0.948683 0.725357 -0.688373
+0.306444 -0.951889 0.963671 -0.267092
+0.599892 -0.800081 0.0659826 0.997821
+-0.407324 0.913284 -0.443327 -0.89636
+0.689672 -0.724122 0.761387 0.648298
+0.992934 0.118665 0.782681 -0.622423
+-0.222891 -0.974843 -0.88387 0.467732
+0.96137 0.275259 -0.925499 0.37875
+-0.957828 -0.287342 -0.644276 -0.764793
+0.599102 0.800673 0.16404 -0.986454
+-0.0964242 -0.99534 -0.973059 0.230555
+0.879846 -0.475259 0.738746 0.673984
+0.384944 0.92294 -0.24235 -0.970189
+0.960214 0.279264 -0.999596 -0.0284177
+0.897776 -0.440451 -0.0570219 -0.998373
+-0.841365 -0.540468 0.852181 0.523247
+0.852347 0.522977 0.0561219 -0.998424
+0.451923 -0.892057 -0.973229 0.229838
+-0.803205 0.595703 0.555185 -0.831727
+0.556911 -0.830572 -0.811497 0.584357
+-0.324212 -0.945985 -0.0311167 -0.999516
+0.967451 -0.253059 0.899868 -0.436163
+0.090151 -0.995928 -0.922061 0.387044
+0.916831 -0.399275 -0.973236 0.229809
+-0.869061 -0.494705 0.0866092 0.996242
+0.204782 0.978808 -0.202331 -0.979317
+0.468813 0.883297 0.0998356 0.995004
+0.586396 -0.810025 0.985304 -0.17081
+0.769967 -0.638084 0.996335 -0.0855363
+0.365632 -0.93076 0.964305 -0.264793
+-0.120331 -0.992734 0.875627 0.482988
+0.848825 0.528674 0.663817 -0.747895
+-0.773934 -0.633267 0.858549 -0.512731
+-0.866453 -0.499259 -0.424159 0.905588
+-0.828576 0.559876 -0.964671 -0.263457
+-0.992323 0.123676 0.986091 0.166209
+-0.801086 -0.598549 0.231677 0.972793
+0.730474 0.682941 0.975871 -0.218346
+-0.988032 -0.154247 -0.975577 0.219656
+0.595315 0.803493 0.594721 -0.803932
+-0.109184 0.994022 -0.0553059 -0.998469
+-0.0582577 0.998302 0.898652 -0.438663
+0.905653 0.424021 0.981185 -0.193069
+-0.959452 0.281872 -0.955301 0.295636
+-0.33473 0.942314 -0.910755 0.412948
+0.999834 -0.0182204 -0.248704 -0.96858
+0.959592 0.281396 -0.96878 -0.247923
+-0.778115 0.628122 0.361184 0.932495
+0.435594 -0.900143 0.464662 0.885488
+-0.938377 0.345613 -0.744056 0.668117
+0.0883607 0.996089 -0.838009 -0.545656
+-0.992746 -0.120228 0.870601 -0.491991
+-0.820373 0.571828 -0.378143 0.925747
+0.999998 0.00179748 0.983889 0.178782
+-0.958185 0.28615 -0.734236 0.678895
+0.995841 -0.0911105 -0.955019 -0.296544
+0.203022 0.979174 -0.0239867 -0.999712
+-0.701965 -0.712211 -0.748805 -0.66279
+0.510155 -0.860083 -0.991637 -0.129059
+0.781115 0.624387 -0.109411 -0.993997
+-0.919558 0.392954 -0.897579 -0.440854
+-0.91522 -0.402954 -0.80597 -0.591957
+0.332933 0.94295 -0.816034 -0.578004
+0.960522 0.278205 -0.996655 0.0817222
+0.591817 0.806072 0.877928 -0.478792
+-0.803796 -0.594905 0.634925 0.772574
+-0.987555 -0.157276 -0.996375 -0.0850674
+0.00837708 -0.999965 0.669161 0.743118
+-0.180867 -0.983508 0.788293 0.6153
+0.951477 0.30772 0.990727 -0.13587
+0.808451 -0.588563 0.99538 -0.0960119
+0.997376 -0.0724021 0.570761 -0.821117
+-0.362629 0.931934 0.830717 -0.556695
+0.981739 -0.190234 0.958115 -0.286382
+-0.936526 0.350598 -0.302496 0.953151
+-0.756792 -0.653656 -0.526693 0.850055
+0.97811 -0.20809 -0.515671 -0.856787
+-0.99734 0.0728966 0.52936 -0.848398
+0.999447 0.0332615 -0.982905 -0.184112
+0.238749 -0.971081 0.519062 -0.854737
+0.910687 -0.413098 0.172956 0.98493
+0.0551804 0.998476 0.723222 0.690616
+-0.353768 0.935333 0.0313726 -0.999508
+-0.510882 0.859651 -0.977198 -0.212331
+0.0533856 0.998574 0.5881 0.808788
+0.0713304 -0.997453 0.655525 0.755173
+-0.430434 0.902622 0.870277 0.492562
+-0.966939 0.255006 0.794449 -0.60733
+-0.760469 0.649375 0.00966002 -0.999953
+0.556742 0.830686 -0.799429 -0.60076
+-0.914514 -0.404555 -0.690606 -0.723231
+0.444121 -0.895967 -0.449504 0.893279
+-0.174813 -0.984602 0.288691 0.957422
+0.0770031 -0.997031 0.145526 0.989354
+0.675851 -0.737039 0.375 -0.927025
+0.690202 -0.723616 0.711857 0.702325
+-0.655033 0.7556 -0.671951 0.740596
+-0.783358 0.621571 -0.4525 0.891765
+-0.717809 -0.69624 -0.0455631 0.998961
+0.861612 0.507567 -0.985383 0.170356
+-0.936617 0.350355 -0.327139 0.944976
+-0.990095 -0.1404 0.0505599 0.998721
+0.8961 0.443853 -0.422536 0.906346
+0.0131363 -0.999914 0.254303 0.967125
+-0.998723 0.0505127 0.334458 0.94241
+-0.994835 -0.101508 -0.736069 -0.676906
+-0.663541 0.74814 -0.956049 -0.293206
+-0.96635 0.257231 0.634974 -0.772534
+0.999588 0.028718 -0.963931 0.266153
+-0.688058 0.725656 0.885723 0.464214
+0.0190775 0.999818 -0.330723 -0.943728
+0.922174 -0.386775 -0.42886 -0.903371
+-0.762517 -0.646968 0.31998 0.947424
+-0.941912 -0.33586 -0.953639 0.300952
+-0.138631 0.990344 0.227267 0.973832
+0.605338 -0.795969 -0.578085 0.815976
+-0.402192 0.915556 -0.852406 -0.522881
+-0.834235 -0.551409 -0.281888 0.959447
+-0.382348 0.924018 0.036308 0.999341
+-0.288684 -0.957424 -0.531091 0.847315
+-0.00640579 -0.999979 0.801747 -0.597663
+0.723478 -0.690347 0.69768 -0.716409
+-0.986031 -0.166561 -0.518161 -0.855283
+-0.983462 0.181117 0.803674 0.59507
+-0.632587 -0.774489 0.810314 0.585996
+-0.789171 0.614173 -0.987179 0.159618
+-0.547728 0.836656 0.154168 0.988045
+0.99957 0.0293332 -0.978477 0.206354
+0.236451 -0.971643 0.304356 -0.952558
+0.975678 -0.219209 -0.994043 0.108989
+0.846353 0.532623 0.929021 -0.370027
+0.118956 0.9929 0.800578 0.599229
+-0.996791 0.0800519 -0.159109 -0.987261
+0.522011 0.852939 -0.0571719 0.998364
+0.994376 -0.105903 -0.375939 0.926644
+0.991475 -0.1303 0.87719 -0.480144
+-0.432734 -0.901522 0.717882 -0.696165
+-0.58058 0.814203 0.631114 -0.77569
+-0.924594 0.380954 0.186066 -0.982537
+-0.406666 -0.913577 -0.506702 0.862121
+-0.191359 -0.98152 0.919078 -0.394075
+-0.398523 -0.917158 -0.988784 0.149352
+-0.728365 -0.685189 0.99612 0.0880107
+-0.489098 0.872229 0.667443 0.744661
+0.0673369 0.99773 0.897995 -0.440005
+0.779547 -0.626344 0.140678 0.990055
+0.398197 0.9173 -0.993465 0.114141
+-0.94056 -0.339628 -0.995527 -0.0944818
+-0.995697 0.0926685 -0.989561 -0.144112
+-0.999852 0.0172142 -0.150136 -0.988665
+-0.0536432 0.99856 0.60877 -0.793346
+0.0990448 0.995083 -0.879508 0.475883
+-0.711487 0.702699 -0.813036 -0.582213
+0.219215 -0.975677 -0.993977 -0.10959
+-0.277633 -0.960687 -0.990022 -0.140915
+0.99431 0.106521 -0.31764 -0.948211
+0.426236 0.904612 0.998725 -0.0504725
+0.955832 0.293912 -0.0134 -0.99991
+0.990758 0.135641 0.506471 0.862257
+0.979744 -0.200253 0.255891 -0.966706
+0.997013 0.0772367 0.1223 0.992493
+0.766285 0.642501 0.78958 0.613648
+0.315377 0.948966 0.784138 -0.620587
+-0.999996 0.00282394 0.960391 -0.278656
+-0.148005 0.988987 -0.657786 0.753205
+0.414102 0.910231 0.280275 0.95992
+-0.991103 0.1331 0.70865 -0.70556
+0.955639 -0.294539 0.0521431 0.99864
+-0.981532 -0.191298 0.921486 0.388412
+0.865663 -0.500627 -0.561384 -0.827556
+-0.65771 -0.753271 -0.88737 -0.461059
+6.15384e-05 1 0.999981 -0.0061538
+-0.804141 -0.594438 0.678684 0.73443
+-0.0370805 0.999312 -0.843348 -0.537367
+-0.872259 -0.489044 0.672013 0.740539
+0.538941 -0.842344 0.932608 0.360891
+0.597007 0.802236 0.413383 -0.910557
+0.101269 -0.994859 -0.752147 -0.658995
+-0.792989 0.609235 -0.894339 -0.447391
+-0.66878 -0.74346 -0.54029 0.841479
+-0.084128 0.996455 -0.538601 0.842561
+-0.56582 -0.824529 -0.899383 0.437162
+0.673566 -0.739127 0.0747439 -0.997203
+-0.640352 -0.768082 0.928452 -0.371452
+-0.92851 0.371308 0.941874 -0.335966
+-0.897074 -0.44188 -0.214518 0.97672
+-0.554892 -0.831923 -0.647128 -0.762382
+-0.731654 -0.681676 0.923717 -0.383076
+-0.727579 -0.686024 0.979507 0.201411
+-0.43692 -0.8995 0.329618 -0.944114
+-0.853341 -0.521353 -0.133952 -0.990988
+-0.672419 -0.740171 -0.0801052 0.996786
+0.243124 -0.969995 0.839613 -0.543185
+0.225622 -0.974215 -0.72003 -0.693943
+0.674507 0.738269 0.200829 0.979626
+0.923329 0.38401 -0.143156 0.9897
+0.980191 -0.198057 0.464323 -0.885666
+-0.766769 -0.641923 0.833502 0.552516
+0.995475 0.095019 -0.995818 -0.0913547
+-0.999976 0.00689014 0.77187 -0.635781
+-0.985128 -0.171824 -0.0106773 -0.999943
+-0.583159 -0.812358 0.841539 0.540196
+-0.00695168 -0.999976 0.767943 -0.640518
+0.690043 0.723768 0.727142 -0.686487
+0.833423 -0.552635 -0.419427 -0.907789
+-0.482969 0.875638 0.990397 0.138255
+0.981554 -0.191186 0.925885 -0.377805
+0.940903 0.338675 -0.999978 0.00664762
+0.822226 0.56916 -0.653815 -0.756655
+-0.661885 0.749605 -0.997081 -0.0763473
+-0.377465 -0.926024 0.534684 -0.845052
+-0.636315 0.771429 0.989673 -0.143344
+0.992579 0.121602 0.930134 -0.367221
+-0.938697 -0.344743 -0.802724 -0.596351
+0.999986 -0.00524409 0.865619 -0.500703
+-0.966771 0.255644 0.752695 -0.658369
+0.689746 0.724051 0.754666 -0.656109
+-0.559247 -0.829001 -0.941893 -0.335913
+0.881608 0.471982 0.443072 -0.896486
+-0.0051285 -0.999987 0.871348 -0.490665
+-0.501341 0.86525 -0.627604 0.778532
+-0.506244 -0.86239 -0.947757 -0.318993
+-0.736712 0.676206 0.419289 0.907853
+0.7174 0.696661 -0.104058 0.994571
+-0.954373 0.298617 0.461051 0.887373
+-0.996139 -0.087786 -0.805152 0.593069
+0.394872 0.918736 -0.969431 -0.245364
+-0.876324 0.481721 0.999993 0.00368955
+0.707457 0.706757 -0.998776 0.0494659
+0.305788 0.9521 0.942962 0.332901
+0.872985 -0.487748 0.774211 -0.632928
+-0.575497 -0.817804 0.0601273 0.998191
+0.595123 -0.803634 0.613708 0.789533
+-0.493805 -0.869573 0.189147 -0.981949
+0.194782 -0.980847 0.728966 0.684549
+0.0518729 -0.998654 0.459324 -0.888269
+0.999923 -0.0124177 0.32309 -0.946368
+0.0036656 -0.999993 0.933565 0.358407
+0.387027 -0.922068 -0.453409 0.891303
+0.829231 0.558906 -0.927315 0.374283
+0.747174 0.664628 -0.903477 -0.428636
+-0.999946 -0.010347 0.510766 0.85972
+-0.958809 0.284052 -0.864087 0.503342
+0.660809 0.750554 -0.997759 -0.0669135
+0.93508 0.354437 0.10269 -0.994713
+-0.957306 0.289077 -0.495945 0.868354
+-0.830726 -0.556682 -0.795062 0.606528
+0.388338 0.921517 -0.575143 -0.818053
+0.775015 0.631943 0.758818 -0.651303
+-0.469632 -0.882862 0.191474 0.981498
+0.919513 -0.393058 -0.90254 -0.430606
+-0.935335 0.353763 0.0308228 0.999525
+-0.523624 0.85195 0.131619 -0.9913
+-0.411628 0.911352 0.0125021 -0.999922
+-0.917463 -0.397822 -0.997306 -0.0733528
+0.245326 -0.969441 0.940337 -0.340245
+0.490043 -0.871698 0.582957 0.812503
+0.00321314 -0.999995 0.948821 0.315814
+0.252015 0.967723 0.941586 -0.336774
+0.962763 -0.270347 -0.622434 -0.782672
+0.953077 -0.302727 0.789568 0.613664
+0.692011 0.721887 0.515832 -0.85669
+-0.775159 -0.631767 0.743831 -0.668368
+0.323917 -0.946086 5.60934e-05 1
+0.286016 -0.958225 -0.743658 -0.668561
+-0.770653 0.637255 0.999759 0.0219709
+-0.928009 -0.372557 0.888295 0.459274
+0.274094 -0.961703 -0.872973 0.487769
+0.634425 0.772984 0.925466 0.378832
+-0.702688 0.711499 -0.812113 0.5835
+0.764789 -0.64428 0.626957 -0.779054
+-0.0397206 0.999211 -0.673756 -0.738954
+0.710012 -0.70419 -0.916447 -0.400157
+-0.550277 0.834982 -0.149614 0.988744
+-0.776209 0.630475 0.6228 0.782381
+0.913509 -0.406819 -0.492151 0.87051
+0.28541 -0.958405 -0.78438 -0.620281
+0.995791 -0.091651 -0.969701 -0.244296
+0.729641 0.683831 0.99518 -0.0980624
+0.826855 -0.562416 -0.999192 0.0401886
+-0.54857 -0.836104 0.0541027 -0.998535
+0.9397 0.342 -0.940416 -0.340025
+-0.574424 0.818558 -0.0709677 -0.997479
+0.999563 -0.0295503 -0.982727 -0.185059
+-0.69849 0.71562 -0.351756 0.936092
+0.852653 -0.522478 -0.00239132 0.999997
+0.216571 -0.976267 -0.98706 0.160351
+0.281515 0.959557 -0.965636 0.259898
+-0.519736 -0.854327 -0.318082 0.948063
+0.999335 -0.0364532 -0.8754 0.4834
+0.530446 0.847719 0.80446 0.594007
+-0.753976 -0.656902 -0.832939 0.553365
+0.717866 0.696182 -0.0374347 0.999299
+0.124381 -0.992235 0.995397 -0.0958348
+-0.865711 0.500544 -0.553412 -0.832908
+0.872419 -0.488758 0.695931 -0.718109
+0.536452 0.843931 0.997263 -0.0739422
+0.989869 -0.141983 -0.10906 -0.994035
+-0.230915 -0.972974 -0.257257 0.966343
+-0.312007 0.95008 0.950944 0.309364
+-0.594548 0.80406 0.668589 0.743632
+-0.803469 -0.595346 0.591544 0.806272
+-0.936937 -0.349498 -0.412099 -0.911139
+0.144075 0.989567 -0.315156 -0.94904
+0.939234 -0.343276 -0.885701 0.464256
+0.947609 -0.319432 0.456203 -0.889876
+0.534188 0.845366 0.981253 0.192725
+-0.060931 -0.998142 0.982695 0.18523
+0.914345 -0.404937 -0.659773 0.751465
+-0.188321 0.982107 0.995423 0.0955717
+-0.611752 -0.79105 -0.989346 -0.145587
+-0.840152 -0.542351 0.714669 0.699463
+-0.512847 0.85848 -0.903615 -0.428346
+0.998925 -0.0463565 -0.075008 0.997183
+-0.855812 -0.517288 -0.572883 -0.819637
+-0.256128 -0.966643 0.718823 -0.695193
+0.827516 -0.561442 -0.997001 -0.0773921
+-0.690355 0.723471 0.6969 0.717168
+0.855445 -0.517894 -0.513442 0.858124
+-0.909745 -0.415167 0.3905 -0.920603
+-0.663523 0.748156 -0.956745 -0.290927
+0.892795 0.450462 -0.922775 0.385338
+0.413202 0.910639 0.184167 0.982895
+-0.997173 0.0751425 0.326539 -0.945184
+0.558011 -0.829834 -0.881599 0.471999
+-0.813529 -0.581525 0.716741 -0.69734
+-0.833226 0.552932 -0.451497 -0.892273
+0.999668 0.0257574 -0.844285 0.535894
+-0.887854 -0.460126 -0.771348 -0.636413
+0.730393 0.683027 0.978392 -0.206757
+-0.336375 0.941728 -0.968654 0.248414
+0.897841 -0.440321 -0.0424571 -0.999098
+-0.18021 -0.983628 0.745465 0.666545
+0.644294 -0.764778 0.62552 0.780208
+0.565083 0.825034 -0.934803 0.355166
+-0.506916 -0.861996 -0.969707 -0.244272
+0.366245 -0.930518 0.979652 -0.200703
+-0.395595 0.918425 -0.985728 0.168348
+-0.829507 0.558496 -0.90768 -0.419664
+-0.0419272 -0.999121 -0.495527 0.868593
+-0.827493 -0.561476 -0.997305 0.0733696
+0.949251 0.31452 0.836911 0.547338
+-0.506649 0.862152 -0.961686 0.274153
+0.906393 -0.422436 0.932607 0.360894
+0.96281 0.270178 -0.608571 0.793499
+0.879577 -0.475757 0.77564 0.631176
+-0.640497 -0.767961 0.92127 -0.388923
+0.94843 -0.316986 0.668157 -0.744021
+-0.263024 0.964789 0.0878847 0.996131
+-0.945632 -0.325239 -0.139275 0.990254
+-0.994432 -0.105381 -0.424032 -0.905647
+-0.54729 -0.836943 0.205718 -0.978611
+-0.697748 -0.716343 -0.253063 -0.96745
+-0.314937 -0.949113 0.812063 -0.58357
+0.608633 0.793452 -0.857793 -0.513996
+-0.983797 0.179287 0.679736 0.733457
+-0.295722 0.955274 0.175092 -0.984552
+-0.945854 -0.324593 -0.0713342 0.997452
+-0.988088 0.153887 -0.966946 -0.254981
+0.702104 -0.712074 -0.761639 0.648002
+-0.469139 -0.883124 0.136437 0.990649
+0.187448 -0.982275 0.999977 0.00678565
+0.316837 -0.94848 0.679754 0.73344
+-0.784122 0.620606 -0.558602 0.829436
+-0.63045 -0.77623 0.620212 0.784434
+0.961568 -0.274568 -0.895929 -0.444197
+0.932444 0.361315 0.744288 -0.667858
+-0.953195 0.302355 0.76503 0.643994
+-0.128221 0.991746 0.957922 0.287029
+-0.975262 0.221053 -0.955851 0.29385
+0.342054 0.93968 -0.938462 0.345383
+0.662943 -0.74867 -0.976399 -0.215973
+-0.995294 -0.0969047 -0.960799 -0.277247
+-0.983449 -0.181186 0.807818 -0.589433
+0.284622 -0.95864 -0.832653 -0.553794
+-0.932098 -0.362207 0.80471 -0.593668
+-0.951219 0.308516 0.998611 0.0526871
+-0.918497 0.395427 -0.982482 -0.186356
+-0.998844 -0.0480665 0.0959708 -0.995384
+-0.0474589 -0.998873 0.0352794 0.999377
+0.997169 -0.075197 0.321375 -0.946952
+0.988217 0.153058 -0.942161 0.33516
+-0.810026 0.586394 0.98526 0.171065
+-0.749639 -0.661847 -0.997457 -0.0712749
+-0.165957 -0.986133 -0.569505 0.821988
+-0.958284 -0.285819 -0.757222 -0.653158
+0.856153 0.516722 -0.62573 -0.78004
+0.991104 0.133087 0.709574 0.704631
+0.813622 0.581395 0.70551 -0.7087
+-0.925472 -0.378816 0.406152 0.913806
+0.790626 -0.612299 -0.997041 -0.0768695
+0.131742 -0.991284 0.798331 0.602219
+-0.545579 0.838059 0.399942 0.916541
+-0.330253 -0.943892 -0.621364 -0.783522
+0.511895 0.859048 -0.945451 0.325763
+0.994487 -0.104859 -0.470917 0.882177
+-0.576724 -0.816939 0.208661 0.977988
+0.166926 0.985969 -0.486125 0.873889
+-0.916236 0.400639 -0.928383 0.371624
+0.884144 -0.467215 -0.0808306 0.996728
+-0.380748 -0.924679 0.20787 -0.978156
+-0.689875 -0.723929 0.742899 -0.669403
+0.236348 -0.971669 0.294189 -0.955747
+0.28935 0.957223 -0.470913 0.88218
+0.547291 0.836942 0.205559 -0.978645
+-0.86421 -0.503131 -0.774245 0.632886
+0.0770106 -0.99703 0.144774 0.989465
+-0.778804 -0.627268 0.256835 -0.966455
+0.992726 0.120393 0.878624 -0.477514
+-0.124845 0.992176 0.998792 -0.0491461
+-0.5896 0.807696 0.974915 0.222579
+0.998969 0.0454019 -0.169816 -0.985476
+-0.275235 0.961377 -0.924551 0.381058
+0.00396369 -0.999992 0.922469 0.386072
+-0.718817 -0.695199 0.0991439 0.995073
+0.993723 0.111871 0.213312 -0.976984
+-0.289615 0.957143 -0.446347 -0.89486
+-0.256192 -0.966626 0.714159 -0.699983
+0.969995 0.243127 0.839774 -0.542936
+-0.792115 0.610372 -0.94909 -0.315006
+-0.129074 0.991635 0.929706 0.368303
+0.91577 -0.401704 -0.879024 0.476777
+0.500697 0.865623 -0.567985 -0.823039
+-0.760628 -0.649187 0.034263 0.999413
+-0.681601 -0.731724 0.919759 0.392483
+-0.487308 0.87323 0.805118 0.593115
+-0.824509 -0.56585 -0.897795 -0.440415
+-0.204678 0.978829 -0.191926 0.981409
+-0.942323 -0.334706 -0.909704 0.415256
+0.982146 0.188121 0.997166 0.0752307
+0.276358 0.961055 -0.962685 -0.270625
+0.0492922 0.998784 0.217085 0.976153
+-0.541372 -0.840783 0.791154 -0.611617
+0.999143 -0.0413856 -0.541861 0.840468
+-0.941797 0.336182 -0.96337 -0.268174
+0.407399 -0.91325 -0.435928 -0.899982
+-0.884292 -0.466934 -0.112387 -0.993664
+0.262655 0.96489 0.125878 -0.992046
+-0.890136 0.455694 -0.981754 0.190158
+-0.821645 -0.57 -0.573235 -0.819391
+-0.990132 0.140138 0.0769706 -0.997033
+0.156762 -0.987636 -0.999451 -0.0331304
+-0.794918 -0.606717 -0.710146 0.704055
+0.137793 -0.990461 0.308764 0.951139
+-0.987007 -0.160675 -0.909171 -0.416422
+0.149612 0.988745 -0.770992 -0.636844
+0.247732 -0.968829 0.99511 -0.0987692
+0.439641 -0.898173 0.0331667 0.99945
+0.917417 -0.397928 -0.996392 0.0848734
+0.475846 -0.879528 0.782042 -0.623225
+0.199973 0.979801 0.283354 -0.959015
+0.276184 0.961105 -0.95761 -0.288067
+0.0824556 -0.996595 -0.390295 0.92069
+-0.748013 0.663685 -0.950248 0.311495
+0.413864 -0.910339 0.255087 -0.966918
+-0.785434 0.618946 -0.720332 0.69363
+-0.215037 -0.976606 -0.949814 -0.312816
+-0.856349 0.516397 -0.654861 0.75575
+-0.445081 -0.89549 -0.542484 -0.840066
+-0.124241 0.992252 0.993949 -0.109846
+-0.938205 0.34608 -0.70986 0.704342
+0.737613 -0.675224 0.294898 0.955529
+-0.99717 -0.0751799 0.322998 0.9464
+0.798896 0.601469 -0.13082 0.991406
+0.709037 -0.705172 -0.962885 -0.269911
+0.964406 -0.264427 -0.0573664 -0.998353
+0.874761 -0.484554 0.949276 -0.314445
+-0.956264 0.292504 -0.159984 0.98712
+0.508449 0.861092 -0.997633 -0.0687603
+-0.557848 0.829943 -0.87216 0.48922
+0.952437 0.304736 0.900545 -0.434762
+-0.624104 -0.781342 -0.145345 0.989381
+0.732233 0.681054 0.887889 -0.460057
+-0.572221 -0.8201 -0.333422 0.942778
+-0.859885 0.510487 -0.985916 0.167243
+-0.613291 -0.789857 -0.998822 0.0485338
+0.725258 -0.688477 0.857469 -0.514536
+0.281554 0.959545 -0.964576 0.263803
+-0.979057 0.203588 -0.0816347 -0.996662
+0.3914 -0.920221 -0.810704 0.585456
+0.977924 0.208962 -0.589931 0.807454
+-0.39526 -0.918569 -0.978946 -0.20412
+0.992527 0.122026 0.944989 -0.327102
+0.288886 -0.957364 -0.513168 -0.858288
+0.9053 0.424773 0.993824 -0.110972
+0.521856 -0.853033 -0.075226 -0.997167
+0.365656 0.93075 0.964985 0.262303
+0.220162 -0.975463 -0.978661 -0.205482
+-0.00638696 0.99998 0.802871 0.596153
+0.670731 -0.7417 -0.303137 -0.952947
+0.940552 0.339649 -0.99531 -0.0967359
+-0.340081 -0.940396 -0.989822 0.142311
+-0.00607329 -0.999982 0.821173 -0.570679
+-0.912356 -0.409399 -0.229932 -0.973207
+0.293929 -0.955827 -0.0115991 -0.999933
+-0.709465 -0.704741 -0.944728 0.327855
+-0.988137 -0.153575 -0.958414 0.285383
+-0.206032 -0.978545 -0.325435 -0.945564
+0.884575 0.466397 -0.172491 -0.985011
+-0.370175 -0.928962 0.975768 -0.218807
+0.927071 0.374885 0.746421 0.665474
+0.700374 0.713776 -0.583581 -0.812055
+-0.494809 0.869002 0.0746603 0.997209
+0.423515 0.905889 0.968895 0.247471
+0.184599 -0.982814 0.960166 -0.27943
+-0.0181346 -0.999836 -0.240385 -0.970678
+0.455785 -0.89009 -0.979764 -0.200156
+-0.542763 -0.839886 0.679535 -0.733643
+0.954282 -0.298908 0.487938 0.872878
+-0.265028 0.964241 -0.119505 0.992834
+-0.985318 0.17073 -0.121386 0.992605
+0.995675 -0.0929012 -0.992659 -0.12095
+0.990477 -0.137679 0.319646 -0.947537
+-0.998788 0.0492195 0.209975 0.977707
+0.198696 -0.980061 0.405591 0.914055
+0.955161 0.296087 0.212521 -0.977156
+-0.479238 0.877685 0.959141 -0.282929
+0.984846 -0.173428 0.151629 0.988437
+0.499112 -0.866537 -0.408774 0.912636
+-0.874606 -0.484834 0.938735 0.344639
+0.531936 -0.846785 0.895964 -0.444127
+0.76376 -0.6455 0.495142 -0.868812
+-0.158499 0.987359 -0.978227 -0.207539
+-0.85 -0.526783 0.482288 -0.876013
+-0.961088 0.276244 -0.959383 -0.282107
+0.897157 0.441712 -0.196179 0.980568
+0.231799 0.972764 -0.168425 0.985714
+0.99211 -0.125367 0.999994 -0.00341592
+0.247392 -0.968916 0.991034 -0.133612
+-0.24865 0.968593 0.999991 -0.00412589
+-0.483715 -0.875225 0.975015 -0.222139
+0.592581 -0.805511 0.828644 0.559777
+-0.865507 0.500897 -0.586927 -0.80964
+0.999919 0.0127202 0.294314 0.955709
+0.98067 0.195667 0.66434 0.74743
+0.332518 0.943097 -0.789785 -0.613384
+-0.00541497 -0.999985 0.856937 -0.515422
+0.621136 -0.783703 -0.501294 -0.865277
+0.611616 -0.791155 -0.986691 0.162605
+-0.304071 -0.952649 0.868032 0.496507
+0.591059 0.806628 0.918983 -0.394297
+-0.467562 0.88396 -0.0416321 -0.999133
+-0.391259 -0.920281 -0.801607 -0.597851
+0.696487 0.71757 -0.0798627 -0.996806
+0.423487 -0.905902 0.968118 -0.250496
+-0.979673 0.200601 0.221344 -0.975196
+0.452794 0.891615 -0.991008 -0.133804
+0.592146 0.805831 0.857688 -0.51417
+-0.930038 0.367465 0.997482 0.0709163
+0.998613 0.0526527 0.527212 -0.849734
+-0.1272 -0.991877 0.982345 -0.187076
+-0.183557 0.983009 0.925204 -0.37947
+0.796688 -0.604391 -0.477214 -0.878787
+0.9995 0.0316194 -0.999782 -0.0208722
+0.673856 -0.738863 0.113793 -0.993504
+-0.598728 0.800953 0.209919 0.977719
+0.882742 0.469858 0.216603 -0.97626
+0.874938 0.484234 0.960146 0.279499
+-0.493591 0.869694 0.213258 0.976996
+0.673636 -0.739063 0.084221 -0.996447
+-0.686579 0.727055 0.961291 0.275535
+0.999936 0.0113186 0.424959 0.905213
+-0.196139 -0.980576 0.627577 -0.778555
+0.230059 -0.973177 -0.341123 -0.940019
+0.999711 0.0240371 -0.740049 0.672553
+-0.000481737 -1 0.99884 -0.048155
+0.994299 -0.10663 -0.307178 0.951652
+0.0186233 -0.999827 -0.287526 0.957773
+-0.784002 -0.620758 -0.54238 -0.840133
+0.523768 -0.851861 0.148346 -0.988935
+-0.958147 0.286277 -0.725123 0.688619
+0.0373295 -0.999303 -0.829701 -0.558209
+0.508118 0.861287 -0.994254 -0.107046
+0.638339 0.769756 0.992956 -0.118486
+0.743069 -0.669215 -0.490164 0.87163
+0.995424 -0.0955611 -0.989369 0.145424
+-0.779777 -0.626057 0.104238 -0.994552
+0.933139 0.359515 0.602384 -0.798207
+0.666442 0.745557 -0.773798 0.633432
+0.955276 0.295716 0.174505 -0.984656
+0.912916 0.408149 -0.360679 -0.93269
+0.654729 -0.755863 -0.641637 0.767008
+-0.466039 0.884764 -0.212195 -0.977227
+0.97399 -0.226591 -0.647515 0.762053
+0.678302 -0.734783 0.657507 -0.753449
+0.339677 0.940542 -0.995026 0.0996149
+-0.401666 0.915786 -0.880999 -0.473118
+0.94401 -0.329918 -0.593144 -0.805096
+-0.158247 0.9874 -0.983213 -0.182464
+-0.598195 -0.80135 0.274354 -0.961629
+0.392088 -0.919928 -0.852191 0.523231
+-0.609245 -0.792982 -0.894878 -0.44631
+-0.589087 -0.80807 0.987068 -0.160303
+-0.978963 -0.204039 -0.127451 0.991845
+-0.911874 0.41047 -0.114276 0.993449
+-0.569493 -0.821996 -0.622666 0.782488
+-0.203567 0.979061 -0.0795407 0.996832
+-0.862907 0.505364 -0.910315 -0.413916
+-0.832459 0.554086 -0.570413 -0.821358
+0.767357 -0.64122 0.880613 -0.473837
+-0.0214628 0.99977 -0.544378 0.83884
+0.638996 -0.76921 0.979222 0.202789
+-0.612128 -0.790759 -0.995145 -0.0984228
+-0.871995 0.489515 0.631045 -0.775746
+1 0.000854397 0.996352 0.0853358
+-0.984041 -0.177943 0.573572 -0.819155
+-0.821225 0.570604 -0.511524 0.859269
+-0.779242 -0.626723 0.188728 -0.982029
+-0.854274 -0.519823 -0.308345 -0.951275
+-0.972717 -0.231996 -0.148472 -0.988917
+-0.559059 -0.829128 -0.934027 -0.357202
+-0.567715 -0.823225 -0.776031 0.630694
+-0.812224 0.583346 0.853772 0.520646
+0.994126 -0.108229 -0.150871 0.988553
+-0.739484 -0.673174 0.0218695 -0.999761
+-0.1223 0.992493 0.953641 -0.300946
+0.439475 0.898255 0.0516457 -0.998665
+0.913509 -0.406818 -0.492272 0.870441
+0.211989 0.977272 -0.807937 -0.589269
+-0.956482 0.291792 -0.232999 0.972477
+-0.872461 -0.488684 0.701985 0.712192
+0.982138 0.188162 0.99684 0.0794316
+0.814117 0.5807 0.642532 -0.766259
+0.119064 0.992887 0.807073 0.590451
+-0.923084 -0.384598 -0.205832 0.978587
+-0.980733 -0.195354 0.687813 0.725888
+0.748342 -0.663313 -0.964558 0.263871
+0.564454 -0.825464 -0.959115 -0.283018
+0.945006 -0.327054 -0.32567 -0.945483
+-0.255432 0.966827 0.766929 0.641732
+-0.096166 -0.995365 -0.978713 0.205235
+0.306696 0.951807 0.970397 0.241515
+0.580473 0.81428 0.620858 0.783923
+-0.728228 0.685335 0.994161 -0.107911
+-0.733362 -0.679839 0.799718 -0.600375
+0.579777 0.814775 0.551696 0.834045
+0.838557 -0.544814 0.481827 -0.876267
+0.990174 0.139842 0.106808 0.99428
+0.0588525 -0.998267 0.923178 -0.384374
+-0.999564 0.0295188 -0.982139 -0.188157
+-0.930716 -0.365743 0.967402 -0.253247
+-0.860593 0.509293 -0.999572 0.0292552
+0.591768 0.806108 0.88084 -0.473414
+0.969304 -0.245865 0.957793 0.287459
+-0.800418 0.599443 0.121886 -0.992544
+0.105049 -0.994467 -0.454037 -0.890983
+0.125473 0.992097 0.9999 -0.0141114
+-0.890216 -0.455539 -0.984925 -0.172984
+-0.308604 -0.951191 0.999058 0.0433932
+-0.94295 0.332935 -0.816172 -0.577809
+0.984398 0.175957 0.397709 -0.917511
+-0.195587 0.980686 0.670419 0.741983
+-0.988753 0.149561 -0.767697 -0.640813
+0.699237 0.71489 -0.44751 -0.894279
+-0.996998 -0.0774307 0.102973 0.994684
+0.970223 0.242215 0.785108 -0.619359
+-0.546108 -0.837715 0.341342 -0.939939
+-0.797456 0.603376 -0.361791 -0.932259
+0.747586 -0.664165 -0.928298 0.371836
+-0.790053 -0.613038 -0.999862 -0.0166228
+-0.379664 -0.925124 0.320793 -0.947149
+-0.732979 -0.680251 0.832223 -0.55444
+0.341188 -0.939995 -0.966248 -0.257612
+0.532925 -0.846162 0.941659 -0.336568
+0.999976 -0.00695807 0.767533 -0.641009
+-0.889259 0.457403 -0.927391 0.374095
+0.99841 -0.0563707 0.800223 0.599703
+0.834746 -0.550636 -0.191877 -0.981419
+-0.944485 0.328553 -0.471007 -0.882129
+0.002486 -0.999997 0.969258 0.246048
+-0.818128 0.575036 0.00378892 0.999993
+0.999214 0.0396488 -0.67905 -0.734092
+0.507152 0.861856 -0.976041 -0.217586
+-0.947683 -0.319212 0.476748 0.87904
+0.97829 -0.20724 -0.439368 -0.898307
+-0.922567 -0.385837 -0.334929 0.942243
+-0.416999 0.908907 0.566749 -0.823891
+0.328351 0.944556 -0.452001 -0.892017
+0.64552 0.763743 0.492873 -0.870101
+0.993231 0.116153 0.601966 -0.798522
+-0.624094 -0.781349 -0.146505 0.98921
+0.501063 0.865411 -0.602307 -0.798264
+-0.308172 0.951331 0.996059 -0.0886959
+0.733934 0.679221 0.74637 -0.665531
+-0.268311 0.963332 -0.444332 0.895862
+0.380909 -0.924612 0.190791 0.981631
+0.547562 0.836765 0.173779 -0.984785
+0.953525 -0.301315 0.690387 0.723441
+0.254131 0.96717 0.846107 -0.533012
+0.9651 0.261882 0.204861 0.978791
+-0.938053 -0.346492 -0.678266 -0.734817
+0.798268 -0.602303 -0.233417 -0.972377
+-0.529252 -0.848465 0.713171 0.70099
+-0.645754 0.763546 0.466076 0.884745
+-0.0842285 -0.996446 -0.547071 -0.837086
+-0.535143 -0.844762 0.996724 0.0808835
+0.224994 -0.97436 -0.763212 -0.646148
+-0.140265 -0.990114 0.0642246 -0.997935
+-0.911864 -0.410492 -0.111868 -0.993723
+0.107626 0.994191 -0.210507 0.977592
+-0.99046 0.137803 0.30779 -0.951454
+0.982069 -0.18852 0.993292 -0.115632
+0.0681228 0.997677 0.860587 -0.509303
+-0.62108 -0.783747 -0.507439 0.861688
+-0.990869 -0.134831 0.575195 0.818016
+0.273402 0.9619 -0.835625 -0.5493
+0.27059 0.962695 -0.641964 -0.766735
+0.53574 -0.844383 0.999947 -0.0102887
+-0.818796 0.574084 -0.112282 0.993676
+-0.56058 0.8281 -0.983544 0.18067
+0.630191 -0.77644 0.593718 -0.804673
+0.959566 0.281483 -0.966505 -0.256649
+-0.997533 -0.0702015 0.736618 0.676309
+0.544444 0.838797 0.520007 -0.854162
+0.51307 0.858347 -0.892178 0.451684
+0.335277 -0.94212 -0.933183 0.359402
+0.982946 -0.183894 0.937684 0.347488
+-0.437297 0.899317 0.28977 0.957096
+0.0358197 -0.999358 -0.904263 -0.426976
+0.427654 0.903943 0.978597 -0.205785
+-0.657551 0.75341 -0.877435 0.479696
+-0.379871 0.92504 0.299582 0.95407
+0.885829 0.464011 -0.428522 -0.903531
+0.987252 0.159165 -0.962023 -0.272968
+-0.461007 -0.887396 -0.704481 0.709723
+0.38775 -0.921764 -0.521902 0.853006
+-0.393865 -0.919168 -0.936793 -0.349885
+-0.968367 0.249528 0.996254 -0.0864708
+-0.96704 -0.254626 0.817726 0.575608
+-0.0181604 0.999835 -0.242892 0.970053
+-0.3523 -0.935887 -0.125185 0.992133
+0.992902 0.118936 0.799352 -0.600863
+0.170654 0.985331 -0.129093 0.991633
+0.909713 -0.415237 0.397563 0.917575
+-0.523456 -0.852052 0.112134 0.993693
+-0.0362419 -0.999343 -0.885425 0.464783
+0.648134 0.761526 0.17181 -0.98513
+0.678624 -0.734486 0.689914 -0.723892
+-0.863245 -0.504786 -0.880596 0.473868
+-0.96787 -0.251451 0.959609 0.281336
+0.227805 0.973707 -0.547775 0.836626
+-0.935945 0.352146 -0.141517 0.989936
+-0.857956 -0.513723 -0.855263 -0.518195
+-0.158887 -0.987297 -0.969318 0.245809
+-0.804949 -0.593344 0.771975 0.635652
+0.000760872 -1 0.997107 0.0760138
+-0.983423 -0.181327 0.816207 -0.57776
+-0.900334 -0.4352 0.502988 0.864294
+0.898984 0.437981 0.216179 0.976354
+-0.216437 0.976297 -0.984755 0.173947
+0.00836469 -0.999965 0.670081 0.742288
+-0.921107 0.389309 -0.658036 -0.752986
+-0.820895 -0.571079 -0.460973 -0.887414
+0.471405 -0.881917 0.383536 -0.923526
+-0.971329 0.237738 0.427505 0.904013
+-0.128335 0.991731 0.954565 0.298003
+-0.630132 -0.776488 0.587605 0.809148
+0.601094 0.799178 -0.084183 -0.99645
+-0.12319 -0.992383 0.976758 0.214345
+0.411649 0.911343 0.0147473 0.999891
+-0.809963 0.586481 0.987057 0.160367
+-0.885359 0.464909 -0.334934 0.942241
+0.300336 0.953834 0.612586 0.790404
+-0.716102 -0.697996 -0.286448 0.958096
+-0.612375 0.790567 -0.997735 0.0672737
+0.655504 -0.755192 -0.716728 0.697353
+-0.671585 0.740928 -0.191679 -0.981458
+-0.998939 0.0460542 -0.105147 0.994457
+-0.109837 -0.99395 0.0103279 0.999947
+0.953752 -0.300595 0.633873 0.773437
+0.978423 0.20661 -0.380676 0.924708
+0.942794 -0.333375 -0.842238 -0.539105
+-0.786806 0.617201 -0.855357 0.518039
+-0.733304 -0.679901 0.804757 -0.593604
+-0.478938 -0.877849 0.948914 0.315535
+0.999551 -0.0299685 -0.989607 -0.143797
+-0.680458 0.732787 0.847551 -0.530714
+0.311821 0.950141 0.956813 -0.290703
+-0.912972 -0.408023 -0.373478 -0.927639
+-0.932668 0.360736 0.701388 0.71278
+-0.995109 0.0987844 -0.89166 0.452706
+-0.415645 0.909527 0.438315 -0.898822
+0.71865 -0.695372 0.0751753 -0.99717
+0.873294 0.487194 0.812768 0.582587
+0.60619 0.79532 -0.661976 -0.749525
+-0.532729 0.846286 0.933593 -0.358336
+-0.595239 0.803548 0.602227 0.798325
+0.235577 -0.971856 0.217496 -0.976061
+-0.996554 0.0829521 -0.435656 -0.900113
+0.870755 0.491717 0.417113 0.908854
+0.982668 -0.185372 0.979162 0.203078
+0.758521 -0.651648 -0.285669 -0.958328
+-0.999534 -0.0305239 -0.996066 0.0886151
+0.471945 0.881628 0.439307 0.898337
+-0.998026 -0.0627986 1 0.000812221
+0.636221 -0.771507 0.987848 -0.155423
+0.97516 0.221502 -0.941322 -0.337511
+0.716788 -0.697291 -0.190881 -0.981613
+-0.600015 0.799989 0.0506922 0.998714
+0.113053 -0.993589 0.327772 -0.944757
+0.474036 -0.880506 0.638222 -0.769853
+-0.752354 0.658759 -0.942817 -0.333311
+-0.224652 -0.974439 -0.785385 0.619008
+0.170475 0.985362 -0.147093 0.989123
+0.999595 0.0284549 -0.956594 0.291425
+-0.747815 0.663907 -0.940581 0.339569
+0.199928 0.979811 0.287797 -0.957691
+-0.701034 0.713128 -0.656099 0.754675
+-0.863989 -0.50351 -0.801247 0.598333
+0.217257 -0.976114 -0.995878 0.0907051
+0.396582 -0.918 -0.998097 0.0616659
+0.909502 0.415699 0.443571 -0.896239
+0.797501 0.603318 -0.35498 0.934874
+-0.353348 -0.935492 -0.0135408 0.999908
+0.591737 0.806131 0.882658 -0.470016
+0.00360559 0.999993 0.935699 -0.352798
+0.979932 0.19933 0.345662 0.938359
+-0.999991 -0.00435198 0.906786 0.421591
+0.972699 0.232071 -0.140841 -0.990032
+-0.99309 -0.117356 0.694039 -0.719937
+-0.868607 -0.495502 -0.00493195 0.999988
+0.99886 0.0477376 0.0631474 -0.998004
+-0.829754 0.558129 -0.888202 -0.459454
+0.853078 0.521784 -0.0837014 -0.996491
+0.42932 0.903153 0.924285 -0.381702
+0.863166 -0.50492 -0.887828 -0.460175
+0.945306 -0.326186 -0.237562 -0.971372
+0.218605 0.975813 -0.998878 0.0473478
+0.266632 -0.963798 -0.282244 0.959343
+-0.306252 0.95195 0.958081 -0.286498
+0.994271 -0.106885 -0.282672 0.959217
+-0.722237 -0.691646 0.558418 0.829559
+-0.396696 -0.91795 -0.998788 -0.0492242
+-0.327519 -0.944845 -0.371757 -0.92833
+0.558399 -0.829573 -0.902676 0.430322
+-0.370415 -0.928866 0.969779 -0.243984
+0.872212 0.489128 0.6649 0.746933
+0.924464 0.38127 0.152328 0.98833
+0.922074 0.387014 -0.452142 0.891946
+-0.507302 -0.861769 -0.979664 -0.200646
+0.573009 -0.819549 -0.241347 -0.970439
+0.720956 -0.692981 0.396279 -0.91813
+-0.103156 -0.994665 -0.614378 0.789012
+0.951424 -0.307884 0.992911 0.118857
+-0.903027 -0.429585 0.91268 0.408674
+0.74079 -0.671737 -0.171437 0.985195
+0.311312 0.950308 0.970999 -0.239083
+-0.799276 -0.600964 -0.0680044 0.997685
+-0.743706 0.668507 -0.570806 0.821085
+0.082274 0.99661 -0.373456 -0.927648
+0.723226 0.690611 0.671073 0.741392
+0.977234 -0.212162 -0.81826 -0.574848
+0.0346044 0.999401 -0.949379 0.314132
+-0.98555 -0.169384 -0.255412 -0.966832
+0.94436 0.328914 -0.504341 0.863504
+-0.887755 0.460316 -0.757592 0.652728
+-0.936219 0.351417 -0.21815 0.975915
+0.999996 0.00288763 0.958597 0.284767
+-0.64325 -0.765656 0.725837 -0.687866
+0.0890691 0.996025 -0.874666 -0.484726
+-0.309 0.951062 0.999998 -0.00180615
+-0.721403 -0.692516 0.454639 0.890676
+0.624568 -0.78097 -0.0863203 -0.996267
+0.995606 -0.093636 -0.998875 -0.0474202
+-0.418047 0.908425 0.657826 -0.75317
+-0.299114 -0.954217 0.506635 0.862161
+-0.455763 -0.890101 -0.980258 0.197723
+-0.808962 0.587862 0.999956 -0.00943065
+0.0872945 -0.996183 -0.774925 0.632054
+-0.0757658 -0.997126 0.266857 -0.963736
+0.916988 0.398915 -0.981512 -0.191398
+-0.7664 -0.642364 0.800395 0.599473
+-0.745613 -0.666379 -0.779086 -0.626918
+0.302194 -0.953247 0.754035 -0.656834
+-0.926944 -0.375199 0.72347 0.690356
+0.387042 0.922062 -0.454851 -0.890567
+-0.416469 -0.90915 0.517841 0.855477
+0.067985 -0.997686 0.867541 0.497366
+0.244773 -0.96958 0.919438 -0.393236
+0.917504 0.397727 -0.998006 -0.0631192
+0.999897 -0.0143292 0.137392 -0.990517
+0.846629 -0.532183 0.908551 0.417774
+0.980999 0.194013 0.780345 0.62535
+0.0489215 0.998803 0.180717 0.983535
+-0.924539 0.381087 0.171861 -0.985121
+0.862602 0.505883 -0.933552 0.358441
+-0.503195 -0.864173 -0.77889 -0.62716
+0.731651 -0.68168 0.923903 0.382626
+0.861138 0.508371 -0.996972 0.0777557
+-0.337979 0.941154 -0.99675 0.0805564
+0.744138 0.668026 -0.622638 -0.78251
+-0.749584 0.661909 -0.99683 0.079556
+0.895583 -0.444895 -0.524911 -0.851157
+0.986473 -0.163922 -0.725843 0.68786
+-0.684312 0.729189 0.999482 -0.0321969
+0.0297584 0.999557 -0.986366 -0.164565
+-0.451485 -0.892279 -0.960784 -0.277299
+0.960936 0.27677 -0.973384 0.229182
+-0.611675 -0.791109 -0.987874 -0.155256
+-0.928285 0.371871 0.919803 -0.392381
+0.203168 -0.979144 -0.038884 0.999244
+-0.245313 -0.969444 0.939895 0.341463
+0.950313 0.311295 0.971428 0.237336
+-0.803966 0.594675 0.656737 -0.75412
+-0.998251 -0.059116 0.932998 -0.359881
+-0.76409 -0.645109 0.538952 0.842336
+-0.859496 -0.511143 -0.970312 -0.241857
+0.361996 0.93218 0.791015 0.611797
+-0.695563 0.718465 0.0486139 0.998818
+-0.705975 0.708236 -0.987248 0.159189
+-0.0386212 0.999254 -0.750821 -0.660506
+-0.685197 0.728358 0.996025 0.0890764
+-0.220788 0.975322 -0.963471 -0.267814
+-0.231756 0.972774 -0.172852 -0.984948
+-0.761007 -0.648744 0.0923885 0.995723
+-0.167555 -0.985863 -0.429413 0.903108
+-0.692022 0.721876 0.514412 0.857543
+-0.177693 0.984086 0.552517 -0.833502
+-0.794634 -0.607088 -0.742289 0.67008
+-0.962908 0.26983 -0.579534 -0.814948
+-0.86612 -0.499837 -0.483578 0.875301
+-0.185766 -0.982594 0.986522 0.163631
+0.543177 -0.839618 0.642531 0.76626
+-0.998057 -0.0623127 0.998854 -0.0478551
+-0.344322 -0.938852 -0.828615 0.559819
+0.240537 0.97064 0.666869 0.745175
+0.0325846 -0.999469 -0.993111 -0.117174
+-0.682261 0.731109 0.951357 -0.308091
+-0.0375027 0.999297 -0.8199 -0.572507
+-0.810621 0.585572 0.962877 0.26994
+0.361454 -0.93239 0.754172 -0.656677
+0.970836 0.239746 0.603955 -0.797019
+0.766535 0.642203 0.81283 0.582502
+0.633743 -0.773544 0.888476 -0.458922
+-0.92309 0.384585 -0.204408 -0.978886
+-0.72723 -0.686394 0.968 0.250951
+-0.983257 0.182224 0.865413 0.501059
+0.989969 0.141282 -0.0384106 0.999262
+0.376589 -0.926381 0.61217 0.790726
+0.552997 -0.833184 -0.458395 0.888748
+-0.798955 0.601391 -0.121151 -0.992634
+0.911145 0.412086 0.0626482 -0.998036
+0.227944 0.973674 -0.535739 0.844383
+-0.41015 -0.912018 -0.149116 0.98882
+-0.612029 0.790835 -0.993842 0.110807
+0.458199 -0.88885 -0.890268 -0.455437
+-0.830402 0.557165 -0.828979 -0.559279
+-0.147347 -0.989085 -0.606267 -0.795261
+0.793286 0.608849 -0.871496 0.490403
+0.998114 0.0613852 0.990104 -0.140336
+0.408767 0.912639 -0.296745 0.954957
+-0.382756 -0.92385 -0.00781492 -0.999969
+-0.125099 -0.992144 0.999722 0.0235668
+0.988301 0.152517 -0.922413 0.386206
+0.324444 0.945905 -0.0556599 -0.99845
+-0.888402 0.459067 -0.841578 0.540136
+0.0896843 0.99597 -0.902919 -0.42981
+0.955974 -0.29345 -0.0617159 0.998094
+0.270493 -0.962722 -0.63423 0.773145
+-0.998633 0.0522696 0.494234 0.869329
+-0.603096 0.797668 -0.328849 0.944382
+-0.799861 -0.600185 0.0293891 0.999568
+-0.98204 -0.188673 0.991366 0.131122
+-0.974559 0.22413 -0.817403 0.576066
+-0.971176 0.238364 0.484836 0.874605
+0.979072 -0.203515 -0.0742894 -0.997237
+0.86257 0.505937 -0.93581 0.352504
+0.91148 -0.411344 -0.0186453 0.999826
+0.998004 -0.0631492 0.999354 -0.0359302
+0.793525 -0.608538 -0.851609 -0.524177
+0.16132 -0.986902 -0.880047 -0.474886
+-0.759383 0.650644 -0.156739 -0.98764
+0.973786 -0.227466 -0.576499 0.817098
+0.997693 -0.0678854 0.872462 -0.488682
+0.90486 0.425709 0.99997 -0.00771398
+-0.416097 0.90932 0.482409 -0.875946
+0.396802 -0.917904 -0.999289 0.0377072
+-0.988588 0.150646 -0.833269 -0.552868
+0.960705 0.27757 -0.989075 0.147416
+0.873642 -0.486568 0.852384 -0.522916
+-0.995971 0.0896771 -0.90261 -0.430459
+0.139383 0.990239 0.152727 -0.988268
+-0.783908 -0.620877 -0.529562 -0.848271
+0.213568 0.976928 -0.892215 -0.451611
+-0.0132757 0.999912 0.240798 0.970575
+0.332957 -0.942942 -0.817481 0.575956
+-0.63821 -0.769862 0.9948 -0.101851
+-0.997073 0.0764542 0.199742 -0.979848
+0.0415917 -0.999135 -0.524406 -0.851468
+-0.913795 0.406176 -0.552186 0.833721
+0.991714 -0.128466 0.95053 -0.310632
+0.771894 0.635751 0.976562 -0.215235
+0.97469 0.223562 -0.84959 -0.527444
+-0.998141 -0.0609505 0.983054 -0.183315
+-0.894748 -0.446572 -0.674255 0.738499
+-0.999884 0.0152132 0.0493945 -0.998779
+-0.989656 0.143462 -0.255839 -0.966719
+-0.545845 -0.837886 0.370651 -0.928772
+-0.905117 0.425163 0.997685 0.0680082
+-0.978621 0.205672 -0.290408 -0.956903
+-0.943027 -0.332716 -0.802491 0.596664
+0.273581 0.961849 -0.845714 -0.533637
+0.609329 -0.792918 -0.899557 0.436803
+-0.993988 -0.109487 -0.0248978 -0.99969
+0.338246 0.941058 -0.998632 -0.0522927
+0.88891 -0.458082 -0.896161 0.443729
+0.513154 -0.858296 -0.887686 -0.46045
+0.998018 0.0629362 0.999893 0.0145996
+-0.809757 0.586765 0.992067 0.125713
+0.731227 -0.682134 0.945865 0.32456
+0.902533 -0.43062 0.859928 -0.510416
+0.753875 -0.657018 -0.841335 -0.540514
+0.777396 0.629012 0.465211 -0.8852
+-0.974865 -0.222796 -0.888356 -0.459155
+0.802863 0.596164 0.506549 0.862211
+-0.639277 0.768977 0.971175 0.238369
+-0.534672 0.84506 0.990667 -0.136304
+-0.0534305 -0.998572 0.591732 0.806135
+0.578614 -0.815601 0.42755 -0.903992
+0.822091 0.569357 -0.635571 -0.772043
+0.45442 0.890787 -0.998838 0.0482041
+0.469042 -0.883176 0.12559 -0.992082
+0.272598 0.962128 -0.786845 -0.61715
+0.243772 0.969832 0.874027 0.485878
+-0.522 0.852945 -0.0584018 -0.998293
+0.185753 -0.982596 0.986299 -0.164967
+-0.258499 -0.966012 0.528457 -0.84896
+0.394235 -0.91901 -0.950128 0.31186
+-0.924696 0.380706 0.212356 -0.977192
+0.644684 0.764449 0.584969 -0.811055
+-0.196793 0.980445 0.574346 0.818613
+0.99868 -0.0513548 0.412642 0.910893
+-0.558911 0.829228 -0.927526 0.373759
+0.657501 0.753454 -0.874229 -0.485513
+-0.998299 -0.0582962 0.900337 -0.435194
+-0.9694 -0.245485 0.945802 -0.324745
+0.929603 0.368563 0.998887 0.0471771
+-0.562317 0.826922 -0.999601 -0.0282445
+-0.952029 -0.306009 0.950442 -0.310902
+-0.969013 0.247012 0.985031 0.172377
+0.15289 0.988243 -0.936321 -0.351146
+-0.991011 0.13378 0.658622 -0.752474
+-0.568224 0.822874 -0.735569 -0.67745
+-0.502761 0.864426 -0.746422 0.665473
+0.995908 0.0903766 -0.930593 0.366056
+-0.946774 0.3219 0.211503 -0.977377
+-0.34332 -0.939218 -0.883534 0.468367
+-0.608857 0.79328 -0.872013 0.489483
+0.372027 0.928222 0.913051 -0.407846
+-0.964678 -0.263433 0.0456455 0.998958
+-0.952195 0.305491 0.932127 0.36213
+-0.657792 0.7532 -0.89233 0.451385
+-0.685132 0.728419 0.996781 0.0801753
+-0.553488 -0.832857 -0.509951 -0.860203
+-0.890829 -0.454338 -0.999238 -0.0390409
+-0.263663 -0.964615 0.0218246 -0.999762
+-0.921175 0.389149 -0.64487 -0.764293
+-0.208618 0.977997 -0.561198 0.827682
+-0.990435 -0.137977 0.29105 0.956708
+0.703656 -0.710541 -0.883803 0.46786
+-0.882122 0.471021 0.343012 0.939331
+0.330189 -0.943915 -0.61601 0.787738
+0.666238 -0.74574 -0.790865 -0.611991
+0.102444 -0.994739 -0.669236 -0.74305
+0.928296 -0.371842 0.920992 -0.389583
+-0.708578 0.705632 -0.978379 -0.206818
+-0.343503 0.939152 -0.874267 -0.485446
+0.999994 -0.00352983 0.938345 -0.345699
+-0.185057 -0.982728 0.972148 0.23437
+0.614413 -0.788985 -0.981866 -0.189577
+-0.968135 0.25043 0.98389 -0.178776
+0.942881 -0.33313 -0.827944 -0.560811
+-0.50334 0.864088 -0.78933 0.613969
+0.344044 -0.938953 -0.844831 -0.535034
+-0.186077 0.982535 0.9912 -0.132373
+-0.579374 0.815062 0.509798 -0.860294
+-0.0234824 0.999724 -0.701614 0.712557
+0.986699 -0.162557 -0.813759 0.581202
+-0.293816 -0.955862 -0.0234508 0.999725
+-0.936702 0.350128 -0.349996 0.936751
+-0.99467 -0.103113 -0.617741 -0.786382
+0.571777 0.820409 -0.38389 0.923379
+0.352439 -0.935835 -0.110523 -0.993874
+0.75659 -0.65389 -0.552704 -0.833378
+0.366812 -0.930295 0.990059 -0.140655
+-0.739148 0.673543 0.0716377 0.997431
+-0.830236 -0.557412 -0.845242 0.534384
+0.0241254 0.999709 -0.74596 -0.665991
+-0.504523 -0.863398 -0.865758 -0.500463
+0.745386 0.666634 -0.757257 -0.653117
+0.72731 0.686309 0.970872 0.239599
+0.85173 0.523981 0.173135 -0.984898
+0.875363 -0.483465 0.980963 -0.194194
+0.996369 -0.0851393 -0.621196 -0.783655
+0.608479 -0.79357 -0.847697 0.530481
+0.632823 -0.774296 0.827804 -0.561017
+-0.645928 0.763398 0.445691 0.895187
+0.536268 0.844048 0.998633 -0.0522713
+0.630086 -0.776525 0.582823 -0.812599
+0.869746 0.4935 0.223473 0.97471
+0.995431 0.0954864 -0.990433 -0.137995
+-0.415543 0.909574 0.42816 -0.903703
+0.984466 0.175573 0.361606 -0.932331
+-0.583549 0.812078 0.866503 -0.499172
+0.711082 0.703109 -0.845234 0.534396
+-0.355693 0.934603 0.235008 -0.971993
+-0.323801 -0.946125 0.0123064 -0.999924
+-0.719613 0.694375 0.212241 -0.977217
+-0.199036 0.979992 0.373685 0.927556
+-0.809227 0.587496 0.999361 0.035752
+0.430943 -0.902379 0.841126 0.540839
+0.299025 -0.954245 0.498573 -0.866848
+-0.944685 -0.32798 -0.416657 0.909064
+-0.692597 -0.721325 0.444561 -0.895749
+-0.397732 -0.917502 -0.997975 0.0636107
+-0.65164 0.758528 -0.284651 0.958631
+0.997775 0.0666722 0.925294 0.37925
+-0.181214 0.983444 0.809538 -0.587068
+-0.774029 -0.633151 0.850777 -0.525526
+-0.445836 -0.895115 -0.611281 -0.791414
+-0.790671 0.612241 -0.996452 -0.084161
+-0.128422 -0.99172 0.951912 -0.306373
+0.089292 -0.996005 -0.885296 0.465028
+-0.396127 0.918196 -0.993826 0.110946
+-0.21239 -0.977185 -0.831414 -0.555653
+-0.736068 -0.676908 0.503774 -0.863836
+0.460277 0.887776 -0.760451 0.649396
+0.88317 0.469054 0.12686 -0.991921
+0.176613 -0.98428 0.457932 -0.888987
+0.979394 0.201959 0.0844908 0.996424
+0.536655 0.843801 0.995185 -0.0980157
+0.269791 -0.962919 -0.576226 0.81729
+-0.590677 0.806908 0.936647 0.350275
+0.380171 0.924916 0.268481 -0.963285
+0.624529 0.781002 -0.0913328 0.99582
+-0.987364 0.158468 -0.978872 0.204476
+-0.999654 0.0263225 -0.873211 -0.487342
+0.536703 -0.843771 0.994621 0.103581
+0.600484 -0.799637 -0.00793915 0.999968
+0.173171 -0.984892 0.125731 -0.992064
+0.0613979 0.998113 0.990282 0.139074
+-0.462802 -0.886462 -0.547499 0.836806
+-0.888046 -0.459755 -0.797283 -0.603606
+0.26936 -0.96304 -0.539035 0.842283
+-0.318892 0.947791 0.506171 0.862433
+-0.0686215 0.997643 0.834064 0.551667
+0.554967 0.831872 -0.654002 -0.756492
+-0.381373 0.924421 0.14128 0.98997
+-0.96869 -0.248273 0.999073 -0.0430574
+0.0971404 -0.995271 -0.953967 -0.299911
+0.997493 -0.070767 0.697114 -0.71696
+0.917918 -0.39677 -0.999152 -0.0411783
+-0.999504 0.0314785 -0.999977 0.00678065
+0.0185839 -0.999827 -0.283746 0.958899
+0.000699853 1 0.997552 -0.0699282
+0.243045 0.970015 0.835163 0.550003
+-0.69047 0.723361 0.685388 0.728178
+-0.887453 0.460898 -0.713178 0.700983
+-0.240339 0.970689 0.651507 -0.758642
+0.590044 0.807371 0.961202 -0.275845
+-0.962249 0.272172 -0.758733 -0.651401
+-0.948048 0.318127 0.574012 -0.818847
+0.936622 -0.350343 -0.328424 0.94453
+0.34876 -0.937212 -0.482496 -0.875898
+-0.654661 -0.755923 -0.634672 -0.772782
+0.858565 0.512704 -0.910587 -0.413318
+-0.195835 0.980637 0.651402 0.758733
+0.674332 0.738428 0.177594 0.984104
+0.8934 -0.449263 -0.862877 -0.505414
+0.666558 0.745454 -0.76388 0.645358
+0.844047 -0.53627 0.998623 -0.0524531
+0.503268 0.86413 -0.784202 -0.620506
+0.352332 -0.935875 -0.121816 -0.992553
+-0.996105 0.0881777 -0.827847 -0.560954
+0.967752 -0.251905 0.945354 -0.326045
+0.774658 0.63238 0.794351 -0.607459
+-0.0196157 -0.999808 -0.381017 -0.924568
+0.746623 0.665247 -0.864915 -0.501919
+-0.88002 0.474937 0.713592 0.700561
+-0.229223 0.973374 -0.420474 -0.907305
+0.734628 -0.67847 0.674569 0.738212
+-0.844203 0.536023 0.99973 -0.0232458
+0.175797 0.984426 0.382756 0.92385
+-0.712907 0.701259 -0.679559 -0.733621
+0.520242 0.854019 -0.261379 0.965236
+-0.984303 0.176486 0.446422 0.894823
+-0.8535 -0.521093 -0.164049 -0.986452
+-0.976975 -0.213352 -0.88201 0.471231
+0.792181 -0.610286 -0.945634 -0.325234
+0.710948 -0.703244 -0.855243 -0.518227
+-0.404204 -0.914669 -0.717803 0.696246
+-0.596173 0.802856 0.505627 0.862752
+-0.450292 0.892881 -0.915268 0.402846
+-0.699034 -0.715089 -0.421882 -0.906651
+0.544525 0.838745 0.51172 -0.859152
+0.969738 -0.244149 0.892207 0.451627
+-0.233537 -0.972348 0.00942588 0.999956
+-0.929141 0.369726 0.985202 -0.171395
+0.834211 0.551445 -0.285997 0.95823
+-0.645482 -0.763776 0.497258 -0.867603
+-0.894939 -0.446188 -0.641965 0.766734
+0.999836 0.0180827 -0.235341 0.971913
+0.335151 -0.942164 -0.928303 0.371824
+-0.732892 0.680345 0.839225 0.543784
+-0.997536 0.0701511 0.740025 -0.672579
+0.0870067 -0.996208 -0.756344 0.654174
+-0.997978 0.0635681 0.996966 -0.0778397
+0.0897049 0.995968 -0.903808 -0.427939
+0.727685 -0.685911 0.982515 -0.186181
+0.848049 -0.529918 0.765958 0.64289
+-0.990012 -0.140983 -0.00824446 0.999966
+0.0692079 -0.997602 0.800215 0.599713
+-0.431877 0.901932 0.780696 0.624911
+-0.0352539 -0.999378 -0.926974 0.375126
+0.650239 0.75973 -0.103832 -0.994595
+-0.994948 0.100392 -0.807244 0.590218
+0.211077 0.977469 -0.749493 -0.662012
+-0.159089 -0.987264 -0.964087 0.265588
+0.993458 0.114194 0.433869 -0.900976
+0.763747 0.645515 0.493437 0.869781
+-0.807392 -0.590016 0.962163 0.272473
+-0.29711 -0.954843 0.315869 0.948803
+-0.973581 0.228341 -0.500911 0.865499
+0.890376 -0.455226 -0.990402 0.138217
+-0.475107 0.879928 0.726973 -0.686666
+-0.721659 -0.692249 0.487269 0.873252
+0.752289 -0.658833 -0.946066 -0.323974
+0.966551 0.256474 0.693488 0.720468
+0.926465 0.376381 0.62973 0.776814
+0.990878 -0.134761 0.581014 -0.813894
+-0.428003 -0.903777 0.969923 -0.243414
+-0.661193 -0.750216 -0.999874 -0.015853
+0.993153 -0.116821 0.654297 0.756238
+-0.994952 0.100347 -0.809875 0.586602
+0.994989 0.0999883 -0.830499 -0.55702
+-0.982511 0.186204 0.992826 0.119568
+0.0133991 0.99991 0.228804 -0.973473
+-0.999332 -0.0365365 -0.871337 -0.490684
+-0.273589 -0.961847 -0.846156 -0.532936
+0.6956 0.718429 0.043561 -0.999051
+-0.866844 0.49858 -0.351952 -0.936018
+0.135253 0.990811 0.539894 -0.841733
+0.764848 -0.644211 0.634001 -0.773332
+-0.0753148 -0.99716 0.31016 -0.950684
+0.985427 -0.170099 -0.184711 0.982793
+0.98676 0.162187 -0.834982 -0.550278
+0.175041 0.984561 0.310736 0.950496
+0.374267 0.927321 0.789061 -0.614315
+0.00313883 -0.999995 0.951142 0.308755
+0.0614649 0.998109 0.991193 0.132425
+-0.312755 0.949834 0.923672 0.383184
+-0.592547 0.805536 0.831026 0.556233
+0.934776 -0.355238 0.187442 0.982276
+0.0876063 -0.996155 -0.794323 0.607496
+-0.160889 0.986972 -0.899931 -0.436031
+-0.131535 0.991312 0.810761 0.585377
+-0.752809 0.658239 -0.917546 -0.39763
+0.529215 0.848488 0.710132 0.704069
+-0.381381 0.924418 0.140508 0.99008
+-0.9452 0.326492 -0.268921 -0.963162
+0.638731 0.76943 0.985633 -0.168898
+0.9987 -0.0509704 0.377281 0.926099
+0.869899 0.49323 0.253619 0.967304
+0.724243 0.689545 0.772625 0.634863
+-0.988544 0.15093 -0.848802 -0.52871
+0.816222 0.577738 0.328178 -0.944616
+-0.839973 -0.542629 0.691172 0.72269
+-0.164162 -0.986433 -0.708895 0.705314
+-0.794569 -0.607174 -0.749462 0.662048
+-0.292118 0.956382 -0.199692 -0.979859
+0.594492 -0.804102 0.673765 0.738946
+0.991492 0.130169 0.883463 0.4685
+-0.987104 -0.160081 -0.932592 -0.360932
+-0.0633152 -0.997994 0.998618 -0.0525509
+0.0551255 -0.998479 0.719411 -0.694585
+-0.999948 0.0101573 0.526981 -0.849877
+0.0993847 -0.995049 -0.862746 -0.505638
+0.992713 -0.1205 0.883747 0.467965
+-0.383667 -0.923472 -0.106272 -0.994337
+-0.994732 -0.102507 -0.664475 -0.74731
+0.18129 0.98343 0.813994 0.580873
+0.997138 -0.0755999 0.282854 -0.959163
+0.671999 -0.740552 -0.136518 -0.990638
+0.518817 0.854885 -0.418001 0.908447
+0.0120463 -0.999927 0.35801 0.933718
+0.622787 0.782391 -0.309093 0.951032
+-0.9157 0.401862 -0.870683 0.491845
+0.649123 0.760684 0.0427836 -0.999084
+-0.334261 0.942481 -0.889088 0.457736
+-0.0222579 -0.999752 -0.609304 -0.792937
+-0.861908 -0.507065 -0.973786 0.227467
+-0.938676 0.344801 -0.799004 0.601325
+-0.0731868 -0.997318 0.504459 -0.863435
+-0.499673 -0.866214 -0.467 -0.884257
+-0.917585 -0.397539 -0.99909 -0.0426599
+0.222873 0.974847 -0.884694 0.466173
+0.0925997 -0.995703 -0.988543 0.150943
+0.55503 0.83183 -0.659714 -0.751517
+0.925035 -0.379883 0.298356 -0.954455
+-0.678142 0.734931 0.640944 -0.767588
+-0.957682 0.287828 -0.604641 0.796498
+0.244461 -0.969659 0.906312 -0.422609
+-0.768038 0.640405 0.925865 -0.377854
+0.991407 -0.13081 0.851365 -0.524574
+-0.983192 -0.182577 0.882851 -0.469653
+0.597093 0.802172 0.403626 -0.914924
+-0.990028 0.140873 0.00283061 -0.999996
+-0.279387 0.960179 -0.99915 -0.0412119
+0.689404 0.724377 0.784855 -0.619679
+0.509933 0.860214 -0.994634 0.103457
+0.376341 -0.926481 0.633113 0.77406
+-0.587393 0.809302 0.998823 -0.048514
+0.573506 0.819201 -0.182104 0.983279
+-0.433207 -0.901294 0.680382 -0.732858
+-0.99661 -0.0822738 -0.373436 0.927656
+0.826051 -0.563596 -0.9833 0.18199
+0.435369 -0.900252 0.486671 0.873586
+0.945659 -0.325161 -0.131119 -0.991367
+0.964926 0.26252 0.139755 0.990186
+0.702943 0.711246 -0.832565 -0.553928
+-0.346129 -0.938187 -0.7062 0.708012
+-0.698563 -0.715549 -0.361326 -0.932439
+-0.905074 -0.425254 0.998314 -0.058051
+-0.910339 0.413864 0.255074 0.966922
+-0.270765 0.962646 -0.655777 0.754955
+0.661427 0.750009 -0.999881 0.0154105
+-0.606344 -0.795202 -0.676415 -0.736521
+0.933437 0.358742 0.534308 -0.84529
+-0.256768 0.966473 0.671216 0.741261
+-0.862973 -0.50525 -0.904788 0.425862
+-0.896653 0.442733 -0.306373 -0.951912
+-0.0322757 -0.999479 -0.996258 0.0864254
+-0.700884 0.713275 -0.640047 0.768336
+0.405135 -0.914257 -0.643343 -0.765578
+-0.16274 -0.986669 -0.802843 0.59619
+0.819331 -0.573321 -0.204215 0.978926
+0.975295 -0.220908 -0.960116 0.279603
+0.300112 0.953904 0.593916 0.804527
+0.321581 0.946882 0.244385 -0.969678
+0.832392 0.554187 -0.580287 0.814412
+-0.667524 0.744588 -0.673963 -0.738765
+0.998293 0.0584118 0.905312 -0.424748
+-0.937446 0.348132 -0.540093 0.841605
+-0.992797 -0.119811 0.849144 -0.528162
+-0.379821 -0.92506 0.304678 -0.952455
+0.96291 -0.269824 -0.579029 -0.815307
+-0.887625 0.460567 -0.738843 0.673877
+-0.99815 -0.0608076 0.980329 -0.19737
+0.822847 -0.568263 -0.732346 0.680933
+-0.977401 0.211393 -0.770521 -0.637415
+-0.658393 -0.752674 -0.925516 -0.378708
+-0.817948 -0.575292 0.0350736 -0.999385
+0.834038 0.551707 -0.315941 0.948779
+0.275818 0.96121 -0.94594 -0.324342
+0.982702 0.185192 0.975273 -0.221004
+-0.756926 0.6535 -0.509098 -0.860708
+-0.538483 0.842636 0.950826 0.309727
+-0.448591 -0.893737 -0.822463 -0.568818
+-0.940981 0.33846 -0.999563 -0.0295478
+-0.67612 -0.736792 0.408621 0.912704
+-0.0644387 0.997922 0.986393 0.164404
+0.693886 -0.720085 0.278112 0.960549
+-0.714585 0.699548 -0.485973 -0.873974
+-0.666629 -0.74539 -0.757655 0.652655
+-0.377225 -0.926122 0.556453 -0.830879
+0.806514 0.591215 0.911215 0.411931
+-0.973537 -0.228528 -0.484177 -0.87497
+-0.572493 -0.81991 -0.301942 0.953326
+-0.321917 0.946768 0.209775 0.97775
+-0.0966819 -0.995315 -0.966765 0.255667
+-0.022156 -0.999755 -0.601187 -0.799108
+-0.490065 -0.871686 0.580947 -0.813941
+-0.0383787 -0.999263 -0.76663 0.642089
+0.368817 0.929502 0.997231 -0.0743695
+0.382097 0.924122 0.0634145 -0.997987
+-0.909801 0.415044 0.377986 0.925811
+0.605939 0.795511 -0.63806 -0.769987
+-0.764779 -0.644293 0.625668 0.78009
+0.933356 -0.358953 0.553279 0.832996
+0.950655 0.310251 0.99159 0.12942
+0.883695 0.468064 0.0151507 -0.999885
+-0.88469 -0.46618 -0.196605 -0.980483
+-0.599101 -0.800673 0.164119 -0.986441
+0.478801 0.877923 0.943883 0.33028
+0.204084 -0.978953 -0.132035 0.991245
+-0.44046 -0.897772 -0.0579464 -0.99832
+-0.93614 -0.351626 -0.196255 -0.980553
+0.715006 0.699118 -0.432557 0.901606
+-0.604786 0.796388 -0.520204 0.854042
+0.999902 0.0140277 0.167196 0.985924
+0.0316745 -0.999498 -0.999652 -0.0263814
+-0.755761 -0.654847 -0.653533 0.756898
+0.703919 -0.71028 -0.900528 0.434797
+0.676563 0.736385 0.462748 0.88649
+0.0156957 0.999877 0.00115903 -0.999999
+-0.923342 -0.383979 -0.139837 0.990174
+0.110296 0.993899 0.05649 0.998403
+0.213219 -0.977004 -0.875531 0.483163
+0.213778 0.976882 -0.901737 -0.432286
+-0.976498 -0.215528 -0.964338 0.264673
+-0.993042 -0.117762 0.722903 -0.690949
+0.971906 -0.23537 0.19667 0.98047
+0.290674 0.956822 -0.3448 0.938676
+-0.0795634 0.99683 -0.110548 0.993871
+0.577232 0.81658 0.269042 0.963128
+-0.773155 0.634217 0.914921 0.403632
+-0.341341 -0.939939 -0.961922 0.273323
+-0.299831 0.953992 0.569931 -0.821693
+0.999914 0.0131025 0.257568 0.96626
+-0.655987 -0.754772 -0.759888 -0.650054
+-0.581013 0.813894 0.671481 -0.741022
+0.877486 0.479602 0.970052 -0.242899
+0.228486 0.973547 -0.487968 0.872862
+0.999749 -0.0224033 -0.620771 -0.783992
+-0.000912469 1 0.99584 0.0911204
+0.999688 -0.0249915 -0.80079 -0.598945
+-0.460462 -0.887679 -0.746703 0.665158
+0.35248 -0.935819 -0.10609 -0.994357
+0.732255 0.681031 0.8864 -0.46292
+0.985418 0.17015 -0.179635 -0.983733
+0.365573 -0.930783 0.962622 -0.270849
+0.703883 -0.710316 -0.898304 0.439375
+-0.633319 -0.773891 0.861983 0.506937
+-0.403783 -0.914855 -0.749104 0.662453
+0.999287 0.037755 -0.80519 -0.593018
+0.763855 -0.645388 0.507935 -0.861395
+0.0215442 0.999768 -0.551191 -0.834379
+0.0726928 0.997354 0.546585 -0.837403
+-0.467678 -0.883899 -0.0285191 0.999593
+-0.97205 0.234775 0.136339 0.990662
+0.143974 -0.989582 -0.305455 0.952207
+0.360334 0.932823 0.670052 0.742314
+-0.889482 0.45697 -0.944501 0.32851
+0.988703 -0.149888 -0.788493 -0.615044
+-0.958536 0.284973 -0.811837 0.583884
+-0.88659 -0.462556 -0.570508 -0.821292
+-0.669359 0.742939 -0.473157 -0.880978
+0.595045 0.803692 0.621335 -0.783545
+0.707102 -0.707112 -1 0.00070253
+-0.679036 0.734105 0.729384 -0.684104
+0.216262 -0.976335 -0.981492 0.191505
+0.164679 0.986347 -0.67096 0.741494
+-0.947923 0.3185 0.541372 -0.840783
+0.999921 -0.012537 0.311779 -0.950155
+0.186735 0.98241 0.997838 0.0657291
+-0.317635 -0.948213 0.615733 -0.787955
+0.999296 -0.0375226 -0.81876 0.574137
+0.786081 -0.618124 -0.788808 0.614639
+-0.999316 -0.0369777 -0.848831 -0.528664
+0.757293 0.653075 -0.459969 0.887935
+0.879792 -0.475359 0.746339 0.665566
+-0.399741 0.916628 -0.960292 -0.278998
+0.996935 -0.0782292 0.0230558 -0.999734
+-0.925065 -0.379809 0.305932 0.952053
+0.99999 -0.00441336 0.904181 -0.427149
+0.999178 -0.0405342 -0.611424 0.791303
+-0.95174 0.306906 0.975488 0.220053
+0.0259563 0.999663 -0.854781 -0.518989
+0.11306 0.993588 0.328444 0.944523
+0.716382 0.697709 -0.247783 0.968815
+-0.259927 -0.965628 0.397603 -0.917558
+0.999514 0.0311685 -0.999706 0.0242377
+-0.392702 0.919666 -0.885193 0.465223
+0.672464 0.74013 -0.0741092 0.99725
+0.992894 -0.118999 0.803168 0.595753
+0.114339 -0.993442 0.446997 -0.894536
+-0.253848 -0.967244 0.861314 -0.508074
+-0.576194 0.817313 0.14482 -0.989458
+0.866458 -0.499249 -0.423174 -0.906049
+-0.863446 -0.504441 -0.860956 0.508679
+-0.208738 -0.977972 -0.571263 -0.820767
+-0.300053 -0.953923 0.588854 0.808239
+0.355362 -0.934729 0.200485 -0.979697
+0.509351 0.860559 -0.999353 0.0359682
+-0.311988 -0.950086 0.951545 -0.307511
+0.984646 0.174565 0.264446 -0.964401
+0.654206 -0.756317 -0.586993 0.809592
+-0.347418 -0.93771 -0.602533 0.798094
+0.881914 -0.471411 0.384161 0.923266
+-0.681725 0.731608 0.92626 -0.376886
+0.349298 -0.937012 -0.431509 -0.902109
+0.551811 -0.833969 -0.32778 0.944754
+-0.398099 -0.917342 -0.99463 0.103495
+0.274926 -0.961466 -0.911817 0.410596
+-0.82721 0.561893 -0.999735 -0.0230331
+-0.402144 -0.915576 -0.855117 0.518434
+0.235727 -0.971819 0.232602 -0.972572
+0.61484 -0.788652 -0.970161 -0.242463
+0.90483 -0.425773 1 0.000648743
+0.992239 0.124342 0.995014 -0.099738
+0.990709 -0.135996 0.475292 -0.879828
+-0.646328 -0.763059 0.398198 -0.9173
+0.987882 0.155208 -0.992304 0.123826
+-0.263983 0.964527 -0.0114085 0.999935
+0.130131 -0.991497 0.885267 0.465083
+0.999332 0.0365484 -0.870756 -0.491715
+0.928018 0.372535 0.889378 0.457173
+-0.992053 0.125822 0.998789 -0.0491987
+-0.60568 0.795708 -0.612634 0.790367
+0.990077 -0.140526 0.0378595 -0.999283
+0.920054 0.391792 -0.834887 0.550421
+0.904608 0.426244 0.998682 0.051322
+-0.431126 -0.902292 0.829953 -0.557833
+0.693172 -0.720773 0.371863 0.928288
+0.0939553 0.995576 -0.999882 -0.0153679
+-0.722748 0.691111 0.618198 -0.786023
+0.80835 -0.588702 0.993579 -0.113143
+0.814437 0.580252 0.599365 -0.800476
+0.899158 0.437624 0.254836 0.966984
+0.435374 -0.900249 0.486156 0.873872
+-0.979739 0.200277 0.25348 -0.967341
+0.724132 -0.689661 0.762361 -0.647152
+-0.510536 -0.859856 -0.984946 0.17286
+0.573756 0.819026 -0.152003 0.98838
+-0.464003 -0.885834 -0.429416 0.903107
+0.905468 0.424415 0.988667 -0.150128
+0.519149 -0.854684 -0.382429 -0.923985
+-0.970248 0.242111 0.778453 0.627702
+0.891434 -0.453151 -0.995566 -0.0940672
+0.105839 -0.994383 -0.38183 -0.924233
+-0.992823 0.11959 0.837178 0.546931
+0.821525 -0.570172 -0.555947 0.831218
+-0.82718 0.561936 -0.999842 -0.0177747
+-0.999353 -0.0359537 -0.898459 -0.439058
+0.333078 0.942899 -0.824821 -0.565394
+0.449516 0.893272 -0.876861 -0.480745
+-0.997372 -0.0724544 0.566447 0.824098
+-0.0421607 0.999111 -0.475095 -0.879935
+-0.558337 -0.829614 -0.899451 -0.437022
+0.661741 -0.749733 -0.998364 -0.0571696
+0.0986591 0.995121 -0.897291 0.441441
+-0.188664 -0.982042 0.991486 -0.130212
+0.918185 -0.396151 -0.994115 -0.108333
+0.855355 -0.518042 -0.498459 0.866913
+-0.838605 -0.54474 0.489571 0.871963
+0.480667 0.876903 0.992332 0.123597
+-0.260181 0.96556 0.373267 0.927724
+-0.998576 0.0533484 0.585085 0.810972
+-0.117351 0.993091 0.693706 -0.720258
+-0.656496 0.754329 -0.801973 0.59736
+-0.386728 0.922194 -0.424244 0.905548
+-0.08392 -0.996472 -0.520894 -0.853621
+0.0448414 0.998994 -0.22481 0.974403
+0.990393 -0.138283 0.261324 -0.965251
+0.767987 -0.640465 0.92288 -0.385088
+0.864136 -0.503258 -0.783452 -0.621452
+0.955458 0.295127 0.113451 -0.993544
+-0.148695 -0.988883 -0.708752 -0.705457
+-0.716582 0.697502 -0.219795 -0.975546
+0.985465 -0.169881 -0.206408 0.978466
+-0.999067 0.0431975 -0.381384 0.924417
+0.628026 -0.778193 0.34955 -0.936918
+0.712723 -0.701446 -0.698567 -0.715545
+0.802134 -0.597144 0.397755 -0.917492
+-0.655598 0.75511 -0.725417 0.68831
+0.898785 0.43839 0.171628 0.985162
+0.893984 0.448098 -0.789855 0.613294
+0.708586 -0.705624 -0.978145 -0.207924
+-0.475893 0.879503 0.785338 -0.619067
+-0.127396 -0.991852 0.978458 -0.206444
+-0.060129 -0.998191 0.964658 0.263504
+-0.922163 -0.3868 -0.431396 0.902163
+-0.950005 0.312235 0.943246 -0.332094
+-0.450644 -0.892704 -0.930435 -0.366457
+-0.989156 0.146868 -0.567064 -0.823674
+0.966766 0.255664 0.75136 0.659892
+0.566204 -0.824265 -0.878008 -0.478646
+0.11555 -0.993302 0.552476 -0.833529
+-0.979028 -0.203724 -0.0955455 0.995425
+0.752125 0.65902 -0.953828 0.300353
+0.673418 0.739262 0.0548469 0.998495
+0.56649 -0.824068 -0.860871 -0.508824
+0.593577 -0.804777 0.753231 0.657756
+-0.708321 0.70589 -0.985266 -0.171029
+0.447093 -0.894487 -0.716109 0.697988
+-0.0595712 -0.998224 0.948436 0.316968
+-0.256841 0.966454 0.665623 0.746288
+0.691166 -0.722696 0.612239 0.790673
+-0.978269 0.20734 -0.448599 -0.893733
+-0.490056 -0.871691 0.581738 -0.813376
+0.558348 -0.829607 -0.900018 0.435854
+0.968399 -0.249406 0.99727 -0.0738371
+-0.986111 -0.166086 -0.55872 -0.829356
+-0.183977 -0.98293 0.940595 0.33953
+0.627855 -0.77833 0.328924 -0.944356
+0.771906 -0.635737 0.976159 0.217056
+0.26555 -0.964097 -0.17306 0.984911
+0.910061 -0.414475 0.319366 0.947631
+0.0983709 -0.99515 -0.909694 -0.415279
+0.721553 0.69236 0.473815 0.880624
+-0.527036 -0.849843 0.508119 0.861287
+-0.999264 -0.0383555 -0.768116 -0.64031
+-0.397585 -0.917566 -0.998868 0.0475609
+0.766037 0.642796 0.76531 0.643662
+0.416073 0.909331 0.480037 0.877248
+0.528034 0.849223 0.605597 0.795772
+0.576239 0.817281 0.150275 0.988644
+0.985112 0.171913 -0.0015853 -0.999999
+0.904549 -0.426369 0.997876 -0.0651382
+-0.397654 -0.917535 -0.998479 0.055127
+0.627633 0.778509 0.301865 0.953351
+0.924338 0.381574 0.119771 0.992802
+-0.981379 -0.192081 0.887612 0.460593
+0.999075 -0.0429988 -0.399698 0.916647
+-0.924078 0.382205 0.0517915 -0.998658
+-0.610582 0.791953 -0.957115 0.289708
+-0.102439 -0.994739 -0.669636 0.74269
+-0.132042 -0.991244 0.77976 -0.626078
+0.150328 0.988636 -0.815047 -0.579394
+0.306462 0.951883 0.964164 0.265306
+-0.79935 0.600865 -0.0556209 -0.998452
+0.904115 0.42729 0.986088 0.166223
+0.534183 0.845369 0.981122 0.19339
+0.888044 -0.459759 -0.796996 0.603985
+0.253659 -0.967294 0.871072 0.491156
+0.993366 0.114999 0.505344 -0.862918
+0.393201 -0.919453 -0.909093 0.416593
+-0.865205 -0.501417 -0.634492 0.772929
+0.951687 -0.307069 0.979118 0.203292
+-0.876314 -0.481741 0.999999 -0.00144456
+-0.27713 -0.960832 -0.981292 -0.192524
+-0.762534 -0.646948 0.322416 0.946598
+0.857191 0.514998 -0.769041 -0.6392
+-0.771444 0.636297 0.989338 0.145635
+-0.168273 -0.98574 -0.362541 0.931968
+-0.11165 0.993748 0.191569 -0.981479
+-0.947707 -0.319142 0.483248 0.875483
+0.708662 -0.705548 -0.975865 -0.218373
+-0.280826 0.959759 -0.981782 -0.190013
+-0.99332 0.115394 0.53925 0.842146
+-0.929168 -0.369658 0.98642 0.164244
+-0.923437 0.38375 -0.115217 -0.99334
+-0.962195 -0.272362 -0.771498 0.636232
+0.840862 0.54125 0.799908 0.600122
+-0.906082 0.423102 0.956594 0.291423
+0.993241 -0.116071 0.595421 0.803414
+-0.94206 0.335445 -0.939464 -0.342646
+0.513694 0.857974 -0.857006 0.515306
+-0.246205 -0.969218 0.967286 0.25369
+-0.473251 -0.880928 0.567181 0.823593
+-0.659263 0.751913 -0.963009 0.269471
+0.779173 0.626809 0.199495 -0.979899
+-0.0514619 -0.998675 0.42239 0.906414
+-0.98781 -0.155662 -0.996942 0.0781468
+0.980121 0.198402 0.432848 0.901467
+-0.979066 -0.203545 -0.0772586 0.997011
+-0.963356 -0.268226 -0.436364 0.89977
+0.567805 -0.823163 -0.769043 -0.639197
+0.745032 0.667028 -0.721599 -0.692311
+-0.999178 0.04055 -0.610168 0.792272
+-0.894127 0.447814 -0.769966 -0.638085
+0.434432 -0.900705 0.574813 0.818285
+0.78814 0.615495 -0.946691 -0.322143
+-0.997061 -0.0766114 0.184272 0.982875
+0.237976 0.971271 0.449514 0.893273
+0.474096 -0.880473 0.643441 -0.765496
+0.187454 -0.982273 0.999972 0.00742931
+0.0844413 -0.996428 -0.564819 0.825215
+-0.285243 -0.958455 -0.795075 0.606511
+0.890103 0.455759 -0.980343 -0.197301
+0.0311042 0.999516 -0.99953 -0.0306625
+-0.0892621 0.996008 -0.883894 0.467688
+-0.996852 -0.0792878 -0.0830357 0.996547
+0.242302 -0.970201 0.790643 -0.612277
+-0.614147 0.789192 -0.987704 -0.156337
+0.936776 -0.349928 -0.369848 0.929092
+0.128052 -0.991767 0.962678 0.270651
+0.313832 -0.949478 0.874344 0.485306
+0.781446 0.623973 -0.161805 -0.986823
+-0.992766 0.120068 0.862523 0.506018
+-0.984943 0.172878 0.0962166 0.99536
+-0.984351 0.176216 0.421739 0.906717
+-0.848796 -0.528721 0.667916 -0.744237
+0.223336 0.974741 -0.861568 0.507642
+0.999783 -0.0208423 -0.491306 -0.870987
+-0.727023 -0.686613 0.960011 0.279963
+-0.0202577 -0.999795 -0.439561 -0.898213
+-0.968737 -0.248089 0.998076 -0.0619957
+-0.978002 0.208596 -0.559339 -0.828939
+0.651799 -0.758392 -0.304656 0.952463
+0.978 0.208603 -0.559877 0.828576
+0.781045 -0.624474 -0.0982614 0.995161
+-0.399925 -0.916548 -0.954505 0.298194
+0.642408 0.766363 0.79695 -0.604045
+-0.826592 0.562802 -0.996226 0.0868014
+0.795044 -0.606552 -0.695432 -0.718592
+0.979325 -0.202294 0.0503968 -0.998729
+0.397877 0.917439 -0.996843 0.0793981
+-0.537251 -0.843422 0.985786 -0.168008
+-0.473235 -0.880936 0.565671 0.824631
+-0.0639794 0.997951 0.992913 0.118841
+0.826303 -0.563225 -0.990474 0.137702
+0.919662 -0.392712 -0.885663 -0.464329
+0.142903 -0.989737 -0.200878 0.979616
+-0.346227 -0.938151 -0.6988 0.715317
+-0.254882 0.966972 0.802181 0.597081
+-0.212469 -0.977168 -0.835859 -0.548944
+-0.974763 0.223244 -0.86632 0.499489
+0.838129 0.545472 0.411615 0.911358
+0.443694 -0.896178 -0.406464 0.913667
+0.940906 -0.338667 -0.999971 -0.00755227
+-0.91981 -0.392365 -0.867525 0.497393
+-0.27883 0.96034 -0.999859 0.0167809
+-0.977698 -0.210018 -0.673517 0.739172
+0.177027 -0.984206 0.494934 -0.86893
+-0.258754 0.965943 0.505853 0.86262
+0.566608 0.823987 -0.853524 0.521054
+-0.98759 -0.157053 -0.998038 -0.062608
+0.490304 -0.871551 0.558358 0.8296
+-0.726024 -0.687669 0.909331 0.416074
+-0.762818 0.646613 0.363689 -0.93152
+0.661326 -0.750099 -0.999998 -0.00183138
+-0.99649 -0.0837172 -0.503412 0.864046
+0.897722 0.440563 -0.0693698 0.997591
+0.999689 0.024946 -0.798055 0.602585
+0.870806 -0.491626 0.426512 -0.904482
+0.980952 -0.194249 0.765103 -0.643908
+0.984067 -0.1778 0.561599 0.827409
+0.797511 0.603304 -0.353351 0.935491
+-0.690852 -0.722997 0.646045 -0.763299
+-0.622325 -0.782759 -0.364627 0.931154
+-0.653093 0.757278 -0.462022 0.886869
+-0.978063 -0.208309 -0.534783 0.844989
+-0.879727 -0.475479 0.755298 -0.655382
+0.656177 0.754607 -0.775981 -0.630757
+0.143206 0.989693 -0.23073 -0.973018
+0.684001 -0.729481 0.997202 -0.0747599
+0.597961 -0.801525 0.302361 0.953193
+-0.360535 -0.932746 0.685898 0.727698
+0.971193 -0.238295 0.478596 0.878035
+-0.452998 -0.891512 -0.9938 -0.111181
+-0.65512 -0.755525 -0.680383 -0.732857
+-0.986811 -0.161876 -0.851923 -0.523667
+0.982464 -0.186452 0.995526 0.0944893
+0.481835 0.876262 0.999956 -0.00932831
+-0.334012 0.942569 -0.876676 0.481081
+-0.0741144 0.99725 0.422082 0.906558
+-0.449017 0.893523 -0.848626 0.528993
+0.4779 -0.878414 0.905076 -0.42525
+0.832816 0.55355 -0.516407 0.856343
+0.940445 -0.339945 -0.991782 0.127938
+0.203443 0.979087 -0.066963 -0.997755
+0.96598 -0.258617 0.517975 -0.855396
+-0.965603 0.26002 0.38873 -0.921352
+-0.248713 0.968577 0.999997 0.00241246
+0.972131 -0.23444 0.102076 0.994777
+-0.713021 0.701143 -0.667548 -0.744567
+-0.055831 0.99844 0.766654 -0.642061
+0.914958 -0.403549 -0.765761 0.643125
+-0.991644 0.129001 0.932414 -0.361391
+0.76044 -0.649408 0.00520863 -0.999986
+-0.885283 -0.465052 -0.319631 -0.947542
+0.549946 -0.8352 -0.110289 0.9939
+-0.879036 0.476756 0.842193 0.539177
+0.557686 0.830052 -0.862418 -0.506196
+0.99111 -0.133046 0.712491 -0.701681
+-0.597725 -0.801701 0.33031 -0.943872
+0.986965 0.160936 -0.897848 -0.440305
+0.486006 -0.873956 0.884268 0.46698
+-0.532283 0.846567 0.913413 -0.407034
+0.996883 -0.0788889 -0.0431036 -0.999071
+-0.999301 -0.0373801 -0.826866 -0.562399
+0.988311 -0.15245 -0.919768 -0.392462
+-0.996506 -0.0835227 -0.486459 0.873703
+-0.988747 0.149597 -0.770026 -0.638013
+0.609789 0.792564 -0.923389 -0.383865
+0.41157 -0.911378 0.00614556 -0.999981
+-0.075905 -0.997115 0.253382 -0.967366
+-0.98198 0.188986 0.986674 -0.162708
+-0.603878 -0.797077 -0.41968 -0.907672
+0.488738 -0.87243 0.69755 0.716536
+-0.859253 0.51155 -0.957749 0.287604
+0.657552 -0.753409 -0.877532 0.479519
+0.246486 -0.969146 0.974235 -0.225534
+0.696685 -0.717378 -0.107322 0.994224
+0.566193 0.824273 -0.878686 0.4774
+0.0124102 -0.999923 0.323802 0.946125
+0.00623378 0.999981 0.811909 -0.583784
+-0.854598 0.51929 -0.367127 0.930171
+-0.392163 -0.919896 -0.856432 -0.51626
+-0.13518 -0.990821 0.546061 -0.837746
+-0.312639 0.949872 0.928246 0.371967
+-0.0806236 0.996745 -0.215435 0.976518
+-0.901876 -0.431996 0.772411 0.635124
+-0.178035 -0.984024 0.581206 0.813757
+-0.872313 0.488948 0.680105 -0.733115
+-0.951333 -0.308165 0.99599 -0.0894666
+-0.682477 0.730907 0.960061 -0.279792
+-0.939631 0.342188 -0.933425 0.358772
+-0.731676 0.681653 0.922501 0.385995
+-0.255491 -0.966812 0.763047 -0.646343
+-0.909708 0.415248 0.398673 0.917093
+0.756645 -0.653826 -0.545701 -0.83798
+-0.399895 -0.916561 -0.955491 0.295019
+0.941212 -0.337816 -0.995205 -0.0978067
+-0.65032 0.759661 -0.114437 0.99343
+0.482582 -0.875851 0.995538 0.0943627
+0.0794969 -0.996835 -0.103921 0.994586
+0.806832 0.590782 0.932015 0.36242
+-0.308361 0.951269 0.997625 -0.0688767
+-0.842561 0.538602 0.946371 -0.323082
+0.909745 -0.415167 0.39044 0.920628
+-0.221662 -0.975124 -0.935666 0.352888
+-0.14824 0.988951 -0.675546 0.737318
+-0.178118 -0.984009 0.588013 0.808851
+-0.85396 -0.520339 -0.250433 -0.968134
+-0.899098 0.437747 0.241597 -0.970377
+-0.986144 0.165893 -0.574874 0.818242
+0.515005 -0.857187 -0.76851 -0.639838
+0.541051 -0.84099 0.813919 0.580979
+0.539333 0.842092 0.914766 -0.403985
+-0.918937 -0.394403 -0.955674 0.294426
+0.629679 0.776856 0.539412 0.842042
+-0.882834 0.469685 0.197426 0.980318
+0.658387 0.75268 -0.92517 -0.379554
+0.652339 -0.757927 -0.371708 0.92835
+0.540456 -0.841373 0.852956 0.521983
+-0.394395 -0.918941 -0.955417 -0.29526
+0.108767 0.994067 -0.0971167 0.995273
+-0.219921 0.975518 -0.983443 -0.181215
+0.914968 0.403526 -0.767405 -0.641163
+0.933287 -0.359133 0.569183 0.822211
+-0.205018 -0.978758 -0.225881 -0.974155
+0.956142 -0.292905 -0.118508 0.992953
+-0.702383 -0.711799 -0.786417 -0.617695
+-0.523606 -0.851961 0.129519 0.991577
+-0.39929 0.916825 -0.972868 -0.231361
+-0.962387 0.271682 -0.724621 -0.689148
+-0.890889 0.45422 -0.999668 0.0257726
+-0.863803 0.50383 -0.822878 -0.568218
+0.0383203 -0.999266 -0.770366 -0.637602
+0.505985 -0.862542 -0.93773 0.347365
+-0.576667 0.816979 0.201833 -0.97942
+-0.982902 0.184132 0.945807 0.324729
+0.778005 0.628258 0.377361 -0.926066
+0.90663 0.421927 0.910885 -0.41266
+0.935169 0.354201 0.0775195 -0.996991
+-0.974521 -0.224296 -0.807463 -0.589918
+-0.964062 -0.265677 -0.185988 0.982552
+0.785233 -0.6192 -0.697487 0.716597
+-0.715896 0.698207 -0.31448 -0.949264
+-0.296226 -0.955118 0.2268 0.973941
+-0.965795 0.259307 0.455586 -0.890192
+-0.99319 -0.116502 0.629686 -0.77685
+0.710123 0.704077 -0.909996 0.414618
+-0.831042 -0.55621 -0.75937 0.650659
+-0.736197 0.676767 0.48713 0.87333
+0.976181 -0.216956 -0.992609 -0.121353
+-0.183365 0.983045 0.917628 -0.39744
+-0.752826 -0.658219 -0.91651 0.400012
+-0.00303874 0.999995 0.954184 0.299219
+-0.564457 0.825462 -0.959016 -0.283353
+-0.938991 -0.343943 -0.850556 -0.525884
+0.979377 -0.202043 0.0759539 -0.997111
+-0.297919 0.954591 0.395007 -0.918678
+0.414713 0.909952 0.344056 0.938949
+-0.68494 -0.7286 0.99855 -0.0538309
+-0.756237 -0.654298 -0.596836 0.802363
+-0.646332 -0.763056 0.397764 -0.917488
+0.94115 0.337989 -0.996831 0.0795485
+0.982895 0.184169 0.94704 -0.321115
+-0.787264 0.616617 -0.891415 0.453187
+0.767737 -0.640765 0.907126 -0.42086
+-0.717265 0.6968 -0.123363 -0.992362
+0.660264 -0.751034 -0.99027 0.13916
+0.999869 -0.0161817 -0.0474296 -0.998875
+-0.944293 0.329107 -0.521877 -0.853021
+0.883475 -0.468478 0.0619755 0.998078
+-0.978023 -0.208498 -0.550956 0.834534
+0.997793 -0.0664027 0.9352 -0.354119
+0.403653 -0.914912 -0.758447 -0.651735
+0.845737 -0.533599 0.965458 0.260558
+-0.358995 -0.93334 0.556995 0.830516
+-0.152602 0.988288 -0.925707 0.378242
+-0.902144 0.431436 0.81035 -0.585947
+0.402212 -0.915546 -0.85121 -0.524826
+0.676514 -0.73643 0.456847 -0.889545
+0.372174 -0.928163 0.90647 0.42227
+0.193999 -0.981002 0.78123 0.624243
+0.599895 0.800079 0.0656752 -0.997841
+-0.891117 0.453773 -0.999702 -0.0244157
+0.980408 0.196979 0.558652 0.829402
+-0.99905 0.04358 -0.345725 0.938336
+0.992823 -0.119595 0.837463 0.546494
+0.999987 -0.0051673 0.869438 -0.494042
+0.256035 -0.966668 0.725465 0.688259
+0.520562 0.853824 -0.224995 0.97436
+-0.688695 -0.725051 0.841583 -0.540128
+-0.826112 0.563506 -0.985217 0.171309
+0.31506 -0.949072 0.804468 0.593996
+-0.403107 -0.915153 -0.795949 0.605363
+-0.915761 0.401723 -0.87803 0.478605
+0.337179 0.941441 -0.986307 -0.164922
+-0.895878 -0.4443 -0.467253 0.884124
+0.376923 -0.926245 0.583265 0.812282
+0.92968 0.368367 0.99966 0.0260631
+-0.90295 -0.429745 0.90529 0.424794
+-0.0510917 0.998694 0.388501 -0.921448
+0.993921 -0.110092 0.0359412 0.999354
+0.793505 0.608563 -0.85328 0.521453
+0.015337 0.999882 0.0370234 -0.999314
+0.300475 -0.95379 0.624054 -0.781381
+0.995826 0.091271 -0.959675 0.281113
+0.927724 -0.373267 0.850568 -0.525865
+0.896766 0.442506 -0.282139 0.959373
+-0.937756 0.347295 -0.612955 0.790118
+0.0313986 -0.999507 -0.999999 0.0012208
+0.932549 -0.361043 0.724511 0.689263
+-0.0266622 0.999644 -0.889268 0.457386
+-0.974427 -0.224706 -0.781992 -0.623289
+0.848294 0.529525 0.735357 -0.67768
+-0.429852 -0.902899 0.900171 -0.435537
+-0.911073 -0.412245 0.0800962 -0.996787
+-0.870565 -0.492053 0.38166 0.924303
+-0.53475 -0.845011 0.991878 0.127192
+-0.913191 -0.407532 -0.422816 -0.906216
+-0.698547 0.715564 -0.359279 0.93323
+0.44312 -0.896462 -0.347098 0.937829
+0.333429 0.942775 -0.845307 -0.53428
+0.173853 -0.984772 0.194096 -0.980982
+-0.711198 -0.702992 -0.836296 0.548278
+0.728376 -0.685178 0.996256 -0.0864579
+0.236398 0.971656 0.29908 0.954228
+0.422024 -0.906585 0.915267 -0.402847
+-0.95696 0.290218 -0.389064 0.921211
+0.989095 0.147277 -0.600659 0.799505
+0.726303 -0.687374 0.925456 -0.378855
+0.988808 0.149196 -0.74354 0.668691
+-0.197619 0.980279 0.503346 0.864085
+0.646214 -0.763156 0.411873 0.911241
+0.693829 0.72014 0.285756 -0.958302
+-0.983194 -0.182562 0.882128 -0.47101
+-0.533719 -0.845662 0.969058 0.246834
+0.625205 0.780461 -0.00484233 0.999988
+-0.980277 0.197628 0.502622 -0.864506
+-0.104411 -0.994534 -0.510216 0.860047
+-0.85734 -0.514751 -0.78714 -0.616774
+0.166751 0.985999 -0.501566 0.865119
+-0.456438 -0.889755 -0.962455 0.271441
+0.537427 -0.843311 0.982083 0.188451
+0.059073 -0.998254 0.93144 -0.363895
+0.0839539 -0.99647 -0.523798 0.851842
+-0.992439 -0.122743 0.966119 -0.258096
+-0.465345 0.885129 -0.288121 -0.957594
+-0.563404 0.826182 -0.987273 -0.159034
+0.426987 0.904258 0.9911 -0.133117
+0.785667 -0.618649 -0.745964 0.665986
+-0.197622 -0.980278 0.503122 -0.864216
+0.999839 0.0179166 -0.219168 0.975687
+0.845212 0.534432 0.986392 -0.164409
+-0.999707 0.0241881 -0.750126 -0.661294
+-0.698489 -0.715621 -0.351659 -0.936128
+0.981812 -0.189853 0.968484 -0.249074
+-0.259831 -0.965654 0.406678 -0.913572
+-0.94355 0.33123 -0.698979 -0.715143
+-0.884457 0.466622 -0.147352 0.989084
+-0.114779 -0.993391 0.486131 0.873886
+-0.457624 0.889146 -0.91781 -0.397021
+-0.944176 0.329442 -0.55183 -0.833957
+0.996483 0.0837982 -0.510419 0.859926
+0.382833 0.923817 -0.0162391 -0.999868
+-0.892341 -0.451362 -0.956872 0.290511
+-0.964438 -0.264309 -0.0452214 0.998977
+0.576911 -0.816807 0.231065 -0.972938
+-0.205625 -0.978631 -0.285875 -0.958267
+0.997651 0.0684968 0.840893 0.541202
+-0.872578 -0.488475 0.718879 0.695135
+-0.32746 0.944865 -0.366011 0.930611
+0.0988214 0.995105 -0.889968 0.456023
+-0.0363451 0.999339 -0.880577 -0.473903
+0.620829 0.783946 -0.534827 0.844962
+0.999205 -0.039865 -0.663007 0.748613
+0.99276 0.120115 0.864935 -0.501884
+-0.519911 -0.854221 -0.298626 0.95437
+-0.429689 0.902977 0.907894 0.4192
+-0.658562 0.752527 -0.933744 0.357942
+0.550441 -0.834874 -0.168925 0.985629
+0.221033 0.975266 -0.956438 0.291936
+0.867832 0.496858 -0.160447 0.987044
+0.56531 -0.824878 -0.924642 -0.380836
+-0.334393 0.942434 -0.895426 0.445211
+-0.879596 -0.475721 0.773083 -0.634305
+-0.985163 0.17162 -0.0313527 0.999508
+-0.149387 0.988779 -0.756315 0.654207
+-0.230836 0.972993 -0.265088 -0.964224
+0.872705 -0.488248 0.736706 -0.676213
+-0.32926 -0.944239 -0.535621 -0.844458
+0.993057 0.117631 0.713754 -0.700396
+0.0347523 0.999396 -0.944627 0.328147
+0.621952 0.783056 -0.408669 0.912682
+0.979707 0.200434 0.237975 0.971271
+-0.909955 0.414707 0.343444 0.939173
+-0.201551 -0.979478 0.1259 -0.992043
+-0.89189 -0.452252 -0.981039 0.193809
+-0.186228 0.982507 0.993115 -0.11714
+-0.917103 0.39865 -0.986634 0.162955
+-0.858818 -0.512281 -0.929838 -0.367968
+0.642428 -0.766346 0.795358 0.60614
+-0.0763551 -0.997081 0.209471 -0.977815
+0.424904 -0.905238 0.995328 -0.0965484
+0.742491 0.669856 -0.413123 -0.910675
+0.734254 -0.678875 0.714185 0.699957
+0.388479 -0.921458 -0.587632 0.809128
+0.656655 0.754191 -0.814378 -0.580335
+-0.961655 -0.274261 -0.881292 0.472572
+0.66513 0.746728 -0.872694 0.488268
+-0.999997 -0.00253077 0.968146 0.250384
+-0.758308 0.651897 -0.316909 -0.948456
+-0.581243 0.81373 0.692134 -0.721769
+-0.866572 -0.499052 -0.402477 0.91543
+0.109056 0.994036 -0.0681791 0.997673
+-0.572523 -0.819888 -0.298416 0.954436
+0.524823 0.851211 0.269514 0.962996
+-0.278035 -0.960571 -0.995045 -0.0994253
+0.896216 -0.443618 -0.398702 -0.91708
+-0.94937 0.314159 0.8571 -0.51515
+-0.711639 -0.702545 -0.800288 0.599616
+-0.71397 -0.700177 -0.560882 0.827896
+-0.979734 0.200303 0.25095 -0.968
+0.67739 -0.735624 0.559211 -0.829025
+0.104223 -0.994554 -0.52639 -0.850243
+-1 -0.000133812 0.99991 0.0133808
+-0.311326 0.950303 0.970656 0.240472
+-0.99515 0.0983696 -0.90975 0.415157
+0.89183 0.452371 -0.983545 0.180665
+-0.875702 -0.482853 0.992142 0.125114
+0.87344 -0.486931 0.829938 -0.557855
+-0.534178 -0.845372 0.981017 0.193924
+-0.932607 0.360892 0.713272 0.700888
+-0.552201 -0.833711 -0.371631 -0.92838
+-0.992238 0.124356 0.995157 0.0983022
+-0.934198 -0.356754 0.343612 -0.939112
+-0.971441 -0.23728 0.384412 -0.923161
+-0.270874 0.962615 -0.664325 0.747444
+-0.344385 -0.938828 -0.824829 0.565382
+0.869115 0.49461 0.0974812 0.995237
+-0.898978 0.437994 0.2148 -0.976658
+0.342008 0.939697 -0.940118 0.340848
+-0.981491 0.191506 0.913046 -0.407856
+0.166115 -0.986106 -0.556251 -0.831014
+0.172583 -0.984995 0.0663535 -0.997796
+-0.297402 -0.954752 0.344656 0.938729
+-0.903602 0.428373 0.959144 -0.282918
+0.929014 -0.370044 0.978757 -0.205022
+-0.83442 0.55113 -0.249616 -0.968345
+-0.619788 0.784769 -0.641872 -0.766812
+-0.765726 0.643167 0.733276 -0.679931
+0.980999 0.194012 0.780399 0.625281
+0.991987 -0.12634 0.994855 -0.101312
+0.62138 -0.78351 -0.474158 -0.88044
+0.807239 -0.590225 0.954782 -0.297306
+-0.0222645 -0.999752 -0.609821 -0.792539
+-0.621484 0.783426 -0.462335 -0.886705
+0.309578 0.950874 0.998259 -0.0589835
+0.120502 0.992713 0.883813 0.46784
+-0.908658 0.417541 0.614924 0.788586
+0.188034 -0.982163 0.997795 0.0663765
+0.588634 0.8084 0.994497 -0.104761
+0.838363 0.545113 0.450325 0.892865
+0.179093 0.983832 0.665177 0.746686
+0.348927 -0.93715 -0.466845 -0.884339
+-0.899643 -0.436625 0.360373 0.932808
+0.183677 -0.982987 0.929784 -0.368105
+-0.561329 0.827593 -0.995849 0.0910222
+0.663992 -0.747739 -0.936627 -0.350329
+-0.986111 0.166085 -0.558793 0.829307
+-0.897195 0.441634 -0.187665 -0.982233
+-0.269409 0.963026 -0.543338 0.839514
+-0.493328 -0.869843 0.242664 -0.97011
+0.796014 -0.605278 -0.571957 -0.820284
+0.904893 0.425639 0.999881 -0.0154584
+-0.941931 0.335805 -0.951871 -0.306499
+-0.814627 -0.579986 0.572895 -0.819629
+-0.999995 0.00302294 0.954656 -0.297711
+-0.750805 0.660524 -0.99449 -0.104834
+0.999388 0.0349863 -0.936687 -0.350168
+0.617413 -0.786639 -0.841055 -0.540949
+0.150084 -0.988673 -0.800515 0.599313
+0.973611 0.228215 -0.512036 -0.858964
+0.513082 -0.85834 -0.891532 -0.452957
+-0.681376 -0.731934 0.90723 0.420635
+0.920635 -0.390425 -0.744258 -0.667892
+-0.86955 -0.493844 0.18469 0.982797
+0.996881 -0.0789225 -0.0464647 -0.99892
+0.656254 0.75454 -0.782357 -0.62283
+0.385463 -0.922723 -0.296561 0.955014
+-0.87287 0.487953 0.759162 -0.650901
+0.864479 -0.502669 -0.739291 -0.673387
+0.972826 -0.231538 -0.194881 0.980827
+-0.997771 -0.0667312 0.923037 0.384712
+0.649364 0.760478 0.0110494 -0.999939
+0.12246 -0.992473 0.958363 -0.285553
+0.868502 0.495686 -0.0262245 0.999656
+0.866813 -0.498634 -0.357809 -0.933795
+0.752623 0.658451 -0.928393 0.371601
+0.947323 -0.320281 0.374771 -0.927117
+-0.771958 0.635673 0.974344 0.225064
+-0.966045 -0.258375 0.539225 0.842161
+0.0532211 0.998583 0.574701 0.818364
+0.933765 0.357887 0.454775 -0.890606
+-0.925374 0.379055 0.382397 -0.923998
+-0.376877 0.926263 0.587283 0.809382
+-0.999723 -0.0235421 -0.705857 0.708354
+0.973681 0.227915 -0.538262 -0.842778
+0.374075 -0.927398 0.801615 0.597841
+0.766147 -0.642665 0.776227 -0.630453
+0.965111 0.261841 0.209069 0.977901
+-0.498569 -0.86685 -0.350801 -0.93645
+-0.520399 -0.853923 -0.243542 0.96989
+0.879886 0.475184 0.732931 -0.680303
+-0.999858 -0.0168237 -0.111421 0.993773
+-0.270427 0.96274 -0.628919 0.777471
+0.995578 0.093941 -0.999859 0.0168034
+0.861119 0.508403 -0.997256 0.0740363
+-0.193602 0.98108 0.805854 0.592114
+0.582469 0.812853 0.792712 0.609596
+0.801045 -0.598604 0.225041 -0.974349
+-0.309731 -0.950824 0.997182 -0.0750207
+0.912128 0.409905 -0.175552 -0.98447
+0.640678 -0.767809 0.911812 0.410608
+0.245591 0.969374 0.949297 0.314381
+0.280579 0.959831 -0.98635 0.164663
+-0.683573 -0.729882 0.991097 0.133141
+-0.267209 0.963639 -0.339168 0.940726
+0.721814 0.692087 0.506686 0.86213
+-0.0338814 -0.999426 -0.969602 0.244686
+0.0555015 0.998459 0.745054 0.667005
+-0.997151 -0.0754248 0.299652 0.954049
+-0.225496 0.974244 -0.728899 -0.684621
+-0.99409 0.108562 -0.11767 0.993053
+-0.904111 -0.427297 0.985956 0.167006
+-0.160624 -0.987016 -0.911318 0.411704
+0.274092 -0.961703 -0.872864 0.487963
+0.893801 0.448463 -0.814243 0.580524
+0.068559 -0.997647 0.837502 0.546434
+-0.789351 -0.613942 -0.991425 -0.130676
+0.972995 -0.230826 -0.266044 0.963961
+0.327392 -0.944889 -0.359263 0.933236
+-0.13865 0.990341 0.225422 0.974261
+-0.703454 -0.710741 -0.870143 -0.492799
+0.737064 -0.675823 0.371569 0.928405
+0.155291 -0.987869 -0.993311 0.115466
+0.874492 -0.485039 0.930386 -0.366581
+0.797292 -0.603594 -0.387117 -0.922031
+0.63596 -0.771722 0.982037 -0.18869
+0.306559 0.951852 0.966813 0.255484
+0.955031 0.296506 0.255194 -0.96689
+0.0474776 -0.998872 0.0371488 -0.99931
+0.810093 -0.586302 0.983255 0.182233
+0.749571 0.661924 -0.996674 -0.0814914
+-0.736526 -0.67641 0.444197 -0.895929
+0.767297 0.641292 0.876111 0.48211
+-0.425021 0.905184 0.996488 -0.0837364
+0.00976966 0.999952 0.559527 -0.828812
+-0.823002 0.568038 -0.750682 0.660664
+-0.933252 0.359223 0.577098 0.816675
+0.999047 -0.0436438 -0.33972 0.940527
+-0.61284 -0.790207 -0.999964 -0.00847829
+0.957688 -0.287809 -0.606219 0.795298
+-0.182762 0.983157 0.891526 -0.452969
+0.695004 0.719006 0.126085 -0.992019
+-0.988836 -0.149006 -0.730524 0.682887
+0.999748 0.0224699 -0.625974 0.779844
+0.881965 -0.471314 0.374013 0.927423
+-0.817 -0.576638 0.198392 -0.980123
+0.0909587 -0.995855 -0.950388 0.311067
+-0.98554 -0.169443 -0.249615 -0.968345
+-0.92804 -0.372481 0.892019 0.451998
+-0.911193 -0.411981 0.0511395 -0.998692
+0.304452 -0.952528 0.887153 -0.461476
+0.388095 0.921619 -0.55344 -0.832889
+-0.950033 0.312149 0.946192 -0.323605
+-0.893694 -0.448678 -0.827934 0.560825
+0.786408 0.617708 -0.820235 -0.572027
+-0.569042 0.822309 -0.664661 -0.747145
+-0.914608 0.404342 -0.707239 0.706974
+-0.346886 0.937907 -0.64687 -0.7626
+-0.787272 0.616606 -0.892024 0.451987
+0.360463 0.932774 0.680213 0.733014
+0.268887 0.963172 -0.497067 -0.867712
+-0.998262 -0.0589236 0.925891 -0.377792
+0.365447 -0.930832 0.958878 -0.28382
+-0.411358 0.911474 -0.0171533 -0.999853
+0.477619 -0.878567 0.891004 -0.453995
+0.934358 0.356336 0.301284 -0.953534
+-0.179203 -0.983812 0.673443 0.739239
+-0.130137 0.991496 0.884964 0.46566
+0.949019 0.315218 0.794472 0.6073
+-0.667593 0.744527 -0.667152 -0.744922
+0.160731 0.986998 -0.90682 0.421518
+-0.483353 0.875426 0.983381 0.181553
+-0.999299 0.0374467 -0.823095 0.567904
+-0.011868 -0.99993 0.374605 -0.927185
+-0.502901 0.864344 -0.757154 0.653237
+-0.863698 0.50401 -0.834536 -0.550953
+-0.566901 0.823786 -0.834436 -0.551104
+0.815018 0.579436 0.516389 -0.856354
+0.93661 -0.350374 -0.325201 0.945645
+0.832952 -0.553346 -0.495235 -0.868759
+-0.503921 -0.863749 -0.828826 -0.559507
+-0.0485891 -0.998819 0.14789 0.989004
+0.833239 0.552913 -0.449496 0.893282
+0.748361 0.663292 -0.965288 -0.261189
+-0.404724 0.914439 -0.677102 -0.735889
+0.313727 0.949513 0.879674 -0.475577
+-0.971279 0.237943 0.446443 0.894812
+0.00041768 -1 0.999128 0.0417559
+-0.999383 -0.0351257 -0.93171 -0.363204
+0.617944 -0.786222 -0.802681 -0.596408
+0.932924 -0.360073 0.649012 0.760778
+-0.234889 -0.972022 0.147966 0.988992
+-0.663197 0.748445 -0.968513 -0.248962
+0.00576732 -0.999983 0.838248 0.54529
+0.982596 0.185754 0.986309 -0.164909
+0.340804 0.940135 -0.975977 0.217874
+0.361719 -0.932287 0.772503 -0.635011
+0.00666269 -0.999978 0.78613 0.618061
+-0.976491 0.215559 -0.965159 -0.261663
+0.637151 -0.770739 0.999375 -0.0353567
+0.740062 0.672538 -0.064061 -0.997946
+-0.369708 -0.929148 0.985521 -0.169551
+0.366756 0.930317 0.989186 0.14667
+-0.764728 -0.644354 0.619466 0.785024
+-0.924695 0.380709 0.211975 -0.977275
+-0.988556 -0.150855 -0.844776 0.535121
+0.985254 0.171096 -0.0844554 -0.996427
+0.210588 -0.977575 -0.71546 0.698653
+-0.71828 -0.695755 0.0220199 0.999758
+0.982746 -0.184958 0.969731 0.244174
+-0.365527 -0.930801 0.961282 0.275565
+-0.239001 0.971019 0.54112 -0.840945
+-0.23249 -0.972599 -0.0980746 0.995179
+0.210081 -0.977684 -0.67825 0.734831
+-0.822928 0.568145 -0.741982 0.67042
+0.983476 0.181036 0.798748 -0.601666
+0.994232 -0.107251 -0.247171 0.968972
+0.664107 -0.747638 -0.931152 -0.364631
+0.181447 -0.983401 0.823174 -0.567789
+-0.997386 0.0722621 0.582226 -0.813027
+-0.177429 -0.984134 0.52995 0.848029
+-0.18482 -0.982772 0.966212 0.25775
+0.304516 0.952507 0.890228 0.455516
+0.85424 0.519879 -0.302136 -0.953265
+-0.983822 0.179149 0.669376 0.742924
+0.122284 0.992495 0.953158 0.302473
+-0.197628 0.980277 0.50257 0.864537
+-0.188849 0.982006 0.98886 0.14885
+0.993288 -0.115669 0.562359 0.826893
+-0.0183252 -0.999832 -0.258843 -0.965919
+0.636545 0.77124 0.993504 0.113794
+0.812887 0.582422 0.789169 -0.614176
+-0.922217 0.386673 -0.418868 -0.908047
+-0.484041 0.875045 0.96607 0.25828
+-0.246351 -0.969181 0.971006 0.239056
+0.705559 -0.708651 -0.976201 0.216866
+0.610507 -0.792011 -0.954324 0.298775
+-0.0768955 -0.997039 0.156195 -0.987726
+-0.544177 -0.83897 0.546919 -0.837185
+-0.98956 0.144122 -0.319717 -0.947513
+-0.259979 -0.965614 0.392644 -0.919691
+-0.582003 0.813187 0.756443 -0.65406
+0.0965605 -0.995327 -0.969812 -0.243854
+-0.878713 0.477351 0.876749 0.480949
+0.672773 0.739849 -0.0324336 0.999474
+0.486028 0.873943 0.883068 -0.469246
+-0.950611 0.310385 0.989672 -0.143353
+0.748242 0.663426 -0.960446 -0.278468
+0.976167 0.217019 -0.993372 0.114945
+0.132747 0.99115 0.733277 -0.67993
+-0.794226 -0.607622 -0.785598 0.618737
+0.0403755 -0.999185 -0.623914 -0.781493
+0.94954 -0.313645 0.883753 -0.467954
+0.33691 -0.941537 -0.981206 0.192964
+0.553946 -0.832553 -0.556463 0.830873
+-0.87799 0.47868 0.939217 0.343324
+0.975669 0.219247 -0.993611 -0.112863
+0.706657 0.707556 -0.997981 -0.0635105
+-0.304259 -0.952589 0.87765 0.479301
+0.994481 0.104921 -0.465441 -0.885079
+0.694488 -0.719505 0.196974 0.980409
+0.541 -0.841023 0.817408 0.576059
+0.747292 0.664496 -0.910906 -0.412615
+-0.362255 0.932079 0.807751 -0.589524
+0.474066 0.880489 0.640889 0.767634
+0.459921 -0.88796 -0.785857 -0.618408
+0.404926 0.91435 -0.66068 0.750668
+0.986778 0.162079 -0.840965 -0.541089
+-0.920697 -0.390279 -0.733565 0.67962
+0.546761 -0.837289 0.26711 0.963666
+-0.999835 -0.01817 -0.243818 0.969821
+-0.137497 0.990502 0.337011 0.941501
+0.362656 0.931923 0.832349 0.554252
+-0.11463 0.993408 0.472952 -0.881088
+-0.351996 -0.936001 -0.15734 0.987545
+-0.445498 0.895283 -0.580957 0.813934
+-0.923896 0.382645 0.00420162 -0.999991
+0.625132 0.780519 -0.0141466 0.9999
+-0.927294 0.374334 0.784632 -0.619962
+-0.984918 0.173022 0.110771 0.993846
+-0.690627 0.723212 0.669488 0.742823
+0.963935 0.266139 -0.232811 0.972522
+0.133115 0.991101 0.707572 -0.706641
+-0.428946 0.90333 0.939269 0.343182
+0.575339 -0.817915 0.0407737 -0.999168
+0.898882 0.438191 0.193392 0.981122
+-0.0557953 -0.998442 0.764355 0.644795
+0.740666 -0.671874 -0.153282 0.988182
+0.325157 0.94566 -0.13069 -0.991423
+-0.934129 0.356935 0.361786 0.932261
+0.807071 -0.590454 0.945963 -0.324274
+0.906224 0.422797 0.946257 -0.323415
+-0.205173 0.978726 -0.241311 0.970448
+0.995472 0.0950548 -0.995483 -0.0949355
+-0.722365 0.691512 0.573679 -0.81908
+-0.959023 0.283328 -0.899602 0.436711
+0.542243 -0.840222 0.723599 0.690221
+-0.924788 -0.380483 0.235839 0.971792
+-0.992264 0.124145 0.992833 0.119506
+-0.827162 0.561963 -0.999894 -0.0145497
+-0.824212 0.566282 -0.873488 0.486845
+0.994356 -0.106095 -0.35797 0.933733
+-0.442893 -0.896574 -0.323277 -0.946305
+-0.826636 -0.562737 -0.996882 -0.0789076
+-0.0085872 0.999963 0.653399 0.757014
+-0.683298 0.730139 0.985382 -0.170358
+0.872073 -0.489376 0.643371 -0.765555
+-0.374697 -0.927147 0.759753 -0.650212
+-0.997039 -0.0768934 0.156402 0.987694
+-0.625478 0.780242 0.0301942 -0.999544
+0.529463 0.848333 0.730369 0.683052
+0.744192 -0.667966 -0.628972 0.777428
+-0.810573 0.585638 0.965049 0.26207
+-0.770304 0.637677 0.999462 -0.0327999
+0.284175 0.958772 -0.857573 0.514362
+0.0126481 0.99992 0.3012 -0.953561
+-0.971836 0.235656 0.225468 0.974251
+0.941423 -0.337227 -0.987149 -0.159804
+0.681188 0.732109 0.896124 0.443804
+-0.53885 -0.842402 0.936428 -0.350859
+-0.759042 0.651041 -0.208158 -0.978095
+0.982044 0.188654 0.991614 0.129233
+-0.132154 -0.991229 0.772629 -0.634857
+-0.481455 -0.876471 0.999421 0.034019
+0.959664 0.281148 -0.974867 -0.222789
+0.780911 0.624643 -0.0767572 -0.99705
+0.710056 0.704146 -0.913938 0.405854
+0.756598 -0.65388 -0.551639 -0.834083
+-0.484511 -0.874785 0.950823 -0.309735
+-0.791979 -0.610549 -0.95589 0.293725
+-0.258373 0.966045 0.539445 0.842021
+0.894714 0.446639 -0.679739 0.733454
+-0.852285 -0.523078 0.0679193 -0.997691
+0.980563 -0.196204 0.622418 -0.782685
+-0.488263 -0.872696 0.735495 -0.67753
+0.530377 -0.847762 0.799644 -0.600474
+-0.526761 0.850014 0.479983 -0.877278
+-0.852878 -0.522111 -0.0454903 -0.998965
+-0.984731 -0.174084 0.217096 -0.97615
+0.590561 -0.806993 0.941552 0.336868
+0.940829 -0.338882 -0.999883 0.0153063
+-0.373697 -0.927551 0.825322 -0.564662
+-0.0995524 -0.995032 -0.854101 0.520108
+-0.564148 0.825674 -0.968947 -0.247267
+0.879338 0.476199 0.806357 -0.591429
+0.925719 -0.378212 0.464929 -0.885348
+-0.832743 -0.55366 -0.527632 0.849473
+-0.966792 -0.255566 0.758008 0.652245
+0.74395 -0.668235 -0.600436 0.799673
+-0.161915 -0.986805 -0.849823 0.527068
+0.305667 0.952139 0.938666 0.344827
+-0.129641 0.991561 0.907141 0.420826
+0.0271571 -0.999631 -0.910811 0.412823
+0.903392 -0.428815 0.944157 -0.329495
+0.931491 -0.363766 0.8923 0.451442
+0.307106 -0.951675 0.979892 -0.199528
+0.973325 0.229431 -0.400995 -0.91608
+0.917554 0.397611 -0.998727 -0.0504457
+-0.389926 -0.920846 -0.70697 -0.707244
+-0.270883 -0.962612 -0.665017 -0.746828
+-0.483922 -0.875111 0.96949 -0.24513
+0.990325 -0.138764 0.214142 -0.976802
+0.187577 -0.98225 0.999802 0.0198898
+-0.0453115 0.998973 -0.178717 -0.983901
+0.94385 -0.330373 -0.631243 -0.775585
+-0.948793 0.315899 0.748825 -0.662767
+0.822859 0.568246 -0.733717 -0.679455
+-0.216362 0.976313 -0.98339 0.181508
+0.974139 0.225951 -0.696146 -0.717901
+-0.711371 -0.702816 -0.822537 0.568711
+0.660103 0.751175 -0.987056 -0.160374
+0.993069 -0.117537 0.707052 0.707161
+-0.386061 0.922473 -0.357728 0.933826
+0.681729 -0.731605 0.926457 -0.376401
+-0.463191 0.886259 -0.510239 -0.860033
+-0.778758 0.627324 0.263835 0.964568
+0.354388 -0.935098 0.0974915 -0.995236
+0.876405 -0.481575 0.999793 0.0203465
+0.91322 -0.407468 -0.429146 0.903235
+-0.361218 -0.932481 0.737326 0.675537
+-0.617124 -0.786866 -0.860371 0.509668
+0.667107 0.744962 -0.714284 0.699855
+0.971441 -0.237282 0.384576 0.923093
+-0.803335 0.595527 0.573233 -0.819392
+0.92211 0.386928 -0.443797 0.896127
+0.818573 -0.574403 -0.0735664 0.99729
+0.32004 0.947404 0.398214 -0.917292
+0.808739 0.588167 0.998885 0.047212
+0.979474 -0.201572 0.123782 -0.992309
+0.747622 -0.664125 -0.930275 0.366864
+0.347103 -0.937827 -0.629016 -0.777392
+-0.650387 -0.759603 -0.12324 -0.992377
+0.648232 -0.761443 0.159142 0.987256
+-0.856072 -0.516856 -0.61343 -0.789749
+0.788293 -0.6153 -0.954375 0.29861
+0.360274 -0.932847 0.665244 -0.746626
+0.97551 0.219957 -0.982772 -0.184823
+0.998296 -0.0583608 0.903134 0.42936
+0.832801 0.553572 -0.518675 0.854971
+0.900582 0.434686 0.551468 0.834196
+-0.751176 -0.660102 -0.987043 0.160458
+0.133905 0.990994 0.649076 -0.760723
+0.945431 0.325822 -0.199994 0.979797
+0.898926 -0.4381 0.203253 -0.979126
+0.816303 0.577624 0.315005 -0.94909
+-0.726677 0.686979 0.944702 -0.327929
+-0.425215 0.905092 0.998059 -0.0622765
+0.829423 -0.55862 -0.913859 -0.406032
+-0.306031 0.952021 0.951179 -0.30864
+-0.019519 0.999809 -0.372062 0.928208
+-0.820506 -0.571638 -0.399522 -0.916724
+0.937973 -0.34671 -0.661063 0.75033
+-0.757841 0.652439 -0.383853 -0.923394
+-0.932712 -0.360621 0.692575 -0.721346
+-0.547031 0.837112 0.235871 0.971784
+-0.95126 0.308391 0.997832 0.0658188
+-0.970635 0.240558 0.668441 0.743765
+-0.968155 -0.25035 0.985338 0.170615
+-0.950706 -0.310092 0.993611 0.112855
+-0.902222 0.431273 0.820786 -0.571236
+-0.890078 0.455809 -0.979227 0.202765
+-0.620806 0.783964 -0.537265 -0.843413
+0.914389 0.404836 -0.668035 -0.74413
+-0.229904 0.973213 -0.356018 -0.934479
+0.936652 -0.350262 -0.336511 0.94168
+0.969902 -0.243495 0.859761 0.510697
+0.82503 0.565089 -0.934546 -0.355843
+0.990755 -0.135661 0.504757 -0.863261
+0.954039 -0.299684 0.557207 0.830374
+0.374269 0.92732 0.788962 -0.614443
+0.951226 0.308494 0.998487 -0.0549942
+-0.914473 -0.404647 -0.683227 -0.730206
+-0.868853 0.49507 0.0446756 -0.999002
+0.798805 0.60159 -0.145809 0.989313
+-0.99932 0.0368825 -0.853832 0.520549
+-0.995212 -0.097743 -0.93407 -0.357091
+-0.993753 0.111601 0.186678 0.982421
+0.391544 -0.920159 -0.819756 0.572712
+-0.880053 0.474875 0.708617 0.705593
+0.197874 -0.980228 0.480779 0.876842
+0.912342 0.40943 -0.226596 -0.973989
+0.993546 0.113434 0.363725 -0.931506
+-0.154254 -0.988031 -0.975746 -0.218905
+-0.958538 0.284964 -0.812396 0.583106
+-0.885786 -0.464094 -0.420031 -0.90751
+0.911475 0.411356 -0.0174219 -0.999848
+0.823939 -0.566679 -0.849014 0.52837
+0.971416 0.237384 0.394208 -0.919021
+-0.779466 -0.626444 0.153423 -0.988161
+-0.959047 0.283248 -0.903219 0.429179
+-0.97881 0.204773 -0.201418 -0.979505
+0.979324 0.202296 0.0501291 0.998743
+0.373326 -0.9277 0.847244 0.531204
+-0.977912 -0.209015 -0.594325 0.804225
+-0.422028 0.906583 0.915457 -0.402415
+0.0247377 -0.999694 -0.78533 0.619077
+-0.999373 0.0353923 -0.921692 0.387922
+-0.860486 0.509475 -0.998733 0.0503156
+-0.111111 -0.993808 0.138024 0.990429
+-0.942834 0.333262 -0.835693 -0.549196
+-0.794499 -0.607266 -0.757046 0.653361
+0.200892 -0.979613 0.192283 0.98134
+0.99705 0.0767565 0.169942 0.985454
+0.990942 0.134291 0.618888 0.78548
+0.749799 -0.661666 -0.998888 0.0471399
+-0.999202 -0.0399306 -0.658079 -0.752948
+-0.973071 -0.230506 -0.297596 -0.954692
+-0.671273 0.74121 -0.232782 -0.972529
+-0.427974 0.903791 0.970688 0.240344
+0.965816 -0.25923 0.462743 -0.886493
+0.593728 0.804666 0.740837 -0.671684
+-0.760498 0.649341 0.0141386 -0.9999
+0.988987 -0.148 -0.657462 -0.753488
+0.70345 -0.710745 -0.869905 0.49322
+0.543928 -0.839132 0.571561 0.820559
+-0.944717 -0.327887 -0.407642 0.913142
+0.933546 -0.358458 0.508301 0.86118
+-0.0273554 -0.999626 -0.918823 -0.39467
+-0.839878 -0.542775 0.678501 0.7346
+-0.952221 -0.305409 0.928969 -0.370158
+0.309377 0.950939 0.999283 -0.0378666
+0.933226 0.359289 0.582882 -0.812557
+-0.870751 -0.491725 0.416261 0.909245
+0.997685 0.0680008 0.866751 0.498741
+-0.837517 -0.546412 0.307058 0.951691
+0.813271 -0.581886 0.746963 0.664866
+0.0926605 -0.995698 -0.989445 0.144909
+0.856331 0.516428 -0.652195 -0.758051
+-0.403352 0.915045 -0.77947 -0.62644
+-0.999828 0.0185458 -0.280089 -0.959974
+-0.979484 -0.201523 0.128716 0.991681
+0.876138 -0.482061 0.999386 -0.0350315
+-0.18269 0.983171 0.888204 -0.459449
+-0.961126 -0.27611 -0.955382 0.295373
+0.932938 -0.360036 0.646024 0.763317
+0.513549 0.85806 -0.865558 0.500809
+0.949334 0.314269 0.851118 0.524975
+-0.990806 0.135293 0.536478 -0.843914
+-0.980735 -0.195345 0.688537 0.725201
+-0.690324 0.723501 0.699995 0.714148
+-0.921864 0.387514 -0.499873 -0.866099
+-0.425102 -0.905145 0.9972 0.0747763
+0.0551913 -0.998476 0.723973 -0.689828
+-0.854359 0.519683 -0.323947 0.946075
+-0.942365 -0.334586 -0.90435 0.426791
+-0.807833 -0.589411 0.97984 0.199784
+0.977525 -0.21082 -0.731846 -0.68147
+-0.999676 0.0254467 -0.827226 -0.56187
+-0.567092 0.823654 -0.821451 -0.570279
+-0.93543 -0.353513 0.00404899 -0.999992
+0.959685 0.281079 -0.976448 -0.215755
+-0.958691 -0.28445 -0.842456 -0.538765
+-0.745954 -0.665997 -0.81019 -0.586167
+-0.697433 -0.71665 -0.210282 -0.977641
+-0.937129 -0.348984 -0.461496 -0.887142
+0.260841 0.965382 0.309074 -0.951038
+-0.98421 -0.177005 0.492926 -0.870071
+-0.434317 0.90076 0.58518 0.810903
+-0.275184 0.961392 -0.922512 0.385968
+0.55895 -0.829201 -0.929268 0.369406
+0.417537 -0.90866 0.614543 -0.788883
+0.463281 -0.886212 -0.5015 -0.865158
+0.0899918 -0.995943 -0.915757 0.401733
+0.817088 0.576513 0.183388 -0.983041
+-0.689963 0.723844 0.734668 0.678427
+-0.274619 -0.961553 -0.898251 -0.439484
+-0.0750681 0.997178 0.333582 0.942721
+-0.882487 0.470336 0.269131 0.963103
+0.402185 0.915558 -0.852778 0.522273
+0.268415 -0.963303 -0.453978 0.891013
+0.268913 -0.963164 -0.499407 0.866367
+-0.725552 -0.688168 0.878621 0.47752
+-0.986033 0.166547 -0.519334 0.854571
+-0.946855 -0.321662 0.236087 0.971732
+0.977511 0.210886 -0.736396 0.67655
+0.984928 0.172965 0.104936 -0.994479
+0.57531 0.817936 0.0371914 0.999308
+1 6.70104e-05 0.999978 0.00670099
+-0.98901 -0.147845 -0.645573 0.763698
+-0.99995 0.0100113 0.539334 -0.842092
+-0.935406 -0.353575 0.0107501 -0.999942
+-0.907582 -0.419875 0.795141 -0.606425
+0.96149 0.274838 -0.908055 0.418852
+0.46229 0.886729 -0.594843 0.803842
+0.332074 0.943253 -0.76007 -0.649841
+-0.805126 -0.593103 0.790645 0.612275
+-0.735448 0.677582 0.580634 0.814165
+-0.15987 -0.987138 -0.940066 0.340991
+0.883924 -0.467631 -0.0338269 0.999428
+-0.449038 -0.893513 -0.849884 -0.526971
+-0.907896 -0.419196 0.74761 -0.664138
+-0.0558464 -0.998439 0.767644 0.640877
+-0.999872 -0.0160043 -0.0296965 0.999559
+-0.499198 0.866488 -0.417822 0.908529
+0.529982 -0.848009 0.770785 -0.637096
+0.70146 -0.712709 -0.699945 0.714197
+0.970263 0.242052 0.774593 -0.632461
+0.805831 0.592145 0.857724 0.514111
+-0.283816 0.958879 -0.876223 -0.481907
+0.168613 0.985682 -0.330238 0.943898
+0.786713 -0.617319 -0.847467 0.530847
+0.847236 0.531217 0.8551 -0.518463
+0.555977 -0.831197 -0.740884 0.671633
+-0.672912 0.739722 -0.0135287 -0.999908
+-0.631337 -0.775508 0.705685 0.708526
+0.718761 -0.695257 0.0911913 -0.995833
+-0.790716 0.612183 -0.995808 -0.0914724
+0.271102 -0.962551 -0.68179 0.731548
+0.718808 -0.695209 0.0978627 -0.9952
+0.872535 -0.488552 0.712724 -0.701444
+-0.261452 0.965217 0.248318 0.968679
+-0.918186 0.396149 -0.99409 -0.108555
+-0.997028 0.0770452 0.141342 -0.989961
+-0.516662 0.85619 -0.631219 -0.775605
+-0.775745 -0.631046 0.678589 -0.734519
+-0.40376 -0.914865 -0.750747 0.66059
+0.923787 -0.382907 -0.0241861 -0.999707
+0.998105 -0.0615296 0.992031 0.125996
+-0.838549 0.544827 0.480497 -0.876996
+0.637498 -0.770452 0.999953 0.00964445
+-0.503165 -0.86419 -0.776714 -0.629853
+0.989704 -0.14313 -0.223223 -0.974767
+-0.804851 -0.593476 0.761427 0.648251
+0.48927 0.872133 0.652641 -0.757668
+-0.370038 0.929016 0.978872 0.204475
+-0.92983 0.367989 0.999894 0.0145597
+0.96478 0.263059 0.0843113 0.996439
+-0.583905 0.811822 0.887549 -0.460713
+-0.967189 -0.254057 0.850147 0.526545
+-0.526062 0.850446 0.406315 -0.913733
+-0.898652 -0.438661 0.141763 0.989901
+-0.917734 0.397194 -0.999987 0.00506941
+-0.89747 0.441076 -0.126296 -0.991993
+-0.864245 0.503072 -0.769879 -0.638189
+0.323741 -0.946146 0.0185975 0.999827
+0.908664 0.417528 0.613727 -0.789519
+-0.271422 0.96246 -0.705736 0.708474
+0.323227 0.946322 0.0729368 -0.997337
+0.648232 -0.761443 0.159138 0.987256
+0.474011 0.880519 0.636009 0.771682
+0.744354 0.667786 -0.647592 -0.761987
+0.565476 0.824765 -0.916817 0.399307
+-0.784047 -0.620701 -0.54848 -0.836164
+-0.793591 -0.608452 -0.845869 0.53339
+-0.998315 0.0580301 0.888417 0.459038
+0.21653 0.976276 -0.98637 -0.164542
+-0.236231 0.971697 0.282682 -0.959214
+-0.90001 0.435869 0.437416 -0.899259
+0.276189 0.961103 -0.957778 -0.287509
+-0.331315 -0.94352 -0.705399 -0.70881
+-0.237939 0.97128 0.446068 -0.894999
+0.691607 -0.722274 0.562831 0.826572
+-0.46295 -0.886385 -0.533464 0.845823
+0.767937 -0.640525 0.919832 -0.392312
+0.968301 0.249787 0.993593 0.113016
+0.994775 -0.102091 -0.695142 0.718872
+-0.478345 0.878172 0.925446 -0.378879
+0.868489 0.495709 -0.0288424 0.999584
+-0.497974 0.867192 -0.285779 0.958295
+0.685756 -0.727832 0.986262 0.165186
+-0.878453 0.477829 0.901634 0.4325
+0.827909 -0.560862 -0.98913 -0.147043
+-0.340251 0.940335 -0.987087 -0.160184
+0.577626 -0.816302 0.315164 -0.949037
+-0.433362 0.90122 0.66767 0.744457
+0.77954 0.626352 0.141799 -0.989895
+0.865696 -0.50057 -0.555858 -0.831277
+-0.749765 -0.661705 -0.998628 -0.0523637
+-0.340763 0.940149 -0.976917 -0.213621
+0.180017 -0.983664 0.732226 -0.681062
+0.227247 -0.973837 -0.594728 -0.803927
+-0.881466 0.472247 0.469867 0.882737
+0.913086 -0.407767 -0.399364 0.916792
+-0.782635 0.622481 -0.346018 0.938228
+0.986863 0.161559 -0.868289 -0.496058
+-0.887885 0.460066 -0.775644 0.63117
+-0.777177 -0.629282 0.49568 -0.868505
+-0.390114 0.920767 -0.721275 0.692648
+0.598577 -0.801066 0.228307 0.973589
+0.390156 -0.920749 -0.724455 0.689322
+0.998012 0.0630166 0.999743 0.0226536
+0.635634 0.77199 0.973202 0.229953
+-0.395197 -0.918596 -0.97752 -0.210842
+-0.406172 -0.913796 -0.552488 0.833521
+0.982606 0.1857 0.985395 -0.170281
+-0.153217 -0.988193 -0.947429 -0.319966
+-0.497341 -0.867555 -0.215138 -0.976584
+-0.633101 0.774069 0.847415 -0.530932
+0.356789 -0.934185 0.347159 -0.937806
+1 0.00072987 0.997338 0.0729222
+0.129239 0.991614 0.923476 -0.383657
+0.132959 0.991122 0.718612 -0.695411
+0.828318 -0.560258 -0.975774 -0.218781
+-0.976422 -0.21587 -0.973007 0.230776
+0.885855 0.463963 -0.433491 -0.901158
+0.145954 0.989291 -0.488622 -0.872496
+-0.625949 -0.779864 0.0904726 0.995899
+0.999127 -0.0417813 -0.508153 0.861267
+0.545188 -0.838314 0.442265 0.896885
+0.946488 -0.322738 0.124361 -0.992237
+0.138761 -0.990326 0.214493 0.976725
+-0.692488 -0.721429 0.458002 -0.888951
+-0.681886 0.731459 0.934318 -0.356441
+-0.277121 -0.960835 -0.981115 -0.193423
+0.991042 0.133554 0.675562 0.737303
+-0.791102 0.611685 -0.988074 -0.153982
+0.688099 0.725617 0.883079 -0.469224
+-0.686172 -0.72744 0.975214 -0.221263
+-0.254599 -0.967047 0.819328 -0.573325
+0.993147 -0.116876 0.658444 0.75263
+-0.937503 0.347976 -0.553977 0.832532
+-0.193153 -0.981169 0.832106 -0.554617
+0.721505 0.692409 0.46773 0.883871
+0.690149 0.723668 0.717056 -0.697015
+-0.818135 0.575026 0.00255657 0.999997
+0.580375 0.814349 0.611406 0.791317
+0.609381 -0.792878 -0.902381 0.430939
+0.905759 0.423793 0.97603 -0.217634
+-0.997799 -0.0663158 0.93825 0.345959
+-0.523274 -0.852164 0.0908672 0.995863
+0.905449 0.424454 0.989302 -0.14588
+-0.0631946 -0.998001 0.99918 -0.0404807
+0.775025 -0.631931 0.757832 0.652449
+0.987804 -0.155702 -0.997251 -0.0740947
+-0.153734 0.988112 -0.962867 0.269975
+0.979752 -0.200217 0.259447 -0.965757
+0.298208 0.954501 0.422632 0.906301
+0.866822 -0.498617 -0.355981 -0.934493
+0.970531 -0.240977 0.699936 0.714205
+0.962751 0.270391 -0.625932 0.779877
+0.659515 -0.751691 -0.971509 0.237004
+-0.103974 -0.99458 -0.547451 0.836838
+-0.471626 -0.881799 0.406594 0.913609
+0.100117 0.994976 -0.82322 0.567723
+-0.926814 0.375522 0.698976 -0.715145
+-0.349633 -0.936887 -0.398928 0.916982
+-0.687814 -0.725887 0.900821 -0.434191
+-0.910224 -0.414115 0.281689 -0.959506
+-0.44162 0.897202 -0.186146 0.982522
+-0.52685 0.849959 0.489135 -0.872208
+-0.952386 -0.304894 0.907629 -0.419773
+0.101815 -0.994803 -0.714861 -0.699267
+0.935715 0.352756 -0.0767291 -0.997052
+-0.47604 -0.879424 0.795551 0.605887
+0.790174 -0.612882 -0.999995 -0.00314496
+-0.968385 0.249458 0.996853 -0.0792779
+0.439877 -0.898058 0.00695602 0.999976
+-0.00442387 -0.99999 0.903732 -0.428099
+-0.982843 -0.184446 0.955705 -0.294326
+-0.498464 0.866911 -0.339424 0.940633
+-0.849841 0.527039 0.508448 0.861093
+-0.811626 -0.584178 0.902545 -0.430596
+0.896678 0.442683 -0.301068 0.953603
+-0.325596 0.945509 -0.176501 0.984301
+-0.892685 -0.450682 -0.931969 0.362539
+-0.575271 0.817963 0.0324397 -0.999474
+-0.129696 0.991554 0.904803 0.42583
+0.16397 -0.986465 -0.722449 -0.691424
+-0.0908073 0.995868 -0.945549 0.325479
+0.113068 0.993587 0.329174 0.944269
+0.424594 -0.905384 0.99143 -0.130637
+0.688697 0.725049 0.841469 -0.540305
+0.976446 -0.215762 -0.970407 -0.241476
+-0.998616 0.052597 0.522461 0.852663
+-0.652456 0.757826 -0.385971 0.922511
+-0.82396 0.566648 -0.850981 0.525196
+0.398427 0.9172 -0.990301 0.138936
+0.998865 -0.0476347 0.0528554 0.998602
+0.984646 -0.174563 0.264216 0.964463
+-0.998867 -0.0475844 0.0478324 -0.998855
+-0.485764 0.87409 0.896842 0.442351
+-0.990986 -0.133962 0.644667 0.764464
+-0.149037 0.988832 -0.73266 0.680595
+-0.762878 0.646543 0.372233 -0.928139
+0.35394 0.935268 0.0496869 0.998765
+0.488272 0.872691 0.734797 -0.678288
+0.577474 -0.816409 0.29748 -0.954728
+0.995615 0.0935442 -0.998395 0.0566331
+0.870523 -0.492128 0.373685 -0.927556
+-0.718149 0.695889 0.00330188 -0.999995
+-0.577373 0.816481 0.285608 -0.958346
+-0.480435 0.87703 0.988711 -0.149836
+0.989391 -0.145274 -0.427613 -0.903962
+-0.87916 0.476527 0.827894 0.560885
+-0.672813 -0.739813 -0.0270242 0.999635
+-0.948687 -0.316217 0.726243 0.687438
+0.115973 -0.993252 0.587446 -0.809263
+0.820826 -0.571179 -0.450126 0.892965
+-0.467493 0.883997 -0.0493632 -0.998781
+0.978617 0.205689 -0.29206 0.9564
+0.660325 0.75098 -0.991369 -0.131099
+0.601862 0.7986 -0.179418 -0.983773
+0.524836 0.851203 0.270988 0.962583
+0.806805 0.590818 0.930374 0.366611
+-0.643033 -0.765839 0.745089 -0.666966
+-0.987497 -0.157638 -0.992587 -0.12154
+-0.999561 -0.0296358 -0.984274 0.17665
+0.446226 -0.89492 -0.645196 0.764017
+-0.993885 -0.11042 0.0689066 -0.997623
+-0.989387 0.145305 -0.430434 -0.902622
+-0.488305 0.872673 0.732281 0.681002
+0.57931 -0.815107 0.503098 -0.86423
+0.999934 -0.0114553 0.412536 -0.910941
+-0.790152 -0.612911 -1 -0.000556367
+0.085059 0.996376 -0.614856 -0.788639
+0.36463 0.931152 0.930314 0.366765
+0.149073 -0.988826 -0.735174 0.677879
+0.86257 0.505938 -0.935843 0.352416
+0.275928 0.961178 -0.949592 -0.31349
+-0.356858 -0.934159 0.354047 0.935228
+-0.971531 0.236914 0.349324 0.937002
+-0.944097 -0.329668 -0.571643 0.820502
+0.990732 0.135828 0.490182 0.87162
+-0.926807 0.375539 0.697638 -0.71645
+0.987108 -0.160057 -0.933467 0.358663
+-0.56609 -0.824343 -0.884549 0.466448
+0.998001 -0.0631972 0.99917 -0.0407347
+-0.0444986 -0.999009 -0.258108 0.966116
+-0.935509 -0.353303 -0.0183627 -0.999831
+-0.410693 0.911774 -0.0900075 -0.995941
+0.161938 -0.986801 -0.84861 -0.529019
+-0.352416 -0.935843 -0.112873 0.993609
+-0.975323 0.220783 -0.963631 0.267236
+0.924959 -0.380067 0.279261 -0.960215
+0.268582 -0.963257 -0.469282 0.883048
+0.796248 0.60497 -0.539753 0.841824
+-0.973307 0.229507 -0.393896 0.919155
+-0.29701 0.954874 0.305912 -0.95206
+0.896706 -0.442626 -0.294921 -0.955522
+0.992697 -0.120631 0.889828 0.456295
+0.15511 -0.987897 -0.991025 0.133676
+-0.0515985 0.998668 0.434747 -0.900552
+0.476753 -0.879037 0.842014 -0.539455
+0.143783 -0.989609 -0.287063 0.957912
+0.652866 -0.757474 -0.435248 0.90031
+0.916404 0.400255 -0.943153 -0.332358
+0.973905 -0.226958 -0.618387 0.785874
+-0.651685 -0.75849 -0.290318 -0.95693
+0.587958 0.808891 0.999772 -0.0213476
+0.486874 0.873472 0.833578 -0.552402
+-0.475991 0.87945 0.792161 -0.610312
+-0.762857 -0.646568 0.369247 0.929331
+-0.1717 -0.985149 -0.0232621 0.999729
+-0.591033 0.806647 0.920263 0.3913
+0.949832 0.312761 0.923421 0.383789
+-0.327166 -0.944967 -0.336852 -0.941558
+0.999532 0.0305789 -0.996539 0.0831309
+0.967699 0.252109 0.938288 0.345855
+-0.929472 0.368892 0.996598 -0.0824146
+-0.924268 -0.381745 0.101416 0.994844
+-0.627293 0.778783 0.259999 -0.965609
+0.213506 0.976942 -0.889322 -0.457281
+-0.0315259 0.999503 -0.999934 -0.0115232
+0.439872 -0.898061 0.00750314 0.999972
+0.568788 0.822484 -0.687442 0.72624
+0.954311 0.298816 0.479426 -0.877582
+0.893547 -0.44897 -0.84585 -0.533422
+-0.742371 -0.669989 -0.396747 -0.917928
+-0.568772 0.822496 -0.688849 -0.724905
+0.602523 -0.798101 -0.260237 0.965545
+-0.817771 -0.575544 0.0658097 -0.997832
+0.724319 0.689465 0.779569 0.626317
+0.765949 0.642902 0.756386 0.654125
+-0.895799 0.444459 -0.482873 -0.87569
+0.786446 -0.617659 -0.823742 0.566965
+0.987043 -0.160458 -0.918132 0.396276
+-0.998811 0.0487559 0.164381 0.986397
+0.625741 -0.780031 0.0638275 -0.997961
+-0.764946 -0.644094 0.645759 0.763542
+-0.626697 -0.779263 0.185401 0.982663
+0.985992 0.166791 -0.49807 -0.867137
+0.930556 -0.36615 0.977543 0.210734
+-0.0257663 0.999668 -0.84476 0.535145
+-0.00498106 -0.999988 0.878488 -0.477764
+-0.254636 0.967037 0.817137 0.576443
+-0.337131 0.941458 -0.985452 0.169954
+-0.943326 0.331869 -0.745763 -0.666211
+-0.284088 0.958798 -0.862229 -0.506519
+-0.563591 0.826054 -0.983417 -0.181358
+0.754371 -0.656448 -0.798131 -0.602483
+0.628589 -0.777737 0.416463 -0.909152
+-0.28978 -0.957093 -0.430808 0.902444
+0.802374 0.596822 0.434292 0.900772
+0.757534 0.652796 -0.426912 0.904293
+-0.986994 -0.160758 -0.905651 -0.424025
+-0.0344962 0.999405 -0.952727 -0.303828
+0.527857 0.849333 0.588919 0.808192
+-0.954101 0.299486 0.539861 0.841754
+0.6952 -0.718817 0.0990987 0.995078
+-0.998803 -0.0489161 0.180187 -0.983632
+-0.335848 0.941916 -0.953243 0.302204
+-0.982225 0.187709 0.999442 -0.0333984
+-0.689726 -0.724071 0.756534 -0.653955
+-0.862802 0.505542 -0.918699 -0.394957
+0.796447 -0.604709 -0.51185 -0.859075
+-0.989661 -0.143427 -0.252418 0.967618
+-0.770504 0.637435 0.999999 -0.0014358
+-0.766017 0.642821 0.76325 -0.646104
+-0.731149 0.682218 0.949534 0.313664
+0.999962 0.00867333 0.646854 0.762614
+0.980987 0.194075 0.776409 0.630229
+-0.834695 0.550713 -0.200945 -0.979602
+0.933697 -0.358065 0.47162 0.881802
+-0.219287 0.97566 -0.993144 -0.116901
+0.554864 0.831941 -0.644547 -0.764565
+0.108509 0.994095 -0.12293 0.992415
+-0.844615 -0.535374 0.998563 -0.0535881
+-0.799512 -0.60065 -0.0286826 0.999589
+-0.983963 -0.178372 0.608671 -0.793423
+0.918265 -0.395966 -0.991723 -0.128398
+-0.997424 0.0717252 0.625128 -0.780522
+-0.757235 0.653142 -0.467853 -0.883806
+-0.645072 -0.764122 0.543114 -0.839659
+-0.843115 -0.537734 0.974561 0.224123
+-1 0.000457854 0.998952 -0.0457694
+0.513843 0.857884 -0.847907 0.530144
+0.566498 -0.824063 -0.860395 -0.509627
+-0.528246 -0.849091 0.625292 0.780391
+-0.747182 -0.664619 -0.904003 -0.427526
+-0.198521 -0.980097 0.421854 -0.906664
+0.48608 0.873915 0.880287 -0.474442
+0.876955 -0.480572 0.990935 0.134343
+0.378966 0.925411 0.391338 -0.920247
+0.297514 -0.954717 0.355703 -0.934599
+-0.513689 0.857977 -0.857312 -0.514797
+0.86143 0.507877 -0.990867 0.134841
+-0.431371 0.902175 0.814549 0.580095
+-0.151105 -0.988518 -0.85805 -0.513566
+-0.986343 0.164703 -0.669158 0.74312
+-0.300084 -0.953913 0.591487 0.806314
+-0.142526 -0.989791 -0.163381 -0.986563
+-0.999554 -0.0298528 -0.987876 0.155242
+0.77581 0.630966 0.671011 -0.741448
+-0.487485 -0.873131 0.792899 -0.609353
+0.248315 -0.968679 0.999251 -0.0386942
+-0.0944582 0.995529 -0.999383 -0.0351334
+0.815079 -0.57935 0.507259 0.861793
+-0.728336 0.68522 0.995742 -0.0921869
+0.673484 -0.739201 0.0637839 -0.997964
+-0.905347 0.424672 0.992521 0.122077
+-0.397482 0.91761 -0.999336 -0.0364271
+-0.61873 0.785603 -0.73906 -0.673639
+0.40819 -0.912897 -0.356462 -0.93431
+0.957571 -0.288199 -0.57334 0.819318
+0.944106 -0.329641 -0.569281 -0.822143
+-0.407772 0.913084 -0.398851 -0.917016
+0.739282 0.673396 0.0517824 -0.998658
+0.263189 -0.964744 0.07082 0.997489
+0.990695 -0.136098 0.466232 -0.884662
+-0.104827 -0.99449 -0.473764 0.880652
+-0.997791 -0.066429 0.934263 0.356585
+0.600495 0.799629 -0.00930283 -0.999957
+-0.569853 -0.821746 -0.587778 0.809022
+-0.316654 -0.948541 0.693759 -0.720207
+0.942075 -0.335402 -0.937868 -0.346993
+0.997766 -0.0667992 0.920392 -0.390998
+0.208966 -0.977923 -0.59031 0.807177
+-0.103793 0.994599 -0.56265 -0.826695
+-0.2168 -0.976216 -0.990545 -0.137186
+-0.0450459 0.998985 -0.204818 -0.9788
+0.979907 -0.199454 0.333775 -0.942653
+-0.93535 0.353723 0.0264941 0.999649
+0.0748482 -0.997195 0.354286 0.935137
+0.886071 0.46355 -0.474961 -0.880007
+0.764816 0.644249 0.630146 0.776477
+-0.947376 -0.320122 0.390205 0.920728
+-0.545174 0.838323 0.44375 0.896151
+0.996631 0.0820181 -0.349515 0.936931
+0.909363 -0.416004 0.473423 0.880835
+0.252523 0.967591 0.92263 -0.385686
+-0.937128 0.348986 -0.461279 0.887255
+0.0202739 0.999794 -0.441022 -0.897496
+-0.916386 -0.400295 -0.941692 -0.336475
+-0.0639378 0.997954 0.9934 0.114705
+0.307554 0.951531 0.98819 0.153233
+-0.99712 -0.0758423 0.259457 0.965755
+-0.885144 -0.465318 -0.291032 -0.956713
+-0.413388 0.910555 0.204198 -0.97893
+-0.3356 0.942005 -0.944955 0.327201
+-0.940236 -0.340522 -0.982057 -0.188585
+0.948873 0.315659 0.765355 0.643608
+0.397435 -0.91763 -0.999511 -0.0312653
+-0.292315 -0.956322 -0.179441 0.983769
+-0.281327 -0.959612 -0.970552 0.24089
+-0.99626 -0.0864116 -0.715937 0.698165
+-0.596135 -0.802884 0.509653 -0.86038
+-0.3448 -0.938676 -0.799101 0.601197
+-0.292689 0.956208 -0.140918 -0.990021
+0.860422 -0.509582 -0.998028 0.0627656
+-0.841598 0.540104 0.874021 -0.485888
+-0.942053 -0.335465 -0.94017 0.340705
+0.741496 -0.670957 -0.273951 0.961744
+0.596142 -0.802879 0.508874 0.860841
+-0.405035 0.914301 -0.651695 -0.758481
+0.96804 -0.250795 0.976457 -0.215711
+0.973193 -0.22999 -0.347758 0.937584
+0.676409 -0.736527 0.44406 -0.895997
+-0.317503 0.948257 0.626613 0.779331
+0.988777 -0.149396 -0.756905 -0.653525
+0.308703 -0.951159 0.999454 -0.0330426
+-0.997702 -0.0677564 0.878709 0.477358
+-0.874474 0.485073 0.928988 -0.37011
+0.957222 0.289355 -0.470438 -0.882433
+0.887158 0.461466 -0.666855 -0.745188
+-0.428168 -0.903699 0.96531 -0.261108
+0.0190663 0.999818 -0.329664 -0.944098
+-0.849604 -0.527421 0.546648 -0.837362
+-0.0415172 0.999138 -0.530742 -0.847533
+-0.918271 -0.395952 -0.991523 0.129935
+0.78196 -0.623329 -0.242572 0.970133
+0.379265 -0.925288 0.361387 0.932416
+-0.746337 -0.665569 -0.842494 -0.538706
+-0.261207 -0.965283 0.272785 -0.962075
+-0.995738 -0.0922232 -0.982129 0.188208
+-0.428723 0.903436 0.947453 0.319894
+0.176818 0.984243 0.47639 0.879234
+0.51955 0.85444 -0.338615 0.940925
+0.995857 0.0909282 -0.94943 0.313979
+-0.992894 -0.119002 0.803329 -0.595536
+0.88244 0.470426 0.278889 -0.960323
+-0.887223 0.461341 -0.677263 0.735741
+0.895438 0.445187 -0.552364 0.833603
+0.969961 -0.243261 0.847183 0.531302
+-0.15851 0.987357 -0.977998 -0.208616
+-0.769718 0.638384 0.992245 -0.124297
+0.877953 -0.478748 0.941845 0.336046
+0.0728219 0.997345 0.535702 -0.844407
+-0.0504575 0.998726 0.329246 -0.944244
+0.175223 0.984529 0.328281 0.94458
+0.221004 0.975273 -0.957317 0.289041
+0.934371 0.356303 0.297865 -0.954608
+-0.108112 -0.994139 -0.162439 0.986719
+-0.66634 -0.745648 -0.782358 0.622829
+0.791302 0.611426 -0.982505 0.186237
+0.362849 -0.931848 0.843614 -0.53695
+-0.388536 0.921434 -0.592592 0.805503
+-0.596227 0.802816 0.499722 0.866186
+-0.799754 0.600328 0.0115382 -0.999933
+-0.904508 -0.426456 0.997204 0.0747279
+0.865375 -0.501125 -0.608034 -0.793911
+-0.251174 0.967942 0.96727 0.25375
+-0.737643 0.675191 0.290699 0.956815
+-0.979394 -0.201958 0.0845804 0.996417
+0.999946 -0.0103794 0.507983 -0.861367
+0.796767 -0.604286 -0.465584 -0.885004
+0.602345 -0.798236 -0.238612 0.971115
+0.187025 0.982355 0.999341 0.036289
+0.930287 0.366833 0.990376 -0.138404
+0.672432 -0.740159 -0.0783653 -0.996925
+-0.0687938 -0.997631 0.824411 -0.565991
+0.648354 0.761339 0.143293 -0.98968
+-0.255131 0.966906 0.786553 0.617523
+0.382532 -0.923942 0.016437 0.999865
+0.814082 0.58075 0.647214 -0.762308
+-0.914241 -0.40517 -0.640422 -0.768023
+0.295388 0.955377 0.14059 0.990068
+0.992758 0.120131 0.865746 -0.500483
+0.337517 -0.941319 -0.9916 0.129345
+-0.969065 0.246806 0.981155 0.193224
+0.0556815 0.998449 0.756955 0.653468
+0.992636 0.121136 0.911889 -0.410438
+-0.993403 -0.114672 0.476705 -0.879063
+0.986576 -0.1633 -0.767748 0.640752
+-0.571108 -0.820875 -0.457791 0.88906
+-0.715969 -0.698133 -0.304651 0.952464
+0.205807 -0.978593 -0.303631 0.95279
+0.978278 -0.207299 -0.444856 -0.895602
+0.987352 -0.158545 -0.977251 0.212084
+0.422881 0.906185 0.949223 0.314604
+-0.973264 -0.229688 -0.376686 -0.926341
+0.774978 -0.631988 0.762578 0.646897
+-0.983351 0.181714 0.838324 0.545172
+0.873005 -0.487712 0.776834 -0.629705
+-0.886644 0.462452 -0.580079 0.81456
+-0.981412 0.191911 0.895448 -0.445167
+0.400865 -0.916137 -0.918973 -0.39432
+-0.16492 0.986307 -0.652618 -0.757687
+-0.372073 -0.928203 0.911013 -0.412379
+0.708989 -0.70522 -0.964704 -0.263336
+0.619126 0.785292 -0.704214 0.709988
+-0.900408 0.435047 0.517646 -0.855595
+0.996587 0.0825484 -0.398854 0.917015
+-0.917262 0.398285 -0.992335 0.123574
+0.0575235 0.998344 0.863988 0.503512
+0.763363 0.645969 0.440904 0.897554
+0.999972 0.00751851 0.730421 0.682997
+-0.936804 0.349856 -0.377043 0.926196
+0.680234 0.732995 0.830922 0.556389
+0.344585 -0.938755 -0.812628 -0.582783
+0.821477 -0.570242 -0.548901 0.835888
+-0.693981 0.719993 0.265388 0.964142
+0.455765 -0.8901 -0.980222 -0.1979
+-0.881449 0.47228 0.473135 0.88099
+-0.567091 0.823655 -0.821527 -0.57017
+-0.990952 0.134218 0.624682 -0.780879
+0.960803 0.277231 -0.983252 0.18225
+0.689311 0.724465 0.792693 -0.609621
+-0.941603 0.336726 -0.977251 -0.212087
+0.992604 0.121394 0.922232 -0.386636
+-0.365003 0.931006 0.944232 -0.329282
+0.99377 -0.111449 0.171652 0.985158
+0.845966 -0.533236 0.953388 0.301749
+0.189749 -0.981833 0.971088 0.238724
+0.813211 -0.581969 0.753705 0.657213
+-0.503475 0.86401 -0.798833 0.601553
+0.00220309 0.999998 0.97583 -0.218532
+-0.207176 -0.978304 -0.433482 -0.901162
+-0.769145 -0.639074 0.977122 0.21268
+0.927381 -0.374117 0.798875 -0.601497
+-0.836805 -0.547502 0.180873 0.983506
+0.0256615 -0.999671 -0.839103 0.543972
+-0.672263 0.740312 -0.101103 -0.994876
+-0.788753 -0.61471 -0.974032 -0.226412
+0.374615 0.92718 0.765451 -0.643495
+-0.777757 -0.628565 0.41358 -0.910468
+-0.205021 -0.978757 -0.226238 -0.974072
+0.367634 0.929971 0.998606 0.0527783
+0.948513 0.316739 0.687334 0.726342
+0.577962 -0.816064 0.353978 -0.935254
+0.999696 -0.0246639 -0.780737 -0.62486
+0.959799 -0.280688 -0.984418 0.175844
+0.186466 0.982461 0.995659 0.0930795
+0.433673 -0.901071 0.641636 0.76701
+-0.71345 0.700706 -0.62068 -0.784064
+-0.914952 -0.403562 -0.764889 -0.644162
+-0.308809 0.951124 0.99976 -0.0219034
+-0.879743 0.47545 0.753181 0.657814
+-0.338321 -0.941031 -0.999017 -0.0443304
+-0.0294936 -0.999565 -0.981662 -0.190631
+-0.930953 0.365139 0.948942 0.31545
+0.999594 0.0285001 -0.957901 0.2871
+-0.14071 -0.990051 0.0192967 -0.999814
+-0.59285 0.805313 0.809523 0.587088
+0.217654 -0.976026 -0.998743 0.050126
+-0.690606 -0.723232 0.671635 -0.740882
+-0.397313 -0.917683 -0.999838 0.0179865
+0.976503 0.215503 -0.963649 0.267172
+-0.564464 0.825458 -0.958797 -0.284093
+-0.280876 0.959744 -0.980789 -0.195071
+0.986214 -0.165473 -0.609133 0.793068
+0.924285 -0.381702 0.105987 -0.994368
+0.95222 0.305412 0.929096 -0.369838
+-0.540494 0.841348 0.85059 0.525829
+-0.963669 -0.267099 -0.328371 0.944549
+0.0735443 0.997292 0.473189 -0.880961
+0.949214 -0.31463 0.830538 -0.556962
+-0.063852 0.997959 0.994349 0.106164
+-0.900415 0.435032 0.519025 -0.854759
+0.999998 0.00222261 0.975402 0.220435
+0.777495 0.62889 0.451268 -0.892389
+-0.889411 0.457107 -0.939327 0.343024
+0.960421 -0.278554 -0.998965 -0.0454817
+-0.472884 0.881125 0.532372 -0.846511
+0.0261726 0.999657 -0.865808 -0.500376
+-0.490028 0.871707 0.584377 0.811482
+0.788254 -0.615349 -0.952495 0.304553
+-0.958881 -0.283809 -0.87656 -0.481292
+0.0166452 -0.999861 -0.0936624 0.995604
+-0.845746 -0.533586 0.96506 -0.262029
+-0.255405 0.966834 0.768737 0.639565
+0.349592 0.936902 -0.402943 0.915225
+-0.830195 -0.557473 -0.849203 0.528067
+0.993153 0.116821 0.65428 -0.756252
+-0.961755 -0.273911 -0.86351 0.504332
+-0.724804 0.688955 0.821665 -0.56997
+-0.601389 -0.798957 -0.120857 -0.99267
+0.130754 0.991415 0.854299 -0.519783
+-0.856245 0.51657 -0.639517 0.768777
+0.998967 -0.0454392 -0.166134 0.986103
+-0.98823 -0.152974 -0.939281 0.343149
+-0.758963 0.651134 -0.220142 -0.975468
+0.905986 -0.423307 0.962941 0.269712
+-0.894293 -0.447482 -0.745773 0.6662
+-0.137616 -0.990486 0.325679 -0.94548
+-0.986136 0.16594 -0.570958 0.820979
+0.3805 -0.924781 0.234004 0.972236
+-0.442264 -0.896885 -0.256108 -0.966648
+-0.102634 -0.994719 -0.65489 0.755724
+0.0597012 0.998216 0.952481 0.304597
+-0.440269 -0.897866 -0.0367247 -0.999325
+0.545771 -0.837934 0.378869 0.92545
+-0.509391 -0.860535 -0.999175 0.0406077
+-0.672948 -0.73969 -0.00876431 0.999962
+0.480238 0.877138 0.985103 0.171967
+0.846908 -0.531739 0.885413 0.464805
+0.974556 -0.224144 -0.816573 0.577243
+0.918296 0.395893 -0.990679 0.136219
+-0.962997 0.269514 -0.552412 -0.833571
+-0.207892 -0.978152 -0.498223 -0.867049
+-0.565402 -0.824816 -0.920371 0.391046
+-0.0146207 -0.999893 0.108464 -0.9941
+0.843755 -0.536728 0.9943 -0.106615
+0.00958077 0.999954 0.575083 -0.818095
+0.102288 -0.994755 -0.680825 -0.732446
+-0.958502 0.285087 -0.804819 0.593521
+-0.695868 -0.71817 0.00623506 -0.999981
+-0.856281 0.516511 -0.644795 0.764356
+-0.407968 -0.912996 -0.379054 0.925375
+0.966818 0.255465 0.764775 0.644298
+-0.831926 0.554886 -0.646611 -0.76282
+0.263502 0.964659 0.0384969 -0.999259
+-0.900121 0.43564 0.460132 -0.88785
+-0.518827 0.854879 -0.416907 -0.908949
+0.19602 -0.9806 0.636996 0.770867
+0.555367 0.831606 -0.68959 -0.7242
+0.369776 -0.929121 0.984265 0.1767
+-0.832254 -0.554394 -0.600404 0.799697
+0.500236 -0.865889 -0.523437 0.852064
+-0.962166 -0.272463 -0.778121 0.628114
+0.503719 -0.863868 -0.815459 0.578815
+-0.997691 -0.067921 0.870713 0.491792
+-0.753429 0.65753 -0.876095 -0.482139
+-0.999978 0.00657889 0.791282 -0.611451
+0.621153 0.783689 -0.499404 0.866369
+-0.93857 -0.34509 -0.780131 -0.625616
+-0.843392 0.537299 0.984817 -0.173596
+0.781008 0.624521 -0.0923058 -0.995731
+-0.725266 -0.688468 0.85808 0.513515
+0.667374 -0.744723 -0.688729 -0.725019
+0.448511 -0.893777 -0.817358 0.57613
+-0.157792 0.987472 -0.990561 -0.137075
+-0.754401 -0.656414 -0.795444 0.606027
+-0.101282 -0.994858 -0.751276 0.659989
+-0.988939 -0.148324 -0.681795 0.731543
+-0.730137 0.683301 0.98544 0.170021
+0.3807 0.924699 0.212923 -0.977069
+0.581649 0.81344 0.727278 0.686343
+0.27227 -0.962221 -0.765364 0.643598
+0.688933 -0.724825 0.823445 0.567396
+0.354543 0.93504 0.113995 0.993481
+0.307414 0.951576 0.985842 0.167676
+0.880744 0.473593 0.598675 -0.800992
+-0.726473 -0.687195 0.934516 0.355922
+-0.972977 -0.230901 -0.258596 -0.965986
+0.637048 -0.770824 0.998812 -0.0487299
+0.168017 -0.985784 -0.386674 -0.922217
+-0.574318 0.818632 -0.0838377 -0.996479
+-0.957526 0.288346 -0.560722 0.828004
+-0.769532 -0.638609 0.988187 0.153251
+0.775637 -0.63118 0.691139 0.722722
+-0.233231 0.972421 -0.0220153 -0.999758
+0.72438 0.689401 0.78506 0.61942
+-0.169368 0.985553 -0.257051 -0.966398
+0.226829 -0.973935 -0.628723 -0.777629
+-0.0903257 0.995912 -0.928709 0.370811
+0.499067 -0.866563 -0.40406 0.914732
+0.331989 0.943283 -0.754171 -0.656679
+-0.692513 0.721405 0.454953 0.890516
+-0.958558 0.284897 -0.816445 0.577423
+0.924045 0.382283 0.0433148 0.999061
+0.334175 0.942511 -0.884912 -0.465758
+-0.130075 -0.991504 0.887889 -0.460058
+-0.446164 -0.894951 -0.639913 -0.768447
+0.903818 -0.427916 0.972208 -0.234119
+-0.0184285 0.99983 -0.268806 0.963194
+0.937282 0.348573 -0.499944 -0.866058
+0.739777 0.672852 -0.0217444 -0.999764
+-0.824021 0.566559 -0.856578 0.516017
+0.590598 -0.806966 0.940032 0.341086
+0.997357 -0.0726598 0.549356 -0.835588
+-0.821907 -0.569622 -0.610299 -0.792171
+0.949448 0.313925 0.869532 0.493877
+0.912827 0.408346 -0.340414 -0.940276
+0.205651 0.978625 -0.288383 -0.957515
+-0.851305 -0.524671 0.252222 -0.96767
+0.896278 -0.443493 -0.385829 -0.92257
+0.999266 -0.0383021 -0.771527 0.636197
+0.918433 -0.395578 -0.985408 -0.170206
+-0.73033 0.683094 0.980235 0.197837
+-0.793427 -0.608665 -0.859911 0.510445
+0.46269 -0.88652 -0.558042 -0.829813
+-0.493919 -0.869508 0.176209 -0.984353
+-0.155128 -0.987894 -0.991261 -0.131917
+0.795348 0.606153 -0.658484 0.752595
+-0.958879 0.283816 -0.876248 0.48186
+0.997868 -0.0652612 0.969509 -0.245058
+0.922202 -0.386708 -0.422355 -0.90643
+-0.586056 -0.810271 0.977268 0.212008
+-0.643957 0.765062 0.659308 0.751873
+-0.773812 0.633415 0.868223 0.496173
+-0.231789 -0.972766 -0.169479 0.985534
+-0.936274 -0.351272 -0.233238 -0.97242
+0.728687 0.684847 0.999154 0.0411138
+-0.767162 0.641453 0.865783 -0.50042
+-0.996536 0.0831609 -0.454418 -0.890788
+-0.698159 0.715943 -0.308179 0.951328
+-0.94264 0.333811 -0.866236 -0.499636
+-0.79317 -0.609 -0.880697 0.473681
+0.169674 -0.9855 -0.226922 -0.973913
+-0.287347 0.957827 -0.643871 -0.765134
+-0.835323 -0.549759 -0.088014 0.996119
+-0.700819 0.713339 -0.633015 0.774139
+-0.573507 0.819201 -0.181983 -0.983302
+-0.538014 -0.842936 0.966588 -0.256336
+-0.842216 -0.53914 0.923801 0.382874
+0.91804 -0.396487 -0.997411 -0.0719102
+-0.856046 -0.5169 -0.609426 -0.792843
+-0.862248 -0.506486 -0.95632 0.292322
+0.686317 -0.727303 0.970618 0.240626
+0.978288 -0.207252 -0.440527 -0.897739
+0.375851 0.92668 0.673135 -0.739519
+-0.327217 -0.944949 -0.341971 -0.939711
+-0.663402 -0.748263 -0.961317 0.275444
+0.857157 -0.515055 -0.764808 0.644259
+0.312532 -0.949907 0.932404 0.361419
+0.848491 0.529209 0.709626 -0.704578
+0.821717 -0.569896 -0.583607 0.812036
+-0.0791196 -0.996865 -0.0662047 -0.997806
+-0.0684603 -0.997654 0.842871 -0.538115
+-0.0931452 0.995653 -0.995325 0.0965842
+0.692653 0.721271 0.437604 -0.899168
+-0.954615 0.297841 0.387481 0.921878
+0.436954 -0.899484 0.326068 0.945346
+0.0107672 0.999942 0.474202 -0.880416
+0.541294 -0.840834 0.796801 0.604242
+-0.360639 0.932706 0.693932 -0.720041
+-0.723418 -0.69041 0.691425 0.722448
+-0.229566 0.973293 -0.388317 -0.921526
+0.854066 -0.520165 -0.270074 0.962839
+-0.803144 0.595785 0.546702 -0.837327
+-0.866281 -0.499557 -0.455065 0.890458
+-0.999386 -0.0350247 -0.935333 -0.35377
+0.137862 -0.990451 0.302137 0.953265
+0.906056 -0.423159 0.958403 0.285418
+0.50816 0.861263 -0.994765 -0.10219
+-0.650102 0.759847 -0.0858654 0.996307
+0.664019 -0.747716 -0.935398 -0.353598
+0.0101781 -0.999948 0.525215 0.85097
+0.945401 -0.32591 -0.209127 -0.977888
+-0.0880892 -0.996113 -0.822829 -0.568289
+-0.197284 -0.980346 0.532578 -0.846381
+0.657344 0.753591 -0.863939 -0.503597
+-0.912451 0.409185 -0.252644 0.967559
+-0.602678 0.797985 -0.278845 0.960336
+0.951588 0.307378 0.985194 -0.171445
+0.103518 0.994628 -0.58526 0.810846
+-0.933668 0.358141 0.478756 0.877948
+0.957109 -0.289728 -0.435746 0.90007
+0.983319 -0.181888 0.847814 0.530294
+0.421219 0.906959 0.875967 0.482371
+0.199318 0.979935 0.346777 -0.937948
+0.81229 0.583254 0.84783 -0.530268
+-0.672232 -0.74034 -0.105266 0.994444
+0.968528 0.248903 0.999758 0.0219886
+-0.574474 0.818522 -0.0648134 -0.997897
+-0.986378 0.164494 -0.684761 0.728768
+-0.581442 0.813588 0.709597 -0.704608
+0.980701 -0.195511 0.676116 -0.736795
+0.0663378 -0.997797 0.937482 0.348033
+-0.0733898 0.997303 0.48678 0.873524
+-0.671162 0.741311 -0.247305 -0.968938
+-0.555924 0.831233 -0.736524 0.676411
+0.108275 -0.994121 -0.146275 -0.989244
+0.641705 0.766952 0.848934 -0.5285
+-0.151954 0.988388 -0.898947 0.438058
+0.91122 -0.411919 0.0444185 0.999013
+-0.99994 -0.0109991 0.453653 0.891178
+0.638133 0.769926 0.995769 -0.0918929
+-0.402623 -0.915366 -0.826801 0.562495
+-0.948928 0.315492 0.776601 -0.629992
+0.710721 -0.703474 -0.871569 -0.490273
+-0.817944 0.575298 0.0357496 0.999361
+-0.861524 -0.507717 -0.988198 0.15318
+-0.360647 0.932702 0.694565 -0.71943
+0.0338778 -0.999426 -0.969691 -0.244335
+-0.663754 -0.747951 -0.947305 0.320334
+-0.965025 -0.262158 0.176846 0.984239
+0.326304 0.945265 -0.249732 -0.968315
+-0.851988 -0.523562 0.124461 -0.992224
+-0.996611 -0.0822584 -0.372004 0.928231
+-0.71987 0.694108 0.248331 -0.968675
+0.34324 -0.939248 -0.887494 -0.460819
+-0.761559 -0.648095 0.176815 0.984244
+0.997797 0.0663473 0.937153 0.34892
+0.566219 -0.824255 -0.877147 -0.480222
+0.967977 -0.251039 0.970715 -0.240236
+-0.995118 0.0986879 -0.896007 0.44404
+0.34138 0.939925 -0.960789 0.277281
+0.900215 -0.435445 0.479311 -0.877645
+0.0324565 0.999473 -0.994531 0.10444
+-0.962444 0.271479 -0.709905 -0.704298
+-0.281391 0.959593 -0.96892 -0.247375
+-0.848839 -0.528652 0.661852 -0.749634
+0.165674 0.986181 -0.592881 0.80529
+-0.916532 0.399962 -0.953286 0.302068
+0.651498 -0.758651 -0.266587 0.963811
+0.557192 0.830384 -0.83083 -0.556526
+0.920875 -0.389857 -0.701658 -0.712514
+0.999847 0.0174853 -0.176891 0.98423
+0.535766 -0.844367 0.999974 -0.00720232
+-0.750848 0.660475 -0.993787 -0.111299
+0.722913 -0.69094 0.636715 -0.7711
+0.0475356 0.99887 0.0429467 0.999077
+0.982208 -0.187796 0.999107 -0.0422428
+0.383725 0.923447 -0.112513 -0.99365
+0.999907 -0.0136688 0.202465 -0.97929
+-0.792407 -0.609992 -0.932927 0.360065
+-0.128215 -0.991746 0.958091 -0.286462
+0.339194 0.940716 -0.998823 0.0485098
+0.355752 0.93458 0.241152 0.970487
+0.0462011 0.998932 -0.0905101 0.995896
+-0.897135 -0.441756 -0.201048 0.979581
+0.999911 -0.0133539 0.233197 -0.972429
+0.612218 -0.790689 -0.996208 0.0870055
+-0.865849 -0.500305 -0.530208 0.847867
+0.555162 -0.831742 -0.67153 0.740977
+0.39412 -0.919059 -0.946132 0.323782
+0.910996 0.412414 0.0985836 -0.995129
+0.971297 0.23787 0.43974 -0.898125
+-0.0454068 -0.998969 -0.169325 0.98556
+-0.382629 0.923902 0.00588636 0.999983
+-0.999396 0.0347495 -0.944721 0.327875
+0.971381 0.237528 0.407865 -0.913042
+0.813213 -0.581966 0.753517 0.657428
+-0.199843 -0.979828 0.296072 -0.955166
+-0.985303 0.170813 -0.113012 0.993594
+0.0882972 -0.996094 -0.834514 0.550987
+0.702282 -0.711899 -0.77756 0.628809
+-0.840749 0.541425 0.787244 -0.616641
+0.105701 -0.994398 -0.394679 -0.918819
+-0.224845 -0.974395 -0.773011 0.634393
+0.273677 -0.961822 -0.850985 0.52519
+-0.610656 -0.791896 -0.959799 -0.280688
+0.962605 -0.270909 -0.667006 -0.745052
+0.0881812 -0.996104 -0.82804 0.560669
+0.49695 -0.867779 -0.170916 0.985286
+0.958812 -0.284041 -0.864667 0.502345
+-0.677492 0.735531 0.570623 -0.821212
+-0.924333 -0.381586 0.118494 0.992955
+0.592426 0.805625 0.83928 -0.543699
+-0.928431 -0.371504 0.934583 0.355746
+0.338473 -0.940976 -0.999604 0.0281352
+-0.175597 -0.984462 0.363861 0.931453
+-0.93331 -0.359072 0.56388 -0.825857
+-0.5368 -0.84371 0.993366 -0.115
+-0.340491 0.940248 -0.982671 -0.185358
+-0.816794 0.57693 0.233279 0.97241
+-0.986982 0.160828 -0.90262 0.430439
+-0.697958 0.716139 -0.28133 0.959611
+-0.930584 0.366079 0.975928 0.218094
+0.205478 0.978662 -0.271388 -0.96247
+-0.394583 -0.91886 -0.96125 -0.275677
+0.917301 -0.398196 -0.993487 0.113944
+-0.0328628 0.99946 -0.989465 -0.144769
+-0.855626 -0.517595 -0.543081 -0.83968
+-0.573479 -0.81922 -0.185308 0.98268
+-0.138341 -0.990385 0.255663 -0.966766
+-0.591123 0.806582 0.915862 0.401494
+-0.985946 -0.167064 -0.47383 -0.880616
+0.652529 0.757763 -0.394879 -0.918733
+0.739581 0.673067 0.00742818 -0.999972
+0.0588984 0.998264 0.924933 0.380131
+0.907416 -0.420235 0.818545 0.574442
+0.0813691 -0.996684 -0.28781 0.957688
+0.327135 0.944978 -0.333718 -0.942673
+-0.338581 -0.940937 -0.99986 -0.0167278
+-0.824465 -0.565912 -0.894405 -0.447259
+0.582073 0.813136 0.762102 0.647457
+0.921474 0.388441 -0.58428 0.811552
+0.546137 0.837696 0.338126 -0.941101
+-0.310247 0.950656 0.991639 0.129044
+-0.711218 -0.702972 -0.834765 0.550607
+0.973105 -0.230364 -0.311514 0.950242
+0.990363 0.138495 0.240621 0.970619
+0.411369 0.911469 -0.0159845 0.999872
+-0.716722 -0.697359 -0.20017 0.979761
+-0.46743 0.88403 -0.0565389 -0.9984
+-0.861857 -0.507151 -0.976015 0.217705
+0.819547 0.573012 -0.241051 -0.970512
+-0.306842 -0.95176 0.973982 0.226625
+0.987688 0.156438 -1 -0.000398448
+-0.392386 0.919801 -0.868671 0.49539
+-0.75346 0.657494 -0.873765 -0.486347
+0.9683 -0.249792 0.993532 -0.113548
+-0.906409 -0.422401 0.931237 -0.364414
+0.984995 -0.172581 0.0661492 0.99781
+-0.759934 -0.65 -0.0725281 0.997366
+-0.292946 0.956129 -0.114221 -0.993455
+-0.443052 0.896496 -0.340031 0.940414
+0.640663 0.767823 0.912663 -0.408713
+-0.915675 0.401919 -0.867617 0.497232
+-0.931075 0.364827 0.937863 0.347007
+-0.728756 0.684774 0.999516 -0.0311001
+-0.661998 0.749506 -0.995815 -0.0913886
+0.287857 0.957673 -0.60225 0.798307
+-0.885497 -0.464645 -0.362874 -0.931838
+0.929377 0.369131 0.994147 0.108033
+0.304631 -0.95247 0.895705 -0.444648
+-0.137605 -0.990487 0.326778 -0.945101
+0.713011 0.701152 -0.668536 0.74368
+0.964251 -0.26499 -0.115597 -0.993296
+0.984304 0.176481 0.446005 -0.89503
+-0.014216 -0.999899 0.148594 -0.988898
+0.877273 -0.479992 0.979881 0.19958
+0.950377 0.311102 0.976052 0.217539
+0.905529 -0.424285 0.986397 0.164382
+-0.963488 -0.267753 -0.391683 0.9201
+-0.719258 0.694743 0.162006 -0.98679
+-0.995613 -0.0935674 -0.998524 0.0543044
+-0.636198 -0.771526 0.987384 0.158343
+0.881928 0.471385 0.381422 -0.924401
+-0.968717 -0.248167 0.998546 -0.0539065
+0.959285 -0.282439 -0.936153 0.351592
+-0.97443 0.224692 -0.782854 0.622206
+-0.999999 0.00167726 0.985967 -0.166941
+-0.988807 -0.149198 -0.743655 0.668563
+-0.921031 0.389489 -0.672629 -0.73998
+0.761023 0.648724 0.0949914 0.995478
+0.432319 -0.901721 0.749129 0.662425
+0.0588897 -0.998264 0.924602 -0.380933
+-0.010546 0.999944 0.49356 0.869712
+-0.0334461 0.999441 -0.979336 -0.20224
+0.309363 0.950944 0.999337 -0.0364199
+-0.67705 -0.735937 0.520369 0.853941
+-0.726945 -0.686696 0.956755 0.290894
+-0.821641 0.570005 -0.572776 0.819712
+0.257577 0.966258 0.606907 -0.794773
+-0.422126 -0.906537 0.91973 0.392553
+0.292615 0.95623 -0.148556 0.988904
+0.921622 -0.388088 -0.552817 -0.833303
+0.33464 -0.942346 -0.906806 0.421549
+0.535546 0.844506 0.999447 0.033245
+0.975647 -0.219348 -0.99239 0.12313
+-0.947008 -0.32121 0.282123 0.959378
+0.875176 0.483804 0.972705 0.232046
+0.995471 0.0950625 -0.99541 -0.0957014
+-0.993828 0.110936 0.120581 0.992704
+-0.713681 -0.700471 -0.594498 0.804097
+-0.782044 0.623223 -0.2557 0.966756
+0.999848 -0.0174591 -0.17431 -0.984691
+-0.0863885 0.996262 -0.714321 0.699819
+-0.983484 0.180993 0.796141 0.605111
+-0.972902 -0.231217 -0.227139 -0.973862
+0.198512 0.980098 0.422662 -0.906287
+0.917669 -0.397347 -0.999766 0.0216507
+0.973289 0.229585 -0.386529 -0.922277
+-0.0500619 -0.998746 0.291595 0.956542
+-0.690439 0.72339 0.688492 0.725244
+0.591758 0.806115 0.88139 -0.472389
+-0.922233 -0.386636 -0.415194 0.909733
+0.681475 0.731841 0.912851 0.408292
+-0.812311 0.583224 0.845861 0.533403
+0.417264 -0.908785 0.590599 -0.806965
+-0.485116 0.87445 0.927116 0.374775
+0.979192 0.202937 -0.0153341 0.999882
+-0.927387 0.374103 0.799799 -0.600267
+-0.0998486 -0.995003 -0.838238 0.545305
+0.0561274 0.998424 0.785373 0.619023
+0.730612 0.682792 0.971236 -0.238121
+0.922235 -0.386631 -0.414729 -0.909945
+0.439205 0.898387 0.0816655 -0.99666
+0.887919 -0.46 -0.780342 0.625353
+0.820411 0.571774 -0.384249 -0.92323
+0.625568 0.78017 0.0416754 0.999131
+-0.988623 0.150415 -0.820102 -0.572217
+0.441377 0.897322 -0.159529 -0.987193
+0.54857 0.836105 0.0541341 -0.998534
+0.965834 -0.25916 0.469153 -0.883117
+0.313545 -0.949573 0.888639 0.458607
+-0.950085 -0.31199 0.951497 0.307659
+0.961163 -0.275983 -0.951375 -0.308034
+0.918937 0.394405 -0.955715 0.294293
+0.990862 0.134878 0.571358 0.820701
+-0.998929 0.0462675 -0.0838888 0.996475
+-0.204135 0.978943 -0.13723 0.990539
+0.962876 -0.269943 -0.588993 -0.808138
+-0.982869 -0.184307 0.951452 -0.307798
+0.987935 0.154871 -0.987508 0.15757
+-0.469534 0.882915 0.180581 -0.98356
+-0.433048 -0.901371 0.6932 -0.720745
+-0.851227 -0.524798 0.266661 -0.96379
+-0.966129 0.25806 0.566423 -0.824115
+0.877471 0.479629 0.970799 -0.239896
+-0.832115 0.554603 -0.620256 -0.784399
+0.243024 -0.97002 0.833998 -0.551768
+0.761878 0.647721 0.224982 0.974363
+0.564214 -0.825628 -0.96693 -0.255042
+-0.989438 -0.144955 -0.398207 0.917296
+-0.603938 0.797032 -0.426458 0.904507
+0.975955 -0.217973 -0.999848 -0.0174601
+-0.968538 0.248865 0.999836 -0.0180835
+-0.981295 -0.19251 0.866659 0.498901
+0.766302 -0.642481 0.791142 -0.611633
+-0.936894 -0.349613 -0.400881 -0.91613
+-0.463677 -0.886004 -0.462349 0.886698
+-0.660945 0.750434 -0.998804 0.048897
+-0.0998082 -0.995007 -0.840445 0.541896
+0.486433 -0.873718 0.860369 0.509672
+-0.443881 0.896086 -0.42541 0.905001
+-0.976126 -0.217204 -0.99537 0.0961161
+-0.734744 0.678344 0.661833 0.749651
+-0.179338 0.983788 0.683496 -0.729955
+-0.811332 -0.584585 0.923004 -0.384791
+-0.819524 0.573045 -0.237096 0.971486
+0.133628 -0.991032 0.670044 0.742321
+0.737897 -0.674913 0.254486 0.967076
+-0.634411 0.772996 0.924743 -0.380591
+-0.313993 0.949425 0.865999 0.500045
+0.833519 -0.552491 -0.403689 -0.914896
+-0.384612 -0.923078 -0.207344 -0.978268
+0.991758 -0.128123 0.960716 -0.277534
+-0.99946 0.0328662 -0.989416 0.145105
+0.609795 0.792559 -0.92365 -0.383238
+0.931691 0.363252 0.866082 -0.499902
+0.813438 -0.581651 0.727512 0.686095
+0.916994 -0.398902 -0.98178 0.19002
+0.474548 0.880229 0.681938 0.73141
+-0.0212743 -0.999774 -0.52847 -0.848952
+-0.965131 0.261766 0.216647 -0.97625
+-0.988168 -0.153374 -0.952384 0.304902
+-0.238686 -0.971097 0.513567 0.85805
+0.869622 -0.493718 0.198957 -0.980008
+0.940159 0.340736 -0.977508 -0.210899
+-0.806817 -0.590802 0.931115 0.364725
+-0.987354 0.15853 -0.977573 0.210596
+-0.134036 -0.990977 0.638954 -0.769245
+0.976619 -0.214976 -0.947836 -0.31876
+0.256284 0.966601 0.707475 -0.706738
+-0.931033 -0.364935 0.941798 -0.336178
+-0.240866 0.970558 0.691697 -0.722188
+-0.0402165 -0.999191 -0.636271 0.771466
+0.931622 -0.363427 0.87533 0.483527
+-0.911627 -0.411018 -0.054393 -0.99852
+-0.551483 0.834186 -0.290427 0.956897
+-0.555226 0.831699 -0.677277 0.735728
+-0.529151 0.848528 0.704777 -0.709429
+0.156065 0.987747 -0.999302 -0.0373488
+-0.290659 -0.956827 -0.346296 0.938125
+-0.639464 -0.768821 0.965083 -0.261945
+0.675805 0.737081 0.369237 0.929335
+-0.771435 0.636308 0.989541 0.144255
+-0.732697 -0.680555 0.854472 -0.519498
+-0.699665 -0.714471 -0.500181 -0.865921
+-0.974729 -0.223391 -0.858705 -0.512471
+-0.435434 -0.900221 0.480345 -0.87708
+-0.984707 -0.174217 0.230216 -0.973139
+-0.982931 0.183973 0.940439 0.339963
+0.585766 -0.81048 0.96907 -0.246785
+-0.153229 0.988191 -0.947811 0.318832
+0.9005 -0.434856 0.535631 -0.844452
+-0.703142 0.71105 -0.847681 0.530506
+0.996202 -0.0870678 -0.760338 -0.649527
+0.568399 -0.822753 -0.721002 -0.692933
+-0.903345 0.428914 0.940498 -0.339799
+-0.855193 -0.51831 -0.471065 -0.882099
+-0.43078 0.902457 0.850761 0.525552
+0.546124 0.837704 0.339546 -0.94059
+-0.946622 -0.322346 0.165314 0.986241
+-0.982718 -0.185107 0.97332 -0.229451
+-0.202752 -0.97923 0.00357808 -0.999994
+0.540864 -0.84111 0.826599 0.562791
+-0.145435 0.989368 -0.442282 0.896876
+-0.544768 -0.838587 0.486656 -0.873594
+-0.838778 0.544473 0.516997 -0.855987
+-0.745111 -0.66694 -0.729767 -0.683696
+0.999922 0.0125228 0.313127 0.949711
+-0.0181605 -0.999835 -0.242895 -0.970053
+0.542482 -0.840068 0.703723 0.710475
+-0.278654 -0.960392 -0.999383 -0.0351285
+-0.757081 0.653321 -0.488514 -0.872556
+0.985809 -0.167869 -0.400428 0.916328
+0.826068 0.56357 -0.983862 -0.178927
+0.999332 0.0365493 -0.870713 -0.491792
+-0.809674 -0.58688 0.993754 -0.111591
+-0.679296 -0.733865 0.753152 0.657846
+-0.402241 -0.915534 -0.849583 0.527455
+0.695047 0.718964 0.120185 -0.992751
+0.802712 0.596366 0.484651 0.874708
+-0.977641 -0.21028 -0.693137 0.720806
+-0.816975 0.576673 0.202608 0.97926
+0.982176 0.187964 0.998243 0.0592563
+0.83694 -0.547295 0.205168 -0.978727
+-0.763663 0.645615 0.482005 -0.876169
+0.712915 -0.70125 -0.678674 -0.734439
+-0.521304 0.853371 -0.139611 -0.990206
+0.987708 -0.156312 -0.999923 -0.0124436
+0.325739 0.94546 -0.191404 -0.981511
+-0.999569 0.0293481 -0.978782 -0.204904
+-0.985372 -0.170415 -0.153029 -0.988222
+-0.145099 -0.989417 -0.411506 -0.911407
+0.231403 0.972858 -0.208405 0.978043
+-0.676291 0.736635 0.429668 -0.902987
+1 0.000340354 0.999421 0.0340288
+0.689765 -0.724033 0.752991 0.658031
+0.16618 -0.986095 -0.550808 -0.834632
+-0.744884 -0.667194 -0.706079 -0.708133
+0.698778 -0.715339 -0.389158 0.921171
+-0.988951 -0.148244 -0.675848 0.737041
+-0.964574 0.263813 0.00622628 -0.999981
+-0.881722 -0.471768 0.421277 -0.906932
+0.845567 -0.533869 0.973271 0.229661
+-0.9066 0.421991 0.913817 0.406126
+-0.462488 -0.886626 -0.576753 0.816919
+0.864515 -0.502607 -0.734494 -0.678615
+0.981709 0.19039 0.95343 0.301616
+-0.336497 0.941685 -0.97179 0.23585
+-0.807897 -0.589324 0.981953 0.189127
+0.54545 0.838143 0.414018 -0.910269
+-0.831699 0.555226 -0.677278 -0.735727
+0.66591 0.746032 -0.816952 0.576706
+-0.928954 -0.370196 0.975273 0.221003
+-0.921237 0.389001 -0.632492 -0.774567
+0.965626 0.259935 0.396826 0.917894
+0.948411 -0.317042 0.663722 -0.74798
+-0.383977 0.923343 -0.139616 0.990206
+-0.725206 0.688532 0.853503 -0.521087
+0.887196 -0.461393 -0.672978 0.739663
+-0.99806 -0.0622664 0.998621 -0.0524943
+0.704686 -0.709519 -0.942167 0.335144
+-0.952847 0.303452 0.833936 0.551861
+0.0832097 0.996532 -0.458782 -0.888549
+0.853328 0.521374 -0.131434 -0.991325
+0.420868 -0.907122 0.856639 -0.515916
+0.0828706 0.99656 -0.42828 -0.903646
+0.966088 -0.258213 0.553354 -0.832946
+-0.824569 -0.565762 -0.902444 -0.430808
+0.60317 -0.797613 -0.337502 0.941325
+0.490371 -0.871514 0.551943 0.833882
+0.731587 0.681748 0.927438 -0.373977
+-0.371381 0.928481 0.939205 0.343356
+-0.843524 0.537091 0.988795 -0.14928
+0.98257 0.185892 0.988536 -0.150985
+-0.0551169 -0.99848 0.718816 0.6952
+0.866319 0.499492 -0.44834 0.893863
+0.942877 -0.33314 -0.828535 -0.559938
+0.135992 -0.99071 0.475657 0.879631
+-0.761877 0.647722 0.224875 -0.974388
+-0.958075 -0.286517 -0.707682 -0.706531
+0.904534 -0.426402 0.997631 -0.0687934
+0.27402 -0.961724 -0.869186 0.494485
+-0.424241 -0.905549 0.985603 0.169077
+-0.998122 0.0612535 0.988166 0.153387
+0.121674 0.99257 0.932765 0.360485
+-0.174275 -0.984697 0.235918 0.971773
+-0.92721 0.374541 0.770597 -0.637322
+-0.963202 -0.268778 -0.487184 0.873299
+0.804381 0.594114 0.707735 0.706478
+-0.649807 0.760099 -0.0471914 0.998886
+0.944597 0.328231 -0.440669 0.89767
+0.988371 -0.15206 -0.903577 -0.428426
+0.388513 -0.921443 -0.590601 0.806964
+-0.248493 0.968634 0.999794 -0.0202792
+0.922685 0.385554 -0.305949 0.952048
+-0.672349 -0.740235 -0.0896063 0.995977
+-0.985895 -0.167368 -0.446518 -0.894775
+0.99095 0.134231 0.623706 0.781659
+0.135601 0.990763 0.509939 -0.86021
+-0.728156 0.685411 0.992974 -0.11833
+0.602917 -0.797804 -0.30756 0.951529
+-0.576247 0.817276 0.151238 -0.988497
+-0.365968 -0.930628 0.973236 0.229808
+-0.0800818 0.996788 -0.162069 0.986779
+-0.718128 0.695911 0.000255501 -1
+-0.909042 0.416705 0.539816 0.841783
+-0.567264 0.823536 -0.809383 -0.587281
+-0.445271 0.895396 -0.560149 0.828392
+0.289211 0.957265 -0.483691 0.875239
+-0.101237 -0.994862 -0.754249 0.656588
+0.683149 -0.730279 0.981692 -0.190475
+0.669781 0.742559 -0.422334 0.90644
+-0.984524 -0.175251 0.33091 -0.943662
+-0.951124 -0.30881 0.999763 -0.0217518
+-0.714008 -0.700138 -0.556372 0.830933
+0.0541579 -0.998532 0.648838 -0.760927
+-0.138328 0.990387 0.257 0.966411
+0.924266 0.38175 0.100833 0.994903
+-0.320548 0.947232 0.348413 0.937341
+-0.69967 0.714466 -0.50086 0.865528
+-0.890762 0.45447 -0.998553 0.0537699
+-0.613701 0.789539 -0.994958 -0.100297
+-0.582893 0.812549 0.82338 -0.56749
+0.0726956 0.997354 0.546356 -0.837553
+-0.612273 -0.790646 -0.996787 -0.0800992
+-0.851108 0.52499 0.288365 0.957521
+0.689399 -0.724381 0.785227 0.619208
+0.471308 0.881968 0.373412 0.927666
+-0.913875 0.405995 -0.568599 0.822615
+0.811174 0.584805 0.933067 -0.359702
+-0.947697 -0.319171 0.480559 0.876962
+-0.227087 0.973874 -0.607863 -0.794042
+-0.945383 0.325961 -0.214449 -0.976735
+0.0497974 0.998759 0.266166 0.963927
+-0.952561 -0.304348 0.88206 -0.471137
+0.452066 -0.891984 -0.97679 0.2142
+-0.461456 -0.887163 -0.667738 0.744397
+0.790995 -0.611823 -0.990614 -0.136686
+0.597388 0.801953 0.369707 -0.929149
+0.715793 -0.698313 -0.328547 -0.944488
+-0.688758 -0.724992 0.836917 -0.54733
+0.993754 0.111593 0.185958 -0.982558
+0.997963 0.063801 0.994878 0.101081
+0.551043 0.834477 -0.239551 -0.970884
+-0.910722 -0.41302 0.164542 -0.98637
+-0.667884 -0.744266 -0.637514 0.770438
+0.863095 -0.505041 -0.894201 -0.447665
+0.535028 -0.844835 0.995527 -0.0944823
+-0.333178 -0.942864 -0.830794 -0.55658
+0.201727 0.979442 0.108063 -0.994144
+0.229262 0.973365 -0.416842 0.908979
+0.725286 0.688448 0.85952 0.511102
+-0.897107 -0.441813 -0.207228 0.978293
+-0.924542 -0.38108 0.172617 0.984989
+-0.633901 0.773414 0.897679 -0.44065
+0.199957 0.979805 0.284923 -0.958551
+0.986949 -0.161035 -0.893371 0.449321
+0.123236 0.992377 0.977736 0.20984
+-0.769915 0.638146 0.995608 -0.0936215
+-0.836569 0.547862 0.138352 -0.990383
+-0.480381 0.87706 0.987773 -0.155899
+0.933324 -0.359035 0.560551 0.82812
+-0.343575 -0.939125 -0.870505 0.49216
+0.168257 -0.985743 -0.364099 -0.93136
+0.405067 0.914287 -0.649048 0.760748
+0.0414555 0.99914 -0.535962 0.844242
+-0.803204 -0.595703 0.555146 0.831753
+0.624202 -0.781263 -0.132904 -0.991129
+0.644088 0.764951 0.646328 -0.76306
+-0.00209844 -0.999998 0.978063 -0.208308
+-0.0987671 -0.995111 -0.892444 0.451159
+0.110963 -0.993825 0.123277 -0.992372
+0.109508 -0.993986 -0.0227956 -0.99974
+-0.0350768 -0.999385 -0.933477 0.358638
+0.890469 -0.455044 -0.993009 0.118036
+-0.510267 0.860016 -0.989865 -0.142014
+-0.72038 0.693579 0.318796 -0.947823
+0.538744 -0.84247 0.940791 0.338988
+0.453564 0.891224 -0.998854 -0.0478533
+0.893966 0.448135 -0.792393 0.610011
+0.933829 0.357719 0.438668 -0.898649
+-0.763501 0.645807 0.459862 -0.88799
+0.339863 0.940475 -0.992855 0.119323
+-0.6797 -0.73349 0.788238 0.615371
+0.951993 -0.306121 0.954041 0.299678
+-0.942816 -0.333314 -0.838686 0.544615
+0.582766 -0.81264 0.814451 -0.580233
+0.890271 -0.45543 -0.986963 0.160947
+0.214584 -0.976705 -0.934295 0.3565
+0.0699025 0.997554 0.756551 -0.653935
+-0.49526 0.868745 0.0228513 0.999739
+0.753547 0.657394 -0.867294 0.497797
+0.423398 0.905944 0.965622 0.259951
+0.986019 0.166632 -0.511924 -0.859031
+0.774811 -0.632192 0.779409 0.626516
+-0.656788 0.754075 -0.824492 0.565874
+-0.125613 0.992079 0.999602 0.0282204
+-0.998931 0.0462221 -0.0884207 0.996083
+0.179163 0.983819 0.670433 0.74197
+-0.839798 0.542899 0.667604 -0.744516
+0.0483182 0.998832 0.121011 0.992651
+0.961314 -0.275456 -0.93307 -0.359695
+0.44636 0.894854 -0.656537 -0.754294
+0.998116 0.0613522 0.989635 -0.143608
+-0.309006 -0.95106 0.999999 0.00113174
+0.804667 0.593726 0.740981 0.671526
+-0.56207 0.82709 -0.999999 0.00161074
+0.882237 0.470805 0.319868 -0.947462
+0.933705 -0.358042 0.469469 0.882949
+-0.992057 -0.125792 0.99893 0.0462444
+0.577706 0.816245 0.324501 0.945885
+1 -0.00034574 0.999402 -0.0345671
+0.838673 -0.544635 0.500435 -0.865774
+-0.571317 0.820729 -0.435049 -0.900407
+-0.679954 -0.733255 0.809038 0.587756
+0.631687 -0.775224 0.736888 -0.676015
+0.812207 -0.583369 0.855245 0.518224
+-0.992126 0.125241 0.999957 0.00926729
+0.209312 -0.977849 -0.618479 0.785802
+-0.395493 -0.918469 -0.983798 -0.179279
+-0.194287 -0.980945 0.762579 -0.646895
+0.745837 0.666128 -0.79973 -0.60036
+0.305774 -0.952104 0.942487 -0.334244
+0.80642 -0.591344 0.904524 -0.426423
+0.624411 0.781096 -0.106327 0.994331
+-0.364996 -0.931009 0.943992 0.32997
+-0.0837294 0.996489 -0.504471 0.863429
+-0.853343 0.521349 -0.134345 0.990935
+0.407639 0.913143 -0.412145 0.911118
+-0.995366 0.0961592 -0.978852 0.204569
+0.433597 -0.901107 0.648077 0.761575
+-0.89238 0.451284 -0.954297 -0.298861
+-0.930371 0.366619 0.98692 0.161211
+0.999899 -0.0142123 0.148965 -0.988843
+-0.918386 0.395685 -0.987324 -0.158719
+0.636167 0.771552 0.986737 0.162328
+0.813024 0.58223 0.774413 -0.632681
+0.188931 -0.98199 0.987578 0.157128
+0.198 0.980202 0.469425 -0.882972
+0.967588 0.252534 0.922188 0.386743
+-0.310957 0.950424 0.979255 0.20263
+-0.685699 0.727885 0.98752 0.157496
+0.967675 0.2522 0.935005 0.354634
+0.256843 0.966453 0.665485 -0.746411
+-0.205645 -0.978627 -0.287809 -0.957688
+-0.473048 -0.881037 0.548017 0.836467
+0.911462 0.411385 -0.0141966 -0.999899
+-0.737927 -0.67488 0.25015 -0.968207
+0.579665 0.814855 0.540242 0.84151
+0.593052 -0.805164 0.794503 0.607261
+-0.328012 0.944674 -0.419677 0.907674
+0.686706 -0.726935 0.956346 0.292238
+0.978663 -0.205472 -0.270812 -0.962632
+0.79913 0.601158 -0.0921553 0.995745
+0.123905 -0.992294 0.989654 -0.143472
+0.771581 0.636131 0.98597 -0.166923
+0.268004 -0.963418 -0.415559 0.909566
+0.978435 0.206554 -0.375374 0.926874
+-0.99007 -0.140575 0.0329494 0.999457
+0.988987 -0.148 -0.657451 -0.753497
+-0.993763 -0.111511 0.177826 -0.984062
+-0.555964 0.831206 -0.739807 0.672819
+-0.815763 0.578387 0.402212 0.915546
+0.965451 -0.260585 0.334141 -0.942523
+-0.544095 0.839024 0.555107 0.831779
+0.520327 -0.853967 -0.251799 -0.96778
+0.815243 0.579119 0.482707 -0.875782
+-0.930867 0.365359 0.956132 0.292935
+-0.740282 -0.672297 -0.0966056 -0.995323
+-0.406236 0.913768 -0.546697 -0.837331
+-0.992961 0.118441 0.768443 0.639918
+0.869163 -0.494526 0.107081 -0.99425
+-0.386563 -0.922263 -0.407997 -0.912983
+-0.990735 -0.135812 0.491561 0.870843
+0.701175 0.712989 -0.670859 -0.741585
+-0.823056 0.56796 -0.756928 0.653498
+0.349009 0.937119 -0.459048 0.888412
+0.345781 0.938315 -0.731986 0.681319
+0.99066 0.136352 0.443376 0.896336
+-0.561307 0.827607 -0.995604 0.0936637
+0.960564 0.27806 -0.995303 0.0968037
+-0.453756 0.891126 -0.999655 0.0262699
+0.216164 0.976357 -0.979514 -0.201378
+0.997202 0.0747581 0.362727 0.931896
+-0.898318 0.439346 0.0659653 -0.997822
+0.995617 -0.0935229 -0.998272 -0.0587625
+0.721866 0.692033 0.513192 0.858274
+0.182521 0.983202 0.880172 0.474654
+0.993464 0.114142 0.42919 -0.903214
+-0.617416 -0.786637 -0.840898 0.541193
+0.326025 0.945361 -0.22102 -0.975269
+-0.97454 -0.224213 -0.812498 -0.582965
+0.997119 -0.0758576 0.257978 -0.966151
+-0.812744 -0.582622 0.804007 -0.594619
+-0.999297 0.0374844 -0.820946 0.571005
+-0.478881 0.87788 0.946829 -0.321737
+-0.920432 0.390903 -0.777909 -0.628377
+-0.836378 -0.548153 0.1038 0.994598
+0.125033 -0.992153 0.999542 -0.0302635
+0.944182 0.329425 -0.550287 0.834975
+0.840652 -0.541576 0.776061 -0.630658
+-0.00664119 0.999978 0.787457 0.616369
+0.983557 -0.180599 0.771249 0.636533
+-0.82444 -0.565949 -0.892411 -0.451224
+0.142389 -0.989811 -0.149678 0.988735
+0.818411 0.574634 -0.0453555 -0.998971
+0.999997 -0.0024406 0.970365 -0.241645
+0.977266 -0.212018 -0.809694 -0.586852
+-0.256197 0.966625 0.713818 0.700332
+0.99099 0.133934 0.646832 0.762633
+-0.373078 0.9278 0.861102 0.508433
+-0.514873 0.857266 -0.77826 -0.627943
+-0.56902 0.822324 -0.666643 -0.745377
+-0.98651 -0.163701 -0.741074 -0.671424
+-0.57752 0.816376 0.302881 -0.953028
+0.149876 -0.988705 -0.787729 0.616022
+-0.997496 -0.070722 0.700339 0.713811
+-0.981851 0.189652 0.973395 -0.229132
+0.999452 -0.033101 -0.985735 0.168306
+-0.982904 -0.184116 0.945302 -0.326195
+0.755397 0.655267 -0.694521 0.719472
+0.357139 0.934051 0.382011 0.924158
+0.916599 0.399809 -0.958216 -0.286045
+0.802928 0.596076 0.515948 0.85662
+0.253936 -0.967221 0.856662 0.515878
+-0.930941 -0.365169 0.949977 -0.312319
+-0.90779 0.419425 0.76412 0.645074
+0.144359 0.989525 -0.342239 -0.939613
+0.57845 0.815718 0.409239 0.912427
+0.30263 0.953108 0.783293 0.621653
+-0.189674 0.981847 0.972883 0.231297
+0.928048 0.37246 0.893024 0.450009
+-0.955097 0.296293 0.233641 0.972323
+-0.00923392 0.999957 0.603108 0.79766
+-0.554326 -0.832299 -0.59389 -0.804546
+0.15728 0.987554 -0.99634 0.0854747
+-0.582167 0.81307 0.769485 -0.638665
+-0.556356 -0.830944 -0.770705 -0.637193
+0.363084 0.931757 0.856892 0.515495
+-0.636783 -0.771043 0.996549 0.0830043
+-0.440052 -0.897972 -0.0125722 -0.999921
+-0.999942 -0.0107493 0.475777 0.879566
+0.988852 -0.148904 -0.723452 -0.690374
+0.988822 0.149099 -0.736937 0.675961
+0.984693 0.174296 0.237976 -0.971271
+-0.44952 0.89327 -0.877066 0.480369
+0.295616 -0.955307 0.1641 -0.986444
+-0.969901 -0.243499 0.859967 -0.510349
+0.271952 -0.962311 -0.743664 0.668553
+0.263832 -0.964569 0.00426564 0.999991
+0.908488 0.417911 0.646456 -0.762952
+0.836002 -0.548726 0.0354857 -0.99937
+0.995181 -0.0980524 -0.92252 0.38595
+0.665635 0.746278 -0.837683 0.546157
+0.998332 0.0577335 0.874389 -0.485225
+0.157874 -0.987459 -0.989391 -0.145279
+-0.347149 -0.93781 -0.625204 0.780461
+-0.930491 0.366315 0.981145 0.193275
+0.999907 0.0136725 0.202102 0.979364
+0.56418 -0.825651 -0.967972 -0.251058
+-0.630733 -0.776 0.648373 0.761323
+-0.20308 0.979162 -0.0299022 0.999553
+0.831109 -0.556109 -0.751444 -0.659797
+0.832335 0.554274 -0.588765 0.808305
+-0.977245 -0.212113 -0.815338 0.578986
+-0.923555 -0.383465 -0.0845616 0.996418
+-0.416466 0.909151 0.51752 -0.855671
+0.741382 -0.671083 -0.257612 0.966249
+0.195187 0.980766 0.700082 -0.714062
+-0.99832 -0.0579468 0.884554 -0.466438
+-0.989534 -0.144303 -0.336925 0.941531
+0.794808 -0.606861 -0.722807 -0.69105
+0.997639 0.0686746 0.831114 0.556103
+-0.999989 0.00465139 0.893758 -0.448549
+0.876406 -0.481573 0.999786 0.0206707
+0.970399 0.241508 0.737911 -0.674898
+0.44536 -0.895351 -0.568417 0.822741
+-0.20097 -0.979597 0.184455 -0.982841
+-0.882384 -0.470529 0.290146 -0.956982
+-0.74049 -0.672068 -0.127335 -0.99186
+-0.997911 -0.0645994 0.983619 0.180261
+-0.604996 -0.796228 -0.542564 -0.840014
+-0.987832 -0.155524 -0.995754 0.0920581
+-0.999437 0.0335595 -0.976979 0.213334
+0.191501 -0.981492 0.913277 0.40734
+-0.977206 -0.212295 -0.826008 0.563659
+-0.124647 0.992201 0.997607 -0.0691358
+-0.986933 0.161133 -0.888897 0.458106
+0.987048 -0.160426 -0.919374 0.393384
+-0.138201 0.990404 0.269327 0.963049
+-0.423769 0.90577 0.975439 -0.22027
+-0.747054 -0.664763 -0.89559 -0.444881
+-0.9417 -0.336453 -0.970672 0.240409
+0.151509 0.988456 -0.878321 -0.478071
+-0.253338 -0.967378 0.886891 -0.461979
+0.848906 0.528544 0.652231 -0.75802
+0.239111 -0.970992 0.550631 -0.834749
+0.985 0.172557 0.0636815 -0.99797
+0.984061 -0.177834 0.564413 0.825492
+0.998988 0.0449871 -0.210576 -0.977578
+-0.973345 -0.229344 -0.409162 -0.912462
+-0.999423 0.0339701 -0.967392 0.253284
+0.821304 -0.57049 -0.523349 0.852118
+-0.955297 -0.295647 0.167362 -0.985895
+0.999254 -0.0386185 -0.751005 0.660297
+0.445064 -0.895499 -0.540851 0.841118
+-0.855618 -0.517607 -0.54188 -0.840456
+0.410451 -0.911883 -0.11637 -0.993206
+-0.966673 -0.256015 0.726923 0.686719
+0.511435 0.859322 -0.961526 0.274714
+-0.916782 0.399389 -0.970303 0.241893
+0.948115 0.317926 0.591226 0.806506
+0.3748 -0.927106 0.752453 0.658645
+0.967741 -0.251948 0.943915 -0.33019
+-0.958251 -0.285929 -0.74967 -0.661811
+-0.838173 -0.545405 0.418906 0.90803
+-0.999169 0.0407578 -0.593566 0.804785
+0.403142 -0.915138 -0.793632 -0.608399
+0.915103 0.403221 -0.788339 -0.615242
+-0.979689 0.200523 0.229119 -0.973398
+0.850641 0.525746 0.372171 -0.928164
+-0.753018 0.658 -0.904495 -0.426484
+0.865181 0.50146 -0.638243 0.769835
+-0.624161 -0.781296 -0.138116 0.990416
+-0.764494 -0.644631 0.590548 0.807003
+0.265917 -0.963996 -0.210404 0.977615
+-0.116905 -0.993143 0.660671 0.750675
+-0.808731 0.588179 0.998818 -0.0485988
+0.428272 -0.90365 0.962231 0.272233
+-0.291656 -0.956523 -0.246785 0.96907
+-0.834373 0.551201 -0.257836 -0.966189
+-0.624104 0.781341 -0.145306 -0.989387
+0.323981 0.946064 -0.00671249 -0.999977
+-0.370819 0.928705 0.958245 0.285947
+0.827206 -0.561899 -0.999751 -0.0223291
+0.360275 0.932846 0.665323 0.746555
+0.666616 0.745401 -0.758783 0.651343
+-0.998616 0.052603 0.522978 0.852346
+0.998521 0.0543594 0.664059 -0.74768
+-0.453566 -0.891223 -0.998867 -0.0475954
+-0.55593 -0.831229 -0.737009 -0.675883
+-0.937137 0.348963 -0.463481 0.886107
+-0.14669 -0.989183 -0.55217 -0.833731
+-0.979 0.203861 -0.109397 -0.993998
+-0.818985 0.573815 -0.144902 0.989446
+-0.14227 0.989828 -0.137827 0.990456
+0.931758 0.363081 0.856753 -0.515728
+0.794917 -0.606718 -0.710282 -0.703917
+0.848474 0.529238 0.711976 -0.702204
+0.706252 0.707961 -0.992708 -0.120542
+-0.65711 0.753794 -0.847931 0.530107
+0.443502 0.896273 -0.386784 -0.92217
+-0.997658 -0.0683928 0.846491 0.532404
+-0.946517 0.322654 0.133091 -0.991104
+0.423438 -0.905925 0.966754 -0.25571
+0.718615 0.695408 0.0702423 0.99753
+0.0593422 0.998238 0.940915 0.338643
+-0.949215 -0.314628 0.830662 0.556778
+-0.990191 -0.139724 0.118638 0.992938
+0.927472 0.373893 0.813188 0.582001
+-0.0241042 0.999709 -0.744551 0.667566
+0.903204 -0.429212 0.928776 -0.370642
+-0.870977 0.491324 0.457662 -0.889126
+-0.953598 0.301083 0.672548 0.740053
+0.0636858 0.99797 0.995979 -0.0895851
+-0.444403 0.895827 -0.477401 0.878685
+-0.624421 -0.781088 -0.105029 0.994469
+-0.701434 0.712734 -0.697382 0.7167
+0.396665 -0.917964 -0.998614 0.0526221
+-0.581038 -0.813876 0.673799 0.738915
+0.953352 0.301862 0.730703 -0.682696
+-0.983556 0.180604 0.771554 0.636164
+0.828525 0.559952 -0.96705 0.254586
+0.158749 -0.987319 -0.972657 -0.232246
+0.926083 -0.377319 0.54794 -0.836518
+-0.999858 0.0168272 -0.111771 -0.993734
+0.954691 0.2976 0.364087 -0.931365
+0.999883 -0.0153269 0.0380335 -0.999276
+-0.784595 0.620008 -0.620117 0.784509
+0.652529 0.757764 -0.394786 -0.918773
+0.71702 0.697053 -0.158211 0.987405
+0.0482069 -0.998837 0.109942 -0.993938
+-0.389766 0.920914 -0.694568 0.719427
+-0.667667 -0.74446 -0.659622 0.751597
+0.276651 0.960971 -0.970464 -0.241248
+0.669237 0.743049 -0.487512 0.873116
+0.037907 -0.999281 -0.796074 -0.605199
+-0.94286 0.333189 -0.831427 -0.555634
+-0.401467 -0.915874 -0.891089 0.453829
+-0.177159 0.984182 0.50648 -0.862252
+-0.999053 -0.0435053 -0.352727 -0.935726
+0.925285 -0.379274 0.360501 -0.932759
+0.262412 0.964956 0.150819 -0.988561
+0.891527 -0.452967 -0.993409 -0.114628
+-0.768157 0.640262 0.932745 -0.360536
+-0.946285 0.323334 0.0616527 -0.998098
+0.00958207 0.999954 0.574976 -0.81817
+0.979754 0.200205 0.260577 0.965453
+0.433306 -0.901247 0.672341 0.740242
+0.921722 0.38785 -0.531126 0.847293
+-0.406332 -0.913725 -0.537811 0.843066
+0.685145 -0.728407 0.996641 0.0818928
+-0.976613 -0.215006 -0.948809 0.31585
+0.174986 -0.984571 0.305458 -0.952206
+-0.610404 -0.79209 -0.950371 -0.311119
+-0.985551 0.169382 -0.255676 0.966762
+-0.158394 0.987376 -0.98038 -0.197115
+-0.347021 -0.937857 -0.635783 0.771867
+-0.982839 0.184467 0.956339 0.29226
+-0.487906 -0.872896 0.762589 -0.646883
+0.484233 -0.874939 0.96017 0.279418
+-0.833298 -0.552824 -0.439883 0.898055
+-0.895402 0.44526 -0.559121 -0.829086
+0.617006 0.786959 -0.867924 0.496697
+0.144811 0.989459 -0.38482 -0.922992
+-0.675595 -0.737273 0.342591 0.939484
+-0.171825 0.985127 -0.010551 -0.999944
+0.994238 -0.107199 -0.252248 0.967663
+0.882643 0.470045 0.23717 -0.971468
+0.971234 -0.238126 0.463205 0.886251
+-0.070634 0.997502 0.70661 0.707603
+-0.861357 -0.507999 -0.992685 0.120737
+0.808353 -0.588697 0.993644 -0.112565
+-0.981081 0.193598 0.806079 -0.591807
+-0.998031 -0.0627291 0.999981 -0.00615211
+-0.244022 0.96977 0.886233 -0.463239
+0.865785 -0.500416 -0.540985 -0.841032
+0.053163 -0.998586 0.569932 -0.821692
+-0.433234 0.901281 0.678168 0.734907
+-0.0758487 -0.997119 0.258841 -0.96592
+0.436304 -0.8998 0.393509 0.919321
+0.999561 0.0296373 -0.984301 0.176499
+-0.778276 -0.627922 0.337073 -0.941478
+-0.619562 0.784948 -0.663732 -0.747971
+0.204089 -0.978952 -0.132598 0.99117
+-0.0223079 0.999751 -0.613256 0.789884
+0.477654 -0.878548 0.89281 -0.450433
+0.934267 0.356573 0.325371 -0.945586
+0.945365 -0.326013 -0.219787 -0.975548
+-0.307393 0.951583 0.985473 -0.169833
+-0.144584 -0.989493 -0.363559 -0.931571
+0.172536 -0.985003 0.0615524 -0.998104
+0.782208 -0.623017 -0.280973 0.959716
+0.570042 0.821616 -0.569078 0.822283
+0.881612 -0.471974 0.442332 0.896851
+0.729723 0.683743 0.993934 -0.109983
+0.220638 -0.975356 -0.967484 -0.252933
+0.313472 0.949598 0.892134 -0.451771
+0.798814 0.601578 -0.144292 0.989535
+0.653205 -0.757181 -0.475175 0.879891
+0.530578 0.847636 0.813624 0.581392
+-0.656498 0.754327 -0.802156 0.597115
+-0.947291 0.320376 0.365463 -0.930826
+0.927896 0.37284 0.873897 0.486111
+0.498041 -0.867153 -0.293225 0.956044
+0.965522 -0.260322 0.35973 -0.933057
+-0.587995 0.808864 0.999662 0.0259845
+-0.0027401 -0.999996 0.962694 -0.270594
+-0.208624 -0.977996 -0.561664 -0.827366
+-0.474274 -0.880377 0.658843 0.752281
+-0.996908 0.0785806 -0.0121875 -0.999926
+-0.971024 -0.238984 0.539595 -0.841925
+-0.447974 -0.894047 -0.781276 -0.624185
+0.825212 0.564823 -0.945517 -0.325574
+0.789199 -0.614138 -0.987881 0.155211
+-0.966656 0.25608 0.72227 -0.691612
+-0.583091 0.812407 0.837009 -0.547188
+-0.162586 -0.986694 -0.812078 0.583548
+-0.994426 -0.105436 -0.418973 -0.907999
+-0.286379 0.958116 -0.717773 -0.696278
+0.988899 0.14859 -0.701175 0.712989
+0.0394497 0.999222 -0.693543 0.720415
+0.894337 0.447394 -0.739138 0.673554
+0.866099 -0.499873 -0.487256 -0.873259
+-0.798488 0.602011 -0.197704 -0.980262
+0.999617 -0.0276765 -0.931022 -0.364962
+0.973797 0.22742 -0.580344 -0.814372
+0.410998 0.911636 -0.0566651 0.998393
+0.339633 0.940558 -0.995476 0.0950138
+0.641072 0.767481 0.889588 -0.456763
+0.958739 0.284286 -0.851552 -0.52427
+-0.617049 0.786925 -0.865183 -0.501456
+-0.999795 -0.020272 -0.440849 0.897582
+-0.999283 0.037855 -0.799215 0.601045
+-0.865954 0.500124 -0.512317 -0.858796
+-0.515518 0.856879 -0.72886 -0.684663
+-0.954975 0.296685 0.273308 0.961927
+0.104645 -0.99451 -0.489829 -0.871819
+0.858288 0.513168 -0.886934 -0.461896
+0.489387 0.872067 0.642358 -0.766405
+-0.925174 0.379544 0.333132 -0.94288
+-0.895959 -0.444137 -0.451052 0.892498
+-0.266797 -0.963753 -0.298642 -0.954365
+0.753783 0.657123 -0.8488 0.528714
+-0.488498 -0.872565 0.717051 -0.697021
+-0.802433 -0.596742 0.443151 0.896447
+-0.896925 -0.442183 -0.247398 0.968914
+0.993717 0.111926 0.218776 -0.975775
+-0.458338 0.888778 -0.882994 -0.469385
+0.845303 0.534287 0.983426 -0.181313
+-0.391818 0.920043 -0.836442 0.548056
+-0.585314 0.810807 0.9538 -0.300444
+-0.500524 0.865723 -0.551428 0.834222
+-0.762039 0.647532 0.249101 -0.968478
+-0.101639 0.994821 -0.72711 -0.686521
+-0.121512 -0.99259 0.926776 0.375615
+-0.743825 0.668374 -0.585375 0.810762
+-0.325218 0.945639 -0.13711 0.990556
+0.85494 -0.518727 -0.427527 0.904002
+-0.881272 -0.472609 0.505694 -0.862713
+-0.934248 0.356624 0.330478 0.943814
+0.967132 -0.254276 0.838003 -0.545665
+0.915696 -0.401872 -0.870131 0.492821
+0.941286 -0.337611 -0.99284 -0.119448
+-0.956813 0.290705 -0.341776 0.939782
+-0.591965 0.805964 0.869016 0.494784
+-0.195958 0.980612 0.64186 0.766822
+0.827485 -0.561488 -0.997411 -0.0719136
+0.739593 0.673055 0.00569232 -0.999984
+-0.671407 0.741088 -0.215096 -0.976593
+0.894615 0.446837 -0.69581 0.718226
+-0.939705 -0.341985 -0.940969 -0.338494
+0.930698 -0.365788 0.968626 0.248521
+0.191959 -0.981403 0.893248 0.449564
+-0.483608 -0.875285 0.977661 -0.21019
+-0.773818 -0.633408 0.867779 -0.496951
+-0.739679 0.67296 -0.0071662 0.999974
+0.0467246 0.998908 -0.0382149 0.99927
+-0.698061 -0.716039 -0.295062 -0.955478
+-0.259088 -0.965854 0.475701 -0.879607
+-0.494206 0.869345 0.143599 0.989636
+0.932299 -0.361689 0.770458 0.637491
+0.934769 0.355257 0.18945 -0.98189
+-0.505249 -0.862973 -0.904761 -0.42592
+-0.476243 0.879314 0.809317 -0.587372
+-0.448426 0.89382 -0.81184 0.58388
+-0.795185 0.606367 -0.678529 -0.734574
+-0.233469 -0.972364 0.00246428 0.999997
+-0.699394 -0.714736 -0.467054 -0.884229
+-0.365296 0.930891 0.954146 -0.299342
+-0.253798 0.967257 0.863957 0.503566
+0.9083 0.41832 0.680196 -0.733031
+-0.116586 0.993181 0.636237 -0.771494
+0.156312 0.987708 -0.999923 -0.0123916
+0.996199 0.0871069 -0.762885 0.646534
+-0.177171 -0.98418 0.507585 0.861602
+-0.888588 -0.458706 -0.862818 -0.505514
+-0.280631 0.959816 -0.985442 -0.170012
+-0.699212 -0.714915 -0.44431 -0.895873
+-0.348459 -0.937324 -0.510418 0.859926
+-0.52289 -0.8524 0.0459318 0.998945
+-0.306075 -0.952007 0.952595 0.304242
+0.00689805 0.999976 0.771367 -0.636391
+-0.798451 -0.60206 -0.203768 0.979019
+-0.993057 0.117636 0.714127 0.700016
+0.871928 -0.489635 0.620372 -0.784307
+0.236506 0.97163 0.309699 0.950835
+0.655379 -0.7553 -0.705116 0.709092
+0.52984 0.848097 0.760027 0.649891
+0.530629 -0.847604 0.817121 -0.576466
+-0.89931 -0.437311 0.288299 0.95754
+-0.999139 0.0414785 -0.534017 0.845474
+0.188136 -0.982143 0.997049 0.0767649
+-0.685289 -0.728271 0.994818 -0.101672
+0.540609 0.841274 0.843262 -0.537503
+0.774014 0.633169 0.852019 -0.523512
+0.958245 -0.285949 -0.748269 0.663396
+-0.940005 -0.34116 -0.967013 -0.254727
+0.434962 -0.900449 0.52561 0.850726
+-0.874569 -0.484901 0.936076 0.351798
+0.660963 -0.750418 -0.998922 0.04642
+0.760573 0.649253 0.0257075 0.99967
+-0.591527 -0.806285 0.894594 -0.446881
+0.668242 0.743944 -0.599738 0.800196
+-0.522385 0.85271 -0.0133177 -0.999911
+-0.519045 -0.854747 -0.393548 0.919304
+0.613782 -0.789475 -0.993869 -0.110568
+0.855328 -0.518086 -0.493979 0.869474
+0.96606 -0.258319 0.544112 -0.839013
+-0.993571 0.113209 0.342532 0.939506
+-0.783662 -0.621188 -0.495548 -0.86858
+-0.725335 -0.688397 0.863119 0.505
+0.411883 0.911237 0.0404569 0.999181
+0.615767 -0.787928 -0.935006 -0.354632
+0.164688 0.986346 -0.670281 0.742108
+-0.516218 -0.856457 -0.670551 0.741863
+0.151108 -0.988517 -0.858192 0.513328
+-0.919413 0.393292 -0.913207 -0.407497
+-0.985201 -0.171404 -0.0532335 -0.998582
+0.918422 -0.395602 -0.985857 -0.167588
+-0.154511 0.987991 -0.981108 0.193458
+0.811044 0.584985 0.940835 -0.338864
+-0.901223 0.433356 0.668156 -0.744022
+0.941279 0.337629 -0.993064 0.117573
+-0.129772 -0.991544 0.901507 -0.432764
+-0.851781 -0.523898 0.163516 -0.986541
+0.514787 0.857318 -0.784558 0.620055
+-0.407885 -0.913033 -0.387475 0.92188
+0.621945 0.783061 -0.409421 0.912346
+0.995884 -0.0906377 -0.939868 -0.341537
+-0.0860073 0.996295 -0.687022 0.726637
+0.998706 0.0508558 0.366628 -0.930368
+0.816289 0.577644 0.317263 -0.948338
+0.854173 -0.519989 -0.289886 0.957061
+0.629543 0.776966 0.524596 0.851352
+-0.918979 0.394305 -0.952479 -0.304605
+-0.887813 -0.460204 -0.765746 -0.643143
+0.999798 -0.0201211 -0.427247 -0.904135
+-0.581745 0.813371 0.73535 -0.677687
+-0.97656 -0.215245 -0.956257 0.292529
+-0.991092 0.133177 0.703095 -0.711096
+0.961148 -0.276035 -0.953027 -0.302884
+0.560159 0.828385 -0.973091 -0.230422
+-0.52957 -0.848266 0.738959 0.67375
+0.374348 -0.927288 0.783674 0.621172
+-0.724823 0.688935 0.823242 -0.567691
+-0.45313 0.891445 -0.99534 0.0964225
+-0.860074 -0.51017 -0.991408 -0.130803
+0.395459 -0.918484 -0.983122 0.18295
+0.599221 -0.800583 0.149271 0.988796
+-0.991735 -0.128305 0.955466 0.295101
+0.846351 0.532626 0.929156 -0.369687
+0.954324 -0.298773 0.475507 0.879712
+0.949376 -0.314143 0.857962 -0.513714
+0.616823 0.787102 -0.879246 0.476367
+-0.420091 -0.907482 0.809381 0.587284
+-0.973239 -0.229795 -0.366509 -0.930414
+-0.357265 0.934003 0.394446 -0.918919
+-0.657212 0.753705 -0.855021 0.518594
+-0.425358 -0.905025 0.998916 0.0465479
+-0.271138 0.96254 -0.684572 0.728945
+-0.694388 -0.719601 0.210589 -0.977575
+-0.378782 -0.925486 0.409537 -0.912293
+-0.777333 0.62909 0.474097 0.880473
+-0.967312 -0.25359 0.874552 0.484931
+0.480611 -0.876934 0.991524 -0.129925
+0.466299 -0.884627 -0.18337 -0.983044
+0.742089 0.670302 -0.357805 -0.933796
+0.462869 -0.886427 -0.541095 -0.840961
+0.448263 0.893902 -0.801038 -0.598614
+-0.580415 -0.814321 0.615316 0.78828
+-0.340694 0.940174 -0.978446 -0.206504
+0.677595 0.735435 0.582101 0.813117
+0.349447 -0.936956 -0.417122 -0.908851
+0.977939 -0.208889 -0.583899 -0.811826
+0.935617 -0.353017 -0.0489086 0.998803
+0.392215 0.919873 -0.859338 -0.511408
+-0.256921 0.966433 0.659457 0.751742
+-0.984798 -0.173703 0.179135 -0.983825
+0.999994 0.00352835 0.938397 0.34556
+0.619758 0.784793 -0.644882 0.764282
+0.954372 0.298622 0.461485 -0.887148
+0.844466 0.535609 0.999666 -0.0258344
+0.825925 0.56378 -0.978994 -0.203889
+0.999867 -0.0163056 -0.0598043 -0.99821
+0.0993074 0.995057 -0.866646 0.498923
+0.164657 -0.986351 -0.672638 -0.739972
+-0.976857 -0.213895 -0.90683 0.421496
+-0.964865 -0.262745 0.116624 0.993176
+0.635204 0.772345 0.958864 0.283865
+0.221933 0.975062 -0.925467 0.378829
+0.514515 -0.857481 -0.803808 -0.594888
+0.114703 -0.9934 0.479425 -0.877583
+0.818342 -0.574732 -0.0334105 0.999442
+0.139483 0.990224 0.1427 -0.989766
+-0.36287 0.93184 0.84485 -0.535004
+-0.110697 -0.993854 0.0967251 0.995311
+0.94102 0.33835 -0.99915 0.0412138
+-0.893895 0.448276 -0.801876 -0.59749
+-0.932217 -0.3619 0.78468 -0.619901
+0.119373 0.992849 0.825028 0.565091
+0.883871 0.467732 -0.0224181 -0.999749
+0.65785 -0.753149 -0.895779 0.444499
+-0.64929 0.760541 0.0207643 0.999784
+0.74711 -0.664701 -0.899271 0.437391
+0.486013 -0.873952 0.883901 0.467674
+-0.339003 0.940785 -0.999603 -0.0281582
+0.904469 0.42654 0.996463 0.084027
+0.719749 0.694235 0.231324 0.972877
+0.497267 -0.867598 -0.206766 0.97839
+0.902958 0.429729 0.906042 0.423188
+-0.0987608 0.995111 -0.892729 -0.450594
+0.733661 -0.679516 0.772558 0.634945
+0.532351 0.846524 0.916672 0.39964
+-0.642593 0.766208 0.782105 0.623147
+0.722483 -0.691389 0.587606 -0.809147
+-0.789473 0.613786 -0.99382 0.111002
+0.649942 0.759984 -0.0649632 -0.997888
+-0.853647 0.520852 -0.191806 0.981433
+0.923004 -0.38479 -0.226148 -0.974093
+-0.174124 0.984724 0.220974 -0.97528
+-0.697316 -0.716764 -0.194285 -0.980945
+0.144949 -0.989439 -0.397697 0.917517
+0.958252 0.285925 -0.749948 -0.661496
+-0.98259 -0.185789 0.986889 -0.161403
+0.999985 0.00552191 0.851376 0.524556
+-0.614157 0.789184 -0.987497 -0.15764
+-0.0758769 0.997117 0.256103 0.966649
+0.939138 0.343541 -0.872271 -0.489022
+0.19522 -0.980759 0.697662 0.716427
+0.43159 -0.90207 0.800186 0.599752
+-0.228977 0.973432 -0.443306 -0.89637
+0.631282 -0.775554 0.700607 -0.713547
+-0.395472 -0.918478 -0.983379 -0.181564
+-0.591662 -0.806186 0.886972 -0.461823
+-0.0438743 -0.999037 -0.317936 0.948112
+-0.99491 -0.100769 -0.784297 -0.620385
+0.959023 -0.283328 -0.899625 0.436664
+0.386447 -0.922312 -0.396478 0.918044
+-0.646128 -0.763229 0.422132 -0.906534
+0.231076 -0.972936 -0.241216 -0.970471
+0.745289 -0.666741 -0.747732 0.664001
+0.82331 -0.567592 -0.785328 0.61908
+-0.491594 -0.870824 0.429842 -0.902904
+0.961168 0.275964 -0.950786 0.309848
+-0.09416 0.995557 -0.999987 -0.00518911
+-0.957247 -0.289273 -0.478005 -0.878357
+-0.928199 0.372084 0.910517 -0.413472
+-0.817806 0.575495 0.0597842 0.998211
+0.967819 -0.251647 0.953733 -0.300656
+-0.713557 0.700597 -0.608671 -0.793423
+-0.424304 -0.90552 0.986746 0.162273
+-0.855247 -0.518221 -0.480223 -0.877146
+0.589769 0.807572 0.970045 -0.242925
+-0.147679 -0.989035 -0.632666 -0.774425
+0.744077 0.668094 -0.615501 -0.788136
+0.5853 0.810817 0.9533 0.302024
+0.871229 0.490877 0.502675 0.864475
+-0.722626 0.691239 0.60422 -0.796818
+0.271129 0.962543 -0.68384 -0.729632
+0.651514 -0.758637 -0.268636 0.963242
+0.311668 0.950191 0.961381 -0.27522
+-0.999052 0.0435251 -0.350869 0.936424
+-0.177075 -0.984197 0.499111 0.866538
+0.749474 -0.662033 -0.995372 0.0960935
+0.626191 0.77967 0.121251 0.992622
+-0.975481 0.220085 -0.980261 0.19771
+-0.812372 0.58314 0.840283 0.542148
+0.821434 0.570304 -0.542523 -0.840041
+-0.173984 0.984748 0.207146 -0.97831
+0.969966 0.243242 0.846186 -0.532887
+0.744683 -0.667419 -0.68437 0.729135
+0.526904 0.849925 0.49471 0.869058
+0.936645 -0.350281 -0.334634 0.942348
+-0.947286 -0.320389 0.364168 0.931333
+0.271894 0.962327 -0.739639 -0.673004
+0.26053 0.965466 0.33952 -0.940599
+0.814107 0.580716 0.643969 -0.765052
+-0.610439 -0.792063 -0.951722 -0.306962
+-0.768683 -0.63963 0.959214 0.282679
+0.934043 0.35716 0.384157 -0.923268
+0.9905 0.137511 0.335735 0.941957
+-0.253042 0.967455 0.90063 0.434587
+-0.613749 -0.789501 -0.994322 0.106413
+0.473116 0.881 0.554502 0.832182
+0.994217 0.107394 -0.233243 -0.972419
+0.0707842 -0.997492 0.695874 0.718164
+-0.437414 0.89926 0.277269 0.960792
+0.813473 0.581603 0.723386 -0.690443
+0.638355 0.769742 0.992706 -0.120556
+-0.984172 -0.177215 0.511417 -0.859333
+0.971214 -0.238208 0.470736 0.882274
+-0.532448 0.846463 0.92119 -0.389113
+0.990953 0.134211 0.625259 0.780417
+-0.406421 -0.913686 -0.529574 0.848263
+0.161331 0.9869 -0.879535 0.475833
+0.515885 0.856658 -0.698846 0.715273
+0.597545 0.801835 0.351411 -0.936221
+-0.706562 -0.707652 -0.997031 -0.0770042
+-0.0647899 0.997899 0.979998 0.199007
+-0.89357 0.448925 -0.843121 -0.537723
+-0.513209 -0.858263 -0.884708 0.466145
+0.617768 0.78636 -0.815784 0.578357
+-0.852378 -0.522927 0.0502127 -0.998739
+-0.781328 -0.62412 -0.143218 -0.989691
+-0.333262 -0.942834 -0.835725 -0.549148
+0.27147 -0.962447 -0.709295 0.704912
+0.399007 -0.916948 -0.979528 -0.201309
+0.276207 -0.961098 -0.958308 0.285738
+-0.928035 0.372493 0.891432 -0.453154
+-0.893217 0.449626 -0.882671 -0.469991
+0.601256 -0.799057 -0.104327 0.994543
+-0.970441 0.24134 0.726136 0.687551
+-0.208971 -0.977922 -0.590708 -0.806885
+-0.999876 0.0157283 -0.00209793 -0.999998
+-0.671752 -0.740776 -0.169524 0.985526
+-0.10274 -0.994708 -0.646852 0.762616
+-0.0550866 0.998482 0.716702 -0.69738
+0.959985 -0.280053 -0.99389 0.110378
+0.494949 -0.868922 0.0586189 0.99828
+-0.803738 0.594983 0.627401 -0.778696
+-0.99442 0.105497 -0.413441 0.910531
+0.273717 -0.96181 -0.853163 0.521645
+-0.075682 -0.997132 0.274954 -0.961457
+-0.999582 -0.0289196 -0.969102 0.246662
+-0.990037 0.140809 0.00932086 -0.999957
+0.97186 -0.235558 0.215661 0.976468
+-0.490895 -0.871218 0.500822 -0.86555
+-0.704497 -0.709707 -0.932905 -0.360122
+-0.853372 -0.521302 -0.139829 -0.990176
+0.901193 -0.433418 0.663055 -0.748571
+0.948122 0.317906 0.592907 0.805271
+-0.00945564 0.999955 0.585274 0.810836
+0.897551 0.44091 -0.107968 0.994154
+-0.641916 -0.766775 0.834027 -0.551724
+0.631481 -0.775392 0.718655 -0.695366
+0.116585 -0.993181 0.636169 -0.771549
+-0.912241 0.409654 -0.202654 0.97925
+-0.459028 -0.888422 -0.843926 0.536459
+-0.922342 -0.386374 -0.389184 0.92116
+0.693998 -0.719976 0.263099 0.964769
+0.809469 0.587162 0.99704 -0.0768793
+-0.863298 0.504695 -0.875531 -0.483162
+-0.499725 0.866184 -0.472282 0.881447
+0.405043 -0.914298 -0.650993 -0.759084
+0.855253 -0.51821 -0.481324 0.876543
+0.97734 -0.211676 -0.788626 -0.614873
+-0.951073 -0.308965 0.999985 -0.00544228
+0.47031 0.882501 0.266317 0.963886
+0.878951 -0.476912 0.851676 0.524069
+-0.7392 0.673486 0.0640509 0.997947
+-0.90308 -0.429473 0.917661 0.397363
+-0.823733 0.566978 -0.829298 0.558806
+0.445435 0.895314 -0.57522 -0.817999
+-0.359895 0.932993 0.634363 -0.773035
+0.839785 -0.542918 0.665838 -0.746097
+-0.567065 -0.823673 -0.823325 0.56757
+-0.129993 0.991515 0.891652 0.452721
+-0.885247 -0.46512 -0.312318 -0.949977
+-0.185071 0.982725 0.972479 -0.232992
+0.627811 -0.778366 0.323595 -0.946196
+-0.99937 -0.0354811 -0.91821 -0.396094
+-0.487885 0.872908 0.76421 0.644967
+0.772395 0.635143 0.956601 -0.291402
+-0.881342 -0.472479 0.492916 -0.870077
+0.982505 -0.186236 0.993216 0.116287
+0.980237 -0.197828 0.484836 -0.874605
+-0.572008 0.820248 -0.357729 -0.933825
+-0.819989 0.572379 -0.315153 0.949041
+-0.625711 -0.780055 0.0600243 0.998197
+0.84451 -0.53554 0.999425 0.0339046
+-0.156972 0.987603 -0.998522 -0.0543578
+-0.048475 -0.998824 0.136587 0.990628
+-0.458779 0.88855 -0.858646 -0.512569
+-0.777003 -0.629497 0.519498 -0.854472
+-0.932857 -0.360246 0.663053 -0.748573
+0.0680837 0.99768 0.862576 -0.505928
+-0.892646 -0.450759 -0.935081 0.354434
+0.775912 0.630841 0.658969 -0.75217
+-0.848433 0.529303 0.717375 0.696687
+-0.999564 0.0295185 -0.982134 -0.188184
+-0.998417 0.0562486 0.792834 0.609438
+0.993524 -0.113624 0.381469 0.924382
+0.806638 -0.591046 0.91964 -0.392762
+-0.49509 -0.868842 0.0424665 -0.999098
+-0.251554 0.967843 0.95657 0.291504
+0.356513 -0.93429 0.319292 -0.947656
+-0.434894 0.900482 0.532095 0.846685
+-0.926931 -0.375232 0.720957 0.692979
+-0.75016 0.661257 -0.999973 -0.00734931
+-0.80444 -0.594034 0.714721 0.699409
+-0.874005 0.485916 0.888992 -0.457923
+0.773149 -0.634224 0.915274 0.402832
+0.911011 -0.412382 0.0951013 0.995468
+-0.983703 -0.179799 0.716971 -0.697103
+-0.981066 0.193671 0.801648 -0.597797
+0.818272 -0.574831 -0.0213036 0.999773
+-0.999831 0.0183587 -0.262077 -0.965047
+0.40232 -0.915499 -0.845011 -0.53475
+-0.341953 0.939717 -0.942112 -0.335299
+0.639927 0.768436 0.947576 -0.319531
+-0.150524 -0.988606 -0.826394 -0.563092
+-0.874391 -0.485223 0.922493 0.386014
+0.736512 -0.676424 0.445963 0.895051
+0.947484 0.319804 0.420957 0.907081
+0.373958 0.927445 0.809071 -0.587711
+-0.93074 0.365681 0.965708 0.25963
+-0.254553 0.967059 0.822025 0.569452
+0.0842425 -0.996445 -0.548242 0.83632
+-0.952859 -0.303413 0.831657 -0.555289
+-0.295896 -0.95522 0.19297 0.981205
+-0.0547922 0.998498 0.695829 -0.718208
+0.968417 0.249335 0.99778 0.0665922
+-0.402515 -0.915413 -0.833395 0.552677
+0.545961 0.837811 0.357826 -0.933788
+-0.26282 -0.964845 0.108904 -0.994052
+0.987231 -0.159296 -0.958308 0.285736
+0.977401 -0.211395 -0.770659 -0.637248
+0.983124 0.18294 0.899596 -0.436722
+-0.974868 -0.222785 -0.888909 -0.458084
+-0.59342 0.804893 0.765955 0.642894
+-0.682192 -0.731173 0.948408 0.317052
+0.960294 -0.278989 -1 -0.000182021
+0.05168 0.998664 0.442081 0.896975
+-0.923007 -0.384783 -0.22542 0.974262
+-0.994807 0.101783 -0.717098 0.696972
+-0.244114 -0.969746 0.890602 0.454784
+-0.976456 0.215716 -0.969239 -0.246123
+0.99277 -0.120029 0.860546 0.509373
+-0.986014 -0.166662 -0.509373 -0.860546
+0.13119 -0.991357 0.830606 0.55686
+0.727535 0.686071 0.978193 0.207699
+-0.0163439 0.999866 -0.0636232 0.997974
+-0.595741 0.803177 0.551272 0.834325
+0.999913 0.0131773 0.250337 0.968159
+-0.335246 0.94213 -0.932026 0.362393
+-0.967685 -0.252162 0.936361 0.35104
+-0.935478 0.353385 -0.0096107 0.999954
+-0.825757 -0.564026 -0.972513 -0.232848
+-0.332786 0.943002 -0.806934 0.590642
+0.9986 -0.0528902 0.547271 0.836956
+-0.29443 0.955673 0.0408061 -0.999167
+-0.923352 -0.383955 -0.137284 0.990532
+0.980249 0.197767 0.490321 0.871542
+0.993348 -0.115147 0.518209 0.855254
+-0.182432 -0.983219 0.875823 0.482633
+-0.0668154 -0.997765 0.919756 -0.39249
+0.962322 -0.271913 -0.740981 -0.671526
+-0.386157 -0.922433 -0.367404 -0.930061
+0.116843 -0.99315 0.656 -0.754761
+-0.998714 0.0506891 0.35105 0.936357
+0.971613 0.236576 0.316515 -0.948587
+-0.805875 0.592086 0.861454 -0.507836
+-0.944918 0.327307 -0.35088 -0.936421
+-0.186047 0.982541 0.990785 -0.135446
+0.971653 -0.236413 0.300576 0.953758
+0.906696 -0.421784 0.904274 0.426952
+0.998232 -0.0594342 0.943993 0.329964
+-0.897778 0.440448 -0.0565879 -0.998398
+0.849515 -0.527564 0.560692 0.828025
+-0.994176 -0.107764 -0.196896 -0.980424
+0.318861 0.947802 0.508966 -0.860787
+0.979998 0.199006 0.376485 0.926423
+0.123998 -0.992282 0.990965 -0.134119
+-0.951211 -0.308542 0.998755 -0.0498849
+0.977291 0.211902 -0.802676 0.596415
+0.893289 0.449482 -0.875001 0.484121
+0.842669 0.538431 0.952706 0.303892
+-0.989117 0.14713 -0.588674 -0.808371
+-0.484121 -0.875001 0.963677 -0.267071
+-0.788171 0.615457 -0.948262 0.317487
+-0.979951 0.199238 0.354407 -0.935091
+0.978755 -0.205034 -0.227525 -0.973772
+0.964067 -0.26566 -0.1843 -0.98287
+-0.999999 0.00150179 0.988744 -0.149615
+0.948635 -0.316372 0.714917 -0.699209
+-0.437079 -0.899423 0.312951 -0.949769
+0.0683138 0.997664 0.850681 -0.525682
+0.826867 -0.562398 -0.999277 0.0380163
+-0.660877 0.750494 -0.998323 0.0578864
+0.998812 0.0487245 0.161283 -0.986908
+-0.797296 0.603588 -0.386393 -0.922334
+-0.819666 0.572842 -0.261075 0.965319
+-0.833767 0.552117 -0.362249 -0.932081
+0.555821 -0.831302 -0.728115 0.685455
+-0.410345 -0.91193 -0.12792 0.991784
+-0.679604 0.733579 0.780097 -0.625659
+0.153331 -0.988175 -0.951072 0.308969
+-0.463819 -0.88593 -0.448009 0.894029
+0.28703 -0.957921 -0.668801 -0.743442
+-0.391069 -0.920362 -0.789092 -0.614275
+0.365647 0.930754 0.964739 0.263208
+0.999442 -0.0333958 -0.980341 0.197308
+-0.200089 -0.979778 0.271996 -0.962298
+0.96891 -0.247413 0.991324 0.13144
+-0.960984 -0.276604 -0.969278 0.245967
+0.0120721 -0.999927 0.355605 0.934636
+0.976725 0.214496 -0.931043 0.36491
+-0.66086 -0.750509 -0.998185 -0.0602218
+0.135178 0.990821 0.546197 -0.837656
+-0.285169 -0.958477 -0.799767 0.60031
+0.982776 0.184799 0.965661 -0.259805
+-0.329878 -0.944024 -0.589709 -0.807615
+-0.475631 -0.879645 0.766533 0.642205
+0.996556 -0.0829263 -0.433326 -0.901237
+0.331295 0.943527 -0.703903 -0.710296
+-0.729495 -0.683986 0.997043 -0.0768436
+-0.510159 -0.86008 -0.991577 0.129517
+-0.918691 0.394977 -0.972187 -0.234206
+-0.987868 -0.155299 -0.993401 0.114692
+0.982637 0.185536 0.982417 -0.186699
+-0.936845 0.349745 -0.387938 0.921686
+0.88136 -0.472446 0.489627 0.871932
+-0.911717 0.410819 -0.07626 0.997088
+0.588009 -0.808854 0.999616 0.02771
+0.0971334 -0.995271 -0.954175 -0.299249
+0.748756 0.662845 -0.979141 -0.203181
+0.193745 0.981052 0.797134 -0.603803
+-0.968609 -0.248591 0.999948 -0.0102029
+0.239947 -0.970786 0.620313 -0.784354
+0.995381 0.0959991 -0.982016 -0.188799
+0.149999 0.988686 -0.795319 -0.606192
+0.991298 -0.131634 0.804889 -0.593425
+0.998032 0.062704 0.999962 -0.00867279
+0.93868 -0.344791 -0.799661 0.600452
+0.927911 -0.372801 0.875906 -0.482482
+-0.941749 -0.336317 -0.967109 0.254364
+-0.333434 -0.942774 -0.845568 -0.533868
+0.986278 -0.165091 -0.639443 0.768839
+0.369955 0.92905 0.980671 -0.195662
+0.889047 -0.457816 -0.909045 0.416698
+-0.439491 -0.898247 0.0498637 -0.998756
+0.191895 0.981415 0.896162 -0.443726
+-0.725466 -0.688258 0.872604 0.488428
+-0.581103 0.81383 0.679629 -0.733556
+0.27262 0.962122 -0.788234 -0.615376
+0.409047 -0.912513 -0.2673 -0.963613
+0.98056 -0.196219 0.62125 -0.783613
+0.688423 -0.72531 0.861296 0.508103
+-0.0153655 0.999882 0.0341814 0.999416
+-0.999136 0.041558 -0.527276 0.849694
+0.811041 -0.584989 0.941014 0.338366
+-0.335309 -0.942108 -0.934407 -0.356207
+-0.860965 0.508665 -0.999044 -0.0437149
+-0.499116 0.866535 -0.409143 0.91247
+-0.959193 -0.282753 -0.924178 -0.381962
+0.422631 0.906302 0.940181 0.340675
+-0.948095 0.317987 0.586005 -0.810307
+0.0915559 -0.9958 -0.967323 0.253546
+-0.184066 -0.982914 0.943608 0.331064
+0.0812056 0.996697 -0.272061 -0.96228
+0.186729 -0.982411 0.997796 -0.0663573
+0.944184 -0.329419 -0.54978 -0.835309
+0.211698 0.977335 -0.790021 -0.61308
+0.247963 -0.96877 0.997183 -0.0750085
+0.772705 -0.634765 0.941201 0.337847
+0.560789 0.827959 -0.987784 -0.15583
+-0.559332 0.828944 -0.945305 0.326189
+-0.856086 -0.516834 -0.615483 -0.78815
+0.689782 0.724017 0.751439 -0.659803
+-0.977058 -0.212976 -0.863211 0.504844
+-0.997715 -0.0675602 0.887922 0.459993
+0.347193 -0.937794 -0.621512 -0.783404
+0.0215247 -0.999768 -0.549564 0.835451
+0.67731 0.735698 0.550131 0.835078
+0.56145 0.827511 -0.997069 -0.0765094
+0.967767 -0.251847 0.947302 -0.320342
+0.948386 -0.317119 0.657642 -0.75333
+0.712908 0.701257 -0.679383 0.733784
+0.483566 -0.875308 0.978674 0.205418
+0.302509 0.953146 0.775369 0.631508
+-0.741435 -0.671024 -0.26527 -0.964174
+-0.119854 -0.992792 0.85144 0.524451
+0.796533 -0.604595 -0.499563 -0.866277
+0.979676 0.200586 0.222868 0.974849
+0.92011 0.39166 -0.826907 0.562339
+-0.93498 0.354702 0.130801 0.991409
+0.23225 0.972656 -0.122571 0.99246
+-0.996895 -0.0787473 -0.0289041 0.999582
+0.267609 0.963528 -0.377895 -0.925848
+0.913288 -0.407315 -0.444227 0.895914
+-0.00246626 -0.999997 0.969742 -0.244134
+0.996551 -0.0829836 -0.438499 -0.898732
+0.728134 -0.685434 0.992593 -0.12149
+0.97681 -0.214108 -0.915789 -0.401659
+0.166715 -0.986005 -0.504676 -0.863309
+0.127544 -0.991833 0.975274 0.220998
+0.725056 0.68869 0.842012 0.539459
+0.724093 0.689702 0.758675 0.651469
+-0.621801 0.783175 -0.426086 -0.904683
+0.00150761 0.999999 0.988657 -0.150191
+-0.560591 -0.828093 -0.983787 -0.179343
+0.673292 -0.739376 0.0378168 -0.999285
+0.938316 0.345779 -0.732123 -0.681173
+-0.839967 0.542637 0.690486 -0.723346
+0.999985 -0.00544693 0.855285 -0.518158
+0.240682 0.970604 0.67786 0.735191
+-0.676231 0.736689 0.42238 -0.906419
+0.946644 -0.32228 0.172128 -0.985075
+-0.509059 0.860731 -0.999998 -0.00207244
+0.317828 0.948148 0.599567 -0.800325
+0.593549 0.804798 0.755545 -0.655097
+0.955006 -0.296586 0.263271 0.964722
+0.903221 -0.429176 0.930227 -0.366985
+0.959358 0.282191 -0.944938 -0.327249
+0.995088 -0.098997 -0.881783 0.471655
+0.999154 -0.0411341 -0.562841 0.826565
+-0.997074 0.076443 0.200838 -0.979624
+0.3274 0.944886 -0.360018 -0.932945
+-0.99929 -0.0376743 -0.809951 -0.586497
+-0.340481 -0.940251 -0.982879 0.18425
+0.683876 0.729598 0.995769 0.0918941
+-0.0352097 0.99938 -0.928627 -0.371014
+-0.417332 -0.908754 0.596583 0.802551
+0.998045 0.0624934 0.999557 -0.0297626
+0.179582 0.983743 0.701406 0.712762
+-0.965612 0.259988 0.391768 -0.920064
+0.189277 -0.981924 0.98142 0.191874
+-0.547287 0.836945 0.206086 0.978534
+-0.878507 -0.477729 0.896618 -0.442805
+0.651325 0.758799 -0.244584 -0.969628
+-0.837769 -0.546024 0.350715 0.936482
+0.0968797 0.995296 -0.961495 0.274824
+0.99957 0.0293191 -0.978184 0.207741
+-0.597289 -0.802026 0.381139 -0.924518
+-0.62146 -0.783446 -0.465106 0.885255
+0.999715 0.023874 -0.728983 0.684532
+0.634694 -0.772764 0.938056 -0.346484
+0.997407 0.0719678 0.60596 0.795495
+0.954069 -0.299588 0.548836 0.83593
+0.342045 0.939683 -0.938772 0.344539
+0.248767 0.968563 0.999968 -0.00801257
+0.807394 0.590012 0.962286 0.272041
+0.605352 0.795958 -0.579536 -0.814946
+0.640376 0.768061 0.927256 -0.374427
+0.608084 0.793872 -0.820275 -0.571969
+0.681176 0.73212 0.895399 0.445265
+0.671428 0.74107 -0.212409 0.977181
+-0.666991 -0.745066 -0.725058 0.688688
+-0.468753 0.883329 0.0930486 -0.995662
+-0.643032 -0.765839 0.745155 -0.666891
+-0.473451 0.88082 0.585753 -0.810489
+-0.965044 0.262086 0.18415 -0.982898
+0.788005 -0.615668 -0.939397 0.342831
+0.998035 0.0626565 0.99991 -0.0134273
+-0.979537 0.201265 0.154815 -0.987943
+0.747171 0.664632 -0.903256 -0.429103
+-0.980004 0.198975 0.379379 -0.925241
+0.0122225 0.999925 0.341499 -0.939882
+-0.965177 0.261597 0.233743 -0.972298
+0.955997 0.293375 -0.0695437 -0.997579
+-0.750781 0.660551 -0.994861 -0.101246
+0.951434 0.307853 0.992517 -0.122104
+-0.199378 0.979923 0.341024 0.940054
+-0.769825 0.638255 0.99419 -0.107636
+-0.321375 -0.946952 0.2654 -0.964138
+0.891622 -0.452781 -0.9908 -0.135331
+-0.784844 0.619694 -0.651068 0.75902
+-0.935745 -0.352678 -0.0850988 -0.996373
+0.921896 -0.387438 -0.492731 -0.870182
+-0.563142 0.82636 -0.991817 -0.127669
+0.0113382 -0.999936 0.423178 0.906047
+0.604596 0.796532 -0.499687 -0.866206
+-0.94224 0.334938 -0.91968 -0.392669
+0.80277 -0.596288 0.493132 -0.869954
+-0.224616 0.974447 -0.787669 -0.616099
+-0.83886 -0.544347 0.529796 0.848125
+0.983382 0.181547 0.82891 -0.559381
+-0.872947 0.487815 0.769348 -0.63883
+0.153938 0.988081 -0.968226 -0.250075
+-0.621329 0.78355 -0.479826 -0.877364
+0.934921 0.354857 0.147253 -0.989099
+-0.943203 -0.332217 -0.769825 0.638255
+0.394253 -0.919002 -0.950719 0.310053
+0.955197 -0.295972 0.200764 0.97964
+-0.920534 -0.390662 -0.761186 0.648534
+-0.201222 0.979546 0.159129 0.987258
+0.910407 0.413713 0.239025 -0.971013
+0.97986 0.199687 0.311273 0.950321
+-0.981932 -0.189235 0.982248 0.187585
+-0.98693 -0.161147 -0.888244 -0.459371
+0.87816 0.478366 0.926373 -0.376608
+0.862215 -0.506542 -0.958209 -0.28607
+-0.88939 -0.45715 -0.937689 -0.347475
+-0.643848 0.765153 0.669948 0.742408
+-0.340452 0.940262 -0.983433 -0.181269
+-0.147071 0.989126 -0.583876 0.811843
+-0.227623 0.973749 -0.563313 -0.826243
+-0.315473 -0.948935 0.777869 -0.628426
+0.486464 -0.873701 0.858585 0.512672
+0.167424 0.985885 -0.44142 0.897301
+0.961818 0.273691 -0.851734 0.523974
+-0.868129 -0.496339 -0.10117 0.994869
+-0.684065 0.729421 0.997819 -0.0660087
+-0.997933 0.0642673 0.989071 -0.147439
+-0.992869 0.119209 0.815601 0.578615
+-0.55713 -0.830425 -0.826619 -0.562762
+0.872109 0.489311 0.649052 0.760744
+-0.998012 -0.063024 0.999726 0.0233885
+0.891439 0.453142 -0.995467 0.0951091
+-0.349228 0.937038 -0.438186 -0.898884
+0.669476 -0.742833 -0.459174 -0.888346
+0.672624 0.739985 -0.0525138 0.99862
+0.640693 -0.767797 0.911044 0.412309
+-0.418723 -0.908114 0.71198 0.702199
+0.861503 0.507753 -0.988831 0.149042
+-0.889729 0.456489 -0.96087 0.276999
+0.973796 -0.227425 -0.579955 0.814648
+0.574254 0.818677 -0.0916331 0.995793
+-0.962964 0.269629 -0.562331 -0.826912
+-0.999238 0.0390402 -0.722475 0.691397
+-0.434822 -0.900516 0.538831 -0.842414
+-0.974618 -0.223873 -0.83235 -0.554251
+-0.841782 0.539817 0.89007 -0.455824
+-0.0249446 0.999689 -0.797974 0.602692
+0.798803 -0.601593 -0.14615 -0.989262
+-0.220982 -0.975278 -0.957951 0.28693
+-0.985149 -0.171699 -0.0233729 -0.999727
+0.403975 0.91477 -0.735043 0.67802
+-0.855761 0.517371 -0.564846 0.825196
+-0.629253 0.777201 0.492464 -0.870333
+-0.834223 0.551427 -0.283925 -0.958847
+-0.964686 0.263403 0.0487168 -0.998813
+0.932027 -0.362388 0.816045 0.577989
+0.168441 -0.985712 -0.346598 -0.938014
+0.945763 -0.324856 -0.0990791 -0.99508
+-0.882181 0.47091 0.331133 0.943584
+-0.912404 0.409291 -0.241374 0.970432
+0.983765 0.179462 0.692693 -0.721232
+0.910106 -0.414375 0.308974 0.951071
+-0.998819 -0.04859 0.147983 -0.98899
+-0.511721 0.859151 -0.951833 -0.306617
+0.301483 -0.953472 0.703007 -0.711183
+-0.635873 -0.771793 0.979854 0.199714
+0.331798 0.94335 -0.740741 -0.671791
+-0.992099 0.125459 0.999919 -0.0126971
+-0.155926 -0.987769 -0.998676 -0.0514439
+-0.72584 -0.687864 0.897841 0.440319
+-0.937569 0.3478 -0.569564 0.821947
+0.719122 -0.694884 0.142739 -0.98976
+0.884426 0.466681 -0.140779 -0.990041
+0.923276 -0.384138 -0.156795 -0.987631
+-0.938444 -0.345431 -0.756876 -0.653559
+-0.7575 -0.652835 -0.431554 0.902087
+-0.569833 0.82176 -0.589745 -0.80759
+0.368733 -0.929536 0.997862 0.0653598
+-0.997834 -0.0657797 0.955472 0.295081
+0.927368 0.374151 0.796669 0.604416
+-0.522857 0.85242 0.0420191 -0.999117
+-0.342926 -0.939362 -0.902384 0.430933
+-0.98718 0.159609 -0.948757 0.316007
+-0.333492 -0.942753 -0.848871 -0.5286
+0.804067 0.594539 0.669408 0.742895
+0.910277 -0.413999 0.269411 0.963025
+-0.652466 -0.757818 -0.387192 -0.921999
+0.721482 -0.692433 0.464831 -0.8854
+0.726417 -0.687254 0.931594 -0.363501
+0.932457 0.36128 0.741771 -0.670653
+-0.374876 0.927075 0.747022 0.664799
+0.83796 -0.545732 0.38314 -0.92369
+0.998341 -0.057584 0.867026 0.498262
+0.41948 -0.907765 0.768026 -0.640419
+0.0400649 0.999197 -0.647904 0.761722
+0.246078 -0.96925 0.963881 -0.266332
+-0.967343 0.253471 0.880454 -0.474131
+-0.9293 0.369327 0.991647 -0.128983
+-0.122532 0.992465 0.960422 -0.27855
+0.401205 0.915988 -0.903679 0.42821
+0.928569 0.371159 0.947135 0.320834
+-0.230297 -0.97312 -0.318069 0.948068
+0.925021 0.379917 0.294834 0.955548
+0.648037 0.761608 0.184303 -0.98287
+-0.586439 -0.809993 0.986213 0.165482
+-0.736845 -0.676061 0.401354 -0.915923
+0.00631573 -0.99998 0.807097 0.590419
+0.999793 -0.0203515 -0.447972 -0.894047
+-0.900122 0.435638 0.46036 -0.887732
+-0.0720805 0.997399 0.596938 0.802287
+0.93479 0.3552 0.18349 -0.983022
+0.0992882 -0.995059 -0.867604 -0.497255
+0.961637 -0.274325 -0.884399 -0.466731
+-0.9795 -0.201446 0.136554 0.990633
+-0.971206 0.23824 0.473636 0.880721
+0.936317 0.351156 -0.245292 -0.969449
+-0.975015 0.22214 -0.917215 0.398392
+0.814222 0.580554 0.628635 -0.7777
+0.918688 -0.394984 -0.972369 -0.233449
+-0.5556 0.83145 -0.709656 0.704549
+0.549485 0.835504 -0.0552638 -0.998472
+0.0217857 0.999763 -0.571185 -0.820821
+-0.0118217 0.99993 0.378888 0.925443
+0.596685 0.802476 0.449586 -0.893237
+0.916688 0.399604 -0.964354 -0.264614
+-0.999601 0.0282498 -0.950413 -0.31099
+0.924631 -0.380865 0.195449 -0.980714
+-0.98804 -0.1542 -0.974532 0.22425
+0.918495 -0.395432 -0.982587 -0.185805
+0.264698 0.964331 -0.0854643 -0.996341
+-0.255161 -0.966899 0.784638 -0.619954
+0.999655 -0.0262779 -0.87103 -0.49123
+0.877451 -0.479666 0.971782 0.235879
+0.131312 -0.991341 0.823734 0.566976
+0.667827 0.744316 -0.643348 0.765574
+-0.903098 -0.429435 0.91935 0.39344
+-0.766964 0.64169 0.849915 -0.526919
+0.748519 -0.663113 -0.971253 0.238048
+-0.911651 -0.410966 -0.0600896 -0.998193
+0.410816 -0.911718 -0.0764956 -0.99707
+0.607434 0.79437 -0.770761 -0.637124
+-0.706227 -0.707986 -0.992271 -0.124089
+-0.866424 -0.499309 -0.42943 0.9031
+0.802047 0.597261 0.384295 0.92321
+0.549128 0.835738 -0.0125715 -0.999921
+0.960432 0.278515 -0.998773 0.0495323
+0.541239 0.840869 0.800741 -0.59901
+-0.721059 -0.692874 0.409892 0.912134
+0.620312 0.784355 -0.589343 0.807883
+0.829359 0.558715 -0.918454 0.395527
+0.97671 -0.214563 -0.933525 -0.358513
+-0.31448 0.949264 0.839218 0.543795
+-0.540515 0.841335 0.849265 0.527968
+0.203002 0.979178 -0.0219187 -0.99976
+-0.949407 0.314049 0.863038 -0.505138
+-0.831684 0.555249 -0.679284 -0.733875
+-0.230583 -0.973053 -0.290084 0.957001
+-0.75824 0.651975 -0.326716 -0.945122
+0.907356 -0.420362 0.826555 0.562855
+-0.596565 -0.802565 0.462848 -0.886438
+-0.829425 -0.558618 -0.913742 0.406295
+-0.63797 -0.770061 0.997491 -0.0707884
+-0.617449 -0.786611 -0.838599 0.544749
+-0.99573 -0.0923134 -0.983795 0.179298
+-0.847166 0.531328 0.861803 0.507243
+0.173138 -0.984898 0.122465 -0.992473
+0.859599 0.510969 -0.974995 -0.222227
+0.308798 -0.951128 0.999736 -0.0229873
+-0.523501 -0.852025 0.117312 0.993095
+-0.573663 -0.819091 -0.163238 0.986587
+-0.740301 -0.672276 -0.0993957 -0.995048
+0.358831 -0.933403 0.542306 -0.840181
+-0.174769 0.984609 0.284401 -0.958705
+0.305741 0.952115 0.941311 0.337539
+0.845284 -0.534317 0.984069 0.177785
+-0.918847 0.394615 -0.962205 -0.272326
+0.0284646 0.999595 -0.956875 -0.2905
+0.906791 0.421581 0.89448 -0.447108
+0.935961 0.352104 -0.146002 -0.989284
+-0.766381 0.642387 0.798617 -0.60184
+0.516512 0.85628 -0.644696 0.764439
+0.989711 0.14308 -0.218374 0.975865
+-0.368783 -0.929515 0.997491 -0.0707903
+-0.9996 -0.0282725 -0.951116 0.308832
+0.060812 0.998149 0.980417 0.196932
+0.642039 0.766672 0.825114 -0.564966
+0.84705 -0.531513 0.872723 0.488216
+0.95723 -0.289329 -0.472867 0.881134
+-0.986671 -0.162729 -0.80354 -0.595251
+0.545148 -0.83834 0.446559 0.894754
+-0.803255 -0.595635 0.562205 0.826998
+0.727466 0.686143 0.976076 0.217431
+-0.993361 0.115038 0.508777 0.860898
+0.0274359 0.999624 -0.921971 -0.387259
+-0.66102 -0.750368 -0.999243 -0.0388995
+0.780419 -0.625257 0.00178153 0.999998
+0.989277 0.146052 -0.497253 0.867606
+-0.184797 -0.982777 0.965613 0.259985
+-0.353707 -0.935356 0.0247686 0.999693
+-0.393448 -0.919347 -0.919948 -0.392039
+-0.698973 0.715148 -0.414122 0.910221
+-0.366968 0.930233 0.992281 -0.124011
+-0.999302 0.0373549 -0.828278 0.560318
+-0.581983 -0.813201 0.754857 0.655889
+-0.997886 -0.0649857 0.975904 0.218201
+-0.824735 0.565519 -0.914699 0.404136
+0.855654 0.517548 -0.547712 -0.836667
+0.036555 -0.999332 -0.870431 -0.492291
+-0.986274 0.165116 -0.637487 0.770461
+0.618629 0.785684 -0.747735 0.663998
+0.613942 0.789351 -0.991421 0.130708
+-0.650808 -0.759243 -0.177985 -0.984033
+0.499848 0.866113 -0.484686 -0.874688
+0.507302 -0.861768 -0.979681 0.200564
+0.629082 0.777339 0.473186 0.880963
+-0.834114 0.551593 -0.30294 -0.95301
+0.986401 -0.164354 -0.695037 0.718974
+0.94603 0.32408 -0.0171397 0.999853
+-0.638847 0.769334 0.982979 0.183716
+-0.999999 0.00164747 0.98646 -0.164003
+0.787415 -0.616423 -0.902277 0.431158
+0.971399 -0.237452 0.400702 0.916208
+-0.728596 -0.684944 0.998519 0.0544071
+-0.711275 0.702914 -0.830241 -0.557405
+0.264014 0.964519 -0.0146265 -0.999893
+-0.0323437 0.999477 -0.995647 -0.0932075
+-0.115592 0.993297 0.555925 -0.831233
+0.120314 0.992736 0.874786 0.48451
+0.98824 -0.152914 -0.937176 -0.348856
+0.969972 -0.243216 0.844747 0.535166
+0.865332 -0.501199 -0.614811 -0.788675
+-0.581396 0.81362 0.705642 -0.708569
+-0.129701 0.991553 0.904593 0.426276
+-0.846006 0.533174 0.951143 0.308752
+1 -0.000721078 0.997401 -0.0720453
+0.193864 -0.981028 0.789782 0.613388
+0.39621 -0.91816 -0.994787 0.101976
+0.856027 0.516931 -0.606566 -0.795033
+-0.973286 -0.229596 -0.385486 -0.922714
+-0.239169 0.970978 0.555595 -0.831453
+0.123419 0.992355 0.981451 0.191715
+-0.41631 -0.909223 0.502785 0.864411
+0.892861 -0.450332 -0.917065 -0.398738
+-0.797801 0.602921 -0.308004 -0.951385
+-0.994734 -0.102488 -0.665938 -0.746007
+0.911744 0.41076 -0.082669 -0.996577
+0.33289 -0.942966 -0.813372 0.581744
+-0.998052 0.0623941 0.999211 0.0397098
+0.729418 0.684069 0.997848 -0.0655758
+0.51279 0.858514 -0.906404 0.422413
+0.997947 -0.0640383 0.992194 -0.124702
+0.99603 0.0890158 -0.872061 0.489397
+0.70198 0.712196 -0.750216 -0.661192
+-0.770963 -0.63688 0.997509 -0.070535
+-0.771022 0.636808 0.996813 0.0797737
+-0.501594 0.865103 -0.650149 0.759807
+0.661482 -0.749961 -0.999741 -0.0227477
+-0.543416 -0.839463 0.620464 -0.784235
+-0.919167 -0.393867 -0.936875 0.349665
+0.539024 -0.842291 0.928998 0.370084
+-0.73127 -0.682088 0.943831 -0.33043
+-0.992791 0.11986 0.851772 0.523912
+0.371918 0.928265 0.91777 -0.397113
+0.771173 -0.636625 0.994637 0.103428
+0.776 -0.630733 0.648398 0.761301
+0.372588 0.927997 0.886775 -0.462202
+-0.475045 -0.879961 0.722105 0.691784
+-0.271654 -0.962395 -0.722653 -0.691211
+-0.160765 0.986993 -0.905354 -0.424658
+0.26032 0.965523 0.359957 -0.932969
+0.999436 -0.0335951 -0.976212 0.216818
+-0.999288 -0.0377219 -0.807147 -0.590351
+0.769501 -0.638645 0.98745 -0.157932
+0.877228 -0.480074 0.981703 0.190416
+0.819976 -0.572397 -0.313047 0.949738
+-0.830903 0.556418 -0.7754 -0.631471
+0.997002 -0.0773742 0.108608 -0.994085
+-0.266789 -0.963755 -0.297881 -0.954603
+0.794567 -0.607177 -0.749712 -0.661764
+0.78016 0.62558 0.0431865 -0.999067
+0.69059 -0.723247 0.673237 0.739427
+0.754053 -0.656813 -0.826384 -0.563108
+0.721377 0.692543 0.451279 0.892383
+0.999874 -0.015869 -0.0161695 -0.999869
+-0.999658 0.0261375 -0.864044 -0.503416
+-0.997215 -0.0745871 0.378652 0.925539
+-0.487803 0.872954 0.77022 0.637778
+-0.641654 0.766994 0.852369 0.522941
+0.479289 0.877657 0.96078 0.27731
+0.7922 -0.610261 -0.944609 -0.328199
+0.300165 0.953887 0.598318 0.801259
+0.24815 -0.968722 0.998446 -0.0557367
+-0.713343 0.700815 -0.632644 -0.774442
+-0.773824 0.633401 0.867308 0.497771
+-0.425346 -0.905031 0.998856 0.0478294
+-0.111527 0.993761 0.179378 -0.98378
+-0.876111 -0.482109 0.999178 0.0405391
+-0.594333 0.804219 0.688191 0.72553
+0.986688 -0.162627 -0.809628 0.586943
+0.616686 -0.787209 -0.887394 -0.461012
+-0.931208 -0.364488 0.924616 -0.380902
+0.980667 -0.195683 0.663109 -0.748523
+-0.645942 0.763386 0.444098 0.895978
+-0.949345 0.314237 0.852855 -0.522148
+0.766326 -0.642451 0.793507 -0.608561
+-0.0926968 0.995694 -0.989968 0.141294
+0.613966 -0.789333 -0.991025 -0.13368
+0.71432 -0.699819 -0.51878 -0.854908
+0.984336 -0.176304 0.429772 0.902937
+0.0085724 -0.999963 0.654519 0.756046
+0.995077 -0.0991071 -0.876514 0.481376
+0.552261 -0.833671 -0.378318 0.925676
+-0.650325 -0.759656 -0.115149 -0.993348
+0.786461 0.61764 -0.825124 -0.564951
+0.538962 -0.84233 0.931672 0.3633
+0.669958 0.742399 -0.400573 0.916265
+-0.738202 -0.674579 0.210449 -0.977605
+0.472408 0.88138 0.485888 0.874021
+-0.999297 0.0374907 -0.820588 0.57152
+0.238237 -0.971207 0.473295 -0.880904
+0.912114 0.409937 -0.172121 -0.985076
+-0.335716 -0.941963 -0.948908 -0.315553
+-0.881711 -0.47179 0.423461 -0.905914
+-0.93794 0.346798 -0.653993 0.756501
+0.856425 0.516271 -0.665923 -0.746021
+-0.0519516 0.99865 0.466305 -0.884624
+-0.240029 -0.970766 0.626918 0.779085
+-0.501425 -0.865201 -0.635132 -0.772404
+-0.772256 -0.635311 0.962728 -0.270472
+-0.394706 -0.918808 -0.964849 -0.262804
+-0.990316 -0.138831 0.207526 0.97823
+0.487567 0.873085 0.78713 -0.616787
+-0.56687 -0.823807 -0.836515 0.547945
+0.745669 -0.666317 -0.784311 0.620368
+-0.737225 -0.675647 0.349254 -0.937028
+-0.963664 -0.267119 -0.330322 0.943868
+0.594327 0.804224 0.688787 -0.724963
+-0.985941 0.167092 -0.47138 0.88193
+-0.875299 0.483582 0.978285 -0.207265
+0.726805 0.686844 0.950618 0.310363
+0.158634 0.987338 -0.975307 0.220855
+-0.823063 0.56795 -0.757708 0.652594
+0.973988 -0.226599 -0.646931 0.762549
+0.646873 -0.762597 0.331692 0.943388
+-0.998096 -0.0616864 0.993887 -0.110403
+0.334072 -0.942547 -0.879761 0.475415
+0.99953 -0.0306707 -0.99726 -0.0739783
+0.695184 0.718832 0.101232 -0.994863
+0.988561 -0.150822 -0.842989 -0.537931
+-0.997677 0.0681222 0.86062 -0.509248
+0.863753 -0.503916 -0.828466 -0.56004
+0.963508 0.267681 -0.384806 0.922997
+0.399104 0.916906 -0.977344 0.211659
+-0.999323 0.0367986 -0.858171 0.513364
+-0.996543 0.0830734 -0.446587 -0.89474
+-0.131569 0.991307 0.808737 0.58817
+0.0151675 -0.999885 0.0539646 0.998543
+0.319844 0.94747 0.417105 -0.908858
+0.923652 -0.383232 -0.0593496 -0.998237
+-0.646951 0.762531 0.322031 0.946729
+0.744299 -0.667847 -0.641295 0.767295
+-0.967912 0.251289 0.964189 -0.265217
+-0.981187 -0.193058 0.83741 0.546574
+-0.972098 -0.234576 0.116017 -0.993247
+-0.554304 0.832314 -0.591691 0.806165
+0.592917 0.805264 0.804624 -0.593784
+0.874116 0.485718 0.899172 0.437596
+-0.998805 0.0488827 0.176891 0.98423
+-0.719134 -0.694872 0.144392 0.989521
+-0.999997 -0.00244145 0.970344 0.241727
+-0.759511 -0.650495 -0.137313 0.990528
+0.571994 -0.820258 -0.359367 -0.933196
+0.824447 -0.565939 -0.892987 0.450082
+-0.887156 -0.46147 -0.666494 -0.745511
+-0.255519 -0.966804 0.761166 -0.648557
+-0.857788 0.514004 -0.837838 0.545919
+-0.731332 0.682022 0.940783 0.33901
+-0.285051 -0.958512 -0.80706 0.59047
+-0.965803 -0.259278 0.458299 0.888798
+-0.620102 0.784521 -0.610706 -0.791858
+0.349685 0.936867 -0.393875 0.919164
+-0.964869 0.262731 0.118077 -0.993004
+-0.807474 0.589902 0.965886 -0.258968
+-0.719458 0.694536 0.190403 -0.981706
+0.954547 -0.298059 0.408443 0.912784
+0.755678 -0.654943 -0.663061 -0.748565
+-0.59384 -0.804583 0.731396 -0.681952
+-0.283547 -0.958958 -0.889413 0.457105
+0.862238 0.506503 -0.956906 0.290399
+-0.856843 -0.515577 -0.724159 -0.689633
+0.914677 0.404186 -0.719174 -0.69483
+0.980029 -0.198854 0.390837 -0.92046
+0.958908 0.283718 -0.881128 -0.472877
+-0.819438 -0.573168 -0.222467 -0.97494
+-0.999331 -0.036586 -0.8689 -0.494987
+-0.767669 0.640847 0.902573 -0.430538
+-0.0243066 -0.999705 -0.757907 -0.652363
+-0.85576 -0.517373 -0.564686 -0.825306
+0.735424 -0.677607 0.583405 0.812181
+-0.677187 0.735811 0.53609 -0.844161
+0.854494 0.519461 -0.348442 -0.93733
+-0.999342 0.0362597 -0.884597 0.466357
+0.216208 0.976347 -0.980421 -0.196913
+0.998468 -0.0553233 0.73303 0.680196
+0.903305 0.428999 0.937252 0.348652
+0.888691 -0.458506 -0.873973 0.485975
+-0.828038 0.560672 -0.985493 -0.169718
+-0.953202 0.302333 0.763554 0.645744
+-0.692806 -0.721124 0.418395 -0.908265
+0.945091 -0.326807 -0.300805 -0.953686
+0.353896 -0.935285 0.0450304 -0.998986
+0.433333 -0.901234 0.670049 0.742317
+-0.826027 0.563631 -0.982532 0.186092
+0.265965 0.963983 -0.215211 -0.976568
+0.314174 0.949365 0.856316 -0.516452
+-0.620487 0.784217 -0.57117 -0.820832
+0.832338 0.554269 -0.588326 0.808624
+0.577275 -0.81655 0.274111 -0.961698
+0.927968 0.372659 0.883213 0.468973
+0.436934 0.899493 0.32815 -0.944626
+-0.915628 0.402026 -0.861719 0.507386
+0.698168 0.715934 -0.309327 -0.950956
+0.607076 0.794644 -0.741237 -0.671243
+-0.992065 0.125726 0.999216 -0.0395852
+-0.161754 -0.986831 -0.85831 0.513131
+-0.577597 -0.816322 0.311805 0.950146
+0.681006 -0.732278 0.884822 -0.465929
+-0.982608 0.185693 0.985267 0.171024
+0.0719411 0.997409 0.608089 -0.793869
+0.00463195 -0.999989 0.894629 0.44681
+0.528774 -0.848763 0.672564 -0.740039
+-0.456641 0.889651 -0.956001 -0.293363
+0.0316304 0.9995 -0.999759 0.0219691
+0.943013 0.332757 -0.805119 0.593113
+-0.406724 0.913551 -0.501233 -0.865312
+-0.400212 0.916422 -0.944685 -0.327978
+0.990618 -0.136659 0.415415 -0.909632
+-0.17542 -0.984494 0.347102 0.937827
+0.104419 -0.994533 -0.509529 -0.860454
+-0.784854 -0.61968 -0.65238 -0.757892
+-0.487527 -0.873108 0.789982 -0.61313
+-0.893219 -0.449623 -0.882525 0.470266
+-0.89858 0.438809 0.125469 -0.992097
+0.894821 0.446426 -0.662084 0.74943
+0.195864 -0.980631 0.649175 0.760639
+-0.698901 -0.715219 -0.404929 -0.914348
+-0.905319 0.424732 0.993318 0.115408
+0.706558 -0.707655 -0.996997 0.0774343
+-0.98747 0.15781 -0.990322 0.138787
+-0.998388 0.0567634 0.823188 0.567769
+0.94525 0.326346 -0.254018 0.9672
+0.840711 -0.541483 0.782961 -0.622071
+-0.737681 -0.67515 0.285289 -0.958441
+0.31451 0.949254 0.837514 -0.546417
+-0.765962 0.642886 0.757722 -0.652577
+-0.546936 0.837175 0.24694 0.969031
+0.593238 -0.805027 0.780316 0.625385
+-0.0508533 0.998706 0.366394 -0.93046
+0.381966 -0.924176 0.0775737 0.996987
+0.84562 0.533786 0.970976 -0.239179
+0.99846 0.0554787 0.743526 -0.668707
+-0.582433 -0.812879 0.789982 0.61313
+-0.861028 0.508557 -0.99842 -0.0561937
+-0.0238693 0.999715 -0.728656 0.68488
+-0.27875 -0.960364 -0.999685 -0.0250937
+-0.114393 -0.993436 0.451816 0.892111
+-0.906609 -0.421973 0.912976 -0.408014
+-0.407377 -0.91326 -0.43811 0.898921
+-0.957964 0.286887 -0.67982 0.733379
+-0.514333 0.857591 -0.816265 -0.577678
+-0.246198 0.96922 0.967099 -0.254398
+0.717517 0.696541 -0.0873882 0.996174
+0.845004 -0.53476 0.992036 0.125955
+-0.204074 -0.978955 -0.131046 -0.991376
+0.331095 0.943597 -0.688704 -0.725043
+-0.358896 -0.933377 0.548199 0.836348
+-0.55754 0.83015 -0.853398 0.521259
+-0.700523 -0.71363 -0.600426 -0.79968
+-0.91409 -0.405511 -0.611315 -0.791387
+0.419548 -0.907733 0.772795 -0.634655
+0.739902 0.672715 -0.0402304 -0.99919
+-0.731707 -0.681619 0.920714 -0.390238
+-0.138804 -0.99032 0.210268 -0.977644
+-0.0916284 -0.995793 -0.969143 -0.2465
+0.416901 -0.908952 0.557878 -0.829923
+0.742981 0.669312 -0.478664 -0.877998
+0.883768 0.467926 -0.000453693 -1
+-0.48441 -0.874841 0.954343 -0.298713
+-0.706229 0.707983 -0.992322 0.123684
+0.770015 -0.638026 0.996951 -0.0780261
+0.0573517 -0.998354 0.855198 -0.518302
+-0.74442 0.667712 -0.655109 0.755535
+-0.96712 -0.254322 0.835414 0.549621
+0.458339 0.888778 -0.882972 0.469426
+-0.649753 -0.760145 -0.0401024 -0.999196
+0.0253431 0.999679 -0.821359 -0.570411
+0.830513 -0.557 -0.817721 -0.575615
+0.268311 0.963332 -0.444298 -0.895879
+0.902643 -0.430391 0.872601 -0.488434
+-0.635805 0.77185 0.978047 -0.208386
+-0.964146 -0.265373 -0.154865 0.987936
+0.194915 0.98082 0.719634 -0.694353
+-0.993826 0.110951 0.122119 0.992515
+-0.956618 0.291346 -0.278067 0.960562
+0.920402 -0.390973 -0.782671 -0.622436
+-0.433744 -0.901036 0.635512 -0.772091
+0.615262 0.788322 -0.9558 0.294019
+-0.188595 0.982055 0.99238 0.123211
+-0.339158 0.940729 -0.999004 -0.0446228
+-0.242732 -0.970093 0.816978 0.576669
+0.812319 0.583213 0.845104 -0.534603
+-0.883786 0.467891 -0.00439639 0.99999
+-0.483626 0.875275 0.977241 0.212132
+0.464814 -0.885408 -0.344953 -0.93862
+0.546903 0.837196 0.250758 -0.96805
+0.593959 0.804496 0.721234 -0.692691
+0.937963 -0.346735 -0.65899 0.752152
+0.0915891 0.995797 -0.968163 -0.250319
+0.416087 -0.909325 0.481389 -0.876507
+-0.416934 0.908937 0.560901 -0.827883
+0.705869 0.708342 -0.984743 -0.174014
+-0.883965 -0.467553 -0.0426125 -0.999092
+-0.296534 -0.955022 0.258044 0.966133
+-0.502513 -0.86457 -0.727027 -0.686609
+0.0103951 -0.999946 0.506625 0.862166
+-0.533282 0.845938 0.955008 -0.296581
+0.851557 -0.524262 0.205501 0.978657
+-0.548337 -0.836258 0.0819969 -0.996633
+-0.958004 -0.286753 -0.690009 -0.723801
+0.543014 -0.839724 0.65733 0.753603
+0.9941 0.108464 -0.127488 -0.99184
+0.84756 0.5307 0.821927 -0.569592
+0.92946 0.368924 0.996304 0.0858993
+-0.999997 0.0025026 0.968848 -0.247656
+-0.965408 -0.260744 0.318578 0.947897
+0.999716 -0.0238351 -0.726311 -0.687366
+0.435998 0.899948 0.424502 -0.905427
+-0.388429 -0.921479 -0.583196 -0.812331
+-0.165134 0.986271 -0.636086 -0.771618
+-0.994479 0.104932 -0.464482 0.885583
+-0.799637 0.600484 -0.00801281 -0.999968
+-0.709347 0.704859 -0.950067 -0.312044
+0.829811 -0.558045 -0.883532 -0.468371
+-0.138864 -0.990311 0.204294 -0.97891
+0.294373 0.95569 0.0348378 0.999393
+0.921019 0.389518 -0.674959 0.737855
+0.714222 -0.69992 -0.530738 -0.847536
+0.607483 0.794333 -0.774653 -0.632386
+-0.303525 0.952823 0.83817 -0.545409
+-0.339276 -0.940687 -0.998363 0.0572012
+-0.975279 0.220979 -0.958045 0.286616
+-0.889174 0.457568 -0.920291 0.391235
+-0.139913 0.990164 0.0996923 0.995018
+0.500243 0.865885 -0.524128 -0.85164
+0.842421 0.538819 0.937702 0.347441
+0.988656 0.150198 -0.807364 0.590053
+-0.999255 -0.0385863 -0.753126 -0.657877
+0.999852 0.0171858 -0.147327 0.989088
+-0.416512 -0.90913 0.521865 0.853028
+0.946226 0.323506 0.0434915 0.999054
+0.557365 -0.830268 -0.842222 0.539131
+-0.315447 -0.948943 0.779536 -0.626357
+0.630298 0.776353 0.6048 0.796377
+0.824354 -0.566075 -0.88542 0.464792
+0.317821 0.948151 0.600131 -0.799902
+-0.406065 -0.913844 -0.562207 0.826996
+0.810627 -0.585563 0.962572 0.271024
+-0.714717 0.699414 -0.469496 -0.882935
+-0.68436 0.729144 0.999672 -0.0256031
+0.443662 0.896194 -0.403151 -0.915133
+0.63738 -0.770549 0.999984 -0.00567066
+0.1094 -0.993998 -0.0336121 -0.999435
+-0.946401 -0.322994 0.0974585 0.99524
+0.0989036 -0.995097 -0.886174 -0.463353
+-0.999559 0.0296903 -0.985223 -0.171275
+0.0300868 -0.999547 -0.99124 0.132071
+0.4787 -0.877978 0.940018 -0.341124
+-0.693126 0.720817 0.377733 0.925914
+0.81225 -0.583309 0.851387 0.524538
+0.691261 0.722606 0.601843 -0.798615
+0.913224 0.407458 -0.430079 -0.902791
+-0.663271 0.748379 -0.966009 -0.258509
+-0.945293 -0.326223 -0.241424 0.97042
+-0.531222 0.847233 0.855418 -0.517938
+-0.979807 -0.199945 0.286155 0.958183
+-0.620559 -0.78416 -0.563548 0.826083
+-0.652448 0.757833 -0.385024 0.922907
+0.971362 0.237603 0.414855 -0.909887
+-0.606991 -0.794709 -0.734043 -0.679103
+0.960722 0.277514 -0.988196 0.153196
+0.842263 0.539067 0.927069 0.374891
+-0.998136 0.0610226 0.984353 0.17621
+-0.0397122 -0.999211 -0.674379 0.738385
+0.11237 0.993666 0.262137 0.965031
+-0.788274 0.615324 -0.953466 0.301499
+0.934781 -0.355224 0.18592 0.982565
+0.862426 -0.506183 -0.945452 -0.325761
+-0.278686 0.960382 -0.999494 0.0318025
+-0.419655 0.907683 0.780252 -0.625466
+-0.221131 0.975244 -0.953483 -0.301447
+-0.984331 0.176329 0.432051 0.901849
+0.431935 0.901905 0.776692 -0.62988
+0.945199 0.326495 -0.269228 0.963076
+0.988525 0.151055 -0.855449 0.517888
+0.940203 -0.340615 -0.980141 0.198301
+-0.954476 -0.298288 0.430201 -0.902733
+0.180729 -0.983533 0.779557 -0.626331
+0.151022 -0.98853 -0.853705 0.520756
+0.876583 -0.481251 0.998355 0.0573371
+-0.426907 -0.904296 0.992239 -0.124343
+0.818713 -0.574203 -0.0979127 0.995195
+0.996606 -0.0823187 -0.377607 -0.925966
+0.959911 0.280305 -0.990656 -0.136386
+-0.961242 0.275706 -0.942118 -0.33528
+-0.459676 0.888087 -0.802605 -0.596511
+-0.884482 -0.466574 -0.152799 -0.988257
+0.812705 0.582675 0.807898 -0.589322
+-0.373107 -0.927788 0.859546 -0.511058
+-0.748294 -0.663368 -0.962592 -0.270954
+-0.0302481 -0.999542 -0.993242 -0.116058
+-0.100978 -0.994889 -0.771108 0.636705
+-0.27266 -0.96211 -0.790811 -0.61206
+0.0911864 0.995834 -0.95725 -0.289261
+-0.990094 0.140407 0.0498849 -0.998755
+0.925378 -0.379046 0.383356 -0.923601
+-0.68464 -0.728881 0.999918 -0.0128094
+-0.875645 0.482955 0.990616 -0.136673
+0.606204 -0.795309 -0.663318 0.748338
+0.890804 -0.454388 -0.999005 0.0446029
+-0.0709006 -0.997483 0.687446 -0.726236
+0.64157 0.767064 0.858046 -0.513572
+-0.796725 0.604342 -0.471846 -0.881681
+0.869011 -0.494793 0.0764925 -0.99707
+0.355969 0.934498 0.263599 0.964632
+-0.878872 0.477058 0.860252 0.50987
+0.648512 -0.761205 0.122746 0.992438
+-0.0610143 -0.998137 0.984206 0.177027
+0.310365 0.950617 0.989963 -0.14133
+-0.654534 -0.756032 -0.621608 -0.783329
+-0.533838 -0.845587 0.972437 0.233167
+0.727142 -0.686487 0.964706 -0.263329
+-0.969992 -0.243139 0.840428 -0.541923
+-0.601634 -0.798772 -0.151295 -0.988489
+0.890417 -0.455145 -0.991606 0.129296
+0.999431 -0.0337177 -0.973479 0.228777
+0.985935 -0.167127 -0.468214 0.883615
+-0.999917 -0.012877 0.279294 0.960206
+0.83189 0.554941 -0.651648 0.758521
+-0.522918 -0.852383 0.0491276 0.998793
+0.739689 0.672948 -0.00867398 -0.999962
+0.529524 -0.848295 0.735278 -0.677766
+-0.795224 0.606316 -0.673819 -0.738896
+0.445767 -0.895149 -0.605178 0.79609
+0.893046 0.449965 -0.899896 0.436105
+0.702215 -0.711965 -0.77159 0.63612
+0.0732005 -0.997317 0.503271 0.864129
+-0.283445 -0.958989 -0.894236 0.447596
+-0.271044 0.962567 -0.677409 0.735607
+-0.748801 -0.662795 -0.980489 -0.196574
+-0.688246 -0.725477 0.873382 -0.487036
+0.979362 0.202116 0.0685426 0.997648
+0.0279975 -0.999608 -0.94226 0.334882
+0.986779 0.162069 -0.841513 -0.540238
+0.951081 -0.308941 0.999968 0.00797087
+0.944098 -0.329666 -0.571417 -0.82066
+-0.944569 0.328314 -0.448462 -0.893802
+0.38162 -0.924319 0.114832 0.993385
+-0.386655 -0.922224 -0.417113 -0.908854
+-0.605262 -0.796026 -0.570281 -0.821449
+-0.948599 0.316482 0.706766 -0.707447
+-0.573409 0.819269 -0.193702 -0.98106
+-0.986573 -0.16332 -0.766465 -0.642286
+0.997082 -0.0763435 0.210604 -0.977571
+0.999392 -0.034877 -0.940461 0.339902
+-0.952796 0.303612 0.843076 0.537794
+0.99394 -0.109919 0.0186275 0.999826
+0.979507 -0.201412 0.139994 -0.990152
+0.956626 -0.291317 -0.280927 0.959729
+0.887848 0.460138 -0.770528 -0.637406
+-0.683881 -0.729593 0.995834 0.0911813
+0.903648 0.428276 0.96213 0.272591
+0.860469 -0.509503 -0.998564 0.0535678
+0.986203 0.165541 -0.603639 -0.797258
+0.786187 -0.617989 -0.799267 0.600976
+0.997697 -0.0678283 0.875243 -0.483684
+0.810386 -0.585896 0.972913 0.23117
+-0.558781 -0.829315 -0.921569 -0.388215
+-0.347838 -0.937555 -0.566178 0.824283
+0.344314 0.938855 -0.82911 0.559086
+-0.131249 0.991349 0.827275 0.561797
+-0.440776 0.897617 -0.0930341 0.995663
+0.147451 0.989069 -0.6146 -0.788839
+0.987286 0.158953 -0.967644 -0.25232
+-0.580424 0.814314 0.616184 -0.787602
+0.445802 0.895132 -0.608293 -0.793712
+0.984496 -0.175407 0.345859 0.938286
+0.2809 -0.959737 -0.980295 -0.197537
+0.997514 -0.0704634 0.71861 -0.695413
+-0.542425 -0.840104 0.708503 -0.705708
+-0.933994 0.357289 0.396778 0.917915
+-0.92394 0.382536 0.015921 -0.999873
+0.999303 0.0373317 -0.82958 -0.558388
+0.979806 -0.199952 0.285447 -0.958394
+-0.89204 0.451957 -0.974095 -0.226141
+0.999997 0.00245628 0.969985 0.243166
+-0.872847 0.487994 0.756072 -0.654488
+-0.836956 0.547271 0.207957 -0.978138
+0.979998 -0.199005 0.376564 -0.926391
+-0.692827 0.721103 0.41573 0.909488
+-0.994909 0.100778 -0.783708 0.62113
+-0.815395 -0.578904 0.459464 -0.888196
+-0.934903 0.354902 0.152068 0.98837
+-0.804742 0.593625 0.74931 -0.66222
+-0.708313 -0.705899 -0.985472 0.169838
+-0.515683 0.856779 -0.71553 -0.698582
+-0.762624 0.646842 0.335522 -0.942032
+-0.98759 -0.157053 -0.99804 -0.0625735
+0.998694 -0.0510885 0.388209 0.921571
+0.87172 0.490005 0.586536 0.809924
+-0.192591 -0.981279 0.862469 -0.50611
+-0.0804315 0.99676 -0.19658 0.980488
+-0.82407 0.566489 -0.860979 0.508641
+0.942155 -0.335177 -0.929313 -0.369294
+-0.237847 0.971303 0.437616 -0.899162
+0.01701 -0.999855 -0.129915 0.991525
+0.720042 0.693931 0.272182 0.962246
+-0.0637864 0.997964 0.995025 0.0996253
+-0.95482 -0.297185 0.323218 -0.946325
+0.767149 0.641469 0.864751 0.502201
+0.872993 -0.487733 0.775285 -0.631612
+0.997977 -0.0635777 0.996891 -0.0787943
+-0.954185 -0.299217 0.515905 -0.856646
+0.890592 -0.454803 -0.995845 0.0910633
+0.965111 -0.261841 0.209044 -0.977906
+0.986404 -0.164337 -0.696263 0.717787
+0.891707 -0.452614 -0.988098 -0.153825
+-0.714617 0.699515 -0.481976 -0.876185
+-0.73564 0.677373 0.557302 0.83031
+0.783799 -0.621015 -0.514584 0.85744
+-0.0093164 -0.999957 0.596508 -0.802607
+0.66363 -0.748061 -0.952492 -0.304563
+-0.998614 0.0526284 0.525142 0.851015
+0.363597 0.931556 0.883983 0.467519
+-0.0899829 0.995943 -0.915399 0.402548
+0.744481 0.667643 -0.662048 -0.749462
+-0.985639 -0.168866 -0.305915 -0.952059
+-0.575595 -0.817735 0.0720756 0.997399
+-0.630387 -0.776281 0.613854 0.78942
+-0.992979 -0.11829 0.758631 -0.651521
+-0.101064 -0.99488 -0.765542 0.643386
+-0.640341 0.768091 0.928963 0.370173
+0.197774 -0.980248 0.489676 0.871904
+0.646872 0.762599 0.331863 -0.943328
+-0.345855 0.938288 -0.726595 -0.687066
+0.905077 0.425247 0.998273 -0.0587393
+0.773491 -0.633807 0.892219 0.451603
+-0.900137 0.435608 0.463361 -0.88617
+-0.482113 0.876109 0.999159 0.0410065
+-0.926903 0.375302 0.715743 -0.698363
+-0.969968 -0.243234 0.845727 -0.533616
+0.00642608 0.999979 0.800533 -0.599289
+-0.901167 0.433473 0.658491 -0.752588
+0.852749 0.522321 -0.0208053 -0.999784
+0.460516 0.887651 -0.742633 0.669698
+-0.756225 0.654312 -0.598308 -0.801267
+0.926992 0.375082 0.732118 0.681178
+0.812409 0.583088 0.836811 -0.547492
+0.0827102 -0.996574 -0.413688 0.910419
+-0.936002 0.351994 -0.157578 0.987507
+0.998872 -0.0474944 0.0388318 0.999246
+-0.997301 -0.0734222 0.483941 0.875101
+-0.357846 0.933781 0.45085 -0.8926
+-0.994988 0.0999976 -0.82998 0.557793
+-0.294219 -0.955738 0.018669 0.999826
+-0.897792 -0.440419 -0.0533937 0.998574
+-0.807512 -0.589851 0.967531 0.252754
+0.128602 0.991696 0.946182 -0.323636
+0.156619 0.987659 -0.999825 0.0187183
+0.0511556 0.998691 0.394394 0.918942
+-0.0103914 -0.999946 0.506947 -0.861977
+0.966774 -0.255634 0.753365 -0.657603
+-0.799842 -0.600211 0.0262099 0.999656
+-0.98225 -0.187577 0.999802 0.0199196
+0.820325 0.571897 -0.370321 -0.928904
+0.8398 -0.542897 0.667786 -0.744353
+-0.809245 -0.587471 0.999245 -0.0388425
+0.996987 -0.0775698 0.089088 -0.996024
+-0.519445 0.854504 -0.350197 -0.936676
+0.904836 -0.42576 0.999998 0.00216579
+-0.894998 0.44607 -0.631822 -0.775113
+0.711689 -0.702495 -0.795997 -0.605301
+0.431565 0.902082 0.801829 -0.597554
+0.613183 -0.789941 -0.999391 -0.0349031
+0.97382 -0.227321 -0.588609 0.808418
+-0.601991 0.798503 -0.195284 0.980747
+0.0531636 0.998586 0.569977 0.821661
+0.987987 0.154537 -0.981608 0.190909
+-0.95466 0.297697 0.373535 0.927616
+0.999561 0.0296118 -0.983848 0.179007
+-0.979154 0.203119 -0.033844 -0.999427
+-0.939444 0.342702 -0.912411 0.409275
+-0.994689 -0.102922 -0.632773 -0.774337
+0.160718 -0.987 -0.907347 -0.420383
+0.900466 -0.434927 0.528993 -0.848626
+0.19429 0.980944 0.762389 -0.647119
+-0.578985 0.815338 0.468229 -0.883607
+-0.983679 -0.179932 0.72631 -0.687367
+-0.947813 0.318828 0.511927 -0.859029
+-0.895956 -0.444142 -0.451608 0.892217
+0.129375 -0.991596 0.918102 0.396343
+0.32866 0.944448 -0.480943 -0.876752
+-0.979725 -0.200348 0.246499 0.969143
+-0.698646 0.715467 -0.372144 0.928175
+-0.14567 -0.989333 -0.463383 -0.886158
+-0.689115 -0.724652 0.808957 -0.587868
+-0.198298 0.980142 0.442378 0.896829
+-0.463322 0.88619 -0.497454 -0.86749
+-0.743249 -0.669015 -0.513462 -0.858112
+-0.73453 -0.678576 0.685118 -0.728432
+-0.0419266 0.999121 -0.495574 -0.868566
+0.963634 0.267225 -0.340717 0.940166
+-0.999453 0.0330688 -0.986272 0.165126
+-0.919383 0.393365 -0.91638 -0.400308
+0.801976 -0.597356 0.373324 -0.927701
+-0.96577 0.2594 0.447038 -0.894515
+0.239357 -0.970932 0.571556 -0.820563
+0.639147 0.769084 0.975042 -0.222022
+-0.994255 0.107037 -0.268044 0.963407
+0.060539 0.998166 0.974664 0.223675
+0.616093 0.787673 -0.919549 0.392975
+0.951788 -0.306757 0.971926 0.235286
+-0.398947 -0.916974 -0.980839 0.194822
+-0.531753 -0.8469 0.886161 0.463377
+-0.1498 -0.988716 -0.782965 -0.622066
+-0.758054 -0.652191 -0.353526 0.935425
+0.727447 -0.686164 0.97546 -0.220178
+0.89287 0.450315 -0.916269 0.400564
+0.628332 0.777945 0.386211 0.92241
+-0.470715 0.882285 0.310225 -0.950663
+-0.599969 -0.800023 0.0564043 -0.998408
+0.852698 -0.522405 -0.0110097 0.999939
+-0.987978 -0.154594 -0.982696 0.185224
+0.427521 0.904005 0.981504 -0.191443
+-0.22197 0.975053 -0.924022 -0.38234
+-0.00902674 0.999959 0.619503 0.784994
+0.360478 -0.932768 0.681451 -0.731863
+-0.911674 -0.410913 -0.0658739 -0.997828
+-0.881972 -0.471303 0.3728 -0.927912
+-0.89196 0.452114 -0.97792 -0.208977
+0.390817 0.920469 -0.771981 -0.635645
+0.507866 -0.861436 -0.990702 0.136048
+-0.98034 0.197318 0.529668 -0.848205
+-0.421042 -0.907041 0.866346 0.499445
+-0.128065 0.991766 0.962321 0.271915
+-0.66834 0.743856 -0.589143 -0.808029
+0.641916 0.766775 0.83405 -0.551689
+0.932284 0.361728 0.773143 -0.634231
+-0.999256 -0.0385755 -0.753839 -0.657059
+-0.720301 -0.693661 0.307938 0.951406
+-0.304625 0.952472 0.895416 -0.44523
+-0.58525 -0.810853 0.9514 0.307958
+-0.89836 -0.439261 0.0754408 0.99715
+0.994922 -0.100652 -0.791518 0.611145
+-0.375503 0.926821 0.700393 0.713758
+-0.29973 0.954024 0.561226 -0.827663
+-0.819849 -0.57258 -0.291859 -0.956461
+0.362792 0.93187 0.840359 0.542031
+-0.697231 0.716846 -0.182702 0.983168
+-0.0697022 -0.997568 0.769531 -0.63861
+-0.992947 -0.118559 0.775989 -0.630747
+0.991811 0.127716 0.971298 0.237866
+-0.580569 -0.814211 0.630099 0.776515
+0.962681 0.270638 -0.645732 0.763565
+0.308565 0.951203 0.99887 0.047518
+0.922768 -0.385355 -0.285333 -0.958429
+-0.279316 0.960199 -0.999426 -0.0338648
+0.998483 0.0550688 0.715458 -0.698656
+-0.999612 -0.0278596 -0.937551 0.347849
+0.698893 -0.715226 -0.40401 0.914755
+-0.915504 0.402308 -0.845664 0.533715
+-0.365021 -0.930999 0.94488 0.327417
+-0.261177 -0.965291 0.275803 -0.961214
+0.818122 -0.575044 0.00477887 0.999989
+-0.690766 0.723079 0.655066 0.755572
+0.99079 -0.135406 0.52678 -0.850002
+-0.119033 0.99289 0.805204 -0.592998
+-0.997852 -0.0655063 0.963198 0.268793
+0.972678 0.23216 -0.131822 -0.991273
+0.157246 -0.98756 -0.996629 -0.0820413
+0.673315 0.739356 0.0408743 0.999164
+-0.517428 0.855727 -0.55938 -0.828911
+-0.892794 0.450466 -0.922927 -0.384974
+-0.280109 -0.959968 -0.993233 0.116136
+-0.428669 0.903461 0.949345 0.314236
+-0.0822545 -0.996611 -0.371634 -0.92838
+0.99979 0.0205012 -0.461307 0.887241
+0.868748 -0.495255 0.02348 -0.999724
+0.898871 -0.438213 0.190905 -0.981609
+-0.711781 0.702402 -0.788025 -0.615643
+-0.554604 -0.832115 -0.620365 -0.784313
+-0.944485 0.328553 -0.471007 -0.88213
+-0.79566 0.605744 -0.618967 -0.785417
+-0.355531 0.934664 0.218139 -0.975918
+-0.998157 0.0606791 0.977707 0.209975
+-0.821698 -0.569923 -0.580946 -0.813942
+0.0321049 0.999485 -0.99759 0.0693908
+0.220538 -0.975378 -0.970035 -0.242964
+-0.789067 -0.614308 -0.984308 -0.17646
+-0.00424721 -0.999991 0.911153 -0.412068
+-0.543484 -0.83942 0.614157 -0.789184
+0.969535 0.244953 0.926573 -0.376114
+-0.929441 0.368972 0.995848 -0.091027
+-0.668339 0.743857 -0.589189 -0.807995
+0.934057 -0.357124 0.380537 0.924765
+0.37523 -0.926932 0.721124 0.692806
+-0.561461 0.827503 -0.99717 0.0751766
+0.243401 0.969926 0.854795 0.518967
+-0.435144 0.900361 0.508364 0.861142
+-0.738233 0.674545 0.20597 0.978558
+0.996133 -0.0878566 -0.809336 -0.587346
+-0.958676 0.2845 -0.839644 0.543138
+-0.195244 -0.980755 0.695923 -0.718116
+-0.849765 0.527162 0.520846 0.853651
+0.541645 0.840608 0.770884 -0.636975
+0.969769 0.244024 0.886329 -0.463056
+0.595272 0.803524 0.598948 -0.800788
+0.524297 0.851535 0.209536 0.977801
+0.963339 -0.268288 -0.442118 -0.896957
+0.887188 0.461408 -0.671718 -0.740807
+-0.971305 -0.237839 0.436857 -0.899531
+-0.757517 -0.652815 -0.42922 0.9032
+-0.989533 -0.144304 -0.337104 0.941468
+0.916897 -0.399123 -0.976907 0.213665
+0.879484 -0.475928 0.787819 0.615907
+0.996466 0.0839946 -0.527273 0.849696
+-0.980882 -0.194602 0.741441 0.671018
+0.503919 0.863751 -0.828658 -0.559755
+0.301685 -0.953408 0.717919 -0.696126
+0.654436 0.756117 -0.611399 -0.791323
+0.861603 -0.507583 -0.985692 -0.168559
+-0.96427 0.264921 -0.108457 -0.994101
+0.449285 0.893388 -0.864133 -0.503263
+-0.613525 0.789675 -0.996943 -0.0781344
+0.447396 -0.894336 -0.739327 0.673346
+0.738708 0.674025 0.136565 -0.990631
+0.501762 0.865006 -0.664787 -0.747033
+0.488871 0.872356 0.686615 -0.727021
+-0.473952 0.880551 0.63084 -0.775913
+-0.997156 0.0753652 0.305348 -0.952241
+-0.949345 -0.314237 0.852854 0.522149
+-0.394757 0.918786 -0.966291 0.257454
+0.934508 -0.355942 0.260814 0.965389
+-0.122835 0.992427 0.968485 -0.249073
+-0.148898 -0.988853 -0.723064 -0.690781
+0.805379 0.592761 0.815986 0.578071
+-0.361298 0.93245 0.743061 -0.669224
+0.705932 -0.70828 -0.986247 0.165279
+-0.0824986 0.996591 -0.39426 0.918999
+-0.0978875 0.995197 -0.928786 -0.370618
+0.9531 -0.302655 0.78492 0.619597
+0.31716 -0.948372 0.654433 0.75612
+0.723831 -0.689977 0.733395 -0.679802
+-0.986799 0.16195 -0.84793 0.530108
+-0.0877145 -0.996146 -0.800876 -0.59883
+0.308218 -0.951316 0.996478 -0.0838582
+-0.996915 0.0784924 -0.00333952 -0.999994
+-0.107814 0.994171 -0.191978 -0.981399
+0.977017 -0.213162 -0.87268 -0.488293
+-0.225919 0.974146 -0.69852 -0.71559
+-0.822267 0.569101 -0.659229 0.751942
+0.733603 -0.679578 0.777887 0.628405
+-0.0402251 -0.999191 -0.63561 0.77201
+-0.877861 -0.478915 0.948086 -0.318013
+0.0865622 0.996246 -0.726409 -0.687263
+-0.911609 -0.411059 -0.0499068 -0.998754
+-0.325683 -0.945479 -0.185558 -0.982633
+-0.818325 0.574756 -0.0305009 0.999535
+-0.0870684 -0.996202 -0.760382 -0.649476
+0.9869 0.161331 -0.879496 -0.475907
+0.772681 -0.634794 0.942484 0.334251
+-0.230386 0.973099 -0.309371 -0.950941
+-0.537815 0.843063 0.972372 0.233435
+0.496127 -0.86825 -0.0768686 0.997041
+-0.937431 -0.348172 -0.536476 -0.843916
+0.913745 0.406289 -0.541835 -0.840485
+0.914234 -0.405186 -0.639084 0.769137
+0.663345 -0.748314 -0.963403 -0.268059
+0.932808 -0.360375 0.673297 0.739372
+0.328381 0.944545 -0.45487 -0.890558
+0.679787 0.73341 0.795447 0.606023
+0.77999 -0.625792 0.0703716 0.997521
+0.99993 -0.0118563 0.375687 -0.926747
+0.998087 0.061828 0.995353 -0.0962924
+-0.668346 0.743851 -0.588464 -0.808523
+-0.099519 -0.995036 -0.855842 0.517237
+0.366447 -0.930439 0.983772 -0.179422
+0.607897 -0.794016 -0.806554 0.591161
+0.999965 0.00833989 0.671919 0.740624
+0.15969 -0.987167 -0.946128 -0.323792
+0.636152 0.771564 0.986423 0.164224
+-0.826985 0.562224 -0.999855 0.0170039
+-0.553708 -0.832711 -0.532509 -0.846424
+0.74535 -0.666673 -0.753763 0.657146
+0.995236 -0.097499 -0.942542 0.334088
+0.781655 -0.623711 -0.194897 0.980824
+-0.95351 0.301362 0.693945 0.720028
+-0.416314 -0.909221 0.503183 0.86418
+-0.281167 0.959659 -0.974423 -0.224722
+0.383238 0.92365 -0.0600228 -0.998197
+-0.264175 -0.964475 -0.0312774 -0.999511
+0.391934 0.919994 -0.843265 -0.537498
+-0.987095 0.160133 -0.930657 0.365892
+0.95519 0.295993 0.202907 -0.979198
+0.993233 0.116137 0.600728 -0.799453
+0.981087 0.193565 0.808057 0.589105
+0.752542 0.658545 -0.932943 0.360023
+0.955105 -0.296267 0.230972 0.97296
+0.795647 -0.60576 -0.620569 -0.784152
+0.939299 0.343098 -0.894339 -0.447389
+0.593477 0.804851 0.761415 -0.648265
+0.985141 0.171748 -0.0184166 -0.99983
+0.947352 -0.320193 0.383344 -0.923606
+0.602977 0.797758 -0.314724 -0.949183
+0.972637 0.232328 -0.114607 -0.993411
+-0.394983 0.918688 -0.972341 0.233567
+0.73379 -0.679376 0.760307 0.649564
+0.572587 -0.819844 -0.290986 -0.956727
+0.489344 0.872091 0.646169 -0.763194
+0.739431 -0.673233 0.0297825 0.999556
+-0.717886 -0.69616 -0.0344694 0.999406
+-0.361577 0.932342 0.762731 -0.646716
+-0.23299 0.972479 -0.0467748 -0.998905
+-0.182201 0.983261 0.864277 -0.503017
+0.352067 0.935975 -0.149932 0.988696
+-0.137065 0.990562 0.37781 0.925883
+0.470852 0.882212 0.324926 0.945739
+-0.617766 -0.786362 -0.815933 0.578146
+0.957702 -0.287763 -0.610023 0.792384
+-0.979011 0.203808 -0.104087 -0.994568
+0.489571 -0.871963 0.626079 0.77976
+-0.530541 -0.847659 0.811076 0.58494
+-0.571209 -0.820804 -0.446806 0.894631
+-0.343623 0.939108 -0.867972 -0.496612
+-0.255867 -0.966712 0.737346 -0.675515
+-0.472018 -0.881589 0.446806 0.894631
+-0.518903 0.854833 -0.408814 -0.912618
+0.444073 -0.895991 -0.4447 0.895679
+-0.712013 -0.702166 -0.76724 0.64136
+0.10496 0.994476 -0.461933 0.886915
+0.72453 -0.689243 0.79843 -0.602087
+0.142576 -0.989784 -0.168417 0.985716
+-0.0673983 0.997726 0.895272 0.44552
+0.465695 -0.884945 -0.250018 -0.968241
+0.875579 -0.483076 0.98863 -0.15037
+-0.297354 0.954767 0.339981 -0.940432
+0.629047 0.777367 0.469252 0.883064
+0.314301 -0.949323 0.849337 0.52785
+0.612499 0.790471 -0.998667 -0.0516152
+-0.370114 0.928986 0.977166 0.212479
+-0.406712 -0.913556 -0.502321 0.864681
+0.11059 -0.993866 0.086008 -0.996294
+-0.732308 -0.680973 0.882728 -0.469884
+0.983174 -0.182669 0.887231 0.461325
+0.95708 0.289823 -0.426819 -0.904337
+0.379552 -0.92517 0.332224 0.943201
+0.0461869 0.998933 -0.0919284 0.995766
+0.194958 0.980812 0.716583 -0.697502
+-0.961993 0.273074 -0.816381 -0.577514
+0.331689 0.943389 -0.73295 -0.680282
+-0.390763 -0.920491 -0.7683 -0.64009
+-0.232854 0.972512 -0.060796 -0.99815
+0.623697 -0.781666 -0.196554 -0.980493
+-0.532335 0.846534 0.915925 -0.401349
+-0.833279 -0.552852 -0.442925 0.896559
+-0.915229 -0.402934 -0.807267 -0.590187
+0.997567 0.0697214 0.7683 0.64009
+0.904988 -0.425438 0.999289 0.0376946
+-0.767453 0.641105 0.88761 -0.460596
+-0.661324 -0.7501 -0.999999 0.00165422
+0.518076 0.855335 -0.495036 0.868872
+-0.114166 0.993462 0.431376 -0.902172
+-0.836726 0.547621 0.166786 -0.985993
+-0.888307 0.45925 -0.830292 0.557328
+0.825992 0.563681 -0.981372 -0.192116
+-0.468077 0.883688 0.0166255 -0.999862
+-0.174335 -0.984686 0.241846 0.970315
+0.0814009 0.996681 -0.29086 -0.956766
+0.691789 0.7221 0.541898 -0.840444
+0.671587 -0.740926 -0.191441 -0.981504
+-0.956031 -0.293266 -0.0809266 -0.99672
+0.37832 -0.925675 0.45451 0.890741
+-0.66211 -0.749406 -0.994333 0.106315
+0.500403 0.865792 -0.539779 -0.841807
+0.202862 -0.979207 -0.00766568 0.999971
+-0.416498 -0.909137 0.520544 0.853835
+0.990935 -0.134345 0.614665 -0.788788
+0.987532 0.157419 -0.995032 -0.0995586
+0.810492 -0.58575 0.968564 0.248763
+-0.916586 0.399837 -0.957337 0.288974
+0.179046 0.983841 0.661581 0.749874
+-0.855888 -0.517161 -0.584917 -0.811093
+-0.175415 -0.984495 0.346641 0.937998
+0.880705 0.473665 0.60521 -0.796066
+0.893414 -0.449235 -0.861272 -0.508145
+-0.39811 0.917338 -0.994506 -0.104678
+-0.615192 -0.788377 -0.958393 0.285451
+0.922561 -0.385851 -0.336457 -0.941699
+0.0299857 0.99955 -0.989854 -0.142091
+0.977564 0.21064 -0.719201 0.694802
+-0.899539 -0.43684 0.338015 0.941141
+-0.839415 0.543491 0.613472 -0.789717
+-0.320868 0.947124 0.316585 0.948564
+0.991891 -0.127091 0.984335 -0.176311
+0.49606 -0.868288 -0.0692298 0.997601
+-0.798911 0.60145 -0.128453 -0.991716
+-0.351972 0.936011 -0.159922 -0.98713
+-0.941472 -0.337091 -0.984729 0.174092
+-0.664486 -0.747301 -0.911477 0.41135
+-0.919383 0.393363 -0.916289 -0.400518
+-0.882039 0.471175 0.359389 0.933188
+0.416111 0.909314 0.483764 0.875198
+0.0163046 0.999867 -0.0597053 -0.998216
+0.937109 0.349036 -0.456564 -0.88969
+-0.579054 0.81529 0.475622 -0.87965
+0.982385 0.18687 0.998644 -0.0520518
+-0.0729831 -0.997333 0.521987 -0.852953
+-0.464274 0.885691 -0.40151 -0.915855
+0.940719 0.339186 -0.998865 -0.0476305
+-0.64334 -0.765581 0.717761 -0.696289
+0.0714158 -0.997447 0.649038 0.760756
+-0.165273 0.986248 -0.625113 -0.780534
+0.154698 0.987962 -0.984586 -0.174899
+-0.994508 0.104659 -0.488604 0.872506
+-0.612708 0.79031 -0.999681 0.0252446
+0.582036 0.813163 0.759122 0.650948
+0.299916 -0.953966 0.577251 -0.816567
+0.999995 -0.00314724 0.950882 -0.309554
+0.850724 0.525613 0.357584 -0.933881
+0.96253 0.271176 -0.687421 0.72626
+0.978222 0.207563 -0.468797 0.883306
+-0.535651 -0.84444 0.999782 0.020872
+-0.955344 0.295497 0.151826 0.988407
+-0.510468 0.859897 -0.986286 -0.165042
+-0.638628 -0.769516 0.9878 -0.155728
+-0.217332 0.976098 -0.996547 0.0830344
+-0.109367 -0.994001 -0.0369834 0.999316
+0.945054 -0.326915 -0.311695 -0.950182
+0.533646 -0.845708 0.966873 -0.255257
+-0.670146 0.74223 -0.37736 -0.926067
+-0.740271 0.672309 -0.0949625 0.995481
+-0.0722196 0.997389 0.585686 0.810538
+-0.953775 -0.300522 0.627939 -0.778262
+-0.684289 -0.729211 0.999375 0.0353576
+-0.415802 0.909455 0.453724 -0.891142
+0.797299 -0.603584 -0.385937 -0.922525
+-0.535968 -0.844238 0.99986 -0.0167096
+0.937376 0.348318 -0.523265 -0.85217
+0.164423 0.98639 -0.689942 0.723865
+-0.217841 -0.975984 -0.999521 -0.0309336
+-0.336386 -0.941724 -0.968936 -0.247311
+0.995614 -0.0935598 -0.998483 -0.0550617
+0.998566 -0.0535417 0.600669 0.799498
+0.87835 -0.478019 0.910746 0.412966
+-0.980354 0.197246 0.535904 -0.844279
+-0.569514 0.821981 -0.620661 -0.784079
+0.899938 0.436017 0.422549 0.90634
+-0.105858 0.994381 -0.380059 -0.924962
+-0.566924 0.82377 -0.83289 -0.553438
+0.536423 0.84395 0.997511 -0.0705171
+-0.371544 0.928415 0.933023 0.359817
+-0.725562 0.688157 0.879312 -0.476247
+0.42533 -0.905039 0.998765 -0.0496818
+0.0806088 -0.996746 -0.213989 0.976836
+-0.221368 -0.97519 -0.945854 0.324592
+-0.968069 0.250685 0.978843 -0.204611
+0.955402 0.295307 0.132139 -0.991231
+-0.94513 0.326694 -0.289389 -0.957212
+-0.832924 0.553387 -0.499518 -0.866303
+0.75959 -0.650403 -0.125257 -0.992124
+0.390893 -0.920436 -0.777238 0.629207
+0.244543 -0.969639 0.909824 -0.414994
+0.593847 0.804578 0.730793 -0.682599
+-0.649436 0.760417 0.00162999 0.999999
+-0.874409 0.48519 0.923928 -0.382566
+-0.97865 0.205532 -0.276714 -0.960952
+-0.0588194 0.998269 0.921895 -0.38744
+0.878271 0.478163 0.917407 -0.397951
+-0.988954 -0.148221 -0.6741 0.73864
+-0.994353 0.10612 -0.3556 0.934638
+0.275356 -0.961342 -0.929278 0.369382
+0.193087 0.981182 0.835834 -0.548982
+-0.980063 0.198686 0.406523 -0.913641
+0.223489 -0.974706 -0.853509 -0.521079
+0.638621 0.769522 0.987944 -0.154813
+0.921619 -0.388096 -0.55351 -0.832842
+0.67391 0.738813 0.121172 0.992631
+0.239195 0.970972 0.557768 0.829997
+0.288354 0.957524 -0.559981 0.828505
+-0.990668 0.136296 0.448437 -0.893814
+-0.691142 0.722719 0.614908 0.788599
+-0.996116 -0.08805 -0.820586 0.571523
+0.624998 -0.780626 -0.0313602 -0.999508
+0.360126 0.932904 0.653328 0.757075
+-0.168059 0.985777 -0.382689 -0.923877
+-0.899614 -0.436686 0.354095 0.93521
+-0.582492 -0.812837 0.794412 0.607379
+-0.451671 0.892185 -0.966344 0.257253
+0.992915 0.118827 0.792722 -0.609583
+0.934985 0.354688 0.129352 -0.991599
+0.237195 0.971462 0.376268 0.926511
+0.497496 -0.867466 -0.23258 0.972577
+0.572563 -0.819861 -0.293821 -0.955861
+-0.64076 0.767741 0.907409 0.420248
+0.336544 0.941668 -0.972955 -0.230994
+-0.102866 0.994695 -0.637149 -0.77074
+0.469284 -0.883047 0.152745 -0.988266
+-0.959833 0.280573 -0.986459 0.164009
+-0.56597 0.824426 -0.891242 -0.453528
+-0.594987 0.803735 0.627007 0.779013
+0.924638 -0.380846 0.197495 -0.980304
+0.636712 0.771102 0.995736 0.0922448
+-0.903494 -0.4286 0.951738 0.30691
+-0.830535 0.556966 -0.815359 -0.578955
+0.893896 -0.448274 -0.801803 -0.597589
+-0.247174 -0.968971 0.987778 0.155869
+-0.549281 0.835638 -0.0308685 0.999523
+0.933597 0.358325 0.496029 -0.868306
+0.881721 -0.471771 0.42158 0.906791
+-0.958531 -0.28499 -0.810825 -0.585289
+-0.973723 -0.227736 -0.553666 -0.832739
+-0.268436 0.963298 -0.455861 0.890051
+0.929714 0.368281 0.999858 0.0168746
+-0.786351 0.617779 -0.814966 0.579509
+-0.995335 0.0964838 -0.971662 0.236374
+-0.51929 0.854598 -0.367044 -0.930204
+0.977188 -0.212374 -0.830537 -0.556963
+0.6582 0.752843 -0.915469 -0.402389
+-0.527911 -0.8493 0.593988 0.804474
+0.995501 -0.0947535 -0.997901 0.0647643
+0.348382 0.937353 -0.517426 0.855728
+0.699845 -0.714295 -0.521856 0.853034
+0.413062 -0.910703 0.169103 -0.985598
+0.967969 0.251068 0.969987 0.243156
+0.0999611 0.994991 -0.832022 0.554742
+0.996593 0.0824762 -0.392197 0.919881
+-0.349307 0.937008 -0.430616 -0.902535
+0.925534 0.378664 0.421146 0.906993
+-0.979703 0.200454 0.236017 -0.971749
+-0.574796 -0.818297 -0.0255419 0.999674
+-0.855026 0.518585 -0.442498 0.896769
+-0.829529 0.558463 -0.905997 -0.423284
+0.26501 -0.964246 -0.117648 0.993055
+0.994777 -0.102074 -0.696371 0.717682
+0.377909 -0.925843 0.493651 0.86966
+-0.195355 -0.980733 0.687769 -0.725929
+-0.34479 -0.93868 -0.799723 0.600368
+0.566091 0.824342 -0.884484 0.466571
+0.169038 -0.985609 -0.289175 -0.957276
+-0.746851 -0.664992 -0.881556 -0.472079
+-0.307687 -0.951488 0.99024 0.139372
+-0.389055 0.921214 -0.637054 0.770819
+0.841066 -0.540932 0.822042 -0.569427
+0.0643544 -0.997927 0.987747 0.156062
+-0.263173 -0.964749 0.0724815 -0.99737
+-0.784951 0.619558 -0.664149 0.747601
+0.819408 0.573211 -0.217377 -0.976088
+-0.462058 -0.88685 -0.615697 0.787983
+-0.983084 -0.183153 0.908834 -0.417158
+0.0542539 -0.998527 0.656118 -0.754658
+-0.544011 -0.839078 0.563371 -0.826204
+-0.170811 -0.985304 -0.11328 0.993563
+-0.675273 -0.737567 0.30135 0.953514
+-0.988861 0.148841 -0.719038 -0.694971
+0.0820389 -0.996629 -0.351471 0.936199
+0.666372 -0.745619 -0.779684 -0.626173
+-0.997768 0.0667761 0.921295 -0.388863
+0.905193 0.425001 0.996301 -0.0859276
+0.899089 -0.437765 0.239573 -0.970878
+0.964131 -0.265427 -0.160436 -0.987046
+-0.172525 -0.985005 0.0604521 0.998171
+-0.541727 0.840555 0.764643 0.644454
+-0.651544 0.758611 -0.272447 0.962171
+-0.995508 -0.0946801 -0.998351 -0.0574002
+-0.453098 0.891461 -0.994988 0.0999926
+0.456131 0.889913 -0.971255 0.23804
+0.101622 0.994823 -0.728304 0.685255
+0.99302 0.117947 0.735683 -0.677326
+-0.475381 0.87978 0.747997 -0.663702
+0.997685 0.0680041 0.866585 0.499029
+-0.663204 -0.748439 -0.968297 0.2498
+0.983368 0.181623 0.833198 -0.552974
+-0.450801 0.892625 -0.936723 0.350071
+-0.962653 -0.270739 -0.653737 0.756722
+0.24453 -0.969642 0.909288 -0.416168
+0.979797 0.199995 0.281256 0.959633
+0.923374 -0.383902 -0.131547 -0.99131
+0.756179 -0.654364 -0.603874 -0.79708
+-0.275358 -0.961342 -0.929343 -0.369218
+-0.978067 0.20829 -0.533087 -0.84606
+-0.612375 -0.790567 -0.997736 -0.0672594
+-0.656843 0.754027 -0.828614 0.559821
+0.372293 0.928115 0.901002 -0.433815
+-0.169576 0.985517 -0.236535 -0.971623
+0.537297 -0.843393 0.984864 0.17333
+0.955529 -0.294896 0.0894605 0.99599
+0.62182 0.78316 -0.423981 0.905671
+-0.479779 0.877389 0.974752 -0.223289
+0.99027 0.139162 0.174713 0.984619
+0.901912 0.43192 0.777722 0.628608
+-0.229687 0.973265 -0.376782 -0.926302
+-0.0337705 -0.99943 -0.972257 0.233916
+-0.851642 0.524124 0.189571 0.981867
+-0.588678 -0.808368 0.993914 -0.11016
+-0.0610072 0.998137 0.984081 -0.177722
+-0.0813586 -0.996685 -0.2868 -0.957991
+0.450863 -0.892593 -0.939121 0.343585
+-0.99917 0.0407409 -0.594925 0.803781
+0.0367655 -0.999324 -0.859866 -0.510521
+0.570954 0.820982 -0.474422 0.880298
+-0.999627 -0.0273011 -0.916663 0.39966
+-0.772316 0.635238 0.960134 0.279541
+0.412349 0.911026 0.0914943 0.995806
+0.475003 -0.879984 0.71875 -0.695269
+0.915456 -0.402418 -0.83921 0.543808
+0.9842 -0.177058 0.497617 0.867397
+0.641398 -0.767208 0.869355 0.494188
+0.690819 -0.723028 0.649478 0.760381
+0.628372 -0.777913 0.390886 -0.920439
+-0.914163 -0.405346 -0.625466 -0.780251
+-0.525068 0.85106 0.297099 -0.954847
+-0.999792 -0.0203956 -0.451909 0.892064
+0.906104 -0.423055 0.955071 0.296378
+-0.985361 -0.17048 -0.146539 -0.989205
+0.189641 -0.981853 0.973642 0.228081
+0.130045 -0.991508 0.889243 0.457435
+-0.991815 0.127681 0.972129 -0.234447
+0.886871 -0.462016 -0.619372 0.785098
+0.807545 0.589805 0.968932 0.247327
+-0.999933 -0.0115851 0.400684 0.916216
+0.999434 -0.0336405 -0.975218 0.221245
+-0.759519 0.650485 -0.135977 -0.990712
+0.0221898 0.999754 -0.603885 -0.797071
+-0.833528 0.552477 -0.402106 -0.915593
+0.972943 0.231045 -0.244287 -0.969703
+-0.999245 -0.0388437 -0.735929 -0.677058
+0.61846 0.785816 -0.761805 0.647806
+0.644893 -0.764273 0.562591 0.826736
+0.999998 -0.00189866 0.982029 -0.188728
+0.808023 -0.589151 0.985768 -0.168109
+0.995659 0.0930808 -0.994679 0.103026
+-0.999677 -0.0254031 -0.824763 0.565478
+-0.249798 0.968298 0.993463 0.114155
+0.32576 0.945452 -0.193601 -0.98108
+-0.497204 0.867634 -0.199639 0.97987
+0.160982 0.986957 -0.895802 0.444453
+0.488013 0.872836 0.754647 -0.656131
+0.34675 0.937957 -0.657797 0.753196
+0.824807 0.565415 -0.919757 -0.392488
+0.985644 0.168834 -0.308948 -0.951079
+0.0632113 -0.998 0.999111 0.0421483
+-0.914282 0.405079 -0.648025 0.761619
+-0.981996 -0.188902 0.98804 0.1542
+-0.364933 -0.931034 0.94173 0.336369
+0.969956 -0.243282 0.848358 0.529423
+-0.371701 0.928353 0.926827 0.375488
+-0.970585 0.240757 0.683561 0.729894
+-0.930954 0.365136 0.948835 0.315772
+0.0992633 0.995061 -0.868846 0.495083
+-0.925792 -0.378034 0.481802 0.87628
+0.935122 -0.354326 0.0908678 0.995863
+0.132682 0.991159 0.737779 -0.675042
+0.949062 -0.315089 0.802628 -0.596481
+0.374989 0.927029 0.7389 -0.673815
+-0.658186 -0.752855 -0.91473 -0.404066
+0.996183 -0.0872875 -0.77448 -0.632598
+-0.338697 -0.940896 -0.99999 -0.0043982
+0.184544 -0.982824 0.958603 -0.284747
+0.57572 -0.817647 0.0872763 -0.996184
+-0.340482 -0.940251 -0.98285 0.184407
+-0.429916 -0.902869 0.897092 -0.441845
+0.649328 -0.760509 0.0158207 0.999875
+0.316487 0.948597 0.706341 -0.707872
+0.981638 -0.190752 0.941666 -0.336549
+0.93055 0.366165 0.977895 -0.209098
+-0.980393 -0.197051 0.552609 0.83344
+0.34629 0.938128 -0.693966 0.720008
+0.134518 0.990911 0.600769 -0.799423
+-0.155127 -0.987895 -0.991248 -0.132012
+-0.244809 0.969571 0.920875 -0.389859
+-0.0347127 0.999397 -0.94592 -0.324399
+-0.995725 0.0923703 -0.984803 -0.173674
+-0.168929 -0.985628 -0.299826 0.953994
+0.222876 -0.974847 -0.884585 -0.46638
+0.449372 0.893345 -0.869001 -0.494811
+-0.403639 -0.914918 -0.759426 0.650594
+0.822159 0.569259 -0.644737 -0.764404
+-0.651233 -0.758878 -0.232856 -0.972511
+0.709839 0.704364 -0.926009 0.377501
+-0.484837 0.874605 0.938621 0.344951
+0.316025 0.948751 0.740002 -0.672605
+0.91336 0.407152 -0.460084 -0.887875
+-0.931201 -0.364506 0.925351 -0.379111
+0.598868 0.800848 0.19275 -0.981248
+-0.0349423 0.999389 -0.93822 -0.346039
+0.338483 0.940973 -0.999632 -0.0271188
+0.666486 0.745517 -0.770017 0.638024
+0.952156 -0.305613 0.936689 0.350163
+0.987276 -0.159018 -0.965972 0.258646
+0.993279 -0.115741 0.568385 0.822763
+-0.611545 -0.79121 -0.985197 -0.171425
+-0.568018 -0.823016 -0.752284 0.658839
+0.556942 -0.830552 -0.813668 0.58133
+0.556993 -0.830517 -0.817232 0.576309
+-0.71458 -0.699554 -0.486668 0.873587
+0.822381 -0.568937 -0.674126 0.738616
+-0.709726 0.704478 -0.931929 -0.36264
+0.408819 -0.912615 -0.291258 -0.956645
+0.674391 0.738374 0.185473 0.982649
+0.806047 0.591851 0.875901 0.482492
+0.784763 0.619796 -0.641168 -0.7674
+-0.761339 0.648354 0.143328 -0.989675
+-0.857271 -0.514866 -0.778794 -0.62728
+0.478319 -0.878186 0.924334 -0.381584
+0.462362 0.886691 -0.58835 0.808606
+0.0747189 -0.997205 0.366387 0.930462
+-0.996537 -0.0831529 -0.453707 0.891151
+-0.124622 0.992204 0.997433 -0.0716008
+-0.805416 0.59271 0.81957 -0.57298
+-0.64881 -0.76095 0.0837265 -0.996489
+-0.807365 -0.590052 0.96091 0.27686
+-0.816866 -0.576828 0.221094 -0.975252
+-0.282775 -0.959186 -0.923279 0.38413
+0.536741 0.843747 0.99414 -0.1081
+-0.0272436 -0.999629 -0.914348 -0.404928
+0.968481 -0.249086 0.999163 -0.0409073
+-0.612265 0.790652 -0.996706 0.0811004
+0.727083 -0.686549 0.962417 -0.271574
+0.846021 -0.533149 0.950229 0.311552
+-0.478747 0.877953 0.941814 -0.336135
+0.642735 -0.766089 0.770465 0.637483
+-0.939213 -0.343336 -0.882755 -0.469833
+0.994506 -0.104677 -0.487052 0.873373
+-0.278311 -0.960491 -0.99749 -0.0708038
+-0.808281 0.588797 0.992185 -0.124778
+-0.783881 -0.620911 -0.525935 -0.850525
+-0.775336 -0.631549 0.724731 -0.689032
+0.158864 -0.987301 -0.969895 -0.243522
+-0.887118 0.461542 -0.660468 0.750855
+-0.0565607 -0.998399 0.811495 0.58436
+0.712387 -0.701787 -0.732034 -0.681268
+-0.98224 -0.187631 0.999677 0.025419
+0.690378 0.723449 0.694636 -0.719361
+-0.972035 0.234838 0.142758 0.989758
+-0.634599 0.772842 0.933735 -0.357965
+-0.322272 0.946647 0.17299 0.984924
+0.161552 0.986864 -0.868627 0.495466
+0.696665 -0.717396 -0.104641 0.99451
+-0.899105 -0.437733 0.243067 0.970009
+-0.715041 -0.699082 -0.428008 0.903775
+-0.997906 -0.0646733 0.982257 0.187541
+0.46762 0.883929 -0.0349905 0.999388
+0.180843 0.983512 0.786778 0.617236
+0.220149 0.975466 -0.978937 0.204162
+-0.494822 0.868995 0.0732484 0.997314
+0.97822 -0.20757 -0.469453 -0.882957
+0.456186 0.889885 -0.969766 0.244037
+-0.38411 -0.923287 -0.153889 -0.988088
+0.56874 -0.822517 -0.691599 -0.722282
+0.860384 0.509646 -0.99753 -0.0702412
+0.994494 0.10479 -0.477067 -0.878867
+-0.264572 -0.964366 -0.0724108 -0.997375
+-0.633104 -0.774067 0.847573 0.530678
+1 0.00011397 0.999935 0.0113968
+-0.852632 0.522512 0.00161137 0.999999
+0.967494 0.252894 0.907166 0.420773
+-0.78381 -0.621 -0.516207 -0.856464
+0.991068 0.133356 0.690199 0.72362
+0.403382 -0.915032 -0.777389 -0.629021
+0.98195 0.18914 0.984018 0.17807
+0.0770865 -0.997024 0.137238 0.990538
+-0.354794 -0.934945 0.140544 0.990074
+-0.929022 -0.370025 0.979174 0.203025
+0.774515 -0.632555 0.807885 0.58934
+0.564432 0.825479 -0.95987 0.280446
+0.875527 -0.48317 0.986964 -0.160938
+0.349202 0.937047 -0.440699 0.897655
+-0.723451 0.690376 0.694818 -0.719186
+0.263325 -0.964707 0.0567773 0.998387
+0.0962072 -0.995361 -0.977853 -0.209292
+0.999927 0.0121042 0.352594 0.935776
+-0.325165 0.945657 -0.131468 0.99132
+0.924818 -0.380411 0.243379 -0.969931
+0.168925 0.985629 -0.300181 0.953882
+-0.994042 -0.109001 -0.0736912 -0.997281
+-0.127045 0.991897 0.985153 0.171679
+0.369833 0.929098 0.983158 -0.182757
+-0.356469 -0.934307 0.314837 0.949146
+0.964605 -0.263699 0.0180295 -0.999837
+0.974538 0.224222 -0.811953 -0.583723
+0.169466 -0.985536 -0.24739 -0.968916
+0.986927 -0.161166 -0.887326 0.461143
+-0.0416036 -0.999134 -0.523396 0.852089
+-0.87016 0.492769 0.304502 -0.952512
+0.986946 -0.161054 -0.892524 0.451001
+0.557532 0.830155 -0.852932 -0.522023
+-0.966493 0.256692 0.677024 -0.735961
+-0.873593 -0.486658 0.846993 0.531604
+0.441847 0.89709 -0.210947 -0.977498
+-0.154984 0.987917 -0.989245 0.146265
+-0.765778 -0.643105 0.738793 0.673932
+0.928482 -0.371379 0.939299 -0.343101
+0.978635 -0.205605 -0.283846 -0.95887
+0.47346 0.880815 0.586582 0.80989
+0.484206 -0.874954 0.961049 0.27638
+0.722096 0.691793 0.541366 0.840787
+0.84011 0.542416 0.709278 0.704929
+0.988959 0.148188 -0.671626 0.74089
+-0.999998 -0.00196105 0.980833 0.194851
+0.744494 -0.667629 -0.663521 0.748157
+0.242646 -0.970115 0.811814 -0.583916
+-0.999901 -0.0140651 0.163499 0.986543
+0.389265 0.921126 -0.654432 -0.756121
+-0.14464 -0.989484 -0.36878 -0.929517
+-0.155045 -0.987907 -0.990126 -0.140183
+-0.286542 -0.958068 -0.705839 0.708372
+0.999842 -0.0177587 -0.203726 -0.979028
+0.860522 -0.509413 -0.999069 0.0431304
+-0.792986 0.60924 -0.894573 -0.446923
+0.95977 -0.280788 -0.982542 0.186042
+0.952833 -0.303494 0.836373 0.54816
+0.466043 0.884762 -0.211722 0.97733
+0.90197 -0.4318 0.786042 -0.618173
+-0.342873 -0.939382 -0.904836 0.42576
+-0.841515 -0.540233 0.866449 0.499266
+0.820652 -0.571429 -0.422765 0.906239
+0.58867 -0.808373 0.99402 0.1092
+0.951993 0.306121 0.954047 -0.299657
+-0.995006 0.0998194 -0.83984 0.542835
+0.985286 0.170913 -0.102942 -0.994687
+-0.449966 0.893046 -0.899958 0.435978
+0.826148 0.563453 -0.986302 -0.164952
+0.978293 -0.207224 -0.437972 -0.898989
+-0.256739 0.966481 0.673495 0.739192
+-0.10515 0.994456 -0.444953 -0.895554
+0.292383 -0.956301 -0.17245 -0.985018
+-0.853995 0.520282 -0.256895 0.966439
+-0.627746 0.778418 0.315707 -0.948857
+0.430867 -0.902415 0.845612 0.533798
+0.855013 -0.518606 -0.440283 0.897859
+0.0523408 0.998629 0.500416 0.865785
+-0.770898 -0.636958 0.998173 -0.060422
+-0.862223 0.506529 -0.957763 -0.287559
+-0.899489 0.436944 0.327149 -0.944973
+-0.518758 0.854921 -0.42427 -0.905536
+0.634087 0.773262 0.907995 0.418981
+0.676363 0.736569 0.438478 0.898742
+-0.503494 0.863999 -0.80011 0.599854
+0.939555 0.342397 -0.925221 -0.379428
+-0.985093 -0.172022 0.00941819 -0.999956
+-0.240638 0.970615 0.674543 -0.738236
+0.999155 0.0410978 -0.565843 -0.824513
+-0.306898 -0.951743 0.975293 0.220917
+0.202063 0.979372 0.0738621 -0.997268
+-0.303976 -0.95268 0.86304 0.505135
+-0.255904 0.966702 0.734744 0.678344
+0.725465 0.688259 0.872538 0.488547
+-0.949063 -0.315087 0.802718 0.596359
+-0.539547 0.841956 0.904251 0.427001
+-0.790543 -0.612406 -0.997992 0.0633427
+-0.881246 -0.472659 0.510557 -0.859844
+-0.509127 -0.860691 -0.99995 0.00995009
+-0.308044 -0.951372 0.994769 0.102146
+-0.960063 -0.279783 -0.9966 -0.0823976
+0.962554 -0.271089 -0.680817 -0.732454
+0.978489 -0.206299 -0.351149 -0.93632
+-0.548263 0.836306 0.0907005 0.995878
+-0.680974 0.732308 0.882771 -0.469804
+-0.453655 0.891177 -0.999293 0.0375876
+0.518466 0.855098 -0.4549 0.890542
+-0.202463 0.97929 0.0331496 0.99945
+-0.9137 -0.406389 -0.532606 -0.846364
+0.144977 -0.989435 -0.400261 0.916401
+-0.321471 -0.94692 0.255651 -0.966769
+0.999432 -0.0336935 -0.974032 0.22641
+0.770681 0.637221 0.999653 -0.0263515
+0.528376 -0.84901 0.637187 -0.770709
+0.700796 0.713361 -0.630576 -0.776128
+-0.938591 0.345031 -0.784025 0.620729
+0.787138 -0.616778 -0.881968 0.471309
+-0.567636 -0.82328 -0.782032 0.623238
+-0.109032 -0.994038 -0.070614 0.997504
+0.811821 -0.583907 0.887656 0.460507
+-0.609344 0.792906 -0.900394 0.435075
+0.951502 -0.307641 0.989563 0.144099
+-0.80305 -0.595911 0.533465 0.845822
+-0.61057 -0.791962 -0.95669 -0.291108
+0.902019 0.431697 0.793032 0.60918
+0.574381 0.818588 -0.0761915 0.997093
+0.996228 -0.0867729 -0.740784 -0.671743
+-0.448711 -0.893677 -0.830027 -0.557723
+-0.119258 -0.992863 0.818444 0.574586
+-0.581891 -0.813266 0.747432 0.664338
+-0.711997 0.702183 -0.768716 -0.63959
+-0.163291 0.986578 -0.768317 -0.64007
+-0.78057 -0.625069 -0.0222669 -0.999752
+-0.551821 0.833963 -0.328926 0.944356
+-0.735554 -0.677466 0.567745 -0.823205
+0.98929 -0.145962 -0.489344 -0.872091
+-0.492872 -0.870102 0.293198 -0.956052
+0.19794 -0.980214 0.474831 0.880077
+-0.0573554 0.998354 0.85539 -0.517985
+0.0967373 0.99531 -0.965326 0.261047
+-0.941161 -0.337957 -0.99656 0.082876
+0.963799 -0.26663 -0.282091 -0.959388
+0.130218 0.991485 0.881155 -0.472828
+-0.509982 -0.860185 -0.99403 0.109108
+0.282877 -0.959156 -0.919153 -0.3939
+-0.616031 0.787722 -0.92261 -0.385735
+0.775455 0.631402 0.711618 -0.702567
+-0.368923 -0.92946 0.996312 -0.0857988
+0.998197 0.060027 0.961915 -0.273349
+0.543089 -0.839675 0.650563 0.759452
+-0.842217 -0.539138 0.923894 0.382649
+-0.655841 0.754899 -0.747175 0.664627
+0.258431 -0.96603 0.534337 0.845271
+0.355065 0.934842 0.169213 0.98558
+0.998288 0.0584824 0.908293 -0.418334
+0.650142 -0.759813 -0.0911752 0.995835
+-0.561308 0.827607 -0.995607 0.0936279
+0.999598 -0.0283626 -0.953862 -0.300245
+-0.970753 -0.240081 0.631078 -0.775719
+0.888641 0.458603 -0.868646 -0.495433
+-0.604724 -0.796435 -0.513483 -0.8581
+0.859753 -0.510709 -0.981262 0.192677
+-0.597555 0.801828 0.350284 0.936644
+-0.025798 0.999667 -0.846453 0.532463
+-0.0485176 0.998822 0.140807 -0.990037
+0.982745 -0.184965 0.969921 0.243419
+0.120391 0.992726 0.878563 0.477626
+0.89299 -0.450076 -0.905242 -0.424896
+0.0132187 -0.999913 0.246321 0.969188
+-0.997997 0.063255 0.998917 -0.0465262
+0.534351 0.845263 0.984772 0.173853
+-0.350369 0.936612 -0.325797 -0.94544
+-0.945003 0.327062 -0.326422 -0.945224
+-0.768484 0.639869 0.949939 -0.312436
+0.984341 -0.176274 0.427007 0.904249
+0.0463837 0.998924 -0.0722912 0.997384
+-0.0306287 -0.999531 -0.99694 -0.0781681
+0.874612 0.484823 0.939161 0.343478
+0.911348 -0.411638 0.0135497 0.999908
+0.0294254 -0.999567 -0.980339 0.197321
+0.882086 -0.471088 0.350128 0.936702
+-0.989482 -0.144653 -0.370095 0.928994
+0.735274 0.67777 0.60134 -0.798993
+-0.227126 -0.973865 -0.604681 0.796468
+-0.216102 -0.976371 -0.978222 -0.20756
+0.694378 0.719611 0.211948 -0.977281
+-0.88762 -0.460577 -0.738019 -0.67478
+0.929351 0.369196 0.993359 0.115059
+0.714508 0.699627 -0.495592 0.868555
+0.751084 0.660207 -0.989188 0.146656
+0.656546 0.754286 -0.805873 -0.592088
+0.125128 -0.992141 0.999785 -0.0207208
+0.982921 0.18403 0.942395 -0.334502
+-0.99713 0.0757096 0.272291 -0.962215
+0.988582 0.150681 -0.835238 0.549888
+-0.231502 0.972834 -0.198474 -0.980106
+-0.965921 0.258838 0.498322 -0.866992
+-0.0305684 0.999533 -0.996451 0.0841798
+0.23112 0.972925 -0.236777 0.971564
+0.246047 0.969258 0.963026 0.269409
+-0.0327183 -0.999465 -0.991455 0.13045
+-0.698878 0.715241 -0.40208 0.915605
+-0.994026 -0.109147 -0.0590404 -0.998256
+0.357805 0.933796 0.446937 0.894565
+0.0794164 -0.996842 -0.0958831 0.995393
+-0.9977 0.0677824 0.877461 -0.479649
+-0.916195 0.400733 -0.924534 0.381099
+-0.998806 -0.0488472 0.173397 -0.984852
+-0.905463 -0.424425 0.988825 -0.149079
+-0.670015 0.742348 -0.393591 -0.919286
+-0.0782164 0.996936 0.0243439 0.999704
+-0.998638 0.0521736 0.485858 0.874038
+0.770351 -0.63762 0.999677 -0.0254213
+-0.733204 0.680008 0.813395 0.581711
+0.277627 0.960689 -0.989932 -0.141544
+-0.789028 -0.614357 -0.983183 -0.182625
+-0.998462 -0.0554394 0.740893 -0.671623
+0.196044 -0.980595 0.635077 0.772449
+-0.506466 -0.86226 -0.95564 -0.294537
+-0.674622 -0.738163 0.216161 0.976358
+0.794642 -0.607079 -0.741495 -0.670958
+0.317873 -0.948133 0.595733 0.803183
+-0.816775 0.576956 0.236346 0.971669
+0.89279 -0.450473 -0.923218 -0.384276
+-0.245178 0.969478 0.935047 -0.354523
+-0.894386 0.447296 -0.731714 -0.681611
+0.231552 0.972822 -0.193397 0.981121
+-0.0141149 -0.9999 0.158586 -0.987345
+-0.419747 -0.907641 0.786495 0.617596
+-0.892967 0.450122 -0.90743 -0.420204
+0.965688 -0.259703 0.418722 -0.908114
+-0.893422 0.449218 -0.86034 -0.509721
+0.30213 -0.953267 0.7496 -0.661891
+-0.988265 0.15275 -0.931252 -0.364376
+-0.73915 -0.673541 0.0714602 -0.997443
+-0.926262 -0.37688 0.586968 0.80961
+0.975638 -0.219385 -0.991909 0.126948
+0.947115 0.320893 0.314057 0.949404
+0.906747 0.421676 0.899125 -0.437692
+-0.976517 -0.21544 -0.9619 0.273402
+-0.872796 0.488085 0.749163 -0.662385
+-0.491306 0.870987 0.459451 0.888203
+0.986427 0.164198 -0.70631 -0.707902
+-0.361146 0.932509 0.732082 -0.681216
+-0.23205 -0.972704 -0.142963 0.989728
+0.116116 0.993236 0.599 0.800749
+0.857848 -0.513903 -0.844178 0.536063
+0.177767 0.984073 0.558805 0.829299
+0.996726 0.0808558 -0.238126 0.971234
+-0.877589 -0.479414 0.964621 -0.263642
+0.60648 -0.795099 -0.688901 0.724856
+0.841126 -0.54084 0.828227 -0.560393
+-0.73351 0.679678 0.786408 0.617707
+-0.0366214 0.999329 -0.867139 -0.498067
+0.507315 -0.861761 -0.97998 0.199097
+-0.479093 -0.877764 0.95432 0.298785
+-0.414242 -0.910167 0.29501 0.955494
+0.95581 0.293985 -0.00581367 -0.999983
+-0.870915 0.491434 0.446346 -0.894861
+-0.652228 0.758022 -0.358086 0.933689
+-0.985836 0.167713 -0.414921 0.909857
+-0.713405 0.700752 -0.625741 -0.780031
+0.242198 -0.970227 0.783996 -0.620766
+-0.137975 0.990436 0.291202 0.956662
+0.597993 -0.801501 0.298498 0.95441
+-0.832508 0.554013 -0.563155 -0.826352
+0.501077 -0.865403 -0.603597 0.79729
+0.407588 -0.913166 -0.417243 -0.908795
+-0.96626 0.257568 0.607679 -0.794183
+0.819269 -0.573409 -0.193741 0.981053
+-0.594749 0.803912 0.649813 0.760094
+0.717633 -0.696422 -0.0708045 -0.99749
+0.0969194 0.995292 -0.960389 0.278664
+-0.718677 0.695344 0.0791031 -0.996866
+0.390249 0.920709 -0.731341 -0.682012
+0.945634 -0.325232 -0.138502 -0.990362
+-0.77409 -0.633075 0.845623 -0.533781
+0.80793 0.589279 0.982983 0.183694
+0.488154 0.872757 0.743911 -0.668279
+-0.720368 -0.693592 0.317062 0.948405
+-0.426522 -0.904477 0.996636 -0.0819598
+0.989984 0.141179 -0.0280753 0.999606
+-0.981042 -0.193795 0.794079 0.607815
+0.927612 0.373546 0.83439 0.551175
+-0.177339 0.98415 0.522215 -0.852814
+-0.664702 0.747109 -0.899195 -0.437547
+-0.116526 -0.993188 0.631593 0.7753
+0.969202 -0.246268 0.968917 0.247385
+-0.854967 0.518682 -0.432312 0.901724
+0.589571 0.807716 0.975694 -0.219136
+-0.445464 0.8953 -0.577936 0.816082
+0.755868 -0.654724 -0.641064 -0.767487
+-0.986612 -0.163086 -0.781464 -0.62395
+0.760753 0.649041 0.0534969 0.998568
+0.544171 0.838975 0.547546 -0.836776
+-0.720701 0.693246 0.362239 -0.932085
+-0.99291 -0.118865 0.795041 -0.606555
+0.998722 -0.050536 0.336656 0.941628
+0.3393 0.940678 -0.998216 0.0597057
+0.990026 -0.140887 0.00141378 -0.999999
+0.789245 -0.614079 -0.989011 0.147845
+-0.95802 -0.2867 -0.694035 -0.719941
+0.612358 -0.79058 -0.997589 0.0693945
+0.687681 0.726013 0.908635 -0.417591
+0.887862 -0.460109 -0.772585 0.634911
+0.966867 0.255281 0.776906 0.629617
+0.886417 0.462887 -0.539414 -0.842041
+-0.978569 -0.205918 -0.314411 0.949287
+0.630729 0.776003 0.648029 0.761616
+0.0287203 0.999587 -0.963994 -0.265925
+0.562106 0.827065 -0.999996 0.00279396
+0.432858 -0.901462 0.70827 0.705941
+-0.112688 0.99363 0.292884 -0.956148
+-0.391169 -0.920319 -0.795774 -0.605594
+0.738262 -0.674515 0.201876 0.979411
+-0.957897 -0.287112 -0.662467 -0.749091
+0.947589 0.319492 0.45058 0.892736
+-0.755947 -0.654633 -0.631834 0.775104
+-0.999102 -0.0423699 -0.456562 -0.889692
+-0.975872 0.218342 -0.999793 0.0203583
+0.0830739 -0.996543 -0.446624 0.894722
+0.482998 -0.875621 0.989925 0.141593
+-0.594677 0.803965 0.656556 0.754277
+-0.244484 0.969653 0.907282 -0.420522
+0.935757 -0.352646 -0.088432 0.996082
+-0.998112 -0.061425 0.990655 -0.136389
+-0.496009 -0.868317 -0.06331 -0.997994
+-0.97104 0.238918 0.533872 0.845565
+-0.999941 -0.010906 0.461938 0.886912
+0.648512 -0.761205 0.122783 0.992434
+-0.927694 0.373342 0.846319 -0.532676
+-0.795895 0.605435 -0.587987 -0.80887
+-0.839525 0.543321 0.629277 -0.777181
+-0.272924 0.962036 -0.807314 0.590122
+-0.986875 -0.161484 -0.872043 -0.48943
+-0.495396 0.868668 0.00727053 0.999974
+-0.50947 0.860488 -0.998758 -0.0498287
+-0.800035 -0.599954 0.0582717 0.998301
+0.663653 -0.74804 -0.951548 -0.307501
+-0.989079 0.147384 -0.609273 -0.79296
+0.576729 -0.816935 0.209299 -0.977852
+0.991722 0.128406 0.952403 0.304842
+-0.295269 0.955414 0.128253 -0.991742
+0.746741 0.665115 -0.87367 -0.486518
+-0.269757 -0.962928 -0.573287 -0.819355
+0.426455 0.904509 0.997214 -0.0745975
+-0.524339 -0.85151 0.214331 0.976761
+0.0520291 -0.998646 0.473155 -0.880979
+0.269745 -0.962932 -0.572253 0.820077
+0.48779 0.872961 0.77116 -0.636641
+0.167272 0.985911 -0.455122 0.890429
+-0.937195 -0.348807 -0.478159 -0.878273
+0.999985 -0.00548062 0.853535 -0.521036
+-0.89211 -0.451817 -0.970443 0.241329
+0.56735 -0.823476 -0.803159 -0.595765
+0.93381 -0.35777 0.443515 0.896267
+0.862673 0.505762 -0.92846 0.371432
+-0.99645 -0.0841887 -0.543722 0.839266
+-0.821289 0.570512 -0.521072 0.853513
+-0.857106 -0.51514 -0.758318 -0.651885
+-0.710294 0.703905 -0.899675 -0.43656
+0.548909 -0.835882 0.0136532 0.999907
+0.99405 -0.108924 -0.0814086 0.996681
+0.213863 -0.976864 -0.905431 0.424493
+0.654338 0.756202 -0.60109 -0.799181
+-0.998593 -0.0530284 0.558797 -0.829304
+0.742623 0.66971 -0.431065 -0.902321
+-0.984069 0.177788 0.560521 0.82814
+0.767094 0.641534 0.860457 0.509522
+0.993814 -0.111057 0.132713 0.991154
+0.947119 -0.320882 0.315172 -0.949035
+0.966498 -0.256675 0.678331 -0.734757
+0.999847 0.0174737 -0.175748 0.984435
+0.0269202 0.999638 -0.900776 -0.434285
+0.892442 0.451162 -0.95011 0.311915
+-0.25289 -0.967495 0.907356 -0.420364
+-0.892701 0.45065 -0.930662 -0.365879
+-0.0837737 -0.996485 -0.508305 -0.861177
+-0.979342 0.202209 0.0589881 -0.998259
+0.193144 0.98117 0.832623 -0.55384
+0.829029 -0.559206 -0.940245 -0.340498
+-0.363177 -0.93172 0.862032 0.506854
+0.161226 -0.986918 -0.884549 -0.466447
+0.825951 -0.563742 -0.979944 0.199275
+-0.0969731 0.995287 -0.958872 -0.28384
+-0.721232 -0.692694 0.432541 0.901614
+0.569592 -0.821928 -0.613224 -0.789909
+-0.587035 0.809562 0.995701 -0.0926212
+0.660355 0.750954 -0.991876 -0.12721
+0.00112029 0.999999 0.993731 -0.111795
+0.920189 -0.391475 -0.815437 -0.578846
+-0.997646 -0.0685713 0.836831 0.547462
+0.836497 0.547972 0.125353 0.992112
+0.872073 -0.489377 0.643308 -0.765607
+-0.280344 0.9599 -0.990086 -0.14046
+0.132974 0.99112 0.71753 -0.696528
+-0.896796 0.442443 -0.275443 -0.961317
+-0.851044 0.525095 0.300051 0.953923
+-0.307064 -0.951689 0.979013 0.203797
+-0.97177 -0.23593 0.252806 -0.967517
+-0.787464 0.616361 -0.905664 0.423995
+-0.596207 -0.802831 0.501967 -0.864887
+-0.999771 0.0214036 -0.539404 -0.842047
+-0.798114 0.602507 -0.258227 -0.966084
+0.78649 -0.617603 -0.827767 0.561072
+-0.901894 -0.431957 0.775141 0.631789
+0.784757 0.619803 -0.640411 -0.768032
+-0.423778 0.905766 0.975656 -0.219306
+-0.354884 0.93491 0.150074 -0.988675
+-0.893876 -0.448314 -0.804472 0.593991
+-0.970561 -0.240855 0.690893 -0.722957
+0.228599 0.973521 -0.477748 0.878497
+-0.0930681 0.99566 -0.994547 0.104289
+-0.394183 0.919032 -0.94835 0.317226
+0.737626 0.67521 0.293103 -0.956081
+-0.981942 -0.189182 0.983244 0.182292
+0.920905 -0.389787 -0.696215 -0.717833
+0.975119 -0.221681 -0.934955 0.354767
+0.729588 -0.683887 0.995902 0.0904393
+0.900836 0.43416 0.599243 0.800567
+0.222773 0.97487 -0.889433 0.457066
+0.403634 -0.91492 -0.759745 -0.650221
+-0.868945 -0.494909 0.0631853 0.998002
+-0.347852 0.937549 -0.564954 -0.825123
+-0.095742 -0.995406 -0.986564 0.163374
+0.718667 -0.695355 0.0776206 -0.996983
+-0.975479 -0.220093 -0.980092 -0.198544
+0.526272 0.850316 0.428797 0.903401
+-0.24649 0.969145 0.974335 -0.225102
+0.0900745 0.995935 -0.919061 -0.394116
+-0.3108 -0.950475 0.982458 -0.186483
+-0.403241 -0.915094 -0.786979 0.61698
+0.745865 -0.666098 -0.802204 0.59705
+0.331073 0.943605 -0.68697 -0.726686
+0.873183 0.487393 0.799274 0.600967
+0.175231 -0.984527 0.329049 -0.944313
+0.109004 -0.994041 -0.0733865 -0.997304
+0.383148 0.923687 -0.0503022 -0.998734
+0.817493 0.575939 0.113945 -0.993487
+0.890656 0.454678 -0.997022 -0.0771135
+0.0716151 -0.997432 0.633706 0.773574
+-0.654709 -0.755881 -0.639524 -0.768771
+-0.239035 0.971011 0.544069 -0.83904
+0.986438 0.164133 -0.710926 -0.703267
+0.952754 -0.303742 0.850367 0.526191
+-0.831955 0.554844 -0.642722 -0.766099
+-0.937574 -0.347786 -0.570814 -0.82108
+0.759001 -0.651089 -0.214321 -0.976763
+-0.688257 0.725467 0.872703 0.488251
+-0.921889 0.387454 -0.494217 -0.869339
+0.966412 -0.256996 0.653534 -0.756897
+-0.860562 -0.509346 -0.999374 -0.0353834
+-0.0176165 0.999845 -0.189784 0.981826
+-0.966949 -0.254971 0.796678 0.604404
+0.776885 -0.629642 0.535404 0.844596
+0.996938 -0.0781916 0.0268292 -0.99964
+-0.872209 0.489133 0.664419 -0.747361
+-0.896415 0.443215 -0.357057 -0.934083
+0.591148 0.806563 0.91458 -0.404405
+-0.25905 -0.965864 0.479134 -0.877742
+-0.522158 -0.852849 -0.0399799 0.9992
+0.582889 -0.812552 0.823122 -0.567865
+-0.779396 0.626531 0.164481 0.98638
+-0.95754 -0.288302 -0.564501 -0.825432
+0.959707 0.281003 -0.978119 -0.208044
+-0.985922 0.167204 -0.461316 0.887236
+-0.451632 0.892204 -0.965215 0.261458
+0.383941 -0.923358 -0.135702 0.99075
+-0.532198 -0.84662 0.909318 0.416102
+-0.883061 0.469258 0.149774 0.98872
+0.76179 -0.647825 0.211699 -0.977335
+-0.882559 0.470201 0.254354 0.967111
+0.932851 0.360262 0.664315 -0.747453
+0.44695 0.894559 -0.704845 -0.709361
+-0.947766 0.318967 0.499311 -0.866423
+0.998205 0.0598949 0.958214 -0.286053
+-0.868183 -0.496245 -0.0904212 0.995904
+0.999533 0.0305642 -0.996416 0.0845922
+0.796636 -0.60446 -0.484771 -0.874641
+0.957542 -0.288294 -0.565162 0.82498
+-0.933301 0.359096 0.565984 0.824416
+0.614535 -0.78889 -0.978828 -0.204686
+-0.970866 -0.239625 0.593999 -0.804466
+-0.342599 -0.939482 -0.916848 0.399237
+-0.795367 0.606128 -0.656098 -0.754676
+-0.905129 0.425136 0.997478 0.0709743
+-0.41501 -0.909817 0.374495 0.927229
+0.39725 -0.917711 -0.999939 -0.0110789
+0.622945 -0.782266 -0.289861 -0.957069
+0.488492 -0.872568 0.717482 0.696577
+-0.989291 -0.145956 -0.488829 0.872379
+-0.99243 -0.122812 0.967892 -0.251365
+-0.42427 -0.905536 0.986137 0.165934
+0.862496 -0.506064 -0.940901 -0.338682
+0.914884 0.403717 -0.753862 -0.657033
+-0.152717 -0.98827 -0.930038 -0.367464
+-0.765738 0.643153 0.734543 -0.678562
+-0.773389 0.633932 0.899425 0.437075
+-0.971161 -0.238425 0.490273 -0.871569
+0.95203 0.306004 0.950284 -0.311384
+0.385472 -0.92272 -0.297435 0.954742
+-0.894278 0.447512 -0.748025 -0.66367
+-0.984107 0.177579 0.542851 0.839829
+0.692009 -0.721889 0.516034 0.856568
+-0.800024 -0.599968 0.05646 0.998405
+0.876061 -0.482201 0.998699 -0.0510028
+0.734004 -0.679145 0.739495 0.673163
+0.396835 0.91789 -0.99942 -0.0340479
+0.89039 -0.455199 -0.990804 0.135302
+0.174218 -0.984707 0.23029 -0.973122
+0.644609 0.764513 0.592923 -0.805259
+-0.667541 0.744573 -0.672325 -0.740256
+-0.669763 -0.742575 -0.424599 0.905382
+-0.442632 -0.896703 -0.295607 -0.95531
+0.928212 0.372052 0.911957 0.410285
+0.982803 0.184659 0.961848 -0.273585
+0.781861 0.623453 -0.22706 -0.973881
+-0.0467177 -0.998908 -0.0389041 0.999243
+0.559881 -0.828573 -0.96482 0.262911
+0.974762 -0.223246 -0.866255 0.499602
+-0.894437 -0.447194 -0.723962 0.689839
+-0.67482 0.737982 0.242273 -0.970208
+-0.9948 0.101843 -0.712859 0.701307
+-0.0254676 0.999676 -0.828394 0.560146
+-0.208563 0.978009 -0.556547 0.830816
+-0.951243 -0.308443 0.998179 -0.060316
+0.991839 -0.127499 0.976271 -0.216552
+-0.469304 -0.883037 0.154953 0.987922
+0.931212 -0.364477 0.92415 0.38203
+-0.993634 -0.112657 0.289898 -0.957057
+-0.176579 -0.984286 0.454871 0.890557
+0.022646 -0.999744 -0.639614 0.768696
+0.939 -0.343917 -0.852022 0.523506
+0.348561 0.937286 -0.500988 0.865454
+-0.706033 -0.708179 -0.988503 -0.151199
+-0.957562 -0.288229 -0.570777 -0.821105
+0.757321 0.653043 -0.456195 0.88988
+-0.999187 -0.0403076 -0.629212 -0.777234
+-0.115432 -0.993315 0.542489 0.840063
+0.971575 0.236731 0.331598 -0.943421
+-0.213767 0.976885 -0.901245 0.43331
+0.684994 -0.728549 0.998123 0.0612492
+-0.824829 0.565382 -0.921315 0.388818
+0.868584 -0.495542 -0.00964373 -0.999953
+-0.956492 -0.291757 -0.236541 -0.971622
+-0.975968 0.217915 -0.999726 -0.0234163
+0.945153 -0.326629 -0.282848 -0.959165
+-0.565947 -0.824442 -0.892535 0.450979
+0.263272 0.964722 0.0622917 -0.998058
+0.258537 -0.966001 0.525072 0.851058
+-0.735717 -0.67729 0.547853 -0.836574
+0.195938 -0.980616 0.643403 0.765528
+0.538426 0.842673 0.952914 -0.303241
+0.800869 0.59884 0.196154 0.980573
+0.975308 0.220849 -0.961798 -0.273759
+-0.936438 0.350834 -0.278404 0.960464
+-0.577112 -0.816665 0.254941 0.966957
+0.995506 0.0946959 -0.998259 -0.0589832
+0.749274 0.662261 -0.992003 -0.126214
+-0.83507 -0.550144 -0.133802 0.991008
+-0.978501 -0.206244 -0.345844 0.938292
+0.519548 -0.854441 -0.338833 -0.940847
+-0.568914 0.822397 -0.676203 -0.736716
+-0.989743 0.142859 -0.196535 -0.980497
+0.98195 0.18914 0.984011 0.178109
+0.984076 -0.177746 0.557038 0.830487
+0.988916 0.148476 -0.692913 0.721021
+0.620135 0.784495 -0.607396 0.794399
+-0.990441 0.137936 0.294988 -0.955501
+0.033331 -0.999444 -0.981601 -0.190945
+0.416794 0.909001 0.548041 0.836451
+0.0769764 -0.997033 0.148172 0.988962
+-0.705313 -0.708896 -0.968063 -0.250709
+-0.857716 -0.514123 -0.830146 -0.557547
+-0.427212 -0.904152 0.987487 -0.157702
+0.467801 0.883834 -0.0146073 0.999893
+0.949139 0.314859 0.816862 0.576832
+-0.699102 -0.715022 -0.430571 -0.902557
+0.463919 -0.885877 -0.437893 -0.899027
+-0.0538696 0.998548 0.626596 -0.779344
+-0.871456 0.490474 0.542047 -0.840348
+-0.941309 0.337547 -0.992004 -0.126205
+0.968637 0.248479 0.999763 -0.0217554
+-0.882524 -0.470268 0.261695 -0.96515
+-0.956001 -0.293363 -0.0708324 -0.997488
+0.889843 0.456266 -0.967526 -0.25277
+0.991414 0.130757 0.854136 0.52005
+0.312141 0.950036 0.94647 -0.322792
+0.842638 0.53848 0.950933 0.309398
+0.656245 0.754548 -0.781667 -0.623696
+0.261997 -0.965069 0.19325 0.98115
+-0.713464 -0.700692 -0.61918 0.785249
+0.985668 -0.168699 -0.321948 0.946757
+0.644616 0.764506 0.592152 -0.805826
+0.806246 0.59158 0.891625 0.452774
+0.999784 0.020775 -0.485426 0.874278
+0.77024 0.637755 0.999079 0.0428989
+0.709474 0.704731 -0.944278 0.329148
+0.603703 0.797209 -0.39968 -0.916655
+-0.850846 -0.525415 0.335706 -0.941967
+0.727987 -0.685591 0.989754 -0.142786
+-0.473044 0.881039 0.547696 -0.836677
+-0.589351 0.807877 0.981311 0.192428
+-0.999471 -0.0325116 -0.993941 -0.109913
+0.8587 -0.512478 -0.921154 0.389197
+0.982221 0.187728 0.999378 0.0352647
+-0.438819 -0.898576 0.12442 -0.99223
+0.976384 -0.216044 -0.976958 -0.213431
+-0.552444 -0.83355 -0.398475 -0.917179
+-0.999604 -0.0281271 -0.946524 0.322633
+0.163133 0.986604 -0.778494 0.627652
+0.890265 0.455442 -0.986742 -0.162296
+0.95043 -0.310937 0.979674 -0.200598
+-0.0871342 0.996197 -0.764655 0.64444
+-0.5715 -0.820602 -0.414866 0.909882
+-0.99983 0.0184355 -0.269487 -0.963004
+-0.532066 0.846703 0.902719 -0.43023
+-0.459294 -0.888285 -0.827537 0.561411
+-0.329603 -0.94412 -0.565911 -0.824466
+-0.904272 0.426957 0.991537 -0.129821
+0.368844 -0.929491 0.997008 0.0772945
+-0.997495 0.0707329 0.699562 -0.714572
+0.944331 0.328998 -0.511998 0.858987
+0.206753 -0.978393 -0.394164 0.91904
+-0.697077 -0.716996 -0.161573 -0.986861
+0.566734 0.823901 -0.845437 0.534075
+0.227034 -0.973887 -0.612159 -0.790734
+-0.0796491 -0.996823 -0.11909 -0.992884
+-0.178545 0.983932 0.622539 -0.782589
+0.913453 -0.406945 -0.480163 0.877179
+-0.455976 0.889992 -0.975242 -0.221139
+0.544596 0.838698 0.504417 -0.86346
+-0.0735698 0.99729 0.470933 0.882169
+-0.450274 -0.89289 -0.914463 -0.40467
+-0.517041 -0.855961 -0.596266 0.802787
+0.447915 0.894076 -0.77714 -0.629328
+-0.274649 -0.961545 -0.899623 -0.436666
+-0.542258 0.840212 0.722361 0.691516
+0.630496 0.776192 0.624915 0.780693
+-0.649768 0.760133 -0.042024 0.999117
+0.565676 -0.824627 -0.906838 -0.421479
+-0.66294 0.748673 -0.976496 -0.215536
+-0.924662 0.380788 0.20362 -0.97905
+0.281229 -0.959641 -0.972953 -0.231002
+-0.68806 -0.725653 0.885582 -0.464482
+0.84092 0.541159 0.806346 0.591444
+-0.26349 0.964662 0.0397422 0.99921
+0.980506 -0.196487 0.599598 -0.800301
+0.0944743 -0.995527 -0.999324 -0.0367502
+0.997604 -0.0691894 0.801324 -0.59823
+-0.802753 0.596311 0.490628 -0.871369
+-0.890488 -0.455007 -0.993494 -0.113882
+-0.990211 0.139579 0.133097 -0.991103
+-0.95425 0.299011 0.497294 0.867582
+-0.629287 0.777173 0.496262 -0.868173
+0.790331 0.61268 -0.999586 0.0287877
+-0.787161 -0.616747 -0.883785 -0.467894
+0.614009 0.789299 -0.990285 0.139049
+0.547784 -0.83662 0.147623 0.989044
+0.747381 -0.664396 -0.916359 0.400358
+0.882069 0.47112 0.353527 -0.935424
+0.494809 0.869002 0.0747477 -0.997202
+0.964249 0.264999 -0.116533 0.993187
+-0.534737 0.845018 0.99169 -0.128652
+0.553124 -0.833099 -0.471892 0.881656
+-0.271727 -0.962374 -0.727832 -0.685755
+-0.995028 -0.0995992 -0.851646 -0.524118
+-0.952977 -0.303043 0.809515 -0.5871
+0.955945 0.293547 -0.0515471 -0.998671
+-0.550053 -0.83513 -0.123031 -0.992403
+0.849567 -0.527481 0.552562 0.833472
+0.782823 -0.622245 -0.374174 0.927359
+0.989891 0.141831 -0.0937583 0.995595
+-0.584704 0.811247 0.928523 -0.371275
+-0.376979 -0.926222 0.578275 -0.815842
+-0.578185 -0.815906 0.379405 0.92523
+-0.930703 0.365776 0.968299 0.249793
+0.992821 -0.119608 0.838179 0.545395
+-0.727229 -0.686395 0.967954 0.251128
+0.276213 0.961097 -0.958465 -0.28521
+0.982166 -0.188014 0.997925 -0.0643857
+0.99309 0.117351 0.69373 -0.720235
+0.191342 -0.981523 0.919749 0.392507
+-0.946309 0.323264 0.069008 -0.997616
+-0.982746 0.184963 0.969851 0.243699
+0.642405 0.766366 0.7972 -0.603716
+-0.945955 -0.324298 -0.0402606 0.999189
+0.887654 0.46051 -0.743114 -0.669165
+-0.21045 0.977605 -0.705509 0.708701
+-0.789493 0.613759 -0.994185 0.107684
+0.969377 -0.245578 0.948865 0.315683
+-0.6462 0.763168 0.41352 0.910495
+-0.924006 -0.382378 0.0330698 0.999453
+0.999798 0.0200864 -0.424107 0.905612
+-0.299344 -0.954145 0.52722 0.849729
+-0.829648 0.558286 -0.89678 -0.442477
+-0.252341 -0.967638 0.929707 -0.3683
+0.202823 0.979215 -0.00364682 -0.999993
+0.959821 -0.280615 -0.985735 0.168307
+0.0428233 -0.999083 -0.415734 -0.909486
+0.706208 -0.708004 -0.991948 0.12665
+0.667413 -0.744688 -0.684959 -0.728581
+-0.588151 -0.808751 0.998977 -0.045229
+0.799486 -0.600685 -0.0330884 -0.999452
+0.213887 0.976858 -0.906505 -0.422196
+-0.527362 0.849641 0.540784 -0.841162
+-0.952353 -0.304998 0.91217 -0.409812
+-0.556377 -0.83093 -0.772306 -0.635251
+-0.421952 0.906618 0.912039 -0.410103
+0.483229 0.875494 0.985854 -0.167609
+0.644926 -0.764245 0.559048 0.829135
+-0.24397 0.969783 0.883742 -0.467975
+0.377149 0.926152 0.563198 -0.826322
+-0.626723 -0.779242 0.188743 0.982026
+-0.0826249 -0.996581 -0.405874 -0.913929
+-0.541946 -0.840414 0.747592 -0.664158
+0.194574 -0.980888 0.743331 0.668924
+-0.24503 0.969515 0.929529 -0.36875
+-0.0940414 -0.995568 -0.999977 -0.00671663
+0.917973 0.396644 -0.998494 0.0548679
+-0.401599 -0.915815 -0.884415 0.466701
+-0.335651 -0.941986 -0.946723 -0.322049
+-0.8959 0.444255 -0.462854 -0.886435
+0.0208928 0.999782 -0.495693 -0.868498
+-0.316662 -0.948538 0.693163 -0.720781
+0.692066 0.721834 0.509203 -0.860646
+-0.575498 -0.817803 0.0602371 0.998184
+-0.837935 0.54577 0.378975 -0.925407
+-0.566464 0.824086 -0.862498 -0.506061
+-0.781863 -0.623451 -0.22738 -0.973806
+0.509386 0.860538 -0.999198 0.0400512
+0.183415 0.983036 0.919645 0.392751
+-0.986101 0.166145 -0.553751 0.832682
+0.396365 -0.918093 -0.996364 0.0852029
+0.737132 0.675748 0.362106 -0.932137
+-0.373215 -0.927745 0.853533 -0.521039
+0.571022 0.820935 -0.467148 0.884179
+-0.495908 -0.868375 -0.0516994 -0.998663
+-0.563243 0.826291 -0.990179 -0.139806
+-0.985218 0.171304 -0.063452 0.997985
+0.52062 -0.853788 -0.218353 -0.97587
+0.26824 0.963352 -0.43764 -0.89915
+0.0742364 -0.997241 0.410957 0.911655
+0.98709 0.160168 -0.929359 -0.369178
+0.582572 -0.812779 0.800388 -0.599483
+-0.999965 0.00841429 0.666391 -0.745603
+-0.400341 -0.916366 -0.939974 0.341246
+-0.683891 -0.729584 0.995961 0.0897841
+0.236864 -0.971543 0.344489 -0.938791
+-0.874656 0.484744 0.942245 -0.334925
+-0.338408 -0.940999 -0.999387 -0.0350026
+-0.984878 0.173248 0.133464 0.991054
+0.750201 0.66121 -0.999907 0.0136323
+0.721224 0.692702 0.431543 0.902093
+-0.193787 -0.981044 0.794571 -0.607172
+0.389622 -0.920975 -0.683273 0.730163
+-0.000880563 1 0.996126 0.0879426
+-0.690777 0.723068 0.653932 0.756553
+0.176162 0.984361 0.416755 0.909019
+-0.823587 -0.567189 -0.814652 -0.579951
+0.99089 -0.134675 0.588045 -0.808828
+-0.757346 0.653014 -0.452828 -0.891598
+0.406509 -0.913647 -0.521414 -0.853304
+-0.954742 0.297434 0.347866 0.937544
+0.299343 0.954146 0.527148 0.849773
+0.917046 -0.398781 -0.984203 0.177043
+0.632267 0.77475 0.785413 0.618972
+-0.61236 0.790579 -0.997608 0.0691238
+-0.801062 -0.598582 0.22769 0.973734
+-0.99629 0.0860642 -0.691163 -0.722699
+0.46788 -0.883792 -0.00568425 -0.999984
+-0.928111 0.372303 0.900521 -0.434813
+-0.350154 -0.936692 -0.347334 0.937742
+-0.84662 -0.532198 0.909304 -0.416132
+-0.97576 0.218843 -0.99743 0.071644
+-0.965314 -0.261093 0.284158 0.958777
+0.851068 0.525056 0.295682 -0.955286
+0.591178 0.806541 0.91311 -0.407713
+0.469681 0.882836 0.196928 0.980418
+0.711701 -0.702482 -0.794955 -0.606669
+-0.908043 -0.418877 0.72382 -0.689989
+0.671804 -0.740729 -0.16249 -0.98671
+-0.579236 0.81516 0.495143 -0.868811
+-0.404249 -0.914649 -0.714346 0.699792
+0.997626 -0.0688714 0.819983 -0.572389
+0.911956 0.410288 -0.134091 -0.990969
+-0.999873 0.015936 -0.0228691 -0.999738
+0.067993 0.997686 0.867143 -0.49806
+-0.926624 0.375989 0.662034 -0.749474
+-0.191827 -0.981429 0.89925 -0.437435
+0.509879 -0.860246 -0.995269 -0.0971548
+-0.867546 0.497357 -0.216889 -0.976196
+0.786166 0.618015 -0.797221 -0.603687
+-0.578691 -0.815547 0.436045 0.899925
+0.680352 -0.732885 0.839779 -0.542929
+-0.354344 0.935115 0.0927433 -0.99569
+-0.855911 -0.517124 -0.588483 -0.80851
+0.997968 0.0637238 0.995631 0.0933766
+-0.522296 -0.852764 -0.0236956 0.999719
+0.376097 0.92658 0.653281 -0.757115
+-0.999749 0.0224019 -0.62066 -0.78408
+-0.998038 0.0626107 0.999838 0.0180122
+-0.694028 -0.719948 0.25909 -0.965853
+0.37105 0.928613 0.95084 -0.309682
+0.87828 0.478146 0.916652 -0.399687
+0.834761 0.550613 -0.189227 0.981933
+-0.115726 -0.993281 0.567105 0.823646
+0.496423 0.868081 -0.110778 -0.993845
+0.0493995 0.998779 0.227563 0.973763
+0.822551 -0.568692 -0.695838 0.718199
+0.963116 0.269086 -0.514872 0.857267
+0.373509 -0.927627 0.8366 0.547814
+0.131347 -0.991336 0.821721 0.56989
+-0.777219 0.62923 0.489868 0.871796
+-0.999443 0.0333633 -0.980978 0.194118
+0.0627601 -0.998029 0.999995 -0.00304395
+-0.966955 0.254946 0.798236 -0.602345
+0.998785 -0.0492862 0.216501 0.976282
+0.999986 -0.00524401 0.865623 -0.500697
+0.800147 -0.599804 0.0770188 -0.99703
+-0.239964 -0.970782 0.621748 0.783217
+0.505361 -0.862908 -0.910173 0.414229
+-0.395849 0.918316 -0.990001 0.14106
+0.411306 -0.911497 -0.0228533 -0.999739
+-0.99619 0.0872118 -0.769652 -0.638464
+0.403704 0.91489 -0.754796 0.655959
+0.706611 0.707602 -0.99755 -0.0699639
+0.897749 0.440508 -0.0632768 0.997996
+0.344583 0.938756 -0.81275 0.582613
+0.234357 -0.972151 0.0935818 -0.995612
+-0.0705256 0.99751 0.71426 0.69988
+-0.365527 -0.930801 0.961256 0.275656
+-0.17303 0.984917 0.111499 -0.993764
+0.767102 -0.641525 0.861039 -0.508538
+0.728725 -0.684806 0.999367 -0.0355787
+-0.622903 0.782299 -0.294988 -0.955501
+0.993579 -0.113144 0.336419 0.941712
+-0.764538 -0.644579 0.59605 0.802947
+-0.988322 -0.152379 -0.916942 0.399021
+0.162088 0.986776 -0.840448 0.541892
+-0.995438 -0.0954125 -0.99143 -0.130639
+-0.910866 -0.412703 0.13004 -0.991509
+0.975901 0.218212 -0.999975 -0.00706243
+-0.225334 0.974282 -0.740229 -0.672354
+0.967627 -0.252383 0.928096 -0.37234
+-0.982638 -0.185531 0.982325 -0.187185
+0.958219 0.286035 -0.742273 -0.670098
+-0.871308 0.490736 0.516563 -0.856249
+-0.990588 -0.136875 0.39542 0.9185
+0.959706 0.281007 -0.978044 -0.208398
+-0.40283 0.915275 -0.813921 -0.580975
+0.10483 0.99449 -0.473533 0.880776
+0.72748 -0.686129 0.976514 -0.215456
+-0.681052 -0.732235 0.887735 0.460355
+0.949592 0.313488 0.891368 0.453281
+-0.66487 0.746959 -0.889136 -0.457642
+0.394971 -0.918694 -0.972033 0.234843
+0.449168 0.893447 -0.85747 -0.514534
+-0.925927 0.377701 0.512987 -0.858396
+0.998529 0.0542153 0.653197 -0.757188
+0.973831 -0.227274 -0.592519 0.805556
+-0.311459 -0.950259 0.967181 -0.254089
+-0.314525 -0.949249 0.836613 -0.547794
+0.0553444 0.998467 0.734468 0.678643
+-0.848537 -0.529137 0.703567 -0.710629
+-0.879254 -0.476353 0.816593 -0.577213
+-0.815574 -0.578652 0.431785 -0.901977
+-0.902957 -0.429732 0.905902 0.423488
+0.365176 0.930938 0.950202 0.311633
+0.717876 0.696171 -0.0360143 0.999351
+0.277691 -0.960671 -0.990848 0.134981
+-0.274687 -0.961534 -0.901348 -0.433096
+-0.366577 -0.930388 0.986182 0.165664
+0.480629 -0.876924 0.991777 -0.127979
+0.998701 -0.0509567 0.37601 0.926615
+-0.589524 -0.807751 0.976955 -0.213444
+-0.634981 0.772528 0.950291 -0.311363
+0.97155 0.236836 0.341821 -0.939765
+0.91005 0.414499 0.321898 -0.946774
+0.734745 -0.678344 0.661751 0.749724
+0.865849 0.500305 -0.530161 0.847897
+-0.745976 0.665973 -0.812052 0.583585
+0.751629 0.659586 -0.9737 0.227835
+0.973162 -0.230122 -0.335025 0.942209
+0.995697 0.0926672 -0.989543 0.144237
+0.506969 0.861964 -0.971198 -0.238274
+-0.475134 0.879913 0.729078 -0.684431
+0.478404 -0.87814 0.927996 -0.372591
+-0.542405 0.840117 0.710173 0.704027
+0.107595 -0.994195 -0.213505 -0.976942
+0.525309 -0.850911 0.324042 -0.946043
+-0.337274 0.941407 -0.987925 0.154935
+-0.978255 0.207408 -0.454728 -0.89063
+-0.97295 -0.231016 -0.247139 -0.96898
+-0.95863 -0.284655 -0.830744 -0.556654
+0.939832 0.341637 -0.95284 -0.303475
+0.745425 0.666589 -0.76112 -0.648611
+0.617118 0.786871 -0.860792 0.508957
+-0.701815 -0.712359 -0.734661 -0.678434
+-0.348342 0.937367 -0.521089 -0.853502
+-0.104784 0.994495 -0.477626 -0.878563
+-0.87923 0.476397 0.819513 0.57306
+0.996995 0.0774601 0.100035 0.994984
+0.963677 -0.267069 -0.32548 -0.945549
+-0.00481902 0.999988 0.886114 0.463467
+0.999647 0.0265559 -0.884353 0.466819
+-0.783836 -0.620967 -0.519801 -0.854287
+-0.769459 -0.638697 0.986373 0.164525
+0.964918 0.262553 0.136409 0.990653
+-0.45594 -0.890011 -0.97614 0.217142
+-0.998612 0.0526783 0.529385 0.848382
+0.704117 0.710084 -0.91229 -0.409545
+0.932843 0.360283 0.665956 -0.745991
+-0.785331 -0.619076 -0.708753 -0.705456
+0.848626 0.528994 0.691517 -0.72236
+0.895443 0.445176 -0.551392 0.834246
+0.135482 -0.99078 0.520247 0.854016
+-0.86868 0.495374 0.00976406 -0.999952
+0.819311 -0.57335 -0.200858 0.97962
+0.758885 0.651225 -0.231784 0.972767
+0.399032 0.916937 -0.97898 0.203956
+-0.0574778 -0.998347 0.861676 0.507458
+-0.869019 0.494778 0.0782701 -0.996932
+-0.580535 -0.814236 0.626819 0.779165
+-0.174711 0.98462 0.278763 -0.96036
+0.973909 -0.226938 -0.619969 0.784626
+-0.267432 -0.963577 -0.360801 -0.932643
+-0.786571 0.6175 -0.835072 0.55014
+0.779587 0.626294 0.134323 -0.990938
+-0.498726 0.86676 -0.36767 0.929956
+-0.304828 -0.952407 0.904693 0.426064
+-0.704534 0.70967 -0.934757 0.355287
+0.0255725 -0.999673 -0.834231 0.551415
+-0.230139 -0.973158 -0.333425 0.942776
+-0.489412 0.872053 0.640186 0.76822
+0.999538 0.0303897 -0.994787 0.101979
+-0.204214 -0.978926 -0.14524 -0.989396
+0.925135 -0.379638 0.323511 -0.946224
+-0.749693 -0.661785 -0.998009 -0.0630784
+0.0599699 -0.9982 0.960336 -0.278845
+-0.759688 -0.650288 -0.110327 0.993895
+0.783514 0.621374 -0.474816 -0.880085
+0.751032 -0.660266 -0.990305 -0.138913
+-0.474382 -0.880319 0.667964 0.744193
+-0.230641 -0.973039 -0.284334 0.958725
+0.986622 -0.163027 -0.785157 0.619296
+-0.0328844 -0.999459 -0.989151 0.146903
+-0.995315 0.0966848 -0.96669 0.255949
+-0.776299 0.630365 0.611601 0.791167
+-0.599982 -0.800014 0.0547687 -0.998499
+-0.818293 -0.574801 -0.024915 -0.99969
+-0.887773 -0.460281 -0.760108 -0.649797
+-0.764205 0.644973 0.553889 -0.83259
+0.995512 0.0946403 -0.998573 -0.0534072
+0.140606 0.990066 0.0298483 -0.999554
+-0.501538 -0.865136 -0.645182 -0.764029
+0.991015 -0.133748 0.660989 -0.750396
+0.916402 -0.400259 -0.942996 0.332803
+0.928716 0.370792 0.959097 0.283078
+0.856349 0.516398 -0.65481 -0.755794
+-0.110104 0.99392 0.0372193 -0.999307
+0.0700458 -0.997544 0.747079 0.664735
+-0.969799 0.243906 0.880612 0.473839
+0.990779 0.135485 0.519984 0.854176
+-0.986888 0.161408 -0.875792 0.482689
+0.261933 -0.965086 0.199743 0.979848
+0.986204 0.165532 -0.60438 -0.796696
+0.359543 0.933129 0.604771 0.7964
+-0.12406 -0.992275 0.991776 0.12799
+-0.629804 -0.776754 0.552922 0.833233
+0.953011 -0.302936 0.802855 0.596174
+-0.551018 0.834493 -0.236628 0.9716
+-0.010806 -0.999942 0.470779 -0.882251
+0.515723 -0.856755 -0.712255 -0.70192
+0.996013 0.0892033 -0.881118 0.472897
+-0.97049 0.241142 0.711978 0.702202
+0.369149 -0.92937 0.993929 0.11002
+0.0564018 -0.998408 0.802088 -0.597206
+0.942628 -0.333844 -0.86799 -0.496581
+0.299272 0.954168 0.520844 0.853652
+-0.83258 0.553905 -0.552381 -0.833592
+-0.96324 -0.268642 -0.474801 0.880093
+0.1735 -0.984834 0.158803 -0.98731
+0.279008 -0.960289 -0.999998 -0.00181128
+-0.933492 -0.358597 0.521127 -0.853479
+0.999445 0.0333031 -0.98213 -0.188202
+-0.970713 0.240241 0.643798 0.765196
+-0.973067 -0.230522 -0.295989 -0.955191
+0.929223 -0.369518 0.98878 -0.149382
+-0.990596 -0.136817 0.400854 0.916142
+-0.714243 -0.699897 -0.528112 0.849175
+0.26496 0.964259 -0.112477 -0.993654
+-0.205868 0.97858 -0.309522 0.950892
+0.863381 0.504552 -0.867433 0.497554
+0.131874 0.991266 0.79027 -0.612759
+0.0452181 -0.998977 -0.187908 -0.982187
+0.713084 -0.701079 -0.660791 -0.75057
+-0.034032 0.999421 -0.965806 -0.259265
+0.948432 -0.316981 0.668572 -0.743648
+-0.784128 -0.6206 -0.559291 -0.828971
+0.797737 -0.603005 -0.317987 -0.948095
+0.807841 -0.5894 0.98011 -0.198457
+0.949955 -0.312388 0.937773 -0.34725
+-0.61159 -0.791175 -0.98616 -0.165798
+-0.0883494 -0.99609 -0.837389 -0.546607
+0.974034 -0.226403 -0.662075 0.749438
+0.784328 0.620347 -0.585701 -0.810527
+-0.95835 -0.285597 -0.772168 -0.635418
+-0.171106 -0.985253 -0.0834731 0.99651
+0.946428 0.322914 0.10589 0.994378
+-0.0143004 -0.999898 0.140247 -0.990117
+0.688195 0.725525 0.876792 -0.48087
+-0.82489 -0.565294 -0.925422 -0.378939
+-0.987214 -0.159399 -0.955281 -0.295701
+0.888726 -0.458438 -0.877661 0.479282
+0.567316 0.8235 -0.805678 0.592354
+-0.981358 -0.192188 0.882559 0.470202
+-0.752563 0.658521 -0.93178 -0.363022
+-0.362201 -0.9321 0.804283 0.594247
+-0.982918 0.184045 0.942896 0.333088
+0.835583 -0.549365 -0.0409276 -0.999162
+-0.393675 0.91925 -0.929371 0.369148
+-0.437901 -0.899023 0.22492 -0.974377
+0.365578 0.930781 0.962764 0.270345
+-0.803701 0.595033 0.622496 -0.782623
+0.833424 -0.552634 -0.419311 -0.907843
+0.946359 -0.323116 0.0846182 -0.996413
+-0.155941 0.987766 -0.998753 0.0499244
+0.523951 0.851748 0.169601 0.985513
+0.795136 -0.606431 -0.684407 -0.7291
+0.735285 -0.677758 0.59998 0.800015
+0.931584 0.363527 0.880428 -0.474179
+0.284913 -0.958553 -0.815489 -0.578772
+0.486764 -0.873533 0.84045 0.541889
+-0.282134 -0.959375 -0.946861 0.321643
+-0.979977 -0.199111 0.366521 0.93041
+0.276354 -0.961056 -0.962553 0.271094
+0.37386 -0.927485 0.815277 0.57907
+0.882295 0.470696 0.308183 -0.951327
+-0.994169 -0.107836 -0.189801 -0.981823
+0.653329 -0.757074 -0.489485 0.872012
+0.458031 -0.888936 -0.898703 -0.438558
+-0.605944 -0.795507 -0.638545 -0.769584
+-0.966894 0.25518 0.783419 -0.621494
+-0.59387 0.804561 0.728832 0.684693
+-0.90321 -0.4292 0.929274 0.369391
+-0.758675 -0.65147 -0.26304 0.964785
+0.737426 -0.675428 0.321292 0.94698
+0.962359 -0.271782 -0.731782 -0.681539
+-0.332443 0.943124 -0.784879 0.619649
+-0.60052 0.79961 -0.0124817 0.999922
+0.654822 -0.755783 -0.651017 0.759063
+-0.736092 -0.676882 0.500701 -0.86562
+0.981836 0.189732 0.971494 0.237064
+0.942857 0.333199 -0.831984 0.554799
+0.994365 0.106012 -0.365771 -0.930705
+0.923138 -0.384469 -0.192141 -0.981367
+0.999943 0.0106737 0.482408 0.875947
+-0.259777 0.965669 0.41178 0.911283
+0.81115 0.584838 0.934562 -0.355799
+0.801564 -0.597909 0.308489 -0.951228
+0.463479 0.886108 -0.481981 0.876182
+0.54305 0.839701 0.654103 -0.756406
+-0.344752 -0.938694 -0.802114 0.597171
+0.99965 0.0264609 -0.879874 0.475207
+0.652375 -0.757896 -0.376052 0.926599
+0.150945 0.988542 -0.849606 -0.527418
+0.301687 -0.953407 0.7181 -0.69594
+-0.459041 -0.888415 -0.843153 0.537674
+-0.332125 0.943235 -0.763581 0.645712
+-0.40274 0.915315 -0.819586 -0.572957
+-0.972501 -0.232899 -0.0561475 -0.998422
+0.686353 0.727269 0.969415 -0.245429
+0.972177 -0.234247 0.0824037 0.996599
+0.999736 -0.0229742 -0.6645 -0.747288
+-0.992736 0.120309 0.874583 0.484875
+-0.978619 -0.205683 -0.291559 0.956553
+-0.773441 -0.633868 0.895762 -0.444534
+-0.650809 0.759241 -0.17817 0.984
+-0.997683 0.06803 0.865285 -0.501279
+0.85494 -0.518726 -0.427609 0.903964
+-0.216273 -0.976333 -0.981699 -0.190438
+-0.601889 0.798579 -0.182813 0.983148
+-0.980431 -0.196864 0.568385 0.822763
+-0.0271031 -0.999633 -0.908569 -0.417735
+-0.833581 0.552397 -0.393352 -0.919388
+-0.954036 -0.299691 0.55785 -0.829942
+-0.409348 -0.912378 -0.235378 0.971904
+-0.83943 0.543468 0.615579 -0.788075
+0.537239 -0.84343 0.986023 0.166607
+0.201552 -0.979478 0.125827 0.992052
+-0.347911 0.937527 -0.55974 -0.828668
+0.996369 0.0851396 -0.621222 0.783634
+0.931921 -0.362662 0.832698 0.553728
+0.999994 0.00336753 0.943832 0.330425
+0.993767 0.111475 0.174209 -0.984709
+0.333101 -0.942891 -0.826221 0.563346
+0.147615 0.989045 -0.627613 -0.778525
+0.406088 -0.913834 -0.560198 -0.828359
+-0.990586 0.136894 0.393734 -0.919225
+-0.981929 -0.189251 0.981937 0.18921
+0.672898 0.739735 -0.0154831 0.99988
+0.995228 0.0975774 -0.939882 -0.3415
+-0.536313 -0.844019 0.998341 -0.0575726
+0.827457 0.561529 -0.997755 0.0669636
+0.997207 0.0746871 0.369353 0.929289
+0.633961 0.773365 0.901048 0.433719
+-0.694268 -0.719717 0.226851 -0.97393
+-0.723939 -0.689864 0.743953 0.668232
+-0.999758 -0.0219836 -0.587319 0.809356
+0.741622 0.670819 -0.291921 -0.956443
+-0.976775 -0.214266 -0.922179 0.386764
+0.194757 0.980851 0.730702 -0.682696
+-0.982076 0.188485 0.993691 -0.112151
+0.915479 0.402365 -0.842368 -0.538903
+0.975213 -0.22127 -0.94908 0.315036
+0.714521 -0.699614 -0.49398 -0.869473
+-0.752815 -0.658232 -0.917173 0.398489
+-0.601083 -0.799187 -0.0827927 -0.996567
+-0.219572 0.975596 -0.989294 -0.145936
+-0.959614 0.281319 -0.970745 0.240112
+-0.903935 0.42767 0.978229 -0.20753
+-0.838256 -0.545276 0.432815 0.901483
+-0.980081 0.198596 0.414889 -0.909872
+-0.687296 0.726377 0.929484 0.368862
+-0.836415 -0.548096 0.110632 0.993861
+-0.996111 0.0881042 -0.823681 -0.567053
+0.455955 0.890003 -0.975756 0.21886
+0.418624 -0.90816 0.704312 -0.709891
+-0.323996 0.946058 -0.00829839 0.999966
+-0.573499 -0.819207 -0.183007 0.983112
+-0.582929 0.812523 0.825908 -0.563805
+-0.917849 0.39693 -0.999717 -0.02378
+-0.490826 -0.871258 0.507738 -0.861512
+0.998417 0.0562363 0.792078 -0.61042
+-0.982368 -0.186957 0.999066 -0.0432178
+-0.424383 -0.905483 0.988128 0.153633
+0.589467 0.807793 0.978451 -0.206478
+0.547471 0.836825 0.184547 -0.982824
+-0.317432 0.948281 0.632458 0.774594
+-0.571566 -0.820556 -0.407548 0.913184
+-0.155342 0.987861 -0.993888 0.110397
+0.513244 -0.858243 -0.882825 -0.469703
+0.693527 -0.720431 0.32563 0.945497
+-0.0336397 -0.999434 -0.975236 0.221166
+0.815191 -0.579192 0.490539 0.871419
+0.516927 -0.85603 -0.606915 -0.794767
+-0.723254 -0.690582 0.674045 0.73869
+-0.994931 -0.10056 -0.79716 -0.603768
+-0.994843 0.101424 -0.74179 0.670632
+0.832536 -0.553971 -0.559028 -0.829149
+0.983039 -0.183394 0.918811 0.394698
+0.855898 -0.517145 -0.586464 0.809976
+-0.999946 0.0104081 0.505508 -0.862822
+-0.927037 0.374969 0.740329 -0.672245
+-0.212613 0.977137 -0.843878 0.536535
+0.842075 0.539361 0.913451 0.406948
+0.890396 -0.455187 -0.990993 0.13391
+-0.966596 0.256305 0.705993 -0.708219
+0.842338 -0.538949 0.932243 -0.361832
+0.142149 0.989845 -0.125682 -0.992071
+0.764308 0.644852 0.567056 0.823679
+-0.0531147 0.998588 0.565944 -0.824444
+-0.52337 -0.852106 0.102055 0.994779
+0.18669 -0.982419 0.997525 -0.0703129
+-0.109187 0.994021 -0.0549846 -0.998487
+0.354835 0.934929 0.144952 0.989439
+-0.968791 0.247877 0.996485 0.0837747
+-0.867326 0.497741 -0.259966 -0.965618
+-0.58811 0.808781 0.999194 0.0401359
+0.0724677 -0.997371 0.565344 0.824856
+0.904158 0.427197 0.987735 0.15614
+-0.707605 -0.706608 -0.997518 0.0704179
+-0.818793 -0.574089 -0.111663 -0.993746
+0.934824 -0.35511 0.174007 0.984744
+-0.682405 0.730975 0.957241 -0.289291
+-0.99998 0.006246 0.811195 -0.584776
+0.179251 -0.983803 0.677035 -0.735951
+0.99835 -0.0574239 0.858921 0.512109
+0.99554 0.0943434 -0.999721 -0.0236135
+-0.0785455 0.996911 -0.00866466 0.999962
+0.799351 -0.600865 -0.055546 -0.998456
+0.995957 -0.089833 -0.909235 -0.416284
+0.44832 0.893873 -0.804864 -0.593459
+-0.793054 0.609152 -0.889569 -0.456801
+-0.889605 0.456732 -0.952977 0.303042
+-0.968755 0.248021 0.997619 0.0689696
+-0.996363 0.0852093 -0.626684 -0.779274
+-0.584202 0.811608 0.903814 -0.427926
+0.872825 -0.488033 0.753158 -0.65784
+-0.793351 0.608764 -0.866188 -0.499718
+-0.88641 -0.462901 -0.538126 -0.842865
+0.981816 0.189836 0.968932 0.247328
+-0.565766 -0.824566 -0.902204 0.43131
+0.0694803 0.997583 0.783545 -0.621335
+0.369793 -0.929114 0.983924 0.178587
+0.88141 -0.472351 0.480265 0.877123
+-0.908015 0.418937 0.728349 0.685206
+-0.127946 0.991781 0.965504 0.260387
+-0.529361 0.848397 0.722113 -0.691775
+0.195185 -0.980766 0.70026 0.713887
+0.979901 0.199482 0.33106 0.94361
+-0.841059 0.540943 0.82127 -0.570539
+-0.831131 0.556076 -0.748793 -0.662804
+-0.687816 -0.725885 0.900742 -0.434355
+-0.594148 0.804356 0.704742 0.709463
+0.160691 -0.987005 -0.908519 -0.417844
+0.692336 0.721575 0.476676 -0.879079
+0.684826 0.728706 0.999265 -0.0383247
+0.103748 -0.994604 -0.566364 -0.824156
+0.621172 0.783674 -0.497301 0.867578
+-0.780245 0.625474 0.0296649 0.99956
+-0.514691 -0.857376 -0.791424 0.611268
+0.68906 0.724704 0.813322 -0.581814
+-0.908894 -0.417027 0.569322 -0.822115
+0.93045 0.36642 0.983254 -0.182242
+-0.943986 -0.329984 -0.598764 0.800926
+0.983927 0.178572 0.624667 -0.780891
+-0.958288 -0.285804 -0.758206 -0.652016
+0.819297 -0.57337 -0.198435 0.980114
+0.945945 -0.324326 -0.0432285 -0.999065
+0.934247 -0.356628 0.330925 0.943657
+-0.991646 0.128988 0.932886 -0.360171
+0.990313 -0.138855 0.205211 -0.978718
+-0.822628 -0.56858 -0.705571 -0.708639
+-0.197576 -0.980288 0.507172 -0.861845
+0.237199 -0.971461 0.376698 -0.926336
+-0.993642 -0.112583 0.282703 -0.959207
+0.590081 0.807344 0.95994 -0.280206
+0.933128 0.359544 0.60491 -0.796294
+0.62151 -0.783406 -0.459412 -0.888223
+0.906991 -0.42115 0.872244 0.489071
+0.842651 0.53846 0.951652 0.307178
+-0.0989486 0.995093 -0.884068 -0.467359
+-0.519637 0.854387 -0.328971 -0.94434
+-0.188728 -0.982029 0.990617 -0.136668
+-0.741618 -0.670822 -0.291466 -0.956581
+0.759783 0.650177 -0.0957103 0.995409
+0.577945 -0.816076 0.352062 -0.935977
+-0.0190477 -0.999819 -0.327913 -0.944708
+0.725494 -0.688229 0.874579 -0.484883
+0.998541 -0.054003 0.636952 0.770903
+0.640223 0.768189 0.934565 -0.355793
+-0.963476 -0.267796 -0.395769 0.91835
+0.727191 0.686435 0.966569 0.256405
+-0.261539 -0.965193 0.239566 -0.97088
+-0.79834 -0.602207 -0.221779 0.975097
+-0.459946 -0.887947 -0.784108 0.620624
+-0.0849789 -0.996383 -0.608503 -0.793552
+0.592926 0.805257 0.803932 -0.594721
+-0.885954 -0.463773 -0.452688 -0.891669
+-0.403539 -0.914963 -0.766505 0.642238
+0.841116 0.540854 0.827254 0.561829
+0.938374 0.345621 -0.74346 -0.66878
+-0.526676 -0.850066 0.471275 0.881986
+-0.384407 -0.923164 -0.185552 -0.982634
+0.153408 -0.988163 -0.953447 0.301561
+-0.950733 0.310011 0.994544 -0.104317
+0.278031 0.960572 -0.995006 -0.0998109
+0.888311 -0.459243 -0.830752 0.556642
+-0.998618 -0.0525511 0.518543 -0.855052
+0.925317 0.379194 0.368463 0.929642
+0.61228 -0.790641 -0.996856 0.0792305
+-0.81319 -0.581999 0.756125 -0.654427
+-0.468892 0.883255 0.10873 -0.994071
+0.357349 0.933971 0.402758 0.915306
+-0.418068 0.908416 0.659591 -0.751625
+0.940246 -0.340495 -0.982601 0.185729
+-0.335738 0.941955 -0.949653 0.313305
+0.499715 0.86619 -0.471287 -0.88198
+-0.358343 -0.93359 0.497667 0.867368
+0.404705 0.914447 -0.67863 0.734481
+0.545763 0.83794 0.379734 -0.925096
+0.487755 -0.872981 0.773706 0.633545
+-0.145038 -0.989426 -0.40593 -0.913904
+-0.178317 0.983973 0.604239 -0.796803
+-0.970162 -0.242459 0.800449 -0.5994
+-0.48005 0.877241 0.981172 -0.193137
+0.955732 -0.294238 0.0207262 0.999785
+-0.159139 0.987256 -0.962731 -0.270461
+-0.991039 0.133576 0.673933 -0.738792
+-0.983195 -0.182561 0.882095 -0.471072
+0.967521 -0.25279 0.911638 -0.410993
+-0.905824 -0.423655 0.972588 -0.232533
+-0.859507 -0.511123 -0.970846 -0.239704
+-0.724459 -0.689318 0.792123 0.610361
+-0.0428976 0.999079 -0.408961 -0.912552
+-0.636929 0.770923 0.997936 -0.0642238
+0.902463 0.430768 0.851472 0.5244
+-0.971615 0.236569 0.315836 0.948814
+-0.21175 0.977324 -0.793288 0.608847
+-0.878579 -0.477598 0.889913 -0.456129
+-0.988757 -0.14953 -0.765683 0.643218
+0.643062 0.765814 0.742554 -0.669786
+0.43649 0.899709 0.374382 -0.927274
+0.595694 -0.803212 0.556152 0.831081
+-0.48545 0.874264 0.912129 0.409903
+-0.999792 0.0203745 -0.450023 -0.893017
+0.286609 -0.958048 -0.700831 -0.713327
+-0.660534 -0.750796 -0.99463 -0.103491
+-0.51726 -0.855828 -0.575534 0.817778
+-0.997128 0.075734 0.269936 -0.962878
+0.419242 -0.907874 0.750998 -0.660304
+0.434831 -0.900512 0.537973 0.842962
+-0.42024 0.907413 0.818877 -0.573968
+-0.959081 -0.283133 -0.908308 -0.418303
+0.808542 0.588439 0.996739 0.0806917
+0.627711 -0.778446 0.311433 -0.950268
+0.708782 -0.705427 -0.971995 -0.235
+0.945891 0.324485 -0.0600154 0.998197
+0.668633 0.743593 -0.556836 0.830622
+-0.608202 0.793782 -0.828676 0.559729
+-0.870756 -0.491715 0.417284 0.908776
+0.834889 0.550418 -0.166253 0.986083
+0.887214 -0.461359 -0.675805 0.73708
+0.497094 0.867697 -0.18728 -0.982307
+-0.22543 -0.974259 -0.73356 0.679625
+0.422875 0.906188 0.949002 0.31527
+-0.985541 -0.16944 -0.249981 -0.968251
+0.216237 -0.976341 -0.981001 0.194003
+-0.625247 -0.780427 0.000596343 1
+0.374286 -0.927313 0.787823 0.615901
+-0.65628 0.754518 -0.784515 0.620109
+0.501521 0.865146 -0.643674 -0.7653
+0.950839 -0.309686 0.997524 -0.070333
+-0.965306 -0.261122 0.281303 0.959619
+0.993648 0.112534 0.278045 -0.960568
+-0.190837 0.981622 0.9387 0.344735
+0.970426 0.2414 0.730363 -0.683059
+0.392602 -0.919708 -0.880062 0.474859
+0.863052 -0.505114 -0.897982 -0.440032
+-0.295366 -0.955384 0.138242 0.990398
+-0.321821 0.9468 0.219672 0.975574
+-0.0967521 -0.995309 -0.964938 0.262479
+-0.988769 -0.14945 -0.760498 0.649341
+-0.723897 -0.689908 0.739833 0.672791
+-0.189012 0.981975 0.986256 0.165225
+-0.711519 -0.702667 -0.810414 0.585857
+-0.991455 0.130452 0.86974 -0.49351
+0.558744 0.82934 -0.919809 -0.392367
+-0.445014 -0.895524 -0.536164 -0.844114
+-0.759922 -0.650014 -0.0743824 0.99723
+-0.998145 -0.0608856 0.981843 -0.189698
+-0.0528438 0.998603 0.543378 -0.839488
+-0.276671 -0.960965 -0.970985 -0.23914
+-0.913658 0.406484 -0.523712 0.851896
+-0.892753 0.450547 -0.926399 -0.376544
+-0.873859 0.48618 0.874801 -0.484482
+-0.754714 -0.656054 -0.765581 0.64334
+0.956184 -0.292765 -0.133007 0.991115
+0.285716 0.958314 -0.764189 0.644992
+-0.0401186 0.999195 -0.643796 -0.765197
+0.0864013 -0.99626 -0.715215 0.698905
+-0.910575 -0.413345 0.199552 -0.979887
+-0.884569 0.466409 -0.17121 0.985235
+-0.226375 -0.97404 -0.664288 0.747477
+0.77105 0.636775 0.996453 -0.084151
+-0.931438 0.363901 0.898781 0.438398
+0.99934 -0.0363309 -0.881248 0.472653
+0.59453 0.804074 0.670293 -0.742097
+-0.0310011 0.999519 -0.99916 0.0409774
+0.844131 -0.536136 0.999328 -0.0366574
+0.592596 -0.8055 0.827634 0.561268
+-0.936369 -0.351018 -0.259463 -0.965753
+-0.615293 -0.788299 -0.954667 0.297675
+-0.706323 0.70789 -0.993868 0.110574
+0.435664 0.900109 0.45779 -0.88906
+0.890387 -0.455204 -0.99073 0.135849
+0.999973 -0.00736732 0.740664 -0.671876
+-0.549362 -0.835584 -0.0406018 -0.999175
+0.875018 0.484091 0.964584 0.263775
+-0.451599 -0.892221 -0.964257 -0.264969
+-0.125669 0.992072 0.999428 0.0338315
+-0.84392 -0.536469 0.997107 0.0760058
+0.914838 -0.40382 -0.746394 0.665504
+0.988115 -0.153715 -0.962339 -0.271853
+0.98912 0.147109 -0.586946 0.809626
+-0.634784 0.772689 0.94205 -0.335472
+-0.78874 0.614726 -0.973563 0.228419
+-0.649992 -0.759941 -0.0715107 -0.99744
+-0.380754 0.924676 0.207192 0.9783
+-0.814457 -0.580224 0.596658 -0.802496
+0.785406 -0.618981 -0.7172 0.696868
+0.888321 0.459224 -0.831926 -0.554887
+0.501791 0.864989 -0.667291 -0.744797
+-0.406048 0.913852 -0.563787 -0.82592
+0.246209 -0.969217 0.967403 -0.253241
+-0.163897 0.986478 -0.727599 -0.686002
+0.0456565 -0.998957 -0.144639 -0.989484
+0.210834 -0.977522 -0.732828 0.680414
+-0.890642 0.454705 -0.996785 0.080127
+0.997062 0.0766033 0.185064 0.982726
+-0.346113 -0.938193 -0.707393 0.706821
+-0.161526 0.986868 -0.869946 -0.493147
+-0.906728 -0.421716 0.901053 -0.433708
+-0.526615 0.850104 0.464922 -0.885352
+-0.584505 -0.81139 0.919141 0.393929
+-0.0154383 -0.999881 0.0269007 -0.999638
+-0.0819207 0.996639 -0.340338 0.940303
+-0.590467 -0.807062 0.945446 -0.325779
+-0.827004 0.562197 -0.999906 0.0137089
+-0.554146 0.832419 -0.576313 0.817229
+-0.453423 0.891295 -0.997974 0.0636218
+-0.453811 -0.891098 -0.999797 -0.0201276
+0.914222 -0.405213 -0.63676 0.771062
+-0.0548859 0.998493 0.702542 -0.711643
+-0.585392 -0.81075 0.956672 0.291167
+0.963886 -0.266315 -0.250529 -0.968109
+-0.736684 -0.676237 0.423093 -0.906086
+0.960112 0.279615 -0.997889 -0.064947
+-0.828902 -0.559394 -0.947715 0.319117
+0.905796 -0.423714 0.974086 0.226179
+-0.61973 -0.784815 -0.647518 0.76205
+-0.997279 0.0737231 0.457318 -0.889303
+0.999217 0.0395694 -0.684863 -0.728672
+0.367881 -0.929873 0.999656 -0.02624
+0.337571 -0.9413 -0.992323 0.123669
+0.284368 -0.958715 -0.847068 -0.531484
+0.857004 0.515309 -0.74535 -0.666674
+-0.924906 -0.380196 0.265898 0.964001
+-0.877211 -0.480106 0.982384 -0.186871
+-0.997598 -0.0692716 0.796372 0.604808
+-0.893064 -0.449929 -0.898141 0.439707
+-0.146817 0.989164 -0.562847 0.826561
+0.2295 -0.973309 -0.394541 -0.918878
+0.620024 0.784583 -0.618569 0.785731
+-0.763575 -0.645719 0.470117 0.882604
+-0.923877 0.38269 -0.000666085 -1
+0.774917 -0.632063 0.768807 0.639481
+0.706101 -0.708111 -0.989914 0.141669
+0.854373 0.519661 -0.326409 -0.945229
+-0.285516 0.958374 -0.777501 -0.628882
+0.198163 0.980169 0.454724 -0.890632
+-0.850564 0.525872 0.385885 0.922547
+0.983575 -0.180498 0.764686 0.644404
+0.578342 0.815794 0.397183 0.91774
+-0.478396 -0.878144 0.927624 0.373515
+-0.722117 -0.691771 0.543924 0.839134
+0.774714 0.632312 0.788966 -0.614436
+-0.241407 0.970424 0.730908 -0.682476
+-0.499883 -0.866093 -0.488277 -0.872689
+-0.28845 -0.957495 -0.551638 0.834084
+0.192516 0.981294 0.866329 -0.499474
+-0.36993 0.92906 0.981201 0.19299
+0.358255 0.933624 0.489479 0.872015
+0.153536 0.988143 -0.957269 -0.289198
+0.727818 0.685771 0.985927 0.167176
+0.999757 -0.022061 -0.593563 -0.804787
+0.991009 0.133799 0.657168 0.753744
+0.270359 0.962759 -0.623408 -0.781897
+-0.933069 -0.359699 0.617989 -0.786187
+-0.805086 -0.593158 0.786445 0.617661
+-0.203018 -0.979175 -0.0235677 -0.999722
+0.671451 0.741049 -0.209349 0.977841
+0.704931 -0.709276 -0.953182 0.302396
+-0.999632 -0.0271212 -0.909324 0.416088
+-0.165099 0.986277 -0.638823 -0.769353
+-0.996261 0.0863983 -0.715004 -0.699121
+0.933916 -0.357492 0.416693 0.909047
+0.495451 0.868636 0.000855552 -1
+-0.642281 0.766469 0.806836 0.590775
+0.983687 0.179888 0.723244 -0.690592
+-0.973937 0.226818 -0.629547 0.776963
+-0.878546 -0.477659 0.893051 -0.449955
+-0.931286 0.364288 0.916193 0.400738
+-0.917 0.398887 -0.982083 0.18845
+-0.118429 -0.992963 0.767646 0.640874
+0.765421 0.64353 0.700201 0.713946
+0.93812 0.346311 -0.692314 -0.721596
+0.536114 -0.844146 0.999423 0.0339591
+-0.809275 0.587429 0.999033 0.0439589
+-0.169013 -0.985614 -0.291688 0.956513
+-0.962907 -0.269832 -0.579644 0.81487
+-0.732239 -0.681047 0.887448 -0.460908
+0.978217 0.207585 -0.470802 0.882239
+-0.093045 -0.995662 -0.994302 -0.106597
+0.560547 -0.828123 -0.98282 0.184565
+0.569608 0.821916 -0.611666 0.791116
+-0.114988 -0.993367 0.504393 0.863474
+0.666309 -0.745676 -0.784993 -0.619505
+-0.637309 0.770608 0.999889 -0.0149294
+-0.250021 0.96824 0.990561 0.137069
+-0.97874 0.205107 -0.23471 -0.972065
+0.883946 0.46759 -0.0384906 -0.999259
+-0.885391 0.464848 -0.341405 0.939916
+-0.544467 0.838782 0.51767 0.85558
+-0.870939 -0.491391 0.45078 0.892635
+-0.312292 -0.949986 0.941225 -0.337779
+0.469962 -0.882687 0.228017 -0.973657
+-0.989052 -0.147564 -0.62361 0.781735
+0.670466 -0.74194 -0.336974 -0.941514
+0.374705 0.927144 0.759185 -0.650875
+-0.946373 -0.323076 0.0888378 0.996046
+-0.484706 0.874677 0.943662 0.330911
+0.113663 -0.993519 0.385128 -0.922863
+0.999037 -0.0438761 -0.317761 0.948171
+0.0955785 -0.995422 -0.989114 -0.147148
+-0.999988 0.00479812 0.887081 -0.461614
+0.792919 0.609327 -0.899439 0.437046
+0.43439 -0.900725 0.578596 0.815614
+-0.532057 0.846709 0.902245 -0.431224
+-0.999626 -0.0273291 -0.917782 0.397086
+-0.961184 -0.275907 -0.948916 0.31553
+0.740791 -0.671736 -0.171591 0.985168
+0.713353 0.700804 -0.631463 0.775406
+-0.882973 -0.469424 0.168378 -0.985722
+-0.737749 -0.675075 0.275629 -0.961264
+0.98022 -0.19791 0.477502 -0.878631
+-0.117121 -0.993118 0.67683 0.736139
+-0.585765 0.810481 0.969052 -0.246857
+0.505552 -0.862796 -0.919151 0.393905
+0.839947 0.542669 0.687745 0.725952
+-0.638286 -0.769799 0.993742 -0.1117
+-0.317839 0.948145 0.598635 0.801022
+0.488721 0.87244 0.698943 -0.715178
+0.922972 0.384867 -0.234279 0.972169
+-0.622234 -0.782831 -0.375442 0.926846
+0.00306279 -0.999995 0.953462 0.301514
+0.0773816 -0.997002 0.107869 0.994165
+-0.983421 0.181338 0.816823 0.576889
+-0.150593 0.988596 -0.830292 0.557328
+-0.687833 -0.725869 0.899671 -0.436568
+-0.536619 -0.843825 0.995602 -0.0936837
+0.461908 -0.886928 -0.628886 -0.777498
+0.968298 -0.249799 0.993451 -0.114262
+-0.89935 0.437229 0.296976 -0.954885
+0.422549 -0.90634 0.937036 -0.349233
+-0.156107 -0.98774 -0.99945 -0.0331661
+0.897242 -0.44154 -0.177346 -0.984148
+0.887304 -0.461184 -0.690175 0.723642
+-0.957493 -0.288455 -0.551227 -0.834355
+-0.103529 0.994626 -0.584398 -0.811467
+-0.899577 0.436763 0.346082 -0.938204
+0.840741 0.541438 0.786332 0.617804
+0.591434 0.806354 0.899709 -0.436491
+-0.947801 -0.318861 0.508951 0.860795
+-0.488187 -0.872739 0.741384 -0.671081
+0.10802 -0.994149 -0.171597 -0.985167
+-0.99216 -0.124975 0.999346 -0.0361494
+-0.809556 0.587043 0.9958 0.0915542
+0.742464 0.669886 -0.409483 -0.912318
+-0.609416 0.79285 -0.904311 0.426874
+-0.998554 0.0537649 0.618392 0.785869
+0.0417735 -0.999127 -0.508826 -0.860869
+-0.558041 -0.829813 -0.883288 -0.46883
+-0.534921 -0.844902 0.994257 0.107017
+0.423087 -0.906089 0.956118 -0.292981
+-0.302372 0.95319 0.766157 -0.642654
+-0.846536 0.532331 0.915719 0.401819
+-0.870633 -0.491933 0.394407 0.918936
+0.124509 -0.992218 0.996554 -0.0829466
+-0.398778 -0.917048 -0.98426 0.176729
+0.241772 0.970333 0.756015 0.654554
+-0.904073 0.427379 0.9844 -0.175943
+-0.997554 -0.0699049 0.756393 0.654117
+0.476495 0.879177 0.825854 0.563884
+0.626215 -0.77965 0.124338 -0.99224
+-0.484873 0.874585 0.937207 0.348773
+0.794014 -0.607899 -0.806698 -0.590964
+0.21762 -0.976034 -0.998562 0.0536034
+-0.0268847 0.999639 -0.899224 0.437488
+-0.935615 0.353022 -0.0483996 0.998828
+0.948259 0.317498 0.627055 0.778975
+-0.41242 -0.910994 0.0992481 0.995063
+-0.977749 -0.209777 -0.655138 0.755509
+0.304817 0.952411 0.904182 0.427146
+0.100412 0.994946 -0.806033 0.591871
+0.294244 0.95573 0.0212989 0.999773
+0.979765 -0.200154 0.265656 -0.964068
+0.0247181 -0.999694 -0.78411 0.620622
+-0.799262 -0.600983 -0.070324 0.997524
+0.86152 0.507724 -0.988318 0.152407
+0.777545 0.628828 0.444151 -0.895952
+0.830418 0.557141 -0.827411 0.561596
+0.543269 -0.839558 0.634084 0.773264
+0.0879081 -0.996129 -0.812363 0.583152
+0.0265219 -0.999648 -0.882761 0.469823
+-0.530865 -0.847457 0.832811 0.553557
+0.922919 0.384994 -0.247633 0.968854
+0.509692 0.860357 -0.997145 0.0755167
+0.0452963 0.998974 -0.180216 0.983627
+0.49691 -0.867802 -0.166416 0.986056
+0.585735 -0.810503 0.968103 -0.250552
+-0.958386 0.285476 -0.780084 0.625675
+-0.0783627 0.996925 0.00966954 0.999953
+-0.64096 0.767574 0.896157 0.443736
+-0.70765 -0.706563 -0.997043 0.0768404
+0.728181 0.685385 0.993396 0.114737
+-0.360525 -0.932749 0.685122 0.728428
+-0.991403 -0.130841 0.849723 0.527229
+0.827425 -0.561576 -0.998118 -0.0613231
+0.942105 -0.335318 -0.934757 -0.355288
+0.973762 -0.22757 -0.567738 0.823209
+0.962913 -0.269814 -0.578106 -0.815962
+-0.694016 -0.71996 0.26076 -0.965404
+-0.999834 0.0182337 -0.249996 -0.968247
+0.550485 0.834845 -0.174178 -0.984714
+0.646633 -0.762801 0.361213 0.932483
+-0.311621 -0.950206 0.962703 -0.270561
+0.706443 0.70777 -0.995603 -0.0936747
+-0.746584 -0.665291 -0.86195 -0.506993
+-0.321991 0.946743 0.202191 0.979346
+0.249263 0.968436 0.998249 -0.0591562
+-0.162149 -0.986766 -0.837077 0.547084
+-0.794856 0.606798 -0.717292 -0.696773
+0.948475 0.316851 0.678718 0.734399
+-0.9972 0.0747768 0.360977 -0.932575
+0.585503 0.81067 0.960557 0.278083
+-0.234995 -0.971997 0.158712 0.987325
+-0.949124 -0.314903 0.814139 0.58067
+-0.39904 0.916934 -0.978814 -0.204751
+0.960355 -0.278782 -0.999762 -0.0218192
+-0.744903 0.667173 -0.708059 0.706153
+0.509446 0.860502 -0.998894 0.0470242
+-0.840805 0.541339 0.793549 -0.608506
+-0.606749 -0.794894 -0.712967 -0.701198
+-0.987034 -0.16051 -0.916032 -0.401104
+0.977485 0.211003 -0.744445 0.667683
+0.102986 -0.994683 -0.627804 -0.778371
+0.206136 0.978523 -0.335418 -0.942069
+-0.941475 -0.337084 -0.984595 0.174852
+-0.473377 -0.88086 0.578891 0.815405
+0.522318 0.852751 -0.0211708 0.999776
+-0.993482 -0.113987 0.415051 -0.909798
+-0.693489 -0.720468 0.330679 -0.943743
+0.251449 -0.967871 0.959667 0.28114
+0.995395 0.0958536 -0.98467 -0.174426
+0.219723 -0.975562 -0.986914 -0.161244
+-0.575697 -0.817663 0.0844856 0.996425
+-0.219106 -0.975701 -0.995138 0.098493
+0.845696 -0.533666 0.96747 0.252984
+-0.114177 0.99346 0.432357 -0.901702
+0.994288 0.10673 -0.297667 -0.95467
+0.727622 0.685979 0.980742 0.195309
+0.998827 -0.0484227 0.131391 0.991331
+-0.855079 0.518497 -0.451674 0.892183
+0.472779 0.881181 0.522211 0.852816
+-0.99241 0.122976 0.971919 0.235316
+-0.920982 -0.389606 -0.68196 0.73139
+0.745405 -0.666612 -0.759126 0.650944
+0.980645 0.195793 0.654636 0.755944
+0.724751 -0.689011 0.817265 -0.576262
+0.530014 -0.847989 0.773148 -0.634226
+-0.861114 0.508413 -0.997333 -0.0729802
+0.962117 0.272636 -0.789262 0.614056
+0.0134114 0.99991 0.227601 -0.973755
+0.926613 0.376015 0.659892 0.75136
+-0.905882 -0.42353 0.96929 -0.245919
+-0.197874 0.980227 0.480724 0.876872
+0.469444 -0.882962 0.170554 -0.985348
+0.227699 -0.973731 -0.55679 -0.830653
+0.516712 -0.856159 -0.626641 -0.779308
+-0.99999 0.00445975 0.90219 -0.431339
+0.949282 -0.314427 0.842255 -0.53908
+-0.610936 0.79168 -0.969101 0.246664
+0.696695 0.717368 -0.108739 -0.99407
+-0.0656283 -0.997844 0.959841 -0.280545
+-0.684008 0.729474 0.99727 -0.0738462
+0.852917 -0.522047 -0.0529727 0.998596
+-0.778118 0.628118 0.360635 0.932707
+0.861619 0.507555 -0.985147 0.171711
+0.44271 -0.896665 -0.303878 0.952711
+-0.535167 -0.844746 0.996947 0.0780768
+0.802527 0.596616 0.457173 0.889378
+0.937218 -0.348743 -0.4841 0.875013
+-0.575444 -0.817841 0.0535899 0.998563
+-0.995568 -0.0940469 -0.999981 0.00617295
+0.750403 0.660981 -0.999027 0.044094
+0.671651 0.740868 -0.182893 0.983133
+0.880259 0.474494 0.677432 -0.735585
+0.999972 -0.00752929 0.729685 -0.683784
+0.513594 0.858033 -0.862922 0.505337
+0.9649 -0.262618 0.129751 -0.991547
+0.523614 -0.851956 0.13048 -0.991451
+-0.878498 -0.477746 0.8975 -0.441014
+0.999946 0.0103971 0.506458 0.862264
+0.858902 0.512141 -0.935732 -0.352711
+-0.634388 -0.773015 0.923614 0.383325
+-0.90143 -0.432925 0.702952 0.711237
+-0.671969 0.740579 -0.140547 -0.990074
+-0.980352 0.197254 0.535234 -0.844704
+-0.626808 0.779174 0.199394 -0.979919
+0.286839 0.957979 -0.6835 0.72995
+0.979463 -0.201624 0.118529 -0.992951
+-0.350024 0.936741 -0.360315 -0.932831
+-0.933653 -0.358179 0.482328 -0.875991
+0.827025 0.562165 -0.999951 -0.00985392
+0.957693 0.287793 -0.607546 -0.794284
+0.899908 -0.436079 0.416323 -0.909217
+0.99886 0.0477343 0.0628099 -0.998026
+-0.925966 0.377607 0.521732 -0.85311
+0.996713 0.0810192 -0.254016 0.9672
+0.485007 -0.87451 0.931743 0.363118
+0.814528 0.580124 0.586747 -0.80977
+0.751551 0.659675 -0.976335 0.216261
+0.149578 -0.98875 -0.768789 0.639502
+0.00573417 -0.999984 0.84005 0.542509
+-0.686179 -0.727432 0.974982 -0.222284
+0.765788 -0.643093 0.739843 -0.672779
+0.744707 -0.667392 -0.686997 0.72666
+-0.258853 -0.965917 0.496975 -0.867765
+0.760925 -0.64884 0.0798168 -0.99681
+0.955121 0.296215 0.225616 -0.974216
+-0.503434 -0.864034 -0.795946 -0.605367
+-0.154353 -0.988016 -0.977873 -0.209198
+-0.697557 -0.71653 -0.227152 -0.973859
+-0.494423 -0.869221 0.118873 -0.992909
+0.37343 -0.927659 0.841241 0.54066
+-0.111367 0.993779 0.163504 -0.986543
+0.0693799 0.99759 0.789756 -0.613422
+0.436072 0.899912 0.417059 -0.908879
+-0.086848 -0.996222 -0.745824 -0.666143
+-0.820784 -0.571239 -0.443631 -0.896209
+-0.737014 0.675878 0.378376 0.925652
+-0.285926 -0.958252 -0.749849 0.661609
+0.822397 -0.568914 -0.676165 0.73675
+0.9302 -0.367053 0.993364 0.115014
+0.302227 -0.953236 0.756332 -0.654188
+0.951333 -0.308165 0.995991 0.0894572
+0.677031 -0.735954 0.518132 -0.8553
+0.347385 -0.937723 -0.605391 -0.795928
+-0.764537 0.64458 0.595957 -0.803017
+0.734432 -0.678683 0.695632 0.718398
+-0.651564 -0.758593 -0.275053 -0.961429
+-0.996673 0.0815024 -0.300583 -0.953756
+0.999673 -0.025578 -0.834532 -0.550959
+-0.847519 0.530766 0.826294 0.563239
+0.0757859 0.997124 0.264915 -0.964272
+-0.704561 -0.709643 -0.936123 -0.351672
+-0.307688 0.951487 0.990264 -0.139205
+0.721911 0.691986 0.518702 0.854955
+-0.503079 0.864241 -0.770398 0.637563
+0.383235 0.923651 -0.0597211 -0.998215
+0.484536 0.874771 0.949939 -0.312436
+1 -0.000411042 0.999155 -0.0410926
+0.853428 -0.52121 -0.150425 0.988621
+0.288809 -0.957387 -0.520049 -0.854136
+-0.494781 -0.869018 0.0779709 -0.996956
+-0.16481 -0.986325 -0.661052 0.750341
+0.919268 0.393633 -0.927672 0.373396
+0.832596 -0.553881 -0.549976 -0.83518
+0.815737 -0.578423 0.406271 0.913753
+0.312309 -0.949981 0.940615 0.339475
+-0.99978 -0.0209946 -0.50451 0.863406
+-0.210266 0.977644 -0.692093 0.721808
+-0.999618 -0.0276464 -0.929919 0.367765
+-0.83416 0.551523 -0.294983 -0.955503
+0.163257 0.986584 -0.770518 0.637418
+-0.328465 0.944516 -0.46274 0.886494
+-0.623603 0.781741 -0.208324 -0.97806
+0.836611 0.547798 0.145954 0.989291
+0.77159 0.63612 0.985724 -0.168368
+-0.0271266 -0.999632 -0.90955 -0.415594
+0.986214 -0.165473 -0.609175 0.793036
+-0.0201848 -0.999796 -0.433 -0.901394
+0.108509 0.994095 -0.122979 0.992409
+0.981659 -0.190644 0.945306 -0.326185
+0.547764 0.836633 0.149914 -0.988699
+-0.983013 0.183535 0.924373 0.38149
+-0.826928 -0.562307 -0.999633 -0.0270882
+-0.964586 0.263769 0.0108235 -0.999941
+-0.836651 -0.547736 0.153317 0.988177
+0.901979 -0.43178 0.787386 -0.616461
+-0.613294 -0.789855 -0.998803 0.0489134
+0.073756 -0.997276 0.454384 0.890806
+0.901801 -0.432151 0.761389 -0.648296
+-0.935083 -0.354429 0.101888 -0.994796
+-0.933478 -0.358635 0.524568 -0.851369
+-0.821741 -0.569862 -0.586956 -0.809619
+-0.195472 0.980709 0.679083 0.734062
+-0.716945 -0.697129 -0.168729 0.985663
+-0.999813 -0.0193184 -0.353366 0.935485
+0.407811 0.913066 -0.394859 0.918742
+-0.886168 0.463364 -0.493316 0.86985
+0.999187 0.0403048 -0.629427 -0.777059
+-0.978403 0.206707 -0.389876 -0.920867
+0.89864 -0.438688 0.138844 -0.990314
+-0.855711 0.517454 -0.556812 0.830639
+-0.363665 -0.93153 0.887384 0.461031
+0.119176 0.992873 0.813659 0.581342
+0.129109 -0.99163 0.928412 0.371553
+0.206044 -0.978543 -0.326577 0.945171
+-0.539631 0.841902 0.899923 0.436049
+-0.994768 -0.102162 -0.690022 -0.723788
+0.0412812 -0.999148 -0.550613 -0.834761
+0.852622 0.522527 0.00338457 -0.999994
+-0.00638224 -0.99998 0.803153 -0.595773
+-0.149958 -0.988692 -0.792784 -0.609503
+0.0298728 0.999554 -0.988186 -0.15326
+0.189805 0.981822 0.969694 -0.244323
+-0.431945 0.9019 0.775983 0.630754
+-0.292466 -0.956276 -0.163947 0.986469
+0.378978 -0.925406 0.390105 0.920771
+-0.000182851 1 0.999833 0.0182841
+-0.575952 0.817484 0.115499 -0.993308
+-0.894933 -0.4462 -0.642971 0.765891
+0.431986 0.90188 0.773115 -0.634266
+0.828303 -0.56028 -0.97637 -0.216104
+0.675377 0.737472 0.314774 0.949167
+0.158967 -0.987284 -0.967298 -0.253642
+0.387563 0.921843 -0.504403 -0.863469
+0.0299047 -0.999553 -0.988669 0.150109
+-0.17801 0.984029 0.579088 -0.815265
+-0.683652 0.729809 0.992473 -0.122467
+0.436656 0.899628 0.357153 -0.934046
+-0.217526 0.976054 -0.998003 0.063164
+0.51803 -0.855363 -0.499718 -0.866188
+0.787053 0.616886 -0.87541 -0.48338
+-0.318924 -0.94778 0.503234 -0.86415
+-0.985185 -0.171494 -0.0441023 -0.999027
+-0.518691 0.854962 -0.431276 -0.90222
+-0.981024 0.193888 0.788286 -0.615309
+-0.370806 0.92871 0.958654 0.284574
+-0.439892 -0.898051 0.00529637 -0.999986
+0.995699 -0.0926497 -0.989288 -0.145975
+0.912611 0.408828 -0.290296 -0.956937
+0.0941947 -0.995554 -0.999962 -0.00868086
+-0.0990026 -0.995087 -0.881518 0.472151
+0.267352 -0.963599 -0.353115 0.93558
+0.997923 0.0644127 0.986818 0.161832
+0.958207 -0.286076 -0.739445 0.673217
+0.753588 0.657347 -0.864132 0.503266
+-0.230262 -0.973129 -0.321428 0.946934
+0.0984033 -0.995147 -0.908339 -0.418234
+-0.657485 0.753468 -0.873189 0.487382
+0.928137 0.37224 0.903472 0.428647
+-0.532099 0.846682 0.904357 -0.426777
+-0.963562 -0.267485 -0.365945 0.930636
+0.977337 -0.21169 -0.789491 -0.613762
+-0.983772 0.179422 0.68975 0.724047
+-0.417258 0.908788 0.590027 -0.807384
+0.573924 0.818909 -0.131743 0.991284
+0.149923 0.988698 -0.790622 -0.612305
+-0.819998 -0.572367 -0.316554 -0.948574
+-0.99001 -0.140994 -0.00935097 0.999956
+-0.823996 0.566596 -0.854294 0.51979
+0.737032 -0.675857 0.375838 0.926685
+-0.633456 0.773779 0.870823 -0.491596
+-0.998053 -0.0623704 0.999114 -0.0420804
+-0.875622 -0.482998 0.98993 0.141558
+0.75677 -0.653681 -0.529523 -0.848296
+0.571006 -0.820946 -0.46886 -0.883272
+0.952653 0.30406 0.86745 -0.497525
+0.326466 0.945209 -0.266226 -0.963911
+-0.988432 -0.151665 -0.885743 0.464176
+0.976726 0.214489 -0.930784 0.365569
+-0.0884918 0.996077 -0.845117 0.534581
+-0.244096 0.969751 0.889739 -0.456469
+0.116737 -0.993163 0.647899 -0.761727
+0.93616 0.351574 -0.20172 -0.979443
+-0.306053 0.952014 0.951882 -0.306464
+-0.172261 -0.985051 0.0337218 0.999431
+0.474373 0.880324 0.667233 0.744849
+0.996905 0.0786162 -0.0157607 0.999876
+-0.997222 0.074493 0.387365 -0.921926
+-0.975189 -0.221374 -0.945646 -0.325197
+0.896 0.444054 -0.442833 0.896604
+0.467548 -0.883967 -0.04314 -0.999069
+0.880441 0.474156 0.648695 -0.761048
+0.969695 0.244317 0.899914 -0.436067
+-0.301358 0.953511 0.693617 -0.720344
+-0.798278 0.602289 -0.231711 -0.972785
+0.356458 0.934311 0.313709 0.949519
+-0.987915 -0.154999 -0.989459 0.144814
+0.999316 -0.0369668 -0.84941 0.527734
+-0.221165 -0.975236 -0.952411 0.304817
+0.901859 -0.43203 0.770016 -0.638025
+0.711544 -0.702641 -0.808284 -0.588793
+0.894716 0.446636 -0.679535 0.733643
+-0.927049 0.374939 0.742485 -0.669862
+-0.962418 0.271573 -0.716796 -0.697283
+0.969052 -0.246858 0.982176 0.187966
+-0.221546 0.97515 -0.939793 -0.341745
+-0.999425 -0.033918 -0.9687 -0.248234
+0.549695 0.835366 -0.0802989 -0.996771
+0.366879 -0.930269 0.991045 -0.13353
+-0.968889 -0.247495 0.992397 -0.123075
+-0.880732 0.473615 0.600716 0.799462
+0.812575 0.582856 0.820818 -0.571189
+-0.358908 0.933373 0.549223 -0.835676
+-0.991017 0.133737 0.661851 -0.749635
+-0.803579 0.595199 0.606274 -0.795256
+0.981246 0.192759 0.853721 0.52073
+-0.587844 -0.808975 0.999974 -0.00720146
+-0.847884 0.530182 0.785602 0.618733
+-0.992879 -0.119127 0.810777 -0.585355
+0.394172 0.919037 -0.947964 -0.318378
+-0.995133 0.0985367 -0.902648 0.430379
+-0.569523 0.821975 -0.619787 -0.78477
+-0.0887219 0.996056 -0.857241 0.514916
+-0.989051 -0.147577 -0.624632 0.780919
+-0.612132 -0.790755 -0.995199 -0.0978696
+-0.529089 -0.848567 0.699534 0.714599
+-0.214672 -0.976686 -0.93745 -0.348119
+0.482168 0.876079 0.998882 -0.0472814
+-0.560096 -0.828428 -0.971309 -0.237819
+-0.905022 0.425365 0.998951 0.0458013
+0.81334 0.581789 0.738988 -0.673719
+-0.98062 -0.195917 0.645068 0.764125
+-0.999721 -0.0236352 -0.712424 0.701749
+-0.972142 -0.234394 0.0973889 -0.995246
+0.996972 -0.0777564 0.070429 -0.997517
+-0.974616 0.223885 -0.83163 0.55533
+0.443943 -0.896055 -0.431646 0.902043
+-0.999036 0.0438963 -0.315842 0.948812
+-0.722767 -0.691092 0.620316 0.784352
+-0.670699 -0.74173 -0.30733 0.951603
+0.978819 0.204725 -0.196666 0.980471
+0.963875 0.266354 -0.254426 0.967092
+-0.112672 -0.993632 0.291283 0.956637
+-0.542391 0.840126 0.711342 0.702846
+-0.990838 -0.135055 0.556574 0.830798
+0.681949 0.7314 0.937368 0.348339
+-0.694161 0.71982 0.241294 0.970452
+0.473202 0.880954 0.562543 0.826768
+-0.965989 -0.258585 0.520869 0.853636
+0.774968 -0.632001 0.763695 0.645577
+-0.623106 0.782137 -0.270045 -0.962848
+0.986768 0.162141 -0.837549 -0.546362
+0.0781271 0.996943 0.0333006 -0.999445
+-0.72377 -0.690042 0.727279 0.686342
+-0.952035 -0.30599 0.949825 -0.312783
+0.740514 -0.672041 -0.130956 0.991388
+-0.202608 0.97926 0.0182972 0.999833
+-0.0944811 0.995527 -0.999299 -0.0374333
+0.945813 0.324712 -0.0839351 0.996471
+0.924726 -0.380633 0.220007 -0.975498
+-0.337954 -0.941162 -0.996536 -0.0831636
+0.580353 0.814365 0.609314 0.792929
+-0.981378 0.192087 0.887322 -0.46115
+0.315615 0.948887 0.768316 -0.640071
+-0.373304 -0.927709 0.8485 -0.529195
+-0.963471 0.267814 -0.397512 -0.917597
+-0.520046 -0.854139 -0.283504 0.958971
+-0.997004 -0.0773491 0.111106 0.993809
+0.950786 -0.309849 0.996178 -0.0873481
+-0.214417 0.976742 -0.928033 0.372498
+0.611317 0.791386 -0.979857 -0.199699
+0.994082 -0.108636 -0.110272 0.993901
+-0.46683 0.884347 -0.124125 -0.992267
+0.717468 -0.696591 -0.0943768 -0.995537
+-0.447913 0.894077 -0.777001 0.6295
+0.581988 -0.813197 0.755288 -0.655393
+0.998763 0.0497162 0.258318 -0.96606
+-0.332651 -0.94305 -0.798385 -0.602147
+0.991787 0.127899 0.96674 0.255762
+-0.951938 -0.30629 0.959214 -0.282681
+-0.853802 -0.520597 -0.220991 -0.975276
+-0.718023 0.696019 -0.0148038 -0.99989
+-0.88968 -0.456585 -0.957835 -0.287319
+0.452301 -0.891865 -0.982094 0.188391
+0.999966 -0.00829144 0.6755 -0.73736
+0.707296 0.706918 -0.999644 0.0266912
+-0.264434 -0.964404 -0.0581577 -0.998307
+-0.194482 0.980906 0.749596 0.661895
+-0.770582 0.637341 0.999942 0.0107478
+0.0630484 -0.99801 0.999666 0.0258405
+0.193523 0.981096 0.810594 -0.585608
+0.860263 0.50985 -0.995585 -0.093869
+0.849335 -0.527854 0.588621 0.808409
+-0.378375 -0.925652 0.449205 -0.893429
+-0.212278 0.977209 -0.825006 0.565124
+-0.806755 -0.590886 0.927251 0.374439
+0.612456 0.790505 -0.998372 -0.0570407
+0.945066 -0.326878 -0.308045 -0.951372
+0.758634 0.651517 -0.269098 0.963113
+0.827251 0.561832 -0.999538 0.0303835
+0.116638 0.993174 0.640261 0.768158
+-0.0518357 0.998656 0.45601 -0.889975
+0.88339 0.468638 0.0800227 -0.996793
+-0.932761 -0.360495 0.682745 -0.730657
+0.658464 0.752612 -0.929039 -0.369981
+-0.81468 0.57991 0.565303 0.824883
+-0.836009 0.548715 0.0368022 -0.999323
+0.620233 0.784418 -0.597412 0.801934
+0.817889 0.575377 0.0453707 -0.99897
+-0.899323 0.437284 0.291167 -0.956672
+-0.350164 -0.936688 -0.346355 0.938104
+-0.398776 -0.917048 -0.984298 0.176514
+0.341377 -0.939926 -0.960878 -0.276972
+-0.116144 0.993232 0.601286 -0.799034
+-0.99825 -0.0591277 0.93342 -0.358787
+0.333572 -0.942725 -0.853301 0.521418
+-0.784282 0.620404 -0.579745 0.814798
+0.206949 0.978352 -0.412465 -0.910973
+0.859851 0.510545 -0.984756 -0.173943
+0.208944 -0.977928 -0.588468 0.80852
+0.989453 -0.144853 -0.388787 -0.921328
+-0.334493 0.942398 -0.9001 0.435684
+0.678344 -0.734745 0.661765 -0.749711
+0.763916 -0.645316 0.515961 -0.856612
+0.998897 -0.0469558 -0.015077 0.999886
+0.574002 0.818854 -0.12228 0.992496
+-0.997601 0.0692252 0.799175 -0.601099
+0.648899 0.760874 0.0720864 -0.997398
+0.810136 0.586243 0.9819 -0.1894
+-0.801915 -0.597438 0.36387 0.93145
+0.109319 0.994007 -0.0417489 0.999128
+-0.487749 0.872984 0.774161 0.632989
+0.638203 -0.769868 0.994895 0.100916
+-0.369257 0.929327 0.992583 0.121568
+0.769659 -0.638455 0.991052 -0.133476
+0.999646 -0.026612 -0.886959 -0.461847
+-0.2381 -0.971241 0.460831 0.887488
+-0.293112 0.956078 -0.0969126 -0.995293
+0.640888 0.767634 0.900252 -0.43537
+0.36409 -0.931364 0.907482 -0.420091
+-0.154475 -0.987997 -0.980387 -0.197083
+0.494618 -0.869111 0.0966156 0.995322
+-0.999296 0.037517 -0.819081 0.573678
+-0.981378 -0.192085 0.887446 0.460912
+0.805782 0.592213 0.85339 0.521273
+0.999766 0.0216347 -0.558718 0.829358
+-0.508443 0.861096 -0.997587 0.0694329
+-0.999371 0.0354489 -0.919481 0.393135
+0.185734 0.9826 0.985975 0.166895
+-0.876814 0.48083 0.994456 0.105149
+-0.174146 0.98472 0.223227 -0.974766
+0.326108 0.945333 -0.229569 -0.973292
+-0.159846 -0.987142 -0.940922 0.338624
+0.605387 0.795932 -0.58307 -0.812422
+0.859157 0.511712 -0.952183 -0.305529
+-0.206021 -0.978548 -0.324399 -0.94592
+-0.304259 0.952589 0.877623 -0.479351
+-0.89252 -0.451009 -0.944613 0.328185
+0.610865 -0.791735 -0.966844 0.255367
+-0.804939 0.593357 0.770949 -0.636896
+0.446275 0.894896 -0.649404 -0.760443
+0.853769 0.520652 -0.21478 -0.976662
+-0.125383 -0.992108 0.999987 -0.00505796
+0.973766 0.227551 -0.569349 -0.822096
+-0.799116 0.601176 -0.0944564 -0.995529
+-0.729919 -0.683534 0.990364 -0.138487
+0.979477 0.201557 0.125306 0.992118
+0.774156 0.632994 0.839991 -0.5426
+0.86746 -0.497507 -0.233814 -0.972281
+0.473013 0.881055 0.544746 0.838601
+0.871411 -0.490554 0.534336 -0.845272
+-0.625536 -0.780195 0.0376084 0.999293
+0.999695 0.0246849 -0.782047 0.623219
+-0.852393 0.522902 0.0472506 0.998883
+0.464024 0.885822 -0.427211 0.904152
+0.790918 0.611923 -0.992259 0.124188
+-0.863506 0.504338 -0.854831 -0.518906
+-0.998708 -0.0508212 0.363402 -0.931633
+-0.812112 -0.583501 0.86354 -0.50428
+-0.655945 -0.754809 -0.756239 -0.654296
+0.900117 -0.435648 0.459347 -0.888257
+0.716011 -0.698089 -0.29879 -0.954319
+0.499636 -0.866235 -0.463212 0.886248
+-0.573926 -0.818907 -0.131425 0.991326
+0.989094 0.147283 -0.601094 0.799178
+0.872529 -0.488563 0.711837 -0.702345
+-0.683098 0.730326 0.98035 -0.197268
+-0.44124 0.897389 -0.144448 0.989512
+-0.999095 0.0425338 -0.441911 0.897059
+0.160945 0.986963 -0.897469 0.441077
+-0.1773 -0.984157 0.518855 0.854862
+-0.483935 -0.875104 0.969142 -0.246505
+-0.376455 0.926435 0.623542 0.78179
+-0.95416 0.299298 0.523172 0.852227
+-0.272108 -0.962267 -0.75443 -0.65638
+-0.25612 -0.966645 0.719397 -0.694599
+0.90104 0.433737 0.636154 0.771562
+-0.0725722 -0.997363 0.556672 -0.830732
+0.413604 -0.910457 0.227398 -0.973802
+0.997403 -0.0720244 0.601434 -0.798922
+0.844404 -0.535706 0.999898 0.0142885
+-0.0862094 -0.996277 -0.701621 -0.71255
+-0.680105 -0.733115 0.820976 0.570963
+0.857371 -0.514699 -0.790872 0.611981
+0.594439 0.804141 0.678602 -0.734506
+0.333825 -0.942635 -0.866967 0.498366
+0.993066 0.11756 0.708749 -0.705461
+-0.918861 -0.394582 -0.96123 0.275748
+-0.381299 0.924452 0.149237 0.988801
+-0.737884 -0.674927 0.256283 -0.966602
+0.304888 0.952388 0.90734 0.420397
+0.059522 0.998227 0.946861 0.321642
+-0.999493 0.031853 -0.999021 0.0442357
+0.977325 0.211743 -0.792867 0.609395
+0.783294 -0.621652 -0.443294 0.896376
+-0.993284 -0.115702 0.565154 -0.824986
+0.956194 -0.292732 -0.136386 0.990656
+-0.0810578 0.996709 -0.257756 0.96621
+0.542107 -0.84031 0.734698 0.678394
+-0.942878 0.333138 -0.828406 -0.560128
+-0.996762 0.0804139 -0.194845 -0.980834
+-0.923112 -0.384531 -0.198732 0.980054
+0.747822 0.663899 -0.940917 -0.338637
+0.300737 -0.953707 0.645312 -0.763919
+0.995886 0.0906182 -0.939199 0.343373
+0.43536 -0.900257 0.487581 0.873078
+-0.998921 -0.0464429 -0.0663822 -0.997794
+0.858028 0.513603 -0.862408 -0.506213
+-0.929478 -0.368878 0.996717 0.0809685
+-0.455442 0.890265 -0.986749 -0.162253
+0.892792 0.45047 -0.923107 0.384544
+-0.982465 0.186445 0.995458 0.0952016
+0.926214 0.376997 0.576711 0.816948
+-0.276945 -0.960886 -0.977409 -0.211358
+-0.746375 0.665526 -0.845542 0.53391
+0.247419 0.968909 0.991411 0.130785
+-0.998216 -0.0597088 0.952714 -0.303867
+-0.819439 0.573167 -0.222624 0.974904
+0.15497 -0.987919 -0.989037 0.147665
+0.435817 -0.900035 0.442644 0.896697
+0.991497 0.13013 0.88529 0.465039
+0.988131 -0.153612 -0.959471 -0.281807
+0.92438 0.381472 0.130707 0.991421
+-0.995139 -0.0984822 -0.904995 -0.425423
+0.998252 0.0591012 0.932464 -0.361262
+0.961204 -0.275838 -0.946628 -0.322328
+0.977061 0.212961 -0.862429 0.506178
+0.971824 -0.235708 0.230711 0.973022
+0.197017 0.9804 0.555435 -0.83156
+0.708624 -0.705586 -0.977013 -0.213178
+-0.837788 0.545996 0.353895 -0.935285
+-0.275217 -0.961382 -0.923846 -0.382765
+-0.925459 0.378847 0.403089 -0.915161
+-0.989002 -0.147899 -0.649708 0.760184
+-0.999645 -0.026647 -0.88857 0.458741
+-0.955982 0.293425 -0.0643399 0.997928
+-0.563719 0.825967 -0.980485 -0.196595
+0.997329 0.0730446 0.516715 0.856158
+-0.970963 -0.239228 0.560651 -0.828052
+0.828645 -0.559774 -0.961348 -0.275338
+-0.519254 0.85462 -0.370954 -0.928651
+-0.759103 -0.650971 -0.199119 0.979975
+-0.709748 0.704455 -0.930769 -0.365609
+-0.80313 0.595804 0.544727 -0.838613
+-0.415279 0.909694 0.401747 -0.915751
+0.0609048 -0.998144 0.982206 -0.187809
+-0.775989 -0.630746 0.649727 -0.760168
+0.468855 -0.883275 0.104484 -0.994527
+0.522195 0.852826 -0.0355664 0.999367
+-0.743382 0.668867 -0.530354 0.847776
+-0.590644 -0.806932 0.938038 -0.346532
+0.406776 0.913528 -0.496232 0.86819
+-0.631813 0.775121 0.747769 -0.66396
+-0.238158 -0.971226 0.466167 0.884697
+-0.314833 -0.949147 0.818435 -0.574599
+-0.676519 0.736425 0.457404 -0.889259
+-0.49682 -0.867854 -0.156124 -0.987737
+-0.10548 -0.994421 -0.414992 0.909825
+-0.483875 0.875137 0.970797 0.239902
+0.752962 -0.658064 -0.908079 -0.418798
+-0.776395 -0.630246 0.599408 -0.800444
+-0.0724363 -0.997373 0.567937 -0.823072
+-0.839879 -0.542773 0.678625 0.734485
+0.957289 0.289132 -0.49092 -0.871205
+-0.0758709 0.997118 0.256692 0.966493
+0.825118 0.564961 -0.939944 -0.341328
+-0.99999 0.00448759 0.900986 -0.433849
+-0.780816 -0.624761 -0.0616757 -0.998096
+0.781646 0.623722 -0.193452 -0.98111
+0.972027 0.234869 0.145889 -0.989301
+-0.996745 -0.0806245 -0.215522 0.976499
+-0.938918 0.34414 -0.839347 0.543595
+-0.584975 -0.811051 0.940441 0.339957
+0.764234 -0.644939 0.557617 -0.830098
+0.549034 -0.8358 -0.00134922 0.999999
+0.980736 -0.195337 0.689135 -0.724633
+-0.597196 -0.802095 0.391795 -0.920053
+-0.953222 0.30227 0.75929 0.650752
+0.287287 -0.957845 -0.648664 -0.761075
+0.372195 -0.928155 0.905536 0.42427
+0.506429 -0.862282 -0.954385 0.298579
+-0.9426 0.333925 -0.872208 -0.489135
+0.999295 -0.037541 -0.817703 0.575641
+0.348404 0.937344 -0.515414 0.856941
+0.548804 0.835951 0.0261416 -0.999658
+-0.350243 -0.936659 -0.338474 0.940976
+-0.925986 -0.377557 0.52629 0.850305
+0.452826 -0.891599 -0.991481 0.13025
+-0.89449 0.447087 -0.715659 -0.69845
+0.778476 -0.627674 0.306931 0.951732
+-0.245768 -0.969329 0.954892 0.296953
+0.976253 0.216632 -0.988041 0.154189
+-0.682415 -0.730965 0.957661 0.287898
+-0.31971 0.947515 0.429906 0.902874
+0.871922 0.489646 0.619379 0.785092
+0.780633 -0.62499 -0.0324269 0.999474
+-0.799108 0.601188 -0.095911 -0.99539
+-0.87411 -0.485728 0.898663 0.43864
+-1 0.000292825 0.999571 -0.0292783
+-0.999594 -0.0285047 -0.958033 0.286659
+-0.735576 -0.677442 0.565052 -0.825055
+0.996768 0.0803326 -0.186839 0.982391
+0.948347 -0.317236 0.648296 -0.761389
+-0.119146 0.992877 0.811881 -0.583823
+0.813574 -0.581462 0.711296 0.702893
+0.255529 -0.966802 0.760513 0.649322
+0.0770946 0.997024 0.136438 -0.990649
+-0.952251 -0.305317 0.92538 -0.37904
+0.04866 0.998815 0.154903 0.98793
+0.977142 0.212587 -0.84246 0.538759
+-0.637805 0.770198 0.99878 0.0493768
+0.885903 0.463871 -0.442813 -0.896614
+-0.992042 0.125907 0.998326 -0.0578336
+-0.608441 0.793599 -0.845129 0.534563
+-0.126154 0.992011 0.996578 0.0826632
+-0.649689 -0.7602 -0.031716 -0.999497
+0.956434 0.291949 -0.216957 -0.976181
+0.491358 -0.870958 0.4542 0.8909
+-0.97199 0.235024 0.16163 0.986851
+-0.986048 0.166464 -0.526546 0.850147
+-0.164168 -0.986432 -0.70849 0.705721
+0.4667 0.884416 -0.138709 0.990333
+-0.998694 -0.0510989 0.389166 -0.921168
+-0.609017 0.793157 -0.881668 0.471869
+-0.987206 0.159448 -0.953778 0.300513
+-0.845762 -0.53356 0.964243 -0.26502
+0.0202963 0.999794 -0.443032 -0.896506
+0.693025 -0.720913 0.390605 0.920558
+0.480124 0.877201 0.982778 0.184791
+-0.0205891 -0.999788 -0.46909 -0.88315
+-0.713293 0.700866 -0.638099 -0.769954
+0.241084 -0.970504 0.707783 -0.70643
+0.059793 -0.998211 0.955243 -0.295823
+-0.454109 0.890946 -0.999911 -0.0133165
+0.934867 0.354998 0.162205 -0.986757
+-0.531775 -0.846886 0.887392 0.461016
+0.74533 0.666696 -0.751799 -0.659392
+-0.281869 0.959453 -0.955399 -0.295319
+0.247814 0.968808 0.995918 0.0902576
+-0.629638 0.776889 0.534977 -0.844867
+-0.479393 0.8776 0.963991 -0.265935
+-0.904231 -0.427044 0.990247 0.139323
+-0.918174 0.396177 -0.994414 -0.10555
+0.365082 -0.930975 0.946998 -0.321241
+0.889073 -0.457766 -0.911363 0.411604
+-0.27718 -0.960818 -0.982285 -0.187391
+-0.944917 0.32731 -0.351114 -0.936333
+0.983984 -0.178259 0.599527 0.800355
+-0.973027 -0.230693 -0.279208 -0.960231
+0.841524 -0.540219 0.867271 -0.497837
+-0.940581 0.339569 -0.996097 0.0882619
+-0.0678236 0.997697 0.875471 0.483271
+0.870518 0.492137 0.372726 0.927941
+0.956704 -0.291063 -0.306343 0.951921
+-0.750025 -0.661409 -0.999916 -0.0129763
+-0.937851 -0.347038 -0.634357 -0.773041
+-0.964444 -0.264289 -0.043111 0.99907
+0.64605 -0.763295 0.431361 0.902179
+-0.900139 0.435603 0.463846 -0.885916
+-0.231218 -0.972902 -0.226988 0.973898
+-0.776435 -0.630198 0.594413 -0.80416
+0.336764 -0.941589 -0.978094 0.208162
+-0.999948 -0.0101532 0.527332 0.849659
+-0.675495 0.737364 0.329919 -0.944009
+0.685977 0.727623 0.980779 -0.195119
+-0.931214 -0.364472 0.923943 -0.382529
+0.983675 0.179955 0.727971 -0.685608
+0.0261766 0.999657 -0.866009 -0.500028
+0.612174 -0.790723 -0.995702 0.0926097
+0.0694265 0.997587 0.786881 -0.617105
+-0.793104 -0.609086 -0.885752 0.464159
+0.400467 0.916311 -0.93522 0.354067
+0.363236 -0.931697 0.865183 -0.501456
+0.969514 0.245037 0.929796 -0.368076
+0.999266 -0.0382961 -0.77191 0.635731
+-0.103557 -0.994624 -0.582094 0.813121
+-0.0332941 -0.999446 -0.982299 0.18732
+-0.931689 0.363256 0.866285 0.49955
+-0.279199 -0.960233 -0.999767 0.021606
+-0.198169 0.980168 0.454136 0.890932
+-0.587801 0.809005 0.999998 0.00197627
+0.588675 0.80837 0.993958 -0.109763
+-0.96447 -0.264191 -0.0329783 0.999456
+-0.909833 0.414974 0.370892 0.928676
+0.798474 0.602029 -0.200007 0.979795
+0.548639 0.83606 0.0459445 -0.998944
+0.9973 -0.0734371 0.482627 -0.875826
+-0.610973 -0.791651 -0.970261 -0.24206
+0.992608 0.121363 0.921045 -0.389456
+-0.865719 0.50053 -0.552044 -0.833815
+-0.628931 0.777461 0.455979 -0.88999
+-0.694213 -0.71977 0.234296 -0.972165
+0.17975 0.983712 0.71352 0.700635
+0.636792 -0.771036 0.996641 -0.0818937
+0.99967 -0.025686 -0.840434 -0.541914
+-0.592467 0.805595 0.836513 0.547946
+-0.874011 0.485906 0.889513 -0.45691
+0.987973 0.154629 -0.983352 0.181711
+-0.820828 -0.571176 -0.45044 -0.892807
+-0.150829 0.98856 -0.843376 0.537324
+-0.0856648 0.996324 -0.661646 0.749816
+0.303106 0.952957 0.813383 0.581729
+-0.966231 0.257679 0.598493 -0.801128
+0.897156 0.441714 -0.196445 0.980515
+0.060356 0.998177 0.9704 0.241503
+-0.955654 0.294493 0.0473192 0.99888
+0.346433 -0.938075 -0.682928 -0.730486
+0.995614 -0.093556 -0.998461 -0.0554526
+0.783396 -0.621523 -0.457999 0.888953
+-0.997494 -0.070747 0.698551 0.71556
+-0.105599 0.994409 -0.404033 -0.914744
+0.042334 0.999104 -0.459754 0.888046
+-0.53001 -0.847991 0.772872 0.634561
+0.364561 -0.931179 0.927571 -0.373647
+-0.453119 -0.89145 -0.995226 -0.0975943
+0.0873165 -0.996181 -0.776319 0.63034
+0.978534 -0.206086 -0.330635 -0.943759
+-0.517361 -0.855767 -0.565798 0.824544
+-0.841976 0.539516 0.905813 -0.423678
+0.996312 -0.0858043 -0.672082 -0.740477
+0.876227 0.481899 0.999862 0.0165862
+0.110092 -0.993921 0.0359625 -0.999353
+-0.753412 -0.657549 -0.877332 0.479884
+-0.316548 0.948577 0.701801 0.712373
+-0.696243 -0.717806 -0.0459994 -0.998941
+-0.770053 -0.63798 0.997395 0.0721277
+-0.576624 -0.81701 0.196724 0.980459
+0.957311 0.289061 -0.497344 -0.867554
+-0.662141 -0.74938 -0.993897 0.11031
+0.00665269 0.999978 0.786748 -0.617275
+-0.430145 0.90276 0.885605 0.464439
+0.803347 -0.595511 0.574896 -0.818227
+-0.950919 0.309439 0.999014 -0.0444067
+0.182997 -0.983114 0.902104 -0.431519
+0.983773 -0.179417 0.689348 0.724431
+-0.366269 -0.930509 0.980167 0.198172
+0.114638 0.993407 0.473723 0.880674
+0.172505 -0.985009 0.0584119 -0.998293
+-0.451717 -0.892161 -0.96767 -0.25222
+0.707232 0.706981 -0.999842 0.01777
+-0.241759 0.970336 0.755142 -0.655561
+0.934874 -0.35498 0.160253 0.987076
+-0.676407 0.736528 0.443902 -0.896076
+0.950972 -0.309278 0.999622 -0.0274809
+0.0102689 -0.999947 0.517464 0.855705
+0.963071 0.269248 -0.529234 0.848476
+-0.225062 -0.974345 -0.758704 0.651436
+-0.196027 -0.980599 0.636487 -0.771288
+-0.267842 -0.963463 -0.400165 -0.916443
+0.71517 0.69895 -0.411244 0.911525
+-0.279443 -0.960162 -0.998892 0.0470652
+0.229602 -0.973285 -0.38491 -0.922954
+0.773436 -0.633875 0.896146 0.443759
+-0.420818 0.907145 0.853774 -0.520644
+0.850555 0.525886 0.387357 -0.92193
+-0.993498 -0.113846 0.402067 -0.91561
+0.902793 -0.430076 0.889103 -0.457707
+-0.0607969 -0.99815 0.980117 0.198422
+-0.918178 -0.396168 -0.994306 0.106558
+-0.920066 -0.391764 -0.833187 0.552992
+0.997724 -0.0674359 0.893586 -0.448893
+0.752594 -0.658485 -0.930053 -0.367426
+-0.972432 0.233187 -0.0265229 0.999648
+-0.927887 0.372861 0.87277 -0.488132
+-0.509643 -0.860386 -0.997555 0.069879
+-0.914815 0.403874 -0.742459 0.669891
+0.686807 0.72684 0.952195 -0.305492
+0.796289 -0.604916 -0.534106 -0.845418
+0.240009 0.970771 0.625379 0.780321
+0.338216 -0.941069 -0.998461 0.0554524
+0.990826 0.135145 0.549044 0.835793
+-0.999998 -0.00180253 0.983798 0.179279
+-0.0178713 -0.99984 -0.214743 -0.976671
+-0.76974 0.638358 0.992656 -0.120975
+-0.951527 0.307564 0.988353 0.152175
+-0.999971 0.00760306 0.72462 -0.689149
+-0.913191 0.407533 -0.422703 0.906268
+0.513825 0.857895 -0.849 0.528393
+0.203476 0.97908 -0.0703212 -0.997524
+0.637233 0.770671 0.999694 0.0247253
+-0.232153 0.972679 -0.132497 -0.991183
+0.883215 -0.468968 0.117192 0.993109
+0.896392 -0.443262 -0.361972 -0.932189
+0.437001 0.899461 0.32111 -0.947042
+0.0537486 0.998554 0.617112 0.786875
+0.995536 0.0943809 -0.999625 -0.0273766
+-0.33176 -0.943364 -0.738014 -0.674786
+0.477978 0.878372 0.908835 0.417156
+0.0336808 -0.999433 -0.974317 -0.22518
+-0.0691158 0.997609 0.805716 0.592302
+-0.0956577 -0.995414 -0.987913 0.155009
+-0.0337935 -0.999429 -0.971717 0.236147
+0.604894 0.796306 -0.531731 -0.846913
+0.325139 0.945666 -0.128752 -0.991677
+0.404005 0.914757 -0.732815 0.680428
+0.37685 -0.926274 0.589613 0.807686
+-0.679372 -0.733794 0.759909 0.65003
+-0.387409 0.921908 -0.489918 0.871769
+-0.260237 -0.965545 0.367917 -0.929859
+0.54929 -0.835632 -0.032001 0.999488
+0.736551 0.676382 0.440822 -0.897595
+-0.127361 -0.991856 0.979172 -0.203031
+-0.550796 0.83464 -0.21067 0.977557
+0.663111 -0.748521 -0.971318 -0.237786
+0.731194 0.682169 0.947419 -0.319996
+0.267392 -0.963588 -0.356976 0.934113
+-0.657401 0.753541 -0.867706 0.497078
+-0.945726 -0.324965 -0.110474 0.993879
+0.96405 -0.265721 -0.190506 -0.981686
+-0.871543 -0.49032 0.556866 0.830603
+-0.352208 -0.935922 -0.135014 0.990844
+0.0346546 0.999399 -0.947789 0.318897
+-0.999704 -0.0243328 -0.759619 0.650368
+-0.730575 -0.682832 0.972525 -0.232799
+-0.883777 0.467909 -0.00233603 0.999997
+-0.0294351 -0.999567 -0.980529 -0.196375
+-0.662867 -0.748737 -0.978534 0.206087
+0.73461 0.678489 0.676508 -0.736436
+0.863922 -0.503626 -0.809219 -0.587506
+-0.770638 0.637273 0.999809 0.0195517
+-0.72764 0.685959 0.981265 -0.192661
+-0.583957 -0.811784 0.890507 0.454969
+0.662952 0.748662 -0.976149 0.217103
+-0.986379 -0.164491 -0.684936 -0.728603
+0.57781 -0.816171 0.336528 -0.941674
+-0.417008 0.908903 0.567614 -0.823295
+-0.524081 0.851668 0.184635 -0.982807
+-0.99145 0.13049 0.867846 -0.496833
+-0.676372 -0.73656 0.439639 0.898175
+0.958709 0.284388 -0.845942 -0.533275
+-0.435552 0.900164 0.468807 0.883301
+1.31802e-05 -1 0.999999 0.00131802
+0.15997 -0.987122 -0.936594 -0.350415
+-0.511412 -0.859335 -0.96224 0.272201
+-0.748512 -0.663121 -0.971003 -0.239066
+0.790353 -0.612652 -0.999479 -0.0322836
+-0.964793 0.263011 0.0892302 -0.996011
+0.991761 -0.128099 0.96138 -0.275226
+-0.946548 0.322564 0.142502 -0.989794
+-0.860221 0.509922 -0.994769 0.10215
+-0.927172 -0.374637 0.763963 0.64526
+0.635276 0.772285 0.961492 0.274834
+-0.539426 -0.842033 0.910256 -0.414045
+0.917781 0.397086 -0.999978 0.00670569
+0.0632243 -0.997999 0.999056 0.0434485
+0.870727 0.491766 0.411918 0.911221
+0.369899 -0.929072 0.981824 0.189796
+-0.789148 0.614203 -0.986564 0.163377
+0.305987 0.952036 0.949721 0.313097
+-0.148341 -0.988936 -0.683005 -0.730414
+0.216732 -0.976231 -0.989569 0.144057
+-0.875706 -0.482845 0.99225 0.124258
+-0.716178 0.697917 -0.275905 -0.961185
+0.87455 -0.484935 0.934692 -0.355459
+0.784354 0.620314 -0.589094 -0.808065
+0.155805 0.987788 -0.997972 -0.0636525
+0.0760643 0.997103 0.237896 -0.971291
+-0.939367 0.342914 -0.902939 0.429769
+-0.28337 -0.959011 -0.897711 0.440585
+0.682978 -0.730439 0.976977 -0.213344
+-0.9981 0.0616105 0.993019 0.117956
+0.986689 0.16262 -0.810022 -0.586399
+-0.73043 -0.682988 0.977257 -0.212057
+-0.0988485 0.995102 -0.888723 -0.458445
+-0.364859 -0.931063 0.939055 0.343768
+0.0938323 0.995588 -0.999616 -0.0277205
+0.531526 0.847042 0.873459 0.486898
+0.596894 0.80232 0.426188 -0.904634
+0.220593 0.975366 -0.968639 0.248471
+-0.77634 -0.630314 0.606399 -0.795161
+-0.922581 -0.385803 -0.331551 0.943437
+0.16088 -0.986974 -0.900333 -0.435202
+-0.00640851 -0.999979 0.801584 -0.597882
+0.172805 0.984956 0.0888295 0.996047
+0.539567 -0.841943 0.903231 0.429155
+-0.998384 -0.0568273 0.826804 -0.562489
+-0.333902 0.942608 -0.871028 0.491233
+-0.58264 -0.81273 0.805361 0.592784
+0.822776 -0.568365 -0.723797 0.690013
+-0.999566 -0.0294611 -0.981038 0.193817
+-0.717309 0.696755 -0.117088 -0.993122
+-0.376534 -0.926403 0.616847 -0.787083
+0.861101 0.508435 -0.997518 0.070414
+0.0274436 -0.999623 -0.922268 0.38655
+-0.778543 -0.627591 0.296785 -0.954944
+0.360018 0.932945 0.644531 0.764579
+0.991692 -0.128638 0.945003 -0.327061
+0.566554 -0.824025 -0.856924 -0.515443
+-0.658109 -0.752922 -0.910564 -0.413369
+-0.404381 -0.914591 -0.704241 0.709961
+-0.214955 -0.976624 -0.947162 -0.320755
+0.703247 0.710946 -0.855448 -0.517889
+-0.250267 -0.968177 0.986771 -0.162118
+-0.510012 0.860167 -0.993639 -0.112608
+-0.776979 0.629527 0.522832 0.852436
+-0.810121 0.586263 0.982363 0.186982
+-0.904228 -0.427051 0.990136 0.140109
+-0.94622 -0.323523 0.0416232 0.999133
+-0.953927 -0.30004 0.587823 -0.80899
+0.217064 -0.976157 -0.993898 0.110304
+0.530667 0.84758 0.819712 0.572776
+0.764318 0.64484 0.568338 0.822795
+-0.92852 -0.371281 0.942844 0.333236
+0.844162 -0.536088 0.999521 -0.0309623
+-0.503061 0.864251 -0.769057 0.63918
+-0.813596 0.58143 0.708596 0.705615
+-0.873262 0.48725 0.808992 -0.58782
+-0.646677 -0.762764 0.355885 -0.93453
+0.94658 0.32247 0.152399 0.988319
+-0.441563 0.89723 -0.179943 0.983677
+0.623924 0.781485 -0.168008 0.985786
+-0.903673 0.428224 0.963677 -0.26707
+0.99746 0.0712281 0.663239 0.748408
+0.139928 0.990162 0.0981782 -0.995169
+0.403263 0.915084 -0.785533 0.61882
+-0.731863 -0.681452 0.911527 -0.411239
+-0.87339 0.487021 0.824164 -0.566352
+0.517627 0.855606 -0.539938 0.841705
+-0.976173 0.216994 -0.99308 -0.117439
+0.941475 0.337082 -0.984566 0.175016
+0.573211 -0.819407 -0.217331 -0.976098
+0.421756 0.90671 0.902939 0.429769
+0.422442 0.90639 0.932883 0.360178
+-0.936787 -0.3499 -0.372699 -0.927952
+-0.995022 -0.099653 -0.8488 -0.528714
+-0.898826 -0.438307 0.180712 0.983536
+0.964044 -0.265742 -0.192615 -0.981274
+0.85717 0.515034 -0.76635 -0.642424
+0.708684 0.705526 -0.975162 0.221493
+-0.999361 -0.0357537 -0.907065 -0.420992
+0.688815 -0.724937 0.832536 0.553972
+-0.221914 0.975066 -0.926218 -0.376988
+-0.740774 -0.671755 -0.16913 -0.985594
+-0.908735 0.417375 0.600348 0.799739
+0.33539 0.942079 -0.937446 -0.34813
+0.953219 -0.302281 0.760042 0.649874
+0.496669 -0.86794 -0.138904 0.990306
+-0.751912 -0.659263 -0.963024 0.269416
+-0.846994 -0.531603 0.877814 -0.479002
+0.750021 -0.661414 -0.999907 0.01364
+0.923528 -0.383532 -0.0917287 -0.995784
+-0.113021 -0.993593 0.324714 0.945812
+-0.39454 0.918879 -0.959944 0.28019
+0.9485 -0.316777 0.684415 -0.729093
+0.968003 -0.25094 0.973123 -0.230287
+-0.999955 0.00951218 0.58068 -0.814132
+-0.91004 -0.41452 0.324031 -0.946047
+-0.723231 0.690606 0.671589 -0.740924
+-0.525742 -0.850644 0.371727 0.928342
+0.978305 0.207169 -0.432891 0.901446
+-0.913695 0.4064 -0.531549 0.847027
+-0.998385 -0.0568018 0.825365 -0.564599
+0.224763 0.974413 -0.778288 0.627907
+-0.754341 -0.656483 -0.800955 0.598725
+0.9154 0.402546 -0.831534 -0.555474
+-0.126541 -0.991961 0.992594 -0.121476
+0.39028 0.920696 -0.73361 -0.679571
+0.989459 0.144812 -0.384906 0.922956
+0.402426 -0.915452 -0.838713 -0.544573
+-0.37299 0.927835 0.865909 0.500202
+-0.983649 -0.180096 0.737691 -0.675138
+-0.386448 -0.922311 -0.396581 -0.918
+-0.821929 -0.56959 -0.61345 -0.789734
+0.607681 0.794181 -0.790178 -0.612878
+0.736128 0.676843 0.496074 -0.86828
+0.260931 -0.965357 0.300147 0.953893
+0.819319 0.573338 -0.202275 -0.979329
+0.953071 -0.302748 0.790957 0.611872
+-0.832622 0.553842 -0.546042 -0.837758
+-0.389171 -0.921166 -0.646661 -0.762778
+0.514581 -0.857442 -0.799229 -0.601027
+-0.556534 0.830825 -0.784138 0.620587
+-0.871279 0.490788 0.511464 -0.859305
+0.584863 0.811132 0.935617 0.353015
+-0.264686 0.964335 -0.0842097 0.996448
+-0.720242 0.693723 0.29983 -0.953992
+-0.592552 -0.805532 0.830696 -0.556727
+0.640611 -0.767866 0.9154 0.402546
+0.0418124 -0.999125 -0.505473 -0.862842
+-0.373692 0.927553 0.825625 0.56422
+0.785791 -0.618492 -0.759142 0.650925
+0.367841 0.929889 0.999535 0.030493
+0.425775 -0.904829 1 -0.000459514
+0.779284 0.626671 0.18211 -0.983278
+0.332979 -0.942934 -0.818839 0.574023
+0.75399 -0.656886 -0.831789 -0.555092
+0.523022 -0.852319 0.0613174 -0.998118
+0.998111 -0.0614355 0.990798 0.13535
+0.841167 -0.540776 0.832486 -0.554046
+-0.56978 -0.821797 -0.594976 0.803743
+-0.315283 0.948998 0.790238 0.6128
+-0.924805 0.380443 0.24006 -0.970758
+-0.537763 0.843096 0.973792 0.227438
+0.79968 -0.600427 -0.000822506 -1
+-0.864127 -0.503275 -0.784646 0.619944
+-0.966506 0.256646 0.680553 -0.732699
+-0.370965 -0.928647 0.953646 -0.300931
+-0.419449 -0.907779 0.765843 0.643027
+-0.843449 0.53721 0.986606 -0.163121
+0.823197 0.567756 -0.772839 -0.634603
+-0.672977 0.739663 -0.00475455 -0.999989
+0.0266035 0.999646 -0.886565 -0.462605
+-0.929843 0.367957 0.999838 0.0180027
+0.223333 -0.974742 -0.861727 -0.507373
+-0.795286 0.606235 -0.666179 -0.745792
+-0.108717 -0.994073 -0.102135 0.994771
+0.515347 0.856982 -0.742402 0.669955
+0.95959 0.281403 -0.968594 -0.248647
+-0.83296 -0.553333 -0.493935 0.869499
+0.87778 -0.479064 0.95333 0.301931
+-0.619607 0.784912 -0.659404 -0.751789
+-0.996765 0.080375 -0.191012 -0.981588
+0.768359 0.640019 0.94368 0.33086
+0.446398 0.894835 -0.659749 -0.751486
+-0.827131 -0.562008 -0.999959 0.0090606
+0.859343 -0.5114 -0.962643 0.270772
+0.924384 0.381463 0.131629 0.991299
+-0.911618 0.411038 -0.0522713 0.998633
+0.826302 -0.563228 -0.990434 0.137987
+0.983847 -0.17901 0.658805 0.752314
+0.857212 0.514964 -0.771545 -0.636175
+0.273983 0.961735 -0.867237 -0.497896
+-0.841764 0.539846 0.888467 -0.45894
+-0.895141 0.445783 -0.606633 -0.794982
+0.79655 0.604573 -0.497182 0.867646
+0.999081 -0.0428575 -0.412616 0.910905
+0.75075 -0.660586 -0.995328 -0.0965478
+0.265943 -0.963989 -0.213034 0.977045
+-0.457969 -0.888968 -0.901736 0.432287
+-0.278346 0.960481 -0.997746 0.067105
+0.766234 -0.642562 0.784676 -0.619906
+0.96574 0.259513 0.43657 0.89967
+-0.967546 -0.252696 0.915609 0.402069
+-0.476042 0.879422 0.795708 -0.60568
+0.46864 -0.883389 0.0802647 -0.996774
+0.922668 -0.385594 -0.310099 -0.950704
+0.925964 0.377612 0.521243 0.853408
+0.998561 -0.0536361 0.608205 0.79378
+0.993891 -0.110371 0.0639707 0.997952
+-0.562346 -0.826902 -0.999498 0.031692
+0.850822 -0.525455 0.340153 0.94037
+-0.529191 0.848503 0.708066 -0.706146
+0.626988 0.779029 0.222025 0.975041
+0.990038 0.140804 0.00986461 0.999951
+-0.995499 -0.0947681 -0.997805 -0.0662225
+-0.0807812 -0.996732 -0.23085 -0.972989
+0.922789 -0.385306 -0.280255 -0.959926
+-0.884073 -0.467349 -0.0656939 -0.99784
+0.483336 0.875435 0.983726 -0.179675
+0.545487 -0.838119 0.410031 0.912072
+-0.953453 -0.301542 0.707409 -0.706804
+-0.0364966 0.999334 -0.873293 -0.487195
+0.955502 0.294983 0.0985222 -0.995135
+0.965368 -0.260891 0.30413 -0.952631
+-0.412817 -0.910814 0.142458 0.989801
+0.582766 0.81264 0.814442 0.580246
+0.9533 -0.302025 0.742267 0.670104
+-0.911593 -0.411093 -0.0462298 -0.998931
+0.938358 -0.345664 -0.740429 0.672134
+-0.705072 -0.709136 -0.959007 -0.283384
+0.648585 -0.761142 0.113159 0.993577
+0.496892 -0.867812 -0.164336 0.986404
+-0.496887 -0.867816 -0.163721 -0.986507
+-0.819873 0.572545 -0.295877 0.955226
+0.526632 0.850093 0.466681 0.884425
+-0.99948 0.0322514 -0.996465 0.0840117
+-0.535701 0.844408 0.999889 -0.0149235
+0.166637 0.986018 -0.511522 0.85927
+-0.996311 0.0858132 -0.672742 -0.739877
+-0.43923 0.898375 0.0788569 0.996886
+0.721633 -0.692276 0.484033 -0.87505
+-0.802592 0.596528 0.466923 -0.884298
+-0.529837 -0.848099 0.759783 0.650177
+0.991758 0.128124 0.960677 0.277669
+-0.87859 0.477578 0.888861 0.458178
+0.44708 0.894494 -0.715059 -0.699064
+0.0475901 -0.998867 0.0483965 -0.998828
+-0.626739 0.779229 0.190708 -0.981647
+0.0227895 -0.99974 -0.650579 0.759438
+0.897445 -0.441126 -0.131856 -0.991269
+0.311209 0.950341 0.973528 -0.228566
+-0.323192 0.946333 0.0765484 0.997066
+0.408079 0.912947 -0.367792 0.929908
+0.0170264 0.999855 -0.13154 -0.991311
+-0.0651098 0.997878 0.973116 0.230315
+0.663063 -0.748564 -0.972819 -0.231568
+-0.8026 0.596518 0.468072 -0.88369
+0.239315 0.970942 0.567977 0.823044
+-0.912173 0.409805 -0.186347 0.982484
+-0.546932 0.837177 0.247384 0.968918
+0.519795 -0.854291 -0.311456 -0.950261
+-0.279702 0.960087 -0.99726 -0.0739733
+0.454747 0.890621 -0.996399 0.0847924
+-0.999646 -0.0266009 -0.886446 0.462832
+-0.320373 -0.947292 0.365728 -0.930722
+-0.517626 0.855607 -0.539993 -0.841669
+0.999984 -0.00565295 0.844429 -0.535667
+0.971524 0.236939 0.351797 -0.936076
+-0.9299 -0.367813 0.99944 -0.0334683
+-0.99581 0.091444 -0.964411 -0.264408
+-0.639583 0.768722 0.960903 0.276886
+-0.925675 0.37832 0.454475 -0.89076
+0.744681 -0.667421 -0.684122 0.729368
+0.990828 0.135133 0.550053 0.83513
+-0.966517 0.256601 0.683939 -0.729539
+-0.335523 0.942032 -0.942269 0.334857
+0.322104 0.946704 0.19049 -0.981689
+0.210314 0.977634 -0.695584 -0.718445
+-0.523773 -0.851858 0.149013 0.988835
+0.953799 -0.300445 0.621603 0.783332
+0.620005 0.784598 -0.620456 0.784242
+0.646552 -0.76287 0.371083 0.9286
+-0.0239395 0.999713 -0.733451 0.679743
+-0.463285 0.886209 -0.501074 -0.865405
+0.773767 0.63347 0.871719 -0.490006
+-0.996033 -0.0889798 -0.870288 0.492543
+0.356197 0.934411 0.287054 0.957914
+-0.998902 -0.0468568 -0.024986 -0.999688
+-0.151971 -0.988385 -0.899689 -0.436532
+-0.70784 -0.706373 -0.994627 0.103522
+0.585558 -0.81063 0.962434 -0.271516
+-0.923362 -0.38393 -0.134605 0.990899
+0.876164 -0.482014 0.99956 -0.0296619
+0.988245 0.152879 -0.935945 0.352146
+0.912822 0.408357 -0.339299 -0.940678
+-0.737307 -0.675558 0.33796 -0.941161
+-0.642346 0.766415 0.801794 0.5976
+0.915116 0.40319 -0.790405 -0.612585
+-0.556245 -0.831018 -0.762105 -0.647454
+0.879215 -0.476425 0.821346 0.570431
+-0.948151 -0.317819 0.600303 0.799773
+0.994587 0.103908 -0.553038 -0.833156
+-0.633625 0.77364 0.881398 -0.472375
+-0.918189 0.396143 -0.994009 -0.1093
+0.971423 0.237356 0.391594 -0.920138
+0.413893 -0.910325 0.258206 -0.96609
+-0.0651051 -0.997878 0.973223 -0.229861
+0.0881928 0.996103 -0.828695 -0.559701
+0.977012 0.213182 -0.873687 0.486489
+-0.81595 0.578122 0.372318 0.928105
+0.383393 0.923585 -0.076688 -0.997055
+0.43849 0.898736 0.160559 -0.987026
+-0.0865227 0.99625 -0.723678 0.690138
+-0.932499 0.361172 0.733988 0.679163
+-0.999614 -0.0277765 -0.934629 0.355625
+-0.698043 0.716056 -0.292671 0.956213
+0.960937 -0.276766 -0.973298 -0.229546
+-0.330105 -0.943944 -0.608947 -0.793211
+0.730828 -0.682562 0.963227 0.268688
+-0.419586 -0.907715 0.775461 0.631396
+-0.433116 0.901338 0.68779 0.725909
+-0.125362 -0.992111 0.999996 -0.00293763
+0.0389304 0.999242 -0.73003 0.683415
+0.0549772 0.998488 0.70902 0.705189
+0.0277843 -0.999614 -0.934907 0.354894
+-0.372511 0.928028 0.890572 0.454842
+0.634002 -0.773332 0.903316 -0.428976
+0.748272 0.663392 -0.961687 -0.274148
+-0.715062 0.699061 -0.425284 -0.90506
+-0.995313 -0.0967052 -0.966163 -0.257931
+0.973949 0.226769 -0.633495 -0.773747
+0.900162 -0.435555 0.468543 -0.88344
+-0.979877 -0.199603 0.319428 0.947611
+-0.792556 0.609799 -0.92386 -0.382731
+-0.653977 0.756514 -0.562296 0.826936
+-0.904498 -0.426478 0.997019 0.0771613
+0.227082 0.973876 -0.608299 0.793708
+0.797486 0.603337 -0.357159 0.934043
+0.345046 -0.938586 -0.783037 -0.621975
+0.014249 0.999898 0.145332 -0.989383
+-0.999512 -0.031248 -0.999867 0.0162797
+0.999152 -0.0411673 -0.560094 0.828429
+-0.892397 0.451252 -0.953213 -0.302301
+0.117611 -0.99306 0.712346 -0.701828
+-0.91684 0.399255 -0.97374 0.227662
+0.904586 -0.42629 0.998406 -0.056447
+0.628989 0.777414 0.462614 0.88656
+-0.770526 0.637409 0.999998 0.00193593
+-0.701003 -0.713159 -0.652751 -0.757572
+0.990316 0.138833 0.207395 0.978257
+0.901888 0.43197 0.774237 0.632896
+0.946413 -0.32296 0.100973 -0.994889
+0.0135891 -0.999908 0.210268 0.977644
+-0.396532 0.918021 -0.997747 0.0670919
+0.374503 0.927226 0.773176 -0.634191
+-0.999144 -0.0413656 -0.543541 -0.839383
+-0.704237 -0.709965 -0.919082 -0.394067
+0.954489 0.298247 0.426369 -0.904549
+-0.72019 -0.693777 0.2926 0.956235
+0.999882 0.0153651 0.0342169 0.999414
+-0.921173 -0.389154 -0.645254 0.763968
+-0.544101 -0.83902 0.554523 -0.832169
+0.906748 -0.421672 0.898955 0.438041
+0.82496 0.565191 -0.930057 -0.367416
+0.942864 0.333178 -0.830798 0.556574
+-0.273992 0.961732 -0.867711 0.49707
+-0.505133 -0.863042 -0.898934 -0.438085
+-0.110367 0.993891 0.063616 -0.997974
+-0.798753 0.601659 -0.154374 -0.988012
+-0.984333 0.176322 0.43142 0.902151
+-0.995363 -0.0961939 -0.978133 -0.207979
+0.817164 -0.576406 0.170438 0.985368
+-0.976239 0.216694 -0.989004 -0.147889
+0.931666 -0.363316 0.869497 0.493939
+-0.476298 -0.879284 0.81297 0.582305
+0.808539 -0.588442 0.996702 -0.0811533
+0.687894 -0.725811 0.895992 0.44407
+0.383982 -0.92334 -0.140157 0.990129
+-0.247922 0.96878 0.996857 -0.0792239
+-0.999834 0.0182177 -0.248445 -0.968646
+0.508453 -0.861089 -0.997669 0.0682384
+-0.642081 0.766636 0.821944 0.569568
+-0.940372 0.340148 -0.988782 0.149368
+-0.854101 -0.520108 -0.276491 -0.961017
+-0.449183 -0.89344 -0.858305 -0.513139
+-0.667566 -0.74455 -0.669775 0.742564
+0.831855 0.554993 -0.656377 0.754433
+-0.31798 0.948097 0.586642 0.809847
+-0.415124 -0.909765 0.386114 0.922451
+-0.214052 -0.976822 -0.913471 -0.406903
+-0.33251 0.9431 -0.789299 0.614009
+0.0283627 0.999598 -0.953865 -0.300236
+-0.703108 0.711083 -0.845152 0.534525
+0.096176 0.995364 -0.978505 0.206221
+-0.541566 0.840658 0.776837 0.629701
+-0.899853 0.436194 0.404648 -0.914473
+-0.983625 -0.180226 0.746553 -0.665326
+0.999086 0.0427493 -0.422462 -0.90638
+-0.334215 -0.942497 -0.886878 -0.462004
+0.894108 -0.447851 -0.772599 -0.634895
+-0.99097 0.134081 0.635433 -0.772156
+0.242003 0.970275 0.771398 0.636353
+0.472489 -0.881337 0.493925 -0.869505
+0.93837 -0.345633 -0.742639 0.669692
+0.577983 0.816049 0.35641 0.93433
+-0.999991 0.00432636 0.907863 -0.419267
+0.555324 -0.831634 -0.685842 0.727751
+0.989888 0.141849 -0.0955677 0.995423
+-0.379984 0.924993 0.287885 0.957665
+0.667994 0.744167 -0.626031 0.779798
+-0.992308 -0.123792 0.987956 -0.154736
+0.603298 0.797516 -0.352564 -0.935788
+-0.999412 0.0342928 -0.958711 0.284383
+0.975246 -0.221122 -0.95376 0.300569
+-0.100482 -0.994939 -0.801827 0.597556
+0.479557 0.877511 0.968795 0.247864
+-0.815678 -0.578507 0.415612 -0.909542
+0.468597 -0.883412 0.0754841 -0.997147
+-0.984455 0.175636 0.367604 0.929983
+-0.187698 0.982227 0.999482 0.0321947
+-0.96324 -0.268641 -0.474695 0.880151
+0.161699 -0.98684 -0.861166 -0.508323
+-0.987155 -0.159763 -0.943705 -0.330789
+0.868288 -0.496061 -0.0692734 -0.997598
+0.997817 0.066039 0.947483 0.319806
+0.668916 -0.743338 -0.524806 -0.851222
+-0.564952 0.825124 -0.940307 -0.340327
+-0.969576 -0.24479 0.920122 -0.391633
+0.700082 -0.714063 -0.54982 0.835283
+0.966492 0.256696 0.676706 0.736254
+-0.976536 0.215356 -0.95953 -0.281605
+-0.598018 0.801483 0.295595 0.955313
+-0.0151722 0.999885 0.0534926 0.998568
+-0.271601 0.96241 -0.718793 0.695224
+-0.284143 0.958782 -0.859286 -0.511495
+-0.824724 0.565535 -0.913927 0.405879
+0.267435 -0.963576 -0.361081 0.932534
+0.639564 0.768738 0.961575 -0.274542
+-0.896605 0.442831 -0.316679 -0.948533
+0.78968 0.613519 -0.997005 -0.0773313
+-0.144844 0.989455 -0.387889 0.921706
+0.944528 -0.328432 -0.459637 -0.888107
+-0.0128786 0.999917 0.279143 0.96025
+0.110827 -0.99384 0.109755 -0.993959
+0.848524 -0.529158 0.705321 0.708888
+0.99615 -0.0876607 -0.797627 -0.60315
diff --git a/data/points/tore3D_1307.off b/data/points/tore3D_1307.off
index e214ac4b..e214ac4b 100755..100644
--- a/data/points/tore3D_1307.off
+++ b/data/points/tore3D_1307.off
diff --git a/data/points/tore3D_1307.txt b/data/points/tore3D_1307.txt
new file mode 100644
index 00000000..7a1b9e60
--- /dev/null
+++ b/data/points/tore3D_1307.txt
@@ -0,0 +1,1307 @@
+-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.off b/data/points/tore3D_300.off
new file mode 100644
index 00000000..00eecbc2
--- /dev/null
+++ b/data/points/tore3D_300.off
@@ -0,0 +1,302 @@
+OFF
+300 0 0
+0.959534781242014 -0.418347167310406 0.302236706360499
+2.16795051781987 1.8534755312793 -0.523120176939808
+-2.38752605996323 -1.50911089699331 -0.565888742230855
+-2.70428287516913 -1.25687539753238 0.188394161758062
+-1.2293192351549 -1.6433666240448 -0.998632128417844
+-0.541060581221073 0.874317877271137 -0.235772670127843
+-0.680895633395962 -1.18447800621889 0.773528325120879
+0.307818039582861 1.45003941576708 0.855593436948771
+0.168334095447179 -1.04004287990976 0.322931047726699
+-0.693132044992659 2.91846761160023 -0.0265488214271136
+2.21829768934691 -1.80825620958286 0.507029717781912
+1.39353197432761 -1.00232018065434 -0.95898987509937
+1.25103367489055 0.670258962753535 -0.814097483693208
+0.256075322268679 0.980760885647654 -0.164603689388124
+-1.03049290335496 -0.548251215382241 -0.553663669101879
+-1.4770698664818 1.55244993730008 -0.989743336676147
+2.81127276382533 -0.973240065906209 -0.222333302099467
+1.92081177957661 0.371630788782385 0.999050476863813
+0.940122029559839 0.781599816466946 0.628994896033071
+0.306997277631142 -2.63033061729372 0.761482466789273
+0.612817640625854 2.28021124717378 -0.932517620554714
+-0.749699607389099 1.24801965739463 -0.839010966831176
+-0.154361066579755 1.04815680087852 0.339688867662217
+-0.262639970818703 1.12445753696261 0.534327877655949
+0.36717667006869 -1.01676645451003 0.394334855760279
+0.424035547682691 -0.917168809434391 -0.144175092700111
+2.08261296666578 -2.05785707858966 -0.373061099708758
+0.651279530942164 -0.91244335335117 0.476884993705875
+-2.93865473739998 0.176739480659163 0.330046256428844
+0.0752592625269588 -2.86104297523846 0.506852758144546
+2.42108789315239 -1.57246048079025 -0.46192589897907
+-1.61942559663475 -1.10542050497529 0.999228952936353
+0.692389459564839 0.770549419741852 0.265645889867695
+1.51841358234726 -1.00021735880109 -0.98334383059774
+2.85075282389761 0.814388843476368 -0.262995967489467
+-0.784392975900731 -0.623934865952297 -0.0675029801783761
+2.95477190325865 -0.01545374755798 0.297209425434383
+-2.01178925877753 0.819250335239531 0.98506143304802
+-1.06049119415128 -0.640702917987696 0.64876172557636
+0.424777646365108 -0.912213211492002 0.111760882407564
+1.62717960754164 -2.51706084785163 0.0745558427305672
+0.991179499609619 -0.137272754245949 0.0357741533639773
+0.586676853840703 -0.981514568432931 0.516124042728287
+0.996296801968011 0.163993329632496 -0.138970552607153
+0.999735468785909 2.8102215879738 -0.18492224634737
+1.80656679908849 -0.264164139672896 0.984706448083062
+-1.41495369339859 2.29441949474757 -0.718394190427821
+-0.608066058828841 -1.94541607390611 -0.999268905344167
+2.15894083249888 1.6976186891867 -0.66545230252024
+-0.0920339025393292 -1.14740764785059 -0.52854186528706
+-0.0803524956678571 -2.82987037713862 0.556256089759466
+1.73755451382877 -1.38298334066552 -0.975330014733214
+1.339576888853 -1.69568142514835 0.986958907306434
+0.941158226372244 1.33453565427992 -0.930230027566694
+-1.64738843362436 2.11800058817634 -0.730187211545338
+-2.09522315192051 2.14264431725583 -0.0797808501517505
+-2.70163529798441 -0.512752030638191 -0.661592848269346
+0.0012406381564526 -2.43305836022187 -0.90136573192226
+1.26857330331965 -0.754387632740404 0.851677186577399
+0.555984630753723 -0.853190194061578 -0.190731240639216
+-0.376652419334438 0.953098196145437 -0.221429003703334
+0.575823956072062 -1.52858842228987 0.930397979228448
+-0.917665722737145 0.426001305594148 -0.152684444024179
+-2.2612659986582 1.45631970411773 0.724147482366059
+-2.4975593505263 0.336020143137794 -0.854128541403725
+-1.21733135240706 -0.635660112064281 -0.779262523564629
+-0.869857012314377 2.58076078125195 -0.690415729999257
+-1.40500337086406 -0.601791852462944 -0.881844312277268
+2.31904992184587 -1.05819185575653 -0.835775763770501
+1.19729717177012 -1.57894012102566 -0.999829933326901
+1.49128833410868 -0.646133202611446 0.927124838238863
+-0.646639588616155 1.64689880969244 0.973024656841064
+-1.07933947117704 0.185618755846084 -0.425802800488271
+-2.25890103703752 0.840567429045019 -0.911984072088236
+1.02056337401279 -0.444785727078535 -0.46229962045738
+-2.01362172913345 1.77850332507576 0.727048210112551
+-1.7152404634659 -1.95129617448897 0.801495726550204
+0.24904814258364 -1.73684228270244 0.969423708704471
+-0.97192898217864 0.340274559305984 -0.242197940224517
+0.335252717095645 1.05330582776341 0.446812017005886
+0.0757351764289982 -1.003454918955 0.112151625141631
+-2.12620574772059 -1.59311887240156 0.754033287759111
+-0.325964621805956 -0.967660697886875 -0.204281119631407
+0.847444429135404 -2.75134349865297 0.477009941828313
+-2.52939644202034 1.59075929357512 0.154220894882662
+-1.51910975922194 2.47536837366441 -0.426830229587188
+-1.23951192974026 -2.45646514226776 -0.659762364526391
+0.00537063209046765 -2.98895632800773 -0.148175024086866
+0.578604147500042 -1.40605218842367 -0.877514074075442
+1.32814619313677 0.993211756161157 0.939862017190046
+2.21921387799351 1.69625165174388 0.608911392663736
+2.11087050271442 -1.62983612347069 0.745183392373354
+1.20744870574619 0.759485725637224 -0.819168429715268
+-1.85454257923694 0.27227622276858 -0.992083907655554
+1.12410933384486 -0.192246452457068 0.511017950537958
+0.508634803443603 -0.874107029353032 -0.150053592184677
+1.8703001619597 0.692655600076433 0.999984548045959
+1.64361625376311 -1.21013144565734 0.999157018995579
+0.840118117818047 -2.50035600571423 0.770266412736703
+2.3287036316336 -1.17791884555773 0.79265889315273
+-2.54280253777906 0.888179845147398 -0.720498448371396
+-2.06783509487145 -1.09828285186568 -0.939917075668418
+0.200760576094878 0.999051233659456 0.194124743559801
+1.57705178275634 -1.36916375652601 0.9960789528748
+1.27101041453082 -0.844959876278814 -0.880656839462615
+2.26878096107158 -1.9325250189773 0.197654241802863
+1.00297464475457 2.79196340984832 -0.256097547101918
+-1.40380898461312 2.64725539056151 0.0843284379977918
+-0.0517392801851798 1.58464174765503 0.910043016348823
+-0.301340591032907 1.33506850520998 -0.775501362836281
+-0.916802035602795 2.82057847024232 -0.259150467395372
+-2.3956686819712 1.05176302652714 -0.787450409390176
+0.260687064694077 -0.989291907955316 0.21352399518671
+1.12792686627226 2.77426524629341 0.101946125819402
+-0.0684132204807785 -2.16283457272975 0.986474250179203
+2.93446835470829 0.29913341943434 0.313235563230203
+0.032755222852554 1.65788790402753 0.939776880892029
+-0.909983475613723 2.25856131650061 -0.900435993208869
+-0.654785891138605 -2.77631341957818 -0.522754517843354
+-0.637731499509436 0.816845593255333 -0.267023168326767
+-2.09200542287803 -0.48535592606264 -0.98905160843396
+2.47346067782732 0.00404347414316116 -0.880813179367053
+-1.07226402798667 -1.22257426020764 0.92749836802861
+1.39068341588794 -0.68753111885771 -0.893709581266259
+2.49123495155807 -0.780792651284873 0.791842221382225
+1.52017311675094 -0.606521706417438 0.931673164101109
+-1.41022678618765 0.805159290147271 -0.926575312433509
+-2.43386589806161 -0.47159898411599 -0.877741390593103
+-0.48020605858504 1.36831644955489 -0.835252691435911
+0.87912613023492 0.619156516496662 0.380637258865281
+0.253085874295989 1.43445725355682 -0.839482019455938
+0.517703192423887 2.78341770290716 0.556042888577917
+-1.00656408919327 -2.07658747018639 0.951489907279078
+-1.40077608835454 0.925515316363222 0.947050044378871
+2.07634345953723 -1.10323384918967 0.936285655309915
+-1.57233200628071 -0.286150759083885 0.915709183775737
+-1.15178699195696 -0.454341172294152 0.647764766715205
+0.760883532100737 2.73972227857741 -0.537259031193132
+2.40478710552954 0.399947334915386 0.899063394403055
+-1.37636264245145 2.1239854039931 0.847405598008672
+0.620060205826966 -0.788865441879053 -0.0822217432568619
+-1.31255288285741 0.709433414132035 -0.861362373356423
+2.87811168494233 0.586136824835297 -0.348820144844317
+1.46215508160988 -2.61812761438328 0.050023918341349
+1.59775483991913 2.14438930309337 0.738569238086525
+2.16166999311135 0.234499849009414 -0.984683361538415
+-2.627348149981 -1.44784295277905 0.0162526714459874
+1.55466115277639 -2.06080606798315 -0.813580914672985
+1.4768627986643 0.291640310070862 -0.86911101944411
+0.36020381665219 -0.932877801044002 -0.00278947687261815
+1.02111844342504 -0.846230498172804 0.738907750969927
+0.0753375442562172 -2.00343644006518 0.999988226833092
+-0.13730950236629 0.991363204668133 -0.0406636790006198
+-2.36318789164257 -1.83848352727692 -0.108400279147113
+-0.80461379190523 -1.6474745725615 -0.986034710893435
+1.7756647596058 -2.38360544396859 -0.233741336935155
+1.69896254446626 -0.343351559842879 0.963782400468442
+0.0494913193213498 -2.46795356936345 -0.883490137791417
+1.35772824903814 0.589658412058176 -0.854314907317433
+-1.96435893659605 -2.22155414885828 -0.260516416434745
+1.35473240963385 0.346732354142229 0.798797675885133
+0.400966681880103 2.47568026636498 0.861391979701686
+-1.62104506824445 -0.572439707452304 0.959751471457789
+-0.867237113132388 0.754407264547685 0.525890831738318
+1.08774066807182 0.58266518858005 -0.642803142528264
+-1.62210891849555 -2.48905492938415 0.239222440583498
+1.29180344928963 0.216732874635193 -0.723674450462894
+-2.23977014077204 1.04128789846265 0.8826717211881
+-2.15042174348158 -1.07255921184869 -0.915173594366247
+1.20646041838032 2.20670800057226 -0.857204278269845
+-1.59665966804813 2.12974640237861 -0.749686641314759
+-0.00507896505098647 1.00004934186706 0.0111568054264668
+1.08896774211599 -0.54893426659595 -0.625155433738454
+-2.08838518173774 1.31789005319132 0.882958674731457
+-2.67026050322772 0.777218712412565 0.624441286594906
+0.134410054836508 1.03453453869622 -0.290843938402197
+-1.15657597782331 0.21336107716996 0.566722675765672
+-1.12091291528735 -0.197701697854327 -0.507272467213624
+2.20360569490773 2.03438086720851 -0.0424844996967955
+-0.190560364964061 -1.95805452687492 0.999465390706348
+-1.69646814346356 -0.625828205037699 0.981438239882928
+-0.304352636706423 -2.83100688552149 -0.531082871783868
+0.14563390066437 -2.1691590077372 0.984738172749555
+-2.34365544864258 -0.143838445921824 0.937470314360672
+1.02710725533131 -0.411656637698526 0.449124549869131
+-1.61565579085794 -1.08738989914736 -0.998620980457037
+-0.717364891783532 1.50452842131031 0.942855738747352
+-0.578567558143299 0.853096156802936 0.246207825092783
+1.11793653693318 0.455945552854421 0.609663175028121
+2.39251443993049 0.176334486690512 0.916949275349228
+2.9155642712549 -0.62746034690765 0.18721929843073
+-1.14806683434513 2.59996359591672 0.539229179127317
+-0.177857300266215 1.90119125961188 0.995895769538786
+0.35914818712455 2.31920052987544 -0.937922693979931
+1.2743666522523 -0.690075814269372 0.834645084284416
+2.9302841310705 -0.642986734356231 0.000995094268308586
+-1.26975451435037 1.91229429559509 -0.955354478719998
+0.0738366615932967 1.2694977539948 -0.685198041292763
+-1.69716232712318 1.22850232281973 0.995464670669604
+0.84570997159476 2.13803629884409 -0.954183333932217
+0.352468648163491 -2.9344545563609 -0.294839028922669
+1.60389935177392 1.74998587824519 0.927507865916284
+-2.11217212504527 0.760269273860796 0.969564968832133
+1.74217621467257 2.29099479959881 0.47835741399359
+2.92346903414395 0.330804589449986 -0.33526021272958
+-2.35952494893432 0.250879618289894 -0.927901668132089
+-1.41032225684219 -0.170788763321419 0.815061677973598
+-1.01611744261575 -2.68326939535803 -0.494423710160221
+-1.59344928656495 2.26723050382079 -0.636622362537764
+-0.39580260135079 -2.90869384965014 0.35332697871175
+-1.2619469130673 -1.96838196535269 -0.941085144982828
+-1.30548566796483 1.57897857482689 0.998809944306817
+-1.35584805950535 -0.237100218600359 0.781761994033332
+2.52115787439036 1.0589742629827 0.678574394474946
+-1.95614957999606 1.84500176798258 0.724791088391566
+1.4979623349839 1.58854216289188 0.983033167483811
+-0.981146595813074 -0.312003286041912 0.241344264758116
+1.8959899672511 0.736814649744932 -0.999417494784511
+-0.757097460644456 -0.653318267664153 0.00461774302265985
+1.10316023266325 -2.54112393275506 -0.637744617153837
+-1.72022005250621 2.23190220939628 0.575364412789703
+2.94799384971966 0.358547670782175 -0.244227908472639
+-1.00994005619833 -0.0359408889344281 0.14507521649066
+1.00132300605616 0.624998791048906 0.572891974870137
+2.3085624824673 1.91312252759207 0.0591476364274699
+-1.6659611493105 -1.84465800051153 0.874183099883255
+1.04218128888347 -0.0688739697225331 0.294844086473301
+-0.601696551108497 -2.17864473742223 0.965553097225366
+1.08052048270212 2.3454565036691 0.812916093418994
+-1.79474335184654 -0.705336370592575 -0.997431127830519
+1.12310671921089 0.346525230427012 0.565643836449263
+0.696749595851333 -1.32918567757458 -0.86644723350324
+2.13602598032304 -0.51308315076563 -0.980446803768366
+-1.93196921945397 1.69157833829893 -0.823120136150302
+-2.01941018956472 0.0465497013536062 0.999801046182706
+-2.59423705179264 1.10327839008222 -0.573659802885399
+-0.585219166556388 1.2580168195987 -0.790451471385005
+-0.0576402469775295 1.41565353591293 0.812347628291534
+2.3891312946018 1.26300791722059 0.711751109733218
+2.30156990743563 0.405909870828655 0.941472642528813
+0.275589260456702 -1.00168998250037 -0.276232537275217
+-1.29248016136238 -0.876528620996052 0.898813208471374
+2.35322045727023 1.36303382650264 -0.694525299956941
+1.54876331953525 -1.90130806390003 -0.891879829401408
+0.16593187575783 1.69907888603775 0.956162102627631
+-1.52945389781439 1.36994725318236 0.998579274948504
+0.947255866427042 0.321393560626499 -0.0242347842318913
+-0.849266801325161 -1.69619250008471 -0.994673549743623
+1.17007223184327 -1.45748256057479 0.991388144859652
+-1.02065656396392 -0.234068996172272 -0.303449207922113
+-1.79030334572357 -0.338548456021292 0.984036300930214
+-0.202580788439636 -2.9098032393728 -0.399239754145888
+0.556542406671504 0.835949987061395 0.0922790328770012
+-0.192048894344178 2.82750618177242 0.551732977447003
+-2.4383233660105 1.32432593198794 -0.632262737666956
+1.00457987324054 2.2017998675896 0.907456835650233
+0.258230866817704 1.01719292156891 0.310599733745205
+-0.667635905646098 -0.747459126240117 -0.0665059738190087
+-0.925217466789865 -0.458919419892981 -0.253939651272238
+0.593031990252279 0.895690762363157 -0.37806299536721
+2.41891123803036 1.29269511281484 -0.669666978131638
+2.86198580293885 0.898401929715067 0.0252390801762425
+0.577555242801644 2.9381443296706 -0.105947290476281
+-1.08511464203043 -1.17367759499812 -0.915830310368355
+-0.00823512252879893 -2.34071693036362 0.940160678630731
+0.723355997258736 0.693575864721822 -0.0654384491946278
+-2.45564096089468 -0.108134097337387 0.888941553150783
+1.0554937129765 2.48105527060468 0.717810492633049
+0.0900114873059034 -1.35462061558498 0.766376101065206
+1.07215905411075 0.711684540080838 -0.701026091958739
+1.7642570870584 -1.10328014310579 -0.996728357140097
+-2.42237083502851 -1.22877182282345 0.69789165141999
+-2.29573991343012 1.39431631359088 -0.727611414530717
+-0.80608542331762 -0.591802110438813 -0.00185677113225586
+0.584373976640234 -1.2455966078976 -0.781316331338531
+-0.117129848865082 1.30318973566841 -0.722321820498621
+-0.427012578549237 -2.23637426000762 0.960934425748682
+1.84229944864514 -1.55651807400289 -0.911270828095356
+0.203997692272774 1.21919989241584 -0.645392194686482
+0.446215983259144 -1.74060177047245 -0.979155323351272
+-2.26029729565112 -1.9493984229134 -0.173628460146742
+-1.25890926878714 2.70615042882704 0.174571595362577
+1.56639306015901 0.363207544125242 -0.919944405133645
+-1.34865311186347 0.197323883232669 -0.77087378354129
+2.34234493513434 -1.5350786183092 0.599274108730333
+-0.128003282153838 2.84277775092986 0.533724957778819
+2.67959573383432 0.576255466056955 -0.671661470652464
+-1.22133840956565 1.75573360172354 -0.9903269014343
+-2.65079844065683 0.801278641234516 -0.638940464730991
+1.77058917671795 -1.05700903893028 -0.998069966649505
+-0.0617876530073753 2.73595305745592 -0.676273466837526
+-1.02613271221592 -0.32948466837676 0.386553542254037
+0.289216189984019 2.86987925980331 0.46670029349679
+0.0221376688554938 -1.6367078071517 0.931733618120448
+0.9880285207657 1.3702732104138 -0.95051910813202
+-2.35149763797368 -1.28585604226228 -0.733114009304653
+-0.984949657118942 -2.15300005263466 -0.929983557964422
+0.815196720196319 0.609995430318387 -0.189686296979061
+-1.36318181784209 0.682494702259896 -0.879709239261867
+-0.562439533917299 2.60180320419631 -0.749591065583496
diff --git a/scripts/generate_version.sh b/scripts/generate_version.sh
index 1a8ce4ab..bf30f101 100755
--- a/scripts/generate_version.sh
+++ b/scripts/generate_version.sh
@@ -2,19 +2,22 @@
#usage bash generate_version.sh : dont generate if svn st non empty
#usage bash generate_version.sh -f : generate even if svn is empty
#usage bash generate_version.sh -f DIR : generate even if svn is empty and save library in dir
+#
+# 23/06/2015 - Remove source, add biblio, and doc
+# 06/10/2015 - Replace static Version.txt with generated GUDHIVersion.cmake file
# VERSION CHECK
ROOT_DIR=..
-VERSION_FILE="$ROOT_DIR/Version.txt"
+VERSION_FILE="$ROOT_DIR/GUDHIVersion.cmake"
if [ ! -f $VERSION_FILE ]; then
- echo "File not found! : $VERSION_FILE"
+ echo "File not found! : $VERSION_FILE - Please launch cmake first to generate file"
exit 1
fi
# SVN STATUS CHECK OR IF FORCED BY USER
if [ "$1" != "-f" ]
then
- SVN_STATUS=`svn status $ROOT_DIR`
+ SVN_STATUS=`svn status $ROOT_DIR | grep -v $VERSION_FILE`
echo $SVN_STATUS
fi
@@ -41,27 +44,36 @@ echo $VERSION_DIR
mkdir "$VERSION_DIR"
# TOP LEVEL FILE COPY
-cp $VERSION_FILE $VERSION_DIR
cp $ROOT_DIR/README $VERSION_DIR
cp $ROOT_DIR/Conventions.txt $VERSION_DIR
cp $ROOT_DIR/COPYING $VERSION_DIR
cp -R $ROOT_DIR/data $VERSION_DIR
cp $ROOT_DIR/src/CMakeLists.txt $VERSION_DIR
cp $ROOT_DIR/src/Doxyfile $VERSION_DIR
+cp -R $ROOT_DIR/biblio $VERSION_DIR
+cp $ROOT_DIR/src/GUDHIConfigVersion.cmake.in $VERSION_DIR
+cp $ROOT_DIR/src/GUDHIConfig.cmake.in $VERSION_DIR
+cp $ROOT_DIR/CMakeGUDHIVersion.txt $VERSION_DIR
+cp $ROOT_DIR/GUDHIVersion.cmake.in $VERSION_DIR
# PACKAGE LEVEL COPY
PACKAGE_INC_DIR="/include"
-PACKAGE_SRC_DIR="/source"
PACKAGE_EX_DIR="/example"
+PACKAGE_CONCEPT_DIR="/concept"
+PACKAGE_DOC_DIR="/doc"
for package in `ls $ROOT_DIR/src/`
do
- echo $package
- if [ -d "$ROOT_DIR/src/$package" ]
+ if [ -d "$ROOT_DIR/src/$package" ] && [ $package != "Bottleneck" ]
then
- if [ "$package" == "cmake" ]
+ echo $package
+ if [ "$package" == "cmake" ] || [ "$package" == "debian" ]
then
# SPECIFIC FOR CMAKE MODULES
cp -R $ROOT_DIR/src/$package $VERSION_DIR
+ elif [ "$package" == "GudhUI" ]
+ then
+ # SPECIFIC FOR GUDHI USER INTERFACE
+ cp -R $ROOT_DIR/src/$package $VERSION_DIR
else
# PACKAGE COPY
if [ -d "$ROOT_DIR/src/$package$PACKAGE_INC_DIR" ]
@@ -73,20 +85,21 @@ do
fi
cp -R $ROOT_DIR/src/$package$PACKAGE_INC_DIR/* $VERSION_DIR$PACKAGE_INC_DIR/
fi
- if [ -d "$ROOT_DIR/src/$package$PACKAGE_SRC_DIR" ]
- then
- if [ ! -d "$VERSION_DIR$PACKAGE_SRC_DIR" ]
- then
- # MUST CREATE DIRECTORY ON FIRST LOOP
- mkdir $VERSION_DIR$PACKAGE_INC_DIR
- fi
- cp -R $ROOT_DIR/src/$package$PACKAGE_SRC_DIR/* $VERSION_DIR$PACKAGE_SRC_DIR/
- fi
if [ -d "$ROOT_DIR/src/$package$PACKAGE_EX_DIR" ]
then
mkdir -p $VERSION_DIR$PACKAGE_EX_DIR/$package
cp -R $ROOT_DIR/src/$package$PACKAGE_EX_DIR/* $VERSION_DIR$PACKAGE_EX_DIR/$package
fi
+ if [ -d "$ROOT_DIR/src/$package$PACKAGE_CONCEPT_DIR" ]
+ then
+ mkdir -p $VERSION_DIR$PACKAGE_CONCEPT_DIR/$package
+ cp -R $ROOT_DIR/src/$package$PACKAGE_CONCEPT_DIR/* $VERSION_DIR$PACKAGE_CONCEPT_DIR/$package
+ fi
+ if [ -d "$ROOT_DIR/src/$package$PACKAGE_DOC_DIR" ]
+ then
+ mkdir -p $VERSION_DIR$PACKAGE_DOC_DIR/$package
+ cp -R $ROOT_DIR/src/$package$PACKAGE_DOC_DIR/* $VERSION_DIR$PACKAGE_DOC_DIR/$package
+ fi
fi
fi
done
diff --git a/src/Alpha_complex/doc/Intro_alpha_complex.h b/src/Alpha_complex/doc/Intro_alpha_complex.h
new file mode 100644
index 00000000..f3126169
--- /dev/null
+++ b/src/Alpha_complex/doc/Intro_alpha_complex.h
@@ -0,0 +1,170 @@
+/* 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 DOC_ALPHA_COMPLEX_INTRO_ALPHA_COMPLEX_H_
+#define DOC_ALPHA_COMPLEX_INTRO_ALPHA_COMPLEX_H_
+
+// needs namespace for Doxygen to link on classes
+namespace Gudhi {
+// needs namespace for Doxygen to link on classes
+namespace alpha_complex {
+
+/** \defgroup alpha_complex Alpha complex
+ *
+ * \author Vincent Rouvreau
+ *
+ * @{
+ *
+ * \section definition Definition
+ *
+ * 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
+ * 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.
+ *
+ * \image html "alpha_complex_representation.png" "Alpha-complex representation"
+ *
+ * Alpha_complex is constructing a `Simplex_tree` using <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).
+ *
+ * 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.
+ *
+ * \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.
+ *
+ * Then, it is asked to display information about the alpha complex.
+ *
+ * \include Alpha_complex/Alpha_complex_from_points.cpp
+ *
+ * When launching:
+ *
+ * \code $> ./alphapoints
+ * \endcode
+ *
+ * the program output is:
+ *
+ * \include Alpha_complex/alphaoffreader_for_doc_60.txt
+ *
+ * \section algorithm 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"
+ *
+ * \subsection filtrationcomputation Filtration value computation algorithm
+ *
+ * \f{algorithm}{
+ * \caption{Filtration value computation algorithm}\label{alpha}
+ * \begin{algorithmic}
+ * \For{i : dimension $\rightarrow$ 0}
+ * \ForAll{$\sigma$ of dimension i}
+ * \If {filtration($\sigma$) is NaN}
+ * \State filtration($\sigma$) = $\alpha^2(\sigma)$
+ * \EndIf
+ * \ForAll{$\tau$ face of $\sigma$} \Comment{propagate alpha filtration value}
+ * \If {filtration($\tau$) is not NaN}
+ * \State filtration($\tau$) = min (filtration($\tau$), filtration($\sigma$))
+ * \Else
+ * \If {$\tau$ is not Gabriel for $\sigma$}
+ * \State filtration($\tau$) = filtration($\sigma$)
+ * \EndIf
+ * \EndIf
+ * \EndFor
+ * \EndFor
+ * \EndFor
+ * \State make\_filtration\_non\_decreasing()
+ * \State prune\_above\_filtration()
+ * \end{algorithmic}
+ * \f}
+ *
+ * \subsubsection dimension2 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 :
+ * \image html "alpha_complex_doc_420.png" "Filtration value propagation example"
+ *
+ * \subsubsection dimension1 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).
+ *
+ * \subsubsection dimension0 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).
+ *
+ * \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()`.
+ *
+ * \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()`).
+ * In the following example, the value is given by the user as argument of the program.
+ *
+ *
+ * \section offexample Example from OFF file
+ *
+ * This example builds the Delaunay triangulation in a dynamic kernel, and initializes the alpha complex with it.
+ *
+ *
+ * Then, it is asked to display information about the alpha complex.
+ *
+ * \include Alpha_complex/Alpha_complex_from_off.cpp
+ *
+ * When launching:
+ *
+ * \code $> ./alphaoffreader ../../data/points/alphacomplexdoc.off 32.0
+ * \endcode
+ *
+ * the program output is:
+ *
+ * \include Alpha_complex/alphaoffreader_for_doc_32.txt
+ *
+ * \copyright GNU General Public License v3.
+ * \verbatim Contact: gudhi-users@lists.gforge.inria.fr \endverbatim
+ */
+/** @} */ // end defgroup alpha_complex
+
+} // namespace alpha_complex
+
+namespace alphacomplex = alpha_complex;
+
+} // namespace Gudhi
+
+#endif // DOC_ALPHA_COMPLEX_INTRO_ALPHA_COMPLEX_H_
diff --git a/src/Alpha_complex/doc/alpha_complex_doc.ipe b/src/Alpha_complex/doc/alpha_complex_doc.ipe
new file mode 100644
index 00000000..baf0d26a
--- /dev/null
+++ b/src/Alpha_complex/doc/alpha_complex_doc.ipe
@@ -0,0 +1,595 @@
+<?xml version="1.0"?>
+<!DOCTYPE ipe SYSTEM "ipe.dtd">
+<ipe version="70107" creator="Ipe 7.1.10">
+<info created="D:20150603143945" modified="D:20160406112209"/>
+<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 -240 0" stroke="darkcyan">
+320 580 m
+350 520 l
+290 530 l
+320 580 l
+320 580 l
+</path>
+<path matrix="1 0 0 1 -240 0" stroke="darkcyan">
+320 580 m
+280 660 l
+290 530 l
+320 580 l
+320 580 l
+</path>
+<path matrix="1 0 0 1 -240 0" stroke="darkcyan">
+320 580 m
+370 580 l
+350 520 l
+320 580 l
+</path>
+<text matrix="1 0 0 1 -260 0" transformations="translations" pos="380 530" stroke="darkcyan" type="label" width="118.196" height="8.307" depth="2.32" valign="baseline" size="large">Delaunay triangulation</text>
+<text matrix="1 0 0 1 -242.155 -3.50128" 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 -240 0" 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 -240 0" 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 -240 0" 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 -240 0" 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 -239.3 -10.1537" 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 -240 0" 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 -240 0" stroke="darkcyan">
+280 660 m
+300 710 l
+370 690 l
+280 660 l
+</path>
+<path matrix="1 0 0 1 -240 0" stroke="darkcyan">
+320 580 m
+370 690 l
+370 580 l
+320 580 l
+</path>
+<path matrix="1 0 0 1 -240 0" stroke="darkcyan">
+280 660 m
+370 690 l
+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>
+<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"/>
+<use matrix="1 0 0 1 -240 0" name="mark/fdisk(sfx)" pos="320 580" size="normal" stroke="black" fill="white"/>
+<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>
+</page>
+</ipe>
diff --git a/src/Alpha_complex/doc/alpha_complex_doc.png b/src/Alpha_complex/doc/alpha_complex_doc.png
new file mode 100644
index 00000000..0b6201da
--- /dev/null
+++ b/src/Alpha_complex/doc/alpha_complex_doc.png
Binary files differ
diff --git a/src/Alpha_complex/doc/alpha_complex_doc_420.ipe b/src/Alpha_complex/doc/alpha_complex_doc_420.ipe
new file mode 100644
index 00000000..5d1d29d4
--- /dev/null
+++ b/src/Alpha_complex/doc/alpha_complex_doc_420.ipe
@@ -0,0 +1,514 @@
+<?xml version="1.0"?>
+<!DOCTYPE ipe SYSTEM "ipe.dtd">
+<ipe version="70107" creator="Ipe 7.1.10">
+<info created="D:20150603143945" modified="D:20151130095019"/>
+<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 80" stroke="lightgray">
+320 580 m
+350 520 l
+290 530 l
+320 580 l
+320 580 l
+</path>
+<path matrix="1 0 0 1 0 80" stroke="darkcyan" pen="heavier">
+320 580 m
+280 660 l
+290 530 l
+320 580 l
+320 580 l
+</path>
+<path matrix="1 0 0 1 0 80" stroke="lightgray">
+320 580 m
+370 580 l
+350 520 l
+320 580 l
+</path>
+<text matrix="1 0 0 1 0 80" transformations="translations" pos="380 530" stroke="darkcyan" type="label" width="54.628" height="8.965" depth="2.99" valign="baseline" size="large">Cell [4,2,0]</text>
+<text matrix="1 0 0 1 -2.15463 76.4987" 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 0 80" 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 0 80" 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 0 80" 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 0 80" 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 0.700256 69.8463" 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 0 80" 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 0 80" stroke="lightgray">
+280 660 m
+300 710 l
+370 690 l
+280 660 l
+</path>
+<path matrix="1 0 0 1 0 80" stroke="lightgray">
+320 580 m
+370 690 l
+370 580 l
+320 580 l
+</path>
+<path matrix="1 0 0 1 0 80" stroke="lightgray">
+280 660 m
+370 690 l
+320 580 l
+280 660 l
+</path>
+<path matrix="1 0 0 1 0 80" stroke="darkcyan">
+77.2727 0 0 77.2727 243.636 591.818 e
+</path>
+<path matrix="1 0 0 1 0 80" stroke="darkcyan">
+243.428 591.569 m
+186.061 643.28 l
+</path>
+<text matrix="1 0 0 1 0 80" transformations="translations" pos="212.724 627.389" stroke="darkcyan" type="label" width="18.785" height="4.294" depth="1.49" valign="baseline">$\alpha_{420}$</text>
+<path matrix="1 0 0 1 -264 -162" stroke="lightgray">
+320 580 m
+350 520 l
+290 530 l
+320 580 l
+320 580 l
+</path>
+<path matrix="1 0 0 1 -264 -162" stroke="lightgray">
+320 580 m
+280 660 l
+290 530 l
+320 580 l
+320 580 l
+</path>
+<path matrix="1 0 0 1 -264 -162" stroke="lightgray">
+320 580 m
+370 580 l
+350 520 l
+320 580 l
+</path>
+<text matrix="0.582962 0 0 1 -211.265 -209.555" transformations="translations" pos="380 530" stroke="darkcyan" type="label" width="231.798" height="8.965" depth="2.99" valign="baseline" size="large">[2,0] is Gabriel $\rightarrow$ $\alpha_{20}$ is not$\\$
+modified (NaN)
+</text>
+<text matrix="1 0 0 1 -266.155 -165.501" 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 -264 -162" 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 -264 -162" 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 -264 -172" 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 -263.3 -172.154" 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 -264 -162" 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 -264 -162" stroke="lightgray">
+280 660 m
+300 710 l
+370 690 l
+280 660 l
+</path>
+<path matrix="1 0 0 1 -264 -162" stroke="lightgray">
+320 580 m
+370 690 l
+370 580 l
+320 580 l
+</path>
+<path matrix="1 0 0 1 -264 -162" stroke="lightgray">
+280 660 m
+370 690 l
+320 580 l
+280 660 l
+</path>
+<text matrix="1 0 0 1 -166.834 -240.52" transformations="translations" pos="212.724 627.389" stroke="darkcyan" type="label" width="14.814" height="4.294" depth="1.49" valign="baseline">$\alpha_{20}$</text>
+<path matrix="1 0 0 1 -264 -162" stroke="darkcyan" pen="heavier">
+290 530 m
+320 580 l
+</path>
+<path matrix="1 0 0 1 -264 -162" stroke="darkcyan">
+29.1548 0 0 29.1548 305 555 e
+</path>
+<path matrix="1 0 0 1 -264 -162" stroke="darkcyan">
+304.883 555.015 m
+334.509 555.015 l
+</path>
+<path matrix="1 0 0 1 -37.2997 -163.65" stroke="lightgray">
+320 580 m
+350 520 l
+290 530 l
+320 580 l
+320 580 l
+</path>
+<path matrix="1 0 0 1 -38 -164" stroke="lightgray">
+320 580 m
+280 660 l
+290 530 l
+320 580 l
+320 580 l
+</path>
+<path matrix="1 0 0 1 -38 -164" stroke="lightgray">
+320 580 m
+370 580 l
+350 520 l
+320 580 l
+</path>
+<text matrix="1 0 0 1 -199.21 -189.117" transformations="translations" pos="380 530" stroke="darkred" type="label" width="168.308" height="8.965" depth="2.99" valign="baseline" size="large">[0,4] is not Gabriel $\rightarrow$ $\alpha_{40} = \alpha_{420}$</text>
+<text matrix="1 0 0 1 -40.1546 -167.501" 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 -38 -164" 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 -37.2997 -174.154" 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 -38 -164" 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 -38 -164" stroke="lightgray">
+280 660 m
+300 710 l
+370 690 l
+280 660 l
+</path>
+<path matrix="1 0 0 1 -38 -164" stroke="lightgray">
+320 580 m
+370 690 l
+370 580 l
+320 580 l
+</path>
+<path matrix="1 0 0 1 -38 -164" stroke="lightgray">
+280 660 m
+370 690 l
+320 580 l
+280 660 l
+</path>
+<text matrix="1 0 0 1 52.4654 -193.97" transformations="translations" pos="212.724 627.389" stroke="darkcyan" type="label" width="14.814" height="4.294" depth="1.49" valign="baseline">$\alpha_{40}$</text>
+<path matrix="1 0 0 1 -38 -164" stroke="darkcyan" pen="heavier">
+290 530 m
+280 660 l
+</path>
+<path matrix="1 0 0 1 126 -162" stroke="lightgray">
+320 580 m
+350 520 l
+290 530 l
+320 580 l
+320 580 l
+</path>
+<path matrix="1 0 0 1 126 -162" stroke="lightgray">
+320 580 m
+280 660 l
+290 530 l
+320 580 l
+320 580 l
+</path>
+<path matrix="1 0 0 1 126 -162" stroke="lightgray">
+320 580 m
+370 580 l
+350 520 l
+320 580 l
+</path>
+<text matrix="1 0 0 1 123.845 -165.501" 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 126 -162" 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 126 -162" 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 126 -162" 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 126.7 -172.154" 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 126 -162" 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 126 -162" stroke="lightgray">
+280 660 m
+300 710 l
+370 690 l
+280 660 l
+</path>
+<path matrix="1 0 0 1 126 -162" stroke="lightgray">
+320 580 m
+370 690 l
+370 580 l
+320 580 l
+</path>
+<path matrix="1 0 0 1 126 -162" stroke="lightgray">
+280 660 m
+370 690 l
+320 580 l
+280 660 l
+</path>
+<text matrix="1 0 0 1 225.859 -165.729" transformations="translations" pos="212.724 627.389" stroke="darkcyan" type="label" width="14.814" height="4.294" depth="1.49" valign="baseline">$\alpha_{42}$</text>
+<text matrix="1 0 0 1 122 -164" transformations="translations" pos="272.179 660.635" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
+<path stroke="darkcyan" pen="heavier">
+406.093 497.775 m
+446.094 418.092 l
+</path>
+<path stroke="darkcyan">
+44.5799 0 0 44.5799 425.934 457.774 e
+</path>
+<path stroke="darkcyan">
+425.854 457.774 m
+470.795 457.774 l
+</path>
+<text matrix="1 0 0 1 -48.9756 -209.799" transformations="translations" pos="380 530" stroke="darkcyan" type="label" width="231.798" height="8.965" depth="2.99" valign="baseline" size="large">[2,4] is Gabriel $\rightarrow$ $\alpha_{42}$ is not modified (NaN)
+</text>
+<path stroke="darkblue" arrow="normal/normal">
+205.028 596.091 m
+110.946 544.02 l
+</path>
+<path stroke="darkblue" arrow="normal/normal">
+280.768 588.99 m
+280.768 547.57 l
+</path>
+<path stroke="darkblue" arrow="normal/normal">
+341.123 594.316 m
+413.904 554.079 l
+</path>
+<text matrix="1 0 0 1 39.645 -2.36686" transformations="translations" pos="199.703 569.464" stroke="darkblue" type="label" width="93.206" height="7.473" depth="2.49" valign="baseline">For all faces of [4,2,0]</text>
+<text matrix="1 0 0 1 -93.391 2.68003" transformations="translations" pos="104.437 300.174" stroke="black" type="label" width="208.621" height="6.926" depth="1.93" valign="baseline">N.B. : is Gabriel on a single point has no sense.</text>
+<text matrix="1 0 0 1 -36.9231 10" transformations="translations" pos="48 784" stroke="black" type="label" width="118.324" height="7.473" depth="2.49" valign="baseline">Dimension =2 - $\sigma$ = [4,2,0]</text>
+<path stroke="darkcyan">
+247.333 430.892 m
+311.764 430.892 l
+</path>
+<use matrix="1 0 0 1 0.700256 69.8463" name="mark/fdisk(sfx)" pos="300 720" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 0 80" name="mark/fdisk(sfx)" pos="370 690" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 0 80" name="mark/fdisk(sfx)" pos="280 660" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 0 80" name="mark/fdisk(sfx)" pos="243.636 591.818" size="normal" stroke="darkcyan" fill="white"/>
+<use matrix="1 0 0 1 0 80" name="mark/fdisk(sfx)" pos="370 580" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 0 80" name="mark/fdisk(sfx)" pos="350 520" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 0 80" name="mark/fdisk(sfx)" pos="320 580" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 0 80" name="mark/fdisk(sfx)" pos="290 530" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -263.3 -172.154" name="mark/fdisk(sfx)" pos="300 720" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -264 -162" name="mark/fdisk(sfx)" pos="280 660" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -264 -162" name="mark/fdisk(sfx)" pos="370 690" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -264 -162" name="mark/fdisk(sfx)" pos="370 580" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -264 -162" name="mark/fdisk(sfx)" pos="350 520" size="normal" stroke="black" fill="white"/>
+<text matrix="1 0 0 1 -264 -162" transformations="translations" pos="352.708 510.349" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
+<use matrix="1 0 0 1 -264 -162" name="mark/fdisk(sfx)" pos="305 555" size="normal" stroke="darkcyan" fill="white"/>
+<use matrix="1 0 0 1 -264 -162" name="mark/fdisk(sfx)" pos="290 530" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -264 -162" name="mark/fdisk(sfx)" pos="320 580" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -37.2997 -174.154" name="mark/fdisk(sfx)" pos="300 720" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -38 -164" name="mark/fdisk(sfx)" pos="370 690" size="normal" stroke="black" fill="white"/>
+<text matrix="1 0 0 1 -38 -164" transformations="translations" pos="272.179 660.635" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
+<use name="mark/fdisk(sfx)" pos="247 431" size="normal" stroke="darkcyan" fill="white"/>
+<use matrix="1 0 0 1 -38 -164" name="mark/fdisk(sfx)" pos="350 520" size="normal" stroke="black" fill="white"/>
+<text matrix="1 0 0 1 -38 -164" transformations="translations" pos="352.708 510.349" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
+<use matrix="1 0 0 1 -38 -164" name="mark/fdisk(sfx)" pos="370 580" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -38 -164" name="mark/fdisk(sfx)" pos="320 580" size="normal" stroke="darkred" fill="white"/>
+<text matrix="1 0 0 1 -38 -164" transformations="translations" pos="310.693 578.759" stroke="darkred" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
+<path matrix="1 0 0 1 -38 -164" stroke="darkred" pen="heavier">
+65.192 0 0 65.192 285 595 e
+</path>
+<use matrix="1 0 0 1 -38 -164" name="mark/fdisk(sfx)" pos="290 530" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 126 -162" name="mark/fdisk(sfx)" pos="290 530" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 126.7 -172.154" name="mark/fdisk(sfx)" pos="300 720" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 126 -162" name="mark/fdisk(sfx)" pos="370 690" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 126 -162" name="mark/fdisk(sfx)" pos="280 660" size="normal" stroke="black" fill="white"/>
+<use name="mark/fdisk(sfx)" pos="425.934 457.774" size="normal" stroke="darkcyan" fill="white"/>
+<use matrix="1 0 0 1 126 -162" name="mark/fdisk(sfx)" pos="320 580" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 126 -162" name="mark/fdisk(sfx)" pos="370 580" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 126 -162" name="mark/fdisk(sfx)" pos="350 520" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -38 -164" name="mark/fdisk(sfx)" pos="280 660" size="normal" stroke="black" fill="white"/>
+</page>
+</ipe>
diff --git a/src/Alpha_complex/doc/alpha_complex_doc_420.png b/src/Alpha_complex/doc/alpha_complex_doc_420.png
new file mode 100644
index 00000000..ef7187f7
--- /dev/null
+++ b/src/Alpha_complex/doc/alpha_complex_doc_420.png
Binary files differ
diff --git a/src/Alpha_complex/doc/alpha_complex_representation.ipe b/src/Alpha_complex/doc/alpha_complex_representation.ipe
new file mode 100644
index 00000000..e8096b93
--- /dev/null
+++ b/src/Alpha_complex/doc/alpha_complex_representation.ipe
@@ -0,0 +1,321 @@
+<?xml version="1.0"?>
+<!DOCTYPE ipe SYSTEM "ipe.dtd">
+<ipe version="70107" creator="Ipe 7.1.10">
+<info created="D:20150603143945" modified="D:20160404172133"/>
+<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" fill="lightblue">
+109.771 601.912 m
+159.595 601.797 l
+140.058 541.915 l
+h
+</path>
+<path fill="lightblue">
+79.8776 552.169 m
+109.756 601.699 l
+139.812 542.209 l
+h
+</path>
+<path 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 22.1775" transformations="translations" pos="380 530" stroke="seagreen" type="label" width="76.735" height="8.307" depth="2.32" valign="baseline" size="large">Alpha complex</text>
+<text matrix="1 0 0 1 -212.333 18.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 22.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 22.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 22.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 22.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 12.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 22.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 31.9779 -58.7483" stroke="darkgray">
+58.1341 0 0 58.1341 218.925 692.601 e
+</path>
+<path matrix="1 0 0 1 29.8225 22.1775" stroke="black" pen="heavier">
+60 710 m
+40 660 l
+</path>
+<path matrix="1 0 0 1 29.8225 22.1775" stroke="black" pen="heavier">
+40 660 m
+130 690 l
+</path>
+<path matrix="1 0 0 1 29.8225 22.1775" stroke="black" pen="heavier">
+130 690 m
+60 710 l
+</path>
+<path matrix="1 0 0 1 29.8225 22.1775" stroke="black" pen="heavier">
+40 660 m
+80 580 l
+</path>
+<path matrix="1 0 0 1 29.8225 22.1775" stroke="black" pen="heavier">
+80 580 m
+130 580 l
+130 580 l
+</path>
+<path matrix="1 0 0 1 29.8225 22.1775" stroke="black" pen="heavier">
+130 580 m
+110 520 l
+</path>
+<path matrix="1 0 0 1 29.8225 22.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 22.1775" stroke="black" pen="heavier">
+50 530 m
+80 580 l
+</path>
+<path matrix="1 0 0 1 29.8225 22.1775" stroke="black" pen="heavier">
+130 580 m
+130 690 l
+</path>
+<use matrix="1 0 0 1 142.618 -109.867" name="mark/fdisk(sfx)" pos="108.285 743.72" size="normal" stroke="darkgray" fill="white"/>
+<path matrix="1 0 0 1 142.618 -109.867" stroke="darkgray">
+108.275 743.531 m
+166.45 743.531 l
+</path>
+<text matrix="1 0 0 1 142.618 -109.867" transformations="translations" pos="127.397 746.763" stroke="darkgray" type="label" width="6.41" height="4.289" depth="0" valign="baseline">$\alpha$</text>
+<use matrix="1 0 0 1 -209.478 12.0238" name="mark/fdisk(sfx)" pos="300 720" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -210.178 22.1775" name="mark/fdisk(sfx)" pos="280 660" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -210.178 22.1775" name="mark/fdisk(sfx)" pos="370 690" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -210.178 22.1775" name="mark/fdisk(sfx)" pos="370 580" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -210.178 22.1775" name="mark/fdisk(sfx)" pos="290 530" size="normal" stroke="black" fill="white"/>
+<path matrix="1 0 0 1 -40 -8" stroke="black" pen="heavier">
+150.038 609.9 m
+179.929 549.727 l
+</path>
+<use matrix="1 0 0 1 -210.178 22.1775" name="mark/fdisk(sfx)" pos="320 580" size="normal" stroke="black" fill="white"/>
+<use matrix="1 0 0 1 -210.178 22.1775" name="mark/fdisk(sfx)" pos="350 520" size="normal" stroke="black" fill="white"/>
+</page>
+</ipe>
diff --git a/src/Alpha_complex/doc/alpha_complex_representation.png b/src/Alpha_complex/doc/alpha_complex_representation.png
new file mode 100644
index 00000000..7b81cd69
--- /dev/null
+++ b/src/Alpha_complex/doc/alpha_complex_representation.png
Binary files differ
diff --git a/src/Alpha_complex/example/Alpha_complex_from_off.cpp b/src/Alpha_complex/example/Alpha_complex_from_off.cpp
new file mode 100644
index 00000000..7836d59a
--- /dev/null
+++ b/src/Alpha_complex/example/Alpha_complex_from_off.cpp
@@ -0,0 +1,56 @@
+#include <gudhi/Alpha_complex.h>
+#include <CGAL/Epick_d.h>
+
+#include <iostream>
+#include <string>
+
+void usage(int nbArgs, char * const progName) {
+ std::cerr << "Error: Number of arguments (" << nbArgs << ") is not correct\n";
+ std::cerr << "Usage: " << progName << " filename.off alpha_square_max_value [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 != 3) && (argc != 4)) usage(argc, (argv[0] - 1));
+
+ 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);
+
+ std::streambuf* streambufffer;
+ std::ofstream ouput_file_stream;
+
+ if (argc == 4) {
+ ouput_file_stream.open(std::string(argv[3]));
+ streambufffer = ouput_file_stream.rdbuf();
+ } else {
+ 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 << " ";
+ }
+ output_stream << ") -> " << "[" << alpha_complex_from_file.filtration(f_simplex) << "] ";
+ output_stream << std::endl;
+ }
+ ouput_file_stream.close();
+ return 0;
+}
diff --git a/src/Alpha_complex/example/Alpha_complex_from_points.cpp b/src/Alpha_complex/example/Alpha_complex_from_points.cpp
new file mode 100644
index 00000000..49f77276
--- /dev/null
+++ b/src/Alpha_complex/example/Alpha_complex_from_points.cpp
@@ -0,0 +1,62 @@
+#include <CGAL/Epick_d.h>
+#include <gudhi/Alpha_complex.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;
+
+void usage(int nbArgs, char * const progName) {
+ std::cerr << "Error: Number of arguments (" << nbArgs << ") is not correct\n";
+ std::cerr << "Usage: " << progName << " [alpha_square_max_value]\n";
+ std::cerr << " i.e.: " << progName << " 60.0\n";
+ exit(-1); // ----- >>
+}
+
+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();
+ if (argc == 2)
+ alpha_square_max_value = atof(argv[1]);
+
+ // ----------------------------------------------------------------------------
+ // Init of a list of points
+ // ----------------------------------------------------------------------------
+ Vector_of_points points;
+ points.push_back(Point(1.0, 1.0));
+ points.push_back(Point(7.0, 0.0));
+ points.push_back(Point(4.0, 6.0));
+ points.push_back(Point(9.0, 6.0));
+ points.push_back(Point(0.0, 14.0));
+ points.push_back(Point(2.0, 19.0));
+ points.push_back(Point(9.0, 17.0));
+
+ // ----------------------------------------------------------------------------
+ // 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);
+
+ // ----------------------------------------------------------------------------
+ // 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 << " ";
+ }
+ std::cout << ") -> " << "[" << alpha_complex_from_points.filtration(f_simplex) << "] ";
+ std::cout << std::endl;
+ }
+ return 0;
+}
diff --git a/src/Alpha_complex/example/CMakeLists.txt b/src/Alpha_complex/example/CMakeLists.txt
new file mode 100644
index 00000000..71a95d61
--- /dev/null
+++ b/src/Alpha_complex/example/CMakeLists.txt
@@ -0,0 +1,33 @@
+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()
+
+ 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(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)
diff --git a/src/Alpha_complex/example/alphaoffreader_for_doc_32.txt b/src/Alpha_complex/example/alphaoffreader_for_doc_32.txt
new file mode 100644
index 00000000..13183e86
--- /dev/null
+++ b/src/Alpha_complex/example/alphaoffreader_for_doc_32.txt
@@ -0,0 +1,22 @@
+Alpha complex is of dimension 2 - 20 simplices - 7 vertices.
+Iterator on alpha 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 ) -> [6.25]
+ ( 5 4 ) -> [7.25]
+ ( 2 0 ) -> [8.5]
+ ( 1 0 ) -> [9.25]
+ ( 3 1 ) -> [10]
+ ( 2 1 ) -> [11.25]
+ ( 3 2 1 ) -> [12.5]
+ ( 2 1 0 ) -> [12.9959]
+ ( 6 5 ) -> [13.25]
+ ( 4 2 ) -> [20]
+ ( 6 4 ) -> [22.7367]
+ ( 6 5 4 ) -> [22.7367]
+ ( 6 3 ) -> [30.25]
diff --git a/src/Alpha_complex/example/alphaoffreader_for_doc_60.txt b/src/Alpha_complex/example/alphaoffreader_for_doc_60.txt
new file mode 100644
index 00000000..71f29a00
--- /dev/null
+++ b/src/Alpha_complex/example/alphaoffreader_for_doc_60.txt
@@ -0,0 +1,27 @@
+Alpha complex is of dimension 2 - 25 simplices - 7 vertices.
+Iterator on alpha 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 ) -> [6.25]
+ ( 5 4 ) -> [7.25]
+ ( 2 0 ) -> [8.5]
+ ( 1 0 ) -> [9.25]
+ ( 3 1 ) -> [10]
+ ( 2 1 ) -> [11.25]
+ ( 3 2 1 ) -> [12.5]
+ ( 2 1 0 ) -> [12.9959]
+ ( 6 5 ) -> [13.25]
+ ( 4 2 ) -> [20]
+ ( 6 4 ) -> [22.7367]
+ ( 6 5 4 ) -> [22.7367]
+ ( 6 3 ) -> [30.25]
+ ( 6 2 ) -> [36.5]
+ ( 6 3 2 ) -> [36.5]
+ ( 6 4 2 ) -> [37.2449]
+ ( 4 0 ) -> [59.7107]
+ ( 4 2 0 ) -> [59.7107]
diff --git a/src/Alpha_complex/include/gudhi/Alpha_complex.h b/src/Alpha_complex/include/gudhi/Alpha_complex.h
new file mode 100644
index 00000000..2c95ceb4
--- /dev/null
+++ b/src/Alpha_complex/include/gudhi/Alpha_complex.h
@@ -0,0 +1,419 @@
+/* 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 alpha_complex {
+
+/**
+ * \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 (std::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)=" << std::isnan(filtration(f_boundary)) << std::endl;
+#endif // DEBUG_TRACES
+ // ### If filt(Tau) is not NaN
+ if (!std::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 alpha_complex
+
+namespace alphacomplex = alpha_complex;
+
+} // namespace Gudhi
+
+#endif // ALPHA_COMPLEX_H_
diff --git a/src/Alpha_complex/test/Alpha_complex_unit_test.cpp b/src/Alpha_complex/test/Alpha_complex_unit_test.cpp
new file mode 100644
index 00000000..4d7bf622
--- /dev/null
+++ b/src/Alpha_complex/test/Alpha_complex_unit_test.cpp
@@ -0,0 +1,243 @@
+/* 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/>.
+ */
+
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_MODULE "alpha_complex"
+#include <boost/test/unit_test.hpp>
+
+#include <CGAL/Delaunay_triangulation.h>
+#include <CGAL/Epick_d.h>
+
+#include <cmath> // float comparison
+#include <limits>
+#include <string>
+#include <vector>
+
+#include <gudhi/Alpha_complex.h>
+
+// Use dynamic_dimension_tag for the user to be able to set dimension
+typedef CGAL::Epick_d< CGAL::Dynamic_dimension_tag > Kernel_d;
+// The triangulation uses the default instantiation of the TriangulationDataStructure template parameter
+
+BOOST_AUTO_TEST_CASE(ALPHA_DOC_OFF_file) {
+ // ----------------------------------------------------------------------------
+ //
+ // Init of an alpha-complex from a OFF file
+ //
+ // ----------------------------------------------------------------------------
+ std::string off_file_name("alphacomplexdoc.off");
+ double max_alpha_square_value = 60.0;
+ std::cout << "========== OFF FILE NAME = " << off_file_name << " - alpha²=" <<
+ max_alpha_square_value << "==========" << std::endl;
+
+ Gudhi::alpha_complex::Alpha_complex<Kernel_d> alpha_complex_from_file(off_file_name, max_alpha_square_value);
+
+ const int DIMENSION = 2;
+ std::cout << "alpha_complex_from_file.dimension()=" << alpha_complex_from_file.dimension() << std::endl;
+ BOOST_CHECK(alpha_complex_from_file.dimension() == DIMENSION);
+
+ const int NUMBER_OF_VERTICES = 7;
+ std::cout << "alpha_complex_from_file.num_vertices()=" << alpha_complex_from_file.num_vertices() << std::endl;
+ BOOST_CHECK(alpha_complex_from_file.num_vertices() == NUMBER_OF_VERTICES);
+
+ const int NUMBER_OF_SIMPLICES = 25;
+ std::cout << "alpha_complex_from_file.num_simplices()=" << alpha_complex_from_file.num_simplices() << std::endl;
+ BOOST_CHECK(alpha_complex_from_file.num_simplices() == NUMBER_OF_SIMPLICES);
+
+}
+
+BOOST_AUTO_TEST_CASE(ALPHA_DOC_OFF_file_filtered) {
+ // ----------------------------------------------------------------------------
+ //
+ // Init of an alpha-complex from a OFF file
+ //
+ // ----------------------------------------------------------------------------
+ std::string off_file_name("alphacomplexdoc.off");
+ double max_alpha_square_value = 59.0;
+ std::cout << "========== OFF FILE NAME = " << off_file_name << " - alpha²=" <<
+ max_alpha_square_value << "==========" << std::endl;
+
+ // Use of the default dynamic kernel
+ Gudhi::alpha_complex::Alpha_complex<> alpha_complex_from_file(off_file_name, max_alpha_square_value);
+
+ const int DIMENSION = 2;
+ std::cout << "alpha_complex_from_file.dimension()=" << alpha_complex_from_file.dimension() << std::endl;
+ BOOST_CHECK(alpha_complex_from_file.dimension() == DIMENSION);
+
+ const int NUMBER_OF_VERTICES = 7;
+ std::cout << "alpha_complex_from_file.num_vertices()=" << alpha_complex_from_file.num_vertices() << std::endl;
+ BOOST_CHECK(alpha_complex_from_file.num_vertices() == NUMBER_OF_VERTICES);
+
+ const int NUMBER_OF_SIMPLICES = 23;
+ std::cout << "alpha_complex_from_file.num_simplices()=" << alpha_complex_from_file.num_simplices() << std::endl;
+ BOOST_CHECK(alpha_complex_from_file.num_simplices() == NUMBER_OF_SIMPLICES);
+}
+
+bool are_almost_the_same(float a, float b) {
+ return std::fabs(a - b) < std::numeric_limits<float>::epsilon();
+}
+
+// Use dynamic_dimension_tag for the user to be able to set dimension
+typedef CGAL::Epick_d< CGAL::Dimension_tag<4> > Kernel_s;
+typedef Kernel_s::Point_d Point;
+typedef std::vector<Point> Vector_of_points;
+
+
+bool is_point_in_list(Vector_of_points points_list, Point point) {
+ for (auto& point_in_list : points_list) {
+ if (point_in_list == point) {
+ return true; // point found
+ }
+ }
+ return false; // point not found
+}
+
+BOOST_AUTO_TEST_CASE(Alpha_complex_from_points) {
+ // ----------------------------------------------------------------------------
+ // Init of a list of points
+ // ----------------------------------------------------------------------------
+ Vector_of_points points;
+ std::vector<double> coords = { 0.0, 0.0, 0.0, 1.0 };
+ points.push_back(Point(coords.begin(), coords.end()));
+ coords = { 0.0, 0.0, 1.0, 0.0 };
+ points.push_back(Point(coords.begin(), coords.end()));
+ coords = { 0.0, 1.0, 0.0, 0.0 };
+ points.push_back(Point(coords.begin(), coords.end()));
+ coords = { 1.0, 0.0, 0.0, 0.0 };
+ points.push_back(Point(coords.begin(), coords.end()));
+
+ // ----------------------------------------------------------------------------
+ // Init of an alpha complex from the list of points
+ // ----------------------------------------------------------------------------
+ Gudhi::alpha_complex::Alpha_complex<Kernel_s> alpha_complex_from_points(points);
+
+ std::cout << "========== Alpha_complex_from_points ==========" << std::endl;
+
+ // Another way to check num_simplices
+ std::cout << "Iterator on alpha complex simplices in the filtration order, with [filtration value]:" << std::endl;
+ int num_simplices = 0;
+ for (auto f_simplex : alpha_complex_from_points.filtration_simplex_range()) {
+ num_simplices++;
+ std::cout << " ( ";
+ for (auto vertex : alpha_complex_from_points.simplex_vertex_range(f_simplex)) {
+ std::cout << vertex << " ";
+ }
+ std::cout << ") -> " << "[" << alpha_complex_from_points.filtration(f_simplex) << "] ";
+ std::cout << std::endl;
+ }
+ BOOST_CHECK(num_simplices == 15);
+ std::cout << "alpha_complex_from_points.num_simplices()=" << alpha_complex_from_points.num_simplices() << std::endl;
+ BOOST_CHECK(alpha_complex_from_points.num_simplices() == 15);
+
+ std::cout << "alpha_complex_from_points.dimension()=" << alpha_complex_from_points.dimension() << std::endl;
+ BOOST_CHECK(alpha_complex_from_points.dimension() == 4);
+ std::cout << "alpha_complex_from_points.num_vertices()=" << alpha_complex_from_points.num_vertices() << std::endl;
+ BOOST_CHECK(alpha_complex_from_points.num_vertices() == 4);
+
+ for (auto f_simplex : alpha_complex_from_points.filtration_simplex_range()) {
+ switch (alpha_complex_from_points.dimension(f_simplex)) {
+ case 0:
+ BOOST_CHECK(are_almost_the_same(alpha_complex_from_points.filtration(f_simplex), 0.0));
+ break;
+ case 1:
+ BOOST_CHECK(are_almost_the_same(alpha_complex_from_points.filtration(f_simplex), 1.0/2.0));
+ break;
+ case 2:
+ BOOST_CHECK(are_almost_the_same(alpha_complex_from_points.filtration(f_simplex), 2.0/3.0));
+ break;
+ case 3:
+ BOOST_CHECK(are_almost_the_same(alpha_complex_from_points.filtration(f_simplex), 3.0/4.0));
+ break;
+ default:
+ BOOST_CHECK(false); // Shall not happen
+ break;
+ }
+ }
+
+ Point p0 = alpha_complex_from_points.get_point(0);
+ std::cout << "alpha_complex_from_points.get_point(0)=" << p0 << std::endl;
+ BOOST_CHECK(4 == p0.dimension());
+ BOOST_CHECK(is_point_in_list(points, p0));
+
+ Point p1 = alpha_complex_from_points.get_point(1);
+ std::cout << "alpha_complex_from_points.get_point(1)=" << p1 << std::endl;
+ BOOST_CHECK(4 == p1.dimension());
+ BOOST_CHECK(is_point_in_list(points, p1));
+
+ Point p2 = alpha_complex_from_points.get_point(2);
+ std::cout << "alpha_complex_from_points.get_point(2)=" << p2 << std::endl;
+ BOOST_CHECK(4 == p2.dimension());
+ BOOST_CHECK(is_point_in_list(points, p2));
+
+ Point p3 = alpha_complex_from_points.get_point(3);
+ std::cout << "alpha_complex_from_points.get_point(3)=" << p3 << std::endl;
+ BOOST_CHECK(4 == p3.dimension());
+ BOOST_CHECK(is_point_in_list(points, p3));
+
+ // Test to the limit
+ BOOST_CHECK_THROW (alpha_complex_from_points.get_point(4), std::out_of_range);
+ BOOST_CHECK_THROW (alpha_complex_from_points.get_point(-1), std::out_of_range);
+ BOOST_CHECK_THROW (alpha_complex_from_points.get_point(1234), std::out_of_range);
+
+ // Test after prune_above_filtration
+ bool modified = alpha_complex_from_points.prune_above_filtration(0.6);
+ if (modified) {
+ alpha_complex_from_points.initialize_filtration();
+ }
+ BOOST_CHECK(modified);
+
+ // Another way to check num_simplices
+ std::cout << "Iterator on alpha complex simplices in the filtration order, with [filtration value]:" << std::endl;
+ num_simplices = 0;
+ for (auto f_simplex : alpha_complex_from_points.filtration_simplex_range()) {
+ num_simplices++;
+ std::cout << " ( ";
+ for (auto vertex : alpha_complex_from_points.simplex_vertex_range(f_simplex)) {
+ std::cout << vertex << " ";
+ }
+ std::cout << ") -> " << "[" << alpha_complex_from_points.filtration(f_simplex) << "] ";
+ std::cout << std::endl;
+ }
+ BOOST_CHECK(num_simplices == 10);
+ std::cout << "alpha_complex_from_points.num_simplices()=" << alpha_complex_from_points.num_simplices() << std::endl;
+ BOOST_CHECK(alpha_complex_from_points.num_simplices() == 10);
+
+ std::cout << "alpha_complex_from_points.dimension()=" << alpha_complex_from_points.dimension() << std::endl;
+ BOOST_CHECK(alpha_complex_from_points.dimension() == 4);
+ std::cout << "alpha_complex_from_points.num_vertices()=" << alpha_complex_from_points.num_vertices() << std::endl;
+ BOOST_CHECK(alpha_complex_from_points.num_vertices() == 4);
+
+ for (auto f_simplex : alpha_complex_from_points.filtration_simplex_range()) {
+ switch (alpha_complex_from_points.dimension(f_simplex)) {
+ case 0:
+ BOOST_CHECK(are_almost_the_same(alpha_complex_from_points.filtration(f_simplex), 0.0));
+ break;
+ case 1:
+ BOOST_CHECK(are_almost_the_same(alpha_complex_from_points.filtration(f_simplex), 1.0/2.0));
+ break;
+ default:
+ BOOST_CHECK(false); // Shall not happen
+ break;
+ }
+ }
+
+}
diff --git a/src/Alpha_complex/test/CMakeLists.txt b/src/Alpha_complex/test/CMakeLists.txt
new file mode 100644
index 00000000..b0723a41
--- /dev/null
+++ b/src/Alpha_complex/test/CMakeLists.txt
@@ -0,0 +1,38 @@
+cmake_minimum_required(VERSION 2.6)
+project(Alpha_complex_tests)
+
+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()
+
+# 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 ( AlphaComplexUT Alpha_complex_unit_test.cpp )
+ target_link_libraries(AlphaComplexUT ${Boost_SYSTEM_LIBRARY} ${Boost_THREAD_LIBRARY} ${CGAL_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
+ if (TBB_FOUND)
+ target_link_libraries(AlphaComplexUT ${TBB_LIBRARIES})
+ endif()
+
+ # 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(AlphaComplexUT ${CMAKE_CURRENT_BINARY_DIR}/AlphaComplexUT
+ # XML format for Jenkins xUnit plugin
+ --log_format=XML --log_sink=${CMAKE_SOURCE_DIR}/AlphaComplexUT.xml --log_level=test_suite --report_level=no)
+
+ else()
+ message(WARNING "Eigen3 not found. Version 3.1.0 is required for Alpha complex unitary tests.")
+ endif()
+ else()
+ message(WARNING "CGAL version: ${CGAL_VERSION} is too old to compile Alpha complex unitary tests. Version 4.7.0 is required.")
+ endif ()
+endif()
+
diff --git a/src/Alpha_shapes/test/README b/src/Alpha_complex/test/README
index cddd46ca..45b87d91 100644
--- a/src/Alpha_shapes/test/README
+++ b/src/Alpha_complex/test/README
@@ -1,14 +1,12 @@
To compile:
***********
-cd /path-to-gudhi/
cmake .
-cd /path-to-test/
make
To launch with details:
***********************
-./AlphaShapesUT --report_level=detailed --log_level=all
+./AlphaComplexUnitTest --report_level=detailed --log_level=all
==> echo $? returns 0 in case of success (non-zero otherwise)
diff --git a/src/Alpha_shapes/example/CMakeLists.txt b/src/Alpha_shapes/example/CMakeLists.txt
deleted file mode 100644
index 8692c7a7..00000000
--- a/src/Alpha_shapes/example/CMakeLists.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-project(GUDHIAlphaShapesExample)
-
-# need CGAL 4.6
-# cmake -DCGAL_DIR=~/workspace/CGAL-4.6-beta1 ../../..
-if(CGAL_FOUND)
- if (NOT CGAL_VERSION VERSION_LESS 4.6.0)
- message(STATUS "CGAL version: ${CGAL_VERSION}.")
-
- include( ${CGAL_USE_FILE} )
-
- if(NOT MSVC)
- include(CheckCXXCompilerFlag)
- CHECK_CXX_COMPILER_FLAG(-std=c++11 COMPILER_SUPPORTS_CXX11)
- if(COMPILER_SUPPORTS_CXX11)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
- endif()
- endif()
- # - End of workaround
-
- find_package(Eigen3 3.1.0)
- if (EIGEN3_FOUND)
- message(STATUS "Eigen3 version: ${EIGEN3_VERSION}.")
- include( ${EIGEN3_USE_FILE} )
- include_directories (BEFORE "../../include")
-
- add_executable ( dtoffrw Delaunay_triangulation_off_rw.cpp )
- target_link_libraries(dtoffrw ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY})
- add_test(dtoffrw_tore3D ${CMAKE_CURRENT_BINARY_DIR}/dtoffrw ${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off 3)
-
- #add_definitions(-DDEBUG_TRACES)
- add_executable ( stfromdt Simplex_tree_from_delaunay_triangulation.cpp )
- target_link_libraries(stfromdt ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY})
- else()
- message(WARNING "Eigen3 not found. Version 3.1.0 is required for Alpha shapes feature.")
- endif()
- else()
- message(WARNING "CGAL version: ${CGAL_VERSION} is too old to compile Alpha shapes feature. Version 4.6.0 is required.")
- endif ()
-endif()
diff --git a/src/Alpha_shapes/example/Delaunay_triangulation_off_rw.cpp b/src/Alpha_shapes/example/Delaunay_triangulation_off_rw.cpp
deleted file mode 100644
index 03f6440d..00000000
--- a/src/Alpha_shapes/example/Delaunay_triangulation_off_rw.cpp
+++ /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): 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/>.
- */
-
-// to construct a Delaunay_triangulation from a OFF file
-#include "gudhi/Alpha_shapes/Delaunay_triangulation_off_io.h"
-
-#include <CGAL/Delaunay_triangulation.h>
-#include <CGAL/Epick_d.h>
-#include <CGAL/point_generators_d.h>
-#include <CGAL/algorithm.h>
-#include <CGAL/assertions.h>
-
-#include <iostream>
-#include <iterator>
-#include <vector>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string>
-
-// Use dynamic_dimension_tag for the user to be able to set dimension
-typedef CGAL::Epick_d< CGAL::Dynamic_dimension_tag > K;
-typedef CGAL::Delaunay_triangulation<K> T;
-// The triangulation uses the default instanciation of the
-// TriangulationDataStructure template parameter
-
-void usage(char * const progName) {
- std::cerr << "Usage: " << progName << " filename.off dimension" << std::endl;
- exit(-1); // ----- >>
-}
-
-int main(int argc, char **argv) {
- if (argc != 3) {
- std::cerr << "Error: Number of arguments (" << argc << ") is not correct" << std::endl;
- usage(argv[0]);
- }
-
- int dimension = 0;
- int returnedScanValue = sscanf(argv[2], "%d", &dimension);
- if ((returnedScanValue == EOF) || (dimension <= 0)) {
- std::cerr << "Error: " << argv[2] << " is not correct" << std::endl;
- usage(argv[0]);
- }
-
- T dt(dimension);
- std::string offFileName(argv[1]);
- Gudhi::alphashapes::Delaunay_triangulation_off_reader<T> off_reader(offFileName, dt, true, true);
- if (!off_reader.is_valid()) {
- std::cerr << "Unable to read file " << offFileName << std::endl;
- exit(-1); // ----- >>
- }
-
- std::cout << "number of vertices=" << dt.number_of_vertices() << std::endl;
- std::cout << "number of full cells=" << dt.number_of_full_cells() << std::endl;
- std::cout << "number of finite full cells=" << dt.number_of_finite_full_cells() << std::endl;
-
- // Points list
- /*for (T::Vertex_iterator vit = dt.vertices_begin(); vit != dt.vertices_end(); ++vit) {
- for (auto Coord = vit->point().cartesian_begin(); Coord != vit->point().cartesian_end(); ++Coord) {
- std::cout << *Coord << " ";
- }
- std::cout << std::endl;
- }
- std::cout << std::endl;*/
-
- int i = 0, j = 0;
- typedef T::Full_cell_iterator Full_cell_iterator;
- typedef T::Facet Facet;
-
- for (Full_cell_iterator cit = dt.full_cells_begin(); cit != dt.full_cells_end(); ++cit) {
- if (!dt.is_infinite(cit)) {
- j++;
- continue;
- }
- Facet fct(cit, cit->index(dt.infinite_vertex()));
- i++;
- }
- std::cout << "There are " << i << " facets on the convex hull." << std::endl;
- std::cout << "There are " << j << " facets not on the convex hull." << std::endl;
-
-
- std::string offOutputFile("out.off");
- Gudhi::alphashapes::Delaunay_triangulation_off_writer<T> off_writer(offOutputFile, dt);
-
- return 0;
-} \ No newline at end of file
diff --git a/src/Alpha_shapes/example/Simplex_tree_from_delaunay_triangulation.cpp b/src/Alpha_shapes/example/Simplex_tree_from_delaunay_triangulation.cpp
deleted file mode 100644
index 3a17b519..00000000
--- a/src/Alpha_shapes/example/Simplex_tree_from_delaunay_triangulation.cpp
+++ /dev/null
@@ -1,103 +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) 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/>.
- */
-
-// to construct a Delaunay_triangulation from a OFF file
-#include "gudhi/Alpha_shapes/Delaunay_triangulation_off_io.h"
-#include "gudhi/Alpha_shapes.h"
-
-// to construct a simplex_tree from Delaunay_triangulation
-#include "gudhi/graph_simplicial_complex.h"
-#include "gudhi/Simplex_tree.h"
-
-#include <CGAL/Delaunay_triangulation.h>
-#include <CGAL/Epick_d.h>
-#include <CGAL/point_generators_d.h>
-#include <CGAL/algorithm.h>
-#include <CGAL/assertions.h>
-
-#include <iostream>
-#include <iterator>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string>
-
-// Use dynamic_dimension_tag for the user to be able to set dimension
-typedef CGAL::Epick_d< CGAL::Dynamic_dimension_tag > K;
-typedef CGAL::Delaunay_triangulation<K> T;
-// The triangulation uses the default instanciation of the
-// TriangulationDataStructure template parameter
-
-void usage(char * const progName) {
- std::cerr << "Usage: " << progName << " filename.off dimension" << std::endl;
- exit(-1); // ----- >>
-}
-
-int main(int argc, char **argv) {
- if (argc != 3) {
- std::cerr << "Error: Number of arguments (" << argc << ") is not correct" << std::endl;
- usage(argv[0]);
- }
-
- int dimension = 0;
- int returnedScanValue = sscanf(argv[2], "%d", &dimension);
- if ((returnedScanValue == EOF) || (dimension <= 0)) {
- std::cerr << "Error: " << argv[2] << " is not correct" << std::endl;
- usage(argv[0]);
- }
-
- // ----------------------------------------------------------------------------
- //
- // Init of an alpha-shape from a Delaunay triangulation
- //
- // ----------------------------------------------------------------------------
- T dt(dimension);
- std::string off_file_name(argv[1]);
-
- Gudhi::alphashapes::Delaunay_triangulation_off_reader<T> off_reader(off_file_name, dt, false, false);
- if (!off_reader.is_valid()) {
- std::cerr << "Unable to read file " << off_file_name << std::endl;
- exit(-1); // ----- >>
- }
-
- std::cout << "number of vertices=" << dt.number_of_vertices() << std::endl;
- std::cout << "number of full cells=" << dt.number_of_full_cells() << std::endl;
- std::cout << "number of finite full cells=" << dt.number_of_finite_full_cells() << std::endl;
-
- Gudhi::alphashapes::Alpha_shapes alpha_shapes_from_dt(dt);
- //std::cout << alpha_shapes_from_dt << std::endl;
-
- // ----------------------------------------------------------------------------
- //
- // Init of an alpha-shape from a OFF file
- //
- // ----------------------------------------------------------------------------
- Gudhi::alphashapes::Alpha_shapes alpha_shapes_from_file(off_file_name, dimension);
- //std::cout << alpha_shapes_from_file << std::endl;
-
- std::cout << "alpha_shapes_from_file.dimension()=" << alpha_shapes_from_file.dimension() << std::endl;
- std::cout << "alpha_shapes_from_file.filtration()=" << alpha_shapes_from_file.filtration() << std::endl;
- std::cout << "alpha_shapes_from_file.num_simplices()=" << alpha_shapes_from_file.num_simplices() << std::endl;
- std::cout << "alpha_shapes_from_file.num_vertices()=" << alpha_shapes_from_file.num_vertices() << std::endl;
-
- return 0;
-} \ No newline at end of file
diff --git a/src/Alpha_shapes/include/gudhi/Alpha_shapes.h b/src/Alpha_shapes/include/gudhi/Alpha_shapes.h
deleted file mode 100644
index b8efdb4d..00000000
--- a/src/Alpha_shapes/include/gudhi/Alpha_shapes.h
+++ /dev/null
@@ -1,200 +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 SRC_ALPHA_SHAPES_INCLUDE_GUDHI_ALPHA_SHAPES_H_
-#define SRC_ALPHA_SHAPES_INCLUDE_GUDHI_ALPHA_SHAPES_H_
-
-// to construct a Delaunay_triangulation from a OFF file
-#include <gudhi/Alpha_shapes/Delaunay_triangulation_off_io.h>
-
-// to construct a simplex_tree from Delaunay_triangulation
-#include <gudhi/graph_simplicial_complex.h>
-#include <gudhi/Simplex_tree.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <CGAL/Delaunay_triangulation.h>
-#include <CGAL/Epick_d.h>
-#include <CGAL/algorithm.h>
-#include <CGAL/assertions.h>
-
-#include <iostream>
-#include <iterator>
-#include <vector>
-#include <string>
-
-namespace Gudhi {
-
-namespace alphashapes {
-
-/** \defgroup alpha_shapes Alpha shapes in dimension N
- *
- <DT>Implementations:</DT>
- Alpha shapes in dimension N are a subset of Delaunay Triangulation in dimension N.
-
-
- * \author Vincent Rouvreau
- * \version 1.0
- * \date 2015
- * \copyright GNU General Public License v3.
- * @{
- */
-
-/**
- * \brief Alpha shapes data structure.
- *
- * \details Every simplex \f$[v_0, \cdots ,v_d]\f$ admits a canonical orientation
- * induced by the order relation on vertices \f$ v_0 < \cdots < v_d \f$.
- *
- * Details may be found in \cite boissonnatmariasimplextreealgorithmica.
- *
- * \implements FilteredComplex
- *
- */
-class Alpha_shapes {
- private:
- // From Simplex_tree
- /** \brief Type required to insert into a simplex_tree (with or without subfaces).*/
- typedef std::vector<Vertex_handle> typeVectorVertex;
-
- // From CGAL
- /** \brief Kernel for the Delaunay_triangulation.
- * Dimension can be set dynamically.
- */
- typedef CGAL::Epick_d< CGAL::Dynamic_dimension_tag > Kernel;
- /** \brief Delaunay_triangulation type required to create an alpha-shape.
- */
- typedef CGAL::Delaunay_triangulation<Kernel> Delaunay_triangulation;
-
- private:
- /** \brief Upper bound on the simplex tree of the simplicial complex.*/
- Gudhi::Simplex_tree<> _st;
-
- public:
-
- Alpha_shapes(std::string off_file_name, int dimension) {
- Delaunay_triangulation dt(dimension);
- Gudhi::alphashapes::Delaunay_triangulation_off_reader<Delaunay_triangulation>
- off_reader(off_file_name, dt, true, true);
- if (!off_reader.is_valid()) {
- std::cerr << "Unable to read file " << off_file_name << std::endl;
- exit(-1); // ----- >>
- }
-#ifdef DEBUG_TRACES
- std::cout << "number of vertices=" << dt.number_of_vertices() << std::endl;
- std::cout << "number of full cells=" << dt.number_of_full_cells() << std::endl;
- std::cout << "number of finite full cells=" << dt.number_of_finite_full_cells() << std::endl;
-#endif // DEBUG_TRACES
- init<Delaunay_triangulation>(dt);
- }
-
- template<typename T>
- Alpha_shapes(T triangulation) {
- init<T>(triangulation);
- }
-
- ~Alpha_shapes() { }
-
- private:
-
- template<typename T>
- void init(T triangulation) {
- _st.set_dimension(triangulation.maximal_dimension());
- _st.set_filtration(0.0);
- // triangulation points list
- for (auto vit = triangulation.finite_vertices_begin();
- vit != triangulation.finite_vertices_end(); ++vit) {
- typeVectorVertex vertexVector;
- Vertex_handle vertexHdl = std::distance(triangulation.finite_vertices_begin(), vit);
- vertexVector.push_back(vertexHdl);
-
- // Insert each point in the simplex tree
- _st.insert_simplex(vertexVector, 0.0);
-
-#ifdef DEBUG_TRACES
- std::cout << "P" << vertexHdl << ":";
- for (auto Coord = vit->point().cartesian_begin(); Coord != vit->point().cartesian_end(); ++Coord) {
- std::cout << *Coord << " ";
- }
- std::cout << std::endl;
-#endif // DEBUG_TRACES
- }
- // triangulation finite full cells list
- for (auto cit = triangulation.finite_full_cells_begin();
- cit != triangulation.finite_full_cells_end(); ++cit) {
- typeVectorVertex vertexVector;
- for (auto vit = cit->vertices_begin(); vit != cit->vertices_end(); ++vit) {
- // Vertex handle is distance - 1
- Vertex_handle vertexHdl = std::distance(triangulation.vertices_begin(), *vit) - 1;
- vertexVector.push_back(vertexHdl);
- }
- // Insert each point in the simplex tree
- _st.insert_simplex_and_subfaces(vertexVector, 0.0);
-
-#ifdef DEBUG_TRACES
- std::cout << "C" << std::distance(triangulation.finite_full_cells_begin(), cit) << ":";
- for (auto value : vertexVector) {
- std::cout << value << ' ';
- }
- std::cout << std::endl;
-#endif // DEBUG_TRACES
- }
- }
-
- public:
-
- /** \brief Returns the number of vertices in the complex. */
- size_t num_vertices() {
- return _st.num_vertices();
- }
-
- /** \brief Returns the number of simplices in the complex.
- *
- * Does not count the empty simplex. */
- const unsigned int& num_simplices() const {
- return _st.num_simplices();
- }
-
- /** \brief Returns an upper bound on the dimension of the simplicial complex. */
- int dimension() {
- return _st.dimension();
- }
-
- /** \brief Returns an upper bound of the filtration values of the simplices. */
- Filtration_value filtration() {
- return _st.filtration();
- }
-
- friend std::ostream& operator<<(std::ostream& os, const Alpha_shapes& alpha_shape) {
- // TODO: Program terminated with signal SIGABRT, Aborted - Maybe because of copy constructor
- Gudhi::Simplex_tree<> st = alpha_shape._st;
- os << st << std::endl;
- return os;
- }
-};
-
-} // namespace alphashapes
-
-} // namespace Gudhi
-
-#endif // SRC_ALPHA_SHAPES_INCLUDE_GUDHI_ALPHA_SHAPES_H_
diff --git a/src/Alpha_shapes/include/gudhi/Alpha_shapes/Delaunay_triangulation_off_io.h b/src/Alpha_shapes/include/gudhi/Alpha_shapes/Delaunay_triangulation_off_io.h
deleted file mode 100644
index 693b393e..00000000
--- a/src/Alpha_shapes/include/gudhi/Alpha_shapes/Delaunay_triangulation_off_io.h
+++ /dev/null
@@ -1,213 +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 SRC_ALPHA_SHAPES_INCLUDE_GUDHI_ALPHA_SHAPES_DELAUNAY_TRIANGULATION_OFF_IO_H_
-#define SRC_ALPHA_SHAPES_INCLUDE_GUDHI_ALPHA_SHAPES_DELAUNAY_TRIANGULATION_OFF_IO_H_
-
-#include <string>
-#include <vector>
-#include <fstream>
-
-#include "gudhi/Off_reader.h"
-
-namespace Gudhi {
-
-namespace alphashapes {
-
-/**
- *@brief Off reader visitor with flag that can be passed to Off_reader to read a Delaunay_triangulation_complex.
- */
-template<typename Complex>
-class Delaunay_triangulation_off_flag_visitor_reader {
- Complex& complex_;
- typedef typename Complex::Point Point;
-
- const bool load_only_points_;
-
- public:
- explicit Delaunay_triangulation_off_flag_visitor_reader(Complex& complex, bool load_only_points = false) :
- complex_(complex),
- load_only_points_(load_only_points) { }
-
- void init(int dim, int num_vertices, int num_faces, int num_edges) {
-#ifdef DEBUG_TRACES
- std::cout << "init" << std::endl;
-#endif // DEBUG_TRACES
- }
-
- void point(const std::vector<double>& point) {
-#ifdef DEBUG_TRACES
- std::cout << "p ";
- for (auto coordinate: point) {
- std::cout << coordinate << " | ";
- }
- std::cout << std::endl;
-#endif // DEBUG_TRACES
- complex_.insert(Point(point.size(), point.begin(), point.end()));
- }
-
- void maximal_face(const std::vector<int>& face) {
- // For alpha shapes, only points are read
- }
-
- void done() {
-#ifdef DEBUG_TRACES
- std::cout << "done" << std::endl;
-#endif // DEBUG_TRACES
- }
-};
-
-/**
- *@brief Off reader visitor that can be passed to Off_reader to read a Delaunay_triangulation_complex.
- */
-template<typename Complex>
-class Delaunay_triangulation_off_visitor_reader {
- Complex& complex_;
- // typedef typename Complex::Vertex_handle Vertex_handle;
- // typedef typename Complex::Simplex_handle Simplex_handle;
- typedef typename Complex::Point Point;
-
- const bool load_only_points_;
- std::vector<Point> points_;
- // std::vector<Simplex_handle> maximal_faces_;
-
- public:
- explicit Delaunay_triangulation_off_visitor_reader(Complex& complex, bool load_only_points = false) :
- complex_(complex),
- load_only_points_(load_only_points) { }
-
- void init(int dim, int num_vertices, int num_faces, int num_edges) {
-#ifdef DEBUG_TRACES
- std::cout << "init - " << num_vertices << std::endl;
-#endif // DEBUG_TRACES
- // maximal_faces_.reserve(num_faces);
- points_.reserve(num_vertices);
- }
-
- void point(const std::vector<double>& point) {
-#ifdef DEBUG_TRACES
- std::cout << "p ";
- for (auto coordinate: point) {
- std::cout << coordinate << " | ";
- }
- std::cout << std::endl;
-#endif // DEBUG_TRACES
- points_.emplace_back(Point(point.size(), point.begin(), point.end()));
- }
-
- void maximal_face(const std::vector<int>& face) {
- // For alpha shapes, only points are read
- }
-
- void done() {
- complex_.insert(points_.begin(), points_.end());
-#ifdef DEBUG_TRACES
- std::cout << "done" << std::endl;
-#endif // DEBUG_TRACES
- }
-};
-
-/**
- *@brief Class that allows to load a Delaunay_triangulation_complex from an off file.
- */
-template<typename Complex>
-class Delaunay_triangulation_off_reader {
- public:
- /**
- * name_file : file to read
- * read_complex : complex that will receive the file content
- * read_only_points : specify true if only the points must be read
- */
- Delaunay_triangulation_off_reader(const std::string & name_file, Complex& read_complex, bool read_only_points = false,
- bool is_flag = false) : valid_(false) {
- std::ifstream stream(name_file);
- if (stream.is_open()) {
- if (is_flag) {
- // For alpha shapes, only points are read
- Delaunay_triangulation_off_flag_visitor_reader<Complex> off_visitor(read_complex, true);
- Off_reader off_reader(stream);
- valid_ = off_reader.read(off_visitor);
- } else {
- // For alpha shapes, only points are read
- Delaunay_triangulation_off_visitor_reader<Complex> off_visitor(read_complex, true);
- Off_reader off_reader(stream);
- valid_ = off_reader.read(off_visitor);
- }
- }
- }
-
- /**
- * return true if reading did not meet problems.
- */
- bool is_valid() const {
- return valid_;
- }
-
- private:
- bool valid_;
-};
-
-template<typename Complex>
-class Delaunay_triangulation_off_writer {
- public:
- /**
- * name_file : file where the off will be written
- * save_complex : complex that be outputted in the file
- * for now only save triangles.
- */
- Delaunay_triangulation_off_writer(const std::string & name_file, const Complex& save_complex) {
- std::ofstream stream(name_file);
- if (stream.is_open()) {
- // OFF header
- stream << "OFF" << std::endl;
- // no endl on next line - don't know why...
- stream << save_complex.number_of_vertices() << " " << save_complex.number_of_finite_full_cells() << " 0";
-
- // Points list
- for (auto vit = save_complex.vertices_begin(); vit != save_complex.vertices_end(); ++vit) {
- for (auto Coord = vit->point().cartesian_begin(); Coord != vit->point().cartesian_end(); ++Coord) {
- stream << *Coord << " ";
- }
- stream << std::endl;
- }
-
- // Finite cells list
- for (auto cit = save_complex.finite_full_cells_begin(); cit != save_complex.finite_full_cells_end(); ++cit) {
- stream << std::distance(cit->vertices_begin(), cit->vertices_end()) << " "; // Dimension
- for (auto vit = cit->vertices_begin(); vit != cit->vertices_end(); ++vit) {
- auto vertexHdl = *vit;
- // auto vertexHdl = std::distance(save_complex.vertices_begin(), *vit) - 1;
- // stream << std::distance(save_complex.vertices_begin(), *(vit)) - 1 << " ";
- }
- stream << std::endl;
- }
- stream.close();
- } else {
- std::cerr << "could not open file " << name_file << std::endl;
- }
- }
-};
-
-} // namespace alphashapes
-
-} // namespace Gudhi
-
-#endif // SRC_ALPHA_SHAPES_INCLUDE_GUDHI_ALPHA_SHAPES_DELAUNAY_TRIANGULATION_OFF_IO_H_
diff --git a/src/Alpha_shapes/test/Alpha_shapes_unit_test.cpp b/src/Alpha_shapes/test/Alpha_shapes_unit_test.cpp
deleted file mode 100644
index b4c32321..00000000
--- a/src/Alpha_shapes/test/Alpha_shapes_unit_test.cpp
+++ /dev/null
@@ -1,126 +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/>.
- */
-
-#define BOOST_TEST_MODULE alpha_shapes test
-#include <boost/test/included/unit_test.hpp>
-#include <boost/system/error_code.hpp>
-#include <boost/chrono/thread_clock.hpp>
-// to construct a Delaunay_triangulation from a OFF file
-#include "gudhi/Alpha_shapes/Delaunay_triangulation_off_io.h"
-#include "gudhi/Alpha_shapes.h"
-
-// to construct a simplex_tree from Delaunay_triangulation
-#include "gudhi/graph_simplicial_complex.h"
-#include "gudhi/Simplex_tree.h"
-
-#include <CGAL/Delaunay_triangulation.h>
-#include <CGAL/Epick_d.h>
-#include <CGAL/point_generators_d.h>
-#include <CGAL/algorithm.h>
-#include <CGAL/assertions.h>
-
-#include <iostream>
-#include <iterator>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string>
-
-// Use dynamic_dimension_tag for the user to be able to set dimension
-typedef CGAL::Epick_d< CGAL::Dynamic_dimension_tag > K;
-typedef CGAL::Delaunay_triangulation<K> T;
-// The triangulation uses the default instanciation of the
-// TriangulationDataStructure template parameter
-
-BOOST_AUTO_TEST_CASE( OFF_file ) {
- // ----------------------------------------------------------------------------
- //
- // Init of an alpha-shape from a OFF file
- //
- // ----------------------------------------------------------------------------
- std::string off_file_name("S4_100.off");
- std::cout << "========== OFF FILE NAME = " << off_file_name << " ==========" << std::endl;
-
- Gudhi::alphashapes::Alpha_shapes alpha_shapes_from_file(off_file_name, 4);
-
- const int DIMENSION = 4;
- std::cout << "alpha_shapes_from_file.dimension()=" << alpha_shapes_from_file.dimension() << std::endl;
- BOOST_CHECK(alpha_shapes_from_file.dimension() == DIMENSION);
-
- const double FILTRATION = 0.0;
- std::cout << "alpha_shapes_from_file.filtration()=" << alpha_shapes_from_file.filtration() << std::endl;
- BOOST_CHECK(alpha_shapes_from_file.filtration() == FILTRATION);
-
- const int NUMBER_OF_VERTICES = 100;
- std::cout << "alpha_shapes_from_file.num_vertices()=" << alpha_shapes_from_file.num_vertices() << std::endl;
- BOOST_CHECK(alpha_shapes_from_file.num_vertices() == NUMBER_OF_VERTICES);
-
- const int NUMBER_OF_SIMPLICES = 6779;
- std::cout << "alpha_shapes_from_file.num_simplices()=" << alpha_shapes_from_file.num_simplices() << std::endl;
- BOOST_CHECK(alpha_shapes_from_file.num_simplices() == NUMBER_OF_SIMPLICES);
-
-}
-
-BOOST_AUTO_TEST_CASE( Delaunay_triangulation ) {
- // ----------------------------------------------------------------------------
- //
- // Init of an alpha-shape from a Delauny triangulation
- //
- // ----------------------------------------------------------------------------
- T dt(8);
- std::string off_file_name("S8_10.off");
- std::cout << "========== OFF FILE NAME = " << off_file_name << " ==========" << std::endl;
-
- Gudhi::alphashapes::Delaunay_triangulation_off_reader<T> off_reader(off_file_name, dt, true, true);
- std::cout << "off_reader.is_valid()=" << off_reader.is_valid() << std::endl;
- BOOST_CHECK(off_reader.is_valid());
-
- const int NUMBER_OF_VERTICES = 10;
- std::cout << "dt.number_of_vertices()=" << dt.number_of_vertices() << std::endl;
- BOOST_CHECK(dt.number_of_vertices() == NUMBER_OF_VERTICES);
-
- const int NUMBER_OF_FULL_CELLS = 30;
- std::cout << "dt.number_of_full_cells()=" << dt.number_of_full_cells() << std::endl;
- BOOST_CHECK(dt.number_of_full_cells() == NUMBER_OF_FULL_CELLS);
-
- const int NUMBER_OF_FINITE_FULL_CELLS = 6;
- std::cout << "dt.number_of_finite_full_cells()=" << dt.number_of_finite_full_cells() << std::endl;
- BOOST_CHECK(dt.number_of_finite_full_cells() == NUMBER_OF_FINITE_FULL_CELLS);
-
- Gudhi::alphashapes::Alpha_shapes alpha_shapes_from_dt(dt);
-
- const int DIMENSION = 8;
- std::cout << "alpha_shapes_from_dt.dimension()=" << alpha_shapes_from_dt.dimension() << std::endl;
- BOOST_CHECK(alpha_shapes_from_dt.dimension() == DIMENSION);
-
- const double FILTRATION = 0.0;
- std::cout << "alpha_shapes_from_dt.filtration()=" << alpha_shapes_from_dt.filtration() << std::endl;
- BOOST_CHECK(alpha_shapes_from_dt.filtration() == FILTRATION);
-
- std::cout << "alpha_shapes_from_dt.num_vertices()=" << alpha_shapes_from_dt.num_vertices() << std::endl;
- BOOST_CHECK(alpha_shapes_from_dt.num_vertices() == NUMBER_OF_VERTICES);
-
- const int NUMBER_OF_SIMPLICES = 997;
- std::cout << "alpha_shapes_from_dt.num_simplices()=" << alpha_shapes_from_dt.num_simplices() << std::endl;
- BOOST_CHECK(alpha_shapes_from_dt.num_simplices() == NUMBER_OF_SIMPLICES);
-}
-
diff --git a/src/Alpha_shapes/test/CMakeLists.txt b/src/Alpha_shapes/test/CMakeLists.txt
deleted file mode 100644
index e2dd786c..00000000
--- a/src/Alpha_shapes/test/CMakeLists.txt
+++ /dev/null
@@ -1,56 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-project(GUDHIAlphaShapesUT)
-
-# need CGAL 4.6
-# cmake -DCGAL_DIR=~/workspace/CGAL-4.6-beta1 ../../..
-if(CGAL_FOUND)
- if (NOT CGAL_VERSION VERSION_LESS 4.6.0)
- message(STATUS "CGAL version: ${CGAL_VERSION}.")
-
- include( ${CGAL_USE_FILE} )
-
- if(NOT MSVC)
- include(CheckCXXCompilerFlag)
- CHECK_CXX_COMPILER_FLAG(-std=c++11 COMPILER_SUPPORTS_CXX11)
- if(COMPILER_SUPPORTS_CXX11)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
- endif()
- endif()
- # - End of workaround
-
- find_package(Eigen3 3.1.0)
- if (EIGEN3_FOUND)
- message(STATUS "Eigen3 version: ${EIGEN3_VERSION}.")
- include( ${EIGEN3_USE_FILE} )
- include_directories (BEFORE "../../include")
-
- if (GCOVR_PATH)
- # for gcovr to make coverage reports - Corbera Jenkins plugin
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage")
- set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fprofile-arcs -ftest-coverage")
- endif()
- if (GPROF_PATH)
- # for gprof to make coverage reports - Jenkins
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
- set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -pg")
- endif()
-
- add_definitions(-DDEBUG_TRACES)
- add_executable ( AlphaShapesUT Alpha_shapes_unit_test.cpp )
- target_link_libraries(AlphaShapesUT ${Boost_SYSTEM_LIBRARY} ${CGAL_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
- add_test(NAME AlphaShapesUT
- COMMAND ${CMAKE_CURRENT_BINARY_DIR}/AlphaShapesUT
- # XML format for Jenkins xUnit plugin
- --log_format=XML --log_sink=${CMAKE_SOURCE_DIR}/AlphaShapesUT.xml --log_level=test_suite --report_level=no)
-
-
- else()
- message(WARNING "Eigen3 not found. Version 3.1.0 is required for Alpha shapes feature.")
- endif()
- else()
- message(WARNING "CGAL version: ${CGAL_VERSION} is too old to compile Alpha shapes feature. Version 4.6.0 is required.")
- endif ()
-endif()
-
diff --git a/src/Alpha_shapes/test/S4_100.off b/src/Alpha_shapes/test/S4_100.off
deleted file mode 100644
index 0a5dc58c..00000000
--- a/src/Alpha_shapes/test/S4_100.off
+++ /dev/null
@@ -1,102 +0,0 @@
-OFF
-100 0 0
-0.562921 -0.735261 -0.256472 0.277007
--0.803733 -0.0527915 -0.315125 0.501918
--0.24946 -0.354982 -0.410773 -0.801887
-0.916381 -0.0512295 0.371049 0.141223
-0.182222 0.940836 -0.171362 -0.228599
--0.787145 -0.129213 0.568102 -0.202402
-0.0187866 -0.22093 -0.832882 -0.507095
--0.4702 -0.533814 0.353776 0.607286
--0.159798 -0.504771 0.263586 0.806346
-0.295546 0.162541 0.452931 0.825279
-0.242043 -0.107437 -0.913612 -0.308521
-0.875759 -0.113035 -0.469189 -0.0114505
-0.547877 -0.762247 -0.256972 -0.229729
--0.172302 0.521057 0.412013 -0.727363
--0.724729 -0.0574074 -0.0290602 0.686023
-0.700434 -0.102636 0.687285 0.162779
--0.681386 0.0946893 0.610047 0.393178
--0.847553 -0.357132 0.383743 0.0827718
-0.72297 -0.161631 -0.608517 0.284424
-0.757394 0.141549 0.196065 -0.606528
-0.78094 0.00901997 0.434536 0.448586
-0.14166 -0.619339 0.614589 -0.467582
-0.473105 -0.537832 -0.0103746 0.697711
--0.208004 0.536218 0.818027 0.00605288
-0.743694 -0.628926 0.188072 0.126488
--0.462228 -0.278147 0.35514 -0.76345
--0.17361 0.249211 0.758567 -0.57648
-0.416958 -0.254924 -0.576373 -0.654946
--0.590751 -0.286089 -0.424896 0.623402
--0.639538 -0.739693 -0.203745 0.0482932
-0.0731787 0.132121 0.864022 0.480266
--0.149644 -0.164724 -0.249746 -0.94239
--0.348592 0.0120379 -0.928656 -0.126239
-0.395328 -0.54513 0.149976 -0.723917
--0.974164 0.14707 0.157191 0.068302
--0.166425 0.119943 -0.627304 -0.751269
-0.031947 -0.358518 -0.708301 -0.607251
-0.93781 -0.155368 -0.30951 0.0240237
-0.276094 -0.753155 -0.597088 -0.00387459
--0.642876 -0.200551 -0.263517 -0.690687
-0.178711 0.604987 -0.262989 0.729993
--0.520347 0.497922 -0.676144 0.155374
--0.703999 0.500219 -0.484381 0.139789
--0.131013 0.835735 0.506779 0.166004
--0.536116 -0.566557 0.229226 0.582279
--0.334105 0.158252 0.926091 0.0754059
--0.0362677 0.296076 0.897108 0.325915
--0.57486 0.798575 0.15324 -0.0912754
-0.498602 0.0186805 0.72824 0.469801
--0.960329 0.0473356 0.261005 -0.0860505
-0.899134 -0.381392 -0.214508 0.00921711
-0.570576 0.567224 0.393019 -0.445237
--0.761763 -0.614589 -0.0546476 -0.197513
-0.188584 0.289531 0.174031 0.922129
--0.458506 -0.583876 0.639297 -0.2004
-0.785343 -0.21571 0.0794082 -0.574804
-0.0819036 0.65961 -0.247426 0.704973
-0.573125 0.49706 0.373026 0.534145
--0.513286 -0.626226 0.208535 -0.548536
-0.460558 0.468686 0.507832 -0.55707
-0.716158 -0.488201 0.388209 -0.313164
-0.881074 0.152441 0.380128 -0.236589
-0.885793 0.0386389 0.161009 -0.433537
--0.365162 0.298384 0.292846 0.831784
-0.364934 0.632269 -0.197205 -0.654346
--0.31469 -0.429991 0.665304 -0.522923
--0.734198 0.462914 -0.135691 -0.477756
--0.422885 0.674444 -0.364143 -0.483419
-0.829218 -0.154622 -0.381147 0.378439
-0.887881 0.310479 -0.109528 0.321363
--0.354398 -0.693974 0.456019 -0.429941
--0.492045 -0.160008 0.044387 0.854587
-0.0595532 0.158421 0.412577 -0.895062
--0.211441 0.491794 -0.153521 0.83058
--0.33558 -0.504711 0.353831 -0.71236
--0.735211 -0.197714 0.525626 0.379593
-0.465818 -0.424245 0.769469 -0.104627
--0.641071 -0.286339 -0.704442 -0.103923
--0.00446569 0.0249849 -0.194417 -0.980591
--0.610081 -0.252448 0.176698 -0.729966
--0.0859217 -0.154471 0.715027 0.676382
-0.091315 0.0723382 -0.855023 -0.505337
-0.165362 0.200983 -0.428242 -0.865373
--0.587465 0.303019 -0.152442 0.734729
-0.454946 -0.319828 0.437063 -0.706902
--0.384368 0.277509 0.879225 -0.0470385
-0.523335 -0.330233 -0.208592 0.757335
-0.895086 0.0448492 0.268089 -0.353466
--0.0272491 -0.567336 -0.72254 -0.39411
--0.0745014 -0.121818 -0.882466 0.448179
-0.382304 -0.240135 0.851109 -0.267941
--0.418057 -0.852847 -0.3128 0.00606452
--0.554046 0.304237 0.272381 -0.725453
-0.155115 -0.0894732 -0.245017 -0.952838
-0.114459 -0.130722 0.953669 0.245614
-0.0913002 -0.462466 0.244433 0.847374
--0.198849 0.0785111 0.131441 -0.967997
--0.303154 -0.686484 0.639333 0.167604
-0.521455 0.256835 -0.0584503 -0.811606
--0.109787 0.870544 0.161523 0.451676
diff --git a/src/Alpha_shapes/test/S8_10.off b/src/Alpha_shapes/test/S8_10.off
deleted file mode 100644
index 1d67e10f..00000000
--- a/src/Alpha_shapes/test/S8_10.off
+++ /dev/null
@@ -1,12 +0,0 @@
-OFF
-10 0 0
-0.440036 -0.574754 -0.200485 0.216537 -0.501251 -0.0329236 -0.196529 0.313023
--0.129367 -0.184089 -0.213021 -0.415848 0.783529 -0.0438025 0.317256 0.120749
-0.132429 0.683748 -0.124536 -0.166133 -0.540695 -0.0887576 0.390234 -0.139031
-0.0137399 -0.161581 -0.609142 -0.370872 -0.320669 -0.364053 0.24127 0.41416
--0.115313 -0.36425 0.190208 0.581871 0.204605 0.112527 0.313562 0.571337
-0.168272 -0.0746917 -0.635156 -0.214488 0.629498 -0.0812499 -0.337255 -0.00823068
-0.369896 -0.514626 -0.173493 -0.1551 -0.127105 0.384377 0.303936 -0.536566
--0.49013 -0.0388242 -0.0196532 0.463953 0.515962 -0.0756047 0.506276 0.119908
--0.434258 0.060347 0.388793 0.250579 -0.653127 -0.275207 0.295714 0.0637842
-0.596172 -0.133284 -0.501793 0.234541 0.428452 0.0800735 0.110912 -0.343109
diff --git a/src/Bitmap_cubical_complex/doc/Cubical_complex_representation.ipe b/src/Bitmap_cubical_complex/doc/Cubical_complex_representation.ipe
new file mode 100644
index 00000000..bec245e7
--- /dev/null
+++ b/src/Bitmap_cubical_complex/doc/Cubical_complex_representation.ipe
@@ -0,0 +1,732 @@
+<?xml version="1.0"?>
+<!DOCTYPE ipe SYSTEM "ipe.dtd">
+<ipe version="70107" creator="Ipe 7.1.10">
+<info created="D:20160330102945" modified="D:20160330104654"/>
+<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"/>
+<path layer="alpha" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<text transformations="translations" pos="180 484" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">0</text>
+<path stroke="black" fill="lightgreen">
+192 496 m
+192 480 l
+240 480 l
+240 496 l
+h
+</path>
+<text transformations="translations" pos="212 484" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
+<path matrix="1 0 0 1 64 0" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<text matrix="1 0 0 1 64 0" transformations="translations" pos="180 484" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
+<path matrix="1 0 0 1 64 0" stroke="black" fill="lightgreen">
+192 496 m
+192 480 l
+240 480 l
+240 496 l
+h
+</path>
+<text matrix="1 0 0 1 64 0" transformations="translations" pos="212 484" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
+<path matrix="1 0 0 1 128 0" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<text matrix="1 0 0 1 128 0" transformations="translations" pos="180 484" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
+<path matrix="1 0 0 1 128 0" stroke="black" fill="lightgreen">
+192 496 m
+192 480 l
+240 480 l
+240 496 l
+h
+</path>
+<text matrix="1 0 0 1 128 0" transformations="translations" pos="212 484" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
+<path matrix="1 0 0 1 192 0" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<text matrix="1 0 0 1 192 0" transformations="translations" pos="180 484" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">6</text>
+<path matrix="1 0 0 1 192 0" stroke="black" fill="lightgreen">
+192 496 m
+192 480 l
+240 480 l
+240 496 l
+h
+</path>
+<text matrix="1 0 0 1 192 0" transformations="translations" pos="212 484" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">7</text>
+<path matrix="1 0 0 1 256 0" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<text matrix="1 0 0 1 256 0" transformations="translations" pos="180 484" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">8</text>
+<path matrix="1 0 0 1 0 -32" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<text matrix="1 0 0 1 0 -48" transformations="translations" pos="180 484" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
+<path matrix="1 0 0 1 0 -32" stroke="black" fill="lightgreen">
+192 496 m
+192 480 l
+240 480 l
+240 496 l
+h
+</path>
+<path matrix="1 0 0 1 64 -32" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<text matrix="1 0 0 1 64 -48" transformations="translations" pos="180 484" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
+<path matrix="1 0 0 1 64 -32" stroke="black" fill="lightgreen">
+192 496 m
+192 480 l
+240 480 l
+240 496 l
+h
+</path>
+<text matrix="1 0 0 1 96 -48" transformations="translations" pos="212 484" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
+<path matrix="1 0 0 1 128 -32" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<text matrix="1 0 0 1 192 -48" transformations="translations" pos="180 484" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">4</text>
+<path matrix="1 0 0 1 128 -32" stroke="black" fill="lightgreen">
+192 496 m
+192 480 l
+240 480 l
+240 496 l
+h
+</path>
+<text matrix="1 0 0 1 224 -48" transformations="translations" pos="212 484" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">5</text>
+<path matrix="1 0 0 1 192 -32" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<path matrix="1 0 0 1 192 -32" stroke="black" fill="lightgreen">
+192 496 m
+192 480 l
+240 480 l
+240 496 l
+h
+</path>
+<path matrix="1 0 0 1 256 -32" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<path matrix="1 0 0 1 -32 0" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<path stroke="black" fill="lightgreen">
+160 496 m
+160 544 l
+144 544 l
+144 496 l
+h
+</path>
+<path matrix="1 0 0 1 -32 64" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<path matrix="1 0 0 1 0 64" stroke="black" fill="lightgreen">
+160 496 m
+160 544 l
+144 544 l
+144 496 l
+h
+</path>
+<path matrix="1 0 0 1 -32 128" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<text transformations="translations" pos="132 484" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">1</text>
+<text transformations="translations" pos="132 548" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">2</text>
+<text transformations="translations" pos="132 612" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">3</text>
+<path matrix="1 0 0 1 32 0" stroke="black" fill="lightgreen">
+160 496 m
+160 544 l
+144 544 l
+144 496 l
+h
+</path>
+<text transformations="translations" pos="180 516" stroke="black" type="label" width="4.981" height="6.42" depth="0" valign="baseline">9</text>
+<path matrix="1 0 0 1 96 0" stroke="black" fill="lightgreen">
+160 496 m
+160 544 l
+144 544 l
+144 496 l
+h
+</path>
+<text transformations="translations" pos="244 516" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">11</text>
+<path matrix="1 0 0 1 160 0" stroke="black" fill="lightgreen">
+160 496 m
+160 544 l
+144 544 l
+144 496 l
+h
+</path>
+<path matrix="1 0 0 1 224 0" stroke="black" fill="lightgreen">
+160 496 m
+160 544 l
+144 544 l
+144 496 l
+h
+</path>
+<path matrix="1 0 0 1 288 0" stroke="black" fill="lightgreen">
+160 496 m
+160 544 l
+144 544 l
+144 496 l
+h
+</path>
+<path matrix="1 0 0 1 0 64" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<path matrix="1 0 0 1 0 64" stroke="black" fill="lightgreen">
+192 496 m
+192 480 l
+240 480 l
+240 496 l
+h
+</path>
+<path matrix="1 0 0 1 64 64" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<path matrix="1 0 0 1 64 64" stroke="black" fill="lightgreen">
+192 496 m
+192 480 l
+240 480 l
+240 496 l
+h
+</path>
+<path matrix="1 0 0 1 128 64" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<path matrix="1 0 0 1 128 64" stroke="black" fill="lightgreen">
+192 496 m
+192 480 l
+240 480 l
+240 496 l
+h
+</path>
+<path matrix="1 0 0 1 192 64" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<path matrix="1 0 0 1 192 64" stroke="black" fill="lightgreen">
+192 496 m
+192 480 l
+240 480 l
+240 496 l
+h
+</path>
+<path matrix="1 0 0 1 256 64" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<path matrix="1 0 0 1 0 128" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<path matrix="1 0 0 1 0 128" stroke="black" fill="lightgreen">
+192 496 m
+192 480 l
+240 480 l
+240 496 l
+h
+</path>
+<path matrix="1 0 0 1 64 128" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<path matrix="1 0 0 1 64 128" stroke="black" fill="lightgreen">
+192 496 m
+192 480 l
+240 480 l
+240 496 l
+h
+</path>
+<path matrix="1 0 0 1 128 128" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<path matrix="1 0 0 1 128 128" stroke="black" fill="lightgreen">
+192 496 m
+192 480 l
+240 480 l
+240 496 l
+h
+</path>
+<path matrix="1 0 0 1 192 128" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<path matrix="1 0 0 1 192 128" stroke="black" fill="lightgreen">
+192 496 m
+192 480 l
+240 480 l
+240 496 l
+h
+</path>
+<path matrix="1 0 0 1 256 128" stroke="black" fill="lightblue">
+176 496 m
+176 480 l
+192 480 l
+192 496 l
+h
+</path>
+<path matrix="1 0 0 1 32 64" stroke="black" fill="lightgreen">
+160 496 m
+160 544 l
+144 544 l
+144 496 l
+h
+</path>
+<path matrix="1 0 0 1 96 64" stroke="black" fill="lightgreen">
+160 496 m
+160 544 l
+144 544 l
+144 496 l
+h
+</path>
+<path matrix="1 0 0 1 160 64" stroke="black" fill="lightgreen">
+160 496 m
+160 544 l
+144 544 l
+144 496 l
+h
+</path>
+<path matrix="1 0 0 1 224 64" stroke="black" fill="lightgreen">
+160 496 m
+160 544 l
+144 544 l
+144 496 l
+h
+</path>
+<path matrix="1 0 0 1 288 64" stroke="black" fill="lightgreen">
+160 496 m
+160 544 l
+144 544 l
+144 496 l
+h
+</path>
+<path stroke="black" fill="lightgray">
+192 544 m
+192 496 l
+240 496 l
+240 544 l
+h
+</path>
+<path matrix="1 0 0 1 64 0" stroke="black" fill="lightgray">
+192 544 m
+192 496 l
+240 496 l
+240 544 l
+h
+</path>
+<path matrix="1 0 0 1 128 0" stroke="black" fill="lightgray">
+192 544 m
+192 496 l
+240 496 l
+240 544 l
+h
+</path>
+<path matrix="1 0 0 1 192 0" stroke="black" fill="lightgray">
+192 544 m
+192 496 l
+240 496 l
+240 544 l
+h
+</path>
+<path matrix="1 0 0 1 0 64" stroke="black" fill="lightgray">
+192 544 m
+192 496 l
+240 496 l
+240 544 l
+h
+</path>
+<path matrix="1 0 0 1 64 64" stroke="black" fill="lightgray">
+192 544 m
+192 496 l
+240 496 l
+240 544 l
+h
+</path>
+<path matrix="1 0 0 1 128 64" stroke="black" fill="lightgray">
+192 544 m
+192 496 l
+240 496 l
+240 544 l
+h
+</path>
+<path matrix="1 0 0 1 192 64" stroke="black" fill="lightgray">
+192 544 m
+192 496 l
+240 496 l
+240 544 l
+h
+</path>
+<text transformations="translations" pos="212 516" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">10</text>
+<text transformations="translations" pos="276 516" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">12</text>
+<text transformations="translations" pos="308 516" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">13</text>
+<text transformations="translations" pos="340 516" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">14</text>
+<text transformations="translations" pos="372 516" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">15</text>
+<text transformations="translations" pos="404 516" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">16</text>
+<text transformations="translations" pos="436 516" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">17</text>
+<text transformations="translations" pos="180 548" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">18</text>
+<text transformations="translations" pos="212 548" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">19</text>
+<text transformations="translations" pos="244 548" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">20</text>
+<text transformations="translations" pos="276 548" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">21</text>
+<text transformations="translations" pos="308 548" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">22</text>
+<text transformations="translations" pos="340 548" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">23</text>
+<text transformations="translations" pos="372 548" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">24</text>
+<text transformations="translations" pos="404 548" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">25</text>
+<text transformations="translations" pos="436 548" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">26</text>
+<text transformations="translations" pos="180 580" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">27</text>
+<text transformations="translations" pos="212 580" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">28</text>
+<text transformations="translations" pos="244 580" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">29</text>
+<text transformations="translations" pos="276 580" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">30</text>
+<text transformations="translations" pos="308 580" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">31</text>
+<text transformations="translations" pos="340 580" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">32</text>
+<text transformations="translations" pos="372 580" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">33</text>
+<text transformations="translations" pos="404 580" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">34</text>
+<text transformations="translations" pos="436 580" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">35</text>
+<text transformations="translations" pos="180 612" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">36</text>
+<text transformations="translations" pos="212 612" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">37</text>
+<text transformations="translations" pos="244 612" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">38</text>
+<text transformations="translations" pos="276 612" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">39</text>
+<text transformations="translations" pos="308 612" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">40</text>
+<text transformations="translations" pos="340 612" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">41</text>
+<text transformations="translations" pos="372 612" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">42</text>
+<text transformations="translations" pos="404 612" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">43</text>
+<text transformations="translations" pos="436 612" stroke="black" type="label" width="9.963" height="6.42" depth="0" valign="baseline">44</text>
+<path stroke="black" arrow="normal/normal">
+152 456 m
+472 456 l
+</path>
+<path stroke="black" arrow="normal/normal">
+152 456 m
+152 648 l
+</path>
+</page>
+</ipe>
diff --git a/src/Bitmap_cubical_complex/doc/Cubical_complex_representation.png b/src/Bitmap_cubical_complex/doc/Cubical_complex_representation.png
new file mode 100644
index 00000000..afb2a75e
--- /dev/null
+++ b/src/Bitmap_cubical_complex/doc/Cubical_complex_representation.png
Binary files differ
diff --git a/src/Bitmap_cubical_complex/doc/Gudhi_Cubical_Complex_doc.h b/src/Bitmap_cubical_complex/doc/Gudhi_Cubical_Complex_doc.h
new file mode 100644
index 00000000..4c9c04d9
--- /dev/null
+++ b/src/Bitmap_cubical_complex/doc/Gudhi_Cubical_Complex_doc.h
@@ -0,0 +1,159 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2015 INRIA Sophia-Saclay (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef DOC_GUDHI_CUBICAL_COMPLEX_COMPLEX_H_
+#define DOC_GUDHI_CUBICAL_COMPLEX_COMPLEX_H_
+
+namespace Gudhi {
+
+namespace cubical_complex {
+
+/** \defgroup cubical_complex Cubical complex
+ *
+ * \author Pawel Dlotko
+ *
+ * @{
+ *
+
+ * Bitmap_cubical_complex is an example of a structured complex useful in computational mathematics (specially rigorous
+ * numerics) and image analysis. The presented implementation of cubical complexes is based on the following
+ * definition.
+ *
+ * An <em>elementary interval</em> is an interval of a form \f$ [n,n+1] \f$, or \f$[n,n]\f$, for \f$ n \in \mathcal{Z}
+ * \f$. The first one is called <em>non-degenerate</em>, while the second one is \a degenerate interval. A
+ * <em>boundary of a elementary interval</em> is a chain \f$\partial [n,n+1] = [n+1,n+1]-[n,n] \f$ in case of
+ * non-degenerated elementary interval and \f$\partial [n,n] = 0 \f$ in case of degenerate elementary interval. An
+ * <em>elementary cube</em> \f$ C \f$ is a product of elementary intervals, \f$C=I_1 \times \ldots \times I_n\f$.
+ * <em>Embedding dimension</em> of a cube is n, the number of elementary intervals (degenerate or not) in the product.
+ * A <em>dimension of a cube</em> \f$C=I_1 \times ... \times I_n\f$ is the number of non degenerate elementary
+ * intervals in the product. A <em>boundary of a cube</em> \f$C=I_1 \times \ldots \times I_n\f$ is a chain obtained
+ * in the following way:
+ * \f[\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).\f]
+ * A <em>cubical complex</em> \f$\mathcal{K}\f$ 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 \f$C\f$ in cubical complex
+ * \f$\mathcal{K}\f$ is <em>maximal</em> if it is not in a boundary of any other cube in \f$\mathcal{K}\f$. A \a
+ * support of a cube \f$C\f$ is the set in \f$\mathbb{R}^n\f$ occupied by \f$C\f$ (\f$n\f$ is the embedding dimension
+ * of \f$C\f$).
+ *
+ * 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 .
+ *
+ * \section datastructure 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
+ * of so called bitmaps. Let \f$R = [b_1,e_1] \times \ldots \times [b_n,e_n]\f$, for \f$b_1,...b_n,e_1,...,e_n \in
+ * \mathbb{Z}\f$, \f$b_i \leq d_i\f$ be the considered rectangular region and let \f$\mathcal{K}\f$ be a filtered
+ * cubical complex having the rectangle \f$R\f$ as its support. Note that the structure of the coordinate system gives
+ * a way a lexicographical ordering of cells of \f$\mathcal{K}\f$. 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 \f$\mathcal{K}\f$ and the sizes of \f$\mathcal{K}\f$ in all
+ * directions, allows to determine, dimension, neighborhood, boundary and coboundary of every cube \f$C \in
+ * \mathcal{K}\f$.
+ *
+ * \image html "Cubical_complex_representation.png" Cubical complex.
+ *
+ * Note that the cubical complex in the figure above is, in a natural way, a product of one dimensional cubical
+ * complexes in \f$\mathbb{R}\f$. The number of all cubes in each direction is equal \f$2n+1\f$, where \f$n\f$ is the
+ * number of maximal cubes in the considered direction. Let us consider a cube at the position \f$k\f$ 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 \f$C\f$. In a similar way, we can compute boundary and the coboundary of
+ * each cube. Further details can be found in the literature.
+ *
+ * \section inputformat Input Format.
+ *
+ * In the current implantation, filtration is given at the maximal cubes, and it is then extended by the lower star
+ * filtration to all cubes. There are a number of constructors that can be used to construct cubical complex by users
+ * who want to use the code directly. They can be found in the \a Bitmap_cubical_complex class.
+ * Currently one input from a text file is used. It uses a format used already in Perseus software
+ * (http://www.sas.upenn.edu/~vnanda/perseus/) by Vidit Nanda.
+ * Below we are providing a description of the format. The first line contains a number d begin the dimension of the
+ * bitmap (2 in the example below). Next d lines are the numbers of top dimensional cubes in each dimensions (3 and 3
+ * in the example below). Next, in lexicographical order, the filtration of top dimensional cubes is given (1 4 6 8
+ * 20 4 7 6 5 in the example below).
+ *
+ *
+ * \image html "exampleBitmap.png" "Example of a input data."
+ *
+ * The input file for the following complex is:
+ * \verbatim
+2
+3
+3
+1
+4
+6
+8
+20
+4
+7
+6
+5
+\endverbatim
+
+ * \section PeriodicBoundaryConditions Periodic boundary conditions
+ * Often one would like to impose periodic boundary conditions to the cubical complex. Let \f$ I_1\times ... \times
+ * I_n \f$ be a box that is decomposed with a cubical complex \f$ \mathcal{K} \f$. Imposing periodic boundary
+ * conditions in the direction i, means that the left and the right side of a complex \f$ \mathcal{K} \f$ are
+ * considered the same. In particular, if for a bitmap \f$ \mathcal{K} \f$ periodic boundary conditions are imposed
+ * in all directions, then complex \f$ \mathcal{K} \f$ became n-dimensional torus. One can use various constructors
+ * from the file Bitmap_cubical_complex_periodic_boundary_conditions_base.h to construct cubical complex with periodic
+ * boundary conditions. One can also use Perseus style input files. To indicate periodic boundary conditions in a
+ * given direction, then number of top dimensional cells in this direction have to be multiplied by -1. For instance:
+
+ *\verbatim
+2
+-3
+3
+1
+4
+6
+8
+20
+4
+7
+6
+5
+\endverbatim
+
+ * Indicate that we have imposed periodic boundary conditions in the direction x, but not in the direction y.
+
+ * \section BitmapExamples Examples
+ * End user programs are available in example/Bitmap_cubical_complex folder.
+ *
+ * \copyright GNU General Public License v3.
+ */
+/** @} */ // end defgroup cubical_complex
+
+} // namespace cubical_complex
+
+namespace Cubical_complex = cubical_complex;
+
+} // namespace Gudhi
+
+#endif // DOC_GUDHI_CUBICAL_COMPLEX_COMPLEX_H_
diff --git a/src/Bitmap_cubical_complex/doc/bitmapAllCubes.png b/src/Bitmap_cubical_complex/doc/bitmapAllCubes.png
new file mode 100644
index 00000000..77167b13
--- /dev/null
+++ b/src/Bitmap_cubical_complex/doc/bitmapAllCubes.png
Binary files differ
diff --git a/src/Bitmap_cubical_complex/doc/exampleBitmap.png b/src/Bitmap_cubical_complex/doc/exampleBitmap.png
new file mode 100644
index 00000000..069c6eb2
--- /dev/null
+++ b/src/Bitmap_cubical_complex/doc/exampleBitmap.png
Binary files differ
diff --git a/src/Bitmap_cubical_complex/example/Bitmap_cubical_complex.cpp b/src/Bitmap_cubical_complex/example/Bitmap_cubical_complex.cpp
new file mode 100644
index 00000000..e6bc6648
--- /dev/null
+++ b/src/Bitmap_cubical_complex/example/Bitmap_cubical_complex.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.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * 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/>.
+ */
+
+
+#include <gudhi/reader_utils.h>
+#include <gudhi/Bitmap_cubical_complex.h>
+#include <gudhi/Persistent_cohomology.h>
+
+// standard stuff
+#include <iostream>
+#include <sstream>
+#include <vector>
+
+int main(int argc, char** argv) {
+ std::cout << "This program computes persistent homology, by using bitmap_cubical_complex class, of cubical " <<
+ "complexes provided in text files in Perseus style (the only numbered in the first line is a dimension D of a" <<
+ "bitmap. In the lines I between 2 and D+1 there are numbers of top dimensional cells in the direction I. Let " <<
+ "N denote product of the numbers in the lines between 2 and D. In the lines D+2 to D+2+N there are " <<
+ "filtrations of top dimensional cells. We assume that the cells are in the lexicographical order. See " <<
+ "CubicalOneSphere.txt or CubicalTwoSphere.txt for example.\n" << std::endl;
+
+ int p = 2;
+ double min_persistence = 0;
+
+ if (argc != 2) {
+ std::cerr << "Wrong number of parameters. Please provide the name of a file with a Perseus style bitmap at " <<
+ "the input. The program will now terminate.\n";
+ return 1;
+ }
+
+ typedef Gudhi::cubical_complex::Bitmap_cubical_complex_base<double> Bitmap_cubical_complex_base;
+ typedef Gudhi::cubical_complex::Bitmap_cubical_complex<Bitmap_cubical_complex_base> Bitmap_cubical_complex;
+ typedef Gudhi::persistent_cohomology::Field_Zp Field_Zp;
+ typedef Gudhi::persistent_cohomology::Persistent_cohomology<Bitmap_cubical_complex, Field_Zp> Persistent_cohomology;
+
+ Bitmap_cubical_complex b(argv[1]);
+
+ // Compute the persistence diagram of the complex
+ Persistent_cohomology pcoh(b);
+ pcoh.init_coefficients(p); // initializes the coefficient field for homology
+ pcoh.compute_persistent_cohomology(min_persistence);
+
+ std::stringstream ss;
+ ss << argv[1] << "_persistence";
+ std::ofstream out(ss.str().c_str());
+ pcoh.output_diagram(out);
+ out.close();
+
+ std::cout << "Result in file: " << ss.str().c_str() << "\n";
+
+ return 0;
+}
+
diff --git a/src/Bitmap_cubical_complex/example/Bitmap_cubical_complex_periodic_boundary_conditions.cpp b/src/Bitmap_cubical_complex/example/Bitmap_cubical_complex_periodic_boundary_conditions.cpp
new file mode 100644
index 00000000..839a4c89
--- /dev/null
+++ b/src/Bitmap_cubical_complex/example/Bitmap_cubical_complex_periodic_boundary_conditions.cpp
@@ -0,0 +1,74 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 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/>.
+ */
+
+
+#include <gudhi/reader_utils.h>
+#include <gudhi/Bitmap_cubical_complex.h>
+#include <gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h>
+#include <gudhi/Persistent_cohomology.h>
+
+// standard stuff
+#include <iostream>
+#include <sstream>
+#include <vector>
+
+int main(int argc, char** argv) {
+ std::cout << "This program computes persistent homology, by using " <<
+ "Bitmap_cubical_complex_periodic_boundary_conditions class, of cubical complexes provided in text files in " <<
+ "Perseus style (the only numbered in the first line is a dimension D of a bitmap. In the lines I between 2 " <<
+ "and D+1 there are numbers of top dimensional cells in the direction I. Let N denote product of the numbers " <<
+ "in the lines between 2 and D. In the lines D+2 to D+2+N there are filtrations of top dimensional cells. We " <<
+ "assume that the cells are in the lexicographical order. See CubicalOneSphere.txt or CubicalTwoSphere.txt for" <<
+ " example.\n" << std::endl;
+
+ int p = 2;
+ double min_persistence = 0;
+
+ if (argc != 2) {
+ std::cerr << "Wrong number of parameters. Please provide the name of a file with a Perseus style bitmap at " <<
+ "the input. The program will now terminate.\n";
+ return 1;
+ }
+
+ typedef Gudhi::cubical_complex::Bitmap_cubical_complex_periodic_boundary_conditions_base<double> Bitmap_base;
+ typedef Gudhi::cubical_complex::Bitmap_cubical_complex< Bitmap_base > Bitmap_cubical_complex;
+
+ Bitmap_cubical_complex b(argv[1]);
+
+ typedef Gudhi::persistent_cohomology::Field_Zp Field_Zp;
+ typedef Gudhi::persistent_cohomology::Persistent_cohomology<Bitmap_cubical_complex, Field_Zp> Persistent_cohomology;
+ // Compute the persistence diagram of the complex
+ Persistent_cohomology pcoh(b, true);
+ pcoh.init_coefficients(p); // initializes the coefficient field for homology
+ pcoh.compute_persistent_cohomology(min_persistence);
+
+ std::stringstream ss;
+ ss << argv[1] << "_persistence";
+ std::ofstream out(ss.str().c_str());
+ pcoh.output_diagram(out);
+ out.close();
+
+ std::cout << "Result in file: " << ss.str().c_str() << "\n";
+
+ return 0;
+}
+
diff --git a/src/Bitmap_cubical_complex/example/CMakeLists.txt b/src/Bitmap_cubical_complex/example/CMakeLists.txt
new file mode 100644
index 00000000..2fddc514
--- /dev/null
+++ b/src/Bitmap_cubical_complex/example/CMakeLists.txt
@@ -0,0 +1,26 @@
+cmake_minimum_required(VERSION 2.6)
+project(Bitmap_cubical_complex_examples)
+
+add_executable ( Bitmap_cubical_complex Bitmap_cubical_complex.cpp )
+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_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_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)
+
diff --git a/src/Bitmap_cubical_complex/example/Random_bitmap_cubical_complex.cpp b/src/Bitmap_cubical_complex/example/Random_bitmap_cubical_complex.cpp
new file mode 100644
index 00000000..16ad65a0
--- /dev/null
+++ b/src/Bitmap_cubical_complex/example/Random_bitmap_cubical_complex.cpp
@@ -0,0 +1,83 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 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/>.
+ */
+
+
+// for persistence algorithm
+#include <gudhi/reader_utils.h>
+#include <gudhi/Bitmap_cubical_complex.h>
+#include <gudhi/Persistent_cohomology.h>
+
+// standard stuff
+#include <iostream>
+#include <sstream>
+#include <vector>
+
+int main(int argc, char** argv) {
+ srand(time(0));
+
+ std::cout << "This program computes persistent homology, by using bitmap_cubical_complex class, of cubical " <<
+ "complexes. The first parameter of the program is the dimension D of the bitmap. The next D parameters are " <<
+ "number of top dimensional cubes in each dimension of the bitmap. The program will create random cubical " <<
+ "complex of that sizes and compute persistent homology of it." << std::endl;
+
+ int p = 2;
+ double min_persistence = 0;
+
+ if (argc < 3) {
+ std::cerr << "Wrong number of parameters, the program will now terminate\n";
+ return 1;
+ }
+
+ size_t dimensionOfBitmap = (size_t) atoi(argv[1]);
+ std::vector< unsigned > sizes;
+ size_t multipliers = 1;
+ for (size_t dim = 0; dim != dimensionOfBitmap; ++dim) {
+ unsigned sizeInThisDimension = (unsigned) atoi(argv[2 + dim]);
+ sizes.push_back(sizeInThisDimension);
+ multipliers *= sizeInThisDimension;
+ }
+
+ std::vector< double > data;
+ for (size_t i = 0; i != multipliers; ++i) {
+ data.push_back(rand() / static_cast<double>(RAND_MAX));
+ }
+
+ typedef Gudhi::cubical_complex::Bitmap_cubical_complex_base<double> Bitmap_cubical_complex_base;
+ typedef Gudhi::cubical_complex::Bitmap_cubical_complex<Bitmap_cubical_complex_base> Bitmap_cubical_complex;
+ Bitmap_cubical_complex b(sizes, data);
+
+ // Compute the persistence diagram of the complex
+ typedef Gudhi::persistent_cohomology::Field_Zp Field_Zp;
+ typedef Gudhi::persistent_cohomology::Persistent_cohomology<Bitmap_cubical_complex, Field_Zp> Persistent_cohomology;
+ Persistent_cohomology pcoh(b);
+ pcoh.init_coefficients(p); // initializes the coefficient field for homology
+ pcoh.compute_persistent_cohomology(min_persistence);
+
+ std::stringstream ss;
+ ss << "randomComplex_persistence";
+ std::ofstream out(ss.str().c_str());
+ pcoh.output_diagram(out);
+ out.close();
+
+ return 0;
+}
+
diff --git a/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex.h b/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex.h
new file mode 100644
index 00000000..5a87b9b8
--- /dev/null
+++ b/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex.h
@@ -0,0 +1,595 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2015 INRIA Sophia-Saclay (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BITMAP_CUBICAL_COMPLEX_H_
+#define BITMAP_CUBICAL_COMPLEX_H_
+
+#include <gudhi/Bitmap_cubical_complex_base.h>
+#include <gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h>
+
+#ifdef GUDHI_USE_TBB
+#include <tbb/parallel_sort.h>
+#endif
+
+#include <limits>
+#include <utility> // for pair<>
+#include <algorithm> // for sort
+#include <vector>
+#include <numeric> // for iota
+
+namespace Gudhi {
+
+namespace cubical_complex {
+
+// global variable, was used just for debugging.
+const bool globalDbg = false;
+
+template <typename T> class is_before_in_filtration;
+
+/**
+ * @brief Cubical complex represented as a bitmap.
+ * @ingroup cubical_complex
+ * @details This is a Bitmap_cubical_complex class. It joints a functionalities of Bitmap_cubical_complex_base and
+ * Bitmap_cubical_complex_periodic_boundary_conditions_base classes into
+ * Gudhi persistent homology engine. It is a template class that inherit from its template parameter. The template
+ * parameter is supposed to be either Bitmap_cubical_complex_base or
+ * Bitmap_cubical_complex_periodic_boundary_conditions_base class.
+ **/
+template <typename T>
+class Bitmap_cubical_complex : public T {
+ public:
+ //*********************************************//
+ // Typedefs and typenames
+ //*********************************************//
+ typedef size_t Simplex_key;
+ typedef typename T::filtration_type Filtration_value;
+ typedef Simplex_key Simplex_handle;
+
+
+ //*********************************************//
+ // Constructors
+ //*********************************************//
+ // Over here we need to define various input types. I am proposing the following ones:
+ // Perseus style
+ // TODO(PD) H5 files?
+ // TODO(PD) binary files with little endiangs / big endians ?
+ // TODO(PD) constructor from a vector of elements of a type T. ?
+
+ /**
+ * Constructor form a Perseus-style file.
+ **/
+ Bitmap_cubical_complex(const char* perseus_style_file) :
+ T(perseus_style_file), key_associated_to_simplex(this->total_number_of_cells + 1) {
+ if (globalDbg) {
+ std::cerr << "Bitmap_cubical_complex( const char* perseus_style_file )\n";
+ }
+ for (size_t i = 0; i != this->total_number_of_cells; ++i) {
+ this->key_associated_to_simplex[i] = i;
+ }
+ // we initialize this only once, in each constructor, when the bitmap is constructed.
+ // If the user decide to change some elements of the bitmap, then this procedure need
+ // to be called again.
+ this->initialize_simplex_associated_to_key();
+ }
+
+ /**
+ * Constructor that requires vector of elements of type unsigned, which gives number of top dimensional cells
+ * in the following directions and vector of element of a type T
+ * with filtration on top dimensional cells.
+ **/
+ Bitmap_cubical_complex(const std::vector<unsigned>& dimensions,
+ const std::vector<typename T::filtration_type>& top_dimensional_cells) :
+ T(dimensions, top_dimensional_cells),
+ key_associated_to_simplex(this->total_number_of_cells + 1) {
+ for (size_t i = 0; i != this->total_number_of_cells; ++i) {
+ this->key_associated_to_simplex[i] = i;
+ }
+ // we initialize this only once, in each constructor, when the bitmap is constructed.
+ // If the user decide to change some elements of the bitmap, then this procedure need
+ // to be called again.
+ this->initialize_simplex_associated_to_key();
+ }
+
+ /**
+ * Constructor that requires vector of elements of type unsigned, which gives number of top dimensional cells
+ * in the following directions and vector of element of a type T::filtration_type
+ * with filtration on top dimensional cells. The last parameter of the constructor is a vector of boolean of a length
+ * equal to the dimension of cubical complex.
+ * If the position i on this vector is true, then we impose periodic boundary conditions in this direction.
+ **/
+ Bitmap_cubical_complex(const std::vector<unsigned>& dimensions,
+ const std::vector<typename T::filtration_type>& top_dimensional_cells,
+ std::vector< bool > directions_in_which_periodic_b_cond_are_to_be_imposed) :
+ T(dimensions, top_dimensional_cells, directions_in_which_periodic_b_cond_are_to_be_imposed),
+ key_associated_to_simplex(this->total_number_of_cells + 1) {
+ for (size_t i = 0; i != this->total_number_of_cells; ++i) {
+ this->key_associated_to_simplex[i] = i;
+ }
+ // we initialize this only once, in each constructor, when the bitmap is constructed.
+ // If the user decide to change some elements of the bitmap, then this procedure need
+ // to be called again.
+ this->initialize_simplex_associated_to_key();
+ }
+
+ /**
+ * Destructor of the Bitmap_cubical_complex class.
+ **/
+ virtual ~Bitmap_cubical_complex() {}
+
+ //*********************************************//
+ // Other 'easy' functions
+ //*********************************************//
+
+ /**
+ * Returns number of all cubes in the complex.
+ **/
+ size_t num_simplices()const {
+ return this->total_number_of_cells;
+ }
+
+ /**
+ * Returns a Simplex_handle to a cube that do not exist in this complex.
+ **/
+ static Simplex_handle null_simplex() {
+ if (globalDbg) {
+ std::cerr << "Simplex_handle null_simplex()\n";
+ }
+ return std::numeric_limits<Simplex_handle>::max();
+ }
+
+ /**
+ * Returns dimension of the complex.
+ **/
+ inline size_t dimension()const {
+ return this->sizes.size();
+ }
+
+ /**
+ * Return dimension of a cell pointed by the Simplex_handle.
+ **/
+ inline unsigned dimension(Simplex_handle sh)const {
+ if (globalDbg) {
+ std::cerr << "unsigned dimension(const Simplex_handle& sh)\n";
+ }
+ if (sh != std::numeric_limits<Simplex_handle>::max()) return this->get_dimension_of_a_cell(sh);
+ return -1;
+ }
+
+ /**
+ * Return the filtration of a cell pointed by the Simplex_handle.
+ **/
+ typename T::filtration_type filtration(Simplex_handle sh) {
+ if (globalDbg) {
+ std::cerr << "T::filtration_type filtration(const Simplex_handle& sh)\n";
+ }
+ // Returns the filtration value of a simplex.
+ if (sh != std::numeric_limits<Simplex_handle>::max()) return this->data[sh];
+ return std::numeric_limits<Simplex_handle>::max();
+ }
+
+ /**
+ * Return a key which is not a key of any cube in the considered data structure.
+ **/
+ static Simplex_key null_key() {
+ if (globalDbg) {
+ std::cerr << "Simplex_key null_key()\n";
+ }
+ return std::numeric_limits<Simplex_handle>::max();
+ }
+
+ /**
+ * Return the key of a cube pointed by the Simplex_handle.
+ **/
+ Simplex_key key(Simplex_handle sh)const {
+ if (globalDbg) {
+ std::cerr << "Simplex_key key(const Simplex_handle& sh)\n";
+ }
+ if (sh != std::numeric_limits<Simplex_handle>::max()) {
+ return this->key_associated_to_simplex[sh];
+ }
+ return this->null_key();
+ }
+
+ /**
+ * Return the Simplex_handle given the key of the cube.
+ **/
+ Simplex_handle simplex(Simplex_key key) {
+ if (globalDbg) {
+ std::cerr << "Simplex_handle simplex(Simplex_key key)\n";
+ }
+ if (key != std::numeric_limits<Simplex_handle>::max()) {
+ return this->simplex_associated_to_key[ key ];
+ }
+ return null_simplex();
+ }
+
+ /**
+ * Assign key to a cube pointed by the Simplex_handle
+ **/
+ void assign_key(Simplex_handle sh, Simplex_key key) {
+ if (globalDbg) {
+ std::cerr << "void assign_key(Simplex_handle& sh, Simplex_key key)\n";
+ }
+ if (key == std::numeric_limits<Simplex_handle>::max()) return;
+ this->key_associated_to_simplex[sh] = key;
+ this->simplex_associated_to_key[key] = sh;
+ }
+
+ /**
+ * Function called from a constructor. It is needed for Filtration_simplex_iterator to work.
+ **/
+ void initialize_simplex_associated_to_key();
+
+ //*********************************************//
+ // Iterators
+ //*********************************************//
+
+ /**
+ * Boundary_simplex_range class provides ranges for boundary iterators.
+ **/
+ typedef typename std::vector< Simplex_handle >::iterator Boundary_simplex_iterator;
+ typedef typename std::vector< Simplex_handle > Boundary_simplex_range;
+
+ /**
+ * Filtration_simplex_iterator class provides an iterator though the whole structure in the order of filtration.
+ * Secondary criteria for filtration are:
+ * (1) Dimension of a cube (lower dimensional comes first).
+ * (2) Position in the data structure (the ones that are earlies in the data structure comes first).
+ **/
+ class Filtration_simplex_range;
+
+ class Filtration_simplex_iterator : std::iterator< std::input_iterator_tag, Simplex_handle > {
+ // Iterator over all simplices of the complex in the order of the indexing scheme.
+ // 'value_type' must be 'Simplex_handle'.
+ public:
+ Filtration_simplex_iterator(Bitmap_cubical_complex* b) : b(b), position(0) { }
+
+ Filtration_simplex_iterator() : b(NULL), position(0) { }
+
+ Filtration_simplex_iterator operator++() {
+ if (globalDbg) {
+ std::cerr << "Filtration_simplex_iterator operator++\n";
+ }
+ ++this->position;
+ return (*this);
+ }
+
+ Filtration_simplex_iterator operator++(int) {
+ Filtration_simplex_iterator result = *this;
+ ++(*this);
+ return result;
+ }
+
+ Filtration_simplex_iterator& operator=(const Filtration_simplex_iterator& rhs) {
+ if (globalDbg) {
+ std::cerr << "Filtration_simplex_iterator operator =\n";
+ }
+ this->b = rhs.b;
+ this->position = rhs.position;
+ return (*this);
+ }
+
+ bool operator==(const Filtration_simplex_iterator& rhs)const {
+ if (globalDbg) {
+ std::cerr << "bool operator == ( const Filtration_simplex_iterator& rhs )\n";
+ }
+ return ( this->position == rhs.position);
+ }
+
+ bool operator!=(const Filtration_simplex_iterator& rhs)const {
+ if (globalDbg) {
+ std::cerr << "bool operator != ( const Filtration_simplex_iterator& rhs )\n";
+ }
+ return !(*this == rhs);
+ }
+
+ Simplex_handle operator*() {
+ if (globalDbg) {
+ std::cerr << "Simplex_handle operator*()\n";
+ }
+ return this->b->simplex_associated_to_key[ this->position ];
+ }
+
+ friend class Filtration_simplex_range;
+
+ private:
+ Bitmap_cubical_complex<T>* b;
+ size_t position;
+ };
+
+ /**
+ * @brief Filtration_simplex_range provides the ranges for Filtration_simplex_iterator.
+ **/
+ class Filtration_simplex_range {
+ // Range over the simplices of the complex in the order of the filtration.
+ // .begin() and .end() return type Filtration_simplex_iterator.
+ public:
+ typedef Filtration_simplex_iterator const_iterator;
+ typedef Filtration_simplex_iterator iterator;
+
+ Filtration_simplex_range(Bitmap_cubical_complex<T>* b) : b(b) { }
+
+ Filtration_simplex_iterator begin() {
+ if (globalDbg) {
+ std::cerr << "Filtration_simplex_iterator begin() \n";
+ }
+ return Filtration_simplex_iterator(this->b);
+ }
+
+ Filtration_simplex_iterator end() {
+ if (globalDbg) {
+ std::cerr << "Filtration_simplex_iterator end()\n";
+ }
+ Filtration_simplex_iterator it(this->b);
+ it.position = this->b->simplex_associated_to_key.size();
+ return it;
+ }
+
+ private:
+ Bitmap_cubical_complex<T>* b;
+ };
+
+
+
+ //*********************************************//
+ // Methods to access iterators from the container:
+
+ /**
+ * boundary_simplex_range creates an object of a Boundary_simplex_range class
+ * that provides ranges for the Boundary_simplex_iterator.
+ **/
+ Boundary_simplex_range boundary_simplex_range(Simplex_handle sh) {
+ return this->get_boundary_of_a_cell(sh);
+ }
+
+ /**
+ * filtration_simplex_range creates an object of a Filtration_simplex_range class
+ * that provides ranges for the Filtration_simplex_iterator.
+ **/
+ Filtration_simplex_range filtration_simplex_range() {
+ if (globalDbg) {
+ std::cerr << "Filtration_simplex_range filtration_simplex_range()\n";
+ }
+ // Returns a range over the simplices of the complex in the order of the filtration
+ return Filtration_simplex_range(this);
+ }
+ //*********************************************//
+
+
+
+ //*********************************************//
+ // Elements which are in Gudhi now, but I (and in all the cases I asked also Marc) do not understand why they are
+ // there.
+ // TODO(PD) the file IndexingTag.h in the Gudhi library contains an empty structure, so
+ // I understand that this is something that was planned (for simplicial maps?)
+ // but was never finished. The only idea I have here is to use the same empty structure from
+ // IndexingTag.h file, but only if the compiler needs it. If the compiler
+ // do not need it, then I would rather not add here elements which I do not understand.
+ // typedef Indexing_tag
+
+ /**
+ * Function needed for compatibility with Gudhi. Not useful for other purposes.
+ **/
+ std::pair<Simplex_handle, Simplex_handle> endpoints(Simplex_handle sh) {
+ std::vector< size_t > bdry = this->get_boundary_of_a_cell(sh);
+ if (globalDbg) {
+ std::cerr << "std::pair<Simplex_handle, Simplex_handle> endpoints( Simplex_handle sh )\n";
+ std::cerr << "bdry.size() : " << bdry.size() << std::endl;
+ }
+ // this method returns two first elements from the boundary of sh.
+ if (bdry.size() < 2)
+ throw("Error in endpoints in Bitmap_cubical_complex class. The cell have less than two elements in the "
+ "boundary.");
+ return std::make_pair(bdry[0], bdry[1]);
+ }
+
+
+ /**
+ * Class needed for compatibility with Gudhi. Not useful for other purposes.
+ **/
+ class Skeleton_simplex_range;
+
+ class Skeleton_simplex_iterator : std::iterator< std::input_iterator_tag, Simplex_handle > {
+ // Iterator over all simplices of the complex in the order of the indexing scheme.
+ // 'value_type' must be 'Simplex_handle'.
+ public:
+ Skeleton_simplex_iterator(Bitmap_cubical_complex* b, size_t d) : b(b), dimension(d) {
+ if (globalDbg) {
+ std::cerr << "Skeleton_simplex_iterator ( Bitmap_cubical_complex* b , size_t d )\n";
+ }
+ // find the position of the first simplex of a dimension d
+ this->position = 0;
+ while (
+ (this->position != b->data.size()) &&
+ (this->b->get_dimension_of_a_cell(this->position) != this->dimension)
+ ) {
+ ++this->position;
+ }
+ }
+
+ Skeleton_simplex_iterator() : b(NULL), position(0), dimension(0) { }
+
+ Skeleton_simplex_iterator operator++() {
+ if (globalDbg) {
+ std::cerr << "Skeleton_simplex_iterator operator++()\n";
+ }
+ // increment the position as long as you did not get to the next element of the dimension dimension.
+ ++this->position;
+ while (
+ (this->position != this->b->data.size()) &&
+ (this->b->get_dimension_of_a_cell(this->position) != this->dimension)
+ ) {
+ ++this->position;
+ }
+ return (*this);
+ }
+
+ Skeleton_simplex_iterator operator++(int) {
+ Skeleton_simplex_iterator result = *this;
+ ++(*this);
+ return result;
+ }
+
+ Skeleton_simplex_iterator& operator=(const Skeleton_simplex_iterator& rhs) {
+ if (globalDbg) {
+ std::cerr << "Skeleton_simplex_iterator operator =\n";
+ }
+ this->b = rhs.b;
+ this->position = rhs.position;
+ this->dimension = rhs.dimension;
+ return (*this);
+ }
+
+ bool operator==(const Skeleton_simplex_iterator& rhs)const {
+ if (globalDbg) {
+ std::cerr << "bool operator ==\n";
+ }
+ return ( this->position == rhs.position);
+ }
+
+ bool operator!=(const Skeleton_simplex_iterator& rhs)const {
+ if (globalDbg) {
+ std::cerr << "bool operator != ( const Skeleton_simplex_iterator& rhs )\n";
+ }
+ return !(*this == rhs);
+ }
+
+ Simplex_handle operator*() {
+ if (globalDbg) {
+ std::cerr << "Simplex_handle operator*() \n";
+ }
+ return this->position;
+ }
+
+ friend class Skeleton_simplex_range;
+ private:
+ Bitmap_cubical_complex<T>* b;
+ size_t position;
+ unsigned dimension;
+ };
+
+ /**
+ * @brief Class needed for compatibility with Gudhi. Not useful for other purposes.
+ **/
+ class Skeleton_simplex_range {
+ // Range over the simplices of the complex in the order of the filtration.
+ // .begin() and .end() return type Filtration_simplex_iterator.
+ public:
+ typedef Skeleton_simplex_iterator const_iterator;
+ typedef Skeleton_simplex_iterator iterator;
+
+ Skeleton_simplex_range(Bitmap_cubical_complex<T>* b, unsigned dimension) : b(b), dimension(dimension) { }
+
+ Skeleton_simplex_iterator begin() {
+ if (globalDbg) {
+ std::cerr << "Skeleton_simplex_iterator begin()\n";
+ }
+ return Skeleton_simplex_iterator(this->b, this->dimension);
+ }
+
+ Skeleton_simplex_iterator end() {
+ if (globalDbg) {
+ std::cerr << "Skeleton_simplex_iterator end()\n";
+ }
+ Skeleton_simplex_iterator it(this->b, this->dimension);
+ it.position = this->b->data.size();
+ return it;
+ }
+
+ private:
+ Bitmap_cubical_complex<T>* b;
+ unsigned dimension;
+ };
+
+ /**
+ * Function needed for compatibility with Gudhi. Not useful for other purposes.
+ **/
+ Skeleton_simplex_range skeleton_simplex_range(unsigned dimension) {
+ if (globalDbg) {
+ std::cerr << "Skeleton_simplex_range skeleton_simplex_range( unsigned dimension )\n";
+ }
+ return Skeleton_simplex_range(this, dimension);
+ }
+
+ friend class is_before_in_filtration<T>;
+
+ protected:
+ std::vector< size_t > key_associated_to_simplex;
+ std::vector< size_t > simplex_associated_to_key;
+}; // Bitmap_cubical_complex
+
+template <typename T>
+void Bitmap_cubical_complex<T>::initialize_simplex_associated_to_key() {
+ if (globalDbg) {
+ std::cerr << "void Bitmap_cubical_complex<T>::initialize_elements_ordered_according_to_filtration() \n";
+ }
+ this->simplex_associated_to_key = std::vector<size_t>(this->data.size());
+ std::iota(std::begin(simplex_associated_to_key), std::end(simplex_associated_to_key), 0);
+#ifdef GUDHI_USE_TBB
+ tbb::parallel_sort(simplex_associated_to_key.begin(), simplex_associated_to_key.end(),
+ is_before_in_filtration<T>(this));
+#else
+ std::sort(simplex_associated_to_key.begin(), simplex_associated_to_key.end(), is_before_in_filtration<T>(this));
+#endif
+
+ // we still need to deal here with a key_associated_to_simplex:
+ for ( size_t i = 0 ; i != simplex_associated_to_key.size() ; ++i ) {
+ this->key_associated_to_simplex[ simplex_associated_to_key[i] ] = i;
+ }
+}
+
+template <typename T>
+class is_before_in_filtration {
+ public:
+ explicit is_before_in_filtration(Bitmap_cubical_complex<T> * CC)
+ : CC_(CC) { }
+
+ bool operator()(const typename Bitmap_cubical_complex<T>::Simplex_handle& sh1,
+ const typename Bitmap_cubical_complex<T>::Simplex_handle& sh2) const {
+ // Not using st_->filtration(sh1) because it uselessly tests for null_simplex.
+ typename T::filtration_type fil1 = CC_->data[sh1];
+ typename T::filtration_type fil2 = CC_->data[sh2];
+ if (fil1 != fil2) {
+ return fil1 < fil2;
+ }
+ // in this case they are on the same filtration level, so the dimension decide.
+ size_t dim1 = CC_->get_dimension_of_a_cell(sh1);
+ size_t dim2 = CC_->get_dimension_of_a_cell(sh2);
+ if (dim1 != dim2) {
+ return dim1 < dim2;
+ }
+ // in this case both filtration and dimensions of the considered cubes are the same. To have stable sort, we simply
+ // compare their positions in the bitmap:
+ return sh1 < sh2;
+ }
+
+ protected:
+ Bitmap_cubical_complex<T>* CC_;
+};
+
+} // namespace cubical_complex
+
+namespace Cubical_complex = cubical_complex;
+
+} // namespace Gudhi
+
+#endif // BITMAP_CUBICAL_COMPLEX_H_
diff --git a/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex/counter.h b/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex/counter.h
new file mode 100644
index 00000000..4b072f10
--- /dev/null
+++ b/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex/counter.h
@@ -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
+ *
+ * Copyright (C) 2015 INRIA Sophia-Saclay (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BITMAP_CUBICAL_COMPLEX_COUNTER_H_
+#define BITMAP_CUBICAL_COMPLEX_COUNTER_H_
+
+#include <iostream>
+#include <vector>
+
+namespace Gudhi {
+
+namespace cubical_complex {
+
+/**
+ * @brief This is an implementation of a counter being a vector of integers.
+ * @details The constructor of the class takes as an input two vectors W and V.
+ * It assumes that W < V coordinatewise.
+ * If the initial counter W is not specified, it is assumed to be vector of zeros.
+ * The class allows to iterate between W and V by using increment() function.
+ * The increment() function returns a bool value.
+ * The current counter reach the end counter V if the value returned by the increment function is FALSE.
+ * This class is needed for the implementation of a bitmapCubicalComplex.
+ **/
+class counter {
+ public:
+ /**
+ * Constructor of a counter class. It takes only the parameter which is the end value of the counter.
+ * The default beginning value is a vector of the same length as the endd, filled-in with zeros.
+ **/
+ counter(const std::vector<unsigned>& endd) : begin(endd.size(), 0), end(endd), current(endd.size(), 0) { }
+
+ /**
+ * Constructor of a counter class. It takes as the input beginn and end vector.
+ * It assumes that begin vector is lexicographically below the end vector.
+ **/
+ counter(const std::vector< unsigned >& beginn, const std::vector< unsigned >& endd) : begin(beginn), end(endd), current(endd.size(), 0) {
+ if (beginn.size() != endd.size())
+ throw "In constructor of a counter, begin and end vectors do not have the same size. Program terminate";
+ }
+
+ /**
+ * Function to increment the counter. If the value returned by the function is true,
+ * then the incrementation process was successful.
+ * If the value of the function is false, that means, that the counter have reached its end-value.
+ **/
+ bool increment() {
+ size_t i = 0;
+ while ((i != this->end.size()) && (this->current[i] == this->end[i])) {
+ ++i;
+ }
+
+ if (i == this->end.size())return false;
+ ++this->current[i];
+ for (size_t j = 0; j != i; ++j) {
+ this->current[j] = this->begin[j];
+ }
+ return true;
+ }
+
+ /**
+ * Function to check if we are at the end of counter.
+ **/
+ bool isFinal() {
+ for (size_t i = 0; i != this->current.size(); ++i) {
+ if (this->current[i] == this->end[i])return true;
+ }
+ return false;
+ }
+
+ /**
+ * Function required in the implementation of bitmapCubicalComplexWPeriodicBoundaryCondition.
+ * Its aim is to find an counter corresponding to the element the following
+ * boundary element is identified with when periodic boundary conditions are imposed.
+ **/
+ std::vector< unsigned > find_opposite(const std::vector< bool >& directionsForPeriodicBCond) {
+ std::vector< unsigned > result;
+ for (size_t i = 0; i != this->current.size(); ++i) {
+ if ((this->current[i] == this->end[i]) && (directionsForPeriodicBCond[i] == true)) {
+ result.push_back(this->begin[i]);
+ } else {
+ result.push_back(this->current[i]);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Function checking at which positions the current value of a counter is the final value of the counter.
+ **/
+ std::vector< bool > directions_of_finals() {
+ std::vector< bool > result;
+ for (size_t i = 0; i != this->current.size(); ++i) {
+ if (this->current[i] == this->end[i]) {
+ result.push_back(true);
+ } else {
+ result.push_back(false);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Function to write counter to the stream.
+ **/
+ friend std::ostream& operator<<(std::ostream& out, const counter& c) {
+ // std::cerr << "c.current.size() : " << c.current.size() << endl;
+ for (size_t i = 0; i != c.current.size(); ++i) {
+ out << c.current[i] << " ";
+ }
+ return out;
+ }
+
+ private:
+ std::vector< unsigned > begin;
+ std::vector< unsigned > end;
+ std::vector< unsigned > current;
+};
+
+} // namespace cubical_complex
+
+namespace Cubical_complex = cubical_complex;
+
+} // namespace Gudhi
+
+#endif // BITMAP_CUBICAL_COMPLEX_COUNTER_H_
diff --git a/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_base.h b/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_base.h
new file mode 100644
index 00000000..0442ac34
--- /dev/null
+++ b/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_base.h
@@ -0,0 +1,817 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2015 INRIA Sophia-Saclay (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BITMAP_CUBICAL_COMPLEX_BASE_H_
+#define BITMAP_CUBICAL_COMPLEX_BASE_H_
+
+#include <gudhi/Bitmap_cubical_complex/counter.h>
+
+#include <iostream>
+#include <vector>
+#include <string>
+#include <fstream>
+#include <algorithm>
+#include <iterator>
+#include <limits>
+#include <utility> // for pair<>
+
+namespace Gudhi {
+
+namespace cubical_complex {
+
+/**
+ * @brief Cubical complex represented as a bitmap, class with basic implementation.
+ * @ingroup cubical_complex
+ * @details This is a class implementing a basic bitmap data structure to store cubical complexes.
+ * It implements only the most basic subroutines.
+ * The idea of the bitmap is the following. Our aim is to have a memory efficient
+ * data structure to store d-dimensional cubical complex
+ * C being a cubical decomposition
+ * of a rectangular region of a space. This is achieved by storing C as a
+ * vector of bits (this is where the name 'bitmap' came from).
+ * Each cell is represented by a single
+ * bit (in case of black and white bitmaps, or by a single element of a type T
+ * (here T is a filtration type of a bitmap, typically a double).
+ * All the informations needed for homology and
+ * persistent homology computations (like dimension of a cell, boundary and
+ * coboundary elements of a cell, are then obtained from the
+ * position of the element in C.
+ * The default filtration used in this implementation is the lower star filtration.
+ */
+template <typename T>
+class Bitmap_cubical_complex_base {
+ public:
+ typedef T filtration_type;
+
+ /**
+ *Default constructor
+ **/
+ Bitmap_cubical_complex_base() :
+ total_number_of_cells(0) { }
+ /**
+ * There are a few constructors of a Bitmap_cubical_complex_base class.
+ * First one, that takes vector<unsigned>, creates an empty bitmap of a dimension equal
+ * the number of elements in the
+ * input vector and size in the i-th dimension equal the number in the position i-of the input vector.
+ */
+ Bitmap_cubical_complex_base(const std::vector<unsigned>& sizes);
+ /**
+ * The second constructor takes as a input a Perseus style file. For more details,
+ * please consult the documentations of
+ * Perseus software as well as examples attached to this
+ * implementation.
+ **/
+ Bitmap_cubical_complex_base(const char* perseus_style_file);
+ /**
+ * The last constructor of a Bitmap_cubical_complex_base class accepts vector of dimensions (as the first one)
+ * together with vector of filtration values of top dimensional cells.
+ **/
+ Bitmap_cubical_complex_base(const std::vector<unsigned>& dimensions, const std::vector<T>& top_dimensional_cells);
+
+ /**
+ * Destructor of the Bitmap_cubical_complex_base class.
+ **/
+ virtual ~Bitmap_cubical_complex_base() { }
+
+ /**
+ * The functions get_boundary_of_a_cell, get_coboundary_of_a_cell, get_dimension_of_a_cell
+ * and get_cell_data are the basic
+ * functions that compute boundary / coboundary / dimension and the filtration
+ * value form a position of a cell in the structure of a bitmap. The input parameter of all of those function is a
+ * non-negative integer, indicating a position of a cube in the data structure.
+ * In the case of functions that compute (co)boundary, the output is a vector if non-negative integers pointing to
+ * the positions of (co)boundary element of the input cell.
+ */
+ virtual inline std::vector< size_t > get_boundary_of_a_cell(size_t cell)const;
+ /**
+ * The functions get_coboundary_of_a_cell, get_coboundary_of_a_cell,
+ * get_dimension_of_a_cell and get_cell_data are the basic
+ * functions that compute boundary / coboundary / dimension and the filtration
+ * value form a position of a cell in the structure of a bitmap.
+ * The input parameter of all of those function is a non-negative integer,
+ * indicating a position of a cube in the data structure.
+ * In the case of functions that compute (co)boundary, the output is a vector if
+ * non-negative integers pointing to the
+ * positions of (co)boundary element of the input cell.
+ **/
+ virtual inline std::vector< size_t > get_coboundary_of_a_cell(size_t cell)const;
+ /**
+ * In the case of get_dimension_of_a_cell function, the output is a non-negative integer
+ * indicating the dimension of a cell.
+ **/
+ inline unsigned get_dimension_of_a_cell(size_t cell)const;
+ /**
+ * In the case of get_cell_data, the output parameter is a reference to the value of a cube in a given position.
+ * This allows reading and changing the value of filtration. Note that if the value of a filtration is changed, the
+ * code do not check if we have a filtration or not. i.e. it do not check if the value of a filtration of a cell is
+ * not smaller than the value of a filtration of its boundary and not greater than the value of its coboundary.
+ **/
+ inline T& get_cell_data(size_t cell);
+
+
+ /**
+ * Typical input used to construct a baseBitmap class is a filtration given at the top dimensional cells.
+ * Then, there are a few ways one can pick the filtration of lower dimensional
+ * cells. The most typical one is by so called lower star filtration. This function is always called by any
+ * constructor which takes the top dimensional cells. If you use such a constructor,
+ * then there is no need to call this function. Call it only if you are putting the filtration
+ * of the cells by your own (for instance by using Top_dimensional_cells_iterator).
+ **/
+ void impose_lower_star_filtration(); // assume that top dimensional cells are already set.
+
+ /**
+ * Returns dimension of a complex.
+ **/
+ inline unsigned dimension()const {
+ return sizes.size();
+ }
+
+ /**
+ * Returns number of all cubes in the data structure.
+ **/
+ inline unsigned size()const {
+ return this->data.size();
+ }
+
+ /**
+ * Writing to stream operator. By using it we get the values T of cells in order in which they are stored in the
+ * structure. This procedure is used for debugging purposes.
+ **/
+ template <typename K>
+ friend std::ostream& operator<<(std::ostream & os, const Bitmap_cubical_complex_base<K>& b);
+
+ /**
+ * Function that put the input data to bins. By putting data to bins we mean rounding them to a sequence of values
+ * equally distributed in the range of data.
+ * Sometimes if most of the cells have different birth-death times, the performance of the algorithms to compute
+ * persistence gets worst. When dealing with this type of data, one may want to put different values on cells to
+ * some number of bins. The function put_data_to_bins( size_t number_of_bins ) is designed for that purpose.
+ * The parameter of the function is the number of bins (distinct values) we want to have in the cubical complex.
+ **/
+ void put_data_to_bins(size_t number_of_bins);
+
+ /**
+ * Function that put the input data to bins. By putting data to bins we mean rounding them to a sequence of values
+ * equally distributed in the range of data.
+ * Sometimes if most of the cells have different birth-death times, the performance of the algorithms to compute
+ * persistence gets worst. When dealing with this type of data, one may want to put different values on cells to
+ * some number of bins. The function put_data_to_bins( T diameter_of_bin ) is designed for that purpose.
+ * The parameter of it is the diameter of each bin. Note that the bottleneck distance between the persistence
+ * diagram of the cubical complex before and after using such a function will be bounded by the parameter
+ * diameter_of_bin.
+ **/
+ void put_data_to_bins(T diameter_of_bin);
+
+ /**
+ * Functions to find min and max values of filtration.
+ **/
+ std::pair< T, T > min_max_filtration();
+
+ // ITERATORS
+
+ /**
+ * @brief Iterator through all cells in the complex (in order they appear in the structure -- i.e.
+ * in lexicographical order).
+ **/
+ class All_cells_iterator : std::iterator< std::input_iterator_tag, T > {
+ public:
+ All_cells_iterator() {
+ this->counter = 0;
+ }
+
+ All_cells_iterator operator++() {
+ // first find first element of the counter that can be increased:
+ ++this->counter;
+ return *this;
+ }
+
+ All_cells_iterator operator++(int) {
+ All_cells_iterator result = *this;
+ ++(*this);
+ return result;
+ }
+
+ All_cells_iterator& operator=(const All_cells_iterator& rhs) {
+ this->counter = rhs.counter;
+ return *this;
+ }
+
+ bool operator==(const All_cells_iterator& rhs)const {
+ if (this->counter != rhs.counter)return false;
+ return true;
+ }
+
+ bool operator!=(const All_cells_iterator& rhs)const {
+ return !(*this == rhs);
+ }
+
+ /*
+ * The operator * returns position of a cube in the structure of cubical complex. This position can be then used as
+ * an argument of the following functions:
+ * get_boundary_of_a_cell, get_coboundary_of_a_cell, get_dimension_of_a_cell to get information about the cell
+ * boundary and coboundary and dimension
+ * and in function get_cell_data to get a filtration of a cell.
+ */
+ size_t operator*() {
+ return this->counter;
+ }
+ friend class Bitmap_cubical_complex_base;
+ protected:
+ size_t counter;
+ };
+
+ /**
+ * Function returning a All_cells_iterator to the first cell of the bitmap.
+ **/
+ All_cells_iterator all_cells_iterator_begin() {
+ All_cells_iterator a;
+ return a;
+ }
+
+ /**
+ * Function returning a All_cells_iterator to the last cell of the bitmap.
+ **/
+ All_cells_iterator all_cells_iterator_end() {
+ All_cells_iterator a;
+ a.counter = this->data.size();
+ return a;
+ }
+
+ /**
+ * @brief All_cells_range class provides ranges for All_cells_iterator
+ **/
+ class All_cells_range {
+ public:
+ All_cells_range(Bitmap_cubical_complex_base* b) : b(b) { }
+
+ All_cells_iterator begin() {
+ return b->all_cells_iterator_begin();
+ }
+
+ All_cells_iterator end() {
+ return b->all_cells_iterator_end();
+ }
+ private:
+ Bitmap_cubical_complex_base<T>* b;
+ };
+
+ All_cells_range all_cells_range() {
+ return All_cells_range(this);
+ }
+
+
+ /**
+ * Boundary_range class provides ranges for boundary iterators.
+ **/
+ typedef typename std::vector< size_t >::const_iterator Boundary_iterator;
+ typedef typename std::vector< size_t > Boundary_range;
+
+ /**
+ * boundary_simplex_range creates an object of a Boundary_simplex_range class
+ * that provides ranges for the Boundary_simplex_iterator.
+ **/
+ Boundary_range boundary_range(size_t sh) {
+ return this->get_boundary_of_a_cell(sh);
+ }
+
+ /**
+ * Coboundary_range class provides ranges for boundary iterators.
+ **/
+ typedef typename std::vector< size_t >::const_iterator Coboundary_iterator;
+ typedef typename std::vector< size_t > Coboundary_range;
+
+ /**
+ * boundary_simplex_range creates an object of a Boundary_simplex_range class
+ * that provides ranges for the Boundary_simplex_iterator.
+ **/
+ Coboundary_range coboundary_range(size_t sh) {
+ return this->get_coboundary_of_a_cell(sh);
+ }
+
+ /**
+ * @brief Iterator through top dimensional cells of the complex. The cells appear in order they are stored
+ * in the structure (i.e. in lexicographical order)
+ **/
+ class Top_dimensional_cells_iterator : std::iterator< std::input_iterator_tag, T > {
+ public:
+ Top_dimensional_cells_iterator(Bitmap_cubical_complex_base& b) : b(b) {
+ this->counter = std::vector<size_t>(b.dimension());
+ // std::fill( this->counter.begin() , this->counter.end() , 0 );
+ }
+
+ Top_dimensional_cells_iterator operator++() {
+ // first find first element of the counter that can be increased:
+ size_t dim = 0;
+ while ((dim != this->b.dimension()) && (this->counter[dim] == this->b.sizes[dim] - 1))++dim;
+
+ if (dim != this->b.dimension()) {
+ ++this->counter[dim];
+ for (size_t i = 0; i != dim; ++i) {
+ this->counter[i] = 0;
+ }
+ } else {
+ ++this->counter[0];
+ }
+ return *this;
+ }
+
+ Top_dimensional_cells_iterator operator++(int) {
+ Top_dimensional_cells_iterator result = *this;
+ ++(*this);
+ return result;
+ }
+
+ Top_dimensional_cells_iterator& operator=(const Top_dimensional_cells_iterator& rhs) {
+ this->counter = rhs.counter;
+ this->b = rhs.b;
+ return *this;
+ }
+
+ bool operator==(const Top_dimensional_cells_iterator& rhs)const {
+ if (&this->b != &rhs.b)return false;
+ if (this->counter.size() != rhs.counter.size())return false;
+ for (size_t i = 0; i != this->counter.size(); ++i) {
+ if (this->counter[i] != rhs.counter[i])return false;
+ }
+ return true;
+ }
+
+ bool operator!=(const Top_dimensional_cells_iterator& rhs)const {
+ return !(*this == rhs);
+ }
+
+ /*
+ * The operator * returns position of a cube in the structure of cubical complex. This position can be then used as
+ * an argument of the following functions:
+ * get_boundary_of_a_cell, get_coboundary_of_a_cell, get_dimension_of_a_cell to get information about the cell
+ * boundary and coboundary and dimension
+ * and in function get_cell_data to get a filtration of a cell.
+ */
+ size_t operator*() {
+ return this->compute_index_in_bitmap();
+ }
+
+ size_t compute_index_in_bitmap()const {
+ size_t index = 0;
+ for (size_t i = 0; i != this->counter.size(); ++i) {
+ index += (2 * this->counter[i] + 1) * this->b.multipliers[i];
+ }
+ return index;
+ }
+
+ void print_counter()const {
+ for (size_t i = 0; i != this->counter.size(); ++i) {
+ std::cout << this->counter[i] << " ";
+ }
+ }
+ friend class Bitmap_cubical_complex_base;
+ protected:
+ std::vector< size_t > counter;
+ Bitmap_cubical_complex_base& b;
+ };
+
+ /**
+ * Function returning a Top_dimensional_cells_iterator to the first top dimensional cell of the bitmap.
+ **/
+ Top_dimensional_cells_iterator top_dimensional_cells_iterator_begin() {
+ Top_dimensional_cells_iterator a(*this);
+ return a;
+ }
+
+ /**
+ * Function returning a Top_dimensional_cells_iterator to the last top dimensional cell of the bitmap.
+ **/
+ Top_dimensional_cells_iterator top_dimensional_cells_iterator_end() {
+ Top_dimensional_cells_iterator a(*this);
+ for (size_t i = 0; i != this->dimension(); ++i) {
+ a.counter[i] = this->sizes[i] - 1;
+ }
+ a.counter[0]++;
+ return a;
+ }
+
+ /**
+ * @brief Top_dimensional_cells_iterator_range class provides ranges for Top_dimensional_cells_iterator_range
+ **/
+ class Top_dimensional_cells_range {
+ public:
+ Top_dimensional_cells_range(Bitmap_cubical_complex_base* b) : b(b) { }
+
+ Top_dimensional_cells_iterator begin() {
+ return b->top_dimensional_cells_iterator_begin();
+ }
+
+ Top_dimensional_cells_iterator end() {
+ return b->top_dimensional_cells_iterator_end();
+ }
+ private:
+ Bitmap_cubical_complex_base<T>* b;
+ };
+
+ Top_dimensional_cells_range top_dimensional_cells_range() {
+ return Top_dimensional_cells_range(this);
+ }
+
+
+ //****************************************************************************************************************//
+ //****************************************************************************************************************//
+ //****************************************************************************************************************//
+ //****************************************************************************************************************//
+
+ inline size_t number_cells()const {
+ return this->total_number_of_cells;
+ }
+
+ //****************************************************************************************************************//
+ //****************************************************************************************************************//
+ //****************************************************************************************************************//
+ //****************************************************************************************************************//
+
+ protected:
+ std::vector<unsigned> sizes;
+ std::vector<unsigned> multipliers;
+ std::vector<T> data;
+ size_t total_number_of_cells;
+
+ void set_up_containers(const std::vector<unsigned>& sizes) {
+ unsigned multiplier = 1;
+ for (size_t i = 0; i != sizes.size(); ++i) {
+ this->sizes.push_back(sizes[i]);
+ this->multipliers.push_back(multiplier);
+ multiplier *= 2 * sizes[i] + 1;
+ }
+ this->data = std::vector<T>(multiplier, std::numeric_limits<T>::max());
+ this->total_number_of_cells = multiplier;
+ }
+
+ size_t compute_position_in_bitmap(const std::vector< unsigned >& counter) {
+ size_t position = 0;
+ for (size_t i = 0; i != this->multipliers.size(); ++i) {
+ position += this->multipliers[i] * counter[i];
+ }
+ return position;
+ }
+
+ std::vector<unsigned> compute_counter_for_given_cell(size_t cell)const {
+ std::vector<unsigned> counter;
+ counter.reserve(this->sizes.size());
+ for (size_t dim = this->sizes.size(); dim != 0; --dim) {
+ counter.push_back(cell / this->multipliers[dim - 1]);
+ cell = cell % this->multipliers[dim - 1];
+ }
+ std::reverse(counter.begin(), counter.end());
+ return counter;
+ }
+ void read_perseus_style_file(const char* perseus_style_file);
+ void setup_bitmap_based_on_top_dimensional_cells_list(const std::vector<unsigned>& sizes_in_following_directions,
+ const std::vector<T>& top_dimensional_cells);
+ Bitmap_cubical_complex_base(const char* perseus_style_file, std::vector<bool> directions);
+ Bitmap_cubical_complex_base(const std::vector<unsigned>& sizes, std::vector<bool> directions);
+ Bitmap_cubical_complex_base(const std::vector<unsigned>& dimensions,
+ const std::vector<T>& top_dimensional_cells,
+ std::vector<bool> directions);
+};
+
+template <typename T>
+void Bitmap_cubical_complex_base<T>::put_data_to_bins(size_t number_of_bins) {
+ bool bdg = false;
+
+ std::pair< T, T > min_max = this->min_max_filtration();
+ T dx = (min_max.second - min_max.first) / (T) number_of_bins;
+
+ // now put the data into the appropriate bins:
+ for (size_t i = 0; i != this->data.size(); ++i) {
+ if (bdg) {
+ std::cerr << "Before binning : " << this->data[i] << std::endl;
+ }
+ this->data[i] = min_max.first + dx * (this->data[i] - min_max.first) / number_of_bins;
+ if (bdg) {
+ std::cerr << "After binning : " << this->data[i] << std::endl;
+ getchar();
+ }
+ }
+}
+
+template <typename T>
+void Bitmap_cubical_complex_base<T>::put_data_to_bins(T diameter_of_bin) {
+ bool bdg = false;
+ std::pair< T, T > min_max = this->min_max_filtration();
+
+ size_t number_of_bins = (min_max.second - min_max.first) / diameter_of_bin;
+ // now put the data into the appropriate bins:
+ for (size_t i = 0; i != this->data.size(); ++i) {
+ if (bdg) {
+ std::cerr << "Before binning : " << this->data[i] << std::endl;
+ }
+ this->data[i] = min_max.first + diameter_of_bin * (this->data[i] - min_max.first) / number_of_bins;
+ if (bdg) {
+ std::cerr << "After binning : " << this->data[i] << std::endl;
+ getchar();
+ }
+ }
+}
+
+template <typename T>
+std::pair< T, T > Bitmap_cubical_complex_base<T>::min_max_filtration() {
+ std::pair< T, T > min_max(std::numeric_limits<T>::max(), std::numeric_limits<T>::min());
+ for (size_t i = 0; i != this->data.size(); ++i) {
+ if (this->data[i] < min_max.first)min_max.first = this->data[i];
+ if (this->data[i] > min_max.second)min_max.second = this->data[i];
+ }
+ return min_max;
+}
+
+template <typename K>
+std::ostream& operator<<(std::ostream & out, const Bitmap_cubical_complex_base<K>& b) {
+ for (typename Bitmap_cubical_complex_base<K>::all_cells_const_iterator
+ it = b.all_cells_const_begin(); it != b.all_cells_const_end(); ++it) {
+ out << *it << " ";
+ }
+ return out;
+}
+
+template <typename T>
+Bitmap_cubical_complex_base<T>::Bitmap_cubical_complex_base
+(const std::vector<unsigned>& sizes) {
+ this->set_up_containers(sizes);
+}
+
+template <typename T>
+void Bitmap_cubical_complex_base<T>::setup_bitmap_based_on_top_dimensional_cells_list(const std::vector<unsigned>& sizes_in_following_directions,
+ const std::vector<T>& top_dimensional_cells) {
+ this->set_up_containers(sizes_in_following_directions);
+
+ size_t number_of_top_dimensional_elements = 1;
+ for (size_t i = 0; i != sizes_in_following_directions.size(); ++i) {
+ number_of_top_dimensional_elements *= sizes_in_following_directions[i];
+ }
+ if (number_of_top_dimensional_elements != top_dimensional_cells.size()) {
+ std::cerr << "Error in constructor Bitmap_cubical_complex_base ( std::vector<size_t> sizes_in_following_directions"
+ << ", std::vector<T> top_dimensional_cells ). Number of top dimensional elements that follow from "
+ << "sizes_in_following_directions vector is different than the size of top_dimensional_cells vector."
+ << std::endl;
+ throw("Error in constructor Bitmap_cubical_complex_base( std::vector<size_t> sizes_in_following_directions,"
+ "std::vector<T> top_dimensional_cells ). Number of top dimensional elements that follow from "
+ "sizes_in_following_directions vector is different than the size of top_dimensional_cells vector.");
+ }
+
+ Bitmap_cubical_complex_base<T>::Top_dimensional_cells_iterator it(*this);
+ size_t index = 0;
+ for (it = this->top_dimensional_cells_iterator_begin(); it != this->top_dimensional_cells_iterator_end(); ++it) {
+ this->get_cell_data(*it) = top_dimensional_cells[index];
+ ++index;
+ }
+ this->impose_lower_star_filtration();
+}
+
+template <typename T>
+Bitmap_cubical_complex_base<T>::Bitmap_cubical_complex_base
+(const std::vector<unsigned>& sizes_in_following_directions, const std::vector<T>& top_dimensional_cells) {
+ this->setup_bitmap_based_on_top_dimensional_cells_list(sizes_in_following_directions, top_dimensional_cells);
+}
+
+template <typename T>
+void Bitmap_cubical_complex_base<T>::read_perseus_style_file(const char* perseus_style_file) {
+ bool dbg = false;
+ std::ifstream inFiltration;
+ inFiltration.open(perseus_style_file);
+ unsigned dimensionOfData;
+ inFiltration >> dimensionOfData;
+
+ if (dbg) {
+ std::cerr << "dimensionOfData : " << dimensionOfData << std::endl;
+ getchar();
+ }
+
+ std::vector<unsigned> sizes;
+ sizes.reserve(dimensionOfData);
+ for (size_t i = 0; i != dimensionOfData; ++i) {
+ unsigned size_in_this_dimension;
+ inFiltration >> size_in_this_dimension;
+ sizes.push_back(size_in_this_dimension);
+ if (dbg) {
+ std::cerr << "size_in_this_dimension : " << size_in_this_dimension << std::endl;
+ }
+ }
+ this->set_up_containers(sizes);
+
+ Bitmap_cubical_complex_base<T>::Top_dimensional_cells_iterator it(*this);
+ it = this->top_dimensional_cells_iterator_begin();
+
+ while (!inFiltration.eof()) {
+ T filtrationLevel;
+ inFiltration >> filtrationLevel;
+ if (dbg) {
+ std::cerr << "Cell of an index : "
+ << it.compute_index_in_bitmap()
+ << " and dimension: "
+ << this->get_dimension_of_a_cell(it.compute_index_in_bitmap())
+ << " get the value : " << filtrationLevel << std::endl;
+ }
+ this->get_cell_data(*it) = filtrationLevel;
+ ++it;
+ }
+ inFiltration.close();
+ this->impose_lower_star_filtration();
+}
+
+template <typename T>
+Bitmap_cubical_complex_base<T>::Bitmap_cubical_complex_base(const char* perseus_style_file,
+ std::vector<bool> directions) {
+ // this constructor is here just for compatibility with a class that creates cubical complexes with periodic boundary
+ // conditions.
+ // It ignores the last parameter of the function.
+ this->read_perseus_style_file(perseus_style_file);
+}
+
+template <typename T>
+Bitmap_cubical_complex_base<T>::Bitmap_cubical_complex_base(const std::vector<unsigned>& sizes,
+ std::vector<bool> directions) {
+ // this constructor is here just for compatibility with a class that creates cubical complexes with periodic boundary
+ // conditions.
+ // It ignores the last parameter of the function.
+ this->set_up_containers(sizes);
+}
+
+template <typename T>
+Bitmap_cubical_complex_base<T>::Bitmap_cubical_complex_base(const std::vector<unsigned>& dimensions,
+ const std::vector<T>& top_dimensional_cells,
+ std::vector<bool> directions) {
+ // this constructor is here just for compatibility with a class that creates cubical complexes with periodic boundary
+ // conditions.
+ // It ignores the last parameter of the function.
+ this->setup_bitmap_based_on_top_dimensional_cells_list(dimensions, top_dimensional_cells);
+}
+
+template <typename T>
+Bitmap_cubical_complex_base<T>::Bitmap_cubical_complex_base(const char* perseus_style_file) {
+ this->read_perseus_style_file(perseus_style_file);
+}
+
+template <typename T>
+std::vector< size_t > Bitmap_cubical_complex_base<T>::get_boundary_of_a_cell(size_t cell)const {
+ std::vector< size_t > boundary_elements;
+
+ // Speed traded of for memory. Check if it is better in practice.
+ boundary_elements.reserve(this->dimension()*2);
+
+ size_t cell1 = cell;
+ for (size_t i = this->multipliers.size(); i != 0; --i) {
+ unsigned position = cell1 / this->multipliers[i - 1];
+ if (position % 2 == 1) {
+ boundary_elements.push_back(cell - this->multipliers[ i - 1 ]);
+ boundary_elements.push_back(cell + this->multipliers[ i - 1 ]);
+ }
+ cell1 = cell1 % this->multipliers[i - 1];
+ }
+ return boundary_elements;
+}
+
+template <typename T>
+std::vector< size_t > Bitmap_cubical_complex_base<T>::get_coboundary_of_a_cell(size_t cell)const {
+ std::vector<unsigned> counter = this->compute_counter_for_given_cell(cell);
+ std::vector< size_t > coboundary_elements;
+ size_t cell1 = cell;
+ for (size_t i = this->multipliers.size(); i != 0; --i) {
+ unsigned position = cell1 / this->multipliers[i - 1];
+ if (position % 2 == 0) {
+ if ((cell > this->multipliers[i - 1]) && (counter[i - 1] != 0)) {
+ coboundary_elements.push_back(cell - this->multipliers[i - 1]);
+ }
+ if (
+ (cell + this->multipliers[i - 1] < this->data.size()) && (counter[i - 1] != 2 * this->sizes[i - 1])) {
+ coboundary_elements.push_back(cell + this->multipliers[i - 1]);
+ }
+ }
+ cell1 = cell1 % this->multipliers[i - 1];
+ }
+ return coboundary_elements;
+}
+
+template <typename T>
+unsigned Bitmap_cubical_complex_base<T>::get_dimension_of_a_cell(size_t cell)const {
+ bool dbg = false;
+ if (dbg) std::cerr << "\n\n\n Computing position o a cell of an index : " << cell << std::endl;
+ unsigned dimension = 0;
+ for (size_t i = this->multipliers.size(); i != 0; --i) {
+ unsigned position = cell / this->multipliers[i - 1];
+
+ if (dbg) {
+ std::cerr << "i-1 :" << i - 1 << std::endl;
+ std::cerr << "cell : " << cell << std::endl;
+ std::cerr << "position : " << position << std::endl;
+ std::cerr << "multipliers[" << i - 1 << "] = " << this->multipliers[i - 1] << std::endl;
+ getchar();
+ }
+
+ if (position % 2 == 1) {
+ if (dbg) std::cerr << "Nonzero length in this direction \n";
+ dimension++;
+ }
+ cell = cell % this->multipliers[i - 1];
+ }
+ return dimension;
+}
+
+template <typename T>
+inline T& Bitmap_cubical_complex_base<T>::get_cell_data(size_t cell) {
+ return this->data[cell];
+}
+
+template <typename T>
+void Bitmap_cubical_complex_base<T>::impose_lower_star_filtration() {
+ bool dbg = false;
+
+ // this vector will be used to check which elements have already been taken care of in imposing lower star filtration
+ std::vector<bool> is_this_cell_considered(this->data.size(), false);
+
+ size_t size_to_reserve = 1;
+ for (size_t i = 0; i != this->multipliers.size(); ++i) {
+ size_to_reserve *= (size_t) ((this->multipliers[i] - 1) / 2);
+ }
+
+ std::vector<size_t> indices_to_consider;
+ indices_to_consider.reserve(size_to_reserve);
+ // we assume here that we already have a filtration on the top dimensional cells and
+ // we have to extend it to lower ones.
+ typename Bitmap_cubical_complex_base<T>::Top_dimensional_cells_iterator it(*this);
+ for (it = this->top_dimensional_cells_iterator_begin(); it != this->top_dimensional_cells_iterator_end(); ++it) {
+ indices_to_consider.push_back(it.compute_index_in_bitmap());
+ }
+
+ while (indices_to_consider.size()) {
+ if (dbg) {
+ std::cerr << "indices_to_consider in this iteration \n";
+ for (size_t i = 0; i != indices_to_consider.size(); ++i) {
+ std::cout << indices_to_consider[i] << " ";
+ }
+ getchar();
+ }
+ std::vector<size_t> new_indices_to_consider;
+ for (size_t i = 0; i != indices_to_consider.size(); ++i) {
+ std::vector<size_t> bd = this->get_boundary_of_a_cell(indices_to_consider[i]);
+ for (size_t boundaryIt = 0; boundaryIt != bd.size(); ++boundaryIt) {
+ if (dbg) {
+ std::cerr << "filtration of a cell : " << bd[boundaryIt] << " is : " << this->data[ bd[boundaryIt] ]
+ << " while of a cell: " << indices_to_consider[i] << " is: " << this->data[ indices_to_consider[i] ]
+ << std::endl;
+ getchar();
+ }
+ if (this->data[ bd[boundaryIt] ] > this->data[ indices_to_consider[i] ]) {
+ this->data[ bd[boundaryIt] ] = this->data[ indices_to_consider[i] ];
+ if (dbg) {
+ std::cerr << "Setting the value of a cell : " << bd[boundaryIt] << " to : "
+ << this->data[ indices_to_consider[i] ] << std::endl;
+ getchar();
+ }
+ }
+ if (is_this_cell_considered[ bd[boundaryIt] ] == false) {
+ new_indices_to_consider.push_back(bd[boundaryIt]);
+ is_this_cell_considered[ bd[boundaryIt] ] = true;
+ }
+ }
+ }
+ indices_to_consider.swap(new_indices_to_consider);
+ }
+}
+
+template <typename T>
+bool compareFirstElementsOfTuples(const std::pair< std::pair< T, size_t >, char >& first,
+ const std::pair< std::pair< T, size_t >, char >& second) {
+ if (first.first.first < second.first.first) {
+ return true;
+ } else {
+ if (first.first.first > second.first.first) {
+ return false;
+ }
+ // in this case first.first.first == second.first.first, so we need to compare dimensions
+ return first.second < second.second;
+ }
+}
+
+} // namespace cubical_complex
+
+namespace Cubical_complex = cubical_complex;
+
+} // namespace Gudhi
+
+#endif // BITMAP_CUBICAL_COMPLEX_BASE_H_
diff --git a/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h b/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h
new file mode 100644
index 00000000..c3cc93dd
--- /dev/null
+++ b/src/Bitmap_cubical_complex/include/gudhi/Bitmap_cubical_complex_periodic_boundary_conditions_base.h
@@ -0,0 +1,308 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 2015 INRIA Sophia-Saclay (France)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BITMAP_CUBICAL_COMPLEX_PERIODIC_BOUNDARY_CONDITIONS_BASE_H_
+#define BITMAP_CUBICAL_COMPLEX_PERIODIC_BOUNDARY_CONDITIONS_BASE_H_
+
+#include <gudhi/Bitmap_cubical_complex_base.h>
+
+#include <cmath>
+#include <limits> // for numeric_limits<>
+#include <vector>
+
+namespace Gudhi {
+
+namespace cubical_complex {
+
+// in this class, we are storing all the elements which are in normal bitmap (i.e. the bitmap without the periodic
+// boundary conditions). But, we set up the iterators and the procedures to compute boundary and coboundary in the way
+// that it is all right. We assume here that all the cells that are on the left / bottom and so on remains, while all
+// the cells on the right / top are not in the Bitmap_cubical_complex_periodic_boundary_conditions_base
+
+/**
+ * @brief Cubical complex with periodic boundary conditions represented as a bitmap.
+ * @ingroup cubical_complex
+ * @details This is a class implementing a bitmap data structure with periodic boundary conditions. Most of the functions are
+ * identical to the functions from Bitmap_cubical_complex_base.
+ * The ones that needed to be updated are the constructors and get_boundary_of_a_cell and get_coboundary_of_a_cell.
+ */
+template <typename T>
+class Bitmap_cubical_complex_periodic_boundary_conditions_base : public Bitmap_cubical_complex_base<T> {
+ public:
+ // constructors that take an extra parameter:
+
+ /**
+ * Default constructor of Bitmap_cubical_complex_periodic_boundary_conditions_base class.
+ */
+ Bitmap_cubical_complex_periodic_boundary_conditions_base() { }
+ /**
+ * A constructor of Bitmap_cubical_complex_periodic_boundary_conditions_base class that takes the following
+ * parameters: (1) vector with numbers of top dimensional cells in all dimensions and (2) vector of booleans. If
+ * at i-th position of this vector there is true value, that means that periodic boundary conditions are to be
+ * imposed in this direction. In case of false, the periodic boundary conditions will not be imposed in the direction
+ * i.
+ */
+ Bitmap_cubical_complex_periodic_boundary_conditions_base(const std::vector<unsigned>& sizes,
+ const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed);
+ /**
+ * A constructor of Bitmap_cubical_complex_periodic_boundary_conditions_base class that takes the name of Perseus
+ * style file as an input. Please consult the documentation about the specification of the file.
+ */
+ Bitmap_cubical_complex_periodic_boundary_conditions_base(const char* perseusStyleFile);
+ /**
+ * A constructor of Bitmap_cubical_complex_periodic_boundary_conditions_base class that takes the following
+ * parameters: (1) vector with numbers of top dimensional cells in all dimensions and (2) vector of top dimensional
+ * cells (ordered lexicographically) and (3) vector of booleans. If at i-th position of this vector there is true
+ * value, that means that periodic boundary conditions are to be imposed in this direction. In case of false, the
+ * periodic boundary conditions will not be imposed in the direction i.
+ */
+ Bitmap_cubical_complex_periodic_boundary_conditions_base(const std::vector<unsigned>& dimensions,
+ const std::vector<T>& topDimensionalCells,
+ const std::vector< bool >& directions_in_which_periodic_b_cond_are_to_be_imposed);
+
+ /**
+ * Destructor of the Bitmap_cubical_complex_periodic_boundary_conditions_base class.
+ **/
+ virtual ~Bitmap_cubical_complex_periodic_boundary_conditions_base() {}
+
+ // overwritten methods co compute boundary and coboundary
+ /**
+ * A version of a function that return boundary of a given cell for an object of
+ * Bitmap_cubical_complex_periodic_boundary_conditions_base class.
+ */
+ virtual std::vector< size_t > get_boundary_of_a_cell(size_t cell) const;
+
+ /**
+ * A version of a function that return coboundary of a given cell for an object of
+ * Bitmap_cubical_complex_periodic_boundary_conditions_base class.
+ */
+ virtual std::vector< size_t > get_coboundary_of_a_cell(size_t cell) const;
+
+ protected:
+ std::vector< bool > directions_in_which_periodic_b_cond_are_to_be_imposed;
+
+ void set_up_containers(const std::vector<unsigned>& sizes) {
+ unsigned multiplier = 1;
+ for (size_t i = 0; i != sizes.size(); ++i) {
+ this->sizes.push_back(sizes[i]);
+ this->multipliers.push_back(multiplier);
+
+ if (directions_in_which_periodic_b_cond_are_to_be_imposed[i]) {
+ multiplier *= 2 * sizes[i];
+ } else {
+ multiplier *= 2 * sizes[i] + 1;
+ }
+ }
+ // std::reverse( this->sizes.begin() , this->sizes.end() );
+ this->data = std::vector<T>(multiplier, std::numeric_limits<T>::max());
+ this->total_number_of_cells = multiplier;
+ }
+ Bitmap_cubical_complex_periodic_boundary_conditions_base(const std::vector<unsigned>& sizes);
+ Bitmap_cubical_complex_periodic_boundary_conditions_base(const std::vector<unsigned>& dimensions,
+ const std::vector<T>& topDimensionalCells);
+ void construct_complex_based_on_top_dimensional_cells(const std::vector<unsigned>& dimensions,
+ const std::vector<T>& topDimensionalCells,
+ const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed);
+};
+
+template <typename T>
+void Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::construct_complex_based_on_top_dimensional_cells(const std::vector<unsigned>& dimensions,
+ const std::vector<T>& topDimensionalCells,
+ const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed) {
+ this->directions_in_which_periodic_b_cond_are_to_be_imposed = directions_in_which_periodic_b_cond_are_to_be_imposed;
+ this->set_up_containers(dimensions);
+
+ size_t i = 0;
+ for (auto it = this->top_dimensional_cells_iterator_begin(); it != this->top_dimensional_cells_iterator_end(); ++it) {
+ this->get_cell_data(*it) = topDimensionalCells[i];
+ ++i;
+ }
+ this->impose_lower_star_filtration();
+}
+
+template <typename T>
+Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::Bitmap_cubical_complex_periodic_boundary_conditions_base(const std::vector<unsigned>& sizes,
+ const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed) {
+ this->directions_in_which_periodic_b_cond_are_to_be_imposed(directions_in_which_periodic_b_cond_are_to_be_imposed);
+ this->set_up_containers(sizes);
+}
+
+template <typename T>
+Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::Bitmap_cubical_complex_periodic_boundary_conditions_base(const char* perseus_style_file) {
+ // for Perseus style files:
+ bool dbg = false;
+
+ std::ifstream inFiltration;
+ inFiltration.open(perseus_style_file);
+ unsigned dimensionOfData;
+ inFiltration >> dimensionOfData;
+
+ this->directions_in_which_periodic_b_cond_are_to_be_imposed = std::vector<bool>(dimensionOfData, false);
+
+ std::vector<unsigned> sizes;
+ sizes.reserve(dimensionOfData);
+ for (size_t i = 0; i != dimensionOfData; ++i) {
+ int size_in_this_dimension;
+ inFiltration >> size_in_this_dimension;
+ if (size_in_this_dimension < 0) {
+ this->directions_in_which_periodic_b_cond_are_to_be_imposed[i] = true;
+ }
+ sizes.push_back(abs(size_in_this_dimension));
+ }
+ this->set_up_containers(sizes);
+
+ typename Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::Top_dimensional_cells_iterator it(*this);
+ it = this->top_dimensional_cells_iterator_begin();
+
+ while (!inFiltration.eof()) {
+ double filtrationLevel;
+ inFiltration >> filtrationLevel;
+ if (inFiltration.eof())break;
+
+ if (dbg) {
+ std::cerr << "Cell of an index : "
+ << it.compute_index_in_bitmap()
+ << " and dimension: "
+ << this->get_dimension_of_a_cell(it.compute_index_in_bitmap())
+ << " get the value : " << filtrationLevel << std::endl;
+ }
+ this->get_cell_data(*it) = filtrationLevel;
+ ++it;
+ }
+ inFiltration.close();
+ this->impose_lower_star_filtration();
+}
+
+template <typename T>
+Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::Bitmap_cubical_complex_periodic_boundary_conditions_base(const std::vector<unsigned>& sizes) {
+ this->directions_in_which_periodic_b_cond_are_to_be_imposed = std::vector<bool>(sizes.size(), false);
+ this->set_up_containers(sizes);
+}
+
+template <typename T>
+Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::Bitmap_cubical_complex_periodic_boundary_conditions_base(const std::vector<unsigned>& dimensions,
+ const std::vector<T>& topDimensionalCells) {
+ std::vector<bool> directions_in_which_periodic_b_cond_are_to_be_imposed = std::vector<bool>(dimensions.size(), false);
+ this->construct_complex_based_on_top_dimensional_cells(dimensions, topDimensionalCells,
+ directions_in_which_periodic_b_cond_are_to_be_imposed);
+}
+
+template <typename T>
+Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::
+Bitmap_cubical_complex_periodic_boundary_conditions_base(const std::vector<unsigned>& dimensions,
+ const std::vector<T>& topDimensionalCells,
+ const std::vector<bool>& directions_in_which_periodic_b_cond_are_to_be_imposed) {
+ this->construct_complex_based_on_top_dimensional_cells(dimensions, topDimensionalCells,
+ directions_in_which_periodic_b_cond_are_to_be_imposed);
+}
+
+// ***********************Methods************************ //
+
+template <typename T>
+std::vector< size_t > Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::get_boundary_of_a_cell(size_t cell) const {
+ bool dbg = false;
+ if (dbg) {
+ std::cerr << "Computations of boundary of a cell : " << cell << std::endl;
+ }
+
+ std::vector< size_t > boundary_elements;
+ size_t cell1 = cell;
+ for (size_t i = this->multipliers.size(); i != 0; --i) {
+ unsigned position = cell1 / this->multipliers[i - 1];
+ // this cell have a nonzero length in this direction, therefore we can compute its boundary in this direction.
+
+ if (position % 2 == 1) {
+ // if there are no periodic boundary conditions in this direction, we do not have to do anything.
+ if (!directions_in_which_periodic_b_cond_are_to_be_imposed[i - 1]) {
+ // std::cerr << "A\n";
+ boundary_elements.push_back(cell - this->multipliers[ i - 1 ]);
+ boundary_elements.push_back(cell + this->multipliers[ i - 1 ]);
+ if (dbg) {
+ std::cerr << cell - this->multipliers[ i - 1 ] << " " << cell + this->multipliers[ i - 1 ] << " ";
+ }
+ } else {
+ // in this direction we have to do boundary conditions. Therefore, we need to check if we are not at the end.
+ if (position != 2 * this->sizes[ i - 1 ] - 1) {
+ // std::cerr << "B\n";
+ boundary_elements.push_back(cell - this->multipliers[ i - 1 ]);
+ boundary_elements.push_back(cell + this->multipliers[ i - 1 ]);
+ if (dbg) {
+ std::cerr << cell - this->multipliers[ i - 1 ] << " " << cell + this->multipliers[ i - 1 ] << " ";
+ }
+ } else {
+ // std::cerr << "C\n";
+ boundary_elements.push_back(cell - this->multipliers[ i - 1 ]);
+ boundary_elements.push_back(cell - (2 * this->sizes[ i - 1 ] - 1) * this->multipliers[ i - 1 ]);
+ if (dbg) {
+ std::cerr << cell - this->multipliers[ i - 1 ] << " " <<
+ cell - (2 * this->sizes[ i - 1 ] - 1) * this->multipliers[ i - 1 ] << " ";
+ }
+ }
+ }
+ }
+ cell1 = cell1 % this->multipliers[i - 1];
+ }
+ return boundary_elements;
+}
+
+template <typename T>
+std::vector< size_t > Bitmap_cubical_complex_periodic_boundary_conditions_base<T>::get_coboundary_of_a_cell(size_t cell) const {
+ std::vector<unsigned> counter = this->compute_counter_for_given_cell(cell);
+ std::vector< size_t > coboundary_elements;
+ size_t cell1 = cell;
+ for (size_t i = this->multipliers.size(); i != 0; --i) {
+ unsigned position = cell1 / this->multipliers[i - 1];
+ // if the cell has zero length in this direction, then it will have cbd in this direction.
+ if (position % 2 == 0) {
+ if (!this->directions_in_which_periodic_b_cond_are_to_be_imposed[i - 1]) {
+ // no periodic boundary conditions in this direction
+ if ((counter[i - 1] != 0) && (cell > this->multipliers[i - 1])) {
+ coboundary_elements.push_back(cell - this->multipliers[i - 1]);
+ }
+ if ((counter[i - 1] != 2 * this->sizes[i - 1]) && (cell + this->multipliers[i - 1] < this->data.size())) {
+ coboundary_elements.push_back(cell + this->multipliers[i - 1]);
+ }
+ } else {
+ // we want to have periodic boundary conditions in this direction
+ if (counter[i - 1] != 0) {
+ coboundary_elements.push_back(cell - this->multipliers[i - 1]);
+ coboundary_elements.push_back(cell + this->multipliers[i - 1]);
+ } else {
+ // in this case counter[i-1] == 0.
+ coboundary_elements.push_back(cell + this->multipliers[i - 1]);
+ coboundary_elements.push_back(cell + (2 * this->sizes[ i - 1 ] - 1) * this->multipliers[i - 1]);
+ }
+ }
+ }
+
+ cell1 = cell1 % this->multipliers[i - 1];
+ }
+ return coboundary_elements;
+}
+
+} // namespace cubical_complex
+
+namespace Cubical_complex = cubical_complex;
+
+} // namespace Gudhi
+
+#endif // BITMAP_CUBICAL_COMPLEX_PERIODIC_BOUNDARY_CONDITIONS_BASE_H_
diff --git a/src/Bitmap_cubical_complex/test/Bitmap_test.cpp b/src/Bitmap_cubical_complex/test/Bitmap_test.cpp
new file mode 100644
index 00000000..db90eb94
--- /dev/null
+++ b/src/Bitmap_cubical_complex/test/Bitmap_test.cpp
@@ -0,0 +1,1378 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Pawel Dlotko
+ *
+ * Copyright (C) 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/>.
+ */
+
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_MODULE "cubical_complex"
+#include <boost/test/unit_test.hpp>
+
+#include <gudhi/reader_utils.h>
+#include <gudhi/Bitmap_cubical_complex.h>
+#include <gudhi/Persistent_cohomology.h>
+
+// standard stuff
+#include <iostream>
+#include <sstream>
+#include <vector>
+
+
+typedef Gudhi::cubical_complex::Bitmap_cubical_complex_base<double> Bitmap_cubical_complex_base;
+typedef Gudhi::cubical_complex::Bitmap_cubical_complex<Bitmap_cubical_complex_base> Bitmap_cubical_complex;
+
+typedef Gudhi::cubical_complex::Bitmap_cubical_complex_periodic_boundary_conditions_base<double>
+Bitmap_cubical_complex_periodic_boundary_conditions_base;
+typedef Gudhi::cubical_complex::Bitmap_cubical_complex<Bitmap_cubical_complex_periodic_boundary_conditions_base>
+Bitmap_cubical_complex_periodic_boundary_conditions;
+
+BOOST_AUTO_TEST_CASE(check_dimension) {
+ std::vector< double > increasingFiltrationOfTopDimensionalCells({1, 2, 3, 4, 5, 6, 7, 8, 9});
+
+ std::vector<unsigned> dimensions({3, 3});
+
+ Bitmap_cubical_complex increasing(dimensions, increasingFiltrationOfTopDimensionalCells);
+ BOOST_CHECK(increasing.dimension() == 2);
+}
+
+BOOST_AUTO_TEST_CASE(topDimensionalCellsIterator_test) {
+ std::vector< double > expectedFiltrationValues1({0, 0, 0, 0, 100, 0, 0, 0, 0});
+
+ std::vector< double > expectedFiltrationValues2({1, 2, 3, 4, 5, 6, 7, 8, 9});
+
+ std::vector< double > increasingFiltrationOfTopDimensionalCells({1, 2, 3, 4, 5, 6, 7, 8, 9});
+
+ std::vector< double > oneDimensionalCycle({0, 0, 0, 0, 100, 0, 0, 0, 0});
+
+ std::vector<unsigned> dimensions({3, 3});
+
+ Bitmap_cubical_complex increasing(dimensions, increasingFiltrationOfTopDimensionalCells);
+ Bitmap_cubical_complex hole(dimensions, oneDimensionalCycle);
+
+
+ int i = 0;
+ for (Bitmap_cubical_complex::Top_dimensional_cells_iterator
+ it = increasing.top_dimensional_cells_iterator_begin(); it != increasing.top_dimensional_cells_iterator_end(); ++it) {
+ BOOST_CHECK(increasing.get_cell_data(*it) == expectedFiltrationValues2[i]);
+ ++i;
+ }
+ i = 0;
+ for (Bitmap_cubical_complex::Top_dimensional_cells_iterator
+ it = hole.top_dimensional_cells_iterator_begin(); it != hole.top_dimensional_cells_iterator_end(); ++it) {
+ BOOST_CHECK(hole.get_cell_data(*it) == expectedFiltrationValues1[i]);
+ ++i;
+ }
+}
+
+BOOST_AUTO_TEST_CASE(compute_boundary_test_1) {
+ std::vector<double> boundary0;
+ std::vector<double> boundary1;
+ boundary1.push_back(0);
+ boundary1.push_back(2);
+ std::vector<double> boundary2;
+ std::vector<double> boundary3;
+ boundary3.push_back(2);
+ boundary3.push_back(4);
+ std::vector<double> boundary4;
+ std::vector<double> boundary5;
+ boundary5.push_back(4);
+ boundary5.push_back(6);
+ std::vector<double> boundary6;
+ std::vector<double> boundary7;
+ boundary7.push_back(0);
+ boundary7.push_back(14);
+ std::vector<double> boundary8;
+ boundary8.push_back(1);
+ boundary8.push_back(15);
+ boundary8.push_back(7);
+ boundary8.push_back(9);
+ std::vector<double> boundary9;
+ boundary9.push_back(2);
+ boundary9.push_back(16);
+ std::vector<double> boundary10;
+ boundary10.push_back(3);
+ boundary10.push_back(17);
+ boundary10.push_back(9);
+ boundary10.push_back(11);
+ std::vector<double> boundary11;
+ boundary11.push_back(4);
+ boundary11.push_back(18);
+ std::vector<double> boundary12;
+ boundary12.push_back(5);
+ boundary12.push_back(19);
+ boundary12.push_back(11);
+ boundary12.push_back(13);
+ std::vector<double> boundary13;
+ boundary13.push_back(6);
+ boundary13.push_back(20);
+ std::vector<double> boundary14;
+ std::vector<double> boundary15;
+ boundary15.push_back(14);
+ boundary15.push_back(16);
+ std::vector<double> boundary16;
+ std::vector<double> boundary17;
+ boundary17.push_back(16);
+ boundary17.push_back(18);
+ std::vector<double> boundary18;
+ std::vector<double> boundary19;
+ boundary19.push_back(18);
+ boundary19.push_back(20);
+ std::vector<double> boundary20;
+ std::vector<double> boundary21;
+ boundary21.push_back(14);
+ boundary21.push_back(28);
+ std::vector<double> boundary22;
+ boundary22.push_back(15);
+ boundary22.push_back(29);
+ boundary22.push_back(21);
+ boundary22.push_back(23);
+ std::vector<double> boundary23;
+ boundary23.push_back(16);
+ boundary23.push_back(30);
+ std::vector<double> boundary24;
+ boundary24.push_back(17);
+ boundary24.push_back(31);
+ boundary24.push_back(23);
+ boundary24.push_back(25);
+ std::vector<double> boundary25;
+ boundary25.push_back(18);
+ boundary25.push_back(32);
+ std::vector<double> boundary26;
+ boundary26.push_back(19);
+ boundary26.push_back(33);
+ boundary26.push_back(25);
+ boundary26.push_back(27);
+ std::vector<double> boundary27;
+ boundary27.push_back(20);
+ boundary27.push_back(34);
+ std::vector<double> boundary28;
+ std::vector<double> boundary29;
+ boundary29.push_back(28);
+ boundary29.push_back(30);
+ std::vector<double> boundary30;
+ std::vector<double> boundary31;
+ boundary31.push_back(30);
+ boundary31.push_back(32);
+ std::vector<double> boundary32;
+ std::vector<double> boundary33;
+ boundary33.push_back(32);
+ boundary33.push_back(34);
+ std::vector<double> boundary34;
+ std::vector<double> boundary35;
+ boundary35.push_back(28);
+ boundary35.push_back(42);
+ std::vector<double> boundary36;
+ boundary36.push_back(29);
+ boundary36.push_back(43);
+ boundary36.push_back(35);
+ boundary36.push_back(37);
+ std::vector<double> boundary37;
+ boundary37.push_back(30);
+ boundary37.push_back(44);
+ std::vector<double> boundary38;
+ boundary38.push_back(31);
+ boundary38.push_back(45);
+ boundary38.push_back(37);
+ boundary38.push_back(39);
+ std::vector<double> boundary39;
+ boundary39.push_back(32);
+ boundary39.push_back(46);
+ std::vector<double> boundary40;
+ boundary40.push_back(33);
+ boundary40.push_back(47);
+ boundary40.push_back(39);
+ boundary40.push_back(41);
+ std::vector<double> boundary41;
+ boundary41.push_back(34);
+ boundary41.push_back(48);
+ std::vector<double> boundary42;
+ std::vector<double> boundary43;
+ boundary43.push_back(42);
+ boundary43.push_back(44);
+ std::vector<double> boundary44;
+ std::vector<double> boundary45;
+ boundary45.push_back(44);
+ boundary45.push_back(46);
+ std::vector<double> boundary46;
+ std::vector<double> boundary47;
+ boundary47.push_back(46);
+ boundary47.push_back(48);
+ std::vector<double> boundary48;
+ std::vector< std::vector<double> > boundaries;
+ boundaries.push_back(boundary0);
+ boundaries.push_back(boundary1);
+ boundaries.push_back(boundary2);
+ boundaries.push_back(boundary3);
+ boundaries.push_back(boundary4);
+ boundaries.push_back(boundary5);
+ boundaries.push_back(boundary6);
+ boundaries.push_back(boundary7);
+ boundaries.push_back(boundary8);
+ boundaries.push_back(boundary9);
+ boundaries.push_back(boundary10);
+ boundaries.push_back(boundary11);
+ boundaries.push_back(boundary12);
+ boundaries.push_back(boundary13);
+ boundaries.push_back(boundary14);
+ boundaries.push_back(boundary15);
+ boundaries.push_back(boundary16);
+ boundaries.push_back(boundary17);
+ boundaries.push_back(boundary18);
+ boundaries.push_back(boundary19);
+ boundaries.push_back(boundary20);
+ boundaries.push_back(boundary21);
+ boundaries.push_back(boundary22);
+ boundaries.push_back(boundary23);
+ boundaries.push_back(boundary24);
+ boundaries.push_back(boundary25);
+ boundaries.push_back(boundary26);
+ boundaries.push_back(boundary27);
+ boundaries.push_back(boundary28);
+ boundaries.push_back(boundary29);
+ boundaries.push_back(boundary30);
+ boundaries.push_back(boundary31);
+ boundaries.push_back(boundary32);
+ boundaries.push_back(boundary33);
+ boundaries.push_back(boundary34);
+ boundaries.push_back(boundary35);
+ boundaries.push_back(boundary36);
+ boundaries.push_back(boundary37);
+ boundaries.push_back(boundary38);
+ boundaries.push_back(boundary39);
+ boundaries.push_back(boundary40);
+ boundaries.push_back(boundary41);
+ boundaries.push_back(boundary42);
+ boundaries.push_back(boundary43);
+ boundaries.push_back(boundary44);
+ boundaries.push_back(boundary45);
+ boundaries.push_back(boundary46);
+ boundaries.push_back(boundary47);
+ boundaries.push_back(boundary48);
+
+
+
+ std::vector< double > increasingFiltrationOfTopDimensionalCells({1, 2, 3, 4, 5, 6, 7, 8, 9});
+
+ std::vector<unsigned> dimensions({3, 3});
+
+ Bitmap_cubical_complex increasing(dimensions, increasingFiltrationOfTopDimensionalCells);
+ for (size_t i = 0; i != increasing.size(); ++i) {
+ std::vector< size_t > bd = increasing.get_boundary_of_a_cell(i);
+ for (size_t j = 0; j != bd.size(); ++j) {
+ BOOST_CHECK(boundaries[i][j] == bd[j]);
+ }
+ }
+}
+
+BOOST_AUTO_TEST_CASE(compute_boundary_test_2) {
+ std::vector< double > increasingFiltrationOfTopDimensionalCells({1, 2, 3, 4, 5, 6, 7, 8, 9});
+
+ std::vector<unsigned> dimensions({3, 3});
+
+ Bitmap_cubical_complex increasing(dimensions, increasingFiltrationOfTopDimensionalCells);
+
+
+ std::vector<double> coboundaryElements;
+ coboundaryElements.push_back(7);
+ coboundaryElements.push_back(1);
+ coboundaryElements.push_back(8);
+ coboundaryElements.push_back(9);
+ coboundaryElements.push_back(1);
+ coboundaryElements.push_back(3);
+ coboundaryElements.push_back(10);
+ coboundaryElements.push_back(11);
+ coboundaryElements.push_back(3);
+ coboundaryElements.push_back(5);
+ coboundaryElements.push_back(12);
+ coboundaryElements.push_back(13);
+ coboundaryElements.push_back(5);
+ coboundaryElements.push_back(8);
+ coboundaryElements.push_back(8);
+ coboundaryElements.push_back(10);
+ coboundaryElements.push_back(10);
+ coboundaryElements.push_back(12);
+ coboundaryElements.push_back(12);
+ coboundaryElements.push_back(7);
+ coboundaryElements.push_back(21);
+ coboundaryElements.push_back(15);
+ coboundaryElements.push_back(8);
+ coboundaryElements.push_back(22);
+ coboundaryElements.push_back(9);
+ coboundaryElements.push_back(23);
+ coboundaryElements.push_back(15);
+ coboundaryElements.push_back(17);
+ coboundaryElements.push_back(10);
+ coboundaryElements.push_back(24);
+ coboundaryElements.push_back(11);
+ coboundaryElements.push_back(25);
+ coboundaryElements.push_back(17);
+ coboundaryElements.push_back(19);
+ coboundaryElements.push_back(12);
+ coboundaryElements.push_back(26);
+ coboundaryElements.push_back(13);
+ coboundaryElements.push_back(27);
+ coboundaryElements.push_back(19);
+ coboundaryElements.push_back(22);
+ coboundaryElements.push_back(22);
+ coboundaryElements.push_back(24);
+ coboundaryElements.push_back(24);
+ coboundaryElements.push_back(26);
+ coboundaryElements.push_back(26);
+ coboundaryElements.push_back(21);
+ coboundaryElements.push_back(35);
+ coboundaryElements.push_back(29);
+ coboundaryElements.push_back(22);
+ coboundaryElements.push_back(36);
+ coboundaryElements.push_back(23);
+ coboundaryElements.push_back(37);
+ coboundaryElements.push_back(29);
+ coboundaryElements.push_back(31);
+ coboundaryElements.push_back(24);
+ coboundaryElements.push_back(38);
+ coboundaryElements.push_back(25);
+ coboundaryElements.push_back(39);
+ coboundaryElements.push_back(31);
+ coboundaryElements.push_back(33);
+ coboundaryElements.push_back(26);
+ coboundaryElements.push_back(40);
+ coboundaryElements.push_back(27);
+ coboundaryElements.push_back(41);
+ coboundaryElements.push_back(33);
+ coboundaryElements.push_back(36);
+ coboundaryElements.push_back(36);
+ coboundaryElements.push_back(38);
+ coboundaryElements.push_back(38);
+ coboundaryElements.push_back(40);
+ coboundaryElements.push_back(40);
+ coboundaryElements.push_back(35);
+ coboundaryElements.push_back(43);
+ coboundaryElements.push_back(36);
+ coboundaryElements.push_back(37);
+ coboundaryElements.push_back(43);
+ coboundaryElements.push_back(45);
+ coboundaryElements.push_back(38);
+ coboundaryElements.push_back(39);
+ coboundaryElements.push_back(45);
+ coboundaryElements.push_back(47);
+ coboundaryElements.push_back(40);
+ coboundaryElements.push_back(41);
+ coboundaryElements.push_back(47);
+ size_t number = 0;
+ for (size_t i = 0; i != increasing.size(); ++i) {
+ std::vector< size_t > bd = increasing.get_coboundary_of_a_cell(i);
+ for (size_t j = 0; j != bd.size(); ++j) {
+ BOOST_CHECK(coboundaryElements[number] == bd[j]);
+ ++number;
+ }
+ }
+}
+
+BOOST_AUTO_TEST_CASE(compute_boundary_test_3) {
+ std::vector< double > increasingFiltrationOfTopDimensionalCells({1, 2, 3, 4, 5, 6, 7, 8, 9});
+
+ std::vector<unsigned> dimensions({3, 3});
+
+ Bitmap_cubical_complex increasing(dimensions, increasingFiltrationOfTopDimensionalCells);
+
+ std::vector<unsigned> dim;
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(2);
+ dim.push_back(1);
+ dim.push_back(2);
+ dim.push_back(1);
+ dim.push_back(2);
+ dim.push_back(1);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(2);
+ dim.push_back(1);
+ dim.push_back(2);
+ dim.push_back(1);
+ dim.push_back(2);
+ dim.push_back(1);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(2);
+ dim.push_back(1);
+ dim.push_back(2);
+ dim.push_back(1);
+ dim.push_back(2);
+ dim.push_back(1);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(0);
+
+ for (size_t i = 0; i != increasing.size(); ++i) {
+ BOOST_CHECK(increasing.get_dimension_of_a_cell(i) == dim[i]);
+ }
+}
+
+BOOST_AUTO_TEST_CASE(Filtration_simplex_iterator_test) {
+ std::vector< double > increasingFiltrationOfTopDimensionalCells({1, 2, 3, 4, 5, 6, 7, 8, 9});
+
+ std::vector<unsigned> dimensions({3, 3});
+
+ Bitmap_cubical_complex increasing(dimensions, increasingFiltrationOfTopDimensionalCells);
+
+ std::vector< unsigned > dim;
+ dim.push_back(0);
+ dim.push_back(0);
+ dim.push_back(0);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(1);
+ dim.push_back(1);
+ dim.push_back(1);
+ dim.push_back(2);
+ dim.push_back(0);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(1);
+ dim.push_back(1);
+ dim.push_back(2);
+ dim.push_back(0);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(1);
+ dim.push_back(1);
+ dim.push_back(2);
+ dim.push_back(0);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(1);
+ dim.push_back(1);
+ dim.push_back(2);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(1);
+ dim.push_back(2);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(1);
+ dim.push_back(2);
+ dim.push_back(0);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(1);
+ dim.push_back(1);
+ dim.push_back(2);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(1);
+ dim.push_back(2);
+ dim.push_back(0);
+ dim.push_back(1);
+ dim.push_back(1);
+ dim.push_back(2);
+
+ std::vector<double> fil;
+ fil.push_back(1);
+ fil.push_back(1);
+ fil.push_back(1);
+ fil.push_back(1);
+ fil.push_back(1);
+ fil.push_back(1);
+ fil.push_back(1);
+ fil.push_back(1);
+ fil.push_back(1);
+ fil.push_back(2);
+ fil.push_back(2);
+ fil.push_back(2);
+ fil.push_back(2);
+ fil.push_back(2);
+ fil.push_back(2);
+ fil.push_back(3);
+ fil.push_back(3);
+ fil.push_back(3);
+ fil.push_back(3);
+ fil.push_back(3);
+ fil.push_back(3);
+ fil.push_back(4);
+ fil.push_back(4);
+ fil.push_back(4);
+ fil.push_back(4);
+ fil.push_back(4);
+ fil.push_back(4);
+ fil.push_back(5);
+ fil.push_back(5);
+ fil.push_back(5);
+ fil.push_back(5);
+ fil.push_back(6);
+ fil.push_back(6);
+ fil.push_back(6);
+ fil.push_back(6);
+ fil.push_back(7);
+ fil.push_back(7);
+ fil.push_back(7);
+ fil.push_back(7);
+ fil.push_back(7);
+ fil.push_back(7);
+ fil.push_back(8);
+ fil.push_back(8);
+ fil.push_back(8);
+ fil.push_back(8);
+ fil.push_back(9);
+ fil.push_back(9);
+ fil.push_back(9);
+ fil.push_back(9);
+
+
+ Bitmap_cubical_complex::Filtration_simplex_range range = increasing.filtration_simplex_range();
+ size_t position = 0;
+ for (Bitmap_cubical_complex::Filtration_simplex_iterator it = range.begin(); it != range.end(); ++it) {
+ BOOST_CHECK(increasing.dimension(*it) == dim[position]);
+ BOOST_CHECK(increasing.filtration(*it) == fil[position]);
+ ++position;
+ }
+}
+
+BOOST_AUTO_TEST_CASE(boudary_operator_2d_bitmap_with_periodic_bcond) {
+ std::vector< double > filtration({0, 0, 0, 0});
+
+ std::vector<unsigned> dimensions({2, 2});
+
+ std::vector<bool> periodic_directions({true, true});
+
+ Bitmap_cubical_complex_periodic_boundary_conditions cmplx(dimensions, filtration, periodic_directions);
+ BOOST_CHECK(cmplx.dimension() == 2);
+
+
+ std::vector<double> boundary0;
+ std::vector<double> boundary1;
+ boundary1.push_back(0);
+ boundary1.push_back(2);
+ std::vector<double> boundary2;
+ std::vector<double> boundary3;
+ boundary3.push_back(2);
+ boundary3.push_back(0);
+ std::vector<double> boundary4;
+ boundary4.push_back(0);
+ boundary4.push_back(8);
+ std::vector<double> boundary5;
+ boundary5.push_back(1);
+ boundary5.push_back(9);
+ boundary5.push_back(4);
+ boundary5.push_back(6);
+ std::vector<double> boundary6;
+ boundary6.push_back(2);
+ boundary6.push_back(10);
+ std::vector<double> boundary7;
+ boundary7.push_back(3);
+ boundary7.push_back(11);
+ boundary7.push_back(6);
+ boundary7.push_back(4);
+ std::vector<double> boundary8;
+ std::vector<double> boundary9;
+ boundary9.push_back(8);
+ boundary9.push_back(10);
+ std::vector<double> boundary10;
+ std::vector<double> boundary11;
+ boundary11.push_back(10);
+ boundary11.push_back(8);
+ std::vector<double> boundary12;
+ boundary12.push_back(8);
+ boundary12.push_back(0);
+ std::vector<double> boundary13;
+ boundary13.push_back(9);
+ boundary13.push_back(1);
+ boundary13.push_back(12);
+ boundary13.push_back(14);
+ std::vector<double> boundary14;
+ boundary14.push_back(10);
+ boundary14.push_back(2);
+ std::vector<double> boundary15;
+ boundary15.push_back(11);
+ boundary15.push_back(3);
+ boundary15.push_back(14);
+ boundary15.push_back(12);
+
+ std::vector< std::vector<double> > boundaries;
+ boundaries.push_back(boundary0);
+ boundaries.push_back(boundary1);
+ boundaries.push_back(boundary2);
+ boundaries.push_back(boundary3);
+ boundaries.push_back(boundary4);
+ boundaries.push_back(boundary5);
+ boundaries.push_back(boundary6);
+ boundaries.push_back(boundary7);
+ boundaries.push_back(boundary8);
+ boundaries.push_back(boundary9);
+ boundaries.push_back(boundary10);
+ boundaries.push_back(boundary11);
+ boundaries.push_back(boundary12);
+ boundaries.push_back(boundary13);
+ boundaries.push_back(boundary14);
+ boundaries.push_back(boundary15);
+
+ for (size_t i = 0; i != cmplx.size(); ++i) {
+ std::vector< size_t > bd = cmplx.get_boundary_of_a_cell(i);
+ for (size_t j = 0; j != bd.size(); ++j) {
+ BOOST_CHECK(boundaries[i][j] == bd[j]);
+ }
+ }
+}
+
+BOOST_AUTO_TEST_CASE(coboudary_operator_2d_bitmap_with_periodic_bcond) {
+ std::vector< double > filtration({0, 0, 0, 0});
+
+ std::vector<unsigned> dimensions({2, 2});
+
+ std::vector<bool> periodic_directions({true, true});
+
+ Bitmap_cubical_complex_periodic_boundary_conditions cmplx(dimensions, filtration, periodic_directions);
+ BOOST_CHECK(cmplx.dimension() == 2);
+
+
+ std::vector<double> coboundary0;
+ coboundary0.push_back(4);
+ coboundary0.push_back(12);
+ coboundary0.push_back(1);
+ coboundary0.push_back(3);
+ std::vector<double> coboundary1;
+ coboundary1.push_back(5);
+ coboundary1.push_back(13);
+ std::vector<double> coboundary2;
+ coboundary2.push_back(6);
+ coboundary2.push_back(14);
+ coboundary2.push_back(1);
+ coboundary2.push_back(3);
+ std::vector<double> coboundary3;
+ coboundary3.push_back(7);
+ coboundary3.push_back(15);
+ std::vector<double> coboundary4;
+ coboundary4.push_back(5);
+ coboundary4.push_back(7);
+ std::vector<double> coboundary5;
+ std::vector<double> coboundary6;
+ coboundary6.push_back(5);
+ coboundary6.push_back(7);
+ std::vector<double> coboundary7;
+ std::vector<double> coboundary8;
+ coboundary8.push_back(4);
+ coboundary8.push_back(12);
+ coboundary8.push_back(9);
+ coboundary8.push_back(11);
+ std::vector<double> coboundary9;
+ coboundary9.push_back(5);
+ coboundary9.push_back(13);
+ std::vector<double> coboundary10;
+ coboundary10.push_back(6);
+ coboundary10.push_back(14);
+ coboundary10.push_back(9);
+ coboundary10.push_back(11);
+ std::vector<double> coboundary11;
+ coboundary11.push_back(7);
+ coboundary11.push_back(15);
+ std::vector<double> coboundary12;
+ coboundary12.push_back(13);
+ coboundary12.push_back(15);
+ std::vector<double> coboundary13;
+ std::vector<double> coboundary14;
+ coboundary14.push_back(13);
+ coboundary14.push_back(15);
+ std::vector<double> coboundary15;
+
+ std::vector< std::vector<double> > coboundaries;
+ coboundaries.push_back(coboundary0);
+ coboundaries.push_back(coboundary1);
+ coboundaries.push_back(coboundary2);
+ coboundaries.push_back(coboundary3);
+ coboundaries.push_back(coboundary4);
+ coboundaries.push_back(coboundary5);
+ coboundaries.push_back(coboundary6);
+ coboundaries.push_back(coboundary7);
+ coboundaries.push_back(coboundary8);
+ coboundaries.push_back(coboundary9);
+ coboundaries.push_back(coboundary10);
+ coboundaries.push_back(coboundary11);
+ coboundaries.push_back(coboundary12);
+ coboundaries.push_back(coboundary13);
+ coboundaries.push_back(coboundary14);
+ coboundaries.push_back(coboundary15);
+
+ for (size_t i = 0; i != cmplx.size(); ++i) {
+ std::vector< size_t > cbd = cmplx.get_coboundary_of_a_cell(i);
+ for (size_t j = 0; j != cbd.size(); ++j) {
+ BOOST_CHECK(coboundaries[i][j] == cbd[j]);
+ }
+ }
+}
+
+BOOST_AUTO_TEST_CASE(bitmap_2d_with_periodic_bcond_filtration) {
+ std::vector< double > filtrationOrg({0, 1, 2, 3});
+
+ std::vector<unsigned> dimensions({2, 2});
+
+ std::vector<bool> periodic_directions({true, true});
+
+ Bitmap_cubical_complex_periodic_boundary_conditions cmplx(dimensions, filtrationOrg, periodic_directions);
+ BOOST_CHECK(cmplx.dimension() == 2);
+
+
+ std::vector<double> filtration;
+ filtration.push_back(0); // 0
+ filtration.push_back(0); // 1
+ filtration.push_back(0); // 2
+ filtration.push_back(1); // 3
+ filtration.push_back(0); // 4
+ filtration.push_back(0); // 5
+ filtration.push_back(0); // 6
+ filtration.push_back(1); // 7
+ filtration.push_back(0); // 8
+ filtration.push_back(0); // 9
+ filtration.push_back(0); // 10
+ filtration.push_back(1); // 11
+ filtration.push_back(2); // 12
+ filtration.push_back(2); // 13
+ filtration.push_back(2); // 14
+ filtration.push_back(3); // 15
+
+
+ for (size_t i = 0; i != cmplx.size(); ++i) {
+ BOOST_CHECK(filtration[i] == cmplx.get_cell_data(i));
+ }
+}
+BOOST_AUTO_TEST_CASE(all_cells_iterator_and_boundary_iterators_in_Bitmap_cubical_complex_base_check)
+{
+ std::vector< double > expected_filtration;
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(3);
+ expected_filtration.push_back(3);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(3);
+ expected_filtration.push_back(3);
+
+ std::vector<unsigned> expected_dimension;
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(2);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(2);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(2);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(2);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+
+ std::vector<size_t> expected_boundary;
+ expected_boundary.push_back(0);
+ expected_boundary.push_back(2);
+ expected_boundary.push_back(2);
+ expected_boundary.push_back(4);
+ expected_boundary.push_back(0);
+ expected_boundary.push_back(10);
+ expected_boundary.push_back(1);
+ expected_boundary.push_back(11);
+ expected_boundary.push_back(5);
+ expected_boundary.push_back(7);
+ expected_boundary.push_back(2);
+ expected_boundary.push_back(12);
+ expected_boundary.push_back(3);
+ expected_boundary.push_back(13);
+ expected_boundary.push_back(7);
+ expected_boundary.push_back(9);
+ expected_boundary.push_back(4);
+ expected_boundary.push_back(14);
+ expected_boundary.push_back(10);
+ expected_boundary.push_back(12);
+ expected_boundary.push_back(12);
+ expected_boundary.push_back(14);
+ expected_boundary.push_back(10);
+ expected_boundary.push_back(20);
+ expected_boundary.push_back(11);
+ expected_boundary.push_back(21);
+ expected_boundary.push_back(15);
+ expected_boundary.push_back(17);
+ expected_boundary.push_back(12);
+ expected_boundary.push_back(22);
+ expected_boundary.push_back(13);
+ expected_boundary.push_back(23);
+ expected_boundary.push_back(17);
+ expected_boundary.push_back(19);
+ expected_boundary.push_back(14);
+ expected_boundary.push_back(24);
+ expected_boundary.push_back(20);
+ expected_boundary.push_back(22);
+ expected_boundary.push_back(22);
+ expected_boundary.push_back(24);
+
+
+ std::vector<size_t> expected_coboundary;
+ expected_coboundary.push_back(5);
+ expected_coboundary.push_back(1);
+ expected_coboundary.push_back(6);
+ expected_coboundary.push_back(7);
+ expected_coboundary.push_back(1);
+ expected_coboundary.push_back(3);
+ expected_coboundary.push_back(8);
+ expected_coboundary.push_back(9);
+ expected_coboundary.push_back(3);
+ expected_coboundary.push_back(6);
+ expected_coboundary.push_back(6);
+ expected_coboundary.push_back(8);
+ expected_coboundary.push_back(8);
+ expected_coboundary.push_back(5);
+ expected_coboundary.push_back(15);
+ expected_coboundary.push_back(11);
+ expected_coboundary.push_back(6);
+ expected_coboundary.push_back(16);
+ expected_coboundary.push_back(7);
+ expected_coboundary.push_back(17);
+ expected_coboundary.push_back(11);
+ expected_coboundary.push_back(13);
+ expected_coboundary.push_back(8);
+ expected_coboundary.push_back(18);
+ expected_coboundary.push_back(9);
+ expected_coboundary.push_back(19);
+ expected_coboundary.push_back(13);
+ expected_coboundary.push_back(16);
+ expected_coboundary.push_back(16);
+ expected_coboundary.push_back(18);
+ expected_coboundary.push_back(18);
+ expected_coboundary.push_back(15);
+ expected_coboundary.push_back(21);
+ expected_coboundary.push_back(16);
+ expected_coboundary.push_back(17);
+ expected_coboundary.push_back(21);
+ expected_coboundary.push_back(23);
+ expected_coboundary.push_back(18);
+ expected_coboundary.push_back(19);
+ expected_coboundary.push_back(23);
+
+
+
+ std::vector< unsigned > sizes(2);
+ sizes[0] = 2;
+ sizes[1] = 2;
+
+ std::vector< double > data(4);
+ data[0] = 0;
+ data[1] = 1;
+ data[2] = 2;
+ data[3] = 3;
+
+ Bitmap_cubical_complex_base ba( sizes , data );
+ int i = 0;
+ int bd_it = 0;
+ int cbd_it = 0;
+ for ( Bitmap_cubical_complex_base::All_cells_iterator it = ba.all_cells_iterator_begin() ; it != ba.all_cells_iterator_end() ; ++it )
+ {
+ BOOST_CHECK( expected_filtration[i] == ba.get_cell_data( *it ) );
+ BOOST_CHECK( expected_dimension[i] == ba.get_dimension_of_a_cell( *it ) );
+
+ Bitmap_cubical_complex_base::Boundary_range bdrange = ba.boundary_range(*it);
+ for ( Bitmap_cubical_complex_base::Boundary_iterator bd = bdrange.begin() ; bd != bdrange.end() ; ++bd )
+ {
+ BOOST_CHECK( expected_boundary[bd_it] == *bd );
+ ++bd_it;
+ }
+
+ Bitmap_cubical_complex_base::Coboundary_range cbdrange = ba.coboundary_range(*it);
+ for ( Bitmap_cubical_complex_base::Coboundary_iterator cbd = cbdrange.begin() ; cbd != cbdrange.end() ; ++cbd )
+ {
+ BOOST_CHECK( expected_coboundary[cbd_it] == *cbd );
+ ++cbd_it;
+ }
+ ++i;
+ }
+}
+
+
+
+
+
+
+
+
+BOOST_AUTO_TEST_CASE(all_cells_iterator_and_boundary_iterators_in_Bitmap_cubical_complex_base_check_range_check_2)
+{
+ std::vector< double > expected_filtration;
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(3);
+ expected_filtration.push_back(3);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(3);
+ expected_filtration.push_back(3);
+
+ std::vector<unsigned> expected_dimension;
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(2);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(2);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(2);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(2);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+
+ std::vector<size_t> expected_boundary;
+ expected_boundary.push_back(0);
+ expected_boundary.push_back(2);
+ expected_boundary.push_back(2);
+ expected_boundary.push_back(4);
+ expected_boundary.push_back(0);
+ expected_boundary.push_back(10);
+ expected_boundary.push_back(1);
+ expected_boundary.push_back(11);
+ expected_boundary.push_back(5);
+ expected_boundary.push_back(7);
+ expected_boundary.push_back(2);
+ expected_boundary.push_back(12);
+ expected_boundary.push_back(3);
+ expected_boundary.push_back(13);
+ expected_boundary.push_back(7);
+ expected_boundary.push_back(9);
+ expected_boundary.push_back(4);
+ expected_boundary.push_back(14);
+ expected_boundary.push_back(10);
+ expected_boundary.push_back(12);
+ expected_boundary.push_back(12);
+ expected_boundary.push_back(14);
+ expected_boundary.push_back(10);
+ expected_boundary.push_back(20);
+ expected_boundary.push_back(11);
+ expected_boundary.push_back(21);
+ expected_boundary.push_back(15);
+ expected_boundary.push_back(17);
+ expected_boundary.push_back(12);
+ expected_boundary.push_back(22);
+ expected_boundary.push_back(13);
+ expected_boundary.push_back(23);
+ expected_boundary.push_back(17);
+ expected_boundary.push_back(19);
+ expected_boundary.push_back(14);
+ expected_boundary.push_back(24);
+ expected_boundary.push_back(20);
+ expected_boundary.push_back(22);
+ expected_boundary.push_back(22);
+ expected_boundary.push_back(24);
+
+
+ std::vector<size_t> expected_coboundary;
+ expected_coboundary.push_back(5);
+ expected_coboundary.push_back(1);
+ expected_coboundary.push_back(6);
+ expected_coboundary.push_back(7);
+ expected_coboundary.push_back(1);
+ expected_coboundary.push_back(3);
+ expected_coboundary.push_back(8);
+ expected_coboundary.push_back(9);
+ expected_coboundary.push_back(3);
+ expected_coboundary.push_back(6);
+ expected_coboundary.push_back(6);
+ expected_coboundary.push_back(8);
+ expected_coboundary.push_back(8);
+ expected_coboundary.push_back(5);
+ expected_coboundary.push_back(15);
+ expected_coboundary.push_back(11);
+ expected_coboundary.push_back(6);
+ expected_coboundary.push_back(16);
+ expected_coboundary.push_back(7);
+ expected_coboundary.push_back(17);
+ expected_coboundary.push_back(11);
+ expected_coboundary.push_back(13);
+ expected_coboundary.push_back(8);
+ expected_coboundary.push_back(18);
+ expected_coboundary.push_back(9);
+ expected_coboundary.push_back(19);
+ expected_coboundary.push_back(13);
+ expected_coboundary.push_back(16);
+ expected_coboundary.push_back(16);
+ expected_coboundary.push_back(18);
+ expected_coboundary.push_back(18);
+ expected_coboundary.push_back(15);
+ expected_coboundary.push_back(21);
+ expected_coboundary.push_back(16);
+ expected_coboundary.push_back(17);
+ expected_coboundary.push_back(21);
+ expected_coboundary.push_back(23);
+ expected_coboundary.push_back(18);
+ expected_coboundary.push_back(19);
+ expected_coboundary.push_back(23);
+
+
+
+ std::vector< unsigned > sizes(2);
+ sizes[0] = 2;
+ sizes[1] = 2;
+
+ std::vector< double > data(4);
+ data[0] = 0;
+ data[1] = 1;
+ data[2] = 2;
+ data[3] = 3;
+
+ Bitmap_cubical_complex_base ba( sizes , data );
+ int i = 0;
+ int bd_it = 0;
+ int cbd_it = 0;
+
+ Bitmap_cubical_complex_base::All_cells_range range(&ba);
+ for ( Bitmap_cubical_complex_base::All_cells_iterator it = range.begin() ; it != range.end() ; ++it )
+ {
+ BOOST_CHECK( expected_filtration[i] == ba.get_cell_data( *it ) );
+ BOOST_CHECK( expected_dimension[i] == ba.get_dimension_of_a_cell( *it ) );
+
+ Bitmap_cubical_complex_base::Boundary_range bdrange = ba.boundary_range(*it);
+ for ( Bitmap_cubical_complex_base::Boundary_iterator bd = bdrange.begin() ; bd != bdrange.end() ; ++bd )
+ {
+ BOOST_CHECK( expected_boundary[bd_it] == *bd );
+ ++bd_it;
+ }
+
+ Bitmap_cubical_complex_base::Coboundary_range cbdrange = ba.coboundary_range(*it);
+ for ( Bitmap_cubical_complex_base::Coboundary_iterator cbd = cbdrange.begin() ; cbd != cbdrange.end() ; ++cbd )
+ {
+ BOOST_CHECK( expected_coboundary[cbd_it] == *cbd );
+ ++cbd_it;
+ }
+ ++i;
+ }
+}
+
+
+
+
+
+
+BOOST_AUTO_TEST_CASE(all_cells_iterator_and_boundary_iterators_in_Bitmap_cubical_complex_base_check_range_check)
+{
+ std::vector< double > expected_filtration;
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(3);
+ expected_filtration.push_back(3);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(3);
+ expected_filtration.push_back(3);
+
+ std::vector<unsigned> expected_dimension;
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(2);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(2);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(2);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(2);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+ expected_dimension.push_back(1);
+ expected_dimension.push_back(0);
+
+ std::vector<size_t> expected_boundary;
+ expected_boundary.push_back(0);
+ expected_boundary.push_back(2);
+ expected_boundary.push_back(2);
+ expected_boundary.push_back(4);
+ expected_boundary.push_back(0);
+ expected_boundary.push_back(10);
+ expected_boundary.push_back(1);
+ expected_boundary.push_back(11);
+ expected_boundary.push_back(5);
+ expected_boundary.push_back(7);
+ expected_boundary.push_back(2);
+ expected_boundary.push_back(12);
+ expected_boundary.push_back(3);
+ expected_boundary.push_back(13);
+ expected_boundary.push_back(7);
+ expected_boundary.push_back(9);
+ expected_boundary.push_back(4);
+ expected_boundary.push_back(14);
+ expected_boundary.push_back(10);
+ expected_boundary.push_back(12);
+ expected_boundary.push_back(12);
+ expected_boundary.push_back(14);
+ expected_boundary.push_back(10);
+ expected_boundary.push_back(20);
+ expected_boundary.push_back(11);
+ expected_boundary.push_back(21);
+ expected_boundary.push_back(15);
+ expected_boundary.push_back(17);
+ expected_boundary.push_back(12);
+ expected_boundary.push_back(22);
+ expected_boundary.push_back(13);
+ expected_boundary.push_back(23);
+ expected_boundary.push_back(17);
+ expected_boundary.push_back(19);
+ expected_boundary.push_back(14);
+ expected_boundary.push_back(24);
+ expected_boundary.push_back(20);
+ expected_boundary.push_back(22);
+ expected_boundary.push_back(22);
+ expected_boundary.push_back(24);
+
+
+ std::vector<size_t> expected_coboundary;
+ expected_coboundary.push_back(5);
+ expected_coboundary.push_back(1);
+ expected_coboundary.push_back(6);
+ expected_coboundary.push_back(7);
+ expected_coboundary.push_back(1);
+ expected_coboundary.push_back(3);
+ expected_coboundary.push_back(8);
+ expected_coboundary.push_back(9);
+ expected_coboundary.push_back(3);
+ expected_coboundary.push_back(6);
+ expected_coboundary.push_back(6);
+ expected_coboundary.push_back(8);
+ expected_coboundary.push_back(8);
+ expected_coboundary.push_back(5);
+ expected_coboundary.push_back(15);
+ expected_coboundary.push_back(11);
+ expected_coboundary.push_back(6);
+ expected_coboundary.push_back(16);
+ expected_coboundary.push_back(7);
+ expected_coboundary.push_back(17);
+ expected_coboundary.push_back(11);
+ expected_coboundary.push_back(13);
+ expected_coboundary.push_back(8);
+ expected_coboundary.push_back(18);
+ expected_coboundary.push_back(9);
+ expected_coboundary.push_back(19);
+ expected_coboundary.push_back(13);
+ expected_coboundary.push_back(16);
+ expected_coboundary.push_back(16);
+ expected_coboundary.push_back(18);
+ expected_coboundary.push_back(18);
+ expected_coboundary.push_back(15);
+ expected_coboundary.push_back(21);
+ expected_coboundary.push_back(16);
+ expected_coboundary.push_back(17);
+ expected_coboundary.push_back(21);
+ expected_coboundary.push_back(23);
+ expected_coboundary.push_back(18);
+ expected_coboundary.push_back(19);
+ expected_coboundary.push_back(23);
+
+
+
+ std::vector< unsigned > sizes(2);
+ sizes[0] = 2;
+ sizes[1] = 2;
+
+ std::vector< double > data(4);
+ data[0] = 0;
+ data[1] = 1;
+ data[2] = 2;
+ data[3] = 3;
+
+ Bitmap_cubical_complex_base ba( sizes , data );
+ int i = 0;
+ int bd_it = 0;
+ int cbd_it = 0;
+
+ Bitmap_cubical_complex_base::All_cells_range range = ba.all_cells_range();
+ for ( Bitmap_cubical_complex_base::All_cells_iterator it = range.begin() ; it != range.end() ; ++it )
+ {
+ BOOST_CHECK( expected_filtration[i] == ba.get_cell_data( *it ) );
+ BOOST_CHECK( expected_dimension[i] == ba.get_dimension_of_a_cell( *it ) );
+
+ Bitmap_cubical_complex_base::Boundary_range bdrange = ba.boundary_range(*it);
+ for ( Bitmap_cubical_complex_base::Boundary_iterator bd = bdrange.begin() ; bd != bdrange.end() ; ++bd )
+ {
+ BOOST_CHECK( expected_boundary[bd_it] == *bd );
+ ++bd_it;
+ }
+
+ Bitmap_cubical_complex_base::Coboundary_range cbdrange = ba.coboundary_range(*it);
+ for ( Bitmap_cubical_complex_base::Coboundary_iterator cbd = cbdrange.begin() ; cbd != cbdrange.end() ; ++cbd )
+ {
+ BOOST_CHECK( expected_coboundary[cbd_it] == *cbd );
+ ++cbd_it;
+ }
+ ++i;
+ }
+}
+
+BOOST_AUTO_TEST_CASE(Top_dimensional_cells_iterator_range_check)
+{
+ std::vector< double > expected_filtration;
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(0);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(1);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(3);
+ expected_filtration.push_back(3);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(2);
+ expected_filtration.push_back(3);
+ expected_filtration.push_back(3);
+
+
+ std::vector< unsigned > sizes(2);
+ sizes[0] = 2;
+ sizes[1] = 2;
+
+ std::vector< double > data(4);
+ data[0] = 0;
+ data[1] = 1;
+ data[2] = 2;
+ data[3] = 3;
+
+ Bitmap_cubical_complex_base ba( sizes , data );
+ int i = 0;
+
+ Bitmap_cubical_complex_base::Top_dimensional_cells_range range = ba.top_dimensional_cells_range();
+ for ( Bitmap_cubical_complex_base::Top_dimensional_cells_iterator it = range.begin() ; it != range.end() ; ++it )
+ {
+ BOOST_CHECK( data[i] == ba.get_cell_data( *it ) );
+ BOOST_CHECK( ba.get_dimension_of_a_cell( *it ) == 2 );
+ ++i;
+ }
+}
+
diff --git a/src/Bitmap_cubical_complex/test/CMakeLists.txt b/src/Bitmap_cubical_complex/test/CMakeLists.txt
new file mode 100644
index 00000000..daf0e14f
--- /dev/null
+++ b/src/Bitmap_cubical_complex/test/CMakeLists.txt
@@ -0,0 +1,24 @@
+cmake_minimum_required(VERSION 2.6)
+project(Bitmap_cubical_complex_tests)
+
+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()
+
+add_executable ( BitmapCCUT Bitmap_test.cpp )
+target_link_libraries(BitmapCCUT ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
+if (TBB_FOUND)
+ target_link_libraries(BitmapCCUT ${TBB_LIBRARIES})
+endif()
+
+# Unitary tests
+add_test(NAME BitmapCCUT
+ COMMAND ${CMAKE_CURRENT_BINARY_DIR}/BitmapCCUT
+ # XML format for Jenkins xUnit plugin
+ --log_format=XML --log_sink=${CMAKE_SOURCE_DIR}/BitmapCCUT.xml --log_level=test_suite --report_level=no)
+
diff --git a/src/Bottleneck_distance/example/CMakeLists.txt b/src/Bottleneck_distance/example/CMakeLists.txt
index cc1b9091..adf298aa 100644
--- a/src/Bottleneck_distance/example/CMakeLists.txt
+++ b/src/Bottleneck_distance/example/CMakeLists.txt
@@ -1,36 +1,12 @@
cmake_minimum_required(VERSION 2.6)
-project(GUDHIBottleneckExample)
+project(Bottleneck_distance_examples)
# need CGAL 4.6
# cmake -DCGAL_DIR=~/workspace/CGAL-4.6-beta1 ../../..
if(CGAL_FOUND)
if (NOT CGAL_VERSION VERSION_LESS 4.6.0)
- message(STATUS "CGAL version: ${CGAL_VERSION}.")
-
- include( ${CGAL_USE_FILE} )
-
- if(NOT MSVC)
- include(CheckCXXCompilerFlag)
- CHECK_CXX_COMPILER_FLAG(-std=c++11 COMPILER_SUPPORTS_CXX11)
- if(COMPILER_SUPPORTS_CXX11)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
- endif()
- endif()
- # - End of workaround
-
- find_package(Eigen3 3.1.0)
if (EIGEN3_FOUND)
- message(STATUS "Eigen3 version: ${EIGEN3_VERSION}.")
- include( ${EIGEN3_USE_FILE} )
- include_directories (BEFORE "../../include")
-
add_executable (bottleneck_example bottleneck_example.cpp)
- #add_test(dtoffrw_tore3D ${CMAKE_CURRENT_BINARY_DIR}/dtoffrw ${CMAKE_SOURCE_DIR}/data/points/tore3D_1307.off 3)
-
- else()
- message(WARNING "Eigen3 not found. Version 3.1.0 is required.")
endif()
- else()
- message(WARNING "CGAL version: ${CGAL_VERSION} is too old to compile Alpha shapes feature. Version 4.6.0 is required.")
endif ()
endif()
diff --git a/src/Bottleneck_distance/example/bottleneck_example.cpp b/src/Bottleneck_distance/example/bottleneck_example.cpp
index b581a3be..472c5c84 100644
--- a/src/Bottleneck_distance/example/bottleneck_example.cpp
+++ b/src/Bottleneck_distance/example/bottleneck_example.cpp
@@ -20,6 +20,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#define CGAL_HAS_THREADS
+
#include <gudhi/Graph_matching.h>
#include <iostream>
#include <fstream>
diff --git a/src/Bottleneck_distance/include/gudhi/Planar_neighbors_finder.h b/src/Bottleneck_distance/include/gudhi/Planar_neighbors_finder.h
index 37c6a122..9356e879 100644
--- a/src/Bottleneck_distance/include/gudhi/Planar_neighbors_finder.h
+++ b/src/Bottleneck_distance/include/gudhi/Planar_neighbors_finder.h
@@ -25,8 +25,8 @@
#include <list>
#include <map>
-#include "../CGAL/Kd_tree.h"
-#include <CGAL/Miscellaneous.h>
+#include "../CGAL/Kd_tree.h"
+#include "../CGAL/Miscellaneous.h"
#include <gudhi/Persistence_diagrams_graph.h>
diff --git a/src/Bottleneck_distance/test/CMakeLists.txt b/src/Bottleneck_distance/test/CMakeLists.txt
index 54a2fe95..ba0f5fee 100644
--- a/src/Bottleneck_distance/test/CMakeLists.txt
+++ b/src/Bottleneck_distance/test/CMakeLists.txt
@@ -1,64 +1,29 @@
cmake_minimum_required(VERSION 2.6)
-project(GUDHIBottleneckUT)
+project(Bottleneck_distance_tests)
-
-
-if(CGAL_FOUND)
- if (NOT CGAL_VERSION VERSION_LESS 4.6.0)
- message(STATUS "CGAL version: ${CGAL_VERSION}.")
-
- include( ${CGAL_USE_FILE} )
-
- if(NOT MSVC)
- include(CheckCXXCompilerFlag)
- CHECK_CXX_COMPILER_FLAG(-std=c++11 COMPILER_SUPPORTS_CXX11)
- if(COMPILER_SUPPORTS_CXX11)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
- endif()
- endif()
- # - End of workaround
-
- find_package(Eigen3 3.1.0)
- if (EIGEN3_FOUND)
- message(STATUS "Eigen3 version: ${EIGEN3_VERSION}.")
- include( ${EIGEN3_USE_FILE} )
- include_directories (BEFORE "../../include")
-
- if (GCOVR_PATH)
+if (GCOVR_PATH)
# for gcovr to make coverage reports - Corbera Jenkins plugin
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage")
- set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fprofile-arcs -ftest-coverage")
endif()
if (GPROF_PATH)
# for gprof to make coverage reports - Jenkins
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
- set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -pg")
endif()
- message("CMAKE_CXX_FLAGS = ${CMAKE_CXX_FLAGS}")
- message("CMAKE_CXX_FLAGS_DEBUG = ${CMAKE_CXX_FLAGS_DEBUG}")
- message("CMAKE_CXX_FLAGS_RELEASE = ${CMAKE_CXX_FLAGS_RELEASE}")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -std=c++11 -Wall -Wpedantic -Wsign-compare")
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -ggdb -O0")
- set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
-
-add_executable ( bottleneckUT bottleneck_unit_test.cpp )
-add_executable ( bottleneck_chrono bottleneck_chrono.cpp )
-target_link_libraries(bottleneckUT ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
-
-# Unitary tests
-add_test(NAME bottleneckUT
- COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bottleneckUT
- # XML format for Jenkins xUnit plugin
- --log_format=XML --log_sink=${CMAKE_SOURCE_DIR}/bottleneckUT.xml --log_level=test_suite --report_level=no)
-
- else()
- message(WARNING "Eigen3 not found. Version 3.1.0 is required for Alpha shapes feature.")
+# 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 ( bottleneckUT bottleneck_unit_test.cpp )
+ add_executable ( bottleneck_chrono bottleneck_chrono.cpp )
+ target_link_libraries(bottleneckUT ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
+
+ # Unitary tests
+ add_test(NAME bottleneckUT COMMAND ${CMAKE_CURRENT_BINARY_DIR}/bottleneckUT
+ # XML format for Jenkins xUnit plugin
+ --log_format=XML --log_sink=${CMAKE_SOURCE_DIR}/bottleneckUT.xml --log_level=test_suite --report_level=no)
endif()
- else()
- message(WARNING "CGAL version: ${CGAL_VERSION} is too old to compile bipartite graphs matching feature. Version 4.6.0 is required.")
endif ()
endif()
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 1436d65a..fffc4105 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,59 +1,148 @@
cmake_minimum_required(VERSION 2.6)
project(GUDHI)
-list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules/")
-
-find_package(Boost REQUIRED COMPONENTS system filesystem program_options chrono timer REQUIRED)
+include("CMakeGUDHIVersion.txt")
+# Generate GUDHI official version file
+configure_file(GUDHIVersion.cmake.in "${CMAKE_SOURCE_DIR}/GUDHIVersion.cmake" @ONLY)
+enable_testing()
-if (NOT CMAKE_BUILD_TYPE)
- set(CMAKE_BUILD_TYPE "Release")
-endif()
-if(MSVC)
- SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4267 /wd4668 /wd4311 /wd4800 /wd4820 /wd4503 /wd4244 /wd4345 /wd4996 /wd4396 /wd4018")
-else()
- list(APPEND CMAKE_CXX_FLAGS "-std=c++11")
-endif()
-
-# BOOST ISSUE result_of vs C++11
-add_definitions(-DBOOST_RESULT_OF_USE_DECLTYPE)
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules/")
-find_package(Boost)
-find_package(GMP)
-if(GMP_FOUND)
- find_package(GMPXX)
-endif()
-find_package(CGAL)
+find_package(Boost REQUIRED COMPONENTS system filesystem program_options chrono timer date_time REQUIRED)
if(NOT Boost_FOUND)
message(FATAL_ERROR "NOTICE: This demo requires Boost and will not be compiled.")
else()
- INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
- LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})
- include_directories(include/)
-
+
+ # 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/Hasse_complex)
- add_subdirectory(example/Alpha_shapes)
- add_subdirectory(example/Bottleneck)
+ add_subdirectory(example/Bitmap_cubical_complex)
+ add_subdirectory(example/Witness_complex)
+ add_subdirectory(example/Alpha_complex)
+ add_subdirectory(example/Bottleneck_distance)
-endif()
+ # data points generator
+ add_subdirectory(data/points/generator)
- include( ${CGAL_USE_FILE} )
- # In CMakeLists.txt, when include(${CGAL_USE_FILE}), CXX_FLAGS are overwritten.
- # cf. http://doc.cgal.org/latest/Manual/installation.html#title40
- # A workaround is to add "-std=c++11" again.
- # 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.
- if(NOT MSVC)
- include(CheckCXXCompilerFlag)
- CHECK_CXX_COMPILER_FLAG(-std=c++11 COMPILER_SUPPORTS_CXX11)
- if(COMPILER_SUPPORTS_CXX11)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
- endif()
- endif()
- # - End of workaround
+ # 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()
diff --git a/src/Contraction/doc/sphere_contraction_representation.png b/src/Contraction/doc/sphere_contraction_representation.png
new file mode 100644
index 00000000..edf37bf3
--- /dev/null
+++ b/src/Contraction/doc/sphere_contraction_representation.png
Binary files differ
diff --git a/src/Contraction/example/CMakeLists.txt b/src/Contraction/example/CMakeLists.txt
index 4889b82f..4c09a0a7 100644
--- a/src/Contraction/example/CMakeLists.txt
+++ b/src/Contraction/example/CMakeLists.txt
@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 2.6)
-project(GUDHIskbl)
+project(Contraction_examples)
add_executable(RipsContraction Rips_contraction.cpp)
@@ -9,5 +9,7 @@ target_link_libraries(RipsContraction ${Boost_TIMER_LIBRARY} ${Boost_SYSTEM_LIBR
target_link_libraries(GarlandHeckbert ${Boost_TIMER_LIBRARY} ${Boost_SYSTEM_LIBRARY})
-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(RipsContraction.tore3D.0.2 ${CMAKE_CURRENT_BINARY_DIR}/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)
diff --git a/src/Contraction/example/Garland_heckbert.cpp b/src/Contraction/example/Garland_heckbert.cpp
index a41f65aa..cbc46e91 100644
--- a/src/Contraction/example/Garland_heckbert.cpp
+++ b/src/Contraction/example/Garland_heckbert.cpp
@@ -1,7 +1,4 @@
-/*
- * Garland_heckbert.h
- * Created on: Feb 10, 2015
- * This file is part of the Gudhi Library. The Gudhi library
+/* This file is part of the Gudhi Library. The Gudhi library
* (Geometric Understanding in Higher Dimensions) is a generic C++
* library for computational topology.
*
@@ -28,18 +25,19 @@
#ifndef GARLAND_HECKBERT_H_
#define GARLAND_HECKBERT_H_
+#include <gudhi/Point.h>
+#include <gudhi/Edge_contraction.h>
+#include <gudhi/Skeleton_blocker.h>
+#include <gudhi/Off_reader.h>
+
#include <boost/timer/timer.hpp>
#include <iostream>
-#include "gudhi/Point.h"
-#include "gudhi/Edge_contraction.h"
-#include "gudhi/Skeleton_blocker.h"
-#include "gudhi/Off_reader.h"
#include "Garland_heckbert/Error_quadric.h"
using namespace std;
using namespace Gudhi;
-using namespace skbl;
+using namespace skeleton_blocker;
using namespace contraction;
struct Geometry_trait {
@@ -51,7 +49,6 @@ struct Geometry_trait {
*/
struct Garland_heckbert_traits : public Skeleton_blocker_simple_geometric_traits<Geometry_trait> {
public:
-
struct Garland_heckbert_vertex : public Simple_geometric_vertex {
Error_quadric<Geometry_trait::Point> quadric;
};
@@ -68,6 +65,7 @@ typedef Skeleton_blocker_contractor<Complex> Complex_contractor;
*/
class GH_placement : public Gudhi::contraction::Placement_policy<EdgeProfile> {
Complex& complex_;
+
public:
typedef Gudhi::contraction::Placement_policy<EdgeProfile>::Placement_type Placement_type;
@@ -91,8 +89,8 @@ class GH_placement : public Gudhi::contraction::Placement_policy<EdgeProfile> {
*/
class GH_cost : public Gudhi::contraction::Cost_policy<EdgeProfile> {
Complex& complex_;
- public:
+ public:
typedef Gudhi::contraction::Cost_policy<EdgeProfile>::Cost_type Cost_type;
GH_cost(Complex& complex) : complex_(complex) { }
@@ -115,13 +113,13 @@ class GH_cost : public Gudhi::contraction::Cost_policy<EdgeProfile> {
*/
class GH_visitor : public Gudhi::contraction::Contraction_visitor<EdgeProfile> {
Complex& complex_;
- public:
+ public:
GH_visitor(Complex& complex) : complex_(complex) { }
- //Compute quadrics for every vertex v
- //The quadric of v consists in the sum of quadric
- //of every triangles passing through v weighted by its area
+ // Compute quadrics for every vertex v
+ // The quadric of v consists in the sum of quadric
+ // of every triangles passing through v weighted by its area
void on_started(Complex & complex) override {
for (auto v : complex.vertex_range()) {
@@ -147,11 +145,13 @@ class GH_visitor : public Gudhi::contraction::Contraction_visitor<EdgeProfile> {
int main(int argc, char *argv[]) {
if (argc != 4) {
- std::cerr << "Usage " << argv[0] << " input.off output.off N to load the file input.off, contract N edges and save the result to output.off.\n";
+ std::cerr << "Usage " << argv[0] <<
+ " input.off output.off N to load the file input.off, contract N edges and save the result to output.off.\n";
return EXIT_FAILURE;
}
Complex complex;
+ typedef Complex::Vertex_handle Vertex_handle;
// load the points
Skeleton_blocker_off_reader<Complex> off_reader(argv[1], complex);
@@ -160,8 +160,12 @@ int main(int argc, char *argv[]) {
return EXIT_FAILURE;
}
- std::cout << "Load complex with " << complex.num_vertices() << " vertices" << std::endl;
+ if (!complex.empty() && !(complex.point(Vertex_handle(0)).dimension() == 3)) {
+ std::cerr << "Only points of dimension 3 are supported." << std::endl;
+ return EXIT_FAILURE;
+ }
+ std::cout << "Load complex with " << complex.num_vertices() << " vertices" << std::endl;
int num_contractions = atoi(argv[3]);
@@ -172,23 +176,24 @@ int main(int argc, char *argv[]) {
new GH_cost(complex),
new GH_placement(complex),
contraction::make_link_valid_contraction<EdgeProfile>(),
- new GH_visitor(complex)
- );
+ new GH_visitor(complex));
std::cout << "Contract " << num_contractions << " edges" << std::endl;
contractor.contract_edges(num_contractions);
std::cout << "Final complex has " <<
complex.num_vertices() << " vertices, " <<
- complex.num_edges() << " edges and" <<
+ complex.num_edges() << " edges and " <<
complex.num_triangles() << " triangles." << std::endl;
- //write simplified complex
+ // write simplified complex
Skeleton_blocker_off_writer<Complex> off_writer(argv[2], complex);
return EXIT_SUCCESS;
}
+#endif // GARLAND_HECKBERT_H_
+
+
-#endif /* GARLAND_HECKBERT_H_ */
diff --git a/src/Contraction/example/Garland_heckbert/Error_quadric.h b/src/Contraction/example/Garland_heckbert/Error_quadric.h
index 725a3a56..076f1be0 100755..100644
--- a/src/Contraction/example/Garland_heckbert/Error_quadric.h
+++ b/src/Contraction/example/Garland_heckbert/Error_quadric.h
@@ -1,164 +1,182 @@
-/*
- * Error_quadric.h
- *
- * Created on: 24 janv. 2014
- * Author: dsalinas
- */
-
-#ifndef ERROR_QUADRIC_H_
-#define ERROR_QUADRIC_H_
-
-#include <vector>
-#include <utility>
-#include <boost/optional/optional.hpp>
-
-
-template <typename Point> class Error_quadric{
-private :
- double coeff[10];
-
-public :
- Error_quadric(){
- clear();
- }
-
- /**
- * Quadric corresponding to the L2 distance to the plane.
- *
- * According to the notation of Garland Heckbert, they
- * denote a quadric symetric matrix as :
- * Q = [ q11 q12 q13 q14]
- * [ q12 q22 q23 q24]
- * [ q13 q23 q33 q34]
- * [ q14 q24 q34 q44]
- *
- * which is represented by a vector with 10 elts that
- * are denoted ci for clarity with :
- * Q = [ c0 c1 c2 c3 ]
- * [ c1 c4 c5 c6 ]
- * [ c2 c5 c7 c8 ]
- * [ c3 c6 c8 c9 ]
- *
- * The constructor return the quadrics that represents
- * the squared distance to the plane defined by triangle p0,p1,p2
- * times the area of triangle p0,p1,p2.
- */
- Error_quadric(const Point & p0,const Point & p1,const Point & p2){
-
- Point normal(unit_normal(p0,p1,p2));
- double a=normal[0];
- double b=normal[1];
- double c=normal[2];
- double d= -a*p0[0]-b*p0[1]-c*p0[2];
- coeff[0] = a*a ;
- coeff[1] = a*b ;
- coeff[2] = a*c ;
- coeff[3] = a*d ;
- coeff[4] = b*b ;
- coeff[5] = b*c ;
- coeff[6] = b*d ;
- coeff[7] = c*c ;
- coeff[8] = c*d ;
- coeff[9] = d*d ;
-
- double area_p0p1p2 = std::sqrt(squared_area(p0,p1,p2));
- for(auto& x : coeff)
- x*= area_p0p1p2;
- }
-
-
- inline double squared_area(const Point& p0,const Point& p1,const Point& p2) {
- //if (x1,x2,x3) = p1-p0 and (y1,y2,y3) = p2-p0
- //then the squared area is = (u^2+v^2+w^2)/4
- //with: u = x2 * y3 - x3 * y2;
- // v = x3 * y1 - x1 * y3;
- // w = x1 * y2 - x2 * y1;
- Point p0p1(p1-p0);
- Point p0p2(p2-p0);
- double A = p0p1[1] * p0p2[2] - p0p1[2] * p0p2[1];
- double B = p0p1[2] * p0p2[0] - p0p1[0] * p0p2[2];
- double C = p0p1[0] * p0p2[1] - p0p1[1] * p0p2[0];
- return 1./4. * (A*A+B*B+C*C);
- }
-
-
- void clear(){
- for(auto& x:coeff)
- x=0;
- }
-
- Error_quadric& operator+=(const Error_quadric& other){
- if(this!=&other)
- for(int i = 0 ; i < 10; ++i)
- coeff[i] += other.coeff[i];
- return *this;
- }
-
- /**
- * @return The quadric quost defined by the scalar product v^T Q v where Q is the quadratic form of Garland/Heckbert
- */
- inline double cost(const Point& point) const{
- double cost =
- coeff[0]*point.x()*point.x()+coeff[4]*point.y()*point.y()+coeff[7]*point.z()*point.z()
- +2*(coeff[1]*point.x()*point.y()+coeff[5]*point.y()*point.z()+coeff[2]*point.z()*point.x())
- +2*(coeff[3]*point.x()+coeff[6]*point.y()+coeff[8]*point.z())
- +coeff[9];
- if(cost<0) return 0;
- else {
- return cost;
- }
- }
-
- inline double grad_determinant() const{
- return
- coeff[0] * coeff[4] * coeff[7]
- - coeff[0] * coeff[5] * coeff[5]
- - coeff[1] * coeff[1] * coeff[7]
- +2*coeff[1] * coeff[5] * coeff[2]
- - coeff[4] * coeff[2] * coeff[2];
- }
-
- /**
- * Return the point such that it minimizes the gradient of the quadric.
- * Det must be passed with the determinant value of the gradient (should be non zero).
- */
- inline Point solve_linear_gradient(double det = grad_determinant()) const{
- return Point({
- (-coeff[1]*coeff[5]*coeff[8]+coeff[1]*coeff[7]*coeff[6]+coeff[2]*coeff[8]*coeff[4]-coeff[2]*coeff[5]*coeff[6]-coeff[3]*coeff[4]*coeff[7]+coeff[3]*coeff[5]*coeff[5])/ det,
- (coeff[0]*coeff[5]*coeff[8]-coeff[0]*coeff[7]*coeff[6]-coeff[5]*coeff[2]*coeff[3]-coeff[1]*coeff[2]*coeff[8]+coeff[6]*coeff[2]*coeff[2]+coeff[1]*coeff[3]*coeff[7])/det,
- (-coeff[8]*coeff[0]*coeff[4]+coeff[8]*coeff[1]*coeff[1]+coeff[2]*coeff[3]*coeff[4]+coeff[5]*coeff[0]*coeff[6]-coeff[5]*coeff[1]*coeff[3]-coeff[1]*coeff[2]*coeff[6])/det
- });
- }
-
-
- /**
- * returns the point that minimizes the quadric.
- * It inverses the quadric if its determinant is higher that a given threshold .
- * If the determinant is lower than this value the returned value is uninitialized.
- */
- boost::optional<Point> min_cost(double scale=1) const{
- // const double min_determinant = 1e-4 * scale*scale;
- const double min_determinant = 1e-5;
- boost::optional<Point> pt_res;
- double det = grad_determinant();
- if (std::abs(det)>min_determinant)
- pt_res = solve_linear_gradient(det);
- return pt_res;
- }
-
- friend std::ostream& operator<< (std::ostream& stream, const Error_quadric& quadric) {
- stream << "\n[ "<<quadric.coeff[0]<<","<<quadric.coeff[1]<<","<<quadric.coeff[2]<<","<<quadric.coeff[3]<<";\n";
- stream << " "<<quadric.coeff[1]<<","<<quadric.coeff[4]<<","<<quadric.coeff[5]<<","<<quadric.coeff[6]<<";\n";
- stream << " "<<quadric.coeff[2]<<","<<quadric.coeff[5]<<","<<quadric.coeff[7]<<","<<quadric.coeff[8]<<";\n";
- stream << " "<<quadric.coeff[3]<<","<<quadric.coeff[6]<<","<<quadric.coeff[8]<<","<<quadric.coeff[9]<<"]";
- return stream;
- }
-
-
-};
-
-
-
-
-#endif /* ERROR_QUADRIC_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.
+ *
+ * Author(s): David Salinas
+ *
+ * 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/>.
+ *
+ */
+
+#ifndef ERROR_QUADRIC_H_
+#define ERROR_QUADRIC_H_
+
+#include <boost/optional/optional.hpp>
+
+#include <vector>
+#include <utility>
+
+template <typename Point> class Error_quadric {
+ private:
+ double coeff[10];
+
+ public:
+ Error_quadric() {
+ clear();
+ }
+
+ /**
+ * Quadric corresponding to the L2 distance to the plane.
+ *
+ * According to the notation of Garland Heckbert, they
+ * denote a quadric symetric matrix as :
+ * Q = [ q11 q12 q13 q14]
+ * [ q12 q22 q23 q24]
+ * [ q13 q23 q33 q34]
+ * [ q14 q24 q34 q44]
+ *
+ * which is represented by a vector with 10 elts that
+ * are denoted ci for clarity with :
+ * Q = [ c0 c1 c2 c3 ]
+ * [ c1 c4 c5 c6 ]
+ * [ c2 c5 c7 c8 ]
+ * [ c3 c6 c8 c9 ]
+ *
+ * The constructor return the quadrics that represents
+ * the squared distance to the plane defined by triangle p0,p1,p2
+ * times the area of triangle p0,p1,p2.
+ */
+ Error_quadric(const Point & p0, const Point & p1, const Point & p2) {
+ Point normal(unit_normal(p0, p1, p2));
+ double a = normal[0];
+ double b = normal[1];
+ double c = normal[2];
+ double d = -a * p0[0] - b * p0[1] - c * p0[2];
+ coeff[0] = a*a;
+ coeff[1] = a*b;
+ coeff[2] = a*c;
+ coeff[3] = a*d;
+ coeff[4] = b*b;
+ coeff[5] = b*c;
+ coeff[6] = b*d;
+ coeff[7] = c*c;
+ coeff[8] = c*d;
+ coeff[9] = d*d;
+
+ double area_p0p1p2 = std::sqrt(squared_area(p0, p1, p2));
+ for (auto& x : coeff)
+ x *= area_p0p1p2;
+ }
+
+ inline double squared_area(const Point& p0, const Point& p1, const Point& p2) {
+ // if (x1,x2,x3) = p1-p0 and (y1,y2,y3) = p2-p0
+ // then the squared area is = (u^2+v^2+w^2)/4
+ // with: u = x2 * y3 - x3 * y2;
+ // v = x3 * y1 - x1 * y3;
+ // w = x1 * y2 - x2 * y1;
+ Point p0p1(p1 - p0);
+ Point p0p2(p2 - p0);
+ double A = p0p1[1] * p0p2[2] - p0p1[2] * p0p2[1];
+ double B = p0p1[2] * p0p2[0] - p0p1[0] * p0p2[2];
+ double C = p0p1[0] * p0p2[1] - p0p1[1] * p0p2[0];
+ return 1. / 4. * (A * A + B * B + C * C);
+ }
+
+ void clear() {
+ for (auto& x : coeff)
+ x = 0;
+ }
+
+ Error_quadric& operator+=(const Error_quadric& other) {
+ if (this != &other) {
+ for (int i = 0; i < 10; ++i)
+ coeff[i] += other.coeff[i];
+ }
+ return *this;
+ }
+
+ /**
+ * @return The quadric quost defined by the scalar product v^T Q v where Q is the quadratic form of Garland/Heckbert
+ */
+ inline double cost(const Point& point) const {
+ double cost =
+ coeff[0] * point.x() * point.x() + coeff[4] * point.y() * point.y() + coeff[7] * point.z() * point.z()
+ + 2 * (coeff[1] * point.x() * point.y() + coeff[5] * point.y() * point.z() + coeff[2] * point.z() * point.x())
+ + 2 * (coeff[3] * point.x() + coeff[6] * point.y() + coeff[8] * point.z())
+ + coeff[9];
+ if (cost < 0) {
+ return 0;
+ } else {
+ return cost;
+ }
+ }
+
+ inline double grad_determinant() const {
+ return
+ coeff[0] * coeff[4] * coeff[7]
+ - coeff[0] * coeff[5] * coeff[5]
+ - coeff[1] * coeff[1] * coeff[7]
+ + 2 * coeff[1] * coeff[5] * coeff[2]
+ - coeff[4] * coeff[2] * coeff[2];
+ }
+
+ /**
+ * Return the point such that it minimizes the gradient of the quadric.
+ * Det must be passed with the determinant value of the gradient (should be non zero).
+ */
+ inline Point solve_linear_gradient(double det) const {
+ return Point({
+ (-coeff[1] * coeff[5] * coeff[8] + coeff[1] * coeff[7] * coeff[6] + coeff[2] * coeff[8] * coeff[4] -
+ coeff[2] * coeff[5] * coeff[6] - coeff[3] * coeff[4] * coeff[7] + coeff[3] * coeff[5] * coeff[5])
+ / det,
+ (coeff[0] * coeff[5] * coeff[8] - coeff[0] * coeff[7] * coeff[6] - coeff[5] * coeff[2] * coeff[3] -
+ coeff[1] * coeff[2] * coeff[8] + coeff[6] * coeff[2] * coeff[2] + coeff[1] * coeff[3] * coeff[7])
+ / det,
+ (-coeff[8] * coeff[0] * coeff[4] + coeff[8] * coeff[1] * coeff[1] + coeff[2] * coeff[3] * coeff[4] +
+ coeff[5] * coeff[0] * coeff[6] - coeff[5] * coeff[1] * coeff[3] - coeff[1] * coeff[2] * coeff[6])
+ / det
+ });
+ }
+
+ /**
+ * returns the point that minimizes the quadric.
+ * It inverses the quadric if its determinant is higher that a given threshold .
+ * If the determinant is lower than this value the returned value is uninitialized.
+ */
+ boost::optional<Point> min_cost(double scale = 1) const {
+ // const double min_determinant = 1e-4 * scale*scale;
+ const double min_determinant = 1e-5;
+ boost::optional<Point> pt_res;
+ double det = grad_determinant();
+ if (std::abs(det) > min_determinant)
+ pt_res = solve_linear_gradient(det);
+ return pt_res;
+ }
+
+ friend std::ostream& operator<<(std::ostream& stream, const Error_quadric& quadric) {
+ stream << "\n[ " << quadric.coeff[0] << "," << quadric.coeff[1] << "," << quadric.coeff[2] << "," <<
+ quadric.coeff[3] << ";\n";
+ stream << " " << quadric.coeff[1] << "," << quadric.coeff[4] << "," << quadric.coeff[5] << "," <<
+ quadric.coeff[6] << ";\n";
+ stream << " " << quadric.coeff[2] << "," << quadric.coeff[5] << "," << quadric.coeff[7] << "," <<
+ quadric.coeff[8] << ";\n";
+ stream << " " << quadric.coeff[3] << "," << quadric.coeff[6] << "," << quadric.coeff[8] << "," <<
+ quadric.coeff[9] << "]";
+ return stream;
+ }
+};
+
+#endif // ERROR_QUADRIC_H_
diff --git a/src/Contraction/example/Rips_contraction.cpp b/src/Contraction/example/Rips_contraction.cpp
index bd0a8b8c..978dd1cb 100644
--- a/src/Contraction/example/Rips_contraction.cpp
+++ b/src/Contraction/example/Rips_contraction.cpp
@@ -19,24 +19,23 @@
* 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/Edge_contraction.h>
+#include <gudhi/Skeleton_blocker.h>
+#include <gudhi/Off_reader.h>
+#include <gudhi/Point.h>
+
#include <boost/timer/timer.hpp>
#include <iostream>
-#include "gudhi/Edge_contraction.h"
-#include "gudhi/Skeleton_blocker.h"
-#include "gudhi/Off_reader.h"
-#include "gudhi/Point.h"
using namespace std;
using namespace Gudhi;
-using namespace skbl;
+using namespace skeleton_blocker;
using namespace contraction;
-
-struct Geometry_trait{
- typedef Point_d Point;
+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;
@@ -44,62 +43,62 @@ typedef Edge_profile<Complex> Profile;
typedef Skeleton_blocker_contractor<Complex> Complex_contractor;
template<typename ComplexType>
-void build_rips(ComplexType& complex, double offset){
- if (offset<=0) return;
- auto vertices = complex.vertex_range();
- for (auto p = vertices.begin(); p != vertices.end(); ++p)
- for (auto q = p; ++q != vertices.end(); /**/){
- if ( squared_dist(complex.point(*p), complex.point(*q)) < 4 * offset * offset)
- complex.add_edge(*p,*q);
- }
+void build_rips(ComplexType& complex, double offset) {
+ if (offset <= 0) return;
+ auto vertices = complex.vertex_range();
+ for (auto p = vertices.begin(); p != vertices.end(); ++p)
+ for (auto q = p; ++q != vertices.end(); /**/) {
+ if (squared_dist(complex.point(*p), complex.point(*q)) < 4 * offset * offset)
+ complex.add_edge_without_blockers(*p, *q);
+ }
}
-int main (int argc, char *argv[])
-{
- if (argc!=3){
- std::cerr << "Usage "<<argv[0]<<" ../../../data/meshes/SO3_10000.off 0.3 to load the file ../../data/SO3_10000.off and contract the Rips complex built with paremeter 0.3.\n";
- return -1;
- }
+int main(int argc, char *argv[]) {
+ if (argc != 3) {
+ std::cerr << "Usage " << argv[0] << " ../../../data/meshes/SO3_10000.off 0.3 to load the file " <<
+ "../../data/SO3_10000.off and contract the Rips complex built with paremeter 0.3.\n";
+ return -1;
+ }
- Complex complex;
+ Complex complex;
- // load only the points
- 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;
- }
+ // load only the points
+ 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;
+ }
- std::cout << "Build the Rips complex with "<<complex.num_vertices()<<" vertices"<<std::endl;
+ std::cout << "Build the Rips complex with " << complex.num_vertices() << " vertices" << std::endl;
- build_rips(complex,atof(argv[2]));
+ build_rips(complex, atof(argv[2]));
- boost::timer::auto_cpu_timer t;
+ boost::timer::auto_cpu_timer t;
- std::cout << "Initial complex has "<<
- complex.num_vertices()<<" vertices and "<<
- complex.num_edges()<<" edges"<<std::endl;
+ std::cout << "Initial complex has " <<
+ complex.num_vertices() << " vertices and " <<
+ 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>());
- contractor.contract_edges();
+ 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>());
+ contractor.contract_edges();
- std::cout << "Counting final number of simplices \n";
- unsigned num_simplices = std::distance(complex.simplex_range().begin(),complex.simplex_range().end());
+ std::cout << "Counting final number of simplices \n";
+ unsigned num_simplices = std::distance(complex.complex_simplex_range().begin(), complex.complex_simplex_range().end());
- std::cout << "Final complex has "<<
- complex.num_vertices()<<" vertices, "<<
- complex.num_edges()<<" edges, "<<
- complex.num_blockers()<<" blockers and "<<
- num_simplices<<" simplices"<<std::endl;
+ std::cout << "Final complex has " <<
+ complex.num_vertices() << " vertices, " <<
+ complex.num_edges() << " edges, " <<
+ complex.num_blockers() << " blockers and " <<
+ num_simplices << " simplices" << std::endl;
- std::cout << "Time to simplify and enumerate simplices:\n";
+ std::cout << "Time to simplify and enumerate simplices:\n";
- return EXIT_SUCCESS;
+ return EXIT_SUCCESS;
}
diff --git a/src/Contraction/include/gudhi/Contraction/CGAL_queue/Modifiable_priority_queue.h b/src/Contraction/include/gudhi/Contraction/CGAL_queue/Modifiable_priority_queue.h
index 10b89e13..5a55c513 100644
--- a/src/Contraction/include/gudhi/Contraction/CGAL_queue/Modifiable_priority_queue.h
+++ b/src/Contraction/include/gudhi/Contraction/CGAL_queue/Modifiable_priority_queue.h
@@ -16,76 +16,86 @@
//
// Author(s) : Fernando Cacciola <fernando.cacciola@geometryfactory.com>
//
-#ifndef CGAL_MODIFIABLE_PRIORITY_QUEUE_H
-#define CGAL_MODIFIABLE_PRIORITY_QUEUE_H
+#ifndef CONTRACTION_CGAL_QUEUE_MODIFIABLE_PRIORITY_QUEUE_H_
+#define CONTRACTION_CGAL_QUEUE_MODIFIABLE_PRIORITY_QUEUE_H_
#define CGAL_SURFACE_MESH_SIMPLIFICATION_USE_RELAXED_HEAP
-#include <climits> // Neeeded by the following Boost header for CHAR_BIT.
#include <boost/optional.hpp>
#include <boost/pending/relaxed_heap.hpp>
-namespace CGAL {
+#include <climits> // Neeeded by the following Boost header for CHAR_BIT.
+#include <functional> // for less
-template <class IndexedType_
- ,class Compare_ = std::less<IndexedType_>
- ,class ID_ = boost::identity_property_map
- >
-class Modifiable_priority_queue
-{
-public:
+namespace CGAL {
+template <class IndexedType_, class Compare_ = std::less<IndexedType_>, class ID_ = boost::identity_property_map>
+class Modifiable_priority_queue {
+ public:
typedef Modifiable_priority_queue Self;
-
- typedef IndexedType_ IndexedType ;
- typedef Compare_ Compare;
- typedef ID_ ID ;
-
- typedef boost::relaxed_heap<IndexedType,Compare,ID> Heap;
+
+ typedef IndexedType_ IndexedType;
+ typedef Compare_ Compare;
+ typedef ID_ ID;
+
+ typedef boost::relaxed_heap<IndexedType, Compare, ID> Heap;
typedef typename Heap::value_type value_type;
- typedef typename Heap::size_type size_type;
-
- typedef bool handle ;
-
-public:
-
- Modifiable_priority_queue( size_type largest_ID, Compare const& c, ID const& id ) : mHeap(largest_ID,c,id) {}
-
- handle push ( value_type const& v ) { mHeap.push(v) ; return handle(true) ; }
-
- handle update ( value_type const& v, handle h ) { mHeap.update(v); return h ; }
-
- handle erase ( value_type const& v, handle ) { mHeap.remove(v); return null_handle() ; }
-
- value_type top() const { return mHeap.top() ; }
-
- void pop() { mHeap.pop(); }
-
- bool empty() const { return mHeap.empty() ; }
-
- bool contains ( value_type const& v ) { return mHeap.contains(v) ; }
-
- boost::optional<value_type> extract_top()
- {
- boost::optional<value_type> r ;
- if ( !empty() )
- {
+ typedef typename Heap::size_type size_type;
+
+ typedef bool handle;
+
+ public:
+ Modifiable_priority_queue(size_type largest_ID, Compare const& c, ID const& id) : mHeap(largest_ID, c, id) { }
+
+ handle push(value_type const& v) {
+ mHeap.push(v);
+ return handle(true);
+ }
+
+ handle update(value_type const& v, handle h) {
+ mHeap.update(v);
+ return h;
+ }
+
+ handle erase(value_type const& v, handle) {
+ mHeap.remove(v);
+ return null_handle();
+ }
+
+ value_type top() const {
+ return mHeap.top();
+ }
+
+ void pop() {
+ mHeap.pop();
+ }
+
+ bool empty() const {
+ return mHeap.empty();
+ }
+
+ bool contains(value_type const& v) {
+ return mHeap.contains(v);
+ }
+
+ boost::optional<value_type> extract_top() {
+ boost::optional<value_type> r;
+ if (!empty()) {
value_type v = top();
pop();
- r = boost::optional<value_type>(v) ;
- }
- return r ;
+ r = boost::optional<value_type>(v);
+ }
+ return r;
+ }
+
+ static handle null_handle() {
+ return handle(false);
}
-
- static handle null_handle() { return handle(false); }
-
-private:
- Heap mHeap ;
-
-} ;
+ private:
+ Heap mHeap;
+};
-} //namespace CGAL
+} // namespace CGAL
-#endif
-
+#endif // CONTRACTION_CGAL_QUEUE_MODIFIABLE_PRIORITY_QUEUE_H_
diff --git a/src/Contraction/include/gudhi/Contraction/Edge_profile.h b/src/Contraction/include/gudhi/Contraction/Edge_profile.h
index f90bd71a..e4910b27 100644
--- a/src/Contraction/include/gudhi/Contraction/Edge_profile.h
+++ b/src/Contraction/include/gudhi/Contraction/Edge_profile.h
@@ -1,130 +1,130 @@
- /* 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 GUDHI_EDGE_PROFILE_H_
-#define GUDHI_EDGE_PROFILE_H_
-//#include "combinatorics/Skeleton_blocker/Simplex.h"
-
-
-namespace 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): 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 CONTRACTION_EDGE_PROFILE_H_
+#define CONTRACTION_EDGE_PROFILE_H_
+
+#include <ostream>
+
+namespace Gudhi {
namespace contraction {
-template<typename GeometricSimplifiableComplex> class Edge_profile{
-public:
- typedef GeometricSimplifiableComplex Complex;
- typedef typename Complex::GT GT;
+template<typename GeometricSimplifiableComplex> class Edge_profile {
+ public:
+ typedef GeometricSimplifiableComplex Complex;
+ typedef typename Complex::GT GT;
- typedef typename GeometricSimplifiableComplex::Vertex_handle Vertex_handle;
- typedef typename GeometricSimplifiableComplex::Root_vertex_handle Root_vertex_handle;
+ typedef typename GeometricSimplifiableComplex::Vertex_handle Vertex_handle;
+ typedef typename GeometricSimplifiableComplex::Root_vertex_handle Root_vertex_handle;
- typedef typename GeometricSimplifiableComplex::Edge_handle Edge_handle;
- typedef typename GeometricSimplifiableComplex::Graph_vertex Graph_vertex;
- typedef typename GeometricSimplifiableComplex::Graph_edge Graph_edge;
- typedef typename GeometricSimplifiableComplex::Point Point;
+ typedef typename GeometricSimplifiableComplex::Edge_handle Edge_handle;
+ typedef typename GeometricSimplifiableComplex::Graph_vertex Graph_vertex;
+ typedef typename GeometricSimplifiableComplex::Graph_edge Graph_edge;
+ typedef typename GeometricSimplifiableComplex::Point Point;
+ Edge_profile(GeometricSimplifiableComplex& complex, Edge_handle edge) : complex_(complex), edge_handle_(edge),
+ v0_(complex_.first_vertex(edge_handle_)), v1_(complex_.second_vertex(edge_handle_)) {
+ assert(complex_.get_address(complex_[edge_handle_].first()));
+ assert(complex_.get_address(complex_[edge_handle_].second()));
+ assert(complex_.contains_edge(v0_handle(), v1_handle()));
+ assert(v0_handle() != v1_handle());
+ }
+ virtual ~Edge_profile() { }
+ GeometricSimplifiableComplex& complex() const {
+ return complex_;
+ }
- Edge_profile( GeometricSimplifiableComplex& complex,Edge_handle edge):complex_(complex),edge_handle_(edge),
- v0_(complex_.first_vertex(edge_handle_)),v1_(complex_.second_vertex(edge_handle_))
-{
- assert(complex_.get_address(complex_[edge_handle_].first()));
- assert(complex_.get_address(complex_[edge_handle_].second()));
- assert(complex_.contains_edge(v0_handle(),v1_handle()));
- assert(v0_handle() != v1_handle());
-}
+ Edge_handle edge_handle() const {
+ return edge_handle_;
+ }
- virtual ~Edge_profile(){ }
+ Graph_edge& edge() const {
+ return complex_[edge_handle_];
+ }
+ Graph_vertex& v0() const {
+ return complex_[v0_handle()];
+ }
- GeometricSimplifiableComplex& complex() const {
- return complex_;
- }
+ Graph_vertex& v1() const {
+ return complex_[v1_handle()];
+ }
- Edge_handle edge_handle() const{
- return edge_handle_;
- }
+ Vertex_handle v0_handle() const {
+ return v0_;
+ // Root_vertex_handle root = complex_[edge_handle_].first();
+ // assert(complex_.get_address(root));
+ // return *complex_.get_address(root);
+ }
- Graph_edge& edge() const{
- return complex_[edge_handle_];
- }
+ Vertex_handle v1_handle() const {
+ return v1_;
+ // Root_vertex_handle root = complex_[edge_handle_].second();
+ // assert(complex_.get_address(root));
+ // return *complex_.get_address(root);
+ }
+ const Point& p0() const {
+ return complex_.point(v0_handle());
+ }
- Graph_vertex& v0() const{return complex_[v0_handle()];}
- Graph_vertex& v1() const{return complex_[v1_handle()];}
+ const Point& p1() const {
+ return complex_.point(v1_handle());
+ }
+ friend std::ostream& operator<<(std::ostream& o, const Edge_profile& v) {
+ return o << "v0:" << v.v0_handle() << " v1:" << v.v1_handle();
+ }
- Vertex_handle v0_handle() const{
- return v0_;
-// Root_vertex_handle root = complex_[edge_handle_].first();
-// assert(complex_.get_address(root));
-// return *complex_.get_address(root);
- }
+ private:
+ GeometricSimplifiableComplex& complex_;
- Vertex_handle v1_handle() const{
- return v1_;
-// Root_vertex_handle root = complex_[edge_handle_].second();
-// assert(complex_.get_address(root));
-// return *complex_.get_address(root);
- }
+ Edge_handle edge_handle_;
- const Point& p0() const {return complex_.point(v0_handle());}
+ Vertex_handle v0_;
- const Point& p1() const {return complex_.point(v1_handle());}
-
- friend std::ostream& operator << (std::ostream& o, const Edge_profile & v){
- o << "v0:"<<v.v0_handle() << " v1:"<<v.v1_handle();
- return o;
- }
-private:
-
- GeometricSimplifiableComplex& complex_;
-
- Edge_handle edge_handle_;
-
- Vertex_handle v0_;
+ Vertex_handle v1_;
+};
- Vertex_handle v1_;
+template<typename EdgeProfile> class Edge_profile_factory {
+ public:
+ typedef typename EdgeProfile::Edge_handle Edge_handle_;
+ typedef typename EdgeProfile::Complex Complex_;
-};
+ virtual EdgeProfile make_profile(
+ Complex_& complex,
+ Edge_handle_ edge) const {
+ return EdgeProfile(complex, edge);
+ }
-template<typename EdgeProfile> class Edge_profile_factory{
-public:
- typedef typename EdgeProfile::Edge_handle Edge_handle_;
- typedef typename EdgeProfile::Complex Complex_;
- virtual EdgeProfile make_profile(
- Complex_& complex,
- Edge_handle_ edge) const{
- return EdgeProfile(complex,edge);
- }
-
- virtual ~Edge_profile_factory(){};
+ virtual ~Edge_profile_factory() { }
};
-
} // namespace contraction
-} // namespace GUDHI
+} // namespace Gudhi
-#endif /* GUDHI_EDGE_PROFILE_H_ */
+#endif // CONTRACTION_EDGE_PROFILE_H_
diff --git a/src/Contraction/include/gudhi/Contraction/policies/Contraction_visitor.h b/src/Contraction/include/gudhi/Contraction/policies/Contraction_visitor.h
index b8b1e87a..7ee05aad 100644
--- a/src/Contraction/include/gudhi/Contraction/policies/Contraction_visitor.h
+++ b/src/Contraction/include/gudhi/Contraction/policies/Contraction_visitor.h
@@ -1,32 +1,32 @@
- /* 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 GUDHI_CONTRACTION_VISITOR_H_
-#define GUDHI_CONTRACTION_VISITOR_H_
-
-#include "gudhi/Contraction/Edge_profile.h"
-#include "boost/optional.hpp"
-
-namespace 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): 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 CONTRACTION_POLICIES_CONTRACTION_VISITOR_H_
+#define CONTRACTION_POLICIES_CONTRACTION_VISITOR_H_
+
+#include <gudhi/Contraction/Edge_profile.h>
+#include <boost/optional.hpp>
+
+namespace Gudhi {
namespace contraction {
@@ -36,66 +36,56 @@ namespace contraction {
*@ingroup contr
*/
template <typename EdgeProfile>
-class Contraction_visitor {//: public Dummy_complex_visitor<typename EdgeProfile::Vertex_handle> {
-public:
- //typedef typename ComplexType::GeometryTrait GT;
- typedef EdgeProfile Profile;
- typedef double FT;
- typedef typename Profile::Complex Complex;
- typedef Complex ComplexType;
- typedef typename ComplexType::Point Point;
-
-
- virtual ~Contraction_visitor(){};
-
- /**
- * @brief Called before the edge contraction process starts.
- */
- virtual void on_started (ComplexType & complex){}
-
- /**
- * @brief Called when the algorithm stops.
- */
- virtual void on_stop_condition_reached (){}
-
-
- /**
- * @brief Called during the collecting phase (when a cost is assigned to the edges), for each edge collected.
- */
- virtual void on_collected (const Profile &profile, boost::optional< FT > cost){}
-
- /**
- * @brief Called during the processing phase (when edges are contracted), for each edge that is selected.
- */
- virtual void on_selected (const Profile &profile, boost::optional< FT > cost, int initial_count, int current_count){}
-
-
- /**
- * @brief Called when an edge is about to be contracted and replaced by a vertex whose position is *placement.
- */
- virtual void on_contracting(const Profile &profile, boost::optional< Point > placement){
- }
-
-
-
- /**
- * @brief Called when after an edge has been contracted onto a new point placement.
- * A possibility would to remove popable blockers at this point for instance.
- */
- virtual void on_contracted(const Profile &profile, boost::optional< Point > placement){
-
- }
-
-
- /**
- * @brief Called for each selected edge which cannot be contracted because the ValidContractionPredicate is false
- */
- virtual void on_non_valid(const Profile &profile){}
-
+class Contraction_visitor { // : public Dummy_complex_visitor<typename EdgeProfile::Vertex_handle> {
+ public:
+ // typedef typename ComplexType::GeometryTrait GT;
+ typedef EdgeProfile Profile;
+ typedef double FT;
+ typedef typename Profile::Complex Complex;
+ typedef Complex ComplexType;
+ typedef typename ComplexType::Point Point;
+
+ virtual ~Contraction_visitor() { }
+
+ /**
+ * @brief Called before the edge contraction process starts.
+ */
+ virtual void on_started(ComplexType & complex) { }
+
+ /**
+ * @brief Called when the algorithm stops.
+ */
+ virtual void on_stop_condition_reached() { }
+
+ /**
+ * @brief Called during the collecting phase (when a cost is assigned to the edges), for each edge collected.
+ */
+ virtual void on_collected(const Profile &profile, boost::optional< FT > cost) { }
+
+ /**
+ * @brief Called during the processing phase (when edges are contracted), for each edge that is selected.
+ */
+ virtual void on_selected(const Profile &profile, boost::optional< FT > cost, int initial_count, int current_count) { }
+
+ /**
+ * @brief Called when an edge is about to be contracted and replaced by a vertex whose position is *placement.
+ */
+ virtual void on_contracting(const Profile &profile, boost::optional< Point > placement) { }
+
+ /**
+ * @brief Called when after an edge has been contracted onto a new point placement.
+ * A possibility would to remove popable blockers at this point for instance.
+ */
+ virtual void on_contracted(const Profile &profile, boost::optional< Point > placement) { }
+
+ /**
+ * @brief Called for each selected edge which cannot be contracted because the ValidContractionPredicate is false
+ */
+ virtual void on_non_valid(const Profile &profile) { }
};
} // namespace contraction
-} // namespace GUDHI
+} // namespace Gudhi
-#endif /* GUDHI_CONTRACTION_VISITOR_H_ */
+#endif // CONTRACTION_POLICIES_CONTRACTION_VISITOR_H_
diff --git a/src/Contraction/include/gudhi/Contraction/policies/Cost_policy.h b/src/Contraction/include/gudhi/Contraction/policies/Cost_policy.h
index 3cb18c86..f4d343ec 100644
--- a/src/Contraction/include/gudhi/Contraction/policies/Cost_policy.h
+++ b/src/Contraction/include/gudhi/Contraction/policies/Cost_policy.h
@@ -1,51 +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): 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 GUDHI_COST_POLICY_H_
-#define GUDHI_COST_POLICY_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.
+ *
+ * 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 CONTRACTION_POLICIES_COST_POLICY_H_
+#define CONTRACTION_POLICIES_COST_POLICY_H_
#include <boost/optional.hpp>
-namespace Gudhi{
+namespace Gudhi {
namespace contraction {
/**
-*@brief Policy to specify the cost of contracting an edge.
+ *@brief Policy to specify the cost of contracting an edge.
*@ingroup contr
-*/
-template< typename EdgeProfile> class Cost_policy{
-public:
- typedef typename EdgeProfile::Point Point;
- typedef typename EdgeProfile::Graph_vertex Graph_vertex;
+ */
+template< typename EdgeProfile>
+class Cost_policy {
+ public:
+ typedef typename EdgeProfile::Point Point;
+ typedef typename EdgeProfile::Graph_vertex Graph_vertex;
- typedef boost::optional<double> Cost_type;
+ typedef boost::optional<double> Cost_type;
- virtual Cost_type operator()(const EdgeProfile& profile, const boost::optional<Point>& placement) const =0;
- virtual ~Cost_policy(){
- };
+ virtual Cost_type operator()(const EdgeProfile& profile, const boost::optional<Point>& placement) const = 0;
+
+ virtual ~Cost_policy() { }
};
} // namespace contraction
-} // namespace GUDHI
-#endif /* GUDHI_COST_POLICY_H_ */
+} // namespace Gudhi
+
+#endif // CONTRACTION_POLICIES_COST_POLICY_H_
diff --git a/src/Contraction/include/gudhi/Contraction/policies/Dummy_valid_contraction.h b/src/Contraction/include/gudhi/Contraction/policies/Dummy_valid_contraction.h
index de473944..5d329496 100644
--- a/src/Contraction/include/gudhi/Contraction/policies/Dummy_valid_contraction.h
+++ b/src/Contraction/include/gudhi/Contraction/policies/Dummy_valid_contraction.h
@@ -1,51 +1,49 @@
- /* This file is part of the Gudhi Library. The Gudhi library
- * (Geometric Understanding in Higher Dimensions) is a generic C++
- * library for computational topology.
- *
- * Author(s): 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 GUDHI_DUMMY_VALID_CONTRACTION_H_
-#define GUDHI_DUMMY_VALID_CONTRACTION_H_
-
-#include "Valid_contraction_policy.h"
-
-namespace 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): 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 CONTRACTION_POLICIES_DUMMY_VALID_CONTRACTION_H_
+#define CONTRACTION_POLICIES_DUMMY_VALID_CONTRACTION_H_
+
+#include <gudhi/Contraction/policies/Valid_contraction_policy.h>
+
+namespace Gudhi {
namespace contraction {
-
-
- /**
- *@brief Policy that accept all edge contraction.
- */
-template< typename EdgeProfile> class Dummy_valid_contraction : public Valid_contraction_policy<EdgeProfile>{
-public:
- typedef typename EdgeProfile::Point Point;
- bool operator()(const EdgeProfile& profile,const boost::optional<Point>& placement){
- return true;
- }
+/**
+ *@brief Policy that accept all edge contraction.
+ */
+template< typename EdgeProfile>
+class Dummy_valid_contraction : public Valid_contraction_policy<EdgeProfile> {
+ public:
+ typedef typename EdgeProfile::Point Point;
+
+ bool operator()(const EdgeProfile& profile, const boost::optional<Point>& placement) {
+ return true;
+ }
};
} // namespace contraction
-} // namespace GUDHI
-
-
+} // namespace Gudhi
-#endif /* GUDHI_DUMMY_VALID_CONTRACTION_H_ */
+#endif // CONTRACTION_POLICIES_DUMMY_VALID_CONTRACTION_H_
diff --git a/src/Contraction/include/gudhi/Contraction/policies/Edge_length_cost.h b/src/Contraction/include/gudhi/Contraction/policies/Edge_length_cost.h
index b22ada0d..dac2d448 100644
--- a/src/Contraction/include/gudhi/Contraction/policies/Edge_length_cost.h
+++ b/src/Contraction/include/gudhi/Contraction/policies/Edge_length_cost.h
@@ -1,56 +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): 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 GUDHI_EDGE_LENGTH_COST_H_
-#define GUDHI_EDGE_LENGTH_COST_H_
-
-#include "Cost_policy.h"
-
-namespace 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): 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/>.
+ */
-namespace contraction {
+#ifndef CONTRACTION_POLICIES_EDGE_LENGTH_COST_H_
+#define CONTRACTION_POLICIES_EDGE_LENGTH_COST_H_
+
+#include <gudhi/Contraction/policies/Cost_policy.h>
+namespace Gudhi {
+
+namespace contraction {
/**
* @brief return a cost corresponding to the squared length of the edge
*/
-template< typename EdgeProfile> class Edge_length_cost : public Cost_policy<EdgeProfile>{
-public:
- typedef typename Cost_policy<EdgeProfile>::Cost_type Cost_type;
- typedef typename EdgeProfile::Point Point;
- Cost_type operator()(const EdgeProfile& profile, const boost::optional<Point>& placement) const override{
- double res = 0;
- auto p0_coord = profile.p0().begin();
- auto p1_coord = profile.p1().begin();
- for(; p0_coord != profile.p0().end(); p0_coord++, p1_coord++){
- res += (*p0_coord - *p1_coord) * (*p0_coord - *p1_coord);
- }
- return res;
- }
-
+template< typename EdgeProfile>
+class Edge_length_cost : public Cost_policy<EdgeProfile> {
+ public:
+ typedef typename Cost_policy<EdgeProfile>::Cost_type Cost_type;
+ typedef typename EdgeProfile::Point Point;
+
+ Cost_type operator()(const EdgeProfile& profile, const boost::optional<Point>& placement) const override {
+ double res = 0;
+ auto p0_coord = profile.p0().begin();
+ auto p1_coord = profile.p1().begin();
+ for (; p0_coord != profile.p0().end(); p0_coord++, p1_coord++) {
+ res += (*p0_coord - *p1_coord) * (*p0_coord - *p1_coord);
+ }
+ return res;
+ }
};
} // namespace contraction
-} // namespace GUDHI
+} // namespace Gudhi
-#endif /* GUDHI_EDGE_LENGTH_COST_H_ */
+#endif // CONTRACTION_POLICIES_EDGE_LENGTH_COST_H_
diff --git a/src/Contraction/include/gudhi/Contraction/policies/First_vertex_placement.h b/src/Contraction/include/gudhi/Contraction/policies/First_vertex_placement.h
index 93abac35..1f68db0d 100644
--- a/src/Contraction/include/gudhi/Contraction/policies/First_vertex_placement.h
+++ b/src/Contraction/include/gudhi/Contraction/policies/First_vertex_placement.h
@@ -1,53 +1,52 @@
- /* 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 GUDHI_FIRST_VERTEX_PLACEMENT_H_
-#define GUDHI_FIRST_VERTEX_PLACEMENT_H_
-
-#include "Placement_policy.h"
-
-namespace 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): 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/>.
+ */
-namespace contraction {
+#ifndef CONTRACTION_POLICIES_FIRST_VERTEX_PLACEMENT_H_
+#define CONTRACTION_POLICIES_FIRST_VERTEX_PLACEMENT_H_
+
+#include <gudhi/Contraction/policies/Placement_policy.h>
+
+namespace Gudhi {
+namespace contraction {
/**
* @brief Places the contracted point onto the first point of the edge
*/
-template< typename EdgeProfile> class First_vertex_placement : public Placement_policy<EdgeProfile>{
-
-public:
- typedef typename EdgeProfile::Point Point;
- typedef typename EdgeProfile::Edge_handle Edge_handle;
+template< typename EdgeProfile>
+class First_vertex_placement : public Placement_policy<EdgeProfile> {
+ public:
+ typedef typename EdgeProfile::Point Point;
+ typedef typename EdgeProfile::Edge_handle Edge_handle;
- typedef typename Placement_policy<EdgeProfile>::Placement_type Placement_type;
+ typedef typename Placement_policy<EdgeProfile>::Placement_type Placement_type;
- Placement_type operator()(const EdgeProfile& profile) const override{
- return Placement_type(profile.p0());
- }
+ Placement_type operator()(const EdgeProfile& profile) const override {
+ return Placement_type(profile.p0());
+ }
};
-} // namespace contraction
-} // namespace GUDHI
+} // namespace contraction
+} // namespace Gudhi
-#endif /* GUDHI_FIRST_VERTEX_PLACEMENT_H_ */
+#endif // CONTRACTION_POLICIES_FIRST_VERTEX_PLACEMENT_H_
diff --git a/src/Contraction/include/gudhi/Contraction/policies/Link_condition_valid_contraction.h b/src/Contraction/include/gudhi/Contraction/policies/Link_condition_valid_contraction.h
index c901e629..250bba27 100644
--- a/src/Contraction/include/gudhi/Contraction/policies/Link_condition_valid_contraction.h
+++ b/src/Contraction/include/gudhi/Contraction/policies/Link_condition_valid_contraction.h
@@ -1,54 +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): 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 GUDHI_LINK_CONDITION_VALID_CONTRACTION_H_
-#define GUDHI_LINK_CONDITION_VALID_CONTRACTION_H_
-
-#include "gudhi/Utils.h"
-#include "Valid_contraction_policy.h"
-
-
-namespace 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): 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 CONTRACTION_POLICIES_LINK_CONDITION_VALID_CONTRACTION_H_
+#define CONTRACTION_POLICIES_LINK_CONDITION_VALID_CONTRACTION_H_
+
+#include <gudhi/Contraction/policies/Valid_contraction_policy.h>
+#include <gudhi/Debug_utils.h>
+
+
+namespace Gudhi {
namespace contraction {
-
- /**
- *@brief Policy that only accept edges verifying the link condition (and therefore whose contraction preserving homotopy type).
- *@ingroup contr
- */
-template< typename EdgeProfile> class Link_condition_valid_contraction : public Valid_contraction_policy<EdgeProfile>{
-public:
- typedef typename EdgeProfile::Edge_handle Edge_handle;
- typedef typename EdgeProfile::Point Point;
- //typedef typename EdgeProfile::Edge_handle Edge_handle;
- bool operator()(const EdgeProfile& profile,const boost::optional<Point>& placement) const override{
- Edge_handle edge(profile.edge_handle());
- DBGMSG("Link_condition_valid_contraction:",profile.complex().link_condition(edge));
- return profile.complex().link_condition(edge);
- }
+/**
+ *@brief Policy that only accept edges verifying the link condition (and therefore whose contraction preserving homotopy type).
+ *@ingroup contr
+ */
+template< typename EdgeProfile>
+class Link_condition_valid_contraction : public Valid_contraction_policy<EdgeProfile> {
+ public:
+ typedef typename EdgeProfile::Edge_handle Edge_handle;
+ typedef typename EdgeProfile::Point Point;
+ // typedef typename EdgeProfile::Edge_handle Edge_handle;
+
+ bool operator()(const EdgeProfile& profile, const boost::optional<Point>& placement) const override {
+ Edge_handle edge(profile.edge_handle());
+ DBGMSG("Link_condition_valid_contraction:", profile.complex().link_condition(edge));
+ return profile.complex().link_condition(edge);
+ }
};
+
} // namespace contraction
-} // namespace GUDHI
+} // namespace Gudhi
-#endif /* GUDHI_LINK_CONDITION_VALID_CONTRACTION_H_ */
+#endif // CONTRACTION_POLICIES_LINK_CONDITION_VALID_CONTRACTION_H_
diff --git a/src/Contraction/include/gudhi/Contraction/policies/Middle_placement.h b/src/Contraction/include/gudhi/Contraction/policies/Middle_placement.h
index 30f0a570..4b59f1b5 100644
--- a/src/Contraction/include/gudhi/Contraction/policies/Middle_placement.h
+++ b/src/Contraction/include/gudhi/Contraction/policies/Middle_placement.h
@@ -1,52 +1,51 @@
- /* This file is part of the Gudhi Library. The Gudhi library
- * (Geometric Understanding in Higher Dimensions) is a generic C++
- * library for computational topology.
- *
- * Author(s): 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 GUDHI_MIDDLE_PLACEMENT_H_
-#define GUDHI_MIDDLE_PLACEMENT_H_
-
-#include "Placement_policy.h"
-
-
-namespace 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): 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 CONTRACTION_POLICIES_MIDDLE_PLACEMENT_H_
+#define CONTRACTION_POLICIES_MIDDLE_PLACEMENT_H_
+
+#include <gudhi/Contraction/policies/Placement_policy.h>
+
+namespace Gudhi {
namespace contraction {
+template< typename EdgeProfile>
+class Middle_placement : public Placement_policy<EdgeProfile> {
+ public:
+ typedef typename EdgeProfile::Point Point;
+ typedef typename EdgeProfile::Edge_handle Edge_handle;
+ typedef typename EdgeProfile::Graph_vertex Graph_vertex;
-
-template< typename EdgeProfile> class Middle_placement : public Placement_policy<EdgeProfile>{
+ typedef typename Placement_policy<EdgeProfile>::Placement_type Placement_type;
-public:
- typedef typename EdgeProfile::Point Point;
- typedef typename EdgeProfile::Edge_handle Edge_handle;
- typedef typename EdgeProfile::Graph_vertex Graph_vertex;
-
- typedef typename Placement_policy<EdgeProfile>::Placement_type Placement_type;
-
- Placement_type operator()(const EdgeProfile& profile) const override{
- //todo compute the middle
- return Placement_type(profile.p0());
- }
+ Placement_type operator()(const EdgeProfile& profile) const override {
+ // todo compute the middle
+ return Placement_type(profile.p0());
+ }
};
+
} // namespace contraction
-} // namespace GUDHI
-#endif /* GUDHI_MIDDLE_PLACEMENT_H_ */
+} // namespace Gudhi
+
+#endif // CONTRACTION_POLICIES_MIDDLE_PLACEMENT_H_
diff --git a/src/Contraction/include/gudhi/Contraction/policies/Placement_policy.h b/src/Contraction/include/gudhi/Contraction/policies/Placement_policy.h
index 3a804cf0..34ffa49f 100644
--- a/src/Contraction/include/gudhi/Contraction/policies/Placement_policy.h
+++ b/src/Contraction/include/gudhi/Contraction/policies/Placement_policy.h
@@ -1,49 +1,51 @@
- /* This file is part of the Gudhi Library. The Gudhi library
- * (Geometric Understanding in Higher Dimensions) is a generic C++
- * library for computational topology.
- *
- * Author(s): 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 GUDHI_PLACEMENT_POLICY_H_
-#define GUDHI_PLACEMENT_POLICY_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.
+ *
+ * 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 CONTRACTION_POLICIES_PLACEMENT_POLICY_H_
+#define CONTRACTION_POLICIES_PLACEMENT_POLICY_H_
#include <boost/optional.hpp>
namespace Gudhi {
+
namespace contraction {
+/**
+ *@brief Policy to specify where the merged point had to be placed after an edge contraction.
+ *@ingroup contr
+ */
+template< typename EdgeProfile>
+class Placement_policy {
+ public:
+ typedef typename EdgeProfile::Point Point;
+ typedef boost::optional<Point> Placement_type;
- /**
- *@brief Policy to specify where the merged point had to be placed after an edge contraction.
- *@ingroup contr
- */
-template< typename EdgeProfile> class Placement_policy{
-public:
- typedef typename EdgeProfile::Point Point;
- typedef boost::optional<Point> Placement_type;
+ virtual Placement_type operator()(const EdgeProfile& profile) const = 0;
- virtual Placement_type operator()(const EdgeProfile& profile) const=0;
- virtual ~Placement_policy(){};
+ virtual ~Placement_policy() { }
};
-
} // namespace contraction
-} // namespace GUDHI
-#endif /* GUDHI_PLACEMENT_POLICY_H_ */
+} // namespace Gudhi
+
+#endif // CONTRACTION_POLICIES_PLACEMENT_POLICY_H_
diff --git a/src/Contraction/include/gudhi/Contraction/policies/Valid_contraction_policy.h b/src/Contraction/include/gudhi/Contraction/policies/Valid_contraction_policy.h
index bee2ecd7..78d61173 100644
--- a/src/Contraction/include/gudhi/Contraction/policies/Valid_contraction_policy.h
+++ b/src/Contraction/include/gudhi/Contraction/policies/Valid_contraction_policy.h
@@ -1,47 +1,51 @@
- /* This file is part of the Gudhi Library. The Gudhi library
- * (Geometric Understanding in Higher Dimensions) is a generic C++
- * library for computational topology.
- *
- * Author(s): 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 GUDHI_VALID_CONTRACTION_POLICY_H_
-#define GUDHI_VALID_CONTRACTION_POLICY_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.
+ *
+ * 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 CONTRACTION_POLICIES_VALID_CONTRACTION_POLICY_H_
+#define CONTRACTION_POLICIES_VALID_CONTRACTION_POLICY_H_
namespace Gudhi {
+
namespace contraction {
- /**
- *@brief Policy to specify if an edge contraction is valid or not.
- *@ingroup contr
- */
-template< typename EdgeProfile> class Valid_contraction_policy{
-public:
- typedef typename EdgeProfile::Point Point;
- typedef typename EdgeProfile::Edge_handle Edge_handle;
- typedef typename EdgeProfile::Graph_vertex Graph_vertex;
-
- virtual bool operator()(const EdgeProfile& profile,const boost::optional<Point>& placement) const =0;
- virtual ~Valid_contraction_policy(){};
+/**
+ *@brief Policy to specify if an edge contraction is valid or not.
+ *@ingroup contr
+ */
+template< typename EdgeProfile>
+class Valid_contraction_policy {
+ public:
+ typedef typename EdgeProfile::Point Point;
+ typedef typename EdgeProfile::Edge_handle Edge_handle;
+ typedef typename EdgeProfile::Graph_vertex Graph_vertex;
+
+ virtual bool operator()(const EdgeProfile& profile, const boost::optional<Point>& placement) const = 0;
+
+ virtual ~Valid_contraction_policy() { }
};
} // namespace contraction
-} // namespace GUDHI
+
+} // namespace Gudhi
-#endif /* GUDHI_VALID_CONTRACTION_POLICY_H_ */
+#endif // CONTRACTION_POLICIES_VALID_CONTRACTION_POLICY_H_
diff --git a/src/Contraction/include/gudhi/Edge_contraction.h b/src/Contraction/include/gudhi/Edge_contraction.h
index 2c254710..5af13c3e 100644
--- a/src/Contraction/include/gudhi/Edge_contraction.h
+++ b/src/Contraction/include/gudhi/Edge_contraction.h
@@ -20,24 +20,24 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef GUDHI_EDGE_CONTRACTION_H_
-#define GUDHI_EDGE_CONTRACTION_H_
+#ifndef EDGE_CONTRACTION_H_
+#define EDGE_CONTRACTION_H_
-#include "gudhi/Skeleton_blocker_contractor.h"
-#include "gudhi/Contraction/policies/Edge_length_cost.h"
-#include "gudhi/Contraction/policies/First_vertex_placement.h"
-#include "gudhi/Contraction/policies/Valid_contraction_policy.h"
-#include "gudhi/Contraction/policies/Dummy_valid_contraction.h"
-#include "gudhi/Contraction/policies/Link_condition_valid_contraction.h"
-#include "gudhi/Utils.h"
+#include <gudhi/Skeleton_blocker_contractor.h>
+#include <gudhi/Contraction/policies/Edge_length_cost.h>
+#include <gudhi/Contraction/policies/First_vertex_placement.h>
+#include <gudhi/Contraction/policies/Valid_contraction_policy.h>
+#include <gudhi/Contraction/policies/Dummy_valid_contraction.h>
+#include <gudhi/Contraction/policies/Link_condition_valid_contraction.h>
+#include <gudhi/Debug_utils.h>
+namespace Gudhi {
-namespace Gudhi{
-namespace contraction{
+namespace contraction {
-/** \defgroup contr Contraction
+/** \defgroup contr Edge contraction
\author David Salinas
@@ -46,7 +46,7 @@ namespace contraction{
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 uch lower than the total number of simplices.
+size of this data-structure is even much lower than the total number of simplices.
The edge contraction operation consists in identifying two vertices of a simplicial complex.
A lot of algorithms have been developed in computer graphics that allows to reduce efficiently the size of 2-dimensional simplicial complexes
@@ -120,14 +120,14 @@ while ensuring its homotopy type is preserved during the contraction (edge are c
\code{.cpp}
#include <boost/timer/timer.hpp>
#include <iostream>
-#include "gudhi/Edge_contraction.h"
-#include "gudhi/Skeleton_blocker.h"
-#include "gudhi/Off_reader.h"
+#include <gudhi/Edge_contraction.h>
+#include <gudhi/Skeleton_blocker.h>
+#include <gudhi/Off_reader.h>
using namespace std;
using namespace Gudhi;
-using namespace skbl;
+using namespace skeleton_blocker;
using namespace contraction;
struct Geometry_trait{
@@ -158,7 +158,7 @@ void build_rips(ComplexType& complex, double offset){
for (auto p = vertices.begin(); p != vertices.end(); ++p)
for (auto q = p; ++q != vertices.end(); )
if (eucl_distance(complex.point(*p), complex.point(*q)) < 2 * offset)
- complex.add_edge(*p,*q);
+ complex.add_edge_without_blockers(*p,*q);
}
int main (int argc, char *argv[])
@@ -194,7 +194,7 @@ int main (int argc, char *argv[])
contractor.contract_edges();
std::cout << "Counting final number of simplices \n";
- unsigned num_simplices = std::distance(complex.simplex_range().begin(),complex.simplex_range().end());
+ unsigned num_simplices = std::distance(complex.star_simplex_range().begin(),complex.star_simplex_range().end());
std::cout << "Final complex has "<<
complex.num_vertices()<<" vertices, "<<
@@ -226,11 +226,10 @@ Time to simplify and enumerate simplices:
\copyright GNU General Public License v3.
-\verbatim Contact: David Salinas, david.salinas@inria.fr \endverbatim
*/
-/** @} */ // end defgroup
+/** @} */ // end defgroup
+} // namespace contraction
-}
-}
+} // namespace Gudhi
-#endif /* GUDHI_EDGE_CONTRACTION_H_ */
+#endif // EDGE_CONTRACTION_H_
diff --git a/src/Contraction/include/gudhi/Skeleton_blocker_contractor.h b/src/Contraction/include/gudhi/Skeleton_blocker_contractor.h
index dcc05c22..df884c93 100644
--- a/src/Contraction/include/gudhi/Skeleton_blocker_contractor.h
+++ b/src/Contraction/include/gudhi/Skeleton_blocker_contractor.h
@@ -20,80 +20,69 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef GUDHI_SKELETON_BLOCKER_CONTRACTOR_H_
-#define GUDHI_SKELETON_BLOCKER_CONTRACTOR_H_
-
-#include <memory>
-#include <cassert>
+#ifndef SKELETON_BLOCKER_CONTRACTOR_H_
+#define SKELETON_BLOCKER_CONTRACTOR_H_
// todo remove the queue to be independent from cgald
-#include "gudhi/Contraction/CGAL_queue/Modifiable_priority_queue.h"
-
-
-#include <list>
-#include <boost/scoped_array.hpp>
-#include <boost/scoped_ptr.hpp>
-
+#include <gudhi/Contraction/CGAL_queue/Modifiable_priority_queue.h>
-#include "gudhi/Contraction/Edge_profile.h"
-#include "gudhi/Contraction/policies/Cost_policy.h"
-#include "gudhi/Contraction/policies/Edge_length_cost.h"
-#include "gudhi/Contraction/policies/Placement_policy.h"
-#include "gudhi/Contraction/policies/First_vertex_placement.h"
+#include <gudhi/Contraction/Edge_profile.h>
+#include <gudhi/Contraction/policies/Cost_policy.h>
+#include <gudhi/Contraction/policies/Edge_length_cost.h>
+#include <gudhi/Contraction/policies/Placement_policy.h>
+#include <gudhi/Contraction/policies/First_vertex_placement.h>
+#include <gudhi/Contraction/policies/Valid_contraction_policy.h>
+#include <gudhi/Contraction/policies/Dummy_valid_contraction.h> // xxx remove
+#include <gudhi/Contraction/policies/Link_condition_valid_contraction.h> // xxx remove
+#include <gudhi/Contraction/policies/Contraction_visitor.h>
-#include "gudhi/Contraction/policies/Valid_contraction_policy.h"
-#include "gudhi/Contraction/policies/Dummy_valid_contraction.h" //xxx remove
-#include "gudhi/Contraction/policies/Link_condition_valid_contraction.h" //xxx remove
+#include <gudhi/Skeleton_blocker/Skeleton_blocker_complex_visitor.h>
+#include <gudhi/Debug_utils.h>
-#include "gudhi/Contraction/policies/Contraction_visitor.h"
-#include "gudhi/Skeleton_blocker/Skeleton_blocker_complex_visitor.h"
+#include <boost/scoped_array.hpp>
+#include <boost/scoped_ptr.hpp>
-#include "gudhi/Utils.h"
+#include <memory>
+#include <cassert>
+#include <list>
+#include <utility> // for pair
+#include <vector>
-namespace Gudhi{
+namespace Gudhi {
namespace contraction {
-
-
-
template <class Profile>
-Placement_policy<Profile>* make_first_vertex_placement(){
- return new First_vertex_placement<Profile>();
+Placement_policy<Profile>* make_first_vertex_placement() {
+ return new First_vertex_placement<Profile>();
}
template <class Profile>
-Valid_contraction_policy<Profile>* make_link_valid_contraction(){
- return new Link_condition_valid_contraction<Profile>();
+Valid_contraction_policy<Profile>* make_link_valid_contraction() {
+ return new Link_condition_valid_contraction<Profile>();
}
-
/**
-*@brief Visitor to remove popable blockers after an edge contraction.
-*/
+ *@brief Visitor to remove popable blockers after an edge contraction.
+ */
template <class Profile>
-class Contraction_visitor_remove_popable : public Contraction_visitor<Profile>{
-public:
- typedef typename Profile::Point Point;
- typedef typename Profile::Complex Complex;
- typedef typename Complex::Vertex_handle Vertex_handle;
-
- void on_contracted(const Profile &profile, boost::optional< Point > placement) override{
- profile.complex().remove_all_popable_blockers(profile.v0_handle());
- }
+class Contraction_visitor_remove_popable : public Contraction_visitor<Profile> {
+ public:
+ typedef typename Profile::Point Point;
+ typedef typename Profile::Complex Complex;
+ typedef typename Complex::Vertex_handle Vertex_handle;
+
+ void on_contracted(const Profile &profile, boost::optional< Point > placement) override {
+ profile.complex().remove_all_popable_blockers(profile.v0_handle());
+ }
};
template <class Profile>
-Contraction_visitor<Profile>* make_remove_popable_blockers_visitor(){
- return new Contraction_visitor_remove_popable<Profile>();
+Contraction_visitor<Profile>* make_remove_popable_blockers_visitor() {
+ return new Contraction_visitor_remove_popable<Profile>();
}
-
-
-
-
-
/**
*@class Skeleton_blocker_contractor
*@brief Class that allows to contract iteratively edges of a simplicial complex.
@@ -110,519 +99,484 @@ Contraction_visitor<Profile>* make_remove_popable_blockers_visitor(){
* a topological condition (link condition) or a geometrical condition (normals messed up).
*
*/
-template<
-class GeometricSimplifiableComplex,
-class EdgeProfile = Edge_profile<GeometricSimplifiableComplex>
->
-class Skeleton_blocker_contractor : private skbl::Dummy_complex_visitor<typename GeometricSimplifiableComplex::Vertex_handle>{
-
- GeometricSimplifiableComplex& complex_;
-
-public:
- typedef typename GeometricSimplifiableComplex::Graph_vertex Graph_vertex;
- typedef typename GeometricSimplifiableComplex::Vertex_handle Vertex_handle;
- typedef typename GeometricSimplifiableComplex::Simplex_handle Simplex_handle;
- typedef typename GeometricSimplifiableComplex::Simplex_handle_iterator Simplex_handle_iterator;
-
-
+template<class GeometricSimplifiableComplex, class EdgeProfile = Edge_profile<GeometricSimplifiableComplex>>
+class Skeleton_blocker_contractor : private skeleton_blocker::Dummy_complex_visitor<
+typename GeometricSimplifiableComplex::Vertex_handle> {
+ GeometricSimplifiableComplex& complex_;
- typedef typename GeometricSimplifiableComplex::Root_vertex_handle Root_vertex_handle;
+ public:
+ typedef typename GeometricSimplifiableComplex::Graph_vertex Graph_vertex;
+ typedef typename GeometricSimplifiableComplex::Vertex_handle Vertex_handle;
+ typedef typename GeometricSimplifiableComplex::Simplex Simplex;
+ typedef typename GeometricSimplifiableComplex::Root_vertex_handle Root_vertex_handle;
+ typedef typename GeometricSimplifiableComplex::Graph_edge Graph_edge;
+ typedef typename GeometricSimplifiableComplex::Edge_handle Edge_handle;
+ typedef typename GeometricSimplifiableComplex::Point Point;
- typedef typename GeometricSimplifiableComplex::Graph_edge Graph_edge;
- typedef typename GeometricSimplifiableComplex::Edge_handle Edge_handle;
- typedef typename GeometricSimplifiableComplex::Point Point;
+ typedef EdgeProfile Profile;
- typedef EdgeProfile Profile;
+ typedef Cost_policy<Profile> Cost_policy_;
+ typedef Placement_policy<Profile> Placement_policy_;
+ typedef Valid_contraction_policy<Profile> Valid_contraction_policy_;
+ typedef Contraction_visitor<EdgeProfile> Contraction_visitor_;
+ typedef Edge_profile_factory<EdgeProfile> Edge_profile_factory_;
- typedef Cost_policy<Profile> Cost_policy_;
- typedef Placement_policy<Profile> Placement_policy_;
- typedef Valid_contraction_policy<Profile> Valid_contraction_policy_;
- typedef Contraction_visitor<EdgeProfile> Contraction_visitor_;
- typedef Edge_profile_factory<EdgeProfile> Edge_profile_factory_;
+ typedef boost::optional<double> Cost_type;
+ typedef boost::optional<Point> Placement_type;
- typedef boost::optional<double> Cost_type;
- typedef boost::optional<Point> Placement_type ;
+ typedef size_t size_type;
- typedef size_t size_type;
+ typedef Skeleton_blocker_contractor Self;
- typedef Skeleton_blocker_contractor Self ;
+ private:
+ struct Compare_id {
+ Compare_id() : algorithm_(0) { }
+ Compare_id(Self const* aAlgorithm) : algorithm_(aAlgorithm) { }
+ bool operator()(Edge_handle a, Edge_handle b) const {
+ return algorithm_->get_undirected_edge_id(a) < algorithm_->get_undirected_edge_id(b);
+ }
-private:
+ Self const* algorithm_;
+ };
- struct Compare_id
- {
- Compare_id() : algorithm_(0) {}
+ struct Compare_cost {
+ Compare_cost() : algorithm_(0) { }
- Compare_id( Self const* aAlgorithm ) : algorithm_(aAlgorithm) {}
+ Compare_cost(Self const* aAlgorithm) : algorithm_(aAlgorithm) { }
- bool operator() ( Edge_handle a, Edge_handle b ) const
- {
- return algorithm_->get_undirected_edge_id(a) < algorithm_->get_undirected_edge_id(b);
- }
+ bool operator()(Edge_handle a, Edge_handle b) const {
+ // NOTE: A cost is an optional<> value.
+ // Absent optionals are ordered first; that is, "none < T" and "T > none" for any defined T != none.
+ // In consequence, edges with undefined costs will be promoted to the top of the priority queue and popped out
+ // first.
+ return algorithm_->get_data(a).cost() < algorithm_->get_data(b).cost();
+ }
- Self const* algorithm_ ;
- } ;
+ Self const* algorithm_;
+ };
- struct Compare_cost
- {
- Compare_cost() : algorithm_(0) {
- }
+ struct Undirected_edge_id : boost::put_get_helper<size_type, Undirected_edge_id> {
+ typedef boost::readable_property_map_tag category;
+ typedef size_type value_type;
+ typedef size_type reference;
+ typedef Edge_handle key_type;
- Compare_cost( Self const* aAlgorithm ) : algorithm_(aAlgorithm) {
- }
+ Undirected_edge_id() : algorithm_(0) { }
- bool operator() ( Edge_handle a, Edge_handle b ) const
- {
- // NOTE: A cost is an optional<> value.
- // Absent optionals are ordered first; that is, "none < T" and "T > none" for any defined T != none.
- // In consequence, edges with undefined costs will be promoted to the top of the priority queue and poped out first.
- return algorithm_->get_data(a).cost() < algorithm_->get_data(b).cost();
- }
+ Undirected_edge_id(Self const* aAlgorithm) : algorithm_(aAlgorithm) { }
- Self const* algorithm_ ;
+ size_type operator[](Edge_handle e) const {
+ return algorithm_->get_undirected_edge_id(e);
+ }
- } ;
+ Self const* algorithm_;
+ };
+
+ typedef CGAL::Modifiable_priority_queue<Edge_handle, Compare_cost, Undirected_edge_id> PQ;
+ typedef typename PQ::handle pq_handle;
+
+
+ // An Edge_data is associated with EVERY edge in the complex (collapsible or not).
+ // It relates the edge with the PQ-handle needed to update the priority queue
+ // It also relates the edge with a policy-based cache
- struct Undirected_edge_id : boost::put_get_helper<size_type, Undirected_edge_id>
- {
- typedef boost::readable_property_map_tag category;
- typedef size_type value_type;
- typedef size_type reference;
- typedef Edge_handle key_type;
+ class Edge_data {
+ public:
+ Edge_data() : PQHandle_(), cost_() { }
- Undirected_edge_id() : algorithm_(0) {}
+ Cost_type const& cost() const {
+ return cost_;
+ }
+
+ Cost_type & cost() {
+ return cost_;
+ }
+
+ pq_handle PQ_handle() const {
+ return PQHandle_;
+ }
+
+ bool is_in_PQ() const {
+ return PQHandle_ != PQ::null_handle();
+ }
+
+ void set_PQ_handle(pq_handle h) {
+ PQHandle_ = h;
+ }
- Undirected_edge_id( Self const* aAlgorithm ) : algorithm_(aAlgorithm) {}
-
- size_type operator[] ( Edge_handle e ) const { return algorithm_->get_undirected_edge_id(e); }
-
- Self const* algorithm_ ;
- } ;
-
- typedef CGAL::Modifiable_priority_queue<Edge_handle,Compare_cost,Undirected_edge_id> PQ ;
- typedef typename PQ::handle pq_handle ;
-
-
- // An Edge_data is associated with EVERY edge in the complex (collapsible or not).
- // It relates the edge with the PQ-handle needed to update the priority queue
- // It also relates the edge with a policy-based cache
- class Edge_data
- {
- public :
-
- Edge_data() : PQHandle_(),cost_() {}
-
- Cost_type const& cost() const { return cost_ ; }
- Cost_type & cost() { return cost_ ; }
-
- pq_handle PQ_handle() const { return PQHandle_ ;}
-
- bool is_in_PQ() const { return PQHandle_ != PQ::null_handle() ; }
-
- void set_PQ_handle( pq_handle h ) { PQHandle_ = h ; }
-
- void reset_PQ_handle() { PQHandle_ = PQ::null_handle() ; }
-
- private:
- pq_handle PQHandle_ ;
- Cost_type cost_ ;
-
- } ;
- typedef Edge_data* Edge_data_ptr ;
- typedef boost::scoped_array<Edge_data> Edge_data_array ;
-
-
- int get_undirected_edge_id ( Edge_handle edge ) const {
- return complex_[edge].index() ;
- }
-
-
- const Edge_data& get_data ( Edge_handle edge ) const
- {
- return edge_data_array_[get_undirected_edge_id(edge)];
- }
-
-
- Edge_data& get_data ( Edge_handle edge )
- {
- return edge_data_array_[get_undirected_edge_id(edge)];
- }
-
- Cost_type get_cost(const Profile & profile) const{
- return (*cost_policy_)(profile,get_placement(profile));
- }
-
- Profile create_profile(Edge_handle edge) const{
- if(edge_profile_factory_)
- return edge_profile_factory_->make_profile(complex_,edge);
- else
- return Profile(complex_,edge);
- }
-
-
- void insert_in_PQ( Edge_handle edge, Edge_data& data )
- {
- data.set_PQ_handle(heap_PQ_->push(edge));
- ++current_num_edges_heap_;
- }
-
- void update_in_PQ( Edge_handle edge, Edge_data& data )
- {
- data.set_PQ_handle(heap_PQ_->update(edge,data.PQ_handle())) ;
- }
-
- void remove_from_PQ( Edge_handle edge, Edge_data& data )
- {
- data.set_PQ_handle(heap_PQ_->erase(edge,data.PQ_handle()));
- --current_num_edges_heap_;
- }
-
- boost::optional<Edge_handle> pop_from_PQ() {
- boost::optional<Edge_handle> edge = heap_PQ_->extract_top();
- if ( edge )
- get_data(*edge).reset_PQ_handle();
- return edge ;
- }
-
-
-
-private:
-
- /**
- * @brief Collect edges.
- *
- * Iterates over all edges of the simplicial complex and
- * 1) inserts them in the priority queue sorted according to the Cost policy.
- * 2) set the id() field of each edge
- */
- void collect_edges(){
- //
- // Loop over all the edges in the complex in the heap
- //
- size_type size = complex_.num_edges();
- DBG("Collecting edges ...");
- DBGMSG("num edges :",size);
-
- edge_data_array_.reset( new Edge_data[size] ) ;
-
- heap_PQ_.reset( new PQ (size, Compare_cost(this), Undirected_edge_id(this) ) ) ;
-
- std::size_t id = 0 ;
-
- //xxx do a parralel for
- for(auto edge : complex_.edge_range()){
- complex_[edge].index() = id++;
- Profile const& profile = create_profile(edge);
- Edge_data& data = get_data(edge);
- data.cost() = get_cost(profile) ;
- ++initial_num_edges_heap_;
- insert_in_PQ(edge,data);
- if(contraction_visitor_) contraction_visitor_->on_collected(profile,data.cost());
- }
-
- DBG("Edges collected.");
-
- }
-
- bool should_stop(double lCost,const Profile &profile) const{
- return false;
- }
-
- boost::optional<Point> get_placement(const Profile& profile) const{
- return (*placement_policy_)(profile);
- }
-
- bool is_contraction_valid( Profile const& profile, Placement_type placement ) const{
- if(!valid_contraction_policy_) return true;
- return (*valid_contraction_policy_)(profile,placement);
- }
-
-
-public:
- /**
- * \brief Contract edges.
- *
- * While the heap is not empty, it extracts the edge with the minimum
- * cost in the heap then try to contract it.
- * It stops when the Stop policy says so or when the number of contractions
- * given by 'num_max_contractions' is reached (if this number is positive).
- */
- void contract_edges(int num_max_contractions=-1){
-
- DBG("\n\nContract edges");
- int num_contraction = 0 ;
-
- bool unspecified_num_contractions = (num_max_contractions == -1);
- //
- // Pops and processes each edge from the PQ
- //
- boost::optional<Edge_handle> edge ;
- while ( (edge = pop_from_PQ())&& ((num_contraction<num_max_contractions)||(unspecified_num_contractions)))
- {
- Profile const& profile = create_profile(*edge);
- Cost_type cost(get_data(*edge).cost());
- if(contraction_visitor_) contraction_visitor_->on_selected(profile,cost,0,0);
-
- DBGMSG("\n\n---- Pop edge - num vertices :",complex_.num_vertices());
-
- if (cost){
- DBGMSG("sqrt(cost):",std::sqrt(*cost));
- if (should_stop(*cost,profile) )
- {
- if(contraction_visitor_) contraction_visitor_->on_stop_condition_reached();
- DBG("should_stop");
- break ;
- }
- Placement_type placement = get_placement(profile);
- if ( is_contraction_valid(profile,placement) && placement )
- {
- DBG("contraction_valid");
- contract_edge(profile,placement);
- ++ num_contraction;
- }
- else
- {
- DBG("contraction not valid");
- if(contraction_visitor_) contraction_visitor_->on_non_valid(profile);
- }
- }
- else
- DBG("uncomputable cost");
- }
- if(contraction_visitor_) contraction_visitor_->on_stop_condition_reached();
- }
-
-
- bool is_in_heap(Edge_handle edge) const{
- if(heap_PQ_->empty()) return false;
- else{
- return edge_data_array_[get_undirected_edge_id(edge)].is_in_PQ();
- }
- }
-
- bool is_heap_empty() const{
- return heap_PQ_->empty();
- }
-
-
- /**
- * @brief Returns an Edge_handle and a Placement_type. This pair consists in
- * the edge with the lowest cost in the heap together with its placement.
- * The returned value is initialized iff the heap is non-empty.
- */
- boost::optional<std::pair<Edge_handle,Placement_type > > top_edge(){
- boost::optional<std::pair<Edge_handle,Placement_type > > res;
-
- if(!heap_PQ_->empty()) {
- auto edge = heap_PQ_->top();
- Profile const& profile = create_profile(edge);
- Placement_type placement = get_placement(profile);
- res = make_pair(edge,placement);
- DBGMSG("top edge:",complex_[edge]);
-
- }
- return res;
- }
-
-
- /**
- * @brief Constructor with default policies.
- *
- * @details The default cost, placement, valid and visitor policies
- * are respectively : the edge length, the first point, the link condition
- */
- Skeleton_blocker_contractor(GeometricSimplifiableComplex& complex)
- :complex_(complex),
- cost_policy_(new Edge_length_cost<Profile>),
- placement_policy_(new First_vertex_placement<Profile>),
- valid_contraction_policy_(new Link_condition_valid_contraction<Profile>),
- contraction_visitor_(new Contraction_visitor_()),
- edge_profile_factory_(0),
- initial_num_edges_heap_(0),
- current_num_edges_heap_(0)
- {
- complex_.set_visitor(this);
- if(contraction_visitor_) contraction_visitor_->on_started(complex);
- collect_edges();
- }
-
- /**
- * @brief Constructor with customed policies.
- * @remark Policies destruction is handle by the class with smart pointers.
- */
- Skeleton_blocker_contractor(GeometricSimplifiableComplex& complex,
- Cost_policy_ *cost_policy,
- Placement_policy_ * placement_policy = new First_vertex_placement<Profile>,
- Valid_contraction_policy_ * valid_contraction_policy = new Link_condition_valid_contraction<Profile>,
- Contraction_visitor_* contraction_visitor = new Contraction_visitor_(),
- Edge_profile_factory_* edge_profile_factory = NULL
- ):
- complex_(complex),
- cost_policy_(cost_policy),
- placement_policy_(placement_policy),
- valid_contraction_policy_(valid_contraction_policy),
- contraction_visitor_(contraction_visitor),
- edge_profile_factory_(edge_profile_factory),
- initial_num_edges_heap_(0),
- current_num_edges_heap_(0)
- {
- complex_.set_visitor(this);
- if(contraction_visitor) contraction_visitor->on_started(complex);
- collect_edges();
- }
-
-
- ~Skeleton_blocker_contractor(){
- complex_.set_visitor(0);
- }
-
-private:
-
-
- void contract_edge(const Profile& profile, Placement_type placement ) {
- if(contraction_visitor_) contraction_visitor_->on_contracting(profile,placement);
-
- assert(complex_.contains_vertex(profile.v0_handle()));
- assert(complex_.contains_vertex(profile.v1_handle()));
- assert(placement);
-
- profile.complex().point(profile.v0_handle()) = *placement;
-
- // remark : this is not necessary since v1 will be deactivated
- // profile.complex().point(profile.v1_handle()) = *placement;
-
- complex_.contract_edge(profile.v0_handle(),profile.v1_handle());
-
- assert(complex_.contains_vertex(profile.v0_handle()));
- assert(!complex_.contains_vertex(profile.v1_handle()));
-
- update_changed_edges();
-
- // the visitor could do something as complex_.remove_popable_blockers();
- if(contraction_visitor_) contraction_visitor_->on_contracted(profile,placement);
- }
-
-private:
-
- // every time the visitor's method on_changed_edge is called, it adds an
- // edge to changed_edges_
- std::vector< Edge_handle > changed_edges_;
-
- /**
- * @brief we update the cost and the position in the heap of an edge that has
- * been changed
- */
- inline void on_changed_edge(Vertex_handle a,Vertex_handle b) override{
- boost::optional<Edge_handle> ab(complex_[std::make_pair(a,b)]);
- assert(ab);
- changed_edges_.push_back(*ab);
- }
-
- void update_changed_edges(){
- //xxx do a parralel for
-
- DBG("update edges");
-
- // sequential loop
- for(auto ab : changed_edges_){
- //1-get the Edge_handle corresponding to ab
- //2-change the data in mEdgeArray[ab.id()]
- //3-update the heap
- Edge_data& data = get_data(ab);
- Profile const& profile = create_profile(ab);
- data.cost() = get_cost(profile) ;
- if ( data.is_in_PQ()){
- update_in_PQ(ab,data);
- }
- else{
- insert_in_PQ(ab,data);
- }
- }
- changed_edges_.clear();
- }
-
-
-private:
- void on_remove_edge(Vertex_handle a,Vertex_handle b) override{
-
- boost::optional<Edge_handle> ab((complex_[std::make_pair(a,b)]));
- assert(ab);
- Edge_data& lData = get_data(*ab) ;
- if ( lData.is_in_PQ() )
- {
- remove_from_PQ(*ab,lData) ;
- }
- }
-private:
- /**
- * @brief Called when the edge 'ax' has been added while the edge 'bx'
- * is still there but will be removed on next instruction.
- * We assign the index of 'bx' to the edge index of 'ax'
- */
- void on_swaped_edge(Vertex_handle a,Vertex_handle b,Vertex_handle x) override{
- boost::optional<Edge_handle> ax(complex_[std::make_pair(a,x)]);
- boost::optional<Edge_handle> bx(complex_[std::make_pair(b,x)]);
- assert(ax&& bx);
- complex_[*ax].index() =complex_[*bx].index();
- }
-private:
- /**
- * @brief Called when a blocker is removed.
- * All the edges that passes through the blocker may be edge-contractible
- * again and are thus reinserted in the heap.
- */
- void on_delete_blocker(const Simplex_handle * blocker) override{
- // we go for all pairs xy that belongs to the blocker
- // note that such pairs xy are necessarily edges of the complex
- // by definition of a blocker
-
- // todo uniqument utile pour la link condition
- // laisser à l'utilisateur? booleen update_heap_on_removed_blocker?
- Simplex_handle blocker_copy(*blocker);
- for (auto x = blocker_copy.begin(); x!= blocker_copy.end(); ++x){
- for(auto y=x ; ++y != blocker_copy.end(); ){
- auto edge_descr(complex_[std::make_pair(*x,*y)]);
- assert(edge_descr);
- Edge_data& data = get_data(*edge_descr);
- Profile const& profile = create_profile(*edge_descr);
- data.cost() = get_cost(profile) ;
-
- // If the edge is already in the heap
- // its priority has not changed.
- // If the edge is not present, we reinsert it
- // remark : we could also reinsert the edge
- // only if it is valid
- if ( !data.is_in_PQ() ){
- insert_in_PQ(*edge_descr,data);
- }
- }
- }
- }
-
-
-private:
- std::shared_ptr<Cost_policy_> cost_policy_;
- std::shared_ptr<Placement_policy_> placement_policy_;
- std::shared_ptr<Valid_contraction_policy_> valid_contraction_policy_;
- std::shared_ptr<Contraction_visitor_> contraction_visitor_;
-
- //in case the user wants to do something special when the edge profile
- //are created (for instance add some info)
- std::shared_ptr<Edge_profile_factory_> edge_profile_factory_;
- Edge_data_array edge_data_array_ ;
-
- boost::scoped_ptr<PQ> heap_PQ_ ;
- int initial_num_edges_heap_;
- int current_num_edges_heap_;
+ void reset_PQ_handle() {
+ PQHandle_ = PQ::null_handle();
+ }
+ private:
+ pq_handle PQHandle_;
+ Cost_type cost_;
+ };
+ typedef Edge_data* Edge_data_ptr;
+ typedef boost::scoped_array<Edge_data> Edge_data_array;
+
+ int get_undirected_edge_id(Edge_handle edge) const {
+ return complex_[edge].index();
+ }
+
+ const Edge_data& get_data(Edge_handle edge) const {
+ return edge_data_array_[get_undirected_edge_id(edge)];
+ }
+
+ Edge_data& get_data(Edge_handle edge) {
+ return edge_data_array_[get_undirected_edge_id(edge)];
+ }
+
+ Cost_type get_cost(const Profile & profile) const {
+ return (*cost_policy_)(profile, get_placement(profile));
+ }
+
+ Profile create_profile(Edge_handle edge) const {
+ if (edge_profile_factory_)
+ return edge_profile_factory_->make_profile(complex_, edge);
+ else
+ return Profile(complex_, edge);
+ }
+
+ void insert_in_PQ(Edge_handle edge, Edge_data& data) {
+ data.set_PQ_handle(heap_PQ_->push(edge));
+ ++current_num_edges_heap_;
+ }
+
+ void update_in_PQ(Edge_handle edge, Edge_data& data) {
+ data.set_PQ_handle(heap_PQ_->update(edge, data.PQ_handle()));
+ }
+
+ void remove_from_PQ(Edge_handle edge, Edge_data& data) {
+ data.set_PQ_handle(heap_PQ_->erase(edge, data.PQ_handle()));
+ --current_num_edges_heap_;
+ }
+
+ boost::optional<Edge_handle> pop_from_PQ() {
+ boost::optional<Edge_handle> edge = heap_PQ_->extract_top();
+ if (edge)
+ get_data(*edge).reset_PQ_handle();
+ return edge;
+ }
+
+ private:
+ /**
+ * @brief Collect edges.
+ *
+ * Iterates over all edges of the simplicial complex and
+ * 1) inserts them in the priority queue sorted according to the Cost policy.
+ * 2) set the id() field of each edge
+ */
+ void collect_edges() {
+ //
+ // Loop over all the edges in the complex in the heap
+ //
+ size_type size = complex_.num_edges();
+ DBG("Collecting edges ...");
+ DBGMSG("num edges :", size);
+
+ edge_data_array_.reset(new Edge_data[size]);
+
+ heap_PQ_.reset(new PQ(size, Compare_cost(this), Undirected_edge_id(this)));
+
+ std::size_t id = 0;
+
+ // xxx do a parralel for
+ for (auto edge : complex_.edge_range()) {
+ complex_[edge].index() = id++;
+ Profile const& profile = create_profile(edge);
+ Edge_data& data = get_data(edge);
+ data.cost() = get_cost(profile);
+ ++initial_num_edges_heap_;
+ insert_in_PQ(edge, data);
+ if (contraction_visitor_) contraction_visitor_->on_collected(profile, data.cost());
+ }
+
+ DBG("Edges collected.");
+ }
+
+ bool should_stop(double lCost, const Profile &profile) const {
+ return false;
+ }
+
+ boost::optional<Point> get_placement(const Profile& profile) const {
+ return (*placement_policy_)(profile);
+ }
+
+ bool is_contraction_valid(Profile const& profile, Placement_type placement) const {
+ if (!valid_contraction_policy_) return true;
+ return (*valid_contraction_policy_)(profile, placement);
+ }
+
+
+ public:
+ /**
+ * \brief Contract edges.
+ *
+ * While the heap is not empty, it extracts the edge with the minimum
+ * cost in the heap then try to contract it.
+ * It stops when the Stop policy says so or when the number of contractions
+ * given by 'num_max_contractions' is reached (if this number is positive).
+ */
+ void contract_edges(int num_max_contractions = -1) {
+ DBG("\n\nContract edges");
+ int num_contraction = 0;
+
+ bool unspecified_num_contractions = (num_max_contractions == -1);
+ //
+ // Pops and processes each edge from the PQ
+ //
+ boost::optional<Edge_handle> edge;
+ while ((edge = pop_from_PQ()) && ((num_contraction < num_max_contractions) || (unspecified_num_contractions))) {
+ Profile const& profile = create_profile(*edge);
+ Cost_type cost(get_data(*edge).cost());
+ if (contraction_visitor_) contraction_visitor_->on_selected(profile, cost, 0, 0);
+
+ DBGMSG("\n\n---- Pop edge - num vertices :", complex_.num_vertices());
+
+ if (cost) {
+ DBGMSG("sqrt(cost):", std::sqrt(*cost));
+ if (should_stop(*cost, profile)) {
+ if (contraction_visitor_) contraction_visitor_->on_stop_condition_reached();
+ DBG("should_stop");
+ break;
+ }
+ Placement_type placement = get_placement(profile);
+ if (is_contraction_valid(profile, placement) && placement) {
+ DBG("contraction_valid");
+ contract_edge(profile, placement);
+ ++num_contraction;
+ } else {
+ DBG("contraction not valid");
+ if (contraction_visitor_) contraction_visitor_->on_non_valid(profile);
+ }
+ } else {
+ DBG("uncomputable cost");
+ }
+ }
+ if (contraction_visitor_) contraction_visitor_->on_stop_condition_reached();
+ }
+
+ bool is_in_heap(Edge_handle edge) const {
+ if (heap_PQ_->empty()) {
+ return false;
+ } else {
+ return edge_data_array_[get_undirected_edge_id(edge)].is_in_PQ();
+ }
+ }
+
+ bool is_heap_empty() const {
+ return heap_PQ_->empty();
+ }
+
+ /**
+ * @brief Returns an Edge_handle and a Placement_type. This pair consists in
+ * the edge with the lowest cost in the heap together with its placement.
+ * The returned value is initialized iff the heap is non-empty.
+ */
+ boost::optional<std::pair<Edge_handle, Placement_type > > top_edge() {
+ boost::optional<std::pair<Edge_handle, Placement_type > > res;
+
+ if (!heap_PQ_->empty()) {
+ auto edge = heap_PQ_->top();
+ Profile const& profile = create_profile(edge);
+ Placement_type placement = get_placement(profile);
+ res = std::make_pair(edge, placement);
+ DBGMSG("top edge:", complex_[edge]);
+ }
+ return res;
+ }
+
+ /**
+ * @brief Constructor with default policies.
+ *
+ * @details The default cost, placement, valid and visitor policies
+ * are respectively : the edge length, the first point, the link condition
+ */
+ Skeleton_blocker_contractor(GeometricSimplifiableComplex& complex)
+ : complex_(complex),
+ cost_policy_(new Edge_length_cost<Profile>),
+ placement_policy_(new First_vertex_placement<Profile>),
+ valid_contraction_policy_(new Link_condition_valid_contraction<Profile>),
+ contraction_visitor_(new Contraction_visitor_()),
+ edge_profile_factory_(0),
+ initial_num_edges_heap_(0),
+ current_num_edges_heap_(0) {
+ complex_.set_visitor(this);
+ if (contraction_visitor_) contraction_visitor_->on_started(complex);
+ collect_edges();
+ }
+
+ /**
+ * @brief Constructor with customed policies.
+ * @remark Policies destruction is handle by the class with smart pointers.
+ */
+ Skeleton_blocker_contractor(GeometricSimplifiableComplex& complex,
+ Cost_policy_ *cost_policy,
+ Placement_policy_ * placement_policy = new First_vertex_placement<Profile>,
+ Valid_contraction_policy_ * valid_contraction_policy =
+ new Link_condition_valid_contraction<Profile>,
+ Contraction_visitor_* contraction_visitor = new Contraction_visitor_(),
+ Edge_profile_factory_* edge_profile_factory = NULL) :
+ complex_(complex),
+ cost_policy_(cost_policy),
+ placement_policy_(placement_policy),
+ valid_contraction_policy_(valid_contraction_policy),
+ contraction_visitor_(contraction_visitor),
+ edge_profile_factory_(edge_profile_factory),
+ initial_num_edges_heap_(0),
+ current_num_edges_heap_(0) {
+ complex_.set_visitor(this);
+ if (contraction_visitor) contraction_visitor->on_started(complex);
+ collect_edges();
+ }
+
+ ~Skeleton_blocker_contractor() {
+ complex_.set_visitor(0);
+ }
+
+ private:
+ void contract_edge(const Profile& profile, Placement_type placement) {
+ if (contraction_visitor_) contraction_visitor_->on_contracting(profile, placement);
+
+ assert(complex_.contains_vertex(profile.v0_handle()));
+ assert(complex_.contains_vertex(profile.v1_handle()));
+ assert(placement);
+
+ profile.complex().point(profile.v0_handle()) = *placement;
+
+ // remark : this is not necessary since v1 will be deactivated
+ // profile.complex().point(profile.v1_handle()) = *placement;
+
+ complex_.contract_edge(profile.v0_handle(), profile.v1_handle());
+
+ assert(complex_.contains_vertex(profile.v0_handle()));
+ assert(!complex_.contains_vertex(profile.v1_handle()));
+
+ update_changed_edges();
+
+ // the visitor could do something as complex_.remove_popable_blockers();
+ if (contraction_visitor_) contraction_visitor_->on_contracted(profile, placement);
+ }
+
+ private:
+ // every time the visitor's method on_changed_edge is called, it adds an
+ // edge to changed_edges_
+ std::vector< Edge_handle > changed_edges_;
+
+ /**
+ * @brief we update the cost and the position in the heap of an edge that has
+ * been changed
+ */
+ inline void on_changed_edge(Vertex_handle a, Vertex_handle b) override {
+ boost::optional<Edge_handle> ab(complex_[std::make_pair(a, b)]);
+ assert(ab);
+ changed_edges_.push_back(*ab);
+ }
+
+ void update_changed_edges() {
+ // xxx do a parralel for
+ DBG("update edges");
+
+ // sequential loop
+ for (auto ab : changed_edges_) {
+ // 1-get the Edge_handle corresponding to ab
+ // 2-change the data in mEdgeArray[ab.id()]
+ // 3-update the heap
+ Edge_data& data = get_data(ab);
+ Profile const& profile = create_profile(ab);
+ data.cost() = get_cost(profile);
+ if (data.is_in_PQ()) {
+ update_in_PQ(ab, data);
+ } else {
+ insert_in_PQ(ab, data);
+ }
+ }
+ changed_edges_.clear();
+ }
+
+
+ private:
+ void on_remove_edge(Vertex_handle a, Vertex_handle b) override {
+ boost::optional<Edge_handle> ab((complex_[std::make_pair(a, b)]));
+ assert(ab);
+ Edge_data& lData = get_data(*ab);
+ if (lData.is_in_PQ()) {
+ remove_from_PQ(*ab, lData);
+ }
+ }
+
+ private:
+ /**
+ * @brief Called when the edge 'ax' has been added while the edge 'bx'
+ * is still there but will be removed on next instruction.
+ * We assign the index of 'bx' to the edge index of 'ax'
+ */
+ void on_swaped_edge(Vertex_handle a, Vertex_handle b, Vertex_handle x) override {
+ boost::optional<Edge_handle> ax(complex_[std::make_pair(a, x)]);
+ boost::optional<Edge_handle> bx(complex_[std::make_pair(b, x)]);
+ assert(ax && bx);
+ complex_[*ax].index() = complex_[*bx].index();
+ }
+
+ private:
+ /**
+ * @brief Called when a blocker is removed.
+ * All the edges that passes through the blocker may be edge-contractible
+ * again and are thus reinserted in the heap.
+ */
+ void on_delete_blocker(const Simplex * blocker) override {
+ // we go for all pairs xy that belongs to the blocker
+ // note that such pairs xy are necessarily edges of the complex
+ // by definition of a blocker
+
+ // todo uniqument utile pour la link condition
+ // laisser a l'utilisateur ? booleen update_heap_on_removed_blocker?
+ Simplex blocker_copy(*blocker);
+ for (auto x = blocker_copy.begin(); x != blocker_copy.end(); ++x) {
+ for (auto y = x; ++y != blocker_copy.end();) {
+ auto edge_descr(complex_[std::make_pair(*x, *y)]);
+ assert(edge_descr);
+ Edge_data& data = get_data(*edge_descr);
+ Profile const& profile = create_profile(*edge_descr);
+ data.cost() = get_cost(profile);
+
+ // If the edge is already in the heap
+ // its priority has not changed.
+ // If the edge is not present, we reinsert it
+ // remark : we could also reinsert the edge
+ // only if it is valid
+ if (!data.is_in_PQ()) {
+ insert_in_PQ(*edge_descr, data);
+ }
+ }
+ }
+ }
+
+
+ private:
+ std::shared_ptr<Cost_policy_> cost_policy_;
+ std::shared_ptr<Placement_policy_> placement_policy_;
+ std::shared_ptr<Valid_contraction_policy_> valid_contraction_policy_;
+ std::shared_ptr<Contraction_visitor_> contraction_visitor_;
+
+ // in case the user wants to do something special when the edge profile
+ // are created (for instance add some info)
+ std::shared_ptr<Edge_profile_factory_> edge_profile_factory_;
+ Edge_data_array edge_data_array_;
+
+ boost::scoped_ptr<PQ> heap_PQ_;
+ int initial_num_edges_heap_;
+ int current_num_edges_heap_;
};
} // namespace contraction
-} // namespace GUDHI
-#endif /* GUDHI_SKELETON_BLOCKER_CONTRACTOR_H_ */
+} // namespace Gudhi
+
+#endif // SKELETON_BLOCKER_CONTRACTOR_H_
diff --git a/src/Doxyfile b/src/Doxyfile
index 62412627..49e37c72 100644
--- a/src/Doxyfile
+++ b/src/Doxyfile
@@ -32,19 +32,19 @@ DOXYFILE_ENCODING = UTF-8
# title of most generated pages and in a few other places.
# The default value is: My Project.
-PROJECT_NAME = "Gudhi"
+PROJECT_NAME = "GUDHI"
# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = "1.1.0"
+PROJECT_NUMBER = "1.3.1"
# 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
# quick idea about the purpose of the project. Keep the description short.
-PROJECT_BRIEF =
+PROJECT_BRIEF = "C++ library for Topological Data Analysis (TDA) and Higher Dimensional Geometry Understanding."
# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
# the documentation. The maximum height of the logo should not exceed 55 pixels
@@ -153,7 +153,7 @@ STRIP_FROM_PATH =
# specify the list of include paths that are normally passed to the compiler
# using the -I flag.
-STRIP_FROM_INC_PATH =
+STRIP_FROM_INC_PATH = include concept
# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
# less readable) file names. This can be useful is your file systems doesn't
@@ -580,27 +580,27 @@ STRICT_PROTO_MATCHING = NO
# documentation.
# The default value is: YES.
-GENERATE_TODOLIST = YES
+GENERATE_TODOLIST = NO
# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the
# test list. This list is created by putting \test commands in the
# documentation.
# The default value is: YES.
-GENERATE_TESTLIST = YES
+GENERATE_TESTLIST = NO
# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug
# list. This list is created by putting \bug commands in the documentation.
# The default value is: YES.
-GENERATE_BUGLIST = YES
+GENERATE_BUGLIST = NO
# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO)
# the deprecated list. This list is created by putting \deprecated commands in
# the documentation.
# The default value is: YES.
-GENERATE_DEPRECATEDLIST= YES
+GENERATE_DEPRECATEDLIST= NO
# The ENABLED_SECTIONS tag can be used to enable conditional documentation
# sections, marked by \if <section_label> ... \endif and \cond <section_label>
@@ -672,7 +672,9 @@ LAYOUT_FILE =
# search path. Do not use file names with spaces, bibtex cannot handle them. See
# also \cite for info how to create references.
-CITE_BIB_FILES = ../biblio/bibliography.bib
+CITE_BIB_FILES = biblio/bibliography.bib \
+ biblio/how_to_cite_cgal.bib \
+ biblio/how_to_cite_gudhi.bib
#---------------------------------------------------------------------------
# Configuration options related to warning and progress messages
@@ -778,7 +780,9 @@ RECURSIVE = YES
# Note that relative paths are relative to the directory from which doxygen is
# run.
-EXCLUDE =
+EXCLUDE = data/ \
+ example/ \
+ GudhUI/
# 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
@@ -811,14 +815,15 @@ EXCLUDE_SYMBOLS =
# that contain example code fragments that are included (see the \include
# command).
-EXAMPLE_PATH =
+EXAMPLE_PATH = biblio/ \
+ example/
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
# *.h) to filter out the source-files in the directories. If left blank all
# files are included.
-EXAMPLE_PATTERNS =
+EXAMPLE_PATTERNS =
# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
# searched for input files to be used with the \include or \dontinclude commands
@@ -831,10 +836,14 @@ EXAMPLE_RECURSIVE = NO
# that contain images that are to be included in the documentation (see the
# \image command).
-IMAGE_PATH = Skeleton_blocker/doc/ \
- common/doc/ \
- Contraction/doc/
-
+IMAGE_PATH = doc/Skeleton_blocker/ \
+ doc/Alpha_complex/ \
+ doc/common/ \
+ doc/Contraction/ \
+ doc/Simplex_tree/ \
+ doc/Persistent_cohomology/ \
+ doc/Witness_complex/ \
+ doc/Bitmap_cubical_complex/
# 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
@@ -1038,7 +1047,7 @@ HTML_FILE_EXTENSION = .html
# of the possible markers and block names see the documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_HEADER =
+HTML_HEADER = doc/common/header.html
# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
# generated HTML page. If the tag is left blank doxygen will generate a standard
@@ -1048,7 +1057,7 @@ HTML_HEADER =
# that doxygen normally uses.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_FOOTER =
+HTML_FOOTER = doc/common/footer.html
# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
# sheet that is used by each HTML page. It can be used to fine-tune the look of
@@ -1060,7 +1069,7 @@ HTML_FOOTER =
# obsolete.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_STYLESHEET =
+HTML_STYLESHEET = doc/common/stylesheet.css
# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user-
# defined cascading style sheet that is included after the standard style sheets
@@ -1338,7 +1347,7 @@ ECLIPSE_DOC_ID = org.doxygen.Project
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
-DISABLE_INDEX = NO
+DISABLE_INDEX = YES
# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
# structure should be generated to display hierarchical information. If the tag
@@ -1355,7 +1364,7 @@ DISABLE_INDEX = NO
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
-GENERATE_TREEVIEW = NO
+GENERATE_TREEVIEW = YES
# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
# doxygen will group on one line in the generated HTML documentation.
@@ -1543,7 +1552,7 @@ EXTRA_SEARCH_MAPPINGS =
# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output.
# The default value is: YES.
-GENERATE_LATEX = YES
+GENERATE_LATEX = NO
# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
@@ -1595,7 +1604,7 @@ PAPER_TYPE = a4
# If left blank no extra packages will be included.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-EXTRA_PACKAGES = amsfonts amsmath amssymb
+EXTRA_PACKAGES = amsfonts amsmath amssymb algorithm algpseudocode
# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
# generated LaTeX document. The header should contain everything until the first
diff --git a/src/GUDHIConfig.cmake.in b/src/GUDHIConfig.cmake.in
new file mode 100644
index 00000000..02b540dc
--- /dev/null
+++ b/src/GUDHIConfig.cmake.in
@@ -0,0 +1,7 @@
+# - Config file for the GUDHI package
+# It defines the following variables
+# GUDHI_INCLUDE_DIRS - include directories for GUDHI
+
+# Compute paths
+set(GUDHI_INCLUDE_DIRS "@CONF_INCLUDE_DIRS@")
+
diff --git a/src/GUDHIConfigVersion.cmake.in b/src/GUDHIConfigVersion.cmake.in
new file mode 100644
index 00000000..6d443ef6
--- /dev/null
+++ b/src/GUDHIConfigVersion.cmake.in
@@ -0,0 +1,11 @@
+set(PACKAGE_VERSION "@GUDHI_VERSION@")
+
+# Check whether the requested PACKAGE_FIND_VERSION is compatible
+if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}")
+ set(PACKAGE_VERSION_COMPATIBLE FALSE)
+else()
+ set(PACKAGE_VERSION_COMPATIBLE TRUE)
+ if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}")
+ set(PACKAGE_VERSION_EXACT TRUE)
+ endif()
+endif()
diff --git a/src/GudhUI/CMakeLists.txt b/src/GudhUI/CMakeLists.txt
index b62be8ff..a43294ea 100644
--- a/src/GudhUI/CMakeLists.txt
+++ b/src/GudhUI/CMakeLists.txt
@@ -1,83 +1,68 @@
cmake_minimum_required(VERSION 2.8)
project(GudhUI)
-#Specify Gudhi's path here
-#for instance
-#set(Gudhi_Path "C:/Users/dsalinas/Documents/Recherche/Code/c++/Gudhi_library_1.1.0/include")
-set(Gudhi_Path "/home/dsalinas/Documents/CodeSVN/gudhi/src/include")
-if(MSVC)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4267 /wd4668 /wd4311 /wd4800 /wd4820 /wd4503 /wd4244 /wd4345 /wd4996 /wd4396 /wd4018 -frounding-math")
-else()
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -pedantic -frounding-math")
-endif()
-
-set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})
-
-find_package(Boost REQUIRED COMPONENTS)
-find_package(CGAL COMPONENTS Qt4)
find_package(Qt4)
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)
+ 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)
- INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
- LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})
-
- include(${QT_USE_FILE})
- include(${CGAL_USE_FILE})
-
- include_directories (${QGLVIEWER_INCLUDE_DIR})
- include_directories(.)
- include_directories(${Gudhi_Path})
+ include(${QT_USE_FILE})
+ 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
- )
+ # 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}/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
- )
- #####################################################################
+ set(CMAKE_CURRENT_BINARY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/view")
+ qt4_automoc(view/Viewer_instructor.cpp
+ view/Viewer.cpp
+ )
+ #####################################################################
- add_executable ( GudhUI
- gui/gudhui.cpp
- gui/MainWindow.cpp
- gui/Menu_k_nearest_neighbors.cpp
- gui/Menu_uniform_neighbors.cpp
- gui/Menu_edge_contraction.cpp
- gui/Menu_persistence.cpp
- view/Viewer_instructor.cpp
- view/Viewer.cpp
- ${uis}
- )
+ add_executable ( GudhUI
+ gui/gudhui.cpp
+ gui/MainWindow.cpp
+ gui/Menu_k_nearest_neighbors.cpp
+ gui/Menu_uniform_neighbors.cpp
+ gui/Menu_edge_contraction.cpp
+ gui/Menu_persistence.cpp
+ view/Viewer_instructor.cpp
+ view/Viewer.cpp
+ ${uis}
+ )
- target_link_libraries( GudhUI ${QT_LIBRARIES} ${QGLVIEWER_LIBRARIES} )
- target_link_libraries( GudhUI ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} )
+ target_link_libraries( GudhUI ${QT_LIBRARIES} ${QGLVIEWER_LIBRARIES} )
+ target_link_libraries( GudhUI ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} )
+if (TBB_FOUND)
+ target_link_libraries( GudhUI ${TBB_LIBRARIES})
+endif()
+
+###############################################################################
else()
- message(STATUS "NOTICE: This demo requires CGAL, the QGLViewer, OpenGL and Qt4, and will not be compiled.")
+ message(STATUS "NOTICE: GudhUI requires CGAL, the QGLViewer, OpenGL and Qt4, and will not be compiled.")
endif()
diff --git a/src/GudhUI/gui/MainWindow.cpp b/src/GudhUI/gui/MainWindow.cpp
index e41b15ba..779ccd33 100644
--- a/src/GudhUI/gui/MainWindow.cpp
+++ b/src/GudhUI/gui/MainWindow.cpp
@@ -1,3 +1,25 @@
+/* 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/>.
+ */
+
#include "MainWindow.h"
#include <QWidget>
@@ -6,292 +28,271 @@
#include <fenv.h>
-
#include "gui/Menu_k_nearest_neighbors.h"
#include "gui/Menu_uniform_neighbors.h"
#include "gui/Menu_edge_contraction.h"
#include "gui/Menu_persistence.h"
+MainWindow::MainWindow(QWidget* parent) :
+ menu_k_nearest_neighbors_(new Menu_k_nearest_neighbors(this)),
+ menu_uniform_neighbors_(new Menu_uniform_neighbors(this)),
+ menu_edge_contraction_(new Menu_edge_contraction(this, model_)),
+ menu_persistence_(new Menu_persistence(this)) {
+ // #ifndef NDEBUG // catch nan
+ // feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
+ // #endif
-MainWindow::MainWindow(QWidget* parent):
-menu_k_nearest_neighbors_(new Menu_k_nearest_neighbors(this)),
-menu_uniform_neighbors_(new Menu_uniform_neighbors(this)),
-menu_edge_contraction_(new Menu_edge_contraction(this,model_)),
-menu_persistence_(new Menu_persistence(this))
-{
-//#ifndef NDEBUG // catch nan
-//feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
-//#endif
+ setupUi(this);
- setupUi(this);
+ viewer_instructor_ = new Viewer_instructor(
+ this,
+ this->viewer,
+ model_.complex_);
- viewer_instructor_ = new Viewer_instructor(
- this,
- this->viewer,
- model_.complex_
- );
+ connectActions();
- connectActions();
-
- update_view();
+ update_view();
}
-void
-MainWindow::closeEvent(QCloseEvent *event){
- exit(0);
+void
+MainWindow::closeEvent(QCloseEvent *event) {
+ exit(0);
}
-
-void
-MainWindow::connectActions(){
- QObject::connect(this->actionLoad_complex, SIGNAL(triggered()), this,
- SLOT(off_file_open()));
- QObject::connect(this->actionLoad_points, SIGNAL(triggered()), this,
- SLOT(off_points_open()));
- QObject::connect(this->actionSave_complex, SIGNAL(triggered()), this,
- SLOT(off_file_save()));
- QObject::connect(this->actionSave_points, SIGNAL(triggered()), this,
- SLOT(off_points_save()));
-
- QObject::connect(this->actionShow_graph_stats, SIGNAL(triggered()), this,
- SLOT(show_graph_stats()));
- QObject::connect(this->actionShow_complex_stats, SIGNAL(triggered()), this,
- SLOT(show_complex_stats()));
- QObject::connect(this->actionShow_complex_dimension, SIGNAL(triggered()), this,
- SLOT(show_complex_dimension()));
-
- QObject::connect(this->actionUniform_proximity_graph, SIGNAL(triggered()), this,
- SLOT(build_rips_menu()));
- QObject::connect(this->actionK_nearest_neighbors_graph, SIGNAL(triggered()), this,
- SLOT(build_k_nearest_neighbors_menu()));
-
-
- QObject::connect(this->actionContract_edges, SIGNAL(triggered()), this,
- SLOT(contract_edge_menu()));
-
- QObject::connect(this->actionCollapse_vertices, SIGNAL(triggered()), this,
- SLOT(collapse_vertices()));
-
- QObject::connect(this->actionCollapse_edges, SIGNAL(triggered()), this,
- SLOT(collapse_edges()));
-
- QObject::connect(this->actionNoise, SIGNAL(triggered()), this,
- SLOT(uniform_noise()));
- QObject::connect(this->actionLloyd, SIGNAL(triggered()), this,
- SLOT(lloyd()));
-
-
- //view
- QObject::connect(this->actionPoints, SIGNAL(triggered()), this->viewer_instructor_,
- SLOT(change_draw_vertices()));
- QObject::connect(this->actionEdges, SIGNAL(triggered()), this->viewer_instructor_,
- SLOT(change_draw_edges()));
- QObject::connect(this->actionTriangles, SIGNAL(triggered()), this->viewer_instructor_,
- SLOT(change_draw_triangles()));
-
- //topology
- QObject::connect(this->actionShow_homology_group, SIGNAL(triggered()), this,
- SLOT(show_homology_group()));
- QObject::connect(this->actionEuler_characteristic, SIGNAL(triggered()), this,
- SLOT(show_euler_characteristic()));
- QObject::connect(this->actionPersistence, SIGNAL(triggered()), this,
- SLOT(persistence_menu()));
- QObject::connect(this->actionEstimate_topological_changes, SIGNAL(triggered()), this,
- SLOT(critical_points_menu()));
- QObject::connect(this->actionIs_manifold, SIGNAL(triggered()), this,
- SLOT(is_manifold_menu()));
-
-
- QObject::connect(this, SIGNAL(sceneChanged()), this->viewer_instructor_,
- SLOT(sceneChanged()));
-
+void
+MainWindow::connectActions() {
+ QObject::connect(this->actionLoad_complex, SIGNAL(triggered()), this,
+ SLOT(off_file_open()));
+ QObject::connect(this->actionLoad_points, SIGNAL(triggered()), this,
+ SLOT(off_points_open()));
+ QObject::connect(this->actionSave_complex, SIGNAL(triggered()), this,
+ SLOT(off_file_save()));
+ QObject::connect(this->actionSave_points, SIGNAL(triggered()), this,
+ SLOT(off_points_save()));
+
+ QObject::connect(this->actionShow_graph_stats, SIGNAL(triggered()), this,
+ SLOT(show_graph_stats()));
+ QObject::connect(this->actionShow_complex_stats, SIGNAL(triggered()), this,
+ SLOT(show_complex_stats()));
+ QObject::connect(this->actionShow_complex_dimension, SIGNAL(triggered()), this,
+ SLOT(show_complex_dimension()));
+
+ QObject::connect(this->actionUniform_proximity_graph, SIGNAL(triggered()), this,
+ SLOT(build_rips_menu()));
+ QObject::connect(this->actionK_nearest_neighbors_graph, SIGNAL(triggered()), this,
+ SLOT(build_k_nearest_neighbors_menu()));
+
+
+ QObject::connect(this->actionContract_edges, SIGNAL(triggered()), this,
+ SLOT(contract_edge_menu()));
+
+ QObject::connect(this->actionCollapse_vertices, SIGNAL(triggered()), this,
+ SLOT(collapse_vertices()));
+
+ QObject::connect(this->actionCollapse_edges, SIGNAL(triggered()), this,
+ SLOT(collapse_edges()));
+
+ QObject::connect(this->actionNoise, SIGNAL(triggered()), this,
+ SLOT(uniform_noise()));
+ QObject::connect(this->actionLloyd, SIGNAL(triggered()), this,
+ SLOT(lloyd()));
+
+
+ // view
+ QObject::connect(this->actionPoints, SIGNAL(triggered()), this->viewer_instructor_,
+ SLOT(change_draw_vertices()));
+ QObject::connect(this->actionEdges, SIGNAL(triggered()), this->viewer_instructor_,
+ SLOT(change_draw_edges()));
+ QObject::connect(this->actionTriangles, SIGNAL(triggered()), this->viewer_instructor_,
+ SLOT(change_draw_triangles()));
+
+ // topology
+ QObject::connect(this->actionShow_homology_group, SIGNAL(triggered()), this,
+ SLOT(show_homology_group()));
+ QObject::connect(this->actionEuler_characteristic, SIGNAL(triggered()), this,
+ SLOT(show_euler_characteristic()));
+ QObject::connect(this->actionPersistence, SIGNAL(triggered()), this,
+ SLOT(persistence_menu()));
+ QObject::connect(this->actionEstimate_topological_changes, SIGNAL(triggered()), this,
+ SLOT(critical_points_menu()));
+ QObject::connect(this->actionIs_manifold, SIGNAL(triggered()), this,
+ SLOT(is_manifold_menu()));
+
+
+ QObject::connect(this, SIGNAL(sceneChanged()), this->viewer_instructor_,
+ SLOT(sceneChanged()));
}
void
-MainWindow::init_view() const{
- viewer_instructor_->initialize_bounding_box();
- viewer_instructor_->show_entire_scene();
- update_view();
+MainWindow::init_view() const {
+ viewer_instructor_->initialize_bounding_box();
+ viewer_instructor_->show_entire_scene();
+ update_view();
}
-
void
-MainWindow::update_view() const{
- emit (sceneChanged());
+MainWindow::update_view() const {
+ emit(sceneChanged());
}
-
-
/**
* open a file chooser to choose an off to load
*/
-void
-MainWindow::off_file_open(){
- QString fileName = QFileDialog::getOpenFileName(this, tr("Open off File"),
- "~/", tr("off files (*.off)"));
- if (!fileName.isEmpty()){
- model_.off_file_open(fileName.toStdString());
- init_view();
- }
+void
+MainWindow::off_file_open() {
+ QString fileName = QFileDialog::getOpenFileName(this, tr("Open off File"),
+ "~/", tr("off files (*.off)"));
+ if (!fileName.isEmpty()) {
+ model_.off_file_open(fileName.toStdString());
+ init_view();
+ }
}
void
-MainWindow::off_points_open(){
- QString fileName = QFileDialog::getOpenFileName(this, tr("Open points in a off file"),
- "~/", tr("off files (*.off)"));
- if (!fileName.isEmpty()){
- model_.off_points_open(fileName.toStdString());
- init_view();
- }
+MainWindow::off_points_open() {
+ QString fileName = QFileDialog::getOpenFileName(this, tr("Open points in a off file"),
+ "~/", tr("off files (*.off)"));
+ if (!fileName.isEmpty()) {
+ model_.off_points_open(fileName.toStdString());
+ init_view();
+ }
}
-
/**
* open a file chooser to choose an off to save
*/
-void
-MainWindow::off_file_save(){
- QString fileName = QFileDialog::getOpenFileName(this, tr("Save to off File"),
- "~/", tr("off files (*.off)"));
- if (!fileName.isEmpty())
- {
- model_.off_file_save(fileName.toStdString());
- }
+void
+MainWindow::off_file_save() {
+ QString fileName = QFileDialog::getOpenFileName(this, tr("Save to off File"),
+ "~/", tr("off files (*.off)"));
+ if (!fileName.isEmpty()) {
+ model_.off_file_save(fileName.toStdString());
+ }
}
/**
* open a file chooser to choose an off to save
*/
void
-MainWindow::off_points_save(){
- QString fileName = QFileDialog::getOpenFileName(this, tr("Save to off File"),
- "~/", tr("off files (*.off)"));
- if (!fileName.isEmpty())
- {
- model_.off_points_save(fileName.toStdString());
- }
+MainWindow::off_points_save() {
+ QString fileName = QFileDialog::getOpenFileName(this, tr("Save to off File"),
+ "~/", tr("off files (*.off)"));
+ if (!fileName.isEmpty()) {
+ model_.off_points_save(fileName.toStdString());
+ }
}
-
void
-MainWindow::show_graph_stats(){
- model_.show_graph_stats();
+MainWindow::show_graph_stats() {
+ model_.show_graph_stats();
}
void
-MainWindow::show_complex_stats(){
- model_.show_complex_stats();
+MainWindow::show_complex_stats() {
+ model_.show_complex_stats();
}
-void
-MainWindow::show_complex_dimension(){
- model_.show_complex_dimension();
+void
+MainWindow::show_complex_dimension() {
+ model_.show_complex_dimension();
}
-
void
-MainWindow::build_rips_menu(){
- menu_uniform_neighbors_->show();
+MainWindow::build_rips_menu() {
+ menu_uniform_neighbors_->show();
}
void
-MainWindow::build_rips(double alpha){
- model_.build_rips(alpha);
- update_view();
+MainWindow::build_rips(double alpha) {
+ model_.build_rips(alpha);
+ update_view();
}
void
-MainWindow::build_k_nearest_neighbors_menu(){
- menu_k_nearest_neighbors_->show();
+MainWindow::build_k_nearest_neighbors_menu() {
+ menu_k_nearest_neighbors_->show();
}
void
-MainWindow::build_k_nearest_neighbors(unsigned k){
- model_.build_k_nearest_neighbors(k);
- update_view();
+MainWindow::build_k_nearest_neighbors(unsigned k) {
+ model_.build_k_nearest_neighbors(k);
+ update_view();
}
void
-MainWindow::contract_edge_menu(){
- menu_edge_contraction_->show();
+MainWindow::contract_edge_menu() {
+ menu_edge_contraction_->show();
}
void
-MainWindow::contract_edges(unsigned num_collapses){
- std::cerr <<"Collapse "<<num_collapses<< " vertices\n";
- model_.contract_edges(num_collapses);
- update_view();
+MainWindow::contract_edges(unsigned num_collapses) {
+ std::cerr << "Collapse " << num_collapses << " vertices\n";
+ model_.contract_edges(num_collapses);
+ update_view();
}
-
void
-MainWindow::collapse_edges(){
- model_.collapse_edges(model_.num_edges());
- update_view();
+MainWindow::collapse_edges() {
+ model_.collapse_edges(model_.num_edges());
+ update_view();
}
-
-
void
-MainWindow::collapse_vertices(){
- std::cerr <<"Collapse vertices edges\n";
- model_.collapse_vertices(0);
- update_view();
+MainWindow::collapse_vertices() {
+ std::cerr << "Collapse vertices edges\n";
+ model_.collapse_vertices(0);
+ update_view();
}
-
void
-MainWindow::uniform_noise(){
- bool ok;
- double amplitude = QInputDialog::getDouble(this, tr("Uniform noise"),
- tr("Amplitude:"), 0, 0, 10000, 3, &ok);
- srand(time(NULL));
- if (ok)
- model_.uniform_noise(amplitude);
+MainWindow::uniform_noise() {
+ bool ok;
+ double amplitude = QInputDialog::getDouble(this, tr("Uniform noise"),
+ tr("Amplitude:"), 0, 0, 10000, 3, &ok);
+ srand(time(NULL));
+ if (ok)
+ model_.uniform_noise(amplitude);
}
-
void
-MainWindow::lloyd(){
- //todo 1 ask lloyd parameters
- model_.lloyd(0,0);
- update_view();
+MainWindow::lloyd() {
+ // todo 1 ask lloyd parameters
+ model_.lloyd(0, 0);
+ update_view();
}
void
-MainWindow::show_homology_group(){
- model_.show_homology_group();
+MainWindow::show_homology_group() {
+ model_.show_homology_group();
}
void
-MainWindow::show_euler_characteristic(){
- model_.show_euler_characteristic();
+MainWindow::show_euler_characteristic() {
+ model_.show_euler_characteristic();
}
-
-
void
-MainWindow::persistence_menu(){
- menu_persistence_->show();
+MainWindow::persistence_menu() {
+ menu_persistence_->show();
}
void
-MainWindow::compute_persistence(int p,double threshold,int max_dim,double min_pers){
- model_.show_persistence(p,threshold,max_dim,min_pers);
+MainWindow::compute_persistence(int p, double threshold, int max_dim, double min_pers) {
+ model_.show_persistence(p, threshold, max_dim, min_pers);
}
void
-MainWindow::critical_points_menu(){
- bool ok;
- double max_length = QInputDialog::getDouble(this, tr("Maximal edge length for the Rips"),
- tr("Maximal edge length:"), 0, 0, 10000, 3, &ok);
- if (ok)
- model_.show_critical_points(max_length);
+MainWindow::critical_points_menu() {
+ bool ok;
+ double max_length = QInputDialog::getDouble(this, tr("Maximal edge length for the Rips"),
+ tr("Maximal edge length:"), 0, 0, 10000, 3, &ok);
+ if (ok)
+ model_.show_critical_points(max_length);
}
void
-MainWindow::is_manifold_menu(){
- model_.show_is_manifold();
+MainWindow::is_manifold_menu() {
+ model_.show_is_manifold();
}
diff --git a/src/GudhUI/gui/MainWindow.h b/src/GudhUI/gui/MainWindow.h
index 587f1c6f..c8c3fcf6 100644
--- a/src/GudhUI/gui/MainWindow.h
+++ b/src/GudhUI/gui/MainWindow.h
@@ -1,6 +1,30 @@
-#ifndef MAIN_WINDOW_H
-#define MAIN_WINDOW_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.
+ *
+ * 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 GUI_MAINWINDOW_H_
+#define GUI_MAINWINDOW_H_
+
+// Workaround for moc-qt4 not parsing boost headers
+#include <CGAL/config.h>
#include <QMainWindow>
#include "ui_main_window.h"
@@ -13,86 +37,82 @@ class Menu_uniform_neighbors;
class Menu_edge_contraction;
class Menu_persistence;
-class MainWindow : public QMainWindow,public Ui::MainWindow{
- Q_OBJECT
-
-private:
- Model model_;
- Viewer_instructor* viewer_instructor_;
- Menu_k_nearest_neighbors* menu_k_nearest_neighbors_;
- Menu_uniform_neighbors* menu_uniform_neighbors_;
- Menu_edge_contraction* menu_edge_contraction_;
- Menu_persistence* menu_persistence_;
-
-public:
- MainWindow(QWidget* parent = 0);
- void connectActions();
-
- /**
- * compute the bounding box and calls update view
- */
- void init_view() const;
- void update_view() const;
+class MainWindow : public QMainWindow, public Ui::MainWindow {
+ Q_OBJECT
+ private:
+ Model model_;
+ Viewer_instructor* viewer_instructor_;
+ Menu_k_nearest_neighbors* menu_k_nearest_neighbors_;
+ Menu_uniform_neighbors* menu_uniform_neighbors_;
+ Menu_edge_contraction* menu_edge_contraction_;
+ Menu_persistence* menu_persistence_;
-protected:
- void closeEvent(QCloseEvent *event);
- void keyPressEvent(QKeyEvent *event){}
+ public:
+ MainWindow(QWidget* parent = 0);
+ void connectActions();
-public:
+ /**
+ * compute the bounding box and calls update view
+ */
+ void init_view() const;
+ void update_view() const;
- public slots:
+ protected:
+ void closeEvent(QCloseEvent *event);
- /**
- * open a file chooser to choose an off to load
- */
- void off_file_open();
+ void keyPressEvent(QKeyEvent *event) { }
- void off_points_open();
+ public:
+ public slots:
+ /**
+ * open a file chooser to choose an off to load
+ */
+ void off_file_open();
- /**
- * open a file chooser to choose an off to save
- */
- void off_file_save();
- void off_points_save();
+ void off_points_open();
- void show_graph_stats();
- void show_complex_stats();
- void show_complex_dimension();
+ /**
+ * open a file chooser to choose an off to save
+ */
+ void off_file_save();
+ void off_points_save();
+ void show_graph_stats();
+ void show_complex_stats();
+ void show_complex_dimension();
- void build_rips_menu();
- void build_rips(double alpha);
- void build_k_nearest_neighbors_menu();
- void build_k_nearest_neighbors(unsigned k);
+ void build_rips_menu();
+ void build_rips(double alpha);
+ void build_k_nearest_neighbors_menu();
+ void build_k_nearest_neighbors(unsigned k);
- void contract_edge_menu();
- void contract_edges(unsigned num_collapses);
+ void contract_edge_menu();
+ void contract_edges(unsigned num_collapses);
- void collapse_vertices();
- void collapse_edges();
+ void collapse_vertices();
+ void collapse_edges();
- void uniform_noise();
- void lloyd();
- void show_homology_group();
- void show_euler_characteristic();
- void persistence_menu();
- void compute_persistence(int p,double threshold,int max_dim,double min_pers);
- void critical_points_menu();
- void is_manifold_menu();
+ void uniform_noise();
+ void lloyd();
+ void show_homology_group();
+ void show_euler_characteristic();
+ void persistence_menu();
+ void compute_persistence(int p, double threshold, int max_dim, double min_pers);
+ void critical_points_menu();
+ void is_manifold_menu();
-public:
- signals:
- void sceneChanged() const;
-
+ public:
+ signals:
+ void sceneChanged() const;
};
-#endif
+#endif // GUI_MAINWINDOW_H_
diff --git a/src/GudhUI/gui/MenuEdgeContraction.ui b/src/GudhUI/gui/MenuEdgeContraction.ui
index da2e5c82..b1696431 100644
--- a/src/GudhUI/gui/MenuEdgeContraction.ui
+++ b/src/GudhUI/gui/MenuEdgeContraction.ui
@@ -1,118 +1,118 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>MenuEdgeContraction</class>
- <widget class="QDialog" name="MenuEdgeContraction">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>362</width>
- <height>209</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Edge contraction</string>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="5" column="2">
- <widget class="QSpinBox" name="spinBox_nb_remaining_vertices">
- <property name="minimum">
- <number>1</number>
- </property>
- <property name="maximum">
- <number>999999999</number>
- </property>
- <property name="value">
- <number>1</number>
- </property>
- </widget>
- </item>
- <item row="7" column="2">
- <widget class="QCheckBox" name="checkBox_link_condition">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="text">
- <string>Link condition</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="3" column="2" alignment="Qt::AlignRight">
- <widget class="QLabel" name="txt_nb_collapses">
- <property name="text">
- <string>1</string>
- </property>
- </widget>
- </item>
- <item row="6" column="0">
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Policy</string>
- </property>
- </widget>
- </item>
- <item row="6" column="2">
- <widget class="QComboBox" name="m_simplificationMethod">
- <item>
- <property name="text">
- <string>Length_midpoint</string>
- </property>
- </item>
- </widget>
- </item>
- <item row="2" column="2" alignment="Qt::AlignRight">
- <widget class="QLabel" name="txt_nb_vertices">
- <property name="text">
- <string>0</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_5">
- <property name="text">
- <string>Number of vertices</string>
- </property>
- </widget>
- </item>
- <item row="3" column="0" colspan="2">
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>Number of contractions</string>
- </property>
- </widget>
- </item>
- <item row="5" column="0" colspan="2">
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>Number of vertices after </string>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QSlider" name="horizontalSlider">
- <property name="minimum">
- <number>0</number>
- </property>
- <property name="maximum">
- <number>100</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
- <widget class="QPushButton" name="pushButton_collapse">
- <property name="text">
- <string>Perform collapse</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MenuEdgeContraction</class>
+ <widget class="QDialog" name="MenuEdgeContraction">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>362</width>
+ <height>209</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Edge contraction</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="5" column="2">
+ <widget class="QSpinBox" name="spinBox_nb_remaining_vertices">
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>999999999</number>
+ </property>
+ <property name="value">
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="2">
+ <widget class="QCheckBox" name="checkBox_link_condition">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Link condition</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" alignment="Qt::AlignRight">
+ <widget class="QLabel" name="txt_nb_collapses">
+ <property name="text">
+ <string>1</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Policy</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="2">
+ <widget class="QComboBox" name="m_simplificationMethod">
+ <item>
+ <property name="text">
+ <string>Length_midpoint</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="2" column="2" alignment="Qt::AlignRight">
+ <widget class="QLabel" name="txt_nb_vertices">
+ <property name="text">
+ <string>0</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>Number of vertices</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="2">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Number of contractions</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0" colspan="2">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>Number of vertices after </string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QSlider" name="horizontalSlider">
+ <property name="minimum">
+ <number>0</number>
+ </property>
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QPushButton" name="pushButton_collapse">
+ <property name="text">
+ <string>Perform collapse</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/GudhUI/gui/Menu_edge_contraction.cpp b/src/GudhUI/gui/Menu_edge_contraction.cpp
index dd2621be..a679b0bf 100644
--- a/src/GudhUI/gui/Menu_edge_contraction.cpp
+++ b/src/GudhUI/gui/Menu_edge_contraction.cpp
@@ -1,91 +1,97 @@
-/*
- * Menu_edge_contraction.cpp
+/* 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: Sep 11, 2014
- * Author: dsalinas
+ * 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 MENU_EDGE_CONTRACTION_CPP_
-#define MENU_EDGE_CONTRACTION_CPP_
-
+#ifndef GUI_MENU_EDGE_CONTRACTION_CPP_
+#define GUI_MENU_EDGE_CONTRACTION_CPP_
#include "Menu_edge_contraction.h"
-Menu_edge_contraction::Menu_edge_contraction(MainWindow* parent,const Model& model):
-parent_(parent),model_(model)
-{
- setupUi(this);
- connectActions(parent_);
+Menu_edge_contraction::Menu_edge_contraction(MainWindow* parent, const Model& model) :
+ parent_(parent), model_(model) {
+ setupUi(this);
+ connectActions(parent_);
}
-void Menu_edge_contraction::connectActions(MainWindow* parent)
-{
- QObject::connect(
- this->horizontalSlider,
- SIGNAL(valueChanged(int)),
- this,
- SLOT(slider_value_changed(int))
- );
+void Menu_edge_contraction::connectActions(MainWindow* parent) {
+ QObject::connect(
+ this->horizontalSlider,
+ SIGNAL(valueChanged(int)),
+ this,
+ SLOT(slider_value_changed(int)));
- QObject::connect(this, SIGNAL(contract_edges(unsigned)), parent, SLOT(contract_edges(unsigned)));
-
- QObject::connect(this->pushButton_collapse, SIGNAL(clicked()), this, SLOT(send_contract_edges()));
+ QObject::connect(this, SIGNAL(contract_edges(unsigned)), parent, SLOT(contract_edges(unsigned)));
+ QObject::connect(this->pushButton_collapse, SIGNAL(clicked()), this, SLOT(send_contract_edges()));
}
-void Menu_edge_contraction::slider_value_changed(int new_slider_value){
- int num_collapses =
- (horizontalSlider->value()==1)? 1 : horizontalSlider->value() * model_.num_vertices() / 100 ;
- this->txt_nb_vertices->setNum((int)model_.num_vertices());
- this->txt_nb_collapses->setNum(num_collapses);
- this->spinBox_nb_remaining_vertices->setValue(model_.num_vertices()-num_collapses);
+void Menu_edge_contraction::slider_value_changed(int new_slider_value) {
+ int num_collapses =
+ (horizontalSlider->value() == 1) ? 1 : horizontalSlider->value() * model_.num_vertices() / 100;
+ this->txt_nb_vertices->setNum(static_cast<int>(model_.num_vertices()));
+ this->txt_nb_collapses->setNum(num_collapses);
+ this->spinBox_nb_remaining_vertices->setValue(model_.num_vertices() - num_collapses);
}
-
void
-Menu_edge_contraction::update_slider_value(){
- int num_vertices = model_.num_vertices();
- int num_collapses = (horizontalSlider->value()==1)? 1 : horizontalSlider->value() * num_vertices / 100 ;
- int horizontal_slider_position = num_vertices>0? num_collapses/(double)num_vertices * 100 : 1 ;
- horizontalSlider->setValue(horizontal_slider_position);
+Menu_edge_contraction::update_slider_value() {
+ int num_vertices = model_.num_vertices();
+ int num_collapses = (horizontalSlider->value() == 1) ? 1 : horizontalSlider->value() * num_vertices / 100;
+ int horizontal_slider_position = num_vertices > 0 ? num_collapses / static_cast<double>(num_vertices * 100) : 1;
+ horizontalSlider->setValue(horizontal_slider_position);
}
-
void
-Menu_edge_contraction::update_gui_numbers(){
- update_slider_value();
- bool ok;
- int num_collapses = this->txt_nb_collapses->text().toInt(&ok,10);
- if(!ok) return;
- this->txt_nb_vertices->setNum((int)model_.num_vertices());
- this->txt_nb_collapses->setNum(num_collapses);
- this->spinBox_nb_remaining_vertices->setValue(model_.num_vertices()-num_collapses);
+Menu_edge_contraction::update_gui_numbers() {
+ update_slider_value();
+ bool ok;
+ int num_collapses = this->txt_nb_collapses->text().toInt(&ok, 10);
+ if (!ok) return;
+ this->txt_nb_vertices->setNum(static_cast<int>(model_.num_vertices()));
+ this->txt_nb_collapses->setNum(num_collapses);
+ this->spinBox_nb_remaining_vertices->setValue(model_.num_vertices() - num_collapses);
}
void
-Menu_edge_contraction::update_gui_numbers(int new_value){
- update_gui_numbers();
+Menu_edge_contraction::update_gui_numbers(int new_value) {
+ update_gui_numbers();
}
-
void
-Menu_edge_contraction::send_contract_edges(){
- emit(contract_edges(num_collapses()));
- update_gui_numbers();
+Menu_edge_contraction::send_contract_edges() {
+ emit(contract_edges(num_collapses()));
+ update_gui_numbers();
}
unsigned
-Menu_edge_contraction::num_vertices(){
- return model_.num_vertices();
+Menu_edge_contraction::num_vertices() {
+ return model_.num_vertices();
}
unsigned
-Menu_edge_contraction::num_collapses(){
- return (horizontalSlider->value()==1)? 1 : horizontalSlider->value() * num_vertices() / 100 ;
+Menu_edge_contraction::num_collapses() {
+ return (horizontalSlider->value() == 1) ? 1 : horizontalSlider->value() * num_vertices() / 100;
}
-
#include "Menu_edge_contraction.moc"
-#endif /* MENU_EDGE_CONTRACTION_CPP_ */
+#endif // GUI_MENU_EDGE_CONTRACTION_CPP_
diff --git a/src/GudhUI/gui/Menu_edge_contraction.h b/src/GudhUI/gui/Menu_edge_contraction.h
index e497a90f..08f0bf67 100644
--- a/src/GudhUI/gui/Menu_edge_contraction.h
+++ b/src/GudhUI/gui/Menu_edge_contraction.h
@@ -1,52 +1,63 @@
-/*
- * Menu_edge_contraction.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: Sep 11, 2014
- * Author: dsalinas
+ * 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 MENU_EDGE_CONTRACTION_H_
-#define MENU_EDGE_CONTRACTION_H_
+#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 "model/Model.h"
+class Menu_edge_contraction : public QDialog, public Ui::MenuEdgeContraction {
+ Q_OBJECT
-class Menu_edge_contraction : public QDialog,public Ui::MenuEdgeContraction{
- Q_OBJECT
-private:
- MainWindow* parent_;
- const Model& model_;
-
+ private:
+ MainWindow* parent_;
+ const Model& model_;
- void update_slider_value();
-public:
+ void update_slider_value();
- Menu_edge_contraction(MainWindow* parent,const Model& model);
+ public:
+ Menu_edge_contraction(MainWindow* parent, const Model& model);
- void connectActions(MainWindow* parent);
+ void connectActions(MainWindow* parent);
+ private:
+ unsigned num_vertices();
+ unsigned num_collapses();
-private:
- unsigned num_vertices();
- unsigned num_collapses();
+ public slots:
+ void slider_value_changed(int new_slider_value);
+ void update_gui_numbers();
+ void update_gui_numbers(int gui_numbers);
- public slots:
-
- void slider_value_changed(int new_slider_value);
- void update_gui_numbers();
- void update_gui_numbers(int);
-
- void send_contract_edges();
- signals:
-
- void contract_edges(unsigned num_collapses);
+ void send_contract_edges();
+ signals:
+ void contract_edges(unsigned num_collapses);
};
-
-
-#endif /* MENU_EDGE_CONTRACTION_H_ */
+#endif // GUI_MENU_EDGE_CONTRACTION_H_
diff --git a/src/GudhUI/gui/Menu_k_nearest_neighbors.cpp b/src/GudhUI/gui/Menu_k_nearest_neighbors.cpp
index 21c67b2a..e24865f2 100644
--- a/src/GudhUI/gui/Menu_k_nearest_neighbors.cpp
+++ b/src/GudhUI/gui/Menu_k_nearest_neighbors.cpp
@@ -1,55 +1,59 @@
-/*
- * Menu_k_nearest_neighbors.cpp
+/* 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: Sep 11, 2014
- * Author: dsalinas
+ * 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/>.
*/
-
#include "Menu_k_nearest_neighbors.h"
-Menu_k_nearest_neighbors::Menu_k_nearest_neighbors(QMainWindow* parent_):
-parent(parent_)
-{
- setupUi(this);
- connectActions(parent_);
+Menu_k_nearest_neighbors::Menu_k_nearest_neighbors(QMainWindow* parent_)
+ : parent(parent_) {
+ setupUi(this);
+ connectActions(parent_);
}
-void Menu_k_nearest_neighbors::connectActions(QMainWindow* parent){
-
- QObject::connect(
- this->pushButtonCompute,
- SIGNAL(clicked()),
- this,
- SLOT(send_compute_k_nearest_neighbors())
- );
- QObject::connect(
- this->spinBoxK,
- SIGNAL(valueChanged(int)),
- this,
- SLOT(update_k(int))
- );
- QObject::connect(
- this,
- SIGNAL(compute_k_nearest_neighbors(unsigned)),
- parent,
- SLOT(build_k_nearest_neighbors(unsigned))
- );
-
+void Menu_k_nearest_neighbors::connectActions(QMainWindow* parent) {
+ QObject::connect(this->pushButtonCompute,
+ SIGNAL(clicked()),
+ this,
+ SLOT(send_compute_k_nearest_neighbors()));
+ QObject::connect(this->spinBoxK,
+ SIGNAL(valueChanged(int)),
+ this,
+ SLOT(update_k(int)));
+ QObject::connect(this,
+ SIGNAL(compute_k_nearest_neighbors(unsigned)),
+ parent,
+ SLOT(build_k_nearest_neighbors(unsigned)));
}
-void Menu_k_nearest_neighbors::send_compute_k_nearest_neighbors(){
- emit(compute_k_nearest_neighbors((unsigned)spinBoxK->value()));
+void Menu_k_nearest_neighbors::send_compute_k_nearest_neighbors() {
+ emit(compute_k_nearest_neighbors((unsigned) spinBoxK->value()));
}
-void Menu_k_nearest_neighbors::accept(){
- send_compute_k_nearest_neighbors();
+void Menu_k_nearest_neighbors::accept() {
+ send_compute_k_nearest_neighbors();
}
-void Menu_k_nearest_neighbors::update_k(int new_k_value){
- if(checkBoxAutoUpdate->isChecked())
- emit(compute_k_nearest_neighbors((unsigned)spinBoxK->value()));
+void Menu_k_nearest_neighbors::update_k(int new_k_value) {
+ if (checkBoxAutoUpdate->isChecked())
+ emit(compute_k_nearest_neighbors((unsigned) spinBoxK->value()));
}
-
#include "Menu_k_nearest_neighbors.moc"
diff --git a/src/GudhUI/gui/Menu_k_nearest_neighbors.h b/src/GudhUI/gui/Menu_k_nearest_neighbors.h
index d72b0074..8088b768 100644
--- a/src/GudhUI/gui/Menu_k_nearest_neighbors.h
+++ b/src/GudhUI/gui/Menu_k_nearest_neighbors.h
@@ -1,39 +1,51 @@
-/*
- * Menu_k_nearest_neighbors.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: Sep 11, 2014
- * Author: dsalinas
+ * 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 MENU_K_NEAREST_NEIGHBORS_H_
-#define MENU_K_NEAREST_NEIGHBORS_H_
+#ifndef GUI_MENU_K_NEAREST_NEIGHBORS_H_
+#define GUI_MENU_K_NEAREST_NEIGHBORS_H_
#include <QMainWindow>
#include "gui/ui_KNearestNeighborsMenu.h"
class QWidget;
+class Menu_k_nearest_neighbors : public QDialog, public Ui::KNearestNeighborsMenu {
+ Q_OBJECT
-class Menu_k_nearest_neighbors : public QDialog,public Ui::KNearestNeighborsMenu{
- Q_OBJECT
-private:
- QMainWindow* parent;
+ private:
+ QMainWindow* parent;
-public:
+ public:
+ Menu_k_nearest_neighbors(QMainWindow* parent_);
- Menu_k_nearest_neighbors(QMainWindow* parent_);
+ void connectActions(QMainWindow* parent);
- void connectActions(QMainWindow* parent);
-
- public slots:
- void send_compute_k_nearest_neighbors();
- void update_k(int);
- void accept();
-
- signals:
- void compute_k_nearest_neighbors(unsigned k);
+ public slots:
+ void send_compute_k_nearest_neighbors();
+ void update_k(int k);
+ void accept();
+ signals:
+ void compute_k_nearest_neighbors(unsigned k);
};
-
-#endif /* MENU_K_NEAREST_NEIGHBORS_H_ */
+#endif // GUI_MENU_K_NEAREST_NEIGHBORS_H_
diff --git a/src/GudhUI/gui/Menu_persistence.cpp b/src/GudhUI/gui/Menu_persistence.cpp
index fae3a0e6..016c076b 100644
--- a/src/GudhUI/gui/Menu_persistence.cpp
+++ b/src/GudhUI/gui/Menu_persistence.cpp
@@ -1,13 +1,10 @@
-/*
- * Menu_persistence.cpp
- * Created on: Jan 27, 2015
- * This file is part of the Gudhi Library. The Gudhi library
+/* 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-Méditerranée (France)
+ * 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
@@ -27,34 +24,30 @@
#include "Menu_persistence.h"
-Menu_persistence::Menu_persistence(QMainWindow* parent_):parent(parent_)
-{
- setupUi(this);
- connectActions(parent_);
+Menu_persistence::Menu_persistence(QMainWindow* parent_) : parent(parent_) {
+ setupUi(this);
+ connectActions(parent_);
}
-void Menu_persistence::connectActions(QMainWindow* parent){
- QObject::connect(
- this,
- SIGNAL(compute_persistence(int,double,int,double)),
- parent,
- SLOT(compute_persistence(int,double,int,double))
- );
+void Menu_persistence::connectActions(QMainWindow* parent) {
+ QObject::connect(this,
+ SIGNAL(compute_persistence(int, double, int, double)),
+ parent,
+ SLOT(compute_persistence(int, double, int, double)));
}
-void Menu_persistence::send_compute_persistence(){
- emit(compute_persistence(p_spinBox->value(),threshold_doubleSpinBox->value(),
- maxdimension_spinBox->value(),minpersistence_doubleSpinBox->value()));
+void Menu_persistence::send_compute_persistence() {
+ emit(compute_persistence(p_spinBox->value(), threshold_doubleSpinBox->value(),
+ maxdimension_spinBox->value(), minpersistence_doubleSpinBox->value()));
}
-void Menu_persistence::accept(){
- send_compute_persistence();
+void Menu_persistence::accept() {
+ send_compute_persistence();
}
-//void Menu_persistence::compute_persistence(int p_fied,double threshold,int dim_max,double min_persistence){
-//// if(checkBoxAutoUpdate->isChecked())
-//// emit(compute_k_nearest_neighbors((unsigned)spinBoxK->value()));
-//}
-
+// void Menu_persistence::compute_persistence(int p_fied,double threshold,int dim_max,double min_persistence) {
+// if(checkBoxAutoUpdate->isChecked())
+// emit(compute_k_nearest_neighbors((unsigned)spinBoxK->value()));
+// }
#include "Menu_persistence.moc"
diff --git a/src/GudhUI/gui/Menu_persistence.h b/src/GudhUI/gui/Menu_persistence.h
index 67b64afa..8c4df158 100644
--- a/src/GudhUI/gui/Menu_persistence.h
+++ b/src/GudhUI/gui/Menu_persistence.h
@@ -1,13 +1,10 @@
-/*
- * Menu_persistence.h
- * Created on: Jan 27, 2015
- * This file is part of the Gudhi Library. The Gudhi library
+/* 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-Méditerranée (France)
+ * 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
@@ -24,36 +21,31 @@
*
*/
-
-#ifndef MENU_PERSISTENCE_H_
-#define MENU_PERSISTENCE_H_
-
+#ifndef GUI_MENU_PERSISTENCE_H_
+#define GUI_MENU_PERSISTENCE_H_
#include <QMainWindow>
#include "gui/ui_PersistenceMenu.h"
class QWidget;
+class Menu_persistence : public QDialog, public Ui::PersistenceMenu {
+ Q_OBJECT
-class Menu_persistence : public QDialog,public Ui::PersistenceMenu{
- Q_OBJECT
-private:
- QMainWindow* parent;
-
-public:
+ private:
+ QMainWindow* parent;
- Menu_persistence(QMainWindow* parent_);
+ public:
+ Menu_persistence(QMainWindow* parent_);
- void connectActions(QMainWindow* parent);
+ void connectActions(QMainWindow* parent);
- public slots:
- void send_compute_persistence();
- void accept();
- signals:
- void compute_persistence(int p_fied,double threshold,int dim_max,double min_persistence);
+ public slots:
+ void send_compute_persistence();
+ void accept();
+ signals:
+ void compute_persistence(int p_fied, double threshold, int dim_max, double min_persistence);
};
-
-
-#endif /* MENU_PERSISTENCE_H_ */
+#endif // GUI_MENU_PERSISTENCE_H_
diff --git a/src/GudhUI/gui/Menu_uniform_neighbors.cpp b/src/GudhUI/gui/Menu_uniform_neighbors.cpp
index 86e2593e..20e4f98f 100644
--- a/src/GudhUI/gui/Menu_uniform_neighbors.cpp
+++ b/src/GudhUI/gui/Menu_uniform_neighbors.cpp
@@ -1,59 +1,60 @@
-/*
- * Menu_uniform_neighbors.cpp
+/* 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: Sep 11, 2014
- * Author: dsalinas
+ * 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/>.
+ *
*/
-
-
-
-
#include "Menu_uniform_neighbors.h"
-Menu_uniform_neighbors::Menu_uniform_neighbors(QMainWindow* parent_):
-parent(parent_)
-{
- setupUi(this);
- connectActions(parent_);
+Menu_uniform_neighbors::Menu_uniform_neighbors(QMainWindow* parent_) :
+ parent(parent_) {
+ setupUi(this);
+ connectActions(parent_);
}
-void Menu_uniform_neighbors::connectActions(QMainWindow* parent){
-
- QObject::connect(
- this->pushButtonCompute,
- SIGNAL(clicked()),
- this,
- SLOT(send_compute_uniform_neighbors())
- );
- QObject::connect(
- this->doubleSpinBoxAlpha,
- SIGNAL(valueChanged(double)),
- this,
- SLOT(update_alpha(double))
- );
- QObject::connect(
- this,
- SIGNAL(compute_uniform_neighbors(double)),
- parent,
- SLOT(build_rips(double))
- );
-
+void Menu_uniform_neighbors::connectActions(QMainWindow* parent) {
+ QObject::connect(this->pushButtonCompute,
+ SIGNAL(clicked()),
+ this,
+ SLOT(send_compute_uniform_neighbors()));
+ QObject::connect(this->doubleSpinBoxAlpha,
+ SIGNAL(valueChanged(double)),
+ this,
+ SLOT(update_alpha(double)));
+ QObject::connect(this,
+ SIGNAL(compute_uniform_neighbors(double)),
+ parent,
+ SLOT(build_rips(double)));
}
-void Menu_uniform_neighbors::send_compute_uniform_neighbors(){
- emit(compute_uniform_neighbors(doubleSpinBoxAlpha->value()));
+void Menu_uniform_neighbors::send_compute_uniform_neighbors() {
+ emit(compute_uniform_neighbors(doubleSpinBoxAlpha->value()));
}
-void Menu_uniform_neighbors::accept(){
- send_compute_uniform_neighbors();
+void Menu_uniform_neighbors::accept() {
+ send_compute_uniform_neighbors();
}
-void Menu_uniform_neighbors::update_alpha(double alpha){
- if(checkBoxAutoUpdate->isChecked())
- emit(compute_uniform_neighbors(doubleSpinBoxAlpha->value()));
+void Menu_uniform_neighbors::update_alpha(double alpha) {
+ if (checkBoxAutoUpdate->isChecked())
+ emit(compute_uniform_neighbors(doubleSpinBoxAlpha->value()));
}
-
-
#include "Menu_uniform_neighbors.moc"
diff --git a/src/GudhUI/gui/Menu_uniform_neighbors.h b/src/GudhUI/gui/Menu_uniform_neighbors.h
index cb90cc88..0b6f65fe 100644
--- a/src/GudhUI/gui/Menu_uniform_neighbors.h
+++ b/src/GudhUI/gui/Menu_uniform_neighbors.h
@@ -1,36 +1,51 @@
-/*
- * Menu_uniform_neighbors.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: Sep 11, 2014
- * Author: dsalinas
+ * 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 MENU_UNIFORM_NEIGHBORS_H_
-#define MENU_UNIFORM_NEIGHBORS_H_
+#ifndef GUI_MENU_UNIFORM_NEIGHBORS_H_
+#define GUI_MENU_UNIFORM_NEIGHBORS_H_
#include <QMainWindow>
#include "gui/ui_UniformNeighborsMenu.h"
-class Menu_uniform_neighbors : public QDialog,public Ui::UniformMenu {
- Q_OBJECT
-private:
- QMainWindow* parent;
-
-public:
+class Menu_uniform_neighbors : public QDialog, public Ui::UniformMenu {
+ Q_OBJECT
- Menu_uniform_neighbors(QMainWindow* parent_);
+ private:
+ QMainWindow* parent;
- void connectActions(QMainWindow* parent);
+ public:
+ Menu_uniform_neighbors(QMainWindow* parent_);
- public slots:
- void send_compute_uniform_neighbors();
- void update_alpha(double);
- void accept();
+ void connectActions(QMainWindow* parent);
- signals:
- void compute_uniform_neighbors(double alpha);
+ public slots:
+ void send_compute_uniform_neighbors();
+ void update_alpha(double alpha);
+ void accept();
+ signals:
+ void compute_uniform_neighbors(double alpha);
};
-#endif /* MENU_UNIFORM_NEIGHBORS_H_ */
+#endif // GUI_MENU_UNIFORM_NEIGHBORS_H_
diff --git a/src/GudhUI/gui/Viewer.cpp b/src/GudhUI/gui/Viewer.cpp
deleted file mode 100644
index e69de29b..00000000
--- a/src/GudhUI/gui/Viewer.cpp
+++ /dev/null
diff --git a/src/GudhUI/gui/Viewer_instructor.cpp b/src/GudhUI/gui/Viewer_instructor.cpp
deleted file mode 100644
index e69de29b..00000000
--- a/src/GudhUI/gui/Viewer_instructor.cpp
+++ /dev/null
diff --git a/src/GudhUI/gui/gudhui.cpp b/src/GudhUI/gui/gudhui.cpp
index 8d90270f..276c4a5f 100644
--- a/src/GudhUI/gui/gudhui.cpp
+++ b/src/GudhUI/gui/gudhui.cpp
@@ -1,17 +1,38 @@
-#include "MainWindow.h"
-#include <QApplication>
-#include <CGAL/Qt/resources.h>
-
-
-int main(int argc, char** argv)
-{
- QApplication application(argc,argv);
- application.setOrganizationDomain("inria.fr");
- application.setOrganizationName("INRIA");
- application.setApplicationName("GudhUI");
-
- MainWindow mw;
- application.setQuitOnLastWindowClosed(false);
- mw.show();
- return application.exec();
-}
+/* 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/>.
+ *
+ */
+
+#include "MainWindow.h"
+#include <QApplication>
+#include <CGAL/Qt/resources.h>
+
+int main(int argc, char** argv) {
+ QApplication application(argc, argv);
+ application.setOrganizationDomain("inria.fr");
+ application.setOrganizationName("INRIA");
+ application.setApplicationName("GudhUI");
+
+ MainWindow mw;
+ application.setQuitOnLastWindowClosed(false);
+ mw.show();
+ return application.exec();
+}
diff --git a/src/GudhUI/model/Complex_typedefs.h b/src/GudhUI/model/Complex_typedefs.h
index b6404d62..a4df2c94 100644
--- a/src/GudhUI/model/Complex_typedefs.h
+++ b/src/GudhUI/model/Complex_typedefs.h
@@ -1,39 +1,49 @@
-/*
- * Complex_typedefs.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: Aug 26, 2014
- * Author: dsalinas
+ * 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 COMPLEX_TYPEDEFS_H_
-#define COMPLEX_TYPEDEFS_H_
-
+#ifndef MODEL_COMPLEX_TYPEDEFS_H_
+#define MODEL_COMPLEX_TYPEDEFS_H_
-
-#include "gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h"
-#include "gudhi/Skeleton_blocker_geometric_complex.h"
+#include <gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h>
+#include <gudhi/Skeleton_blocker_geometric_complex.h>
#include <CGAL/Kernel_d/Point_d.h>
-
#include <CGAL/Cartesian.h>
#include <CGAL/Cartesian_d.h>
-
struct Geometry_trait : public CGAL::Cartesian_d<double> {
- typedef CGAL::Cartesian<double>::Point_3 Point_3;
- typedef CGAL::Cartesian<double>::Vector_3 Vector_3;
- typedef CGAL::Point_d<Cartesian_d<double>> Point;
- typedef CGAL::Vector_d<Cartesian_d<double>> Vector;
+ typedef CGAL::Cartesian<double>::Point_3 Point_3;
+ typedef CGAL::Cartesian<double>::Vector_3 Vector_3;
+ typedef CGAL::Point_d<Cartesian_d<double>> Point;
+ typedef CGAL::Vector_d<Cartesian_d<double>> Vector;
};
typedef Geometry_trait::Point Point;
-
using namespace Gudhi;
-using namespace Gudhi::skbl;
+using namespace Gudhi::skeleton_blocker;
typedef Skeleton_blocker_simple_geometric_traits<Geometry_trait> Complex_geometric_traits;
typedef Skeleton_blocker_geometric_complex< Complex_geometric_traits > Complex;
-
-#endif /* COMPLEX_TYPEDEFS_H_ */
+#endif // MODEL_COMPLEX_TYPEDEFS_H_
diff --git a/src/GudhUI/model/Model.h b/src/GudhUI/model/Model.h
index 6ac971d0..1c39c0d7 100644
--- a/src/GudhUI/model/Model.h
+++ b/src/GudhUI/model/Model.h
@@ -1,16 +1,41 @@
-/*
- * Model.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: Aug 25, 2014
- * Author: david
+ * 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 MODEL_H_
-#define MODEL_H_
+#ifndef MODEL_MODEL_H_
+#define MODEL_MODEL_H_
+
+#include <gudhi/Clock.h>
+#include <gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h>
+#include <gudhi/Skeleton_blocker_geometric_complex.h>
+#include <gudhi/Off_reader.h>
+
+#include <CGAL/Euclidean_distance.h>
#include <fstream>
#include <limits>
-#include "gudhi/Clock.h"
+#include <string>
+#include <vector>
+
#include "utils/UI_utils.h"
#include "utils/Lloyd_builder.h"
#include "utils/Rips_builder.h"
@@ -22,329 +47,309 @@
#include "utils/Critical_points.h"
#include "utils/Is_manifold.h"
-#include "gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h"
-#include "gudhi/Skeleton_blocker_geometric_complex.h"
-
-#include "gudhi/Off_reader.h"
-
#include "Complex_typedefs.h"
-
-#include <CGAL/Euclidean_distance.h>
-
-
template<typename Complex>
-class CGAL_geometric_flag_complex_wrapper{
- Complex& complex_;
- typedef typename Complex::Vertex_handle Vertex_handle;
- typedef typename Complex::Point Point;
-
- const bool load_only_points_;
-
-public:
- CGAL_geometric_flag_complex_wrapper(Complex& complex,bool load_only_points = false):
- complex_(complex),
- load_only_points_(load_only_points){
- }
-
- void init(int dim,int num_vertices,int num_max_faces,int num_edges) const{
- }
-
- void point(const std::vector<double>& coords){
- Point p(coords.size(),coords.begin(),coords.end());
- complex_.add_vertex(p);
- }
-
- 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)
- complex_.add_edge(Vertex_handle(vertices[i]),Vertex_handle(vertices[j]));
- }
- }
- void done() const{}
+class CGAL_geometric_flag_complex_wrapper {
+ Complex& complex_;
+ typedef typename Complex::Vertex_handle Vertex_handle;
+ typedef typename Complex::Point Point;
+
+ const bool load_only_points_;
+
+ public:
+ CGAL_geometric_flag_complex_wrapper(Complex& complex, bool load_only_points = false) :
+ complex_(complex),
+ load_only_points_(load_only_points) { }
+
+ void init(int dim, int num_vertices, int num_max_faces, int num_edges) const { }
+
+ void point(const std::vector<double>& coords) {
+ Point p(coords.size(), coords.begin(), coords.end());
+ complex_.add_vertex(p);
+ }
+
+ 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)
+ complex_.add_edge(Vertex_handle(vertices[i]), Vertex_handle(vertices[j]));
+ }
+ }
+
+ void done() const { }
};
-
-class Model{
-
-public:
- Complex complex_;
- typedef Complex::Vertex_handle Vertex_handle;
- typedef Complex::CVI CVI;
-
-
- Model():complex_(){
- }
-
-public:
- void off_file_open(const std::string& name_file){
- UIDBGMSG("load off file",name_file);
- complex_.clear();
- CGAL_geometric_flag_complex_wrapper<Complex> read_wraper(complex_,false);
- Gudhi::read_off(name_file,read_wraper);
- }
-
- void off_points_open(const std::string& name_file){
- UIDBGMSG("load off points",name_file);
- complex_.clear();
- CGAL_geometric_flag_complex_wrapper<Complex> read_wraper(complex_,true);
- Gudhi::read_off(name_file,read_wraper);
- }
-
- void off_file_save(const std::string& name_file){
- UIDBG("save off file");
- UIDBG("save off off_points_save");
- std::ofstream file(name_file);
- if(file.is_open()){
- file<<"OFF\n";
- file<<complex_.num_vertices()<<" "<<complex_.num_edges()<<" 0\n";
- for(auto v : complex_.vertex_range()){
- const auto& pt(complex_.point(v));
- for(auto it = pt.cartesian_begin();it!=pt.cartesian_end();++it)
- file<<*it<<" ";
- file<<std::endl;
- }
- for(auto e : complex_.edge_range())
- file<<"2 "<<complex_.first_vertex(e)<<" "<<complex_.second_vertex(e)<<"\n";
- file.close();
- }
- else std::cerr << "Could not open file "<<name_file<<std::endl;
-
- }
-
- void off_points_save(const std::string& name_file){
- UIDBG("save off off_points_save");
- std::ofstream file(name_file);
- if(file.is_open()){
- file<<"OFF\n";
- file<<complex_.num_vertices()<<" 0 0\n";
- for(auto v : complex_.vertex_range()){
- const auto& pt(complex_.point(v));
- for(auto it = pt.cartesian_begin();it!=pt.cartesian_end();++it)
- file<<*it<<" ";
- file<<std::endl;
- }
- file.close();
- }
- else std::cerr << "Could not open file "<<name_file<<std::endl;
-
- }
-
- // point sets operations
- void uniform_noise(double amplitude){
- UIDBG("unif noise");
- for (auto v : complex_.vertex_range())
- complex_.point(v) = add_uniform_noise(complex_.point(v),amplitude);
- }
-
-private:
- Point add_uniform_noise(const Point& point,double amplitude){
- std::vector<double> new_point(point.dimension());
- for(int i = 0 ; i < point.dimension();++i){
- new_point[i] = point[i] + (rand() % 2 - .5) * amplitude;
- }
- return Point(point.dimension(), new_point.begin(),new_point.end());
- }
-
-public:
-
- void lloyd(int num_iterations,int num_closest_neighbors){
- UIDBG("lloyd");
- Lloyd_builder<Complex> lloyd_builder(complex_,1);
- }
-
- double squared_eucl_distance(const Point& p1,const Point& p2) const{
- return Geometry_trait::Squared_distance_d()(p1,p2);
- }
-
- // complex operations from points
- void build_rips(double alpha){
- UIDBG("build_rips");
- Rips_builder<Complex> rips_builder(complex_,alpha);
- }
-
- void build_k_nearest_neighbors(unsigned k){
- UIDBG("build_k_nearest");
- complex_.keep_only_vertices();
- K_nearest_builder<Complex> k_nearest_builder(complex_,k);
- }
-
- void build_delaunay(){
- UIDBG("build_delaunay");
- complex_.keep_only_vertices();
- }
-
-
-
- void contract_edges(unsigned num_contractions){
- Clock c;
- Edge_contractor<Complex> contractor(complex_,num_contractions);
- std::cout<<"Time to simplify: "<<c.num_seconds()<<"s"<<std::endl;
- }
-
-
- void collapse_vertices(unsigned num_collapses){
-
- auto old_num_vertices = complex_.num_vertices();
- Vertex_collapsor<Complex> collapsor(complex_,complex_.num_vertices());
- UIDBGMSG("num vertices collapsed:",old_num_vertices - complex_.num_vertices());
- }
-
- void collapse_edges(unsigned num_collapses){
- Edge_collapsor<Complex> collapsor(complex_,num_collapses);
- }
-
-
- void show_graph_stats(){
- std::cout << "++++++ Graph stats +++++++"<< std::endl;
- std::cout << "Num vertices : " << complex_.num_vertices()<<std::endl;
- std::cout << "Num edges : " << complex_.num_edges()<<std::endl;
- std::cout << "Num connected components : " << complex_.num_connected_components()<<std::endl;
- std::cout << "Min/avg/max degree : " << min_degree()<<"/"<<avg_degree()<<"/"<<max_degree()<<std::endl;
- std::cout << "Num connected components : " << complex_.num_connected_components()<<std::endl;
- std::cout << "Num connected components : " << complex_.num_connected_components()<<std::endl;
- std::cout << "+++++++++++++++++++++++++"<< std::endl;
- }
-
-private:
- int min_degree() const{
- int res = (std::numeric_limits<int>::max)();
- for(auto v : complex_.vertex_range())
- res= (std::min)(res,complex_.degree(v));
- return res;
- }
-
- int max_degree() const{
- int res = 0;
- for(auto v : complex_.vertex_range())
- res= (std::max)(res,complex_.degree(v));
- return res;
- }
-
- int avg_degree() const{
- int res = 0;
- for(auto v : complex_.vertex_range())
- res+= complex_.degree(v);
- return res / complex_.num_vertices();
- }
-
-public:
-
-
-
- void show_complex_stats(){
- std::cout << "++++++ Mesh stats +++++++"<< std::endl;
- std::cout << "Num vertices : " << complex_.num_vertices()<<std::endl;
- std::cout << "Num edges : " << complex_.num_edges()<<std::endl;
- std::cout << "Num connected components : " << complex_.num_connected_components()<<std::endl;
- std::cout << "+++++++++++++++++++++++++"<< std::endl;
-
- }
-
- void show_complex_dimension(){
- unsigned num_simplices = 0;
- int euler = 0;
- int dimension = 0;
- Clock clock;
- for(const auto &s : complex_.simplex_range()){
- num_simplices++;
- dimension = (std::max)(s.dimension(),dimension);
- if(s.dimension()%2==0)
- euler+=1;
- else
- euler-=1;
- }
- clock.end();
- std::cout << "++++++ Mesh dimension +++++++"<< std::endl;
- std::cout << "Dimension : " << dimension<<std::endl;
- std::cout << "Euler characteristic : " << euler<<std::endl;
- std::cout << "Num simplices : " << num_simplices <<std::endl;
- std::cout << "Total time: " << clock <<std::endl;
- std::cout << "Time per simplex: " << clock.num_seconds()/num_simplices <<" s"<<std::endl;
- std::cout << "+++++++++++++++++++++++++"<< std::endl;
- }
-
-
- void show_homology_group(){
+class Model {
+ public:
+ Complex complex_;
+ typedef Complex::Vertex_handle Vertex_handle;
+
+ Model() : complex_() { }
+
+ public:
+ void off_file_open(const std::string& name_file) {
+ UIDBGMSG("load off file", name_file);
+ complex_.clear();
+ CGAL_geometric_flag_complex_wrapper<Complex> read_wraper(complex_, false);
+ Gudhi::read_off(name_file, read_wraper);
+ }
+
+ void off_points_open(const std::string& name_file) {
+ UIDBGMSG("load off points", name_file);
+ complex_.clear();
+ CGAL_geometric_flag_complex_wrapper<Complex> read_wraper(complex_, true);
+ Gudhi::read_off(name_file, read_wraper);
+ }
+
+ void off_file_save(const std::string& name_file) {
+ UIDBG("save off file");
+ UIDBG("save off off_points_save");
+ std::ofstream file(name_file);
+ if (file.is_open()) {
+ file << "OFF\n";
+ file << complex_.num_vertices() << " " << complex_.num_edges() << " 0\n";
+ for (auto v : complex_.vertex_range()) {
+ const auto& pt(complex_.point(v));
+ for (auto it = pt.cartesian_begin(); it != pt.cartesian_end(); ++it)
+ file << *it << " ";
+ file << std::endl;
+ }
+ for (auto e : complex_.edge_range())
+ file << "2 " << complex_.first_vertex(e) << " " << complex_.second_vertex(e) << "\n";
+ file.close();
+ } else {
+ std::cerr << "Could not open file " << name_file << std::endl;
+ }
+ }
+
+ void off_points_save(const std::string& name_file) {
+ UIDBG("save off off_points_save");
+ std::ofstream file(name_file);
+ if (file.is_open()) {
+ file << "OFF\n";
+ file << complex_.num_vertices() << " 0 0\n";
+ for (auto v : complex_.vertex_range()) {
+ const auto& pt(complex_.point(v));
+ for (auto it = pt.cartesian_begin(); it != pt.cartesian_end(); ++it)
+ file << *it << " ";
+ file << std::endl;
+ }
+ file.close();
+ } else {
+ std::cerr << "Could not open file " << name_file << std::endl;
+ }
+ }
+
+ // point sets operations
+ void uniform_noise(double amplitude) {
+ UIDBG("unif noise");
+ for (auto v : complex_.vertex_range())
+ complex_.point(v) = add_uniform_noise(complex_.point(v), amplitude);
+ }
+
+ private:
+ Point add_uniform_noise(const Point& point, double amplitude) {
+ std::vector<double> new_point(point.dimension());
+ for (int i = 0; i < point.dimension(); ++i) {
+ new_point[i] = point[i] + (rand() % 2 - .5) * amplitude;
+ }
+ return Point(point.dimension(), new_point.begin(), new_point.end());
+ }
+
+ public:
+ void lloyd(int num_iterations, int num_closest_neighbors) {
+ UIDBG("lloyd");
+ Lloyd_builder<Complex> lloyd_builder(complex_, 1);
+ }
+
+ double squared_eucl_distance(const Point& p1, const Point& p2) const {
+ return Geometry_trait::Squared_distance_d()(p1, p2);
+ }
+
+ // complex operations from points
+
+ void build_rips(double alpha) {
+ UIDBG("build_rips");
+ Rips_builder<Complex> rips_builder(complex_, alpha);
+ }
+
+ void build_k_nearest_neighbors(unsigned k) {
+ UIDBG("build_k_nearest");
+ complex_.keep_only_vertices();
+ K_nearest_builder<Complex> k_nearest_builder(complex_, k);
+ }
+
+ void build_delaunay() {
+ UIDBG("build_delaunay");
+ complex_.keep_only_vertices();
+ }
+
+ void contract_edges(unsigned num_contractions) {
+ Clock c;
+ Edge_contractor<Complex> contractor(complex_, num_contractions);
+ std::cout << "Time to simplify: " << c.num_seconds() << "s" << std::endl;
+ }
+
+ void collapse_vertices(unsigned num_collapses) {
+ auto old_num_vertices = complex_.num_vertices();
+ Vertex_collapsor<Complex> collapsor(complex_, complex_.num_vertices());
+ UIDBGMSG("num vertices collapsed:", old_num_vertices - complex_.num_vertices());
+ }
+
+ void collapse_edges(unsigned num_collapses) {
+ Edge_collapsor<Complex> collapsor(complex_, num_collapses);
+ }
+
+ void show_graph_stats() {
+ std::cout << "++++++ Graph stats +++++++" << std::endl;
+ std::cout << "Num vertices : " << complex_.num_vertices() << std::endl;
+ std::cout << "Num edges : " << complex_.num_edges() << std::endl;
+ std::cout << "Num connected components : " << complex_.num_connected_components() << std::endl;
+ std::cout << "Min/avg/max degree : " << min_degree() << "/" << avg_degree() << "/" << max_degree() << std::endl;
+ std::cout << "Num connected components : " << complex_.num_connected_components() << std::endl;
+ std::cout << "Num connected components : " << complex_.num_connected_components() << std::endl;
+ std::cout << "+++++++++++++++++++++++++" << std::endl;
+ }
+
+ private:
+ int min_degree() const {
+ int res = (std::numeric_limits<int>::max)();
+ for (auto v : complex_.vertex_range())
+ res = (std::min)(res, complex_.degree(v));
+ return res;
+ }
+
+ int max_degree() const {
+ int res = 0;
+ for (auto v : complex_.vertex_range())
+ res = (std::max)(res, complex_.degree(v));
+ return res;
+ }
+
+ int avg_degree() const {
+ int res = 0;
+ for (auto v : complex_.vertex_range())
+ res += complex_.degree(v);
+ return res / complex_.num_vertices();
+ }
+
+ public:
+ void show_complex_stats() {
+ std::cout << "++++++ Mesh stats +++++++" << std::endl;
+ std::cout << "Num vertices : " << complex_.num_vertices() << std::endl;
+ std::cout << "Num edges : " << complex_.num_edges() << std::endl;
+ std::cout << "Num connected components : " << complex_.num_connected_components() << std::endl;
+ std::cout << "+++++++++++++++++++++++++" << std::endl;
+ }
+
+ void show_complex_dimension() {
+ unsigned num_simplices = 0;
+ int euler = 0;
+ int dimension = 0;
+ Clock clock;
+ for (const auto &s : complex_.complex_simplex_range()) {
+ num_simplices++;
+ dimension = (std::max)(s.dimension(), dimension);
+ if (s.dimension() % 2 == 0)
+ euler += 1;
+ else
+ euler -= 1;
+ }
+ clock.end();
+ std::cout << "++++++ Mesh dimension +++++++" << std::endl;
+ std::cout << "Dimension : " << dimension << std::endl;
+ std::cout << "Euler characteristic : " << euler << std::endl;
+ std::cout << "Num simplices : " << num_simplices << std::endl;
+ std::cout << "Total time: " << clock << std::endl;
+ std::cout << "Time per simplex: " << clock.num_seconds() / num_simplices << " s" << std::endl;
+ std::cout << "+++++++++++++++++++++++++" << std::endl;
+ }
+
+ void show_homology_group() {
#ifdef _WIN32
- std::cout << "Works only on linux x64 for the moment\n";
+ std::cout << "Works only on linux x64 for the moment\n";
#else
- Clock clock;
- run_chomp();
- clock.end();
+ Clock clock;
+ run_chomp();
+ clock.end();
#endif
- }
-
- void show_euler_characteristic(){
- unsigned num_simplices = 0;
- int euler = 0;
- int dimension = 0;
- for(const auto &s : complex_.simplex_range()){
- num_simplices++;
- dimension = (std::max)(s.dimension(),dimension);
- if(s.dimension()%2==0)
- euler+=1;
- else
- euler-=1;
- }
- std::cout << "Saw "<<num_simplices<<" simplices with maximum dimension " << dimension<<std::endl;
- std::cout << "The euler characteristic is : " << euler<<std::endl;
- }
-
- void show_persistence( int p,double threshold,int max_dim,double min_pers){
- Persistence_compute<Complex> persistence(complex_,std::cout,Persistence_params(p,threshold,max_dim,min_pers));
- }
-
- void show_critical_points(double max_distance){
- Critical_points<Complex> critical_points(complex_,std::cout,max_distance);
- }
-
- void show_is_manifold(){
- unsigned dim;
- bool is_manifold;
- Is_manifold<Complex> test_manifold(complex_,dim,is_manifold);
-
- if(is_manifold) std::cout << "The complex is a "<<dim<<"-manifold\n";
- else
- if(dim<4) std::cout << "The complex has dimension greater than "<<dim<<" and is not a manifold\n";
- else std::cout << "The complex has dimension>=4 and may or may not be a manifold\n";
- }
-
-
-private:
- void run_chomp(){
- save_complex_in_file_for_chomp();
- std::cout << "Call CHOMP library\n";
- system("../src/utils/homsimpl chomp.sim");
- }
-
- void save_complex_in_file_for_chomp(){
- std::ofstream file;
- file.open("chomp.sim");
- for(const auto &s : complex_.simplex_range()){
- bool first = true;
- file<<"(";
- for(auto x : s){
- if(first) first = false;
- else file<<",";
- file << x;
- }
- file<<")\n";
- }
- }
-public:
-
-
- unsigned num_vertices() const{
- return complex_.num_vertices();
- }
-
- unsigned num_edges() const{
- return complex_.num_edges();
- }
-
+ }
+
+ void show_euler_characteristic() {
+ unsigned num_simplices = 0;
+ int euler = 0;
+ int dimension = 0;
+ for (const auto &s : complex_.complex_simplex_range()) {
+ num_simplices++;
+ dimension = (std::max)(s.dimension(), dimension);
+ if (s.dimension() % 2 == 0)
+ euler += 1;
+ else
+ euler -= 1;
+ }
+ std::cout << "Saw " << num_simplices << " simplices with maximum dimension " << dimension << std::endl;
+ std::cout << "The euler characteristic is : " << euler << std::endl;
+ }
+
+ void show_persistence(int p, double threshold, int max_dim, double min_pers) {
+ Persistence_compute<Complex> persistence(complex_, std::cout, Persistence_params(p, threshold, max_dim, min_pers));
+ }
+
+ void show_critical_points(double max_distance) {
+ Critical_points<Complex> critical_points(complex_, std::cout, max_distance);
+ }
+
+ void show_is_manifold() {
+ unsigned dim;
+ bool is_manifold;
+ Is_manifold<Complex> test_manifold(complex_, dim, is_manifold);
+
+ if (is_manifold) {
+ std::cout << "The complex is a " << dim << "-manifold\n";
+ } else {
+ if (dim < 4) {
+ std::cout << "The complex has dimension greater than " << dim << " and is not a manifold\n";
+ } else {
+ std::cout << "The complex has dimension>=4 and may or may not be a manifold\n";
+ }
+ }
+ }
+
+ private:
+ void run_chomp() {
+ save_complex_in_file_for_chomp();
+ std::cout << "Call CHOMP library\n";
+ int returnValue = system("utils/homsimpl chomp.sim");
+ std::cout << "CHOMP returns" << returnValue << std::endl;
+ }
+
+ void save_complex_in_file_for_chomp() {
+ std::ofstream file;
+ file.open("chomp.sim");
+ for (const auto &s : complex_.complex_simplex_range()) {
+ bool first = true;
+ file << "(";
+ for (auto x : s) {
+ if (first)
+ first = false;
+ else
+ file << ",";
+ file << x;
+ }
+ file << ")\n";
+ }
+ }
+
+ public:
+ unsigned num_vertices() const {
+ return complex_.num_vertices();
+ }
+
+ unsigned num_edges() const {
+ return complex_.num_edges();
+ }
};
-#endif /* MODEL_H_ */
+#endif // MODEL_MODEL_H_
diff --git a/src/GudhUI/utils/Bar_code_persistence.h b/src/GudhUI/utils/Bar_code_persistence.h
new file mode 100644
index 00000000..b527d684
--- /dev/null
+++ b/src/GudhUI/utils/Bar_code_persistence.h
@@ -0,0 +1,90 @@
+#include <math.h> // isfinite
+
+#include <QtGui/QApplication>
+
+#include <QGraphicsView>
+#include <QGraphicsScene>
+#include <QPointF>
+#include <QVector>
+#include <QGraphicsTextItem>
+
+#include <iostream>
+#include <vector>
+#include <limits> // NaN, infinity
+#include <utility> // for pair
+#include <string>
+
+#ifndef UTILS_BAR_CODE_PERSISTENCE_H_
+#define UTILS_BAR_CODE_PERSISTENCE_H_
+
+class Bar_code_persistence {
+ private:
+ typedef std::vector<std::pair<double, double>> Persistence;
+ Persistence persistence_vector;
+ double min_birth;
+ double max_death;
+
+ public:
+ Bar_code_persistence()
+ : min_birth(std::numeric_limits<double>::quiet_NaN()),
+ max_death(std::numeric_limits<double>::quiet_NaN()) { }
+
+ void insert(double birth, double death) {
+ persistence_vector.push_back(std::make_pair(birth, death));
+ if (std::isfinite(birth)) {
+ if ((birth < min_birth) || (std::isnan(min_birth)))
+ min_birth = birth;
+ if ((birth > max_death) || (std::isnan(max_death)))
+ max_death = birth;
+ }
+ if (std::isfinite(death))
+ if ((death > max_death) || (std::isnan(max_death)))
+ max_death = death;
+ }
+
+ void show(const std::string& window_title) {
+ // Create a view, put a scene in it
+ QGraphicsView * view = new QGraphicsView();
+ QGraphicsScene * scene = new QGraphicsScene();
+ view->setScene(scene);
+ double ratio = 600.0 / (max_death - min_birth);
+ // std::cout << "min_birth=" << min_birth << " - max_death=" << max_death << " - ratio=" << ratio << std::endl;
+
+ double height = 0.0, birth = 0.0, death = 0.0;
+ int pers_num = 1;
+ for (auto& persistence : persistence_vector) {
+ height = 5.0 * pers_num;
+ // std::cout << "[" << pers_num << "] birth=" << persistence.first << " - death=" << persistence.second << std::endl;
+ if (std::isfinite(persistence.first))
+ birth = ((persistence.first - min_birth) * ratio) + 50.0;
+ else
+ birth = 0.0;
+
+ if (std::isfinite(persistence.second))
+ death = ((persistence.second - min_birth) * ratio) + 50.0;
+ else
+ death = 700.0;
+
+ scene->addLine(birth, height, death, height, QPen(Qt::blue, 2));
+ pers_num++;
+ }
+ height += 10.0;
+ // scale line
+ scene->addLine(0, height, 700.0, height, QPen(Qt::black, 1));
+ int modulo = 0;
+ for (double scale = 50.0; scale < 700.0; scale += 50.0) {
+ modulo++;
+ // scale small dash
+ scene->addLine(scale, height - 3.0, scale, height + 3.0, QPen(Qt::black, 1));
+ // scale text
+ QString scale_value = QString::number(((scale - 50.0) / ratio) + min_birth);
+ QGraphicsTextItem* dimText = scene->addText(scale_value, QFont("Helvetica", 8));
+ dimText->setPos(scale - (3.0 * scale_value.size()), height + 9.0 * (modulo % 2));
+ }
+ view->setWindowTitle(window_title.c_str());
+ // Show the view
+ view->show();
+ }
+};
+
+#endif // UTILS_BAR_CODE_PERSISTENCE_H_
diff --git a/src/GudhUI/utils/Critical_points.h b/src/GudhUI/utils/Critical_points.h
index 92392d4a..3021a5fe 100644
--- a/src/GudhUI/utils/Critical_points.h
+++ b/src/GudhUI/utils/Critical_points.h
@@ -1,13 +1,10 @@
-/*
- * Critical_points.h
- * Created on: Jan 27, 2015
- * This file is part of the Gudhi Library. The Gudhi library
+/* 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-Méditerranée (France)
+ * 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
@@ -24,11 +21,13 @@
*
*/
-
-#ifndef CRITICAL_POINTS_H_
-#define CRITICAL_POINTS_H_
+#ifndef UTILS_CRITICAL_POINTS_H_
+#define UTILS_CRITICAL_POINTS_H_
#include <deque>
+#include <utility> // for pair<>
+#include <algorithm> // for sort
+
#include "utils/Edge_contractor.h"
/**
@@ -37,101 +36,97 @@
*
* todo do a sparsification with some parameter eps while growing
*/
-template<typename SkBlComplex> class Critical_points{
-private:
- SkBlComplex filled_complex_;
- const SkBlComplex& input_complex_;
- double max_length_;
- std::ostream& stream_;
-public:
- typedef typename SkBlComplex::Vertex_handle Vertex_handle;
- typedef typename SkBlComplex::Edge_handle Edge_handle;
- typedef typename std::pair<Vertex_handle,Vertex_handle> Edge;
-
- /**
- * @brief check all pair of points with length smaller than max_length
- */
- Critical_points(const SkBlComplex& input_complex,std::ostream& stream,double max_length):
- input_complex_(input_complex),max_length_(max_length),stream_(stream)
- {
-
- std::deque<Edge> edges;
- auto vertices = input_complex.vertex_range();
- for(auto p = vertices.begin(); p!= vertices.end(); ++p){
- filled_complex_.add_vertex(input_complex.point(*p));
- for (auto q = p; ++q != vertices.end(); /**/)
- if (squared_eucl_distance(input_complex.point(*p),input_complex.point(*q)) < max_length_*max_length_)
- edges.emplace_back(*p,*q);
- }
-
- std::sort(edges.begin(),edges.end(),
- [&](Edge e1,Edge e2){
- return squared_edge_length(e1) < squared_edge_length(e2);
- });
-
- anti_collapse_edges(edges);
-
- }
-
-private:
- double squared_eucl_distance(const Point& p1,const Point& p2) const{
- return Geometry_trait::Squared_distance_d()(p1,p2);
- }
-
-
- void anti_collapse_edges(const std::deque<Edge>& edges){
- unsigned pos = 0;
- for(Edge e : edges){
- std::cout<<"edge "<<pos++<<"/"<<edges.size()<<"\n";
- auto eh = filled_complex_.add_edge(e.first,e.second);
- int is_contractible(is_link_reducible(eh));
-
- switch (is_contractible) {
- case 0:
- stream_<<"alpha="<<std::sqrt(squared_edge_length(e))<< " topological change"<<std::endl;
- break;
- case 2:
- stream_<<"alpha="<<std::sqrt(squared_edge_length(e))<< " maybe a topological change"<<std::endl;
- break;
- default:
- break;
- }
- }
-
- }
-
-
- //0 -> not
- //1 -> yes
- //2 -> maybe
- int is_link_reducible(Edge_handle e){
- auto link = filled_complex_.link(e);
-
- if(link.empty()) return 0;
-
- Edge_contractor<Complex> contractor(link,link.num_vertices()-1);
-
- if(link.num_connected_components()>1) return 0; //one than more CC -> not contractible
-
- if (link.num_vertices()==1) return 1; //reduced to one point -> contractible
- else return 2; //we dont know
- }
-
-
- double squared_edge_length(Edge_handle e) const{
- return squared_eucl_distance(input_complex_.point(input_complex_.first_vertex(e)),input_complex_.point(input_complex_.second_vertex(e)));
- }
-
- double squared_edge_length(Edge e) const{
- return squared_eucl_distance(input_complex_.point(e.first),input_complex_.point(e.second));
- }
-
-
-
+template<typename SkBlComplex> class Critical_points {
+ private:
+ SkBlComplex filled_complex_;
+ const SkBlComplex& input_complex_;
+ double max_length_;
+ std::ostream& stream_;
+
+ public:
+ typedef typename SkBlComplex::Vertex_handle Vertex_handle;
+ typedef typename SkBlComplex::Edge_handle Edge_handle;
+ typedef typename std::pair<Vertex_handle, Vertex_handle> Edge;
+
+ /**
+ * @brief check all pair of points with length smaller than max_length
+ */
+ Critical_points(const SkBlComplex& input_complex, std::ostream& stream, double max_length) :
+ input_complex_(input_complex), max_length_(max_length), stream_(stream) {
+ std::deque<Edge> edges;
+ auto vertices = input_complex.vertex_range();
+ for (auto p = vertices.begin(); p != vertices.end(); ++p) {
+ filled_complex_.add_vertex(input_complex.point(*p));
+ for (auto q = p; ++q != vertices.end(); /**/)
+ if (squared_eucl_distance(input_complex.point(*p), input_complex.point(*q)) < max_length_ * max_length_)
+ edges.emplace_back(*p, *q);
+ }
+
+ std::sort(edges.begin(), edges.end(),
+ [&](Edge e1, Edge e2) {
+ return squared_edge_length(e1) < squared_edge_length(e2);
+ });
+
+ anti_collapse_edges(edges);
+ }
+
+ private:
+ double squared_eucl_distance(const Point& p1, const Point& p2) const {
+ return Geometry_trait::Squared_distance_d()(p1, p2);
+ }
+
+ void anti_collapse_edges(const std::deque<Edge>& edges) {
+ unsigned pos = 0;
+ for (Edge e : edges) {
+ std::cout << "edge " << pos++ << "/" << edges.size() << "\n";
+ auto eh = filled_complex_.add_edge(e.first, e.second);
+ int is_contractible(is_link_reducible(eh));
+
+ switch (is_contractible) {
+ case 0:
+ stream_ << "alpha=" << std::sqrt(squared_edge_length(e)) << " topological change" << std::endl;
+ break;
+ case 2:
+ stream_ << "alpha=" << std::sqrt(squared_edge_length(e)) << " maybe a topological change" << std::endl;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ // 0 -> not
+ // 1 -> yes
+ // 2 -> maybe
+
+ int is_link_reducible(Edge_handle e) {
+ auto link = filled_complex_.link(e);
+
+ if (link.empty())
+ return 0;
+
+ Edge_contractor<Complex> contractor(link, link.num_vertices() - 1);
+
+ if (link.num_connected_components() > 1)
+ // one than more CC -> not contractible
+ return 0;
+
+ if (link.num_vertices() == 1)
+ // reduced to one point -> contractible
+ return 1;
+ else
+ // we dont know
+ return 2;
+ }
+
+ double squared_edge_length(Edge_handle e) const {
+ return squared_eucl_distance(input_complex_.point(input_complex_.first_vertex(e)),
+ input_complex_.point(input_complex_.second_vertex(e)));
+ }
+
+ double squared_edge_length(Edge e) const {
+ return squared_eucl_distance(input_complex_.point(e.first), input_complex_.point(e.second));
+ }
};
-
-
-
-
-#endif /* CRITICAL_POINTS_H_ */
+#endif // UTILS_CRITICAL_POINTS_H_
diff --git a/src/GudhUI/utils/Edge_collapsor.h b/src/GudhUI/utils/Edge_collapsor.h
index 4dcd18ac..151e9b01 100644
--- a/src/GudhUI/utils/Edge_collapsor.h
+++ b/src/GudhUI/utils/Edge_collapsor.h
@@ -1,12 +1,28 @@
-/*
- * Collapsor.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: Sep 25, 2014
- * Author: dsalinas
+ * 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 COLLAPSOR_H_
-#define COLLAPSOR_H_
+#ifndef UTILS_EDGE_COLLAPSOR_H_
+#define UTILS_EDGE_COLLAPSOR_H_
#include <list>
#include "utils/Edge_contractor.h"
@@ -15,71 +31,67 @@
/**
* Iteratively puts every vertex at the center of its neighbors
*/
-template<typename SkBlComplex> class Edge_collapsor{
-private:
- SkBlComplex& complex_;
- unsigned num_collapses_;
-public:
- typedef typename SkBlComplex::Vertex_handle Vertex_handle;
- typedef typename SkBlComplex::Edge_handle Edge_handle;
-
- /**
- * @brief Collapse num_collapses edges. If num_collapses<0 then it collapses all possible edges.
- * Largest edges are collapsed first.
- *
- */
- Edge_collapsor(SkBlComplex& complex,unsigned num_collapses):
- complex_(complex),num_collapses_(num_collapses)
- {
- std::list<Edge_handle> edges;
- edges.insert(edges.begin(),complex_.edge_range().begin(),complex_.edge_range().end());
-
- edges.sort(
- [&](Edge_handle e1,Edge_handle e2){
- return squared_edge_length(e1) < squared_edge_length(e2);
- });
-
- collapse_edges(edges);
-
- }
-
-private:
-
- void collapse_edges(std::list<Edge_handle>& edges){
- while(!edges.empty() && num_collapses_--){
- Edge_handle current_edge = edges.front();
- edges.pop_front();
- if(is_link_reducible(current_edge))
- complex_.remove_edge(current_edge);
- }
-
- }
-
- bool is_link_reducible(Edge_handle e){
- auto link = complex_.link(e);
-
- if(link.empty()) return false;
-
- if(link.is_cone()) return true;
-
- if(link.num_connected_components()>1) return false;
-
- Edge_contractor<SkBlComplex> contractor(link,link.num_vertices()-1);
-
- return (link.num_vertices()==1);
- }
-
-
- double squared_edge_length(Edge_handle e) const{
- return squared_eucl_distance(complex_.point(complex_.first_vertex(e)),complex_.point(complex_.second_vertex(e)));
- }
-
- double squared_eucl_distance(const Point& p1,const Point& p2) const{
- return Geometry_trait::Squared_distance_d()(p1,p2);
- }
-
+template<typename SkBlComplex> class Edge_collapsor {
+ private:
+ SkBlComplex& complex_;
+ unsigned num_collapses_;
+
+ public:
+ typedef typename SkBlComplex::Vertex_handle Vertex_handle;
+ typedef typename SkBlComplex::Edge_handle Edge_handle;
+
+ /**
+ * @brief Collapse num_collapses edges. If num_collapses<0 then it collapses all possible edges.
+ * Largest edges are collapsed first.
+ *
+ */
+ Edge_collapsor(SkBlComplex& complex, unsigned num_collapses) :
+ complex_(complex), num_collapses_(num_collapses) {
+ std::list<Edge_handle> edges;
+ edges.insert(edges.begin(), complex_.edge_range().begin(), complex_.edge_range().end());
+
+ edges.sort(
+ [&](Edge_handle e1, Edge_handle e2) {
+ return squared_edge_length(e1) < squared_edge_length(e2);
+ });
+
+ collapse_edges(edges);
+ }
+
+ private:
+ void collapse_edges(std::list<Edge_handle>& edges) {
+ while (!edges.empty() && num_collapses_--) {
+ Edge_handle current_edge = edges.front();
+ edges.pop_front();
+ if (is_link_reducible(current_edge))
+ complex_.remove_edge(current_edge);
+ }
+ }
+
+ bool is_link_reducible(Edge_handle e) {
+ auto link = complex_.link(e);
+
+ if (link.empty())
+ return false;
+
+ if (link.is_cone())
+ return true;
+
+ if (link.num_connected_components() > 1)
+ return false;
+
+ Edge_contractor<SkBlComplex> contractor(link, link.num_vertices() - 1);
+
+ return (link.num_vertices() == 1);
+ }
+
+ double squared_edge_length(Edge_handle e) const {
+ return squared_eucl_distance(complex_.point(complex_.first_vertex(e)), complex_.point(complex_.second_vertex(e)));
+ }
+
+ double squared_eucl_distance(const Point& p1, const Point& p2) const {
+ return Geometry_trait::Squared_distance_d()(p1, p2);
+ }
};
-
-
-#endif /* COLLAPSOR_H_ */
+#endif // UTILS_EDGE_COLLAPSOR_H_
diff --git a/src/GudhUI/utils/Edge_contractor.h b/src/GudhUI/utils/Edge_contractor.h
index d0a1f866..45079a40 100644
--- a/src/GudhUI/utils/Edge_contractor.h
+++ b/src/GudhUI/utils/Edge_contractor.h
@@ -1,85 +1,97 @@
-/*
- * Contractor.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: Sep 25, 2014
- * Author: dsalinas
+ * 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 EDGE_CONTRACTOR_H_
-#define EDGE_CONTRACTOR_H_
+#ifndef UTILS_EDGE_CONTRACTOR_H_
+#define UTILS_EDGE_CONTRACTOR_H_
-#include "gudhi/Skeleton_blocker_contractor.h"
-
-#include "gudhi/Contraction/Edge_profile.h"
-#include "gudhi/Contraction/policies/Cost_policy.h"
+#include <gudhi/Skeleton_blocker_contractor.h>
+#include <gudhi/Contraction/Edge_profile.h>
+#include <gudhi/Contraction/policies/Cost_policy.h>
+#include <vector>
/**
* Iteratively puts every vertex at the center of its neighbors
*/
-template<typename SkBlComplex> class Edge_contractor{
-private:
- SkBlComplex& complex_;
- unsigned num_contractions_;
-
- /**
- * @brief return a cost corresponding to the squared length of the edge
- */
- template< typename EdgeProfile> class Length_cost : public contraction::Cost_policy<EdgeProfile>{
- public:
- typedef typename contraction::Cost_policy<EdgeProfile>::Cost_type Cost_type;
- typedef typename EdgeProfile::Point Point;
- Cost_type operator()(const EdgeProfile& profile, const boost::optional<Point>& placement) const override{
- Cost_type res;
- if(!placement) return res;
- return Geometry_trait::Squared_distance_d()(profile.p0(),profile.p1()); //not working??
- }
- };
-
-
- /**
- * @brief return a cost corresponding to the squared length of the edge
- */
- template< typename EdgeProfile> class Middle_placement : public contraction::Placement_policy<EdgeProfile>{
- public:
- typedef typename contraction::Placement_policy<EdgeProfile>::Placement_type Placement_type;
- typedef typename EdgeProfile::Point Point;
- 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){
- mid_coords[i] = (profile.p0()[i] + profile.p1()[i]) / 2.;
- }
- return Point(profile.p0().dimension(),mid_coords.begin(), mid_coords.end());
- }
- };
-
- public:
- typedef typename SkBlComplex::Vertex_handle Vertex_handle;
- typedef typename SkBlComplex::Edge_handle Edge_handle;
-
- /**
- * @brief Modify complex to be the expansion of the k-nearest neighbor
- * symetric graph.
- */
- Edge_contractor(SkBlComplex& complex,unsigned num_contractions):
- complex_(complex),num_contractions_(num_contractions)
- {
- typedef typename contraction::Edge_profile<Complex> Profile;
- num_contractions = (std::min)((int)num_contractions,(int)(complex_.num_vertices()-1));
- contraction::Skeleton_blocker_contractor<Complex> contractor(
- complex_,
- new Length_cost<contraction::Edge_profile<Complex>>(),
- new Middle_placement<contraction::Edge_profile<Complex>>(),
- contraction::make_link_valid_contraction<Profile>(),
- contraction::make_remove_popable_blockers_visitor<Profile>()
- );
- contractor.contract_edges(num_contractions);
- }
-
-
+template<typename SkBlComplex> class Edge_contractor {
+ private:
+ SkBlComplex& complex_;
+ unsigned num_contractions_;
+
+ /**
+ * @brief return a cost corresponding to the squared length of the edge
+ */
+ template< typename EdgeProfile> class Length_cost : public contraction::Cost_policy<EdgeProfile> {
+ public:
+ typedef typename contraction::Cost_policy<EdgeProfile>::Cost_type Cost_type;
+ typedef typename EdgeProfile::Point Point;
+
+ Cost_type operator()(const EdgeProfile& profile, const boost::optional<Point>& placement) const override {
+ Cost_type res;
+ if (!placement)
+ return res;
+ return Geometry_trait::Squared_distance_d()(profile.p0(), profile.p1()); // not working??
+ }
+ };
+
+ /**
+ * @brief return a cost corresponding to the squared length of the edge
+ */
+ template< typename EdgeProfile> class Middle_placement : public contraction::Placement_policy<EdgeProfile> {
+ public:
+ typedef typename contraction::Placement_policy<EdgeProfile>::Placement_type Placement_type;
+ typedef typename EdgeProfile::Point Point;
+
+ 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) {
+ mid_coords[i] = (profile.p0()[i] + profile.p1()[i]) / 2.;
+ }
+ return Point(profile.p0().dimension(), mid_coords.begin(), mid_coords.end());
+ }
+ };
+
+ public:
+ typedef typename SkBlComplex::Vertex_handle Vertex_handle;
+ typedef typename SkBlComplex::Edge_handle Edge_handle;
+
+ /**
+ * @brief Modify complex to be the expansion of the k-nearest neighbor
+ * symetric graph.
+ */
+ Edge_contractor(SkBlComplex& complex, unsigned num_contractions) :
+ complex_(complex), num_contractions_(num_contractions) {
+ typedef typename contraction::Edge_profile<Complex> Profile;
+ num_contractions = (std::min)(static_cast<int>(num_contractions), static_cast<int>(complex_.num_vertices() - 1));
+ typedef typename contraction::Skeleton_blocker_contractor<Complex> Contractor;
+ Contractor contractor(complex_,
+ new Length_cost<contraction::Edge_profile < Complex >> (),
+ new Middle_placement<contraction::Edge_profile < Complex >> (),
+ contraction::make_link_valid_contraction<Profile>(),
+ contraction::make_remove_popable_blockers_visitor<Profile>());
+ contractor.contract_edges(num_contractions);
+ }
};
-
-
-#endif /* EDGE_CONTRACTOR_H_ */
+#endif // UTILS_EDGE_CONTRACTOR_H_
diff --git a/src/GudhUI/utils/Furthest_point_epsilon_net.h b/src/GudhUI/utils/Furthest_point_epsilon_net.h
index 590b65c4..f2a216f6 100644
--- a/src/GudhUI/utils/Furthest_point_epsilon_net.h
+++ b/src/GudhUI/utils/Furthest_point_epsilon_net.h
@@ -1,134 +1,132 @@
-/*
- * Furthest_point_epsilon_net.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: Sep 26, 2014
- * Author: dsalinas
+ * 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 FURTHEST_POINT_EPSILON_NET_H_
-#define FURTHEST_POINT_EPSILON_NET_H_
+#ifndef UTILS_FURTHEST_POINT_EPSILON_NET_H_
+#define UTILS_FURTHEST_POINT_EPSILON_NET_H_
-#include "utils/UI_utils.h"
#include <vector>
+#include <algorithm> // for sort
+
+#include "utils/UI_utils.h"
/**
* Computes an epsilon net with furthest point strategy.
*/
-template<typename SkBlComplex> class Furthest_point_epsilon_net{
-private:
- SkBlComplex& complex_;
- typedef typename SkBlComplex::Vertex_handle Vertex_handle;
- typedef typename SkBlComplex::Edge_handle Edge_handle;
-
- /**
- * Let V be the set of vertices.
- * Initially v0 is one arbitrarly vertex and the set V0 is {v0}.
- * Then Vk is computed as follows.
- * First we compute the vertex pk that is the furthest from Vk
- * then Vk = Vk \cup pk.
- * The radius of pk is its distance to Vk and its meeting vertex
- * is the vertex of Vk for which this distance is achieved.
- */
- struct Net_filtration_vertex{
- Vertex_handle vertex_handle;
- Vertex_handle meeting_vertex;
- double radius;
-
-
- Net_filtration_vertex(
- Vertex_handle vertex_handle_,
- Vertex_handle meeting_vertex_,
- double radius_):
- vertex_handle(vertex_handle_),meeting_vertex(meeting_vertex_),radius(radius_)
- {}
-
- bool operator<(const Net_filtration_vertex& other ) const{
- return radius < other.radius;
- }
-
- };
-
-public:
-
-
- std::vector<Net_filtration_vertex> net_filtration_;
-
- /**
- * @brief Modify complex to be the expansion of the k-nearest neighbor
- * symetric graph.
- */
- Furthest_point_epsilon_net(SkBlComplex& complex):
- complex_(complex)
- {
- if(!complex.empty()){
- init_filtration();
- for(int k = 2; k < net_filtration_.size(); ++k){
- update_radius_value(k);
- }
- }
- }
-
- //xxx does not work if complex not full
- double radius(Vertex_handle v){
- return net_filtration_[v.vertex].radius;
- }
-
-
-
-
-private:
-
- void init_filtration(){
- Vertex_handle v0 = *(complex_.vertex_range().begin());
- net_filtration_.reserve(complex_.num_vertices());
- for(auto v : complex_.vertex_range()){
- if(v != v0)
- net_filtration_.push_back(
- Net_filtration_vertex(v,
- Vertex_handle(-1),
- squared_eucl_distance(v,v0))
- );
- }
- net_filtration_.push_back(Net_filtration_vertex(v0,Vertex_handle(-1),1e10));
- auto n = net_filtration_.size();
- sort_filtration(n-1);
- }
-
- void update_radius_value(int k){
- int n = net_filtration_.size();
- int index_to_update = n-k;
- for(int i = 0; i< index_to_update; ++i){
- net_filtration_[i].radius = (std::min)(net_filtration_[i].radius ,
- squared_eucl_distance(
- net_filtration_[i].vertex_handle,
- net_filtration_[index_to_update].vertex_handle
- )
- );
- }
- sort_filtration(n-k);
- }
-
- /**
- * sort all i first elements.
- */
- void sort_filtration(int i){
- std::sort(net_filtration_.begin(),net_filtration_.begin()+ i);
- }
-
- double squared_eucl_distance(Vertex_handle v1,Vertex_handle v2) const{
- return std::sqrt(Geometry_trait::Squared_distance_d()(
- complex_.point(v1),complex_.point(v2))
- );
- }
-
- void print_filtration() const{
- for(auto v : net_filtration_){
- std::cerr <<"v="<<v.vertex_handle<<"-> d="<<v.radius<<std::endl;
- }
- }
-
+template<typename SkBlComplex> class Furthest_point_epsilon_net {
+ private:
+ SkBlComplex& complex_;
+ typedef typename SkBlComplex::Vertex_handle Vertex_handle;
+ typedef typename SkBlComplex::Edge_handle Edge_handle;
+
+ /**
+ * Let V be the set of vertices.
+ * Initially v0 is one arbitrarly vertex and the set V0 is {v0}.
+ * Then Vk is computed as follows.
+ * First we compute the vertex pk that is the furthest from Vk
+ * then Vk = Vk \cup pk.
+ * The radius of pk is its distance to Vk and its meeting vertex
+ * is the vertex of Vk for which this distance is achieved.
+ */
+ struct Net_filtration_vertex {
+ Vertex_handle vertex_handle;
+ Vertex_handle meeting_vertex;
+ double radius;
+
+ Net_filtration_vertex(Vertex_handle vertex_handle_,
+ Vertex_handle meeting_vertex_,
+ double radius_) :
+ vertex_handle(vertex_handle_), meeting_vertex(meeting_vertex_), radius(radius_) { }
+
+ bool operator<(const Net_filtration_vertex& other) const {
+ return radius < other.radius;
+ }
+ };
+
+ public:
+ std::vector<Net_filtration_vertex> net_filtration_;
+
+ /**
+ * @brief Modify complex to be the expansion of the k-nearest neighbor
+ * symetric graph.
+ */
+ Furthest_point_epsilon_net(SkBlComplex& complex) :
+ complex_(complex) {
+ if (!complex.empty()) {
+ init_filtration();
+ for (int k = 2; k < net_filtration_.size(); ++k) {
+ update_radius_value(k);
+ }
+ }
+ }
+
+ // xxx does not work if complex not full
+
+ double radius(Vertex_handle v) {
+ return net_filtration_[v.vertex].radius;
+ }
+
+ private:
+ void init_filtration() {
+ Vertex_handle v0 = *(complex_.vertex_range().begin());
+ net_filtration_.reserve(complex_.num_vertices());
+ for (auto v : complex_.vertex_range()) {
+ if (v != v0)
+ net_filtration_.push_back(Net_filtration_vertex(v,
+ Vertex_handle(-1),
+ squared_eucl_distance(v, v0)));
+ }
+ net_filtration_.push_back(Net_filtration_vertex(v0, Vertex_handle(-1), 1e10));
+ auto n = net_filtration_.size();
+ sort_filtration(n - 1);
+ }
+
+ void update_radius_value(int k) {
+ int n = net_filtration_.size();
+ int index_to_update = n - k;
+ for (int i = 0; i < index_to_update; ++i) {
+ net_filtration_[i].radius = (std::min)(net_filtration_[i].radius,
+ squared_eucl_distance(net_filtration_[i].vertex_handle,
+ net_filtration_[index_to_update].vertex_handle));
+ }
+ sort_filtration(n - k);
+ }
+
+ /**
+ * sort all i first elements.
+ */
+ void sort_filtration(int i) {
+ std::sort(net_filtration_.begin(), net_filtration_.begin() + i);
+ }
+
+ double squared_eucl_distance(Vertex_handle v1, Vertex_handle v2) const {
+ return std::sqrt(Geometry_trait::Squared_distance_d()(complex_.point(v1), complex_.point(v2)));
+ }
+
+ void print_filtration() const {
+ for (auto v : net_filtration_) {
+ std::cerr << "v=" << v.vertex_handle << "-> d=" << v.radius << std::endl;
+ }
+ }
};
-
-
-#endif /* FURTHEST_POINT_EPSILON_NET_H_ */
+#endif // UTILS_FURTHEST_POINT_EPSILON_NET_H_
diff --git a/src/GudhUI/utils/Is_manifold.h b/src/GudhUI/utils/Is_manifold.h
index e708a6a4..0640ea47 100644
--- a/src/GudhUI/utils/Is_manifold.h
+++ b/src/GudhUI/utils/Is_manifold.h
@@ -7,7 +7,7 @@
*
* Author(s): David Salinas
*
- * Copyright (C) 2014 INRIA Sophia Antipolis-Méditerranée (France)
+ * 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
@@ -25,11 +25,10 @@
*/
-#ifndef IS_MANIFOLD_H_
-#define IS_MANIFOLD_H_
+#ifndef UTILS_IS_MANIFOLD_H_
+#define UTILS_IS_MANIFOLD_H_
#include "utils/UI_utils.h"
-
#include "utils/Edge_contractor.h"
/**
@@ -38,67 +37,67 @@
*
* todo do a sparsification with some parameter eps while growing
*/
-template<typename SkBlComplex> class Is_manifold{
-private:
- const SkBlComplex& input_complex_;
- typedef typename SkBlComplex::Vertex_handle Vertex_handle;
+template<typename SkBlComplex> class Is_manifold {
+ private:
+ const SkBlComplex& input_complex_;
+ typedef typename SkBlComplex::Vertex_handle Vertex_handle;
+ public:
+ /*
+ * return dim the maximum dimension around one simplex and res which is true if the complex is a manifold.
+ * If the complex has dimension <= 3 then if res is false, the complex is not a manifold.
+ * For d-manifold with d>=4, res may be false while the complex is a manifold.
+ */
+ Is_manifold(const SkBlComplex& input_complex, unsigned& dim, bool & res) : input_complex_(input_complex) {
+ res = true;
+ dim = -1;
+ if (!input_complex_.empty()) {
+ for (auto v : input_complex_.vertex_range()) {
+ dim = local_dimension(v);
+ break;
+ }
+ // check that the link of every vertex is a dim-1 sphere
+ for (auto v : input_complex_.vertex_range()) {
+ if (!is_k_sphere(v, dim - 1)) {
+ res = false;
+ break;
+ }
+ }
+ }
+ }
-public:
- /*
- * return dim the maximum dimension around one simplex and res which is true if the complex is a manifold.
- * If the complex has dimension <= 3 then if res is false, the complex is not a manifold.
- * For d-manifold with d>=4, res may be false while the complex is a manifold.
- */
- Is_manifold(const SkBlComplex& input_complex,unsigned& dim,bool & res):input_complex_(input_complex){
- res = true;
- dim = -1;
- if(!input_complex_.empty()){
- for(auto v : input_complex_.vertex_range()){
- dim = local_dimension(v);
- break;
- }
- //check that the link of every vertex is a dim-1 sphere
- for(auto v : input_complex_.vertex_range()){
- if(!is_k_sphere(v,dim-1)) {
- res = false;
- break;
- }
- }
- }
- }
+ private:
+ unsigned local_dimension(Vertex_handle v) {
+ unsigned dim = 0;
+ for (const auto& s : input_complex_.star_simplex_range(v))
+ dim = (std::max)(dim, (unsigned) s.dimension());
+ return dim;
+ }
-private:
- unsigned local_dimension(Vertex_handle v){
- unsigned dim = 0;
- for(const auto& s: input_complex_.simplex_range(v))
- dim = (std::max)(dim,(unsigned)s.dimension());
- return dim;
- }
+ bool is_k_sphere(Vertex_handle v, int k) {
+ auto link = input_complex_.link(v);
+ Edge_contractor<Complex> contractor(link, link.num_vertices() - 1);
+ return (is_sphere_simplex(link) == k);
+ }
- bool is_k_sphere(Vertex_handle v,int k){
- auto link = input_complex_.link(v);
- Edge_contractor<Complex> contractor(link,link.num_vertices()-1);
- return (is_sphere_simplex(link)==k);
- }
+ // A minimal sphere is a complex that contains vertices v1...vn and all faces
+ // made upon this set except the face {v1,...,vn}
+ // return -2 if not a minimal sphere
+ // and d otherwise if complex is a d minimal sphere
- // A minimal sphere is a complex that contains vertices v1...vn and all faces
- // made upon this set except the face {v1,...,vn}
- // return -2 if not a minimal sphere
- // and d otherwise if complex is a d minimal sphere
- template<typename SubComplex>
- int is_sphere_simplex(const SubComplex& complex){
- if(complex.empty()) return -1;
- if(complex.num_blockers()!=1) return -2;
+ template<typename SubComplex>
+ int is_sphere_simplex(const SubComplex& complex) {
+ if (complex.empty()) return -1;
+ if (complex.num_blockers() != 1) return -2;
- //necessary and sufficient condition : there exists a unique blocker that passes through all vertices
- auto first_blocker = *(complex.const_blocker_range().begin());
+ // necessary and sufficient condition : there exists a unique blocker that passes through all vertices
+ auto first_blocker = *(complex.const_blocker_range().begin());
- if (first_blocker->dimension()+1 != complex.num_vertices())
- return -2;
- else
- return (first_blocker->dimension()-1);
- }
+ if (first_blocker->dimension() + 1 != complex.num_vertices())
+ return -2;
+ else
+ return (first_blocker->dimension() - 1);
+ }
};
-#endif /* IS_MANIFOLD_H_ */
+#endif // UTILS_IS_MANIFOLD_H_
diff --git a/src/GudhUI/utils/K_nearest_builder.h b/src/GudhUI/utils/K_nearest_builder.h
index b65a79e0..7be0a4f4 100644
--- a/src/GudhUI/utils/K_nearest_builder.h
+++ b/src/GudhUI/utils/K_nearest_builder.h
@@ -1,81 +1,90 @@
-/*
- * K_nearest_builder.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: Sep 10, 2014
- * Author: dsalinas
+ * 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 K_NEAREST_BUILDER_H_
-#define K_NEAREST_BUILDER_H_
+#ifndef UTILS_K_NEAREST_BUILDER_H_
+#define UTILS_K_NEAREST_BUILDER_H_
-#include <unordered_map>
-#include <boost/iterator/iterator_facade.hpp>
#include <CGAL/Euclidean_distance.h>
#include <CGAL/Orthogonal_k_neighbor_search.h>
#include <CGAL/Search_traits_d.h>
#include <CGAL/Search_traits_adapter.h>
-#include <CGAL/property_map.h>
-#include <boost/iterator/zip_iterator.hpp>
+#include <CGAL/property_map.h>
+
+#include <unordered_map>
+#include <list>
+#include <utility>
#include "utils/UI_utils.h"
#include "model/Complex_typedefs.h"
-
-
-template<typename SkBlComplex> class K_nearest_builder{
-private:
-
- typedef Geometry_trait Kernel;
- typedef Point Point_d;
- typedef boost::tuple<Point_d, unsigned> Point_d_with_id;
- typedef CGAL::Search_traits_d<Kernel> Traits_base;
- typedef CGAL::Search_traits_adapter<Point_d_with_id, CGAL::Nth_of_tuple_property_map<0, Point_d_with_id>, Traits_base> Traits;
- typedef CGAL::Orthogonal_k_neighbor_search<Traits> Neighbor_search;
- typedef Neighbor_search::Tree Tree;
- typedef Neighbor_search::Distance Distance;
-
- SkBlComplex& complex_;
-public:
-
- /**
- * @brief Modify complex to be the expansion of the k-nearest neighbor
- * symetric graph.
- */
- K_nearest_builder(SkBlComplex& complex,unsigned k):complex_(complex){
- complex.keep_only_vertices();
- compute_edges(k);
- }
-
-private:
-
-
-
- double squared_eucl_distance(const Point& p1,const Point& p2) const{
- return Geometry_trait::Squared_distance_d()(p1,p2);
- }
-
- void compute_edges(unsigned k){
-
- std::list<Point_d_with_id> points_with_id;
- for(auto v: complex_.vertex_range()){
- Point_d_with_id point_v(complex_.point(v),v.vertex);
- points_with_id.push_back(point_v);
- }
-
- Tree tree(points_with_id.begin(),points_with_id.end());
-
- typedef typename SkBlComplex::Vertex_handle Vertex_handle;
- for (auto p : complex_.vertex_range()){
- Neighbor_search search(tree, complex_.point(p),k+1);
- for(auto it = ++search.begin(); it != search.end(); ++it){
- Vertex_handle q(boost::get<1>(it->first));
- if (p != q && complex_.contains_vertex(p) && complex_.contains_vertex(q))
- complex_.add_edge(p,q);
- }
- }
- }
-
-
+template<typename SkBlComplex> class K_nearest_builder {
+ private:
+ typedef Geometry_trait Kernel;
+ typedef Point Point_d;
+ typedef std::pair<Point_d, unsigned> Point_d_with_id;
+ typedef CGAL::Search_traits_d<Kernel> Traits_base;
+ typedef CGAL::Search_traits_adapter<Point_d_with_id, CGAL::First_of_pair_property_map<Point_d_with_id>,
+ Traits_base> Traits;
+ typedef CGAL::Orthogonal_k_neighbor_search<Traits> Neighbor_search;
+ typedef Neighbor_search::Tree Tree;
+ typedef Neighbor_search::Distance Distance;
+
+ SkBlComplex& complex_;
+
+ public:
+ /**
+ * @brief Modify complex to be the expansion of the k-nearest neighbor
+ * symetric graph.
+ */
+ K_nearest_builder(SkBlComplex& complex, unsigned k) : complex_(complex) {
+ complex.keep_only_vertices();
+ compute_edges(k);
+ }
+
+ private:
+ double squared_eucl_distance(const Point& p1, const Point& p2) const {
+ return Geometry_trait::Squared_distance_d()(p1, p2);
+ }
+
+ void compute_edges(unsigned k) {
+ std::list<Point_d_with_id> points_with_id;
+ for (auto v : complex_.vertex_range()) {
+ Point_d_with_id point_v(complex_.point(v), v.vertex);
+ points_with_id.push_back(point_v);
+ }
+
+ Tree tree(points_with_id.begin(), points_with_id.end());
+
+ typedef typename SkBlComplex::Vertex_handle Vertex_handle;
+ for (auto p : complex_.vertex_range()) {
+ Neighbor_search search(tree, complex_.point(p), k + 1);
+ for (auto it = ++search.begin(); it != search.end(); ++it) {
+ Vertex_handle q(std::get<1>(it->first));
+ if (p != q && complex_.contains_vertex(p) && complex_.contains_vertex(q))
+ complex_.add_edge(p, q);
+ }
+ }
+ }
};
-#endif /* K_NEAREST_BUILDER_H_ */
+#endif // UTILS_K_NEAREST_BUILDER_H_
diff --git a/src/GudhUI/utils/Lloyd_builder.h b/src/GudhUI/utils/Lloyd_builder.h
index db2a7973..18ec9fac 100644
--- a/src/GudhUI/utils/Lloyd_builder.h
+++ b/src/GudhUI/utils/Lloyd_builder.h
@@ -1,78 +1,91 @@
-/*
- * Lloyd.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: Sep 25, 2014
- * Author: dsalinas
+ * 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 LLOYD_H_
-#define LLOYD_H_
-
+#ifndef UTILS_LLOYD_BUILDER_H_
+#define UTILS_LLOYD_BUILDER_H_
#include <vector>
+#include <list>
/**
* Iteratively puts every vertex at the center of its neighbors
*/
-template<typename SkBlComplex> class Lloyd_builder{
-private:
- SkBlComplex& complex_;
- int dim;
-public:
- typedef typename SkBlComplex::Vertex_handle Vertex_handle;
- /**
- * @brief Modify complex to be the expansion of the k-nearest neighbor
- * symetric graph.
- */
- Lloyd_builder(SkBlComplex& complex,unsigned num_iterations):complex_(complex),dim(-1){
- if(!complex_.empty()){
- dim = get_dimension();
- while(num_iterations--){
- std::list<Point> new_points;
- for(auto v : complex.vertex_range())
- new_points.push_back(barycenter_neighbors(v));
-
- auto new_points_it = new_points.begin();
- for(auto v : complex.vertex_range())
- complex_.point(v) = *(new_points_it++);
- }
- }
- }
+template<typename SkBlComplex> class Lloyd_builder {
+ private:
+ SkBlComplex& complex_;
+ int dim;
-private:
+ public:
+ typedef typename SkBlComplex::Vertex_handle Vertex_handle;
- int get_dimension(){
- assert(!complex_.empty());
- for(auto v : complex_.vertex_range())
- return complex_.point(v).dimension();
- return -1;
- }
+ /**
+ * @brief Modify complex to be the expansion of the k-nearest neighbor
+ * symetric graph.
+ */
+ Lloyd_builder(SkBlComplex& complex, unsigned num_iterations) : complex_(complex), dim(-1) {
+ if (!complex_.empty()) {
+ dim = get_dimension();
+ while (num_iterations--) {
+ std::list<Point> new_points;
+ for (auto v : complex.vertex_range())
+ new_points.push_back(barycenter_neighbors(v));
- Point barycenter_neighbors(Vertex_handle v) const{
- if(complex_.degree(v)==0)
- return complex_.point(v);
+ auto new_points_it = new_points.begin();
+ for (auto v : complex.vertex_range())
+ complex_.point(v) = *(new_points_it++);
+ }
+ }
+ }
- std::vector<double> res(dim,0);
- unsigned num_points = 0;
- for(auto nv : complex_.vertex_range(v)){
- ++num_points;
- const Point& point = complex_.point(nv);
- assert(point.dimension() == dim);
- for(int i = 0; i < point.dimension() ; ++i)
- res[i] += point[i];
- }
- for(auto& x : res)
- x/= num_points;
- return Point(dim,res.begin(),res.end());
- }
+ private:
+ int get_dimension() {
+ assert(!complex_.empty());
+ for (auto v : complex_.vertex_range())
+ return complex_.point(v).dimension();
+ return -1;
+ }
+ Point barycenter_neighbors(Vertex_handle v) const {
+ if (complex_.degree(v) == 0)
+ return complex_.point(v);
+ std::vector<double> res(dim, 0);
+ unsigned num_points = 0;
+ for (auto nv : complex_.vertex_range(v)) {
+ ++num_points;
+ const Point& point = complex_.point(nv);
+ assert(point.dimension() == dim);
+ for (int i = 0; i < point.dimension(); ++i)
+ res[i] += point[i];
+ }
+ for (auto& x : res)
+ x /= num_points;
+ return Point(dim, res.begin(), res.end());
+ }
- double squared_eucl_distance(const Point& p1,const Point& p2) const{
- return Geometry_trait::Squared_distance_d()(p1,p2);
- }
-
+ double squared_eucl_distance(const Point& p1, const Point& p2) const {
+ return Geometry_trait::Squared_distance_d()(p1, p2);
+ }
};
-
-#endif /* LLOYD_H_ */
+#endif // UTILS_LLOYD_BUILDER_H_
diff --git a/src/GudhUI/utils/MClock.h b/src/GudhUI/utils/MClock.h
index b5c7d191..e8d8918a 100644
--- a/src/GudhUI/utils/MClock.h
+++ b/src/GudhUI/utils/MClock.h
@@ -1,57 +1,70 @@
-/*
- * Clock.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: Jun 17, 2014
- * Author: dsalinas
+ * 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 CLOCK_H_
-#define CLOCK_H_
+#ifndef UTILS_MCLOCK_H_
+#define UTILS_MCLOCK_H_
#include <sys/time.h>
+class MClock {
+ public:
+ MClock() {
+ end_called = false;
+ begin();
+ }
-class MClock{
-
-public:
- MClock(){
- end_called = false;
- begin();
- }
-
- void begin() const{
- end_called = false;
- gettimeofday(&startTime, NULL);
- }
-
- void end() const{
- end_called = true;
- gettimeofday(&endTime, NULL);
- }
-
- friend std::ostream& operator<< (std::ostream& stream,const MClock& clock){
- // if(!clock.end_called) clock.end();
- if(!clock.end_called) stream << "end not called";
- else{
- long totalTime = (clock.endTime.tv_sec - clock.startTime.tv_sec) * 1000000L;
- totalTime += (clock.endTime.tv_usec - clock.startTime.tv_usec);
- stream << clock.num_seconds() <<"s";
- }
- return stream;
-
- }
-
- double num_seconds() const{
- if(!end_called) end();
- long totalTime = (endTime.tv_sec - startTime.tv_sec) * 1000000L;
- totalTime += (endTime.tv_usec - startTime.tv_usec);
- return (totalTime / 1000L)/(double) 1000;
- }
-
-private:
- mutable struct timeval startTime, endTime;
- mutable bool end_called;
-};
+ void begin() const {
+ end_called = false;
+ gettimeofday(&startTime, NULL);
+ }
+ void end() const {
+ end_called = true;
+ gettimeofday(&endTime, NULL);
+ }
+
+ friend std::ostream& operator<<(std::ostream& stream, const MClock& clock) {
+ // if(!clock.end_called) clock.end();
+ if (!clock.end_called) {
+ stream << "end not called";
+ } else {
+ long totalTime = (clock.endTime.tv_sec - clock.startTime.tv_sec) * 1000000L;
+ totalTime += (clock.endTime.tv_usec - clock.startTime.tv_usec);
+ stream << clock.num_seconds() << "s";
+ }
+ return stream;
+ }
+
+ double num_seconds() const {
+ if (!end_called) end();
+ long totalTime = (endTime.tv_sec - startTime.tv_sec) * 1000000L;
+ totalTime += (endTime.tv_usec - startTime.tv_usec);
+ return (totalTime / 1000L) / static_cast<double>(1000);
+ }
+
+ private:
+ mutable struct timeval startTime, endTime;
+ mutable bool end_called;
+};
-#endif /* CLOCK_H_ */
+#endif // UTILS_MCLOCK_H_
diff --git a/src/GudhUI/utils/Persistence_compute.h b/src/GudhUI/utils/Persistence_compute.h
index 50d340b8..97165490 100644
--- a/src/GudhUI/utils/Persistence_compute.h
+++ b/src/GudhUI/utils/Persistence_compute.h
@@ -1,13 +1,10 @@
-/*
- * Persistence_compute.h
- * Created on: Jan 26, 2015
- * This file is part of the Gudhi Library. The Gudhi library
+/* 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-Méditerranée (France)
+ * 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
@@ -25,83 +22,70 @@
*/
-#ifndef PERSISTENCE_COMPUTE_H_
-#define PERSISTENCE_COMPUTE_H_
+#ifndef UTILS_PERSISTENCE_COMPUTE_H_
+#define UTILS_PERSISTENCE_COMPUTE_H_
+#include <gudhi/graph_simplicial_complex.h>
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/distance_functions.h>
+#include <gudhi/Persistent_cohomology.h>
-#include "gudhi/graph_simplicial_complex.h"
-#include "gudhi/Simplex_tree.h"
-#include "gudhi/distance_functions.h"
-#include "gudhi/Persistent_cohomology.h"
+#include <vector>
+struct Persistence_params {
+ int p;
+ double threshold;
+ int max_dim;
+ double min_pers;
-struct Persistence_params{
- int p;
- double threshold;
- int max_dim;
- double min_pers;
-
- Persistence_params(int p_,double th_,int max_dim_=10,double min_pers_=0)
- :p(p_),threshold(th_),max_dim(max_dim_),min_pers(min_pers_){}
+ Persistence_params(int p_, double th_, int max_dim_ = 10, double min_pers_ = 0)
+ : p(p_), threshold(th_), max_dim(max_dim_), min_pers(min_pers_) { }
};
-
/**
* Show persistence into output stream
*/
-template<typename SkBlComplex> class Persistence_compute{
-private:
- SkBlComplex& complex_;
- std::ostream& stream_;
-public:
- typedef typename SkBlComplex::Vertex_handle Vertex_handle;
- typedef typename SkBlComplex::Edge_handle Edge_handle;
-
- /**
- * @brief Compute persistence
- * parameters :
- * unsigned dim_max
- * double threshold
- * int p for coefficient Z_p
- */
- Persistence_compute(SkBlComplex& complex,std::ostream& stream,const Persistence_params& params):
-//
-// double threshold = 0.5,unsigned dim_max = 8):
- complex_(complex),stream_(stream){
-
- //for now everything is copied, todo boost adapt iterators to points of SkBlComplex instead of copying to an intial vector
- typedef std::vector<double> Point_t;
- std::vector< Point_t > points;
- points.reserve(complex.num_vertices());
- for(auto v : complex.vertex_range()){
- const auto & pt = complex.point(v);
- Point_t pt_to_add(pt.cartesian_begin(),pt.cartesian_end());
- points.emplace_back(std::move(pt_to_add));
- }
-
-
- 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 );
-
- Gudhi::persistent_cohomology::Persistent_cohomology< Gudhi::Simplex_tree<>,Gudhi::persistent_cohomology::Field_Zp > pcoh (st);
- pcoh.init_coefficients( params.p ); //initilizes the coefficient field for homology
- pcoh.compute_persistent_cohomology( params.min_pers ); //put params.min_pers
- stream_<<"persistence: \n";
- stream_<<"p dimension birth death: \n";
-
- pcoh.output_diagram(stream_);
- }
-
-private:
-
-
+template<typename SkBlComplex> class Persistence_compute {
+ public:
+ typedef typename SkBlComplex::Vertex_handle Vertex_handle;
+ typedef typename SkBlComplex::Edge_handle Edge_handle;
+
+ /**
+ * @brief Compute persistence
+ * parameters :
+ * unsigned dim_max
+ * double threshold
+ * int p for coefficient Z_p
+ */
+ Persistence_compute(SkBlComplex& complex, std::ostream& stream, const Persistence_params& params) {
+ // for now everything is copied, todo boost adapt iterators to points of SkBlComplex instead of copying to an
+ // initial vector
+ typedef std::vector<double> Point_t;
+ std::vector< Point_t > points;
+ points.reserve(complex.num_vertices());
+ for (auto v : complex.vertex_range()) {
+ const auto & pt = complex.point(v);
+ Point_t pt_to_add(pt.cartesian_begin(), pt.cartesian_end());
+ points.emplace_back(std::move(pt_to_add));
+ }
+
+
+ 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);
+
+ Gudhi::persistent_cohomology::Persistent_cohomology< Gudhi::Simplex_tree<>,
+ Gudhi::persistent_cohomology::Field_Zp > 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);
+ }
};
-
-
-
-
-
-#endif /* PERSISTENCE_COMPUTE_H_ */
+#endif // UTILS_PERSISTENCE_COMPUTE_H_
diff --git a/src/GudhUI/utils/Rips_builder.h b/src/GudhUI/utils/Rips_builder.h
index 9484f9ab..b22f4db6 100644
--- a/src/GudhUI/utils/Rips_builder.h
+++ b/src/GudhUI/utils/Rips_builder.h
@@ -1,56 +1,69 @@
-/*
- * Rips_builder.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: Sep 10, 2014
- * Author: dsalinas
+ * 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 RIPS_BUILDER_H_
-#define RIPS_BUILDER_H_
+#ifndef UTILS_RIPS_BUILDER_H_
+#define UTILS_RIPS_BUILDER_H_
#include <boost/iterator/iterator_facade.hpp>
-#include "utils/UI_utils.h"
-#include "model/Complex_typedefs.h"
#include <CGAL/Euclidean_distance.h>
-
#include <CGAL/Orthogonal_k_neighbor_search.h>
#include <CGAL/Search_traits_d.h>
-template<typename SkBlComplex> class Rips_builder{
-private:
- SkBlComplex& complex_;
-public:
-
- /**
- * @brief Modify complex to be the Rips complex
- * of its points with offset alpha.
- */
- Rips_builder(SkBlComplex& complex,double alpha):complex_(complex){
- complex.keep_only_vertices();
- if (alpha<=0) return;
- compute_edges(alpha);
- }
-
-private:
-
-
- double squared_eucl_distance(const Point& p1,const Point& p2) const{
- return Geometry_trait::Squared_distance_d()(p1,p2);
- }
-
- void compute_edges(double alpha){
- auto vertices = complex_.vertex_range();
- for(auto p = vertices.begin(); p!= vertices.end(); ++p){
- std::cout << *p << " "; std::cout.flush();
- for (auto q = p; ++q != vertices.end(); /**/)
- if (squared_eucl_distance(complex_.point(*p),complex_.point(*q)) < 4*alpha*alpha)
- complex_.add_edge(*p,*q);
- }
- std::cout << std::endl;
- }
+#include "utils/UI_utils.h"
+#include "model/Complex_typedefs.h"
-};
+template<typename SkBlComplex> class Rips_builder {
+ private:
+ SkBlComplex& complex_;
+ public:
+ /**
+ * @brief Modify complex to be the Rips complex
+ * of its points with offset alpha.
+ */
+ Rips_builder(SkBlComplex& complex, double alpha) : complex_(complex) {
+ complex.keep_only_vertices();
+ if (alpha <= 0) return;
+ compute_edges(alpha);
+ }
+
+ private:
+ double squared_eucl_distance(const Point& p1, const Point& p2) const {
+ return Geometry_trait::Squared_distance_d()(p1, p2);
+ }
+
+ void compute_edges(double alpha) {
+ auto vertices = complex_.vertex_range();
+ for (auto p = vertices.begin(); p != vertices.end(); ++p) {
+ std::cout << *p << " ";
+ std::cout.flush();
+ for (auto q = p; ++q != vertices.end(); /**/)
+ if (squared_eucl_distance(complex_.point(*p), complex_.point(*q)) < 4 * alpha * alpha)
+ complex_.add_edge(*p, *q);
+ }
+ std::cout << std::endl;
+ }
+};
-#endif /* RIPS_BUILDER_H_ */
+#endif // UTILS_RIPS_BUILDER_H_
diff --git a/src/GudhUI/utils/UI_utils.h b/src/GudhUI/utils/UI_utils.h
index a7c0689f..9cc209d3 100644
--- a/src/GudhUI/utils/UI_utils.h
+++ b/src/GudhUI/utils/UI_utils.h
@@ -1,33 +1,45 @@
-/*
- * UI_utils.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: Aug 25, 2014
- * Author: david
+ * 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 UI_UTILS_H_
-#define UI_UTILS_H_
-
-#define PRINT(a) std::cerr << #a << ": " << (a) << " (DISP)"<<std::endl
+#ifndef UTILS_UI_UTILS_H_
+#define UTILS_UI_UTILS_H_
#define UIDBG_VERBOSE
-
#ifdef UIDBG_VERBOSE
-#define UIDBG(a) std::cerr << "UIDBG: " << (a)<<std::endl
-#define UIDBGMSG(a,b) std::cerr << "UIDBG: " << a<<b<<std::endl
-#define UIDBGVALUE(a) std::cerr << "UIDBG: " << #a << ": " << a<<std::endl
-#define UIDBGCONT(a) std::cerr << "UIDBG: container "<< #a<<" -> "; for(auto x:a) std::cerr<< x << ","; std::cerr<<std::endl
+#define UIDBG(a) std::cerr << "UIDBG: " << (a) << std::endl
+#define UIDBGMSG(a, b) std::cerr << "UIDBG: " << a << b << std::endl
+#define UIDBGVALUE(a) std::cerr << "UIDBG: " << #a << ": " << a << std::endl
+#define UIDBGCONT(a) std::cerr << "UIDBG: container " << #a << " -> "; for (auto x : a) std::cerr << x << ","; std::cerr << std::endl }
#else
-//#define DBG(a) a
-//#define DBGMSG(a,b) b
-//#define DBGVALUE(a) a
-//#define DBGCONT(a) a
+// #define DBG(a) a
+// #define DBGMSG(a, b) b
+// #define DBGVALUE(a) a
+// #define DBGCONT(a) a
#define UIDBG(a)
-#define UIDBGMSG(a,b)
+#define UIDBGMSG(a, b)
#define UIDBGVALUE(a)
#define UIDBGCONT(a)
#endif
-
-#endif /* UI_UTILS_H_ */
+#endif // UTILS_UI_UTILS_H_
diff --git a/src/GudhUI/utils/Vertex_collapsor.h b/src/GudhUI/utils/Vertex_collapsor.h
index d4911a35..2b36cb3a 100644
--- a/src/GudhUI/utils/Vertex_collapsor.h
+++ b/src/GudhUI/utils/Vertex_collapsor.h
@@ -1,76 +1,88 @@
-/*
- * Vertex_collapsor.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: Sep 25, 2014
- * Author: dsalinas
+ * 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 VERTEX_COLLAPSOR_H_
-#define VERTEX_COLLAPSOR_H_
+#ifndef UTILS_VERTEX_COLLAPSOR_H_
+#define UTILS_VERTEX_COLLAPSOR_H_
+
+#include <list>
#include "utils/Edge_contractor.h"
#include "utils/Furthest_point_epsilon_net.h"
#include "utils/UI_utils.h"
+
/**
* Iteratively puts every vertex at the center of its neighbors
*/
-template<typename SkBlComplex> class Vertex_collapsor{
-private:
- SkBlComplex& complex_;
- size_t num_collapses_;
-public:
- typedef typename SkBlComplex::Vertex_handle Vertex_handle;
- typedef typename SkBlComplex::Edge_handle Edge_handle;
-
- /**
- * @brief Modify complex to be the expansion of the k-nearest neighbor
- * symetric graph.
- */
- Vertex_collapsor(SkBlComplex& complex, size_t num_collapses) :
- complex_(complex),num_collapses_(num_collapses)
- {
-// std::list<Vertex_handle> vertices;
-// vertices.insert(vertices.begin(),complex_.vertex_range().begin(),complex_.vertex_range().end());
-// UIDBG("Collapse vertices");
-// collapse_vertices(vertices);
-
- std::list<Vertex_handle> vertices;
-
- UIDBG("Compute eps net");
- Furthest_point_epsilon_net<Complex> eps_net(complex_);
-
- for(auto vh : eps_net.net_filtration_)
- vertices.push_back(vh.vertex_handle);
-
- UIDBG("Collapse vertices");
- collapse_vertices(vertices);
-
-
-
- }
-
-private:
-
-
- void collapse_vertices(std::list<Vertex_handle>& vertices){
- while(!vertices.empty() && num_collapses_--){
- Vertex_handle current_vertex = vertices.front();
- vertices.pop_front();
- if(is_link_reducible(current_vertex))
- complex_.remove_vertex(current_vertex);
- }
- }
-
- bool is_link_reducible(Vertex_handle v){
- auto link = complex_.link(v);
- if(link.empty()) return false;
- if(link.is_cone()) return true;
- if(link.num_connected_components()>1) return false;
- Edge_contractor<Complex> contractor(link,link.num_vertices()-1);
- return (link.num_vertices()==1);
- }
-
+template<typename SkBlComplex> class Vertex_collapsor {
+ private:
+ SkBlComplex& complex_;
+ size_t num_collapses_;
+
+ public:
+ typedef typename SkBlComplex::Vertex_handle Vertex_handle;
+ typedef typename SkBlComplex::Edge_handle Edge_handle;
+
+ /**
+ * @brief Modify complex to be the expansion of the k-nearest neighbor
+ * symetric graph.
+ */
+ Vertex_collapsor(SkBlComplex& complex, size_t num_collapses) :
+ complex_(complex), num_collapses_(num_collapses) {
+ // std::list<Vertex_handle> vertices;
+ // vertices.insert(vertices.begin(),complex_.vertex_range().begin(),complex_.vertex_range().end());
+ // UIDBG("Collapse vertices");
+ // collapse_vertices(vertices);
+
+ std::list<Vertex_handle> vertices;
+
+ UIDBG("Compute eps net");
+ Furthest_point_epsilon_net<Complex> eps_net(complex_);
+
+ for (auto vh : eps_net.net_filtration_)
+ vertices.push_back(vh.vertex_handle);
+
+ UIDBG("Collapse vertices");
+ collapse_vertices(vertices);
+ }
+
+ private:
+ void collapse_vertices(std::list<Vertex_handle>& vertices) {
+ while (!vertices.empty() && num_collapses_--) {
+ Vertex_handle current_vertex = vertices.front();
+ vertices.pop_front();
+ if (is_link_reducible(current_vertex))
+ complex_.remove_vertex(current_vertex);
+ }
+ }
+
+ bool is_link_reducible(Vertex_handle v) {
+ auto link = complex_.link(v);
+ if (link.empty()) return false;
+ if (link.is_cone()) return true;
+ if (link.num_connected_components() > 1) return false;
+ Edge_contractor<Complex> contractor(link, link.num_vertices() - 1);
+ return (link.num_vertices() == 1);
+ }
};
-
-#endif /* VERTEX_COLLAPSOR_H_ */
+#endif // UTILS_VERTEX_COLLAPSOR_H_
diff --git a/src/GudhUI/view/Color.h b/src/GudhUI/view/Color.h
index a63456cb..ba0592e1 100644
--- a/src/GudhUI/view/Color.h
+++ b/src/GudhUI/view/Color.h
@@ -1,21 +1,35 @@
-/*
- * Color.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: Aug 26, 2014
- * Author: dsalinas
+ * 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 COLOR_H_
-#define COLOR_H_
-
+#ifndef VIEW_COLOR_H_
+#define VIEW_COLOR_H_
+struct Color {
+ double r;
+ double g;
+ double b;
-struct Color{
- double r;
- double g;
- double b;
- Color(double r_,double g_,double b_):r(r_),g(g_),b(b_){}
+ Color(double r_, double g_, double b_) : r(r_), g(g_), b(b_) { }
};
-
-#endif /* COLOR_H_ */
+#endif // VIEW_COLOR_H_
diff --git a/src/GudhUI/view/FirstCoordProjector.h b/src/GudhUI/view/FirstCoordProjector.h
index 2659eef1..a4027b7f 100644
--- a/src/GudhUI/view/FirstCoordProjector.h
+++ b/src/GudhUI/view/FirstCoordProjector.h
@@ -1,24 +1,42 @@
-/*
- * FirstCoordProjector.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: Aug 27, 2014
- * Author: dsalinas
+ * 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 FIRSTCOORDPROJECTOR_H_
-#define FIRSTCOORDPROJECTOR_H_
+#ifndef VIEW_FIRSTCOORDPROJECTOR_H_
+#define VIEW_FIRSTCOORDPROJECTOR_H_
#include "utils/UI_utils.h"
#include "Projector3D.h"
-class FirstCoordProjector3D : public Projector3D{
- typedef Projector3D::Point Point;
- typedef Projector3D::Point_3 Point_3;
+class FirstCoordProjector3D : public Projector3D {
+ typedef Projector3D::Point Point;
+ typedef Projector3D::Point_3 Point_3;
- Point_3 operator()(const Point& p) const{
- assert(p.dimension()>=3);
- return Point_3(p.x(),p.y(),p.z());
- }
+ Point_3 operator()(const Point& p) const {
+ if (p.dimension() >= 3)
+ return Point_3(p.x(), p.y(), p.z());
+ else if (p.dimension() >= 2)
+ return Point_3(p.x(), p.y(), 0.0);
+ }
};
-#endif /* FIRSTCOORDPROJECTOR_H_ */
+#endif // VIEW_FIRSTCOORDPROJECTOR_H_
diff --git a/src/GudhUI/view/Projector3D.h b/src/GudhUI/view/Projector3D.h
index 503b35c5..2a756541 100644
--- a/src/GudhUI/view/Projector3D.h
+++ b/src/GudhUI/view/Projector3D.h
@@ -1,28 +1,39 @@
-/*
- * Projector.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: Aug 27, 2014
- * Author: dsalinas
+ * 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 PROJECTOR3D_H_
-#define PROJECTOR3D_H_
+#ifndef VIEW_PROJECTOR3D_H_
+#define VIEW_PROJECTOR3D_H_
#include "model/Complex_typedefs.h"
+class Projector3D {
+ public:
+ typedef Geometry_trait::Point Point;
+ typedef Geometry_trait::Point_3 Point_3;
-class Projector3D{
-public:
- typedef Geometry_trait::Point Point;
- typedef Geometry_trait::Point_3 Point_3;
-
- virtual Point_3 operator()(const Point&) const = 0;
-
- virtual ~Projector3D(){
- }
+ virtual Point_3 operator()(const Point&) const = 0;
+ virtual ~Projector3D() { }
};
-
-
-#endif /* PROJECTOR3D_H_ */
+#endif // VIEW_PROJECTOR3D_H_
diff --git a/src/GudhUI/view/View_parameter.h b/src/GudhUI/view/View_parameter.h
index 39c5d7dd..9805abc2 100644
--- a/src/GudhUI/view/View_parameter.h
+++ b/src/GudhUI/view/View_parameter.h
@@ -1,13 +1,28 @@
-/*
- * View_parameter.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: Mar 10, 2014
- * Author: David Salinas
- * Copyright 2013 INRIA. All rights reserved
+ * 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 VIEW_PARAMETER_H_
-#define VIEW_PARAMETER_H_
+#ifndef VIEW_VIEW_PARAMETER_H_
+#define VIEW_VIEW_PARAMETER_H_
#include <iostream>
@@ -15,123 +30,122 @@
* Different parameters for the view such as the camera angle,
* the light, options for vertices/edges/triangles.
*/
-class View_parameter{
-public:
- bool light;
- bool relative_light;
-
- double size_vertices;
- double size_edges;
- double light_edges; // in 0-1
- double light_triangles;// in 0-1
-
- /**
- * light angle
- */
- double theta;
- double phi;
-
- enum VERTEX_MODE{ V_NONE,V_SIMPLE,V_COUNT};
- enum EDGE_MODE{ E_NONE,E_SIMPLE,E_COUNT};
- enum TRIANGLE_MODE{ T_NONE,T_SIMPLE,T_COUNT};
-
-
-
-
- VERTEX_MODE vertex_mode;
- EDGE_MODE edge_mode;
- TRIANGLE_MODE triangle_mode;
-
- void change_vertex_mode(){
- int current_value = vertex_mode;
- vertex_mode = static_cast<VERTEX_MODE>(++current_value % V_COUNT);
- std::cout<<"Vertex mode : ";
- switch (vertex_mode) {
- case V_NONE:
- std::cout<<"empty\n";
- break;
- case V_SIMPLE:
- std::cout<<"simple\n";
- break;
- default:
- break;
- }
- }
-
- void change_vertex_mode(int new_mode){
- vertex_mode = static_cast<VERTEX_MODE>(new_mode % V_COUNT);
- }
-
- void change_edge_mode(){
- int current_value = edge_mode;
- edge_mode = static_cast<EDGE_MODE>(++current_value % E_COUNT);
- }
-
- void change_edge_mode(int new_mode){
- edge_mode = static_cast<EDGE_MODE>(new_mode % E_COUNT);
- }
-
-
- void change_triangle_mode(){
- int current_value = triangle_mode;
- triangle_mode = static_cast<TRIANGLE_MODE>(++current_value % T_COUNT);
- }
-
-
-
-
-
- View_parameter(){
- light = true;
- relative_light = true;
- vertex_mode = V_SIMPLE;
- edge_mode = E_SIMPLE;
- triangle_mode = T_NONE;
-
- size_vertices = 3;
- size_edges = 2;
-
- light_edges = 0.3;
- light_triangles = 0.85;
- theta = 0;
- phi = 0;
- }
-
- friend std::ostream& operator<<(std::ostream& stream, const View_parameter& param){
- stream << param.light<< " ";
- stream << param.relative_light<< " ";
- stream << param.vertex_mode<< " ";
- stream << param.edge_mode<< " ";
- stream << param.triangle_mode<< " ";
- stream << param.size_vertices<< " ";
- stream << param.size_edges<< " ";
- stream << param.light_edges<< " ";
- stream << param.light_triangles<< " ";
- stream << param.theta<< " ";
- stream << param.phi<< " ";
- return stream;
- }
-
- friend std::istream& operator>>(std::istream& stream, View_parameter& param){
- stream >> param.light;
- stream >> param.relative_light;
- int a;
- stream>>a;
- param.vertex_mode = static_cast<VERTEX_MODE>(a % V_COUNT);
- stream>>a;
- param.edge_mode = static_cast<EDGE_MODE>(a % E_COUNT);
- stream>>a;
- param.triangle_mode = static_cast<TRIANGLE_MODE>(a % T_COUNT);
- stream>>a;
- stream >> param.size_vertices;
- stream >> param.size_edges;
- stream >> param.light_edges;
- stream >> param.light_triangles;
- stream >> param.theta;
- stream >> param.phi;
- return stream;
- }
-
+class View_parameter {
+ public:
+ bool light;
+ bool relative_light;
+
+ double size_vertices;
+ double size_edges;
+ double light_edges; // in 0-1
+ double light_triangles; // in 0-1
+
+ /**
+ * light angle
+ */
+ double theta;
+ double phi;
+
+ enum VERTEX_MODE {
+ V_NONE, V_SIMPLE, V_COUNT
+ };
+
+ enum EDGE_MODE {
+ E_NONE, E_SIMPLE, E_COUNT
+ };
+
+ enum TRIANGLE_MODE {
+ T_NONE, T_SIMPLE, T_COUNT
+ };
+
+ VERTEX_MODE vertex_mode;
+ EDGE_MODE edge_mode;
+ TRIANGLE_MODE triangle_mode;
+
+ void change_vertex_mode() {
+ int current_value = vertex_mode;
+ vertex_mode = static_cast<VERTEX_MODE> (++current_value % V_COUNT);
+ std::cout << "Vertex mode : ";
+ switch (vertex_mode) {
+ case V_NONE:
+ std::cout << "empty\n";
+ break;
+ case V_SIMPLE:
+ std::cout << "simple\n";
+ break;
+ default:
+ break;
+ }
+ }
+
+ void change_vertex_mode(int new_mode) {
+ vertex_mode = static_cast<VERTEX_MODE> (new_mode % V_COUNT);
+ }
+
+ void change_edge_mode() {
+ int current_value = edge_mode;
+ edge_mode = static_cast<EDGE_MODE> (++current_value % E_COUNT);
+ }
+
+ void change_edge_mode(int new_mode) {
+ edge_mode = static_cast<EDGE_MODE> (new_mode % E_COUNT);
+ }
+
+ void change_triangle_mode() {
+ int current_value = triangle_mode;
+ triangle_mode = static_cast<TRIANGLE_MODE> (++current_value % T_COUNT);
+ }
+
+ View_parameter() {
+ light = true;
+ relative_light = true;
+ vertex_mode = V_SIMPLE;
+ edge_mode = E_SIMPLE;
+ triangle_mode = T_NONE;
+
+ size_vertices = 3;
+ size_edges = 2;
+
+ light_edges = 0.3;
+ light_triangles = 0.85;
+ theta = 0;
+ phi = 0;
+ }
+
+ friend std::ostream& operator<<(std::ostream& stream, const View_parameter& param) {
+ stream << param.light << " ";
+ stream << param.relative_light << " ";
+ stream << param.vertex_mode << " ";
+ stream << param.edge_mode << " ";
+ stream << param.triangle_mode << " ";
+ stream << param.size_vertices << " ";
+ stream << param.size_edges << " ";
+ stream << param.light_edges << " ";
+ stream << param.light_triangles << " ";
+ stream << param.theta << " ";
+ stream << param.phi << " ";
+ return stream;
+ }
+
+ friend std::istream& operator>>(std::istream& stream, View_parameter& param) {
+ stream >> param.light;
+ stream >> param.relative_light;
+ int a;
+ stream >> a;
+ param.vertex_mode = static_cast<VERTEX_MODE> (a % V_COUNT);
+ stream >> a;
+ param.edge_mode = static_cast<EDGE_MODE> (a % E_COUNT);
+ stream >> a;
+ param.triangle_mode = static_cast<TRIANGLE_MODE> (a % T_COUNT);
+ stream >> a;
+ stream >> param.size_vertices;
+ stream >> param.size_edges;
+ stream >> param.light_edges;
+ stream >> param.light_triangles;
+ stream >> param.theta;
+ stream >> param.phi;
+ return stream;
+ }
};
-#endif /* VIEW_PARAMETER_H_ */
+#endif // VIEW_VIEW_PARAMETER_H_
diff --git a/src/GudhUI/view/Viewer.cpp b/src/GudhUI/view/Viewer.cpp
index d8a35faf..c6c2b345 100644
--- a/src/GudhUI/view/Viewer.cpp
+++ b/src/GudhUI/view/Viewer.cpp
@@ -1,197 +1,186 @@
-/*
- * Viewer.cpp
+/* 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: Aug 26, 2014
- * Author: dsalinas
+ * 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/>.
+ *
*/
#include "Viewer.h"
#include "utils/UI_utils.h"
-Viewer::Viewer(QWidget* parent): QGLViewer(QGLFormat(QGL::SampleBuffers),parent),instructor(0),theta(0),phi(0){
-}
+Viewer::Viewer(QWidget* parent) : QGLViewer(QGLFormat(QGL::SampleBuffers), parent), instructor(0), theta(0), phi(0) { }
-void
-Viewer::set_instructor(Viewer_instructor* instructor_){
- instructor = instructor_;
+void Viewer::set_instructor(Viewer_instructor* instructor_) {
+ instructor = instructor_;
}
-void
-Viewer::show_entire_scene(){
- this->showEntireScene();
+void Viewer::show_entire_scene() {
+ this->showEntireScene();
}
-void
-Viewer::draw(){
- instructor->give_instructions();
+void Viewer::draw() {
+ instructor->give_instructions();
}
-
-void
-Viewer::set_bounding_box(const Point_3 & lower_left,const Point_3 & upper_right){
- this->camera()->setSceneBoundingBox(
- qglviewer::Vec(lower_left[0], lower_left[1], lower_left[2]),
- qglviewer::Vec(upper_right[0], upper_right[1], upper_right[2])
- );
+void Viewer::set_bounding_box(const Point_3 & lower_left, const Point_3 & upper_right) {
+ this->camera()->setSceneBoundingBox(qglviewer::Vec(lower_left[0], lower_left[1], lower_left[2]),
+ qglviewer::Vec(upper_right[0], upper_right[1], upper_right[2]));
}
-void
-Viewer::update_GL(){
- this->updateGL();
-
+void Viewer::update_GL() {
+ this->updateGL();
}
-void
-Viewer::init_scene(){
- this->setBackgroundColor(Qt::white);
- ::glEnable(GL_LINE_SMOOTH);
- init_light();
+void Viewer::init_scene() {
+ this->setBackgroundColor(Qt::white);
+ ::glEnable(GL_LINE_SMOOTH);
+ init_light();
}
-void
-Viewer::init_light(){
- ::glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
+void Viewer::init_light() {
+ ::glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
}
-void
-Viewer::set_light(){
- if(theta>=0 && phi >=0){
- const GLfloat pos[4] = {(float)(sin(phi)*cos(theta)),(float)(sin(phi)*sin(theta)),(float)(cos(phi)),0.};
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- }
+void Viewer::set_light() {
+ if (theta >= 0 && phi >= 0) {
+ const GLfloat pos[4] = {static_cast<float> (sin(phi) * cos(theta)),
+ static_cast<float> (sin(phi) * sin(theta)),
+ static_cast<float> (cos(phi)), 0.};
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ }
}
-void
-Viewer::set_light_direction(double theta_,double phi_){
- theta = theta_;
- phi = phi_;
+void Viewer::set_light_direction(double theta_, double phi_) {
+ theta = theta_;
+ phi = phi_;
}
/**
* set the light in the direction of the observer
*/
-void
-Viewer::set_light_direction(){
- theta = -1;
- phi = -1;
+void Viewer::set_light_direction() {
+ theta = -1;
+ phi = -1;
}
+void Viewer::postSelection(const QPoint& point) {
+ bool found;
-void
-Viewer::postSelection(const QPoint& point){
- bool found;
+ auto vec = this->camera()->pointUnderPixel(point, found);
- auto vec = this->camera()->pointUnderPixel(point,found);
-
- if(found){
- Point_3 position(vec[0],vec[1],vec[2]);
- emit(click(position));
- }
+ if (found) {
+ Point_3 position(vec[0], vec[1], vec[2]);
+ emit(click(position));
+ }
}
////////////////////////
// draw
////////////////////////
-void
-Viewer::set_size_point(double size_points){
- ::glPointSize(size_points);
-}
-
-void
-Viewer::draw_point(const Point_3& p,const Color& color,double size_points){
- ::glColor3f(color.r,color.g,color.b);
- ::glDisable(GL_LIGHTING);
- ::glEnable(GL_POINT_SMOOTH);
- ::glPointSize(size_points);
- ::glBegin(GL_POINTS);
- ::glVertex3d(p.x(), p.y(), p.z());
- ::glEnd();
- ::glDisable(GL_POINT_SMOOTH);
-}
-
-void
-Viewer::begin_draw_points(double size,bool light){
- light?glEnable(GL_LIGHTING):glDisable(GL_LIGHTING);
- ::glEnable(GL_POINT_SMOOTH);
- ::glPointSize(size);
- ::glBegin(GL_POINTS);
-}
-
-void
-Viewer::set_color(const Color& color){
- ::glColor3f(color.r,color.g,color.b);
-}
-
-void
-Viewer::draw_points(const Point_3 & point){
- ::glVertex3d(point.x(),point.y(),point.z());
-}
-
-void
-Viewer::end_draw_points(){
- ::glEnd();
- ::glDisable(GL_POINT_SMOOTH);
-}
-
-void
-Viewer::draw_edge(const Point_3 &a,const Point_3 &b,const Color& color,double size){
- ::glColor3f(color.r,color.g,color.b);
- ::glPointSize(3.0);
- ::glLineWidth(size);
- ::glBegin(GL_LINES);
- ::glVertex3f(a.x(),a.y(),a.z());
- ::glVertex3f(b.x(),b.y(),b.z());
- ::glEnd();
-}
-
-void
-Viewer::begin_draw_edges(double size,bool light){
- ::glLineWidth(size);
- ::glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
- ::glEnable(GL_POLYGON_OFFSET_LINE);
- ::glPolygonOffset(3.0f,-3.0f);
- light?glEnable(GL_LIGHTING):glDisable(GL_LIGHTING);
- ::glBegin(GL_LINES);
-}
-
-void
-Viewer::draw_edges(const Point_3 &a,const Point_3 &b){
- ::glVertex3f(a.x(),a.y(),a.z());
- ::glVertex3f(b.x(),b.y(),b.z());
-}
-
-void
-Viewer::end_draw_edges(){
- ::glEnd();
-}
-
-void
-Viewer::begin_draw_triangles(double size,bool light,bool transparent){
- if(transparent){
- ::glEnable (GL_BLEND);
- ::glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
- ::glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- ::glEnable(GL_POLYGON_OFFSET_FILL);
- ::glPolygonOffset(3.0f,-3.0f);
- light?glEnable(GL_LIGHTING):glDisable(GL_LIGHTING);
- ::glBegin(GL_TRIANGLES);
-}
-
-void
-Viewer::draw_triangles(const Point_3& p1,const Point_3& p2,const Point_3& p3){
- if(!CGAL::collinear(p1,p2,p3)){
- auto triangle_normal = CGAL::unit_normal(p1,p2,p3);
- ::glNormal3d(triangle_normal.x(),triangle_normal.y(),triangle_normal.z());
- ::glVertex3d(p1.x(),p1.y(),p1.z());
- ::glVertex3d(p2.x(),p2.y(),p2.z());
- ::glVertex3d(p3.x(),p3.y(),p3.z());
- }
-}
-
-void
-Viewer::end_draw_triangles(){
- ::glEnd();
+
+void Viewer::set_size_point(double size_points) {
+ ::glPointSize(size_points);
+}
+
+void Viewer::draw_point(const Point_3& p, const Color& color, double size_points) {
+ ::glColor3f(color.r, color.g, color.b);
+ ::glDisable(GL_LIGHTING);
+ ::glEnable(GL_POINT_SMOOTH);
+ ::glPointSize(size_points);
+ ::glBegin(GL_POINTS);
+ ::glVertex3d(p.x(), p.y(), p.z());
+ ::glEnd();
+ ::glDisable(GL_POINT_SMOOTH);
+}
+
+void Viewer::begin_draw_points(double size, bool light) {
+ light ? glEnable(GL_LIGHTING) : glDisable(GL_LIGHTING);
+ ::glEnable(GL_POINT_SMOOTH);
+ ::glPointSize(size);
+ ::glBegin(GL_POINTS);
+}
+
+void Viewer::set_color(const Color& color) {
+ ::glColor3f(color.r, color.g, color.b);
+}
+
+void Viewer::draw_points(const Point_3 & point) {
+ ::glVertex3d(point.x(), point.y(), point.z());
+}
+
+void Viewer::end_draw_points() {
+ ::glEnd();
+ ::glDisable(GL_POINT_SMOOTH);
+}
+
+void Viewer::draw_edge(const Point_3 &a, const Point_3 &b, const Color& color, double size) {
+ ::glColor3f(color.r, color.g, color.b);
+ ::glPointSize(3.0);
+ ::glLineWidth(size);
+ ::glBegin(GL_LINES);
+ ::glVertex3f(a.x(), a.y(), a.z());
+ ::glVertex3f(b.x(), b.y(), b.z());
+ ::glEnd();
+}
+
+void Viewer::begin_draw_edges(double size, bool light) {
+ ::glLineWidth(size);
+ ::glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ ::glEnable(GL_POLYGON_OFFSET_LINE);
+ ::glPolygonOffset(3.0f, -3.0f);
+ light ? glEnable(GL_LIGHTING) : glDisable(GL_LIGHTING);
+ ::glBegin(GL_LINES);
+}
+
+void Viewer::draw_edges(const Point_3 &a, const Point_3 &b) {
+ ::glVertex3f(a.x(), a.y(), a.z());
+ ::glVertex3f(b.x(), b.y(), b.z());
+}
+
+void Viewer::end_draw_edges() {
+ ::glEnd();
+}
+
+void Viewer::begin_draw_triangles(double size, bool light, bool transparent) {
+ if (transparent) {
+ ::glEnable(GL_BLEND);
+ ::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ ::glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ ::glEnable(GL_POLYGON_OFFSET_FILL);
+ ::glPolygonOffset(3.0f, -3.0f);
+ light ? glEnable(GL_LIGHTING) : glDisable(GL_LIGHTING);
+ ::glBegin(GL_TRIANGLES);
+}
+
+void Viewer::draw_triangles(const Point_3& p1, const Point_3& p2, const Point_3& p3) {
+ if (!CGAL::collinear(p1, p2, p3)) {
+ auto triangle_normal = CGAL::unit_normal(p1, p2, p3);
+ ::glNormal3d(triangle_normal.x(), triangle_normal.y(), triangle_normal.z());
+ ::glVertex3d(p1.x(), p1.y(), p1.z());
+ ::glVertex3d(p2.x(), p2.y(), p2.z());
+ ::glVertex3d(p3.x(), p3.y(), p3.z());
+ }
+}
+
+void Viewer::end_draw_triangles() {
+ ::glEnd();
}
#include "Viewer.moc"
diff --git a/src/GudhUI/view/Viewer.h b/src/GudhUI/view/Viewer.h
index 5639aa56..319c8e04 100755..100644
--- a/src/GudhUI/view/Viewer.h
+++ b/src/GudhUI/view/Viewer.h
@@ -1,96 +1,120 @@
-#ifndef VIEWER_H
-#define VIEWER_H
-
-#include <QGLViewer/qglviewer.h>
-#include "View_parameter.h"
-#include "model/Complex_typedefs.h"
-#include "Color.h"
-#include "Viewer_instructor.h"
-
-class Viewer_instructor;
-
-class Viewer : public QGLViewer {
- Q_OBJECT
-
- Viewer_instructor * instructor;
-
- /**
- * light angles
- */
- double theta,phi;
- typedef Complex::GT Gudhi_kernel;
- typedef Gudhi_kernel::Point_3 Point_3;
-public:
- Viewer(QWidget* parent);
-
- void set_instructor(Viewer_instructor* instructor_);
-
- void show_entire_scene();
-
- void draw();
-
-
- void set_bounding_box(const Point_3 & lower_left,const Point_3 & upper_right);
-
- void update_GL();
-
- void init_scene();
-
- void init_light();
-
- void set_light();
-
- void set_light_direction(double theta,double phi);
-
- /**
- * set the light in the direction of the observer
- */
- void set_light_direction();
-
-
-protected:
- virtual void postSelection(const QPoint& point);
-
-
-public:
-
- ////////////////////////
- // draw
- ////////////////////////
- void set_size_point(double size_points);
-
- void set_color(const Color& color);
-
- void draw_point(const Point_3& p,const Color& color,double size_points);
-
- void begin_draw_points(double size,bool light=false);
-
- void draw_points(const Point_3 & point);
-
- void end_draw_points();
-
- void draw_edge(const Point_3 &a,const Point_3 &b,const Color& color,double size);
-
- void begin_draw_edges(double size,bool light=false);
-
- void draw_edges(const Point_3 &a,const Point_3 &b);
-
- void end_draw_edges();
-
- void begin_draw_triangles(double size,bool light,bool transparent = false);
-
- void draw_triangles(const Point_3& p1,const Point_3& p2,const Point_3& p3);
-
- //todo remove
- void draw_triangles(const std::vector<Point_3*>& points);
-
- void end_draw_triangles();
-
-
- signals:
- void click(const Point_3& position);
-};
-
-
-
-#endif
+/* 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 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>
+
+#include "View_parameter.h"
+#include "model/Complex_typedefs.h"
+#include "Color.h"
+#include "Viewer_instructor.h"
+
+class Viewer_instructor;
+
+class Viewer : public QGLViewer {
+ Q_OBJECT
+
+ Viewer_instructor * instructor;
+
+ /**
+ * light angles
+ */
+ double theta, phi;
+ typedef Complex::GT Gudhi_kernel;
+ typedef Gudhi_kernel::Point_3 Point_3;
+
+ public:
+ Viewer(QWidget* parent);
+
+ void set_instructor(Viewer_instructor* instructor_);
+
+ void show_entire_scene();
+
+ void draw();
+
+ void set_bounding_box(const Point_3 & lower_left, const Point_3 & upper_right);
+
+ void update_GL();
+
+ void init_scene();
+
+ void init_light();
+
+ void set_light();
+
+ void set_light_direction(double theta, double phi);
+
+ /**
+ * set the light in the direction of the observer
+ */
+ void set_light_direction();
+
+ protected:
+ virtual void postSelection(const QPoint& point);
+
+ public:
+ ////////////////////////
+ // draw
+ ////////////////////////
+ void set_size_point(double size_points);
+
+ void set_color(const Color& color);
+
+ void draw_point(const Point_3& p, const Color& color, double size_points);
+
+ void begin_draw_points(double size, bool light = false);
+
+ void draw_points(const Point_3 & point);
+
+ void end_draw_points();
+
+ void draw_edge(const Point_3 &a, const Point_3 &b, const Color& color, double size);
+
+ void begin_draw_edges(double size, bool light = false);
+
+ void draw_edges(const Point_3 &a, const Point_3 &b);
+
+ void end_draw_edges();
+
+ void begin_draw_triangles(double size, bool light, bool transparent = false);
+
+ void draw_triangles(const Point_3& p1, const Point_3& p2, const Point_3& p3);
+
+ // todo remove
+ void draw_triangles(const std::vector<Point_3*>& points);
+
+ void end_draw_triangles();
+
+
+ signals:
+ void click(const Point_3& position);
+};
+
+#endif // VIEW_VIEWER_H_
diff --git a/src/GudhUI/view/Viewer_instructor.cpp b/src/GudhUI/view/Viewer_instructor.cpp
index 3cb8f152..1ddd4d8b 100644
--- a/src/GudhUI/view/Viewer_instructor.cpp
+++ b/src/GudhUI/view/Viewer_instructor.cpp
@@ -1,206 +1,192 @@
-/*
- * Viewer_instructor.cpp
+/* 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: Aug 26, 2014
- * Author: dsalinas
+ * 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/>.
+ *
*/
#include <utility>
+
#include "Viewer_instructor.h"
#include "utils/UI_utils.h"
#include "FirstCoordProjector.h"
-
Viewer_instructor::Viewer_instructor(QWidget* parent,
- Viewer* viewer,
- const Complex& mesh
-):viewer_(viewer),mesh_(mesh),projector_(new FirstCoordProjector3D()){
- viewer_->set_instructor(this);
+ Viewer* viewer,
+ const Complex& mesh
+ )
+ : viewer_(viewer), mesh_(mesh), projector_(new FirstCoordProjector3D()) {
+ viewer_->set_instructor(this);
+}
+
+void Viewer_instructor::initialize_bounding_box() {
+ auto pair_bounding_box = compute_bounding_box_corners();
+ viewer_->set_bounding_box(proj(pair_bounding_box.first), proj(pair_bounding_box.second));
+ viewer_->init_scene();
}
+std::pair<Complex::Point, Complex::Point> Viewer_instructor::compute_bounding_box_corners() {
+ if (mesh_.empty()) {
+ return std::make_pair(Point(-1, -1, -1, 1), Point(1, 1, 1, 1));
+ } else {
+ double x_min = 1e10;
+ double y_min = 1e10;
+ double z_min = 1e10;
+ double x_max = -1e10;
+ double y_max = -1e10;
+ double z_max = -1e10;
+ for (auto vi : mesh_.vertex_range()) {
+ auto pt = proj(mesh_.point(vi));
+ x_min = (std::min)(x_min, pt.x());
+ y_min = (std::min)(y_min, pt.y());
+ z_min = (std::min)(z_min, pt.z());
-void
-Viewer_instructor::initialize_bounding_box(){
- auto pair_bounding_box = compute_bounding_box_corners();
- viewer_->set_bounding_box(proj(pair_bounding_box.first),proj(pair_bounding_box.second));
- viewer_->init_scene();
-}
-
-std::pair<Complex::Point,Complex::Point>
-Viewer_instructor::compute_bounding_box_corners(){
- if(mesh_.empty()){
- return std::make_pair(Point(-1,-1,-1,1),Point(1,1,1,1));
- }
- else{
- double x_min = 1e10;
- double y_min = 1e10;
- double z_min = 1e10;
- double x_max = -1e10;
- double y_max = -1e10;
- double z_max = -1e10;
- for( auto vi : mesh_.vertex_range())
- {
- auto pt = proj(mesh_.point(vi));
- x_min = (std::min)(x_min,pt.x());
- y_min = (std::min)(y_min,pt.y());
- z_min = (std::min)(z_min,pt.z());
-
- x_max = (std::max)(x_max,pt.x());
- y_max = (std::max)(y_max,pt.y());
- z_max = (std::max)(z_max,pt.z());
-
- }
- return std::make_pair(
- Point(x_min,y_min,z_min,1.),
- Point(x_max,y_max,z_max,1.)
- );
- }
+ x_max = (std::max)(x_max, pt.x());
+ y_max = (std::max)(y_max, pt.y());
+ z_max = (std::max)(z_max, pt.z());
+ }
+ return std::make_pair(Point(x_min, y_min, z_min, 1.),
+ Point(x_max, y_max, z_max, 1.));
+ }
}
-void
-Viewer_instructor::show_entire_scene(){
- viewer_->show_entire_scene();
+void Viewer_instructor::show_entire_scene() {
+ viewer_->show_entire_scene();
}
-const qglviewer::Camera*
-Viewer_instructor::camera() const{
- return viewer_->camera();
+const qglviewer::Camera* Viewer_instructor::camera() const {
+ return viewer_->camera();
}
int
-Viewer_instructor::width() const{
- return viewer_->width();
+Viewer_instructor::width() const {
+ return viewer_->width();
}
+
int
-Viewer_instructor::height() const{
- return viewer_->height();
+Viewer_instructor::height() const {
+ return viewer_->height();
}
/**
* to change display parameters
*/
-View_parameter&
-Viewer_instructor::view_params(){
- return view_params_;
+View_parameter& Viewer_instructor::view_params() {
+ return view_params_;
}
-
void
-Viewer_instructor::give_instructions(){
- if(view_params_.relative_light)
- viewer_->set_light_direction();
- else
- viewer_->set_light_direction(view_params_.theta,view_params_.phi);
- viewer_->set_light();
-
- if (view_params_.edge_mode) draw_edges();
- if (view_params_.triangle_mode) draw_triangles();
- if (view_params_.vertex_mode) draw_points();
+Viewer_instructor::give_instructions() {
+ if (view_params_.relative_light)
+ viewer_->set_light_direction();
+ else
+ viewer_->set_light_direction(view_params_.theta, view_params_.phi);
+ viewer_->set_light();
+ if (view_params_.edge_mode) draw_edges();
+ if (view_params_.triangle_mode) draw_triangles();
+ if (view_params_.vertex_mode) draw_points();
}
-void
-Viewer_instructor::draw_edges(){
- viewer_->begin_draw_edges(view_params_.size_edges,false);
+void Viewer_instructor::draw_edges() {
+ viewer_->begin_draw_edges(view_params_.size_edges, false);
- for(auto edge : mesh_.edge_range()){
- set_color_edge(edge);
- const Point& a = mesh_.point(mesh_.first_vertex(edge));
- const Point& b = mesh_.point(mesh_.second_vertex(edge)) ;
- viewer_->draw_edges(proj(a),proj(b));
- }
+ for (auto edge : mesh_.edge_range()) {
+ set_color_edge(edge);
+ const Point& a = mesh_.point(mesh_.first_vertex(edge));
+ const Point& b = mesh_.point(mesh_.second_vertex(edge));
+ viewer_->draw_edges(proj(a), proj(b));
+ }
- viewer_->end_draw_edges();
+ viewer_->end_draw_edges();
}
-void
-Viewer_instructor::draw_triangles(){
- const double size_triangles = 1.0;
- viewer_->begin_draw_triangles(size_triangles,view_params_.light);
-
- for(const auto& fit : mesh_.triangle_range()) {
- set_color_triangle(fit);
- if(view_params_.triangle_mode){
- auto fit_it = fit.begin();
- const Point& p1 = mesh_.point(*fit_it);
- const Point& p2 = mesh_.point(*(++fit_it));
- const Point& p3 = mesh_.point(*(++fit_it));
- viewer_->draw_triangles(proj(p1),proj(p2),proj(p3));
- }
- }
- viewer_->end_draw_triangles();
-}
+void Viewer_instructor::draw_triangles() {
+ const double size_triangles = 1.0;
+ viewer_->begin_draw_triangles(size_triangles, view_params_.light);
-void
-Viewer_instructor::draw_points(){
- viewer_->begin_draw_points( view_params_.size_vertices);
- for( auto vi : mesh_.vertex_range())
- {
- viewer_->set_size_point(view_params_.size_vertices);
- set_color_vertex(vi);
- viewer_->draw_points(proj(mesh_.point(vi)));
- }
- viewer_->end_draw_points();
+ for (const auto& fit : mesh_.triangle_range()) {
+ set_color_triangle(fit);
+ if (view_params_.triangle_mode) {
+ auto fit_it = fit.begin();
+ const Point& p1 = mesh_.point(*fit_it);
+ const Point& p2 = mesh_.point(*(++fit_it));
+ const Point& p3 = mesh_.point(*(++fit_it));
+ viewer_->draw_triangles(proj(p1), proj(p2), proj(p3));
+ }
+ }
+ viewer_->end_draw_triangles();
}
-
-void
-Viewer_instructor::draw_edge(const Point&,const Point&){
-
+void Viewer_instructor::draw_points() {
+ viewer_->begin_draw_points(view_params_.size_vertices);
+ for (auto vi : mesh_.vertex_range()) {
+ viewer_->set_size_point(view_params_.size_vertices);
+ set_color_vertex(vi);
+ viewer_->draw_points(proj(mesh_.point(vi)));
+ }
+ viewer_->end_draw_points();
}
-void
-Viewer_instructor::draw_point(const Point&){
-
-}
+void Viewer_instructor::draw_edge(const Point&, const Point&) { }
+void Viewer_instructor::draw_point(const Point&) { }
/**
* set the right color of vertex/edge/triangle considering the view_params choice
*/
-void
-Viewer_instructor::set_color_vertex(Vertex_handle vh){
- viewer_->set_color(Color(view_params_.light_edges,view_params_.light_edges,view_params_.light_edges));
+void Viewer_instructor::set_color_vertex(Vertex_handle vh) {
+ viewer_->set_color(Color(view_params_.light_edges, view_params_.light_edges, view_params_.light_edges));
}
-void
-Viewer_instructor::set_color_edge(Edge_handle eh) {
- viewer_->set_color(Color(view_params_.light_edges,view_params_.light_edges,view_params_.light_edges));
+void Viewer_instructor::set_color_edge(Edge_handle eh) {
+ viewer_->set_color(Color(view_params_.light_edges, view_params_.light_edges, view_params_.light_edges));
}
-void
-Viewer_instructor::set_color_triangle(const Simplex_handle& triangle){
- viewer_->set_color(Color(view_params_.light_triangles,view_params_.light_triangles,view_params_.light_triangles));
+void Viewer_instructor::set_color_triangle(const Simplex& triangle) {
+ viewer_->set_color(Color(view_params_.light_triangles, view_params_.light_triangles, view_params_.light_triangles));
}
-
Viewer_instructor::Point_3
-Viewer_instructor::proj(const Point& p) const{
- return (*projector_)(p);
+Viewer_instructor::proj(const Point& p) const {
+ return (*projector_)(p);
}
-
-void
-Viewer_instructor::sceneChanged(){
- UIDBG("sceneChanged");
- viewer_->update_GL();
+void Viewer_instructor::sceneChanged() {
+ UIDBG("sceneChanged");
+ viewer_->update_GL();
}
-void
-Viewer_instructor::change_draw_vertices(){
- view_params_.change_vertex_mode();
+void Viewer_instructor::change_draw_vertices() {
+ view_params_.change_vertex_mode();
}
-void
-Viewer_instructor::change_draw_edges(){
- view_params_.change_edge_mode();
+
+void Viewer_instructor::change_draw_edges() {
+ view_params_.change_edge_mode();
}
-void
-Viewer_instructor::change_draw_triangles(){
- view_params_.change_triangle_mode();
+
+void Viewer_instructor::change_draw_triangles() {
+ view_params_.change_triangle_mode();
}
-void
-Viewer_instructor::change_light(){
- view_params_.light =! view_params_.light ;
+
+void Viewer_instructor::change_light() {
+ view_params_.light = !view_params_.light;
}
#include "Viewer_instructor.moc"
diff --git a/src/GudhUI/view/Viewer_instructor.h b/src/GudhUI/view/Viewer_instructor.h
index 9a2a236b..1da28009 100755..100644
--- a/src/GudhUI/view/Viewer_instructor.h
+++ b/src/GudhUI/view/Viewer_instructor.h
@@ -1,108 +1,117 @@
-#ifndef VIEWER_INSTRUCTOR_H
-#define VIEWER_INSTRUCTOR_H
-
-// todo do a viewer instructor that have directely a pointer to a QGLviewer and buffer ot not triangles
-
-
-#include <memory>
-
-#include <QFileDialog>
-#include <QKeyEvent>
-#include <QGLViewer/camera.h>
-
-
-#include "model/Complex_typedefs.h"
-
-#include "Projector3D.h"
-#include "View_parameter.h"
-#include "Viewer.h"
-
-class Viewer;
-class Viewer_parameter;
-
-class Viewer_instructor : public QWidget{
- Q_OBJECT
-
- typedef Geometry_trait::Point_3 Point_3;
- typedef Complex::Point Point;
- typedef Complex::Vertex_handle Vertex_handle;
- typedef Complex::Edge_handle Edge_handle;
- typedef Complex::Simplex_handle Simplex_handle;
-
-
- Viewer* viewer_;
- View_parameter view_params_;
- const Complex& mesh_;
- std::unique_ptr<Projector3D> projector_;
-
-
-public:
-
- Viewer_instructor(QWidget* parent,
- Viewer* viewer,
- const Complex& mesh
- );
-
-
- void initialize_bounding_box();
-
- std::pair<Point,Point> compute_bounding_box_corners();
-
- void show_entire_scene();
-
- const qglviewer::Camera* camera() const;
-
- int width() const;
- int height() const;
-
- /**
- * to change display parameters
- */
- View_parameter& view_params();
-
-
-public:
-
- /**
- * gives instructions to the viewer
- */
- void give_instructions();
-
- void draw_edges();
- void draw_triangles();
- void draw_points();
-
-
- void draw_edge(const Point&,const Point&);
-
- void draw_point(const Point&);
-
-
- /**
- * set the right color of vertex/edge/triangle considering the view_params choice
- */
- void set_color_vertex(Vertex_handle vh);
- void set_color_edge(Edge_handle eh);
-
- void set_color_triangle(const Simplex_handle& triangle);
-
-private:
- /**
- * Projection to 3D needed for the viewer.
- */
- Point_3 proj(const Point& p) const;
-
- public slots :
-
- void sceneChanged();
-
- void change_draw_vertices();
- void change_draw_edges();
- void change_draw_triangles();
- void change_light();
-
-
-
-};
-
-#endif //VIEWER_INSTRUCTOR_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.
+ *
+ * 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 VIEW_VIEWER_INSTRUCTOR_H_
+#define VIEW_VIEWER_INSTRUCTOR_H_
+
+// 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>
+
+#include <memory>
+#include <utility> // for pair<>
+
+#include "model/Complex_typedefs.h"
+
+#include "Projector3D.h"
+#include "View_parameter.h"
+#include "Viewer.h"
+
+class Viewer;
+class Viewer_parameter;
+
+class Viewer_instructor : public QWidget {
+ Q_OBJECT
+
+ typedef Geometry_trait::Point_3 Point_3;
+ typedef Complex::Point Point;
+ typedef Complex::Vertex_handle Vertex_handle;
+ typedef Complex::Edge_handle Edge_handle;
+ typedef Complex::Simplex Simplex;
+
+ Viewer* viewer_;
+ View_parameter view_params_;
+ const Complex& mesh_;
+ std::unique_ptr<Projector3D> projector_;
+
+ public:
+ Viewer_instructor(QWidget* parent, Viewer* viewer, const Complex& mesh);
+
+ void initialize_bounding_box();
+
+ std::pair<Point, Point> compute_bounding_box_corners();
+
+ void show_entire_scene();
+
+ const qglviewer::Camera* camera() const;
+
+ int width() const;
+ int height() const;
+
+ /**
+ * to change display parameters
+ */
+ View_parameter& view_params();
+
+ public:
+ /**
+ * gives instructions to the viewer
+ */
+ void give_instructions();
+
+ void draw_edges();
+ void draw_triangles();
+ void draw_points();
+
+ void draw_edge(const Point&, const Point&);
+
+ void draw_point(const Point&);
+
+ /**
+ * set the right color of vertex/edge/triangle considering the view_params choice
+ */
+ void set_color_vertex(Vertex_handle vh);
+ void set_color_edge(Edge_handle eh);
+
+ void set_color_triangle(const Simplex& triangle);
+
+ private:
+ /**
+ * Projection to 3D needed for the viewer.
+ */
+ Point_3 proj(const Point& p) const;
+
+ public slots:
+ void sceneChanged();
+ void change_draw_vertices();
+ void change_draw_edges();
+ void change_draw_triangles();
+ void change_light();
+};
+
+#endif // VIEW_VIEWER_INSTRUCTOR_H_
diff --git a/src/Hasse_complex/example/CMakeLists.txt b/src/Hasse_complex/example/CMakeLists.txt
deleted file mode 100644
index 564df49d..00000000
--- a/src/Hasse_complex/example/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-cmake_minimum_required(VERSION 2.6)
-project(GUDHIHasseComplexExample)
-
-add_executable ( hasse_complex_from_simplex_tree hasse_complex_from_simplex_tree.cpp )
-add_test(hasse_complex_from_simplex_tree ${CMAKE_CURRENT_BINARY_DIR}/hasse_complex_from_simplex_tree)
diff --git a/src/Hasse_complex/example/hasse_complex_from_simplex_tree.cpp b/src/Hasse_complex/example/hasse_complex_from_simplex_tree.cpp
deleted file mode 100644
index 1de43ab7..00000000
--- a/src/Hasse_complex/example/hasse_complex_from_simplex_tree.cpp
+++ /dev/null
@@ -1,124 +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) 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 <iostream>
-#include <ctime>
-#include "gudhi/graph_simplicial_complex.h"
-#include "gudhi/Simplex_tree.h"
-
-using namespace Gudhi;
-
-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;
-
-int main(int argc, char * const argv[]) {
- // TEST OF INSERTION
- std::cout << "********************************************************************" << std::endl;
- std::cout << "TEST OF INSERTION" << std::endl;
- typeST st;
-
- // ++ FIRST
- std::cout << " - INSERT (2,1,0)" << std::endl;
- typeVectorVertex SimplexVector1;
- SimplexVector1.push_back(2);
- SimplexVector1.push_back(1);
- SimplexVector1.push_back(0);
- st.insert_simplex_and_subfaces(SimplexVector1, 0.3);
-
- // ++ SECOND
- std::cout << " - INSERT 3" << std::endl;
- typeVectorVertex SimplexVector2;
- SimplexVector2.push_back(3);
- st.insert_simplex_and_subfaces(SimplexVector2, 0.1);
-
- // ++ THIRD
- std::cout << " - INSERT (0,3)" << std::endl;
- typeVectorVertex SimplexVector3;
- SimplexVector3.push_back(3);
- SimplexVector3.push_back(0);
- st.insert_simplex_and_subfaces(SimplexVector3, 0.2);
-
- // ++ FOURTH
- std::cout << " - INSERT (1,0) (already inserted)" << std::endl;
- typeVectorVertex SimplexVector4;
- SimplexVector4.push_back(1);
- SimplexVector4.push_back(0);
- st.insert_simplex_and_subfaces(SimplexVector4, 0.2);
-
- // ++ FIFTH
- std::cout << " - INSERT (3,4,5)" << std::endl;
- typeVectorVertex SimplexVector5;
- SimplexVector5.push_back(3);
- SimplexVector5.push_back(4);
- SimplexVector5.push_back(5);
- st.insert_simplex_and_subfaces(SimplexVector5, 0.3);
-
- // ++ SIXTH
- std::cout << " - INSERT (0,1,6,7)" << std::endl;
- typeVectorVertex SimplexVector6;
- SimplexVector6.push_back(0);
- SimplexVector6.push_back(1);
- SimplexVector6.push_back(6);
- SimplexVector6.push_back(7);
- st.insert_simplex_and_subfaces(SimplexVector6, 0.4);
-
- /* Inserted simplex: */
- /* 1 6 */
- /* o---o */
- /* /X\7/ 4 */
- /* o---o---o---o */
- /* 2 0 3\X/ */
- /* o */
- /* 5 */
-
- /* In other words: */
- /* A facet [2,1,0] */
- /* An edge [0,3] */
- /* A facet [3,4,5] */
- /* A cell [0,1,6,7] */
- /* A cell [4,5,8,9] */
- /* A facet [9,10,11] */
- /* An edge [11,6] */
- /* An edge [10,12,2] */
-
- // ++ GENERAL VARIABLE SET
- st.set_filtration(0.4); // Max filtration value
- st.set_dimension(3); // Max dimension = 3 -> (0,1,6,7)
-
- std::cout << "The complex contains " << st.num_simplices() << " simplices - " << st.num_vertices() << " vertices " << std::endl;
- std::cout << " - dimension " << st.dimension() << " - filtration " << st.filtration() << std::endl;
- std::cout << std::endl << std::endl << "Iterator on Simplices in the filtration, with [filtration value]:" << std::endl;
- std::cout << "**************************************************************" << std::endl;
-
- for( auto f_simplex : st.filtration_simplex_range() )
- {
- std::cout << " " << "[" << st.filtration(f_simplex) << "] ";
- for( auto vertex : st.simplex_vertex_range(f_simplex) )
- {
- std::cout << (int)vertex;
- }
- }
-
- return 0;
-}
diff --git a/src/Hasse_complex/include/gudhi/Hasse_complex.h b/src/Hasse_complex/include/gudhi/Hasse_complex.h
index 427d9916..8b06b771 100644
--- a/src/Hasse_complex/include/gudhi/Hasse_complex.h
+++ b/src/Hasse_complex/include/gudhi/Hasse_complex.h
@@ -1,208 +1,244 @@
- /* 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/>.
- */
-
-#ifndef GUDHI_HASSE_DIAGRAM_H
-#define GUDHI_HASSE_DIAGRAM_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.
+ *
+ * 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/>.
+ */
+
+#ifndef HASSE_COMPLEX_H_
+#define HASSE_COMPLEX_H_
+
+#include <gudhi/allocator.h>
-#include <algorithm>
#include <boost/iterator/counting_iterator.hpp>
-namespace Gudhi{
+#include <algorithm>
+#include <utility> // for pair
+#include <vector>
+
+#ifdef GUDHI_USE_TBB
+#include <tbb/parallel_for.h>
+#endif
+
+namespace Gudhi {
template < class HasseCpx >
-struct Hasse_simplex
-{
-//Complex_ds must verify that cpx->key(sh) is the order of sh in the filtration
+struct Hasse_simplex {
+ // Complex_ds must verify that cpx->key(sh) is the order of sh in the filtration
+
template< class Complex_ds >
- Hasse_simplex ( Complex_ds & cpx
- , typename Complex_ds::Simplex_handle sh )
- : key_(cpx.key(sh))
- , filtration_(cpx.filtration(sh))
- , boundary_()
- {
- boundary_.reserve(cpx.dimension(sh)+1);
- for( auto b_sh : cpx.boundary_simplex_range(sh) )
- { boundary_.push_back( cpx.key(b_sh) ); }
- }
-
- Hasse_simplex ( typename HasseCpx::Simplex_key key
+ Hasse_simplex(Complex_ds & cpx
+ , typename Complex_ds::Simplex_handle sh)
+ : filtration_(cpx.filtration(sh))
+ , boundary_() {
+ boundary_.reserve(cpx.dimension(sh) + 1);
+ for (auto b_sh : cpx.boundary_simplex_range(sh)) {
+ boundary_.push_back(cpx.key(b_sh));
+ }
+ }
+
+ Hasse_simplex(typename HasseCpx::Simplex_key key
, typename HasseCpx::Filtration_value fil
- , std::vector<typename HasseCpx::Simplex_handle> boundary)
- : key_(key)
- , filtration_(fil)
- , boundary_(boundary) {}
+ , std::vector<typename HasseCpx::Simplex_handle> const& boundary)
+ : key_(key)
+ , filtration_(fil)
+ , boundary_(boundary) { }
- typename HasseCpx::Simplex_key key_;
- typename HasseCpx::Filtration_value filtration_;
+ typename HasseCpx::Simplex_key key_;
+ typename HasseCpx::Filtration_value filtration_;
std::vector<typename HasseCpx::Simplex_handle> boundary_;
};
-
-
-/** \brief Data structure representing a Hasse diagram, i.e.
- * a complex where all codimension 1 incidence
- * relations are explicitly encoded.
- *
- * \implements FilteredComplex
- * \ingroup simplex_tree
- */
-template < typename FiltrationValue = double
- , typename SimplexKey = int
- , typename VertexHandle = int
- >
-class Hasse_complex
-{
-public:
-
- typedef Hasse_simplex<Hasse_complex> Hasse_simp;
- typedef FiltrationValue Filtration_value;
- typedef SimplexKey Simplex_key;
- typedef int Simplex_handle; //index in vector complex_
-
- typedef boost::counting_iterator< Simplex_handle > Filtration_simplex_iterator;
- typedef boost::iterator_range<Filtration_simplex_iterator> Filtration_simplex_range;
-
- typedef typename std::vector< Simplex_handle >::iterator Boundary_simplex_iterator;
- typedef boost::iterator_range<Boundary_simplex_iterator> Boundary_simplex_range;
-
- typedef typename std::vector< Simplex_handle >::iterator Skeleton_simplex_iterator;
- typedef boost::iterator_range< Skeleton_simplex_iterator > Skeleton_simplex_range;
-
-
-/* only dimension 0 skeleton_simplex_range(...) */
- Skeleton_simplex_range skeleton_simplex_range( int dim = 0 ) {
- if(dim != 0) { std::cerr << "Dimension must be 0 \n"; }
- return Skeleton_simplex_range(vertices_.begin(),vertices_.end());
+/** \private
+ * \brief Data structure representing a Hasse diagram, i.e.
+ * a complex where all codimension 1 incidence
+ * relations are explicitly encoded.
+ *
+ * \implements FilteredComplex
+ * \ingroup simplex_tree
+ */
+template < typename FiltrationValue = double
+, typename SimplexKey = int
+, typename VertexHandle = int
+>
+class Hasse_complex {
+ public:
+ typedef Hasse_simplex<Hasse_complex> Hasse_simp;
+ typedef FiltrationValue Filtration_value;
+ typedef SimplexKey Simplex_key;
+ typedef int Simplex_handle; // index in vector complex_
+
+ typedef boost::counting_iterator< Simplex_handle > Filtration_simplex_iterator;
+ typedef boost::iterator_range<Filtration_simplex_iterator> Filtration_simplex_range;
+
+ typedef typename std::vector< Simplex_handle >::iterator Boundary_simplex_iterator;
+ typedef boost::iterator_range<Boundary_simplex_iterator> Boundary_simplex_range;
+
+ typedef typename std::vector< Simplex_handle >::iterator Skeleton_simplex_iterator;
+ typedef boost::iterator_range< Skeleton_simplex_iterator > Skeleton_simplex_range;
+
+ /* only dimension 0 skeleton_simplex_range(...) */
+ Skeleton_simplex_range skeleton_simplex_range(int dim = 0) {
+ if (dim != 0) {
+ std::cerr << "Dimension must be 0 \n";
+ }
+ return Skeleton_simplex_range(vertices_.begin(), vertices_.end());
}
template < class Complex_ds >
Hasse_complex(Complex_ds & cpx)
- : complex_()
- , vertices_()
- , threshold_(cpx.filtration())
- , num_vertices_()
- , dim_max_(cpx.dimension())
- {
- complex_.reserve(cpx.num_simplices());
- int idx = 0;
- for(auto cpx_sh : cpx.filtration_simplex_range())
- {
- complex_.push_back(Hasse_simp(cpx,cpx_sh));
- if(dimension(idx) == 0) { vertices_.push_back(idx); }
- ++idx;
+ : complex_(cpx.num_simplices())
+ , vertices_()
+ , threshold_(cpx.filtration())
+ , num_vertices_()
+ , dim_max_(cpx.dimension()) {
+ int size = complex_.size();
+#ifdef GUDHI_USE_TBB
+ tbb::parallel_for(0, size, [&](int idx){new (&complex_[idx]) Hasse_simp(cpx, cpx.simplex(idx));});
+ for (int idx=0; idx < size; ++idx)
+ if (complex_[idx].boundary_.empty())
+ vertices_.push_back(idx);
+#else
+ for (int idx=0; idx < size; ++idx) {
+ new (&complex_[idx]) Hasse_simp(cpx, cpx.simplex(idx));
+ if (complex_[idx].boundary_.empty())
+ vertices_.push_back(idx);
}
+#endif
}
Hasse_complex()
- : complex_()
- , vertices_()
- , threshold_(0)
- , num_vertices_(0)
- , dim_max_(-1) {}
-
- size_t num_simplices() { return complex_.size(); }
+ : complex_()
+ , vertices_()
+ , threshold_(0)
+ , num_vertices_(0)
+ , dim_max_(-1) { }
+
+ size_t num_simplices() {
+ return complex_.size();
+ }
- Filtration_simplex_range filtration_simplex_range()
- { return Filtration_simplex_range( Filtration_simplex_iterator(0)
- , Filtration_simplex_iterator(complex_.size()) ); }
+ Filtration_simplex_range filtration_simplex_range() {
+ return Filtration_simplex_range(Filtration_simplex_iterator(0)
+ , Filtration_simplex_iterator(complex_.size()));
+ }
- Simplex_key key( Simplex_handle sh ) { return complex_[sh].key_; }
+ Simplex_key key(Simplex_handle sh) {
+ return complex_[sh].key_;
+ }
- Simplex_key null_key() { return -1; }
+ Simplex_key null_key() {
+ return -1;
+ }
- Simplex_handle simplex( Simplex_key key )
- {
- if(key == null_key()) return null_simplex();
+ Simplex_handle simplex(Simplex_key key) {
+ if (key == null_key()) return null_simplex();
return key;
}
- Simplex_handle null_simplex() { return -1; }
+ Simplex_handle null_simplex() {
+ return -1;
+ }
- Filtration_value filtration( Simplex_handle sh ) {
- if( sh == null_simplex() ) { return filtration(); }
+ Filtration_value filtration(Simplex_handle sh) {
+ if (sh == null_simplex()) {
+ return filtration();
+ }
return complex_[sh].filtration_;
}
- Filtration_value filtration() { return threshold_; }
+ Filtration_value filtration() {
+ return threshold_;
+ }
+
+ int dimension(Simplex_handle sh) {
+ if (complex_[sh].boundary_.empty()) return 0;
+ return complex_[sh].boundary_.size() - 1;
+ }
- int dimension ( Simplex_handle sh ) {
- if(complex_[sh].boundary_.empty()) return 0;
- return complex_[sh].boundary_.size()-1;
+ int dimension() {
+ return dim_max_;
}
- int dimension () { return dim_max_; }
- std::pair<Simplex_handle,Simplex_handle> endpoints( Simplex_handle sh )
- { return std::pair<Simplex_handle,Simplex_handle>( complex_[sh].boundary_[0]
- , complex_[sh].boundary_[1] ) ;}
+ std::pair<Simplex_handle, Simplex_handle> endpoints(Simplex_handle sh) {
+ return std::pair<Simplex_handle, Simplex_handle>(complex_[sh].boundary_[0]
+ , complex_[sh].boundary_[1]);
+ }
- void assign_key( Simplex_handle sh, Simplex_key key) { complex_[sh].key_ = key; }
+ void assign_key(Simplex_handle sh, Simplex_key key) {
+ complex_[sh].key_ = key;
+ }
- Boundary_simplex_range boundary_simplex_range ( Simplex_handle sh )
- { return Boundary_simplex_range( complex_[sh].boundary_.begin()
- , complex_[sh].boundary_.end() ); }
+ Boundary_simplex_range boundary_simplex_range(Simplex_handle sh) {
+ return Boundary_simplex_range(complex_[sh].boundary_.begin()
+ , complex_[sh].boundary_.end());
+ }
- void display_simplex(Simplex_handle sh)
- {
+ void display_simplex(Simplex_handle sh) {
std::cout << dimension(sh) << " ";
- for(auto sh_b : boundary_simplex_range(sh)) std::cout << sh_b << " ";
+ for (auto sh_b : boundary_simplex_range(sh)) std::cout << sh_b << " ";
std::cout << " " << filtration(sh) << " key=" << key(sh);
}
- void initialize_filtration()
- {
+ void initialize_filtration() {
+ // Setting the keys is done by pcoh, Simplex_tree doesn't do it either.
+#if 0
Simplex_key key = 0;
- for(auto & h_simp : complex_) { h_simp.key_ = key; ++key; }
+ for (auto & h_simp : complex_)
+ h_simp.key_ = key++;
+#endif
}
- std::vector< Hasse_simp > complex_;
+ std::vector< Hasse_simp, Gudhi::no_init_allocator<Hasse_simp> > complex_;
std::vector<Simplex_handle> vertices_;
- Filtration_value threshold_;
- size_t num_vertices_;
- int dim_max_;
+ Filtration_value threshold_;
+ size_t num_vertices_;
+ int dim_max_;
};
template< typename T1, typename T2, typename T3 >
-std::istream& operator>> ( std::istream & is
- , Hasse_complex< T1, T2, T3 > & hcpx )
-{
+std::istream& operator>>(std::istream & is
+ , Hasse_complex< T1, T2, T3 > & hcpx) {
assert(hcpx.num_simplices() == 0);
size_t num_simp;
is >> num_simp;
- hcpx.complex_.reserve(num_simp);
-
- std::vector< typename Hasse_complex<T1,T2,T3>::Simplex_key > boundary;
- typename Hasse_complex<T1,T2,T3>::Filtration_value fil;
- typename Hasse_complex<T1,T2,T3>::Filtration_value max_fil = 0 ;
- int max_dim = -1;
- int key = 0 ;
- while(read_hasse_simplex( is, boundary, fil )) //read all simplices in the file as a list of vertices
- {
- //insert every simplex in the simplex tree
- hcpx.complex_.push_back( Hasse_simplex< Hasse_complex<T1,T2,T3> >(key,fil,boundary));
-
- if(max_dim < hcpx.dimension(key)) { max_dim = hcpx.dimension(key); }
- if(hcpx.dimension(key) == 0) { hcpx.vertices_.push_back(key); }
- if(max_fil < fil) { max_fil = fil; }
+ hcpx.complex_.reserve(num_simp);
+
+ std::vector< typename Hasse_complex<T1, T2, T3>::Simplex_key > boundary;
+ typename Hasse_complex<T1, T2, T3>::Filtration_value fil;
+ typename Hasse_complex<T1, T2, T3>::Filtration_value max_fil = 0;
+ int max_dim = -1;
+ int key = 0;
+ // read all simplices in the file as a list of vertices
+ while (read_hasse_simplex(is, boundary, fil)) {
+ // insert every simplex in the simplex tree
+ hcpx.complex_.emplace_back(key, fil, boundary);
+
+ if (max_dim < hcpx.dimension(key)) {
+ max_dim = hcpx.dimension(key);
+ }
+ if (hcpx.dimension(key) == 0) {
+ hcpx.vertices_.push_back(key);
+ }
+ if (max_fil < fil) {
+ max_fil = fil;
+ }
++key;
boundary.clear();
@@ -214,6 +250,6 @@ std::istream& operator>> ( std::istream & is
return is;
}
-} // namespace GUDHI
+} // namespace Gudhi
-#endif // GUDHI_HASSE_DIAGRAM_H
+#endif // HASSE_COMPLEX_H_
diff --git a/src/Persistent_cohomology/concept/FilteredComplex.h b/src/Persistent_cohomology/concept/FilteredComplex.h
index 1834903b..c19698df 100644
--- a/src/Persistent_cohomology/concept/FilteredComplex.h
+++ b/src/Persistent_cohomology/concept/FilteredComplex.h
@@ -43,7 +43,7 @@ struct FilteredComplex
* is model of IndexingTag. */
typedef unspecified Indexing_tag;
-/** Returns a Simplex_hanlde that is different from all simplex handles
+/** Returns a Simplex_handle that is different from all simplex handles
* of the simplices. */
Simplex_handle null_simplex();
/** \brief Returns the number of simplices in the complex.
@@ -61,13 +61,14 @@ struct FilteredComplex
/** \brief Returns a key that is different from the keys associated
* to the simplices. */
Simplex_key null_key ();
-/** \brief Returns the key associated to a simplex. */
+/** \brief Returns the key associated to a simplex.
+ *
+ * This is never called on null_simplex(). */
Simplex_key key ( Simplex_handle sh );
-/** \brief Returns the simplex associated to a key.
- *
- * If key is different from null_key(), there must be a unique
- * simplex having this key. */
- Simplex_handle simplex ( Simplex_key key );
+/** \brief Returns the simplex that has index idx in the filtration.
+ *
+ * This is never called on null_key(). */
+ Simplex_handle simplex ( Simplex_key idx );
/** \brief Assign a key to a simplex. */
void assign_key(Simplex_handle sh, Simplex_key key);
@@ -138,6 +139,6 @@ Filtration_simplex_range filtration_simplex_range();
* @todo use an enum? Just a bool?
*/
//int is_before_in_filtration(Simplex_handle s, Simplex_handle t);
-/*************************************************/
+/*************************************************/
};
diff --git a/src/Persistent_cohomology/doc/3DTorus_poch.png b/src/Persistent_cohomology/doc/3DTorus_poch.png
new file mode 100644
index 00000000..1c9d8328
--- /dev/null
+++ b/src/Persistent_cohomology/doc/3DTorus_poch.png
Binary files differ
diff --git a/src/Persistent_cohomology/doc/Intro_persistent_cohomology.h b/src/Persistent_cohomology/doc/Intro_persistent_cohomology.h
new file mode 100644
index 00000000..0cba6361
--- /dev/null
+++ b/src/Persistent_cohomology/doc/Intro_persistent_cohomology.h
@@ -0,0 +1,206 @@
+/* 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/>.
+ */
+
+#ifndef DOC_PERSISTENT_COHOMOLOGY_INTRO_PERSISTENT_COHOMOLOGY_H_
+#define DOC_PERSISTENT_COHOMOLOGY_INTRO_PERSISTENT_COHOMOLOGY_H_
+
+// needs namespace for Doxygen to link on classes
+namespace Gudhi {
+// needs namespace for Doxygen to link on classes
+namespace persistent_cohomology {
+
+/** \defgroup persistent_cohomology Persistent Cohomology
+
+ \author Clément Maria
+
+ 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 and an evolution scheme.
+
+ \section persistencetopolocalspaces Topological Spaces
+ Topological spaces are represented by simplicial complexes.
+ Let \f$V = \{1, \cdots ,|V|\}\f$ be a set of <EM>vertices</EM>.
+ A <EM>simplex</EM> \f$\sigma\f$ is a subset of vertices
+ \f$\sigma \subseteq V\f$. A <EM>simplicial complex</EM> \f$\mathbf{K}\f$
+ on \f$V\f$ is a collection of simplices \f$\{\sigma\}\f$,
+ \f$\sigma \subseteq V\f$, such that \f$\tau \subseteq \sigma \in \mathbf{K}
+ \Rightarrow \tau \in \mathbf{K}\f$. The dimension \f$n=|\sigma|-1\f$ of \f$\sigma\f$
+ is its number of elements minus 1. A <EM>filtration</EM> of a simplicial complex is
+ a function \f$f:\mathbf{K} \rightarrow \mathbb{R}\f$ satisfying \f$f(\tau)\leq
+ f(\sigma)\f$ whenever \f$\tau \subseteq \sigma\f$.
+
+ We define the concept FilteredComplex which enumerates the requirements for a class
+ to represent a filtered complex from which persistent homology may be computed.
+ We use the vocabulary of simplicial complexes, but the concept
+ is valid for any type of cell complex. The main requirements
+ are the definition of:
+ \li type <CODE>Indexing_tag</CODE>, which is a model of the concept
+ <CODE>IndexingTag</CODE>,
+ describing the nature of the indexing scheme,
+ \li type Simplex_handle to manipulate simplices,
+ \li method <CODE>int dimension(Simplex_handle)</CODE> returning
+ the dimension of a simplex,
+ \li type and method <CODE>Boundary_simplex_range
+ boundary_simplex_range(Simplex_handle)</CODE> that returns
+ a range giving access to the codimension 1 subsimplices of the
+ input simplex, as-well-as the coefficients \f$(-1)^i\f$ in the
+ definition of the operator \f$\partial\f$. The iterators have
+ value type <CODE>Simplex_handle</CODE>,
+ \li type and method
+ <CODE>Filtration_simplex_range filtration_simplex_range ()</CODE>
+ that returns a range giving
+ access to all the simplices of the complex read in the order
+ assigned by the indexing scheme,
+ \li type and method
+ <CODE>Filtration_value filtration (Simplex_handle)</CODE> that returns the value of
+ the filtration on the simplex represented by the handle.
+
+ \section persistencehomology Homology
+ For a ring \f$\mathcal{R}\f$, the group of <EM>n-chains</EM>,
+ denoted \f$\mathbf{C}_n(\mathbf{K},\mathcal{R})\f$, of \f$\mathbf{K}\f$ is the
+ group of formal sums of
+ n-simplices with \f$\mathcal{R}\f$ coefficients. The <EM>boundary operator</EM> is a
+ linear operator
+ \f$\partial_n: \mathbf{C}_n(\mathbf{K},\mathcal{R}) \rightarrow \mathbf{C}_{n-1}(\mathbf{K},\mathcal{R})\f$
+ such that \f$\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]\f$,
+ where \f$\widehat{v_i}\f$ means \f$v_i\f$ is omitted from the list. The chain
+ groups form a sequence:
+
+ \f[\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}) \f]
+
+ of finitely many groups \f$\mathbf{C}_n(\mathbf{K},\mathcal{R})\f$ and homomorphisms
+ \f$\partial_n\f$, indexed by the dimension \f$n \geq 0\f$.
+ The boundary operators satisfy the property \f$\partial_n \circ \partial_{n+1}=0\f$
+ for every \f$n > 0\f$
+ and we define the homology groups:
+
+ \f[\mathbf{H}_n(\mathbf{K},\mathcal{R}) = \ker \partial_n / \mathrm{im} \ \partial_{n+1}\f]
+
+ 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.
+
+ \section persistenceindexingscheme Indexing Scheme
+ "Changing" a simplicial complex consists in applying a simplicial map.
+ An <EM>indexing scheme</EM> 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: <EM>linear</EM> ones
+ \f$\bullet \longrightarrow \bullet \longrightarrow \cdots \longrightarrow \bullet
+ \longrightarrow \bullet\f$
+ in persistent homology \cite DBLP:journals/dcg/ZomorodianC05 ,
+ and <EM>zigzag</EM> ones
+ \f$\bullet \longrightarrow \bullet \longleftarrow \cdots
+ \longrightarrow \bullet
+ \longleftarrow \bullet \f$ 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.
+
+\section 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.
+
+\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
+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_2alpha_complex_3d_persistence_8cpp-example.html">
+Persistent_cohomology/alpha_complex_3d_persistence.cpp</a> computes the persistent homology with
+\f$\mathbb{Z}/2\mathbb{Z}\f$ coefficients of the alpha complex on points sampling from an OFF file.
+\code $> ./alpha_complex_3d_persistence ../../data/points/tore3D_300.off 2 0.45 \endcode
+\code 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.
+\code $> ./alpha_complex_persistence -r 32 -p 2 -m 0.45 ../../data/points/tore3D_300.off \endcode
+\code Alpha complex is of dimension 3 - 9273 simplices - 300 vertices.
+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_2periodic_alpha_complex_3d_persistence_8cpp-example.html">
+Persistent_cohomology/periodic_alpha_complex_3d_persistence.cpp</a> computes the persistent homology with
+\f$\mathbb{Z}/2\mathbb{Z}\f$ coefficients of the periodic alpha complex on points sampling from an OFF file.
+\code $> ./periodic_alpha_complex_3d_persistence ../../data/points/grid_10_10_10_in_0_1.off 3 1.0 \endcode
+\code Periodic Delaunay computed.
+Simplex_tree dim: 3
+3 0 0 inf
+3 1 0.0025 inf
+3 1 0.0025 inf
+3 1 0.0025 inf
+3 2 0.005 inf
+3 2 0.005 inf
+3 2 0.005 inf
+3 3 0.0075 inf \endcode
+
+\li <a href="_persistent_cohomology_2plain_homology_8cpp-example.html">
+Persistent_cohomology/plain_homology.cpp</a> computes the plain homology of a simple simplicial complex without
+filtration values.
+
+ \copyright GNU General Public License v3.
+ */
+
+} // namespace persistent_cohomology
+
+} // namespace Gudhi
+
+#endif // DOC_PERSISTENT_COHOMOLOGY_INTRO_PERSISTENT_COHOMOLOGY_H_
diff --git a/src/Persistent_cohomology/example/CMakeLists.txt b/src/Persistent_cohomology/example/CMakeLists.txt
index 3697a419..d97d1b63 100644
--- a/src/Persistent_cohomology/example/CMakeLists.txt
+++ b/src/Persistent_cohomology/example/CMakeLists.txt
@@ -1,41 +1,84 @@
cmake_minimum_required(VERSION 2.6)
-project(GUDHIExPersCohom)
+project(Persistent_cohomology_examples)
# problem with Visual Studio link on Boost program_options
-if (NOT MSVC)
- 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_definitions( -DBOOST_ALL_NO_LIB )
+add_definitions( -DBOOST_ALL_DYN_LINK )
- add_executable(rips_persistence rips_persistence.cpp)
- target_link_libraries(rips_persistence ${Boost_SYSTEM_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY})
-
- add_test(rips_persistence_2 ${CMAKE_CURRENT_BINARY_DIR}/rips_persistence ${CMAKE_SOURCE_DIR}/data/points/Kl.txt -r 0.25 -d 3 -p 2 -m 100)
- add_test(rips_persistence_3 ${CMAKE_CURRENT_BINARY_DIR}/rips_persistence ${CMAKE_SOURCE_DIR}/data/points/Kl.txt -r 0.25 -d 3 -p 3 -m 100)
-
- add_executable(persistence_from_file persistence_from_file.cpp)
- target_link_libraries(persistence_from_file ${Boost_SYSTEM_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY})
- 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)
-
- if(GMPXX_FOUND AND GMP_FOUND)
- message("GMPXX_LIBRARIES = ${GMPXX_LIBRARIES}")
- message("GMP_LIBRARIES = ${GMP_LIBRARIES}")
+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_persistence rips_persistence.cpp)
+target_link_libraries(rips_persistence ${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})
+
+add_executable(persistence_from_file persistence_from_file.cpp)
+target_link_libraries(persistence_from_file ${Boost_SYSTEM_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY})
+
+if (TBB_FOUND)
+ target_link_libraries(plain_homology ${TBB_LIBRARIES})
+ target_link_libraries(persistence_from_simple_simplex_tree ${TBB_LIBRARIES})
+ target_link_libraries(rips_persistence ${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)
+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_test(rips_multifield_persistence_2_3 ${CMAKE_CURRENT_BINARY_DIR}/rips_multifield_persistence ${CMAKE_SOURCE_DIR}/data/points/Kl.txt -r 0.25 -d 3 -p 2 -q 3 -m 100)
- add_test(rips_multifield_persistence_2_71 ${CMAKE_CURRENT_BINARY_DIR}/rips_multifield_persistence ${CMAKE_SOURCE_DIR}/data/points/Kl.txt -r 0.25 -d 3 -p 2 -q 71 -m 100)
-
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})
-
- if(CGAL_FOUND)
- add_definitions(-DDEBUG_TRACES)
- add_executable(alpha_shapes_persistence alpha_shapes_persistence.cpp)
- target_link_libraries(alpha_shapes_persistence ${Boost_SYSTEM_LIBRARY} ${GMPXX_LIBRARIES} ${GMP_LIBRARIES} ${CGAL_LIBRARY})
- add_test(alpha_shapes_persistence_2_0_5 ${CMAKE_CURRENT_BINARY_DIR}/alpha_shapes_persistence ${CMAKE_SOURCE_DIR}/data/points/bunny_5000 2 0.5)
- #add_test(alpha_shapes_persistence_3_3_100 ${CMAKE_CURRENT_BINARY_DIR}/alpha_shapes_persistence ${CMAKE_SOURCE_DIR}/data/points/bunny_5000.st -p 3 -m 100)
- endif()
-
- endif()
-endif()
+ 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)
+ 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})
+
+ if (TBB_FOUND)
+ target_link_libraries(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)
+endif(CGAL_FOUND)
diff --git a/src/Persistent_cohomology/example/README b/src/Persistent_cohomology/example/README
index 8c71ccf5..7803e5ab 100644
--- a/src/Persistent_cohomology/example/README
+++ b/src/Persistent_cohomology/example/README
@@ -4,13 +4,13 @@ cd /path-to-example/
cmake .
make
-
-Example of use :
+***********************************************************************************************************************
+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/Kl.txt -r 0.25 -d 3 -p 2 -m 100
output:
210 0 0 inf
@@ -29,7 +29,7 @@ where
with Z/3Z coefficients:
-./rips_persistence ../../../data/points/Kl.txt -r 0.25 -d 3 -p 3 -m 100
+./rips_persistence ../../data/points/Kl.txt -r 0.25 -d 3 -p 3 -m 100
output:
3 0 0 inf
@@ -37,7 +37,7 @@ output:
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/Kl.txt -r 0.25 -d 3 -p 2 -q 3 -m 100
output:
6 0 0 inf
@@ -47,10 +47,106 @@ output:
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.txt -r 0.25 -d 3 -p 2 -q 71 -m 100
output:
557940830126698960967415390 0 0 inf
557940830126698960967415390 1 0.0702103 inf
2 1 0.0702103 inf
2 2 0.159992 inf
+
+***********************************************************************************************************************
+Example of use of ALPHA:
+
+For a more verbose mode, please run cmake with option "DEBUG_TRACES=TRUE" and recompile the programs.
+
+1) 3D special case
+------------------
+Computation of the persistent homology with Z/2Z coefficients of the alpha complex on points
+sampling a torus 3D:
+
+./alpha_complex_3d_persistence ../../data/points/tore3D_300.off 2 0.45
+
+output:
+Simplex_tree dim: 3
+2 0 0 inf
+2 1 0.0682162 1.0001
+2 1 0.0934117 1.00003
+2 2 0.56444 1.03938
+
+Here we retrieve expected Betti numbers on a tore 3D:
+Betti numbers[0] = 1
+Betti numbers[1] = 2
+Betti numbers[2] = 1
+
+N.B.: - alpha_complex_3d_persistence accepts only OFF files in 3D dimension.
+ - filtration values are alpha square values
+
+2) d-Dimension case
+-------------------
+Computation of the persistent homology with Z/2Z coefficients of the alpha complex on points
+sampling a torus 3D:
+
+./alpha_complex_persistence -r 32 -p 2 -m 0.45 ../../data/points/tore3D_300.off
+
+output:
+Alpha complex is of dimension 3 - 9273 simplices - 300 vertices.
+Simplex_tree dim: 3
+2 0 0 inf
+2 1 0.0682162 1.0001
+2 1 0.0934117 1.00003
+2 2 0.56444 1.03938
+
+Here we retrieve expected Betti numbers on a tore 3D:
+Betti numbers[0] = 1
+Betti numbers[1] = 2
+Betti numbers[2] = 1
+
+N.B.: - alpha_complex_persistence accepts OFF files in d-Dimension.
+ - filtration values are alpha square values
+
+3) 3D periodic special case
+---------------------------
+./periodic_alpha_complex_3d_persistence ../../data/points/grid_10_10_10_in_0_1.off 3 1.0
+
+output:
+Periodic Delaunay computed.
+Simplex_tree dim: 3
+3 0 0 inf
+3 1 0.0025 inf
+3 1 0.0025 inf
+3 1 0.0025 inf
+3 2 0.005 inf
+3 2 0.005 inf
+3 2 0.005 inf
+3 3 0.0075 inf
+
+Here we retrieve expected Betti numbers on a tore 3D:
+Betti numbers[0] = 1
+Betti numbers[1] = 3
+Betti numbers[2] = 3
+Betti numbers[3] = 1
+
+N.B.: - periodic_alpha_complex_3d_persistence accepts only OFF files in 3D dimension. In this example, the periodic cube
+is hard coded to { x = [0,1]; y = [0,1]; z = [0,1] }
+ - filtration values are alpha square values
+
+***********************************************************************************************************************
+Example of use of PLAIN HOMOLOGY:
+
+This example computes the plain homology of the following simplicial complex without filtration values:
+ /* Complex to build. */
+ /* 1 3 */
+ /* o---o */
+ /* /X\ / */
+ /* o---o o */
+ /* 2 0 4 */
+
+./plain_homology
+
+output:
+2 0 0 inf
+2 0 0 inf
+2 1 0 inf
+
+Here we retrieve the 2 entities {0,1,2,3} and {4} (Betti numbers[0] = 2) and the hole in {0,1,3} (Betti numbers[1] = 1)
diff --git a/src/Persistent_cohomology/example/alpha_shapes_persistence.cpp b/src/Persistent_cohomology/example/alpha_complex_3d_persistence.cpp
index 3a50c84c..48fbb91a 100644
--- a/src/Persistent_cohomology/example/alpha_shapes_persistence.cpp
+++ b/src/Persistent_cohomology/example/alpha_complex_3d_persistence.cpp
@@ -1,24 +1,29 @@
- /* 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/>.
- */
+/* 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 <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>
@@ -27,232 +32,209 @@
#include <fstream>
#include <cmath>
-
-#include "gudhi/graph_simplicial_complex.h"
-#include "gudhi/Simplex_tree.h"
-#include "gudhi/Persistent_cohomology.h"
-#include <boost/variant.hpp>
-
-using namespace Gudhi;
-using namespace Gudhi::persistent_cohomology;
+#include <string>
+#include <tuple>
+#include <map>
+#include <utility>
+#include <list>
+#include <vector>
// 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;
+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;
// From file type definition
-typedef Kernel::Point_3 Point_3;
+typedef Kernel::Point_3 Point_3;
// filtration with alpha values needed type definition
typedef Alpha_shape_3::FT Alpha_value_type;
-typedef CGAL::Object Object;
+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;
+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;
// gudhi type definition
-typedef Simplex_tree<>::Vertex_handle Simplex_tree_vertex;
+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;
-//#define DEBUG_TRACES
-
-Vertex_list from (const Cell_handle& ch)
-{
+Vertex_list from(const Cell_handle& ch) {
Vertex_list the_list;
- for (auto i = 0; i < 4; i++)
- {
+ for (auto i = 0; i < 4; i++) {
#ifdef DEBUG_TRACES
std::cout << "from cell[" << i << "]=" << ch->vertex(i)->point() << std::endl;
-#endif // DEBUG_TRACES
+#endif // DEBUG_TRACES
the_list.push_back(ch->vertex(i));
}
return the_list;
}
-Vertex_list from (const Facet& fct)
-{
+
+Vertex_list from(const Facet& fct) {
Vertex_list the_list;
- for (auto i = 0; i < 4; i++)
- {
- if (fct.second != i)
- {
+ 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
+#endif // DEBUG_TRACES
the_list.push_back(fct.first->vertex(i));
}
}
return the_list;
}
-Vertex_list from (const Edge_3& edg)
-{
+
+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))
- {
+ 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
+#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 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
+#endif // DEBUG_TRACES
the_list.push_back(vh);
return the_list;
}
-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); // ----- >>
+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[])
-{
-
- int coeff_field_characteristic=0;
- int returnedScanValue = sscanf(argv[2], "%d", &coeff_field_characteristic);
- if ((returnedScanValue == EOF) || (coeff_field_characteristic <= 0)) {
- std::cerr << "Error: " << argv[2] << " is not correct\n";
+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;
- returnedScanValue = sscanf(argv[3], "%lf", &min_persistence);
+ int returnedScanValue = sscanf(argv[3], "%lf", &min_persistence);
if ((returnedScanValue == EOF) || (min_persistence < -1.0)) {
std::cerr << "Error: " << argv[3] << " is not correct\n";
usage(argv[0]);
}
- // program args management
- if (argc != 4) {
- std::cerr << "Error: Number of arguments (" << argc << ") is not correct\n";
+ // 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]);
}
- // Read points from file
- std::string filegraph = argv[1];
- std::list<Point_3> 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_3 p;
- for( ; n>0 ; n--) {
- is >> p;
- lp.push_back(p);
- }
+ // 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);
+ 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
+#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));
+ 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
+#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;
+ 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;
- Simplex_tree<> simplex_tree;
+ 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)
- {
+ int dim_max = 0;
+ Filtration_value filtration_max = 0.0;
+ for (auto object_iterator : the_objects) {
// Retrieve Alpha shape vertex list from object
- if (const Cell_handle* cell = CGAL::object_cast<Cell_handle>(&object_iterator))
- {
+ if (const Cell_handle * cell = CGAL::object_cast<Cell_handle>(&object_iterator)) {
vertex_list = from(*cell);
count_cells++;
if (dim_max < 3) {
- dim_max=3; // Cell is of dim 3
+ // Cell is of dim 3
+ dim_max = 3;
}
- }
- else if (const Facet* facet = CGAL::object_cast<Facet>(&object_iterator))
- {
+ } else if (const Facet * facet = CGAL::object_cast<Facet>(&object_iterator)) {
vertex_list = from(*facet);
count_facets++;
if (dim_max < 2) {
- dim_max=2; // Facet is of dim 2
+ // Facet is of dim 2
+ dim_max = 2;
}
- }
- else if (const Edge_3* edge = CGAL::object_cast<Edge_3>(&object_iterator))
- {
+ } else if (const Edge_3 * edge = CGAL::object_cast<Edge_3>(&object_iterator)) {
vertex_list = from(*edge);
count_edges++;
if (dim_max < 1) {
- dim_max=1; // Edge_3 is of dim 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 Alpha_shape_3::Vertex_handle * vertex =
+ CGAL::object_cast<Alpha_shape_3::Vertex_handle>(&object_iterator)) {
count_vertices++;
vertex_list = from(*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)
- {
+ 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())
- {
+ 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
+#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
- {
+ 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
+#endif // DEBUG_TRACES
the_simplex_tree.push_back(vertex);
}
}
// Construction of the simplex_tree
- Filtration_value filtr = std::sqrt(*the_alpha_value_iterator);
+ Filtration_value filtr = /*std::sqrt*/(*the_alpha_value_iterator);
#ifdef DEBUG_TRACES
std::cout << "filtration = " << filtr << std::endl;
-#endif // DEBUG_TRACES
+#endif // DEBUG_TRACES
if (filtr > filtration_max) {
filtration_max = filtr;
}
@@ -263,14 +245,13 @@ int main (int argc, char * const argv[])
std::cout << "This shall not happen" << std::endl;
}
simplex_tree.set_filtration(filtration_max);
- simplex_tree.set_num_simplices(count_vertices + count_edges + count_facets + count_cells);
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 << "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;
@@ -278,23 +259,25 @@ int main (int argc, char * const argv[])
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
+#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
+ 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< Simplex_tree<>, Field_Zp > pcoh( simplex_tree );
- pcoh.init_coefficients( coeff_field_characteristic ); //initializes the coefficient field for homology
+ PCOH pcoh(simplex_tree);
+ // initializes the coefficient field for homology
+ pcoh.init_coefficients(coeff_field_characteristic);
- pcoh.compute_persistent_cohomology( min_persistence );
+ pcoh.compute_persistent_cohomology(min_persistence);
pcoh.output_diagram();
diff --git a/src/Persistent_cohomology/example/alpha_complex_persistence.cpp b/src/Persistent_cohomology/example/alpha_complex_persistence.cpp
new file mode 100644
index 00000000..cb181936
--- /dev/null
+++ b/src/Persistent_cohomology/example/alpha_complex_persistence.cpp
@@ -0,0 +1,117 @@
+#include <boost/program_options.hpp>
+
+#include <CGAL/Epick_d.h>
+
+#include <gudhi/Alpha_complex.h>
+#include <gudhi/Persistent_cohomology.h>
+
+#include <iostream>
+#include <string>
+#include <limits> // for numeric_limits
+
+void program_options(int argc, char * argv[]
+ , std::string & off_file_points
+ , std::string & output_file_diag
+ , Filtration_value & alpha_square_max_value
+ , int & coeff_field_characteristic
+ , Filtration_value & min_persistence);
+
+int main(int argc, char **argv) {
+ std::string off_file_points;
+ std::string output_file_diag;
+ Filtration_value alpha_square_max_value;
+ int coeff_field_characteristic;
+ Filtration_value min_persistence;
+
+ program_options(argc, argv, off_file_points, output_file_diag, alpha_square_max_value,
+ coeff_field_characteristic, min_persistence);
+
+ // ----------------------------------------------------------------------------
+ // 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();
+ }
+
+ return 0;
+}
+
+void program_options(int argc, char * argv[]
+ , std::string & off_file_points
+ , std::string & output_file_diag
+ , Filtration_value & alpha_square_max_value
+ , int & coeff_field_characteristic
+ , Filtration_value & min_persistence) {
+ namespace po = boost::program_options;
+ po::options_description hidden("Hidden options");
+ hidden.add_options()
+ ("input-file", po::value<std::string>(&off_file_points),
+ "Name of file containing a point set. Format is one point per line: X1 ... Xd ");
+
+ po::options_description visible("Allowed options", 100);
+ visible.add_options()
+ ("help,h", "produce help message")
+ ("output-file,o", po::value<std::string>(&output_file_diag)->default_value(std::string()),
+ "Name of file in which the persistence diagram is written. Default print in std::cout")
+ ("max-alpha-square-value,r",
+ po::value<Filtration_value>(&alpha_square_max_value)->default_value(std::numeric_limits<Filtration_value>::infinity()),
+ "Maximal alpha square value for the Alpha complex construction.")
+ ("field-charac,p", po::value<int>(&coeff_field_characteristic)->default_value(11),
+ "Characteristic p of the coefficient field Z/pZ for computing homology.")
+ ("min-persistence,m", po::value<Filtration_value>(&min_persistence),
+ "Minimal lifetime of homology feature to be recorded. Default is 0. Enter a negative value to see zero length intervals");
+
+ po::positional_options_description pos;
+ pos.add("input-file", 1);
+
+ 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 an Alpha complex defined on a set of input points.\n \n";
+ std::cout << "The output diagram contains one bar per line, written with the convention: \n";
+ std::cout << " p dim b d \n";
+ std::cout << "where dim is the dimension of the homological feature,\n";
+ std::cout << "b and d are respectively the birth and death of the feature and \n";
+ std::cout << "p is the characteristic of the field Z/pZ used for homology coefficients." << std::endl << std::endl;
+
+ std::cout << "Usage: " << argv[0] << " [options] input-file" << std::endl << std::endl;
+ std::cout << visible << std::endl;
+ std::abort();
+ }
+}
diff --git a/src/Persistent_cohomology/example/custom_persistence_sort.cpp b/src/Persistent_cohomology/example/custom_persistence_sort.cpp
new file mode 100644
index 00000000..9af38611
--- /dev/null
+++ b/src/Persistent_cohomology/example/custom_persistence_sort.cpp
@@ -0,0 +1,116 @@
+/* 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 <CGAL/Epick_d.h>
+#include <CGAL/point_generators_d.h>
+#include <CGAL/algorithm.h>
+#include <CGAL/assertions.h>
+
+#include <gudhi/Alpha_complex.h>
+#include <gudhi/Persistent_cohomology.h>
+
+#include <iostream>
+#include <iterator>
+#include <vector>
+#include <fstream> // for std::ofstream
+#include <algorithm> // for std::sort
+
+
+using Kernel = CGAL::Epick_d< CGAL::Dimension_tag<3> >;
+using Point = Kernel::Point_d;
+using Alpha_complex = Gudhi::alpha_complex::Alpha_complex<Kernel>;
+
+std::vector<Point> random_points() {
+ // Instanciate a random point generator
+ CGAL::Random rng(0);
+
+ // Generate "points_number" random points in a vector
+ std::vector<Point> points;
+
+ // Generates 1000 random 3D points on a sphere of radius 4.0
+ CGAL::Random_points_on_sphere_d<Point> rand_outside(3, 4.0, rng);
+ CGAL::cpp11::copy_n(rand_outside, 1000, std::back_inserter(points));
+ // Generates 2000 random 3D points in a sphere of radius 3.0
+ CGAL::Random_points_in_ball_d<Point> rand_inside(3, 3.0, rng);
+ CGAL::cpp11::copy_n(rand_inside, 2000, std::back_inserter(points));
+
+ return 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)
+ : 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)));
+ }
+ Alpha_complex* sc_;
+};
+
+int main(int argc, char **argv) {
+ std::vector<Point> points = random_points();
+
+ // 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;
+ }
+
+ // 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/src/Persistent_cohomology/example/performance_rips_persistence.cpp b/src/Persistent_cohomology/example/performance_rips_persistence.cpp
index 077c2b07..b4d282ac 100644
--- a/src/Persistent_cohomology/example/performance_rips_persistence.cpp
+++ b/src/Persistent_cohomology/example/performance_rips_persistence.cpp
@@ -1,49 +1,51 @@
- /* This file is part of the Gudhi Library. The Gudhi library
- * (Geometric Understanding in Higher Dimensions) is a generic C++
- * library for computational topology.
- *
- * Author(s): 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"
+/* 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 );
+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 );
+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
@@ -59,111 +61,154 @@ void timing_persistence( FilteredComplex & cpx
* 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[])
-{
+int main(int argc, char * argv[]) {
std::chrono::time_point<std::chrono::system_clock> start, end;
- int enlapsed_sec;
+ int elapsed_sec;
+ {
- std::string filepoints = "../examples/Kl.txt";
- Filtration_value threshold = 0.3;
- int dim_max = 3;
- int p = 2;
- int q = 1223;
+ 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
+ // Extract the points from the file filepoints
typedef std::vector<double> Point_t;
std::vector< Point_t > points;
- read_points( filepoints, points );
+ read_points(filepoints, points);
-// Compute the proximity graph of the 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> );
+ Graph_t prox_graph = compute_proximity_graph(points, threshold
+ , euclidean_distance<Point_t>);
end = std::chrono::system_clock::now();
- enlapsed_sec = std::chrono::duration_cast<std::chrono::seconds>(end-start).count();
- std::cout << "Compute Rips graph in " << enlapsed_sec << " sec.\n";
+ 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<> st;
+ // Construct the Rips complex in a Simplex Tree
+ Simplex_tree<Simplex_tree_options_fast_persistence> st;
start = std::chrono::system_clock::now();
- st.insert_graph(prox_graph); // insert the proximity graph in the simplex tree
- st.expansion( dim_max ); // expand the graph until dimension dim_max
+ // 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();
- enlapsed_sec = std::chrono::duration_cast<std::chrono::seconds>(end-start).count();
- std::cout << "Compute Rips complex in " << enlapsed_sec << " sec.\n";
+ 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
+ // Sort the simplices in the order of the filtration
start = std::chrono::system_clock::now();
st.initialize_filtration();
end = std::chrono::system_clock::now();
- enlapsed_sec = std::chrono::duration_cast<std::chrono::seconds>(end-start).count();
- std::cout << "Order the simplices of the filtration in " << enlapsed_sec << " sec.\n";
+ 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
+ // Convert the simplex tree into a hasse diagram
start = std::chrono::system_clock::now();
Hasse_complex<> hcpx(st);
end = std::chrono::system_clock::now();
- enlapsed_sec = std::chrono::duration_cast<std::chrono::seconds>(end-start).count();
- std::cout << "Convert the simplex tree into a Hasse diagram in " << enlapsed_sec << " sec.\n";
+ 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);
+ 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);
+ 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 )
-{
+timing_persistence(FilteredComplex & cpx
+ , int p) {
std::chrono::time_point<std::chrono::system_clock> start, end;
- int enlapsed_sec;
+ 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";
- Persistent_cohomology< FilteredComplex, Field_Zp > pcoh (cpx);
- pcoh.init_coefficients( p ); //initilizes the coefficient field for homology
-
start = std::chrono::system_clock::now();
-
- pcoh.compute_persistent_cohomology( INFINITY );
-
+
+ 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();
- enlapsed_sec = std::chrono::duration_cast<std::chrono::seconds>(end-start).count();
- std::cout << " Compute persistent homology in Z/"<<p<<"Z in " << enlapsed_sec << " sec.\n";
+ 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 )
-{
+timing_persistence(FilteredComplex & cpx
+ , int p
+ , int q) {
std::chrono::time_point<std::chrono::system_clock> start, end;
- int enlapsed_sec;
-
- Persistent_cohomology< FilteredComplex, Multi_field > pcoh (cpx);
- pcoh.init_coefficients( p, q ); //initilizes the coefficient field for homology
+ 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 );
+ pcoh.compute_persistent_cohomology(INFINITY);
end = std::chrono::system_clock::now();
- enlapsed_sec = std::chrono::duration_cast<std::chrono::seconds>(end-start).count();
+ 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 " << enlapsed_sec << " sec.\n";
+ << "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/src/Persistent_cohomology/example/periodic_alpha_complex_3d_persistence.cpp b/src/Persistent_cohomology/example/periodic_alpha_complex_3d_persistence.cpp
new file mode 100644
index 00000000..a199fea1
--- /dev/null
+++ b/src/Persistent_cohomology/example/periodic_alpha_complex_3d_persistence.cpp
@@ -0,0 +1,313 @@
+/* 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 <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>
+#include <CGAL/Periodic_3_Delaunay_triangulation_3.h>
+#include <CGAL/Alpha_shape_3.h>
+#include <CGAL/iterator.h>
+
+#include <fstream>
+#include <cmath>
+#include <string>
+#include <tuple>
+#include <map>
+#include <utility>
+#include <list>
+#include <vector>
+
+// Traits
+using K = CGAL::Exact_predicates_inexact_constructions_kernel;
+using PK = CGAL::Periodic_3_Delaunay_triangulation_traits_3<K>;
+// Vertex type
+using DsVb = CGAL::Periodic_3_triangulation_ds_vertex_base_3<>;
+using Vb = CGAL::Triangulation_vertex_base_3<PK, DsVb>;
+using AsVb = CGAL::Alpha_shape_vertex_base_3<PK, Vb>;
+// Cell type
+using DsCb = CGAL::Periodic_3_triangulation_ds_cell_base_3<>;
+using Cb = CGAL::Triangulation_cell_base_3<PK, DsCb>;
+using AsCb = CGAL::Alpha_shape_cell_base_3<PK, Cb>;
+using Tds = CGAL::Triangulation_data_structure_3<AsVb, AsCb>;
+using P3DT3 = CGAL::Periodic_3_Delaunay_triangulation_3<PK, Tds>;
+using Alpha_shape_3 = CGAL::Alpha_shape_3<P3DT3>;
+using Point_3 = PK::Point_3;
+
+// filtration with alpha values needed type definition
+using Alpha_value_type = Alpha_shape_3::FT;
+using Object = CGAL::Object;
+using Dispatch = CGAL::Dispatch_output_iterator<
+ CGAL::cpp11::tuple<Object, Alpha_value_type>,
+ CGAL::cpp11::tuple<std::back_insert_iterator< std::vector<Object> >,
+ std::back_insert_iterator< std::vector<Alpha_value_type> > > >;
+using Cell_handle = Alpha_shape_3::Cell_handle;
+using Facet = Alpha_shape_3::Facet;
+using Edge_3 = Alpha_shape_3::Edge;
+using Vertex_list = std::list<Alpha_shape_3::Vertex_handle>;
+
+// gudhi type definition
+using ST = Gudhi::Simplex_tree<Gudhi::Simplex_tree_options_fast_persistence>;
+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 >;
+
+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";
+ 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 = 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]);
+ }
+
+ // 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]);
+ }
+
+ // Read iso_cuboid_3 information from file
+ std::ifstream iso_cuboid_str(argv[2]);
+ double x_min, y_min, z_min, x_max, y_max, z_max;
+ if (iso_cuboid_str.good()) {
+ iso_cuboid_str >> x_min >> y_min >> z_min >> x_max >> y_max >> z_max;
+ } else {
+ std::cerr << "Unable to read file " << argv[2] << std::endl;
+ usage(argv[0]);
+ }
+
+ // Retrieve the triangulation
+ std::vector<Point_3> lp = off_reader.get_point_cloud();
+
+ // Define the periodic cube
+ P3DT3 pdt(PK::Iso_cuboid_3(x_min, y_min, z_min, x_max, y_max, z_max));
+ // Heuristic for inserting large point sets (if pts is reasonably large)
+ pdt.insert(lp.begin(), lp.end(), true);
+ // As pdt won't be modified anymore switch to 1-sheeted cover if possible
+ if (pdt.is_triangulation_in_1_sheet()) pdt.convert_to_1_sheeted_covering();
+ std::cout << "Periodic Delaunay computed." << std::endl;
+
+ // alpha shape construction from points. CGAL has a strange behavior in REGULARIZED mode. This is the default mode
+ // Maybe need to set it to GENERAL mode
+ Alpha_shape_3 as(pdt, 0, Alpha_shape_3::GENERAL);
+
+ // filtration with alpha values from alpha shape
+ std::vector<Object> the_objects;
+ std::vector<Alpha_value_type> the_alpha_values;
+
+ Dispatch disp = CGAL::dispatch_output<Object, Alpha_value_type>(std::back_inserter(the_objects),
+ std::back_inserter(the_alpha_values));
+
+ as.filtration_with_alpha_values(disp);
+#ifdef DEBUG_TRACES
+ std::cout << "filtration_with_alpha_values returns : " << the_objects.size() << " objects" << std::endl;
+#endif // DEBUG_TRACES
+
+ Alpha_shape_3::size_type count_vertices = 0;
+ Alpha_shape_3::size_type count_edges = 0;
+ Alpha_shape_3::size_type count_facets = 0;
+ Alpha_shape_3::size_type count_cells = 0;
+
+ // Loop on objects vector
+ Vertex_list vertex_list;
+ ST simplex_tree;
+ Alpha_shape_simplex_tree_map map_cgal_simplex_tree;
+ std::vector<Alpha_value_type>::iterator the_alpha_value_iterator = the_alpha_values.begin();
+ 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);
+ 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);
+ 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);
+ 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);
+ }
+ // 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/src/Persistent_cohomology/example/persistence_from_file.cpp b/src/Persistent_cohomology/example/persistence_from_file.cpp
index e886aea7..67235467 100644
--- a/src/Persistent_cohomology/example/persistence_from_file.cpp
+++ b/src/Persistent_cohomology/example/persistence_from_file.cpp
@@ -1,141 +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): 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 "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"
+/* 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 <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 <boost/program_options.hpp>
+#include <string>
+
using namespace Gudhi;
using namespace Gudhi::persistent_cohomology;
-typedef int Vertex_handle;
-typedef double Filtration_value;
-
-void program_options( int argc, char * argv[]
- , std::string & simplex_tree_file
- , std::string & output_file
- , int & p
- , Filtration_value & min_persistence );
-
-int main (int argc, char * argv[])
-{
- std::string simplex_tree_file;
- std::string output_file ;
- int p ;
- Filtration_value min_persistence;
-
- program_options(argc,argv,simplex_tree_file,output_file,p,min_persistence);
-
- std::cout << "Simplex_tree from file=" << simplex_tree_file.c_str() << " - output_file=" << output_file.c_str() << std::endl;
- std::cout << " - p=" << p << " - min_persistence=" << min_persistence << std::endl;
-
- // Construct the Rips complex in a Simplex Tree
- Simplex_tree<> simplex_tree;
-
- std::ifstream simplex_tree_stream(simplex_tree_file);
- simplex_tree_stream >> simplex_tree;
-
- std::cout << "The complex contains " << simplex_tree.num_simplices() << " simplices" << std::endl;
- std::cout << " - dimension " << simplex_tree.dimension() << " - filtration " << simplex_tree.filtration() << std::endl;
-
- /*
- std::cout << std::endl << std::endl << "Iterator on Simplices in the filtration, with [filtration value]:" << std::endl;
- for( auto f_simplex : simplex_tree.filtration_simplex_range() )
- { std::cout << " " << "[" << simplex_tree.filtration(f_simplex) << "] ";
- for( auto vertex : simplex_tree.simplex_vertex_range(f_simplex) )
- { std::cout << vertex << " "; }
- std::cout << std::endl;
- }*/
-
- // Sort the simplices in the order of the filtration
- simplex_tree.initialize_filtration();
-
- // Compute the persistence diagram of the complex
- Persistent_cohomology< Simplex_tree<>, Field_Zp > pcoh( simplex_tree );
- pcoh.init_coefficients( p ); //initilizes the coefficient field for homology
-
- pcoh.compute_persistent_cohomology( min_persistence );
-
- // Output the diagram in output_file
- if(output_file.empty()) { pcoh.output_diagram(); }
- else {
- std::ofstream out(output_file);
- pcoh.output_diagram(out);
- out.close(); }
+typedef int Vertex_handle;
+typedef double Filtration_value;
+
+void program_options(int argc, char * argv[]
+ , std::string & simplex_tree_file
+ , std::string & output_file
+ , int & p
+ , Filtration_value & min_persistence);
+
+int main(int argc, char * argv[]) {
+ std::string simplex_tree_file;
+ std::string output_file;
+ int p;
+ Filtration_value min_persistence;
+
+ program_options(argc, argv, simplex_tree_file, output_file, p, min_persistence);
+
+ std::cout << "Simplex_tree from file=" << simplex_tree_file.c_str() << " - output_file=" << output_file.c_str()
+ << std::endl;
+ std::cout << " - p=" << p << " - min_persistence=" << min_persistence << std::endl;
+
+ // Read the list of simplices from a file.
+ Simplex_tree<> simplex_tree;
+
+ std::ifstream simplex_tree_stream(simplex_tree_file);
+ simplex_tree_stream >> simplex_tree;
+
+ std::cout << "The complex contains " << simplex_tree.num_simplices() << " simplices" << std::endl;
+ std::cout << " - dimension " << simplex_tree.dimension() << " - filtration " << simplex_tree.filtration()
+ << std::endl;
+
+ /*
+ std::cout << std::endl << std::endl << "Iterator on Simplices in the filtration, with [filtration value]:" << std::endl;
+ for( auto f_simplex : simplex_tree.filtration_simplex_range() )
+ { std::cout << " " << "[" << simplex_tree.filtration(f_simplex) << "] ";
+ for( auto vertex : simplex_tree.simplex_vertex_range(f_simplex) )
+ { std::cout << vertex << " "; }
+ std::cout << std::endl;
+ }*/
+
+ // Sort the simplices in the order of the filtration
+ simplex_tree.initialize_filtration();
+
+ // Compute the persistence diagram of the complex
+ Persistent_cohomology< Simplex_tree<>, Field_Zp > pcoh(simplex_tree);
+ // initializes the coefficient field for homology
+ pcoh.init_coefficients(p);
+
+ pcoh.compute_persistent_cohomology(min_persistence);
+
+ // Output the diagram in output_file
+ if (output_file.empty()) {
+ pcoh.output_diagram();
+ } else {
+ std::ofstream out(output_file);
+ pcoh.output_diagram(out);
+ out.close();
+ }
- return 0;
+ return 0;
}
-
-
-void program_options( int argc, char * argv[]
- , std::string & simplex_tree_file
- , std::string & output_file
- , int & p
- , Filtration_value & min_persistence )
-{
+void program_options(int argc, char * argv[]
+ , std::string & simplex_tree_file
+ , std::string & output_file
+ , int & p
+ , Filtration_value & min_persistence) {
namespace po = boost::program_options;
- po::options_description hidden("Hidden options");
+ po::options_description hidden("Hidden options");
hidden.add_options()
- ("input-file", po::value<std::string>(&simplex_tree_file),
- "Name of file containing a simplex set. Format is one simplex per line (cf. reader_utils.h - read_simplex): Dim1 X11 X12 ... X1d Fil1 ");
-
+ ("input-file", po::value<std::string>(&simplex_tree_file),
+ "Name of file containing a simplex set. Format is one simplex per line (cf. reader_utils.h - read_simplex): Dim1 X11 X12 ... X1d Fil1 ");
+
po::options_description visible("Allowed options", 100);
visible.add_options()
- ("help,h", "produce help message")
- ("output-file,o", po::value<std::string>(&output_file)->default_value(std::string()),
- "Name of file in which the persistence diagram is written. Default print in std::cout")
- ("field-charac,p", po::value<int>(&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");
+ ("help,h", "produce help message")
+ ("output-file,o", po::value<std::string>(&output_file)->default_value(std::string()),
+ "Name of file in which the persistence diagram is written. Default print in std::cout")
+ ("field-charac,p", po::value<int>(&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");
po::positional_options_description pos;
pos.add("input-file", 1);
-
- po::options_description all; all.add(visible).add(hidden);
+
+ 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);
+ 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();
+ 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/src/Persistent_cohomology/example/persistence_from_simple_simplex_tree.cpp b/src/Persistent_cohomology/example/persistence_from_simple_simplex_tree.cpp
index ba82e4e6..ba772f04 100644
--- a/src/Persistent_cohomology/example/persistence_from_simple_simplex_tree.cpp
+++ b/src/Persistent_cohomology/example/persistence_from_simple_simplex_tree.cpp
@@ -20,11 +20,14 @@
* 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/Persistent_cohomology.h>
+
#include <iostream>
#include <ctime>
-#include "gudhi/graph_simplicial_complex.h"
-#include "gudhi/Simplex_tree.h"
-#include "gudhi/Persistent_cohomology.h"
+#include <utility>
+#include <vector>
using namespace Gudhi;
using namespace Gudhi::persistent_cohomology;
@@ -34,15 +37,19 @@ typedef std::pair<typeVectorVertex, Filtration_value> typeSimplex;
typedef std::pair< Simplex_tree<>::Simplex_handle, bool > typePairSimplexBool;
typedef Simplex_tree<> typeST;
-void usage(char * const progName)
-{
+void usage(char * const progName) {
std::cerr << "Usage: " << progName << " coeff_field_characteristic[integer > 0] min_persistence[float >= -1.0]\n";
- exit(-1); // ----- >>
+ exit(-1);
}
-int main (int argc, char * const argv[])
-{
- int coeff_field_characteristic=0;
+int main(int argc, char * const argv[]) {
+ // program args management
+ if (argc != 3) {
+ std::cerr << "Error: Number of arguments (" << argc << ") is not correct\n";
+ usage(argv[0]);
+ }
+
+ int coeff_field_characteristic = 0;
int returnedScanValue = sscanf(argv[1], "%d", &coeff_field_characteristic);
if ((returnedScanValue == EOF) || (coeff_field_characteristic <= 0)) {
std::cerr << "Error: " << argv[1] << " is not correct\n";
@@ -56,101 +63,65 @@ int main (int argc, char * const argv[])
usage(argv[0]);
}
- // program args management
- if (argc != 3) {
- std::cerr << "Error: Number of arguments (" << argc << ") is not correct\n";
- usage(argv[0]);
- }
-
// TEST OF INSERTION
std::cout << "********************************************************************" << std::endl;
std::cout << "TEST OF INSERTION" << std::endl;
typeST st;
// ++ FIRST
- std::cout << " - INSERT (2,1,0)" << std::endl;
- typeVectorVertex SimplexVector1;
- SimplexVector1.push_back(2);
- SimplexVector1.push_back(1);
- SimplexVector1.push_back(0);
- st.insert_simplex_and_subfaces ( SimplexVector1, 0.3);
+ std::cout << " - INSERT (0,1,2)" << std::endl;
+ typeVectorVertex SimplexVector = {0, 1, 2};
+ st.insert_simplex_and_subfaces(SimplexVector, 0.3);
// ++ SECOND
std::cout << " - INSERT 3" << std::endl;
- typeVectorVertex SimplexVector2;
- SimplexVector2.push_back(3);
- st.insert_simplex_and_subfaces ( SimplexVector2, 0.1);
+ SimplexVector = {3};
+ st.insert_simplex_and_subfaces(SimplexVector, 0.1);
// ++ THIRD
std::cout << " - INSERT (0,3)" << std::endl;
- typeVectorVertex SimplexVector3;
- SimplexVector3.push_back(3);
- SimplexVector3.push_back(0);
- st.insert_simplex_and_subfaces ( SimplexVector3, 0.2);
+ SimplexVector = {0, 3};
+ st.insert_simplex_and_subfaces(SimplexVector, 0.2);
// ++ FOURTH
- std::cout << " - INSERT (1,0) (already inserted)" << std::endl;
- typeVectorVertex SimplexVector4;
- SimplexVector4.push_back(1);
- SimplexVector4.push_back(0);
- st.insert_simplex_and_subfaces ( SimplexVector4, 0.2);
+ std::cout << " - INSERT (0,1) (already inserted)" << std::endl;
+ SimplexVector = {0, 1};
+ st.insert_simplex_and_subfaces(SimplexVector, 0.2);
// ++ FIFTH
std::cout << " - INSERT (3,4,5)" << std::endl;
- typeVectorVertex SimplexVector5;
- SimplexVector5.push_back(3);
- SimplexVector5.push_back(4);
- SimplexVector5.push_back(5);
- st.insert_simplex_and_subfaces ( SimplexVector5, 0.3);
+ SimplexVector = {3, 4, 5};
+ st.insert_simplex_and_subfaces(SimplexVector, 0.3);
// ++ SIXTH
std::cout << " - INSERT (0,1,6,7)" << std::endl;
- typeVectorVertex SimplexVector6;
- SimplexVector6.push_back(0);
- SimplexVector6.push_back(1);
- SimplexVector6.push_back(6);
- SimplexVector6.push_back(7);
- st.insert_simplex_and_subfaces ( SimplexVector6, 0.4);
+ SimplexVector = {0, 1, 6, 7};
+ st.insert_simplex_and_subfaces(SimplexVector, 0.4);
// ++ SEVENTH
std::cout << " - INSERT (4,5,8,9)" << std::endl;
- typeVectorVertex SimplexVector7;
- SimplexVector7.push_back(4);
- SimplexVector7.push_back(5);
- SimplexVector7.push_back(8);
- SimplexVector7.push_back(9);
- st.insert_simplex_and_subfaces ( SimplexVector7, 0.4);
+ SimplexVector = {4, 5, 8, 9};
+ st.insert_simplex_and_subfaces(SimplexVector, 0.4);
// ++ EIGHTH
std::cout << " - INSERT (9,10,11)" << std::endl;
- typeVectorVertex SimplexVector8;
- SimplexVector8.push_back(9);
- SimplexVector8.push_back(10);
- SimplexVector8.push_back(11);
- st.insert_simplex_and_subfaces ( SimplexVector8, 0.3);
-
+ SimplexVector = {9, 10, 11};
+ st.insert_simplex_and_subfaces(SimplexVector, 0.3);
+
// ++ NINETH
std::cout << " - INSERT (2,10,12)" << std::endl;
- typeVectorVertex SimplexVector9;
- SimplexVector9.push_back(2);
- SimplexVector9.push_back(10);
- SimplexVector9.push_back(12);
- st.insert_simplex_and_subfaces ( SimplexVector9, 0.3);
-
+ SimplexVector = {2, 10, 12};
+ st.insert_simplex_and_subfaces(SimplexVector, 0.3);
+
// ++ TENTH
std::cout << " - INSERT (11,6)" << std::endl;
- typeVectorVertex SimplexVector10;
- SimplexVector10.push_back(11);
- SimplexVector10.push_back(6);
- st.insert_simplex_and_subfaces ( SimplexVector10, 0.2);
+ SimplexVector = {6, 11};
+ st.insert_simplex_and_subfaces(SimplexVector, 0.2);
// ++ ELEVENTH
std::cout << " - INSERT (13,14,15)" << std::endl;
- typeVectorVertex SimplexVector11;
- SimplexVector11.push_back(13);
- SimplexVector11.push_back(14);
- SimplexVector11.push_back(15);
- st.insert_simplex_and_subfaces ( SimplexVector11, 0.25);
+ SimplexVector = {13, 14, 15};
+ st.insert_simplex_and_subfaces(SimplexVector, 0.25);
/* Inserted simplex: */
/* 1 6 */
@@ -175,33 +146,31 @@ int main (int argc, char * const argv[])
st.set_dimension(2);
st.set_filtration(0.4);
- std::cout << "The complex contains " << st.num_simplices() << " simplices - " << st.num_vertices() << " vertices " << std::endl;
+ std::cout << "The complex contains " << st.num_simplices() << " simplices - " << st.num_vertices() << " vertices "
+ << std::endl;
std::cout << " - dimension " << st.dimension() << " - filtration " << st.filtration() << std::endl;
- std::cout << std::endl << std::endl << "Iterator on Simplices in the filtration, with [filtration value]:" << std::endl;
+ std::cout << std::endl << std::endl << "Iterator on Simplices in the filtration, with [filtration value]:"
+ << std::endl;
std::cout << "**************************************************************" << std::endl;
std::cout << "strict graph G { " << std::endl;
- for( auto f_simplex : st.filtration_simplex_range() )
- {
+ for (auto f_simplex : st.filtration_simplex_range()) {
std::cout << " " << "[" << st.filtration(f_simplex) << "] ";
- for( auto vertex : st.simplex_vertex_range(f_simplex) )
- {
- std::cout << (int)vertex << " -- ";
+ for (auto vertex : st.simplex_vertex_range(f_simplex)) {
+ std::cout << static_cast<int>(vertex) << " -- ";
}
std::cout << ";" << std::endl;
}
std::cout << "}" << std::endl;
- //std::cout << "**************************************************************" << std::endl;
- //st.print_hasse(std::cout);
std::cout << "**************************************************************" << std::endl;
-
// Compute the persistence diagram of the complex
persistent_cohomology::Persistent_cohomology< Simplex_tree<>, Field_Zp > pcoh(st);
- pcoh.init_coefficients( coeff_field_characteristic ); //initiliazes the coefficient field for homology
+ // initializes the coefficient field for homology
+ pcoh.init_coefficients(coeff_field_characteristic);
- pcoh.compute_persistent_cohomology( min_persistence );
+ pcoh.compute_persistent_cohomology(min_persistence);
// Output the diagram in filediag
pcoh.output_diagram();
diff --git a/src/Persistent_cohomology/example/plain_homology.cpp b/src/Persistent_cohomology/example/plain_homology.cpp
new file mode 100644
index 00000000..ae82c817
--- /dev/null
+++ b/src/Persistent_cohomology/example/plain_homology.cpp
@@ -0,0 +1,95 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Marc Glisse
+ *
+ * Copyright (C) 2015 INRIA Saclay - Ile-de-France (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/Persistent_cohomology.h>
+
+#include <iostream>
+#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 {
+ // Implicitly use 0 as filtration value for all simplices
+ static const bool store_filtration = false;
+ // The persistence algorithm needs this
+ static const bool store_key = true;
+ // I have few vertices
+ typedef short Vertex_handle;
+ // 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;
+
+int main() {
+ ST st;
+
+ /* Complex to build. */
+ /* 1 3 */
+ /* o---o */
+ /* /X\ / */
+ /* o---o o */
+ /* 2 0 4 */
+
+ const short triangle012[] = {0, 1, 2};
+ const short edge03[] = {0, 3};
+ const short edge13[] = {1, 3};
+ const short vertex4[] = {4};
+ st.insert_simplex_and_subfaces(triangle012);
+ st.insert_simplex_and_subfaces(edge03);
+ st.insert_simplex(edge13);
+ st.insert_simplex(vertex4);
+ // FIXME: Remove this line
+ st.set_dimension(2);
+
+ // Sort the simplices in the order of the filtration
+ st.initialize_filtration();
+
+ // Class for homology computation
+ persistent_cohomology::Persistent_cohomology<ST, persistent_cohomology::Field_Zp> pcoh(st);
+
+ // Initialize the coefficient field Z/2Z for homology
+ pcoh.init_coefficients(2);
+
+ // Compute the persistence diagram of the complex
+ pcoh.compute_persistent_cohomology();
+
+ // Print the result. The format is, on each line: 2 dim 0 inf
+ // where 2 represents the field, dim the dimension of the feature.
+ // 2 0 0 inf
+ // 2 0 0 inf
+ // 2 1 0 inf
+ // means that in Z/2Z-homology, the Betti numbers are b0=2 and b1=1.
+ pcoh.output_diagram();
+
+ // Print the Betti numbers are b0=2 and b1=1.
+ std::cout << std::endl;
+ std::cout << "The Betti numbers are : ";
+ for (int i = 0; i < st.dimension(); i++)
+ std::cout << "b" << i << " = " << pcoh.betti_number(i) << " ; ";
+ std::cout << std::endl;
+}
diff --git a/src/Persistent_cohomology/example/rips_multifield_persistence.cpp b/src/Persistent_cohomology/example/rips_multifield_persistence.cpp
index 2505897e..c5cd775d 100644
--- a/src/Persistent_cohomology/example/rips_multifield_persistence.cpp
+++ b/src/Persistent_cohomology/example/rips_multifield_persistence.cpp
@@ -1,155 +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
- *
- * 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"
+/* 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 <boost/program_options.hpp>
+#include <string>
+#include <vector>
+
using namespace Gudhi;
using namespace Gudhi::persistent_cohomology;
-typedef int Vertex_handle;
+typedef int Vertex_handle;
typedef double Filtration_value;
-void program_options( int argc, char * argv[]
- , std::string & filepoints
- , std::string & filediag
- , Filtration_value & threshold
- , int & dim_max
- , int & min_p
- , int & max_p
- , Filtration_value & min_persistence );
-
-int main (int argc, char * argv[])
-{
- std::string filepoints;
- std::string filediag;
+void program_options(int argc, char * argv[]
+ , std::string & filepoints
+ , std::string & filediag
+ , Filtration_value & threshold
+ , int & dim_max
+ , int & min_p
+ , int & max_p
+ , Filtration_value & min_persistence);
+
+int main(int argc, char * argv[]) {
+ std::string filepoints;
+ std::string filediag;
Filtration_value threshold;
- int dim_max;
- int min_p;
- int max_p;
+ int dim_max;
+ int min_p;
+ int max_p;
Filtration_value min_persistence;
- program_options(argc,argv,filepoints,filediag,threshold,dim_max,min_p,max_p,min_persistence);
+ program_options(argc, argv, filepoints, filediag, threshold, dim_max, min_p, max_p, min_persistence);
-// Extract the points from the file filepoints
+ // 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
- Graph_t prox_graph = compute_proximity_graph( points, threshold
- , euclidean_distance<Point_t> );
+ read_points(filepoints, points);
-// Construct the Rips complex in a Simplex Tree
- Simplex_tree<> st;
- st.insert_graph(prox_graph); // insert the proximity graph in the simplex tree
- st.expansion( dim_max ); // expand the graph until dimension dim_max
+ // Compute the proximity graph of the points
+ Graph_t prox_graph = compute_proximity_graph(points, threshold
+ , euclidean_distance<Point_t>);
- std::cout << "st=" << st << std::endl;
+ // 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);
-// Sort the simplices in the order of the filtration
+ // Sort the simplices in the order of the filtration
st.initialize_filtration();
-// Compute the persistence diagram of the complex
- Persistent_cohomology< Simplex_tree<>, Multi_field > pcoh( st );
- pcoh.init_coefficients( min_p, max_p ); //initilizes the coefficient field for homology
+ // Compute the persistence diagram of the complex
+ Persistent_cohomology<ST, Multi_field > pcoh(st);
+ // 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
- if(filediag.empty()) { pcoh.output_diagram(); }
- else {
- std::ofstream out(filediag);
- pcoh.output_diagram(out);
- out.close(); }
+ 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 & filepoints
- , std::string & filediag
- , Filtration_value & threshold
- , int & dim_max
- , int & min_p
- , int & max_p
- , Filtration_value & min_persistence )
-{
+void program_options(int argc, char * argv[]
+ , std::string & filepoints
+ , std::string & filediag
+ , Filtration_value & threshold
+ , int & dim_max
+ , int & min_p
+ , int & max_p
+ , Filtration_value & min_persistence) {
namespace po = boost::program_options;
- po::options_description hidden("Hidden 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>(&filepoints),
+ "Name of file containing a point set. Format is one point per line: X1 ... Xd \n");
+
po::options_description visible("Allowed options");
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(0),
- "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.")
- ("min-field-charac,p", po::value<int>(&min_p)->default_value(2),
- "Minimal characteristic p of the coefficient field Z/pZ.")
- ("max-field-charac,q", po::value<int>(&max_p)->default_value(1223),
- "Minimial characteristic q of the coefficient field Z/pZ.")
- ("min-persistence,m", po::value<Filtration_value>(&min_persistence),
- "Minimal lifetime of homology feature to be recorded. Default is 0");
+ ("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(0),
+ "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.")
+ ("min-field-charac,p", po::value<int>(&min_p)->default_value(2),
+ "Minimal characteristic p of the coefficient field Z/pZ.")
+ ("max-field-charac,q", po::value<int>(&max_p)->default_value(1223),
+ "Minimial characteristic q of the coefficient field Z/pZ.")
+ ("min-persistence,m", po::value<Filtration_value>(&min_persistence),
+ "Minimal lifetime of homology feature to be recorded. Default is 0");
po::positional_options_description pos;
pos.add("input-file", 1);
-
- po::options_description all; all.add(visible).add(hidden);
+
+ 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);
+ 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 various coefficient fields \n";
- std::cout << "of a Rips complex defined on a set of input points. The coefficient \n";
- std::cout << "fields are all the Z/rZ for a prime number r contained in the \n";
- std::cout << "specified range [p,q]\n \n";
- std::cout << "The output diagram contains one bar per line, written with the convention: \n";
- std::cout << " p1*...*pr 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 << "p1*...*pr is the product of prime numbers pi such that the homology \n";
- std::cout << "feature exists in homology with Z/piZ coefficients."<< std::endl << std::endl;
-
- std::cout << "Usage: " << argv[0] << " [options] input-file" << std::endl << std::endl;
- std::cout << visible << std::endl;
- std::abort();
+ if (vm.count("help") || !vm.count("input-file")) {
+ std::cout << std::endl;
+ std::cout << "Compute the persistent homology with various coefficient fields \n";
+ std::cout << "of a Rips complex defined on a set of input points. The coefficient \n";
+ std::cout << "fields are all the Z/rZ for a prime number r contained in the \n";
+ std::cout << "specified range [p,q]\n \n";
+ std::cout << "The output diagram contains one bar per line, written with the convention: \n";
+ std::cout << " p1*...*pr 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 << "p1*...*pr is the product of prime numbers pi such that the homology \n";
+ std::cout << "feature exists in homology with Z/piZ 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/src/Persistent_cohomology/example/rips_persistence.cpp b/src/Persistent_cohomology/example/rips_persistence.cpp
index 4253def9..cab49395 100644
--- a/src/Persistent_cohomology/example/rips_persistence.cpp
+++ b/src/Persistent_cohomology/example/rips_persistence.cpp
@@ -1,147 +1,153 @@
- /* 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"
+/* 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 <boost/program_options.hpp>
+#include <string>
+#include <vector>
+#include <limits> // infinity
+
using namespace Gudhi;
using namespace Gudhi::persistent_cohomology;
-typedef int Vertex_handle;
-typedef double Filtration_value;
-
-void program_options( int argc, char * argv[]
- , std::string & filepoints
- , std::string & filediag
- , Filtration_value & threshold
- , int & dim_max
- , int & p
- , Filtration_value & min_persistence );
-
-int main (int argc, char * argv[])
-{
- std::string filepoints;
- std::string filediag ;
- Filtration_value threshold ;
- int dim_max ;
- int p ;
+typedef int Vertex_handle;
+typedef double Filtration_value;
+
+void program_options(int argc, char * argv[]
+ , std::string & filepoints
+ , std::string & filediag
+ , Filtration_value & threshold
+ , int & dim_max
+ , int & p
+ , Filtration_value & min_persistence);
+
+int main(int argc, char * argv[]) {
+ std::string filepoints;
+ 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);
+ program_options(argc, argv, filepoints, filediag, threshold, dim_max, p, min_persistence);
-// Extract the points from the file filepoints
+ // Extract the points from the file filepoints
typedef std::vector<double> Point_t;
std::vector< Point_t > points;
- read_points( filepoints, points );
+ read_points(filepoints, points);
-// Compute the proximity graph of the points
- Graph_t prox_graph = compute_proximity_graph( points, threshold
- , euclidean_distance<Point_t> );
+ // Compute the proximity graph of the points
+ Graph_t prox_graph = compute_proximity_graph(points, threshold
+ , euclidean_distance<Point_t>);
-// Construct the Rips complex in a Simplex Tree
- Simplex_tree<> st;
- st.insert_graph(prox_graph); // insert the proximity graph in the simplex tree
- st.expansion( dim_max ); // expand the graph until dimension dim_max
+ // 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);
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
+ // Sort the simplices in the order of the filtration
st.initialize_filtration();
-// Compute the persistence diagram of the complex
- persistent_cohomology::Persistent_cohomology< Simplex_tree<>, Field_Zp > pcoh(st);
- pcoh.init_coefficients( p ); //initilizes the coefficient field for homology
-
- pcoh.compute_persistent_cohomology( min_persistence );
+ // Compute the persistence diagram of the complex
+ persistent_cohomology::Persistent_cohomology<ST, Field_Zp > 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(); }
+ // 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 & filepoints
- , std::string & filediag
- , Filtration_value & threshold
- , int & dim_max
- , int & p
- , Filtration_value & min_persistence )
-{
+void program_options(int argc, char * argv[]
+ , std::string & filepoints
+ , 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");
+ 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>(&filepoints),
+ "Name of file containing a point set. Format is one point per line: X1 ... Xd ");
+
po::options_description visible("Allowed options", 100);
visible.add_options()
- ("help,h", "produce help message")
- ("output-file,o", po::value<std::string>(&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(0),
- "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");
+ ("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::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);
+ 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();
+ 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/src/Persistent_cohomology/example/rips_persistence_via_boundary_matrix.cpp b/src/Persistent_cohomology/example/rips_persistence_via_boundary_matrix.cpp
new file mode 100644
index 00000000..4c6656f5
--- /dev/null
+++ b/src/Persistent_cohomology/example/rips_persistence_via_boundary_matrix.cpp
@@ -0,0 +1,180 @@
+/* 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, Marc Glisse
+ *
+ * Copyright (C) 2014 INRIA Sophia Antipolis-Méditerranée (France),
+ * 2015 INRIA Saclay ÃŽle de 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/Hasse_complex.h>
+
+#include <boost/program_options.hpp>
+
+#ifdef GUDHI_USE_TBB
+#include <tbb/task_scheduler_init.h>
+#endif
+
+#include <string>
+#include <vector>
+
+////////////////////////////////////////////////////////////////
+// //
+// WARNING: persistence computation itself is not parallel, //
+// and this uses more memory than rips_persistence. //
+// //
+////////////////////////////////////////////////////////////////
+
+using namespace Gudhi;
+using namespace Gudhi::persistent_cohomology;
+
+typedef int Vertex_handle;
+typedef double Filtration_value;
+
+void program_options(int argc, char * argv[]
+ , std::string & filepoints
+ , std::string & filediag
+ , Filtration_value & threshold
+ , int & dim_max
+ , int & p
+ , Filtration_value & min_persistence);
+
+int main(int argc, char * argv[]) {
+ std::string filepoints;
+ 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);
+
+ // Compute the proximity graph of the points
+ Graph_t prox_graph = compute_proximity_graph(points, threshold
+ , euclidean_distance<Point_t>);
+
+ // 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);
+
+ std::cout << "The complex contains " << st.num_simplices() << " simplices \n";
+ std::cout << " and has dimension " << st.dimension() << " \n";
+
+#ifdef GUDHI_USE_TBB
+ // Unnecessary, but clarifies which operations are parallel.
+ tbb::task_scheduler_init ts;
+#endif
+
+ // Sort the simplices in the order of the filtration
+ st.initialize_filtration();
+ int count = 0;
+ for (auto sh : st.filtration_simplex_range())
+ st.assign_key(sh, count++);
+
+ // Convert to a more convenient representation.
+ Hasse_complex<> hcpx(st);
+
+#ifdef GUDHI_USE_TBB
+ ts.terminate();
+#endif
+
+ // Free some space.
+ delete &st;
+
+ // Compute the persistence diagram of the complex
+ persistent_cohomology::Persistent_cohomology< Hasse_complex<>, Field_Zp > pcoh(hcpx);
+ // 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();
+ }
+}
+
+void program_options(int argc, char * argv[]
+ , std::string & filepoints
+ , 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>(&filepoints),
+ "Name of file containing a point set. Format is one point per line: X1 ... Xd ");
+
+ po::options_description visible("Allowed options", 100);
+ visible.add_options()
+ ("help,h", "produce help message")
+ ("output-file,o", po::value<std::string>(&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(0),
+ "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/src/Persistent_cohomology/include/gudhi/Persistent_cohomology.h b/src/Persistent_cohomology/include/gudhi/Persistent_cohomology.h
index c42e4be4..b31df6a4 100644
--- a/src/Persistent_cohomology/include/gudhi/Persistent_cohomology.h
+++ b/src/Persistent_cohomology/include/gudhi/Persistent_cohomology.h
@@ -20,171 +20,37 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef SRC_PERSISTENT_COHOMOLOGY_INCLUDE_GUDHI_PERSISTENT_COHOMOLOGY_H_
-#define SRC_PERSISTENT_COHOMOLOGY_INCLUDE_GUDHI_PERSISTENT_COHOMOLOGY_H_
+#ifndef PERSISTENT_COHOMOLOGY_H_
+#define PERSISTENT_COHOMOLOGY_H_
#include <gudhi/Persistent_cohomology/Persistent_cohomology_column.h>
#include <gudhi/Persistent_cohomology/Field_Zp.h>
+#include <gudhi/Simple_object_pool.h>
-#include <boost/tuple/tuple.hpp>
#include <boost/intrusive/set.hpp>
#include <boost/pending/disjoint_sets.hpp>
#include <boost/intrusive/list.hpp>
-#include <boost/pool/object_pool.hpp>
#include <map>
#include <utility>
#include <list>
#include <vector>
#include <set>
+#include <fstream> // std::ofstream
+#include <limits> // for numeric_limits<>
+#include <tuple>
+#include <algorithm>
+#include <string>
+#include <stdexcept> // for std::out_of_range
namespace Gudhi {
namespace persistent_cohomology {
-/** \defgroup persistent_cohomology Persistent Cohomology
- *
-
- 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 and an evolution scheme.
-
- 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.
-
- <DT>Topological Spaces:</DT>
- Topological spaces are represented by simplicial complexes.
- Let \f$V = \{1, \cdots ,|V|\}\f$ be a set of <EM>vertices</EM>.
- A <EM>simplex</EM> \f$\sigma\f$ is a subset of vertices
- \f$\sigma \subseteq V\f$. A <EM>simplicial complex</EM> \f$\mathbf{K}\f$
- on \f$V\f$ is a collection of simplices \f$\{\sigma\}\f$,
- \f$\sigma \subseteq V\f$, such that \f$\tau \subseteq \sigma \in \mathbf{K}
- \Rightarrow \tau \in \mathbf{K}\f$. The dimension \f$n=|\sigma|-1\f$ of \f$\sigma\f$
- is its number of elements minus 1. A <EM>filtration</EM> of a simplicial complex is
- a function \f$f:\mathbf{K} \rightarrow \mathbb{R}\f$ satisfying \f$f(\tau)\leq
- f(\sigma)\f$ whenever \f$\tau \subseteq \sigma\f$.
-
- We define the concept FilteredComplex which enumerates the requirements for a class
- to represent a filtered complex from which persistent homology may be computed.
- We use the vocabulary of simplicial complexes, but the concept
- is valid for any type of cell complex. The main requirements
- are the definition of:
- \li type <CODE>Indexing_tag</CODE>, which is a model of the concept
- <CODE>IndexingTag</CODE>,
- describing the nature of the indexing scheme,
- \li type Simplex_handle to manipulate simplices,
- \li method <CODE>int dimension(Simplex_handle)</CODE> returning
- the dimension of a simplex,
- \li type and method <CODE>Boundary_simplex_range
- boundary_simplex_range(Simplex_handle)</CODE> that returns
- a range giving access to the codimension 1 subsimplices of the
- input simplex, as-well-as the coefficients \f$(-1)^i\f$ in the
- definition of the operator \f$\partial\f$. The iterators have
- value type <CODE>Simplex_handle</CODE>,
- \li type and method
- <CODE>Filtration_simplex_range filtration_simplex_range ()</CODE>
- that returns a range giving
- access to all the simplices of the complex read in the order
- assigned by the indexing scheme,
- \li type and method
- <CODE>Filtration_value filtration (Simplex_handle)</CODE> that returns the value of
- the filtration on the simplex represented by the handle.
-
- <DT>Homology:</DT>
- For a ring \f$\mathcal{R}\f$, the group of <EM>n-chains</EM>,
- denoted \f$\mathbf{C}_n(\mathbf{K},\mathcal{R})\f$, of \f$\mathbf{K}\f$ is the
- group of formal sums of
- n-simplices with \f$\mathcal{R}\f$ coefficients. The <EM>boundary operator</EM> is a
- linear operator
- \f$\partial_n: \mathbf{C}_n(\mathbf{K},\mathcal{R}) \rightarrow \mathbf{C}_{n-1}(\mathbf{K},\mathcal{R})\f$
- such that \f$\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]\f$,
- where \f$\widehat{v_i}\f$ means \f$v_i\f$ is omitted from the list. The chain
- groups form a sequence:
-
- \f[\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}) \f]
-
- of finitely many groups \f$\mathbf{C}_n(\mathbf{K},\mathcal{R})\f$ and homomorphisms
- \f$\partial_n\f$, indexed by the dimension \f$n \geq 0\f$.
- The boundary operators satisfy the property \f$\partial_n \circ \partial_{n+1}=0\f$
- for every \f$n > 0\f$
- and we define the homology groups:
-
- \f[\mathbf{H}_n(\mathbf{K},\mathcal{R}) = \ker \partial_n / \mathrm{im} \ \partial_{n+1}\f]
-
- 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.
-
- <DT>Indexing Scheme:</DT>
- "Changing" a simplicial complex consists in applying a simplicial map.
- An <EM>indexing scheme</EM> 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: <EM>linear</EM> ones
- \f$\bullet \longrightarrow \bullet \longrightarrow \cdots \longrightarrow \bullet
- \longrightarrow \bullet\f$
- in persistent homology \cite DBLP:journals/dcg/ZomorodianC05 ,
- and <EM>zigzag</EM> ones
- \f$\bullet \longrightarrow \bullet \longleftarrow \cdots
- \longrightarrow \bullet
- \longleftarrow \bullet \f$ 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.
-
-\section Examples
- We provide several example files: run these examples with -h for details on their use, and read the README file.
-
-\li <CODE>rips_persistence.cpp</CODE> computes the Rips complex of a point cloud and its persistence diagram.
-
-\li <CODE>rips_multifield_persistence.cpp</CODE> computes the Rips complex of a point cloud and its persistence diagram
-with a family of field coefficients.
-
-\li <CODE>performance_rips_persistence.cpp</CODE> 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.
-
-
-
- \author Clément Maria
- \version 1.0
- \date 2014
- \copyright GNU General Public License v3.
- @{
- */
-
/** \brief Computes the persistent cohomology of a filtered complex.
*
+ * \ingroup persistent_cohomology
+ *
* The computation is implemented with a Compressed Annotation Matrix
* (CAM)\cite DBLP:conf/esa/BoissonnatDM13,
* and is adapted to the computation of Multi-Field Persistent Homology (MF)
@@ -193,8 +59,8 @@ different representations.
* \implements PersistentHomology
*
*/
-// Memory allocation policy: classic, use a mempool, etc.*/
-template<class FilteredComplex, class CoefficientField> // to do mem allocation policy: classic, mempool, etc.
+// TODO(CM): Memory allocation policy: classic, use a mempool, etc.
+template<class FilteredComplex, class CoefficientField>
class Persistent_cohomology {
public:
typedef FilteredComplex Complex_ds;
@@ -203,7 +69,7 @@ class Persistent_cohomology {
typedef typename Complex_ds::Simplex_handle Simplex_handle;
typedef typename Complex_ds::Filtration_value Filtration_value;
typedef typename CoefficientField::Element Arith_element;
-// Compressed Annotation Matrix types:
+ // Compressed Annotation Matrix types:
// Column type
typedef Persistent_cohomology_column<Simplex_key, Arith_element> Column; // contains 1 set_hook
// Cell type
@@ -215,33 +81,39 @@ class Persistent_cohomology {
typedef boost::intrusive::set<Column,
boost::intrusive::constant_time_size<false> > Cam;
-// Sparse column type for the annotation of the boundary of an element.
+ // Sparse column type for the annotation of the boundary of an element.
typedef std::vector<std::pair<Simplex_key, Arith_element> > A_ds_type;
-// Persistent interval type. The Arith_element field is used for the multi-field framework.
- typedef boost::tuple<Simplex_handle, Simplex_handle, Arith_element> Persistent_interval;
+ // Persistent interval type. The Arith_element field is used for the multi-field framework.
+ typedef std::tuple<Simplex_handle, Simplex_handle, Arith_element> Persistent_interval;
/** \brief Initializes the Persistent_cohomology class.
*
* @param[in] cpx Complex for which the persistent homology is computed.
- cpx is a model of FilteredComplex
+ * cpx is a model of FilteredComplex
+ * @exception std::out_of_range In case the number of simplices is more than Simplex_key type numeric limit.
*/
explicit Persistent_cohomology(Complex_ds& cpx)
: cpx_(&cpx),
dim_max_(cpx.dimension()), // upper bound on the dimension of the simplices
coeff_field_(), // initialize the field coefficient structure.
- ds_rank_(cpx_->num_simplices()), // union-find
- ds_parent_(cpx_->num_simplices()), // union-find
- ds_repr_(cpx_->num_simplices(), NULL), // union-find -> annotation vectors
+ num_simplices_(cpx_->num_simplices()), // num_simplices save to avoid to call thrice the function
+ ds_rank_(num_simplices_), // union-find
+ ds_parent_(num_simplices_), // union-find
+ ds_repr_(num_simplices_, NULL), // union-find -> annotation vectors
dsets_(&ds_rank_[0], &ds_parent_[0]), // union-find
cam_(), // collection of annotation vectors
zero_cocycles_(), // union-find -> Simplex_key of creator for 0-homology
transverse_idx_(), // key -> row
persistent_pairs_(),
interval_length_policy(&cpx, 0),
- column_pool_(new boost::object_pool<Column>()), // memory pools for the CAM
- cell_pool_(new boost::object_pool<Cell>()) {
+ column_pool_(), // memory pools for the CAM
+ 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.");
+ }
Simplex_key idx_fil = 0;
- for (auto & sh : cpx_->filtration_simplex_range()) {
+ for (auto sh : cpx_->filtration_simplex_range()) {
cpx_->assign_key(sh, idx_fil);
++idx_fil;
dsets_.make_set(cpx_->key(sh));
@@ -251,7 +123,7 @@ class Persistent_cohomology {
/** \brief Initializes the Persistent_cohomology class.
*
* @param[in] cpx Complex for which the persistent homology is compiuted.
- cpx is a model of FilteredComplex
+ * cpx is a model of FilteredComplex
*
* @param[in] persistence_dim_max if true, the persistent homology for the maximal dimension in the
* complex is computed. If false, it is ignored. Default is false.
@@ -264,18 +136,12 @@ class Persistent_cohomology {
}
~Persistent_cohomology() {
-// Clean the remaining columns in the matrix.
- for (auto & cam_ref : cam_) {
- cam_ref.col_.clear();
- }
-// Clean the transversal lists
+ // Clean the transversal lists
for (auto & transverse_ref : transverse_idx_) {
- transverse_ref.second.row_->clear();
+ // Destruct all the cells
+ transverse_ref.second.row_->clear_and_dispose([&](Cell*p){p->~Cell();});
delete transverse_ref.second.row_;
}
-// Clear the memory pools
- delete column_pool_;
- delete cell_pool_;
}
private:
@@ -338,18 +204,18 @@ class Persistent_cohomology {
if (ds_parent_[key] == key // root of its tree
&& zero_cocycles_.find(key) == zero_cocycles_.end()) {
- persistent_pairs_.push_back(
- Persistent_interval(cpx_->simplex(key), cpx_->null_simplex(), coeff_field_.characteristic()));
+ persistent_pairs_.emplace_back(
+ cpx_->simplex(key), cpx_->null_simplex(), coeff_field_.characteristic());
}
}
for (auto zero_idx : zero_cocycles_) {
- persistent_pairs_.push_back(
- Persistent_interval(cpx_->simplex(zero_idx.second), cpx_->null_simplex(), coeff_field_.characteristic()));
+ persistent_pairs_.emplace_back(
+ cpx_->simplex(zero_idx.second), cpx_->null_simplex(), coeff_field_.characteristic());
}
-// Compute infinite interval of dimension > 0
+ // Compute infinite interval of dimension > 0
for (auto cocycle : transverse_idx_) {
- persistent_pairs_.push_back(
- Persistent_interval(cpx_->simplex(cocycle.first), cpx_->null_simplex(), cocycle.second.characteristics_));
+ persistent_pairs_.emplace_back(
+ cpx_->simplex(cocycle.first), cpx_->null_simplex(), cocycle.second.characteristics_);
}
}
@@ -389,8 +255,8 @@ class Persistent_cohomology {
if (cpx_->filtration(cpx_->simplex(idx_coc_u))
< cpx_->filtration(cpx_->simplex(idx_coc_v))) { // Kill cocycle [idx_coc_v], which is younger.
if (interval_length_policy(cpx_->simplex(idx_coc_v), sigma)) {
- persistent_pairs_.push_back(
- Persistent_interval(cpx_->simplex(idx_coc_v), sigma, coeff_field_.characteristic()));
+ persistent_pairs_.emplace_back(
+ cpx_->simplex(idx_coc_v), sigma, coeff_field_.characteristic());
}
// Maintain the index of the 0-cocycle alive.
if (kv != idx_coc_v) {
@@ -404,8 +270,8 @@ class Persistent_cohomology {
}
} else { // Kill cocycle [idx_coc_u], which is younger.
if (interval_length_policy(cpx_->simplex(idx_coc_u), sigma)) {
- persistent_pairs_.push_back(
- Persistent_interval(cpx_->simplex(idx_coc_u), sigma, coeff_field_.characteristic()));
+ persistent_pairs_.emplace_back(
+ cpx_->simplex(idx_coc_u), sigma, coeff_field_.characteristic());
}
// Maintain the index of the 0-cocycle alive.
if (ku != idx_coc_u) {
@@ -431,9 +297,12 @@ class Persistent_cohomology {
std::map<Simplex_key, Arith_element> & map_a_ds, Simplex_handle sigma,
int dim_sigma) {
// traverses the boundary of sigma, keeps track of the annotation vectors,
- // with multiplicity, in a map.
- std::map<Column *, int> annotations_in_boundary;
- std::pair<typename std::map<Column *, int>::iterator, bool> result_insert_bound;
+ // 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;
+ annotations_in_boundary.clear();
int sign = 1 - 2 * (dim_sigma % 2); // \in {-1,1} provides the sign in the
// alternate sum in the boundary.
Simplex_key key;
@@ -445,22 +314,29 @@ class Persistent_cohomology {
// Find its annotation vector
curr_col = ds_repr_[dsets_.find_set(key)];
if (curr_col != NULL) { // and insert it in annotations_in_boundary with multyiplicative factor "sign".
- result_insert_bound = annotations_in_boundary.insert(std::pair<Column *, int>(curr_col, sign));
- if (!(result_insert_bound.second)) {
- result_insert_bound.first->second += sign;
- }
+ annotations_in_boundary.emplace_back(curr_col, sign);
}
}
sign = -sign;
}
+ // Place identical annotations consecutively so we can easily sum their multiplicities.
+ std::sort(annotations_in_boundary.begin(), annotations_in_boundary.end(),
+ [](annotation_t const& a, annotation_t const& b) { return a.first < b.first; });
+
// Sum the annotations with multiplicity, using a map<key,coeff>
// to represent a sparse vector.
std::pair<typename std::map<Simplex_key, Arith_element>::iterator, bool> result_insert_a_ds;
- for (auto ann_ref : annotations_in_boundary) {
- if (ann_ref.second != coeff_field_.additive_identity()) { // For all columns in the boundary,
- for (auto cell_ref : ann_ref.first->col_) { // insert every cell in map_a_ds with multiplicity
- Arith_element w_y = coeff_field_.times(cell_ref.coefficient_, ann_ref.second); // coefficient * multiplicity
+ for (auto ann_it = annotations_in_boundary.begin(); ann_it != annotations_in_boundary.end(); /**/) {
+ Column* col = ann_it->first;
+ int mult = ann_it->second;
+ while (++ann_it != annotations_in_boundary.end() && ann_it->first == col) {
+ mult += ann_it->second;
+ }
+ // The following test is just a heuristic, it is not required, and it is fine that is misses p == 0.
+ if (mult != coeff_field_.additive_identity()) { // For all columns in the boundary,
+ for (auto cell_ref : col->col_) { // insert every cell in map_a_ds with multiplicity
+ Arith_element w_y = coeff_field_.times(cell_ref.coefficient_, mult); // coefficient * multiplicity
if (w_y != coeff_field_.additive_identity()) { // if != 0
result_insert_a_ds = map_a_ds.insert(std::pair<Simplex_key, Arith_element>(cell_ref.key_, w_y));
@@ -528,8 +404,8 @@ class Persistent_cohomology {
Arith_element charac) {
Simplex_key key = cpx_->key(sigma);
// Create a column containing only one cell,
- Column * new_col = column_pool_->construct(Column(key));
- Cell * new_cell = cell_pool_->construct(Cell(key, x, new_col));
+ Column * new_col = column_pool_.construct(key);
+ Cell * new_cell = cell_pool_.construct(key, x, new_col);
new_col->col_.push_back(*new_cell);
// and insert it in the matrix, in constant time thanks to the hint cam_.end().
// Indeed *new_col has the biggest lexicographic value because key is the
@@ -555,9 +431,9 @@ class Persistent_cohomology {
Arith_element charac) {
// Create a finite persistent interval for which the interval exists
if (interval_length_policy(cpx_->simplex(death_key), sigma)) {
- persistent_pairs_.push_back(Persistent_interval(cpx_->simplex(death_key) // creator
- , sigma // destructor
- , charac)); // fields
+ persistent_pairs_.emplace_back(cpx_->simplex(death_key) // creator
+ , sigma // destructor
+ , charac); // fields
}
auto death_key_row = transverse_idx_.find(death_key); // Find the beginning of the row.
@@ -573,9 +449,8 @@ class Persistent_cohomology {
Column * curr_col = row_cell_it->self_col_;
++row_cell_it;
// Disconnect the column from the rows in the CAM.
- for (auto col_cell_it = curr_col->col_.begin();
- col_cell_it != curr_col->col_.end(); ++col_cell_it) {
- col_cell_it->base_hook_cam_h::unlink();
+ for (auto& col_cell : curr_col->col_) {
+ col_cell.base_hook_cam_h::unlink();
}
// Remove the column from the CAM before modifying its value
@@ -585,14 +460,14 @@ class Persistent_cohomology {
if (curr_col->col_.empty()) { // If the column is null
ds_repr_[curr_col->class_key_] = NULL;
- column_pool_->free(curr_col); // delete curr_col;
+ column_pool_.destroy(curr_col); // delete curr_col;
} else {
// Find whether the column obtained is already in the CAM
result_insert_cam = cam_.insert(*curr_col);
if (result_insert_cam.second) { // If it was not in the CAM before: insertion has succeeded
- for (auto col_cell_it = curr_col->col_.begin(); col_cell_it != curr_col->col_.end(); ++col_cell_it) {
+ for (auto& col_cell : curr_col->col_) {
// re-establish the row links
- transverse_idx_[col_cell_it->key_].row_->push_front(*col_cell_it);
+ transverse_idx_[col_cell.key_].row_->push_front(col_cell);
}
} else { // There is already an identical column in the CAM:
// merge two disjoint sets.
@@ -602,7 +477,9 @@ class Persistent_cohomology {
Simplex_key key_tmp = dsets_.find_set(curr_col->class_key_);
ds_repr_[key_tmp] = &(*(result_insert_cam.first));
result_insert_cam.first->class_key_ = key_tmp;
- column_pool_->free(curr_col); // delete curr_col;
+ // intrusive containers don't own their elements, we have to release them manually
+ curr_col->col_.clear_and_dispose([&](Cell*p){cell_pool_.destroy(p);});
+ column_pool_.destroy(curr_col); // delete curr_col;
}
}
} else {
@@ -634,7 +511,7 @@ class Persistent_cohomology {
++target_it;
} else {
if (target_it->key_ > other_it->first) {
- Cell * cell_tmp = cell_pool_->construct(Cell(other_it->first // key
+ Cell * cell_tmp = cell_pool_.construct(Cell(other_it->first // key
, coeff_field_.additive_identity(), &target));
cell_tmp->coefficient_ = coeff_field_.plus_times_equal(cell_tmp->coefficient_, other_it->second, w);
@@ -652,8 +529,7 @@ class Persistent_cohomology {
Cell * tmp_cell_ptr = &(*tmp_it);
target.col_.erase(tmp_it); // removed from column
- coeff_field_.clear_coefficient(tmp_cell_ptr->coefficient_);
- cell_pool_->free(tmp_cell_ptr); // delete from memory
+ cell_pool_.destroy(tmp_cell_ptr); // delete from memory
} else {
++target_it;
++other_it;
@@ -662,7 +538,7 @@ class Persistent_cohomology {
}
}
while (other_it != other.end()) {
- Cell * cell_tmp = cell_pool_->construct(Cell(other_it->first, coeff_field_.additive_identity(), &target));
+ Cell * cell_tmp = cell_pool_.construct(Cell(other_it->first, coeff_field_.additive_identity(), &target));
cell_tmp->coefficient_ = coeff_field_.plus_times_equal(cell_tmp->coefficient_, other_it->second, w);
target.col_.insert(target.col_.end(), *cell_tmp);
@@ -696,9 +572,8 @@ class Persistent_cohomology {
* feature exists in homology with Z/piZ coefficients.
*/
void output_diagram(std::ostream& ostream = std::cout) {
-
cmp_intervals_by_length cmp(cpx_);
- persistent_pairs_.sort(cmp);
+ std::sort(std::begin(persistent_pairs_), std::end(persistent_pairs_), cmp);
bool has_infinity = std::numeric_limits<Filtration_value>::has_infinity;
for (auto pair : persistent_pairs_) {
// Special case on windows, inf is "1.#INF" (cf. unitary tests and R package TDA)
@@ -713,25 +588,116 @@ class Persistent_cohomology {
}
}
- void write_output_diagram(std::string diagram_name)
- {
- std::ofstream diagram_out(diagram_name.c_str());
- cmp_intervals_by_length cmp( cpx_ );
- persistent_pairs_.sort( cmp );
- for(auto pair : persistent_pairs_)
- {
+ void write_output_diagram(std::string diagram_name) {
+ std::ofstream diagram_out(diagram_name.c_str());
+ cmp_intervals_by_length cmp(cpx_);
+ std::sort(std::begin(persistent_pairs_), std::end(persistent_pairs_), cmp);
+ for (auto pair : persistent_pairs_) {
diagram_out << cpx_->dimension(get<0>(pair)) << " "
<< cpx_->filtration(get<0>(pair)) << " "
<< cpx_->filtration(get<1>(pair)) << std::endl;
}
}
+ /** @brief Returns Betti numbers.
+ * @return A vector of Betti numbers.
+ */
+ std::vector<int> betti_numbers() const {
+ // Init Betti numbers vector with zeros until Simplicial complex dimension
+ std::vector<int> betti_numbers(cpx_->dimension(), 0);
+
+ for (auto pair : persistent_pairs_) {
+ // Count never ended persistence intervals
+ if (cpx_->null_simplex() == get<1>(pair)) {
+ // Increment corresponding betti number
+ betti_numbers[cpx_->dimension(get<0>(pair))] += 1;
+ }
+ }
+ return betti_numbers;
+ }
+
+ /** @brief Returns the Betti number of the dimension passed by parameter.
+ * @param[in] dimension The Betti number dimension to get.
+ * @return Betti number of the given dimension
+ *
+ */
+ int betti_number(int dimension) const {
+ int betti_number = 0;
+
+ for (auto pair : persistent_pairs_) {
+ // Count never ended persistence intervals
+ if (cpx_->null_simplex() == get<1>(pair)) {
+ if (cpx_->dimension(get<0>(pair)) == dimension) {
+ // Increment betti number found
+ ++betti_number;
+ }
+ }
+ }
+ return betti_number;
+ }
+
+ /** @brief Returns the persistent Betti numbers.
+ * @param[in] from The persistence birth limit to be added in the number \f$(persistent birth \leq from)\f$.
+ * @param[in] to The persistence death limit to be added in the number \f$(persistent death > to)\f$.
+ * @return A vector of persistent Betti numbers.
+ */
+ 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);
+
+ 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
+ // still work if we change the complex filtration function to reject null simplices.
+ if (cpx_->filtration(get<0>(pair)) <= from &&
+ (get<1>(pair) == cpx_->null_simplex() || cpx_->filtration(get<1>(pair)) > to)) {
+ // Increment corresponding betti number
+ betti_numbers[cpx_->dimension(get<0>(pair))] += 1;
+ }
+ }
+ return betti_numbers;
+ }
+
+ /** @brief Returns the persistent Betti number of the dimension passed by parameter.
+ * @param[in] dimension The Betti number dimension to get.
+ * @param[in] from The persistence birth limit to be added in the number \f$(persistent birth \leq from)\f$.
+ * @param[in] to The persistence death limit to be added in the number \f$(persistent death > to)\f$.
+ * @return Persistent Betti number of the given dimension
+ */
+ int persistent_betti_number(int dimension, Filtration_value from, Filtration_value to) const {
+ int betti_number = 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
+ // still work if we change the complex filtration function to reject null simplices.
+ if (cpx_->filtration(get<0>(pair)) <= from &&
+ (get<1>(pair) == cpx_->null_simplex() || cpx_->filtration(get<1>(pair)) > to)) {
+ if (cpx_->dimension(get<0>(pair)) == dimension) {
+ // Increment betti number found
+ ++betti_number;
+ }
+ }
+ }
+ return betti_number;
+ }
+
+ /** @brief Returns the persistent pairs.
+ * @return Persistent pairs
+ *
+ */
+ const std::vector<Persistent_interval>& get_persistent_pairs() const {
+ return persistent_pairs_;
+ }
+
private:
/*
* Structure representing a cocycle.
*/
struct cocycle {
- cocycle() {
+ cocycle()
+ : row_(nullptr),
+ characteristics_() {
}
cocycle(Arith_element characteristics, Hcell * row)
: row_(row),
@@ -746,6 +712,7 @@ class Persistent_cohomology {
Complex_ds * cpx_;
int dim_max_;
CoefficientField coeff_field_;
+ size_t num_simplices_;
/* Disjoint sets data structure to link the model of FilteredComplex
* with the compressed annotation matrix.
@@ -764,17 +731,15 @@ class Persistent_cohomology {
/* Key -> row. */
std::map<Simplex_key, cocycle> transverse_idx_;
/* Persistent intervals. */
- std::list<Persistent_interval> persistent_pairs_;
+ std::vector<Persistent_interval> persistent_pairs_;
length_interval interval_length_policy;
- boost::object_pool<Column> * column_pool_;
- boost::object_pool<Cell> * cell_pool_;
+ Simple_object_pool<Column> column_pool_;
+ Simple_object_pool<Cell> cell_pool_;
};
-/** @} */ // end defgroup persistent_cohomology
-
} // namespace persistent_cohomology
} // namespace Gudhi
-#endif // SRC_PERSISTENT_COHOMOLOGY_INCLUDE_GUDHI_PERSISTENT_COHOMOLOGY_H_
+#endif // PERSISTENT_COHOMOLOGY_H_
diff --git a/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Field_Zp.h b/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Field_Zp.h
index 5d0c9f9f..6db16e69 100644
--- a/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Field_Zp.h
+++ b/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Field_Zp.h
@@ -20,8 +20,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef SRC_PERSISTENT_COHOMOLOGY_INCLUDE_GUDHI_PERSISTENT_COHOMOLOGY_FIELD_ZP_H_
-#define SRC_PERSISTENT_COHOMOLOGY_INCLUDE_GUDHI_PERSISTENT_COHOMOLOGY_FIELD_ZP_H_
+#ifndef PERSISTENT_COHOMOLOGY_FIELD_ZP_H_
+#define PERSISTENT_COHOMOLOGY_FIELD_ZP_H_
#include <utility>
#include <vector>
@@ -41,9 +41,7 @@ class Field_Zp {
Field_Zp()
: Prime(0),
- inverse_(),
- mult_id_all(1),
- add_id_all(0) {
+ inverse_() {
}
void init(int charac) {
@@ -76,22 +74,19 @@ class Field_Zp {
return plus_times_equal(0, y, (Element)w);
}
- void clear_coefficient(Element x) {
- }
-
Element plus_equal(const Element& x, const Element& y) {
return plus_times_equal(x, y, (Element)1);
}
/** \brief Returns the additive idendity \f$0_{\Bbbk}\f$ of the field.*/
- const Element& additive_identity() const {
- return add_id_all;
+ Element additive_identity() const {
+ return 0;
}
/** \brief Returns the multiplicative identity \f$1_{\Bbbk}\f$ of the field.*/
- const Element& multiplicative_identity(Element P = 0) const {
- return mult_id_all;
+ Element multiplicative_identity(Element = 0) const {
+ return 1;
}
- /** Returns the inverse in the field. Modifies P.*/
+ /** Returns the inverse in the field. Modifies P. ??? */
std::pair<Element, Element> inverse(Element x, Element P) {
return std::pair<Element, Element>(inverse_[x], P);
} // <------ return the product of field characteristic for which x is invertible
@@ -104,7 +99,7 @@ class Field_Zp {
}
/** \brief Returns the characteristic \f$p\f$ of the field.*/
- const int& characteristic() const {
+ int characteristic() const {
return Prime;
}
@@ -112,12 +107,10 @@ class Field_Zp {
int Prime;
/** Property map Element -> Element, which associate to an element its inverse in the field.*/
std::vector<Element> inverse_;
- const Element mult_id_all;
- const Element add_id_all;
};
} // namespace persistent_cohomology
} // namespace Gudhi
-#endif // SRC_PERSISTENT_COHOMOLOGY_INCLUDE_GUDHI_PERSISTENT_COHOMOLOGY_FIELD_ZP_H_
+#endif // PERSISTENT_COHOMOLOGY_FIELD_ZP_H_
diff --git a/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Multi_field.h b/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Multi_field.h
index b43bb16e..38bc08d1 100644
--- a/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Multi_field.h
+++ b/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Multi_field.h
@@ -20,8 +20,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef SRC_PERSISTENT_COHOMOLOGY_INCLUDE_GUDHI_PERSISTENT_COHOMOLOGY_MULTI_FIELD_H_
-#define SRC_PERSISTENT_COHOMOLOGY_INCLUDE_GUDHI_PERSISTENT_COHOMOLOGY_MULTI_FIELD_H_
+#ifndef PERSISTENT_COHOMOLOGY_MULTI_FIELD_H_
+#define PERSISTENT_COHOMOLOGY_MULTI_FIELD_H_
#include <gmpxx.h>
@@ -77,11 +77,11 @@ class Multi_field {
mpz_nextprime(tmp_prime, tmp_prime);
curr_prime = mpz_get_ui(tmp_prime);
}
+ mpz_clear(tmp_prime);
// set m to primorial(bound_prime)
prod_characteristics_ = 1;
for (auto p : primes_) {
- mpz_mul_ui(prod_characteristics_.get_mpz_t(),
- prod_characteristics_.get_mpz_t(), p);
+ prod_characteristics_ *= p;
}
// Uvect_
@@ -102,10 +102,6 @@ class Multi_field {
}
}
- void clear_coefficient(Element & x) {
- mpz_clear(x.get_mpz_t());
- }
-
/** \brief Returns the additive idendity \f$0_{\Bbbk}\f$ of the field.*/
const Element& additive_identity() const {
return add_id_all;
@@ -145,7 +141,7 @@ class Multi_field {
return prod_characteristics_;
}
- /** Returns the inverse in the field. Modifies P.*/
+ /** Returns the inverse in the field. Modifies P. ??? */
std::pair<Element, Element> inverse(Element x, Element QS) {
Element QR;
mpz_gcd(QR.get_mpz_t(), x.get_mpz_t(), QS.get_mpz_t()); // QR <- gcd(x,QS)
@@ -156,12 +152,12 @@ class Multi_field {
mpz_invert(inv_qt.get_mpz_t(), x.get_mpz_t(), QT.get_mpz_t());
assert(prod_characteristics_ > 0); // division by zero + non negative values
- return std::pair<Element, Element>(
- (inv_qt * multiplicative_identity(QT)) % prod_characteristics_, QT);
+ return { (inv_qt * multiplicative_identity(QT)) % prod_characteristics_, QT };
}
/** Returns -x * y.*/
Element times_minus(const Element& x, const Element& y) {
assert(prod_characteristics_ > 0); // division by zero + non negative values
+ /* This assumes that (x*y)%pc cannot be zero, but Field_Zp has specific code for the 0 case ??? */
return prod_characteristics_ - ((x * y) % prod_characteristics_);
}
@@ -186,4 +182,4 @@ class Multi_field {
} // namespace Gudhi
-#endif // SRC_PERSISTENT_COHOMOLOGY_INCLUDE_GUDHI_PERSISTENT_COHOMOLOGY_MULTI_FIELD_H_
+#endif // PERSISTENT_COHOMOLOGY_MULTI_FIELD_H_
diff --git a/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Persistent_cohomology_column.h b/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Persistent_cohomology_column.h
index fcec819a..5deb2d88 100644
--- a/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Persistent_cohomology_column.h
+++ b/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Persistent_cohomology_column.h
@@ -20,14 +20,13 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef SRC_PERSISTENT_COHOMOLOGY_INCLUDE_GUDHI_PERSISTENT_COHOMOLOGY_PERSISTENT_COHOMOLOGY_COLUMN_H_
-#define SRC_PERSISTENT_COHOMOLOGY_INCLUDE_GUDHI_PERSISTENT_COHOMOLOGY_PERSISTENT_COHOMOLOGY_COLUMN_H_
+#ifndef PERSISTENT_COHOMOLOGY_PERSISTENT_COHOMOLOGY_COLUMN_H_
+#define PERSISTENT_COHOMOLOGY_PERSISTENT_COHOMOLOGY_COLUMN_H_
-#include <list>
+#include <boost/intrusive/set.hpp>
+#include <boost/intrusive/list.hpp>
-#include "boost/tuple/tuple.hpp"
-#include "boost/intrusive/set.hpp"
-#include "boost/intrusive/list.hpp"
+#include <list>
namespace Gudhi {
@@ -80,40 +79,33 @@ class Persistent_cohomology_cell : public base_hook_cam_h,
* The non-zero coefficients of the column are stored in a
* boost::intrusive::list. Contains a hook to be stored in a
* boost::intrusive::set.
+ *
+ * Movable but not Copyable.
*/
template<typename SimplexKey, typename ArithmeticElement>
class Persistent_cohomology_column : public boost::intrusive::set_base_hook<
boost::intrusive::link_mode<boost::intrusive::normal_link> > {
- private:
template<class T1, class T2> friend class Persistent_cohomology;
+ public:
typedef Persistent_cohomology_cell<SimplexKey, ArithmeticElement> Cell;
typedef boost::intrusive::list<Cell,
boost::intrusive::constant_time_size<false>,
boost::intrusive::base_hook<base_hook_cam_v> > Col_type;
/** \brief Creates an empty column.*/
- explicit Persistent_cohomology_column(SimplexKey key) {
- class_key_ = key;
- col_ = Col_type();
- }
- public:
- /** Copy constructor.*/
- Persistent_cohomology_column(Persistent_cohomology_column const &other)
+ explicit Persistent_cohomology_column(SimplexKey key)
: col_(),
- class_key_(other.class_key_) {
- if (!other.col_.empty())
- std::cerr << "Copying a non-empty column.\n";
- }
+ class_key_(key) {}
/** \brief Returns true iff the column is null.*/
- bool is_null() {
+ bool is_null() const {
return col_.empty();
}
/** \brief Returns the key of the representative simplex of
* the set of simplices having this column as annotation vector
* in the compressed annotation matrix.*/
- SimplexKey class_key() {
+ SimplexKey class_key() const {
return class_key_;
}
@@ -145,4 +137,4 @@ class Persistent_cohomology_column : public boost::intrusive::set_base_hook<
} // namespace Gudhi
-#endif // SRC_PERSISTENT_COHOMOLOGY_INCLUDE_GUDHI_PERSISTENT_COHOMOLOGY_PERSISTENT_COHOMOLOGY_COLUMN_H_
+#endif // PERSISTENT_COHOMOLOGY_PERSISTENT_COHOMOLOGY_COLUMN_H_
diff --git a/src/Persistent_cohomology/test/CMakeLists.txt b/src/Persistent_cohomology/test/CMakeLists.txt
index ed63a6ac..a21f39c4 100644
--- a/src/Persistent_cohomology/test/CMakeLists.txt
+++ b/src/Persistent_cohomology/test/CMakeLists.txt
@@ -1,21 +1,23 @@
cmake_minimum_required(VERSION 2.6)
-project(GUDHIPersistentCohomologyUT)
+project(Persistent_cohomology_tests)
if (GCOVR_PATH)
# for gcovr to make coverage reports - Corbera Jenkins plugin
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage")
- set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fprofile-arcs -ftest-coverage")
-endif()
+endif(GCOVR_PATH)
if (GPROF_PATH)
# for gprof to make coverage reports - Jenkins
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
- set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -pg")
-endif()
+endif(GPROF_PATH)
add_executable ( PersistentCohomologyUT persistent_cohomology_unit_test.cpp )
target_link_libraries(PersistentCohomologyUT ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
+add_executable ( BettiNumbersUT betti_numbers_unit_test.cpp )
+target_link_libraries(BettiNumbersUT ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
+if (TBB_FOUND)
+ target_link_libraries(PersistentCohomologyUT ${TBB_LIBRARIES})
+ target_link_libraries(BettiNumbersUT ${TBB_LIBRARIES})
+endif(TBB_FOUND)
# Unitary tests
add_test(NAME PersistentCohomologyUT
@@ -24,9 +26,17 @@ add_test(NAME PersistentCohomologyUT
# XML format for Jenkins xUnit plugin
--log_format=XML --log_sink=${CMAKE_SOURCE_DIR}/PersistentCohomologyUT.xml --log_level=test_suite --report_level=no)
+add_test(NAME BettiNumbersUT
+ COMMAND ${CMAKE_CURRENT_BINARY_DIR}/BettiNumbersUT
+ # XML format for Jenkins xUnit plugin
+ --log_format=XML --log_sink=${CMAKE_SOURCE_DIR}/BettiNumbersUT.xml --log_level=test_suite --report_level=no)
+
if(GMPXX_FOUND AND GMP_FOUND)
add_executable ( PersistentCohomologyMultiFieldUT persistent_cohomology_unit_test_multi_field.cpp )
target_link_libraries(PersistentCohomologyMultiFieldUT ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} ${GMPXX_LIBRARIES} ${GMP_LIBRARIES})
+ if (TBB_FOUND)
+ target_link_libraries(PersistentCohomologyMultiFieldUT ${TBB_LIBRARIES})
+ endif(TBB_FOUND)
# Unitary tests
add_test(NAME PersistentCohomologyMultiFieldUT
@@ -35,5 +45,5 @@ if(GMPXX_FOUND AND GMP_FOUND)
# XML format for Jenkins xUnit plugin
--log_format=XML --log_sink=${CMAKE_SOURCE_DIR}/PersistentCohomologyMultiFieldUT.xml --log_level=test_suite --report_level=no)
-endif()
+endif(GMPXX_FOUND AND GMP_FOUND)
diff --git a/src/Persistent_cohomology/test/betti_numbers_unit_test.cpp b/src/Persistent_cohomology/test/betti_numbers_unit_test.cpp
new file mode 100644
index 00000000..40221005
--- /dev/null
+++ b/src/Persistent_cohomology/test/betti_numbers_unit_test.cpp
@@ -0,0 +1,234 @@
+#include <iostream>
+#include <string>
+#include <algorithm>
+#include <utility> // std::pair, std::make_pair
+#include <cmath> // float comparison
+#include <limits>
+
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_MODULE "betti_numbers"
+#include <boost/test/unit_test.hpp>
+
+#include "gudhi/Simplex_tree.h"
+#include "gudhi/Persistent_cohomology.h"
+
+struct MiniSTOptions : 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
+ static const bool store_key = true;
+ // I have few vertices
+ typedef short Vertex_handle;
+};
+
+using Mini_simplex_tree = Gudhi::Simplex_tree<MiniSTOptions>;
+using Mini_st_persistence =
+ Gudhi::persistent_cohomology::Persistent_cohomology<Mini_simplex_tree, Gudhi::persistent_cohomology::Field_Zp>;
+
+/*
+ * Compare two intervals by dimension, then by length.
+ */
+template<class Simplicial_complex>
+struct cmp_intervals_by_dim_then_length {
+ explicit cmp_intervals_by_dim_then_length(Simplicial_complex * 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)));
+ }
+ Simplicial_complex* sc_;
+};
+
+BOOST_AUTO_TEST_CASE( plain_homology_betti_numbers )
+{
+ Mini_simplex_tree st;
+
+ /* Complex to build. */
+ /* 1 4 */
+ /* o---o */
+ /* /3\ / */
+ /* o---o o */
+ /* 2 0 5 */
+ const short tetra0123[] = {0, 1, 2, 3};
+ const short edge04[] = {0, 4};
+ const short edge14[] = {1, 4};
+ const short vertex5[] = {5};
+ st.insert_simplex_and_subfaces(tetra0123);
+ st.insert_simplex_and_subfaces(edge04);
+ st.insert_simplex(edge14);
+ st.insert_simplex(vertex5);
+ // FIXME: Remove this line
+ st.set_dimension(3);
+
+ // Sort the simplices in the order of the filtration
+ st.initialize_filtration();
+
+ // Class for homology computation
+ Mini_st_persistence pcoh(st);
+
+ // Initialize the coefficient field Z/3Z for homology
+ pcoh.init_coefficients(3);
+
+ // Compute the persistence diagram of the complex
+ pcoh.compute_persistent_cohomology();
+
+ // Print the result. The format is, on each line: 2 dim 0 inf
+ // where 2 represents the field, dim the dimension of the feature.
+ // 2 0 0 inf
+ // 2 0 0 inf
+ // 2 1 0 inf
+ // means that in Z/2Z-homology, the Betti numbers are b0=2 and b1=1.
+
+ BOOST_CHECK(pcoh.betti_number(0) == 2);
+ BOOST_CHECK(pcoh.betti_number(1) == 1);
+ BOOST_CHECK(pcoh.betti_number(2) == 0);
+
+ std::vector<int> bns = pcoh.betti_numbers();
+ BOOST_CHECK(bns.size() == 3);
+ BOOST_CHECK(bns[0] == 2);
+ BOOST_CHECK(bns[1] == 1);
+ BOOST_CHECK(bns[2] == 0);
+
+ // Custom sort and output persistence
+ cmp_intervals_by_dim_then_length<Mini_simplex_tree> cmp(&st);
+ auto persistent_pairs = pcoh.get_persistent_pairs();
+
+ std::sort(std::begin(persistent_pairs), std::end(persistent_pairs), cmp);
+
+ BOOST_CHECK(persistent_pairs.size() == 3);
+ // persistent_pairs[0] = 2 1 0 inf
+ BOOST_CHECK(st.dimension(get<0>(persistent_pairs[0])) == 1);
+ BOOST_CHECK(st.filtration(get<0>(persistent_pairs[0])) == 0);
+ BOOST_CHECK(get<1>(persistent_pairs[0]) == st.null_simplex());
+
+ // persistent_pairs[1] = 2 0 0 inf
+ BOOST_CHECK(st.dimension(get<0>(persistent_pairs[1])) == 0);
+ BOOST_CHECK(st.filtration(get<0>(persistent_pairs[1])) == 0);
+ BOOST_CHECK(get<1>(persistent_pairs[1]) == st.null_simplex());
+
+ // persistent_pairs[2] = 2 0 0 inf
+ BOOST_CHECK(st.dimension(get<0>(persistent_pairs[2])) == 0);
+ BOOST_CHECK(st.filtration(get<0>(persistent_pairs[2])) == 0);
+ BOOST_CHECK(get<1>(persistent_pairs[2]) == st.null_simplex());
+}
+
+using Simplex_tree = Gudhi::Simplex_tree<>;
+using St_persistence =
+ Gudhi::persistent_cohomology::Persistent_cohomology<Simplex_tree, Gudhi::persistent_cohomology::Field_Zp>;
+
+BOOST_AUTO_TEST_CASE( betti_numbers )
+{
+ Simplex_tree st;
+
+ /* Complex to build. */
+ /* 1 4 */
+ /* o---o */
+ /* /3\ / */
+ /* o---o o */
+ /* 2 0 5 */
+ const short tetra0123[] = {0, 1, 2, 3};
+ const short edge04[] = {0, 4};
+ const short edge14[] = {1, 4};
+ const short vertex5[] = {5};
+ st.insert_simplex_and_subfaces(tetra0123, 4.0);
+ st.insert_simplex_and_subfaces(edge04, 2.0);
+ st.insert_simplex(edge14, 2.0);
+ st.insert_simplex(vertex5, 1.0);
+ // FIXME: Remove this line
+ st.set_dimension(3);
+
+ // Sort the simplices in the order of the filtration
+ st.initialize_filtration();
+
+ // Class for homology computation
+ St_persistence pcoh(st);
+
+ // Initialize the coefficient field Z/3Z for homology
+ pcoh.init_coefficients(3);
+
+ // Compute the persistence diagram of the complex
+ pcoh.compute_persistent_cohomology();
+
+ // Check the Betti numbers are b0=2, b1=1 and b2=0.
+ BOOST_CHECK(pcoh.betti_number(0) == 2);
+ BOOST_CHECK(pcoh.betti_number(1) == 1);
+ BOOST_CHECK(pcoh.betti_number(2) == 0);
+
+ // Check the Betti numbers are b0=2, b1=1 and b2=0.
+ std::vector<int> bns = pcoh.betti_numbers();
+ BOOST_CHECK(bns.size() == 3);
+ BOOST_CHECK(bns[0] == 2);
+ BOOST_CHECK(bns[1] == 1);
+ BOOST_CHECK(bns[2] == 0);
+
+ // Check the persistent Betti numbers in [4., 10.] are b0=2, b1=1 and b2=0.
+ BOOST_CHECK(pcoh.persistent_betti_number(0, 4., 10.) == 2);
+ BOOST_CHECK(pcoh.persistent_betti_number(1, 4., 10.) == 1);
+ BOOST_CHECK(pcoh.persistent_betti_number(2, 4., 10.) == 0);
+
+ // Check the persistent Betti numbers in [2., 100.] are b0=2, b1=0 and b2=0.
+ BOOST_CHECK(pcoh.persistent_betti_number(0, 2., 100.) == 2);
+ BOOST_CHECK(pcoh.persistent_betti_number(1, 2., 100.) == 0);
+ BOOST_CHECK(pcoh.persistent_betti_number(2, 2., 100.) == 0);
+
+ // Check the persistent Betti numbers in [1., 1000.] are b0=1, b1=0 and b2=0.
+ BOOST_CHECK(pcoh.persistent_betti_number(0, 1., 1000.) == 1);
+ BOOST_CHECK(pcoh.persistent_betti_number(1, 1., 1000.) == 0);
+ BOOST_CHECK(pcoh.persistent_betti_number(2, 1., 1000.) == 0);
+
+ // Check the persistent Betti numbers in [.9, 1000.] are b0=0, b1=0 and b2=0.
+ BOOST_CHECK(pcoh.persistent_betti_number(0, .9, 1000.) == 0);
+ BOOST_CHECK(pcoh.persistent_betti_number(1, .9, 1000.) == 0);
+ BOOST_CHECK(pcoh.persistent_betti_number(2, .9, 1000.) == 0);
+
+ // Check the persistent Betti numbers in [4.1, 10000.] are b0=2, b1=1 and b2=0.
+ bns = pcoh.persistent_betti_numbers(4.1, 10000.);
+ BOOST_CHECK(bns[0] == 2);
+ BOOST_CHECK(bns[1] == 1);
+ BOOST_CHECK(bns[2] == 0);
+
+ // Check the persistent Betti numbers in [2.1, 100000.] are b0=2, b1=0 and b2=0.
+ bns = pcoh.persistent_betti_numbers(2.1, 100000.);
+ BOOST_CHECK(bns[0] == 2);
+ BOOST_CHECK(bns[1] == 0);
+ BOOST_CHECK(bns[2] == 0);
+
+ // Check the persistent Betti numbers in [1.1, 1000000.] are b0=1, b1=0 and b2=0.
+ bns = pcoh.persistent_betti_numbers(1.1, 1000000.);
+ BOOST_CHECK(bns[0] == 1);
+ BOOST_CHECK(bns[1] == 0);
+ BOOST_CHECK(bns[2] == 0);
+
+ // Check the persistent Betti numbers in [.1, 10000000.] are b0=0, b1=0 and b2=0.
+ bns = pcoh.persistent_betti_numbers(.1, 10000000.);
+ BOOST_CHECK(bns[0] == 0);
+ BOOST_CHECK(bns[1] == 0);
+ BOOST_CHECK(bns[2] == 0);
+
+ // Custom sort and output persistence
+ cmp_intervals_by_dim_then_length<Simplex_tree> cmp(&st);
+ auto persistent_pairs = pcoh.get_persistent_pairs();
+
+ std::sort(std::begin(persistent_pairs), std::end(persistent_pairs), cmp);
+
+ BOOST_CHECK(persistent_pairs.size() == 3);
+ // persistent_pairs[0] = 2 1 4 inf
+ BOOST_CHECK(st.dimension(get<0>(persistent_pairs[0])) == 1);
+ BOOST_CHECK(st.filtration(get<0>(persistent_pairs[0])) == 4);
+ BOOST_CHECK(get<1>(persistent_pairs[0]) == st.null_simplex());
+
+ // persistent_pairs[1] = 2 0 2 inf
+ BOOST_CHECK(st.dimension(get<0>(persistent_pairs[1])) == 0);
+ BOOST_CHECK(st.filtration(get<0>(persistent_pairs[1])) == 2);
+ BOOST_CHECK(get<1>(persistent_pairs[1]) == st.null_simplex());
+
+ // persistent_pairs[2] = 2 0 1 inf
+ BOOST_CHECK(st.dimension(get<0>(persistent_pairs[2])) == 0);
+ BOOST_CHECK(st.filtration(get<0>(persistent_pairs[2])) == 1);
+ BOOST_CHECK(get<1>(persistent_pairs[2]) == st.null_simplex());
+}
diff --git a/src/Persistent_cohomology/test/persistent_cohomology_unit_test.cpp b/src/Persistent_cohomology/test/persistent_cohomology_unit_test.cpp
index 55bc7066..6efd749e 100644
--- a/src/Persistent_cohomology/test/persistent_cohomology_unit_test.cpp
+++ b/src/Persistent_cohomology/test/persistent_cohomology_unit_test.cpp
@@ -1,14 +1,14 @@
-#define BOOST_TEST_MODULE persistent_cohomology test
-#include <boost/test/included/unit_test.hpp>
-#include <boost/system/error_code.hpp>
-#include <boost/chrono/thread_clock.hpp>
#include <iostream>
#include <string>
-
+#include <algorithm>
#include <utility> // std::pair, std::make_pair
-
#include <cmath> // float comparison
#include <limits>
+#include <cstdint> // for std::uint8_t
+
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_MODULE "persistent_cohomology"
+#include <boost/test/unit_test.hpp>
#include "gudhi/graph_simplicial_complex.h"
#include "gudhi/reader_utils.h"
@@ -44,7 +44,7 @@ std::string test_rips_persistence(int coefficient, int min_persistence) {
st.initialize_filtration();
// Compute the persistence diagram of the complex
- persistent_cohomology::Persistent_cohomology<Simplex_tree<>, Field_Zp> pcoh(st);
+ Persistent_cohomology<Simplex_tree<>, Field_Zp> pcoh(st);
pcoh.init_coefficients( coefficient ); // initializes the coefficient field for homology
// Check infinite rips
@@ -173,3 +173,45 @@ BOOST_AUTO_TEST_CASE( rips_persistent_cohomology_single_field_dim_5 )
// std::string str_rips_persistence = test_rips_persistence(6, 0);
// TODO(VR): division by zero
// std::string str_rips_persistence = test_rips_persistence(0, 0);
+
+/** SimplexTree minimal options to test the limits.
+ *
+ * Maximum number of simplices to compute persistence is <CODE>std::numeric_limits<std::uint8_t>::max()<\CODE> = 256.*/
+struct MiniSTOptions {
+ typedef linear_indexing_tag Indexing_tag;
+ typedef short Vertex_handle;
+ typedef double Filtration_value;
+ // Maximum number of simplices to compute persistence is 2^8 - 1 = 255. One is reserved for null_key
+ typedef std::uint8_t Simplex_key;
+ static const bool store_key = true;
+ static const bool store_filtration = false;
+ static const bool contiguous_vertices = false;
+};
+
+using Mini_simplex_tree = Gudhi::Simplex_tree<MiniSTOptions>;
+using Mini_st_persistence =
+ Gudhi::persistent_cohomology::Persistent_cohomology<Mini_simplex_tree, Gudhi::persistent_cohomology::Field_Zp>;
+
+BOOST_AUTO_TEST_CASE( persistence_constructor_exception )
+{
+ Mini_simplex_tree st;
+
+ // To make number of simplices = 255
+ const short simplex_0[] = {0, 1, 2, 3, 4, 5, 6, 7};
+ st.insert_simplex_and_subfaces(simplex_0);
+ // FIXME: Remove this line
+ st.set_dimension(8);
+
+ // Sort the simplices in the order of the filtration
+ st.initialize_filtration();
+
+ BOOST_CHECK(st.num_simplices() <= std::numeric_limits<MiniSTOptions::Simplex_key>::max());
+ // Class for homology computation
+ BOOST_CHECK_NO_THROW(Mini_st_persistence pcoh(st));
+
+ st.insert_simplex({8});
+ BOOST_CHECK(st.num_simplices() > std::numeric_limits<MiniSTOptions::Simplex_key>::max());
+ // Class for homology computation
+ BOOST_CHECK_THROW(Mini_st_persistence pcoh2(st), std::out_of_range);
+
+}
diff --git a/src/Persistent_cohomology/test/persistent_cohomology_unit_test_multi_field.cpp b/src/Persistent_cohomology/test/persistent_cohomology_unit_test_multi_field.cpp
index 8802005c..703682e1 100644
--- a/src/Persistent_cohomology/test/persistent_cohomology_unit_test_multi_field.cpp
+++ b/src/Persistent_cohomology/test/persistent_cohomology_unit_test_multi_field.cpp
@@ -1,15 +1,14 @@
-#define BOOST_TEST_MODULE persistent_cohomology_multi_field test
-#include <boost/test/included/unit_test.hpp>
-#include <boost/system/error_code.hpp>
-#include <boost/chrono/thread_clock.hpp>
#include <iostream>
#include <string>
-
+#include <algorithm>
#include <utility> // std::pair, std::make_pair
-
#include <cmath> // float comparison
#include <limits>
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_MODULE "persistent_cohomology_multi_field"
+#include <boost/test/unit_test.hpp>
+
#include "gudhi/graph_simplicial_complex.h"
#include "gudhi/reader_utils.h"
#include "gudhi/Simplex_tree.h"
@@ -37,9 +36,9 @@ std::string test_rips_persistence(int min_coefficient, int max_coefficient, int
<< " - filtration= " << st.filtration() << std::endl;
// Check
- BOOST_CHECK(st.num_simplices() == 6142604);
+ BOOST_CHECK(st.num_simplices() == 58);
BOOST_CHECK(st.dimension() == 3);
- BOOST_CHECK(st.filtration() == 0.249999);
+ BOOST_CHECK(st.filtration() == 0.4);
// Sort the simplices in the order of the filtration
st.initialize_filtration();
@@ -47,9 +46,9 @@ std::string test_rips_persistence(int min_coefficient, int max_coefficient, int
// Compute the persistence diagram of the complex
Persistent_cohomology<Simplex_tree<>, Multi_field> pcoh(st);
- pcoh.init_coefficients(min_coefficient, max_coefficient); // initializes the coefficient field for homology
+ pcoh.init_coefficients(min_coefficient, max_coefficient); // initializes the coefficient field for homology
// Check infinite rips
- pcoh.compute_persistent_cohomology(min_persistence); // Minimal lifetime of homology feature to be recorded.
+ pcoh.compute_persistent_cohomology(min_persistence); // Minimal lifetime of homology feature to be recorded.
std::ostringstream ossRips;
pcoh.output_diagram(ossRips);
@@ -59,68 +58,54 @@ std::string test_rips_persistence(int min_coefficient, int max_coefficient, int
}
void test_rips_persistence_in_dimension(int min_dimension, int max_dimension) {
- std::string value0(" 0 0 inf");
- std::string value1(" 1 0.0702103 inf");
- std::string value2("2 1 0.0702103 inf");
- std::string value3("2 2 0.159992 inf");
+ // there are 2 discontinued ensembles
+ std::string value0(" 0 0.25 inf");
+ std::string value1(" 1 0.4 inf");
+ // And a big hole - cut in 2 pieces after 0.3
+ std::string value2(" 0 0.2 0.3");
+
+ // For dim <= 1 =>
+ std::string value3(" 1 0.25 inf");
+ std::string value4(" 2 0.25 inf");
+ std::string value5(" 1 0.3 inf");
+ std::string value6(" 2 0.3 inf");
+ std::string value7(" 2 0.4 inf");
std::cout << "********************************************************************" << std::endl;
std::cout << "TEST OF RIPS_PERSISTENT_COHOMOLOGY_MULTI_FIELD MIN_DIM=" << min_dimension << " MAX_DIM=" << max_dimension << " MIN_PERS=0" << std::endl;
- std::string str_rips_persistence = test_rips_persistence(min_dimension, max_dimension, 1);
-
- BOOST_CHECK(str_rips_persistence.find(value0) != std::string::npos); // Check found
- BOOST_CHECK(str_rips_persistence.find(value1) != std::string::npos); // Check found
- BOOST_CHECK(str_rips_persistence.find(value2) != std::string::npos); // Check found
- BOOST_CHECK(str_rips_persistence.find(value3) != std::string::npos); // Check found
+ std::string str_rips_persistence = test_rips_persistence(min_dimension, max_dimension, static_cast<Filtration_value> (0.0));
std::cout << "str_rips_persistence=" << str_rips_persistence << std::endl;
- std::cout << "********************************************************************" << std::endl;
- std::cout << "TEST OF RIPS_PERSISTENT_COHOMOLOGY_MULTI_FIELD DIM=" << min_dimension << " MAX_DIM=" << max_dimension << " MIN_PERS=2" << std::endl;
-
- str_rips_persistence = test_rips_persistence(min_dimension, max_dimension, 2);
-
BOOST_CHECK(str_rips_persistence.find(value0) != std::string::npos); // Check found
BOOST_CHECK(str_rips_persistence.find(value1) != std::string::npos); // Check found
BOOST_CHECK(str_rips_persistence.find(value2) != std::string::npos); // Check found
- BOOST_CHECK(str_rips_persistence.find(value3) != std::string::npos); // Check found
- std::cout << "str_rips_persistence=" << str_rips_persistence << std::endl;
-
- std::cout << "********************************************************************" << std::endl;
- std::cout << "TEST OF RIPS_PERSISTENT_COHOMOLOGY_MULTI_FIELD DIM=" << min_dimension << " MAX_DIM=" << max_dimension << " MIN_PERS=3" << std::endl;
- str_rips_persistence = test_rips_persistence(min_dimension, max_dimension, 3);
+ if ((min_dimension < 2) && (max_dimension < 2)) {
+ BOOST_CHECK(str_rips_persistence.find(value3) != std::string::npos); // Check found
+ BOOST_CHECK(str_rips_persistence.find(value4) != std::string::npos); // Check found
+ BOOST_CHECK(str_rips_persistence.find(value5) != std::string::npos); // Check found
+ BOOST_CHECK(str_rips_persistence.find(value6) != std::string::npos); // Check found
+ BOOST_CHECK(str_rips_persistence.find(value7) != std::string::npos); // Check found
+ } else {
+ BOOST_CHECK(str_rips_persistence.find(value3) == std::string::npos); // Check not found
+ BOOST_CHECK(str_rips_persistence.find(value4) == std::string::npos); // Check not found
+ BOOST_CHECK(str_rips_persistence.find(value5) == std::string::npos); // Check not found
+ BOOST_CHECK(str_rips_persistence.find(value6) == std::string::npos); // Check not found
+ BOOST_CHECK(str_rips_persistence.find(value7) == std::string::npos); // Check not found
+ }
- BOOST_CHECK(str_rips_persistence.find(value0) != std::string::npos); // Check found
- BOOST_CHECK(str_rips_persistence.find(value1) != std::string::npos); // Check found
- BOOST_CHECK(str_rips_persistence.find(value2) != std::string::npos); // Check found
- BOOST_CHECK(str_rips_persistence.find(value3) != std::string::npos); // Check found
- std::cout << "str_rips_persistence=" << str_rips_persistence << std::endl;
-
- std::cout << "********************************************************************" << std::endl;
- std::cout << "TEST OF RIPS_PERSISTENT_COHOMOLOGY_MULTI_FIELD DIM=" << min_dimension << " MAX_DIM=" << max_dimension << " MIN_PERS=Inf" << std::endl;
-
- str_rips_persistence = test_rips_persistence(min_dimension, max_dimension, std::numeric_limits<int>::max());
-
- BOOST_CHECK(str_rips_persistence.find(value0) != std::string::npos); // Check found
- BOOST_CHECK(str_rips_persistence.find(value1) != std::string::npos); // Check found
- BOOST_CHECK(str_rips_persistence.find(value2) != std::string::npos); // Check found
- BOOST_CHECK(str_rips_persistence.find(value3) != std::string::npos); // Check found
- std::cout << "str_rips_persistence=" << str_rips_persistence << std::endl;
}
-BOOST_AUTO_TEST_CASE( rips_persistent_cohomology_multi_field_dim_1_2 )
-{
- test_rips_persistence_in_dimension(1, 2);
+BOOST_AUTO_TEST_CASE(rips_persistent_cohomology_multi_field_dim_1_2) {
+ test_rips_persistence_in_dimension(0, 1);
}
-BOOST_AUTO_TEST_CASE( rips_persistent_cohomology_multi_field_dim_2_3 )
-{
- test_rips_persistence_in_dimension(2, 3);
+BOOST_AUTO_TEST_CASE(rips_persistent_cohomology_multi_field_dim_2_3) {
+ test_rips_persistence_in_dimension(1, 3);
}
-BOOST_AUTO_TEST_CASE( rips_persistent_cohomology_multi_field_dim_1_5 )
-{
+BOOST_AUTO_TEST_CASE(rips_persistent_cohomology_multi_field_dim_1_5) {
test_rips_persistence_in_dimension(1, 5);
}
diff --git a/src/Persistent_cohomology/test/simplex_tree_file_for_multi_field_unit_test.txt b/src/Persistent_cohomology/test/simplex_tree_file_for_multi_field_unit_test.txt
new file mode 100644
index 00000000..ed2c0c3d
--- /dev/null
+++ b/src/Persistent_cohomology/test/simplex_tree_file_for_multi_field_unit_test.txt
@@ -0,0 +1,58 @@
+0 0 0.2
+0 3 0.2
+1 3 0 0.2
+0 6 0.2
+0 11 0.2
+1 11 6 0.2
+0 13 0.25
+0 14 0.25
+1 14 13 0.25
+0 15 0.25
+1 15 13 0.25
+1 15 14 0.25
+2 15 14 13 0.25
+0 1 0.3
+1 1 0 0.3
+0 2 0.3
+1 2 0 0.3
+1 2 1 0.3
+2 2 1 0 0.3
+0 4 0.3
+1 4 3 0.3
+0 5 0.3
+1 5 3 0.3
+1 5 4 0.3
+2 5 4 3 0.3
+0 9 0.3
+0 10 0.3
+1 10 2 0.3
+1 10 9 0.3
+1 11 9 0.3
+1 11 10 0.3
+2 11 10 9 0.3
+0 12 0.3
+1 12 2 0.3
+1 12 10 0.3
+2 12 10 2 0.3
+1 6 0 0.4
+1 6 1 0.4
+2 6 1 0 0.4
+0 7 0.4
+1 7 0 0.4
+1 7 1 0.4
+2 7 1 0 0.4
+1 7 6 0.4
+2 7 6 0 0.4
+2 7 6 1 0.4
+3 7 6 1 0 0.4
+0 8 0.4
+1 8 4 0.4
+1 8 5 0.4
+2 8 5 4 0.4
+1 9 4 0.4
+1 9 5 0.4
+2 9 5 4 0.4
+1 9 8 0.4
+2 9 8 4 0.4
+2 9 8 5 0.4
+3 9 8 5 4 0.4
diff --git a/src/Persistent_cohomology/test/simplex_tree_file_for_multi_field_unit_test.txt.REMOVED.git-id b/src/Persistent_cohomology/test/simplex_tree_file_for_multi_field_unit_test.txt.REMOVED.git-id
deleted file mode 100644
index 2dd38515..00000000
--- a/src/Persistent_cohomology/test/simplex_tree_file_for_multi_field_unit_test.txt.REMOVED.git-id
+++ /dev/null
@@ -1 +0,0 @@
-ce87199d425b05f51c74cbf635870bfa5abbc7a1 \ No newline at end of file
diff --git a/src/Simplex_tree/concept/IndexingTag.h b/src/Simplex_tree/concept/IndexingTag.h
index d690da11..1dcdd756 100644
--- a/src/Simplex_tree/concept/IndexingTag.h
+++ b/src/Simplex_tree/concept/IndexingTag.h
@@ -25,6 +25,6 @@
* continuous maps to a cell complex, and compute its persistent
* homology.
*
- * Must be linear_indexing_tag.
+ * Must be `Gudhi::linear_indexing_tag`.
*/
struct IndexingTag {};
diff --git a/src/Simplex_tree/concept/SimplexKey.h b/src/Simplex_tree/concept/SimplexKey.h
index ce5b2382..9fbed401 100644
--- a/src/Simplex_tree/concept/SimplexKey.h
+++ b/src/Simplex_tree/concept/SimplexKey.h
@@ -22,7 +22,7 @@
/** \brief Key type used as simplex identifier.
*
- * Must be <CODE>int</CODE>
+ * Must be an integer type.
*/
struct SimplexKey {};
- \ No newline at end of file
+
diff --git a/src/Simplex_tree/concept/SimplexTreeOptions.h b/src/Simplex_tree/concept/SimplexTreeOptions.h
new file mode 100644
index 00000000..89acdc18
--- /dev/null
+++ b/src/Simplex_tree/concept/SimplexTreeOptions.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): Marc Glisse
+ *
+ * Copyright (C) 2015 INRIA Saclay - Ile-de-France (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/>.
+ */
+
+/** \brief Concept of the template parameter for the class `Gudhi::Simplex_tree<SimplexTreeOptions>`.
+ *
+ * One model for this is `Gudhi::Simplex_tree_options_full_featured`. If you want to provide your own, it is recommended that you derive from it and override some parts instead of writing a class from scratch.
+ */
+struct SimplexTreeOptions {
+ /// Forced for now.
+ typedef IndexingTag Indexing_tag;
+ /// Must be a signed integer type. It admits a total order <.
+ typedef VertexHandle Vertex_handle;
+ /// Must be comparable with operator<.
+ typedef FiltrationValue Filtration_value;
+ /// Must be an integer type.
+ typedef SimplexKey Simplex_key;
+ /// If true, each simplex has extra storage for one `Simplex_key`. Necessary for `Persistent_cohomology`.
+ static const bool store_key;
+ /// If true, each simplex has extra storage for one `Filtration_value`, and this value is propagated by operations like `Gudhi::Simplex_tree::expansion`. Without it, `Persistent_cohomology` degenerates to computing usual (non-persistent) cohomology.
+ static const bool store_filtration;
+ /// If true, the list of vertices present in the complex must always be 0, ..., num_vertices-1, without any hole.
+ static constexpr bool contiguous_vertices;
+};
+
diff --git a/src/Simplex_tree/concept/VertexHandle.h b/src/Simplex_tree/concept/VertexHandle.h
index 491f0f56..3efbba61 100644
--- a/src/Simplex_tree/concept/VertexHandle.h
+++ b/src/Simplex_tree/concept/VertexHandle.h
@@ -22,5 +22,6 @@
/** \brief Handle type for the vertices of a cell complex.
*
- * Must be int.*/
+ * Must be a signed integer type. <code>operator&lt;</code> defines a total order on it.
+ */
struct VertexHandle {};
diff --git a/src/Simplex_tree/doc/Intro_simplex_tree.h b/src/Simplex_tree/doc/Intro_simplex_tree.h
new file mode 100644
index 00000000..ddf9ad22
--- /dev/null
+++ b/src/Simplex_tree/doc/Intro_simplex_tree.h
@@ -0,0 +1,84 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): 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/>.
+ */
+
+#ifndef DOC_SIMPLEX_TREE_INTRO_SIMPLEX_TREE_H_
+#define DOC_SIMPLEX_TREE_INTRO_SIMPLEX_TREE_H_
+
+// needs namespace for Doxygen to link on classes
+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
+ * implices \f$\{\sigma\}\f$, \f$\sigma \subseteq V\f$ such that
+ * \f$\tau \subseteq \sigma \in \mathbf{K} \rightarrow \tau \in \mathbf{K}\f$. The dimension \f$n=|\sigma|-1\f$ of
+ * \f$\sigma\f$ is its number of elements minus \f$1\f$.
+ *
+ * A filtration of a simplicial complex is a function \f$f:\mathbf{K} \rightarrow \mathbb{R}\f$ satisfying
+ * \f$f(\tau)\leq f(\sigma)\f$ whenever \f$\tau \subseteq \sigma\f$. 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.
+ *
+ * \section filteredcomplexesimplementation Implementations
+ * \subsection filteredcomplexessimplextree Simplex tree
+ * 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
+ * \image html "Simplex_tree_representation.png" "Simplex tree representation"
+ *
+ * \subsubsection filteredcomplexessimplextreeexamples Examples
+ *
+ * Here is a list of simplex tree examples :
+ * \li <a href="_simplex_tree_2simple_simplex_tree_8cpp-example.html">
+ * Simplex_tree/simple_simplex_tree.cpp</a> - Simple simplex tree construction and basic function use.
+ *
+ * \li <a href="_simplex_tree_2simplex_tree_from_cliques_of_graph_8cpp-example.html">
+ * Simplex_tree/simplex_tree_from_cliques_of_graph.cpp</a> - Simplex tree construction from cliques of graph read in
+ * a file.
+ *
+ * Simplex tree construction with \f$\mathbb{Z}/3\mathbb{Z}\f$ coefficients on weighted graph Klein bottle file:
+ * \code $> ./simplex_tree_from_cliques_of_graph ../../data/points/Klein_bottle_complex.txt 3 \endcode
+ * \code Insert the 1-skeleton in the simplex tree in 0.000404 s.
+max_dim = 3
+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
+ * complex (Requires CGAL, GMP and GMPXX to be installed)
+ *
+ *
+ * \subsection filteredcomplexeshassecomplex Hasse complex
+ * The second one is the Hasse_complex. The Hasse complex is a data structure representing explicitly all co-dimension
+ * 1 incidence relations in a complex. It is consequently faster when accessing the boundary of a simplex, but is less
+ * compact and harder to construct from scratch.
+ *
+ * \copyright GNU General Public License v3.
+ * @{
+ */
+
+} // namespace Gudhi
+
+#endif // DOC_SIMPLEX_TREE_INTRO_SIMPLEX_TREE_H_
diff --git a/src/Simplex_tree/doc/Simplex_tree_representation.png b/src/Simplex_tree/doc/Simplex_tree_representation.png
new file mode 100644
index 00000000..9d401520
--- /dev/null
+++ b/src/Simplex_tree/doc/Simplex_tree_representation.png
Binary files differ
diff --git a/src/Simplex_tree/example/CMakeLists.txt b/src/Simplex_tree/example/CMakeLists.txt
index 1a3cdfbf..9314a805 100644
--- a/src/Simplex_tree/example/CMakeLists.txt
+++ b/src/Simplex_tree/example/CMakeLists.txt
@@ -1,21 +1,29 @@
cmake_minimum_required(VERSION 2.6)
-project(GUDHISimplexTreeFromFile)
+project(Simplex_tree_examples)
-add_executable ( simplex_tree_from_file simplex_tree_from_file.cpp )
-add_test(simplex_tree_from_file_2 ${CMAKE_CURRENT_BINARY_DIR}/simplex_tree_from_file ${CMAKE_SOURCE_DIR}/data/points/Klein_bottle_complex.txt 2)
-add_test(simplex_tree_from_file_3 ${CMAKE_CURRENT_BINARY_DIR}/simplex_tree_from_file ${CMAKE_SOURCE_DIR}/data/points/Klein_bottle_complex.txt 3)
+add_executable ( simplex_tree_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})
+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_executable ( simple_simplex_tree simple_simplex_tree.cpp )
+if (TBB_FOUND)
+ target_link_libraries(simple_simplex_tree ${TBB_LIBRARIES})
+endif()
add_test(simple_simplex_tree ${CMAKE_CURRENT_BINARY_DIR}/simple_simplex_tree)
-
+
+add_executable ( mini_simplex_tree mini_simplex_tree.cpp )
+add_test(mini_simplex_tree ${CMAKE_CURRENT_BINARY_DIR}/mini_simplex_tree)
+
# An example with Simplex-tree using CGAL alpha_shapes_3
if(GMP_FOUND AND CGAL_FOUND)
- message("CGAL_lib = ${CGAL_LIBRARIES_DIR}")
- message("GMP_LIBRARIES = ${GMP_LIBRARIES}")
- INCLUDE_DIRECTORIES(${GMP_INCLUDE_DIR})
- INCLUDE_DIRECTORIES(${CGAL_INCLUDE_DIRS})
- 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})
- 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)
-endif()
+ 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})
+ if (TBB_FOUND)
+ target_link_libraries(simplex_tree_from_alpha_shapes_3 ${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)
+endif()
diff --git a/src/Simplex_tree/example/README b/src/Simplex_tree/example/README
index 03c759cb..e37af790 100644
--- a/src/Simplex_tree/example/README
+++ b/src/Simplex_tree/example/README
@@ -52,7 +52,7 @@ EXAMPLE OF SIMPLE INSERTION
*** Simplex tree construction with Z/2Z coefficients on weighted graph Klein bottle file:
-./simplex_tree_from_file ../../../data/points/Klein_bottle_complex.txt 2
+./simplex_tree_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_file ../../../data/points/Klein_bottle_complex.txt 3
+./simplex_tree_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.
diff --git a/src/Simplex_tree/example/mini_simplex_tree.cpp b/src/Simplex_tree/example/mini_simplex_tree.cpp
new file mode 100644
index 00000000..7e48aaaf
--- /dev/null
+++ b/src/Simplex_tree/example/mini_simplex_tree.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): Marc Glisse
+ *
+ * Copyright (C) 2015 INRIA Saclay - Ile-de-France (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 <iostream>
+#include <initializer_list>
+
+using namespace Gudhi;
+
+struct MyOptions : 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;
+
+// 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),
+ "Not storing the filtration and key should save some space");
+
+int main() {
+ ST st;
+
+ /* Complex to build. */
+ /* 1 */
+ /* o */
+ /* /X\ */
+ /* o---o---o */
+ /* 2 0 3 */
+
+ auto triangle012 = {0, 1, 2};
+ auto edge03 = {0, 3};
+ st.insert_simplex_and_subfaces(triangle012);
+ st.insert_simplex_and_subfaces(edge03);
+ // FIXME: Remove this line
+ st.set_dimension(2);
+
+ auto edge02 = {0, 2};
+ ST::Simplex_handle e = st.find(edge02);
+ // We are not using filtrations so everything has value 0
+ assert(st.filtration(e) == 0);
+ for (ST::Simplex_handle t : st.cofaces_simplex_range(e, 1)) {
+ // Only coface is 012
+ for (ST::Vertex_handle v : st.simplex_vertex_range(t)) // v in { 0, 1, 2 }
+ std::cout << v;
+ std::cout << '\n';
+ }
+}
diff --git a/src/Simplex_tree/example/simple_simplex_tree.cpp b/src/Simplex_tree/example/simple_simplex_tree.cpp
index bde224f1..5146b906 100644
--- a/src/Simplex_tree/example/simple_simplex_tree.cpp
+++ b/src/Simplex_tree/example/simple_simplex_tree.cpp
@@ -20,15 +20,16 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <gudhi/graph_simplicial_complex.h>
+#include <gudhi/Simplex_tree.h>
+
#include <iostream>
-#include <ctime>
-#include "gudhi/graph_simplicial_complex.h"
-#include "gudhi/Simplex_tree.h"
+#include <utility> // for pair
+#include <vector>
using namespace Gudhi;
typedef std::vector< Vertex_handle > typeVectorVertex;
-typedef std::pair<typeVectorVertex, Filtration_value> typeSimplex;
typedef std::pair< Simplex_tree<>::Simplex_handle, bool > typePairSimplexBool;
int main(int argc, char * const argv[]) {
@@ -36,15 +37,11 @@ int main(int argc, char * const argv[]) {
const Filtration_value SECOND_FILTRATION_VALUE = 0.2;
const Filtration_value THIRD_FILTRATION_VALUE = 0.3;
const Filtration_value FOURTH_FILTRATION_VALUE = 0.4;
- Vertex_handle FIRST_VERTEX_HANDLE = (Vertex_handle) 0;
- Vertex_handle SECOND_VERTEX_HANDLE = (Vertex_handle) 1;
- Vertex_handle THIRD_VERTEX_HANDLE = (Vertex_handle) 2;
- Vertex_handle FOURTH_VERTEX_HANDLE = (Vertex_handle) 3;
// TEST OF INSERTION
std::cout << "********************************************************************" << std::endl;
std::cout << "EXAMPLE OF SIMPLE INSERTION" << std::endl;
- //Construct the Simplex Tree
+ // Construct the Simplex Tree
Simplex_tree<> simplexTree;
/* Simplex to be inserted: */
@@ -56,201 +53,149 @@ int main(int argc, char * const argv[]) {
// ++ FIRST
std::cout << " * INSERT 0" << std::endl;
- typeVectorVertex firstSimplexVector;
- firstSimplexVector.push_back(FIRST_VERTEX_HANDLE);
- typeSimplex firstSimplex = std::make_pair(firstSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
+ typeVectorVertex firstSimplexVector = { 0 };
typePairSimplexBool returnValue =
- simplexTree.insert_simplex(firstSimplex.first, firstSimplex.second);
+ simplexTree.insert_simplex(firstSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + 0 INSERTED" << std::endl;
- int nb_simplices = simplexTree.num_simplices() + 1;
- simplexTree.set_num_simplices(nb_simplices);
} else {
std::cout << " - 0 NOT INSERTED" << std::endl;
}
// ++ SECOND
std::cout << " * INSERT 1" << std::endl;
- typeVectorVertex secondSimplexVector;
- secondSimplexVector.push_back(SECOND_VERTEX_HANDLE);
- typeSimplex secondSimplex = std::make_pair(secondSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
+ typeVectorVertex secondSimplexVector = { 1 };
returnValue =
- simplexTree.insert_simplex(secondSimplex.first, secondSimplex.second);
+ simplexTree.insert_simplex(secondSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + 1 INSERTED" << std::endl;
- int nb_simplices = simplexTree.num_simplices() + 1;
- simplexTree.set_num_simplices(nb_simplices);
} else {
std::cout << " - 1 NOT INSERTED" << std::endl;
}
// ++ THIRD
std::cout << " * INSERT (0,1)" << std::endl;
- typeVectorVertex thirdSimplexVector;
- thirdSimplexVector.push_back(FIRST_VERTEX_HANDLE);
- thirdSimplexVector.push_back(SECOND_VERTEX_HANDLE);
- typeSimplex thirdSimplex = std::make_pair(thirdSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
+ typeVectorVertex thirdSimplexVector = { 0, 1 };
returnValue =
- simplexTree.insert_simplex(thirdSimplex.first, thirdSimplex.second);
+ simplexTree.insert_simplex(thirdSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + (0,1) INSERTED" << std::endl;
- int nb_simplices = simplexTree.num_simplices() + 1;
- simplexTree.set_num_simplices(nb_simplices);
} else {
std::cout << " - (0,1) NOT INSERTED" << std::endl;
}
// ++ FOURTH
std::cout << " * INSERT 2" << std::endl;
- typeVectorVertex fourthSimplexVector;
- fourthSimplexVector.push_back(THIRD_VERTEX_HANDLE);
- typeSimplex fourthSimplex = std::make_pair(fourthSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
+ typeVectorVertex fourthSimplexVector = { 2 };
returnValue =
- simplexTree.insert_simplex(fourthSimplex.first, fourthSimplex.second);
+ simplexTree.insert_simplex(fourthSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + 2 INSERTED" << std::endl;
- int nb_simplices = simplexTree.num_simplices() + 1;
- simplexTree.set_num_simplices(nb_simplices);
} else {
std::cout << " - 2 NOT INSERTED" << std::endl;
}
// ++ FIFTH
std::cout << " * INSERT (2,0)" << std::endl;
- typeVectorVertex fifthSimplexVector;
- fifthSimplexVector.push_back(THIRD_VERTEX_HANDLE);
- fifthSimplexVector.push_back(FIRST_VERTEX_HANDLE);
- typeSimplex fifthSimplex = std::make_pair(fifthSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
+ typeVectorVertex fifthSimplexVector = { 2, 0 };
returnValue =
- simplexTree.insert_simplex(fifthSimplex.first, fifthSimplex.second);
+ simplexTree.insert_simplex(fifthSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + (2,0) INSERTED" << std::endl;
- int nb_simplices = simplexTree.num_simplices() + 1;
- simplexTree.set_num_simplices(nb_simplices);
} else {
std::cout << " - (2,0) NOT INSERTED" << std::endl;
}
// ++ SIXTH
std::cout << " * INSERT (2,1)" << std::endl;
- typeVectorVertex sixthSimplexVector;
- sixthSimplexVector.push_back(THIRD_VERTEX_HANDLE);
- sixthSimplexVector.push_back(SECOND_VERTEX_HANDLE);
- typeSimplex sixthSimplex = std::make_pair(sixthSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
+ typeVectorVertex sixthSimplexVector = { 2, 1 };
returnValue =
- simplexTree.insert_simplex(sixthSimplex.first, sixthSimplex.second);
+ simplexTree.insert_simplex(sixthSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + (2,1) INSERTED" << std::endl;
- int nb_simplices = simplexTree.num_simplices() + 1;
- simplexTree.set_num_simplices(nb_simplices);
} else {
std::cout << " - (2,1) NOT INSERTED" << std::endl;
}
// ++ SEVENTH
std::cout << " * INSERT (2,1,0)" << std::endl;
- typeVectorVertex seventhSimplexVector;
- seventhSimplexVector.push_back(THIRD_VERTEX_HANDLE);
- seventhSimplexVector.push_back(SECOND_VERTEX_HANDLE);
- seventhSimplexVector.push_back(FIRST_VERTEX_HANDLE);
- typeSimplex seventhSimplex = std::make_pair(seventhSimplexVector, Filtration_value(THIRD_FILTRATION_VALUE));
+ typeVectorVertex seventhSimplexVector = { 2, 1, 0 };
returnValue =
- simplexTree.insert_simplex(seventhSimplex.first, seventhSimplex.second);
+ simplexTree.insert_simplex(seventhSimplexVector, Filtration_value(THIRD_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + (2,1,0) INSERTED" << std::endl;
- int nb_simplices = simplexTree.num_simplices() + 1;
- simplexTree.set_num_simplices(nb_simplices);
} else {
std::cout << " - (2,1,0) NOT INSERTED" << std::endl;
}
// ++ EIGHTH
std::cout << " * INSERT 3" << std::endl;
- typeVectorVertex eighthSimplexVector;
- eighthSimplexVector.push_back(FOURTH_VERTEX_HANDLE);
- typeSimplex eighthSimplex = std::make_pair(eighthSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
+ typeVectorVertex eighthSimplexVector = { 3 };
returnValue =
- simplexTree.insert_simplex(eighthSimplex.first, eighthSimplex.second);
+ simplexTree.insert_simplex(eighthSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + 3 INSERTED" << std::endl;
- int nb_simplices = simplexTree.num_simplices() + 1;
- simplexTree.set_num_simplices(nb_simplices);
} else {
std::cout << " - 3 NOT INSERTED" << std::endl;
}
// ++ NINETH
std::cout << " * INSERT (3,0)" << std::endl;
- typeVectorVertex ninethSimplexVector;
- ninethSimplexVector.push_back(FOURTH_VERTEX_HANDLE);
- ninethSimplexVector.push_back(FIRST_VERTEX_HANDLE);
- typeSimplex ninethSimplex = std::make_pair(ninethSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
+ typeVectorVertex ninethSimplexVector = { 3, 0 };
returnValue =
- simplexTree.insert_simplex(ninethSimplex.first, ninethSimplex.second);
+ simplexTree.insert_simplex(ninethSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + (3,0) INSERTED" << std::endl;
- int nb_simplices = simplexTree.num_simplices() + 1;
- simplexTree.set_num_simplices(nb_simplices);
} else {
std::cout << " - (3,0) NOT INSERTED" << std::endl;
}
// ++ TENTH
std::cout << " * INSERT 0 (already inserted)" << std::endl;
- typeVectorVertex tenthSimplexVector;
- tenthSimplexVector.push_back(FIRST_VERTEX_HANDLE);
- typeSimplex tenthSimplex = std::make_pair(tenthSimplexVector, Filtration_value(FOURTH_FILTRATION_VALUE)); // With a different filtration value
- returnValue =
- simplexTree.insert_simplex(tenthSimplex.first, tenthSimplex.second);
+ typeVectorVertex tenthSimplexVector = { 0 };
+ // With a different filtration value
+ returnValue = simplexTree.insert_simplex(tenthSimplexVector, Filtration_value(FOURTH_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + 0 INSERTED" << std::endl;
- int nb_simplices = simplexTree.num_simplices() + 1;
- simplexTree.set_num_simplices(nb_simplices);
} else {
std::cout << " - 0 NOT INSERTED" << std::endl;
}
// ++ ELEVENTH
std::cout << " * INSERT (2,1,0) (already inserted)" << std::endl;
- typeVectorVertex eleventhSimplexVector;
- eleventhSimplexVector.push_back(THIRD_VERTEX_HANDLE);
- eleventhSimplexVector.push_back(SECOND_VERTEX_HANDLE);
- eleventhSimplexVector.push_back(FIRST_VERTEX_HANDLE);
- typeSimplex eleventhSimplex = std::make_pair(eleventhSimplexVector, Filtration_value(FOURTH_FILTRATION_VALUE));
+ typeVectorVertex eleventhSimplexVector = { 2, 1, 0 };
returnValue =
- simplexTree.insert_simplex(eleventhSimplex.first, eleventhSimplex.second);
+ simplexTree.insert_simplex(eleventhSimplexVector, Filtration_value(FOURTH_FILTRATION_VALUE));
if (returnValue.second == true) {
std::cout << " + (2,1,0) INSERTED" << std::endl;
- int nb_simplices = simplexTree.num_simplices() + 1;
- simplexTree.set_num_simplices(nb_simplices);
} else {
std::cout << " - (2,1,0) NOT INSERTED" << std::endl;
}
// ++ GENERAL VARIABLE SET
- simplexTree.set_filtration(FOURTH_FILTRATION_VALUE); // Max filtration value
- simplexTree.set_dimension(2); // Max dimension = 2 -> (2,1,0)
+ simplexTree.set_filtration(FOURTH_FILTRATION_VALUE); // Max filtration value
+ simplexTree.set_dimension(2); // Max dimension = 2 -> (2,1,0)
- std::cout << "********************************************************************" << std::endl;
+ std::cout << "********************************************************************\n";
// Display the Simplex_tree - Can not be done in the middle of 2 inserts
- std::cout << "* The complex contains " << simplexTree.num_simplices() << " simplices" << std::endl;
- std::cout << " - dimension " << simplexTree.dimension() << " - filtration " << simplexTree.filtration() << std::endl;
- std::cout << "* Iterator on Simplices in the filtration, with [filtration value]:" << std::endl;
+ std::cout << "* The complex contains " << simplexTree.num_simplices() << " simplices\n";
+ std::cout << " - dimension " << simplexTree.dimension() << " - filtration " << simplexTree.filtration() << "\n";
+ std::cout << "* Iterator on Simplices in the filtration, with [filtration value]:\n";
for (auto f_simplex : simplexTree.filtration_simplex_range()) {
std::cout << " " << "[" << simplexTree.filtration(f_simplex) << "] ";
for (auto vertex : simplexTree.simplex_vertex_range(f_simplex)) {
- std::cout << (int) vertex << " ";
+ std::cout << static_cast<int>(vertex) << " ";
}
std::cout << std::endl;
}
@@ -274,9 +219,7 @@ int main(int argc, char * const argv[]) {
else
std::cout << "***- NO IT ISN'T\n";
- Vertex_handle UNKNOWN_VERTEX_HANDLE = (Vertex_handle) 15;
- typeVectorVertex unknownSimplexVector;
- unknownSimplexVector.push_back(UNKNOWN_VERTEX_HANDLE);
+ typeVectorVertex unknownSimplexVector = { 15 };
simplexFound = simplexTree.find(unknownSimplexVector);
std::cout << "**************IS THE SIMPLEX {15} IN THE SIMPLEX TREE ?\n";
if (simplexFound != simplexTree.null_simplex())
@@ -291,9 +234,7 @@ int main(int argc, char * const argv[]) {
else
std::cout << "***- NO IT ISN'T\n";
- typeVectorVertex otherSimplexVector;
- otherSimplexVector.push_back(UNKNOWN_VERTEX_HANDLE);
- otherSimplexVector.push_back(SECOND_VERTEX_HANDLE);
+ typeVectorVertex otherSimplexVector = { 1, 15 };
simplexFound = simplexTree.find(otherSimplexVector);
std::cout << "**************IS THE SIMPLEX {15,1} IN THE SIMPLEX TREE ?\n";
if (simplexFound != simplexTree.null_simplex())
@@ -301,10 +242,7 @@ int main(int argc, char * const argv[]) {
else
std::cout << "***- NO IT ISN'T\n";
- typeVectorVertex invSimplexVector;
- invSimplexVector.push_back(SECOND_VERTEX_HANDLE);
- invSimplexVector.push_back(THIRD_VERTEX_HANDLE);
- invSimplexVector.push_back(FIRST_VERTEX_HANDLE);
+ typeVectorVertex invSimplexVector = { 1, 2, 0 };
simplexFound = simplexTree.find(invSimplexVector);
std::cout << "**************IS THE SIMPLEX {1,2,0} IN THE SIMPLEX TREE ?\n";
if (simplexFound != simplexTree.null_simplex())
diff --git a/src/Simplex_tree/example/simplex_tree_from_alpha_shapes_3.cpp b/src/Simplex_tree/example/simplex_tree_from_alpha_shapes_3.cpp
index 5f797e93..49d358ab 100644
--- a/src/Simplex_tree/example/simplex_tree_from_alpha_shapes_3.cpp
+++ b/src/Simplex_tree/example/simplex_tree_from_alpha_shapes_3.cpp
@@ -1,24 +1,28 @@
- /* 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/>.
- */
+/* 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 <gudhi/graph_simplicial_complex.h>
+#include <gudhi/Simplex_tree.h>
+#include <boost/variant.hpp>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Delaunay_triangulation_3.h>
@@ -27,259 +31,246 @@
#include <fstream>
#include <cmath>
-
-#include "gudhi/graph_simplicial_complex.h"
-#include "gudhi/Simplex_tree.h"
-#include <boost/variant.hpp>
+#include <string>
+#include <tuple> // for tuple<>
+#include <map>
+#include <utility> // for pair<>
+#include <list>
+#include <vector>
// 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;
+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;
// From file type definition
-typedef Kernel::Point_3 Point;
+typedef Kernel::Point_3 Point;
// filtration with alpha values needed type definition
typedef Alpha_shape_3::FT Alpha_value_type;
-typedef CGAL::Object Object;
+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;
+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;
typedef std::list<Alpha_shape_3::Vertex_handle> Vertex_list;
// gudhi type definition
-typedef Gudhi::Simplex_tree<>::Vertex_handle Simplex_tree_vertex;
+typedef Gudhi::Simplex_tree<> Simplex_tree;
+typedef Simplex_tree::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;
-//#define DEBUG_TRACES
-
-Vertex_list from (const Cell_handle& ch)
-{
- Vertex_list the_list;
- for (auto i = 0; i < 4; i++)
- {
+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;
+ 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)
- {
+
+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;
+ 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& edg)
-{
- Vertex_list the_list;
- for (auto i = 0; i < 4; i++)
- {
- if ((edg.second == i) ||(edg.third == i))
- {
+
+Vertex_list from(const Edge& 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;
+ 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;
+
+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;
+ std::cout << "from vertex=" << vh->point() << std::endl;
+#endif // DEBUG_TRACES
+ the_list.push_back(vh);
+ return the_list;
}
+int main(int argc, char * const argv[]) {
+ // program args management
+ if (argc != 2) {
+ std::cerr << "Usage: " << argv[0]
+ << " path_to_file_graph \n";
+ return 0;
+ }
-int main (int argc, char * const argv[])
-{
- // program args management
- if (argc != 2) {
- std::cerr << "Usage: " << argv[0]
- << " path_to_file_graph \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;
+ // 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::cout << "Reading " << n << " points " << std::endl;
+#endif // DEBUG_TRACES
+ Point p;
+ for (; n > 0; n--) {
+ is >> p;
+ lp.push_back(p);
+ }
- // 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);
+ // 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
+ 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;
+ // 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));
+ 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);
+ 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
+ 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;
+ 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;
- Gudhi::Simplex_tree<> simplex_tree;
- Alpha_shape_simplex_tree_map map_cgal_simplex_tree;
- std::vector<Alpha_value_type>::iterator the_alpha_value_iterator = the_alpha_values.begin();
- for(auto object_iterator: the_objects)
- {
- // Retrieve Alpha shape vertex list from object
- if (const Cell_handle* cell = CGAL::object_cast<Cell_handle>(&object_iterator))
- {
- vertex_list = from(*cell);
- count_cells++;
- }
- else if (const Facet* facet = CGAL::object_cast<Facet>(&object_iterator))
- {
- vertex_list = from(*facet);
- count_facets++;
- }
- else if (const Edge* edge = CGAL::object_cast<Edge>(&object_iterator))
- {
- vertex_list = from(*edge);
- count_edges++;
- }
- 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);
- }
- // 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();
+ // Loop on objects vector
+ Vertex_list vertex_list;
+ Simplex_tree simplex_tree;
+ Alpha_shape_simplex_tree_map map_cgal_simplex_tree;
+ std::vector<Alpha_value_type>::iterator the_alpha_value_iterator = the_alpha_values.begin();
+ for (auto object_iterator : the_objects) {
+ // Retrieve Alpha shape vertex list from object
+ if (const Cell_handle * cell = CGAL::object_cast<Cell_handle>(&object_iterator)) {
+ vertex_list = from(*cell);
+ count_cells++;
+ } else if (const Facet * facet = CGAL::object_cast<Facet>(&object_iterator)) {
+ vertex_list = from(*facet);
+ count_facets++;
+ } else if (const Edge * edge = CGAL::object_cast<Edge>(&object_iterator)) {
+ vertex_list = from(*edge);
+ count_edges++;
+ } 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);
+ }
+ // 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_simplex " << 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;
+ std::cout << "vertex [" << the_alpha_shape_vertex->point() << "] not found - insert_simplex " << vertex << "\n";
+#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
+ 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
#ifdef DEBUG_TRACES
- std::cout << "filtration = " << *the_alpha_value_iterator << std::endl;
-#endif // DEBUG_TRACES
- simplex_tree.insert_simplex(the_simplex_tree, std::sqrt(*the_alpha_value_iterator));
- if (the_alpha_value_iterator != the_alpha_values.end())
- ++the_alpha_value_iterator;
- else
- std::cout << "This shall not happen" << std::endl;
- }
+ std::cout << "filtration = " << *the_alpha_value_iterator << std::endl;
+#endif // DEBUG_TRACES
+ simplex_tree.insert_simplex(the_simplex_tree, std::sqrt(*the_alpha_value_iterator));
+ if (the_alpha_value_iterator != the_alpha_values.end())
+ ++the_alpha_value_iterator;
+ else
+ std::cerr << "This shall not happen" << std::endl;
+ }
#ifdef DEBUG_TRACES
- std::cout << "vertices \t\t" << count_vertices << std::endl;
- std::cout << "edges \t\t" << count_edges << std::endl;
- std::cout << "facets \t\t" << count_facets << std::endl;
- std::cout << "cells \t\t" << count_cells << std::endl;
+ std::cout << "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;
-#endif // DEBUG_TRACES
+ std::cout << "Information of the Simplex Tree:\n";
+ std::cout << " Number of vertices = " << simplex_tree.num_vertices() << " ";
+ std::cout << " Number of simplices = " << simplex_tree.num_simplices() << 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
+ std::cout << "Iterator on vertices: \n";
+ for (auto vertex : simplex_tree.complex_vertex_range()) {
+ std::cout << vertex << " ";
+ }
+#endif // DEBUG_TRACES
- std::cout << simplex_tree << std::endl;
+ std::cout << simplex_tree << std::endl;
#ifdef DEBUG_TRACES
- std::cout << std::endl << std::endl << "Iterator on simplices: " << std::endl;
- for( auto simplex : simplex_tree.complex_simplex_range() )
- {
- std::cout << " ";
- for( auto vertex : simplex_tree.simplex_vertex_range(simplex) ) { std::cout << vertex << " "; }
- std::cout << std::endl;
- }
-#endif // DEBUG_TRACES
+ std::cout << std::endl << std::endl << "Iterator on simplices:\n";
+ for (auto simplex : simplex_tree.complex_simplex_range()) {
+ std::cout << " ";
+ for (auto vertex : simplex_tree.simplex_vertex_range(simplex)) {
+ std::cout << vertex << " ";
+ }
+ std::cout << std::endl;
+ }
+#endif // DEBUG_TRACES
#ifdef DEBUG_TRACES
- std::cout << std::endl << std::endl << "Iterator on Simplices in the filtration, with [filtration value]:" << std::endl;
- for( auto f_simplex : simplex_tree.filtration_simplex_range() )
- { std::cout << " " << "[" << simplex_tree.filtration(f_simplex) << "] ";
- for( auto vertex : simplex_tree.simplex_vertex_range(f_simplex) )
- { std::cout << vertex << " "; }
- std::cout << std::endl;
- }
-#endif // DEBUG_TRACES
+ std::cout << std::endl << std::endl << "Iterator on Simplices in the filtration, with [filtration value]:\n";
+ for (auto f_simplex : simplex_tree.filtration_simplex_range()) {
+ std::cout << " " << "[" << simplex_tree.filtration(f_simplex) << "] ";
+ for (auto vertex : simplex_tree.simplex_vertex_range(f_simplex)) {
+ std::cout << vertex << " ";
+ }
+ std::cout << std::endl;
+ }
+#endif // DEBUG_TRACES
#ifdef DEBUG_TRACES
- std::cout << std::endl << std::endl << "Iterator on Simplices in the filtration, and their boundary simplices:" << std::endl;
- for( auto f_simplex : simplex_tree.filtration_simplex_range() )
- {
- std::cout << " " << "[" << simplex_tree.filtration(f_simplex) << "] ";
- for( auto vertex : simplex_tree.simplex_vertex_range(f_simplex) )
- { std::cout << vertex << " "; }
- std::cout << std::endl;
+ std::cout << std::endl << std::endl << "Iterator on Simplices in the filtration, and their boundary simplices:\n";
+ for (auto f_simplex : simplex_tree.filtration_simplex_range()) {
+ std::cout << " " << "[" << simplex_tree.filtration(f_simplex) << "] ";
+ for (auto vertex : simplex_tree.simplex_vertex_range(f_simplex)) {
+ std::cout << vertex << " ";
+ }
+ std::cout << std::endl;
- for( auto b_simplex : simplex_tree.boundary_simplex_range(f_simplex) )
- {
- std::cout << " " << "[" << simplex_tree.filtration(b_simplex) << "] ";
- for( auto vertex : simplex_tree.simplex_vertex_range(b_simplex) )
- { std::cout << vertex << " "; }
- std::cout << std::endl;
- }
- }
-#endif // DEBUG_TRACES
+ for (auto b_simplex : simplex_tree.boundary_simplex_range(f_simplex)) {
+ std::cout << " " << "[" << simplex_tree.filtration(b_simplex) << "] ";
+ for (auto vertex : simplex_tree.simplex_vertex_range(b_simplex)) {
+ std::cout << vertex << " ";
+ }
+ std::cout << std::endl;
+ }
+ }
+#endif // DEBUG_TRACES
- return 0;
+ return 0;
}
diff --git a/src/Simplex_tree/example/simplex_tree_from_cliques_of_graph.cpp b/src/Simplex_tree/example/simplex_tree_from_cliques_of_graph.cpp
new file mode 100644
index 00000000..58085014
--- /dev/null
+++ b/src/Simplex_tree/example/simplex_tree_from_cliques_of_graph.cpp
@@ -0,0 +1,114 @@
+/* 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/Simplex_tree.h>
+
+#include <iostream>
+#include <ctime>
+#include <string>
+
+using namespace Gudhi;
+
+int main(int argc, char * const argv[]) {
+ if (argc != 3) {
+ std::cerr << "Usage: " << argv[0]
+ << " path_to_file_graph max_dim \n";
+ return 0;
+ }
+ std::string filegraph = argv[1];
+ int max_dim = atoi(argv[2]);
+
+ clock_t start, end;
+ // Construct the Simplex Tree
+ Simplex_tree<> st;
+
+ start = clock();
+ auto g = read_graph(filegraph);
+ // insert the graph in the simplex tree as 1-skeleton
+ st.insert_graph(g);
+ end = clock();
+ std::cout << "Insert the 1-skeleton in the simplex tree in "
+ << static_cast<double>(end - start) / CLOCKS_PER_SEC << " s. \n";
+
+ start = clock();
+ // expand the 1-skeleton until dimension max_dim
+ st.expansion(max_dim);
+ end = clock();
+ std::cout << "max_dim = " << max_dim << "\n";
+ std::cout << "Expand the simplex tree in "
+ << static_cast<double>(end - start) / CLOCKS_PER_SEC << " s. \n";
+
+ std::cout << "Information of the Simplex Tree: " << std::endl;
+ std::cout << " Number of vertices = " << st.num_vertices() << " ";
+ std::cout << " Number of simplices = " << st.num_simplices() << std::endl;
+ std::cout << std::endl << std::endl;
+
+ std::cout << "Iterator on vertices: ";
+ for (auto vertex : st.complex_vertex_range()) {
+ std::cout << vertex << " ";
+ }
+
+ std::cout << std::endl;
+
+ std::cout << std::endl << std::endl;
+
+ std::cout << "Iterator on simplices: " << std::endl;
+ for (auto simplex : st.complex_simplex_range()) {
+ std::cout << " ";
+ for (auto vertex : st.simplex_vertex_range(simplex)) {
+ std::cout << vertex << " ";
+ }
+ std::cout << std::endl;
+ }
+
+ std::cout << std::endl << std::endl;
+
+ std::cout << "Iterator on Simplices in the filtration, with [filtration value]:" << std::endl;
+ for (auto f_simplex : st.filtration_simplex_range()) {
+ std::cout << " " << "[" << st.filtration(f_simplex) << "] ";
+ for (auto vertex : st.simplex_vertex_range(f_simplex)) {
+ std::cout << vertex << " ";
+ }
+ std::cout << std::endl;
+ }
+
+ std::cout << std::endl << std::endl;
+
+ std::cout << "Iterator on Simplices in the filtration, and their boundary simplices:" << std::endl;
+ for (auto f_simplex : st.filtration_simplex_range()) {
+ std::cout << " " << "[" << st.filtration(f_simplex) << "] ";
+ for (auto vertex : st.simplex_vertex_range(f_simplex)) {
+ std::cout << vertex << " ";
+ }
+ std::cout << std::endl;
+
+ for (auto b_simplex : st.boundary_simplex_range(f_simplex)) {
+ std::cout << " " << "[" << st.filtration(b_simplex) << "] ";
+ for (auto vertex : st.simplex_vertex_range(b_simplex)) {
+ std::cout << vertex << " ";
+ }
+ std::cout << std::endl;
+ }
+ }
+ return 0;
+}
diff --git a/src/Simplex_tree/example/simplex_tree_from_file.cpp b/src/Simplex_tree/example/simplex_tree_from_file.cpp
deleted file mode 100644
index 20e8f067..00000000
--- a/src/Simplex_tree/example/simplex_tree_from_file.cpp
+++ /dev/null
@@ -1,104 +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 <iostream>
-#include <ctime>
-#include "gudhi/reader_utils.h"
-#include "gudhi/Simplex_tree.h"
-
-using namespace Gudhi;
-
-int main (int argc, char * const argv[])
-{
- if (argc != 3) {
- std::cerr << "Usage: " << argv[0]
- << " path_to_file_graph max_dim \n";
- return 0;
- }
- std::string filegraph = argv[1];
- int max_dim = atoi(argv[2]);
-
- clock_t start, end;
- //Construct the Simplex Tree
- Simplex_tree<> st;
-
- start = clock();
- auto g = read_graph(filegraph);
- st.insert_graph (g); //insert the graph in the simplex tree as 1-skeleton
- end = clock();
- std::cout << "Insert the 1-skeleton in the simplex tree in "
- << (double)(end-start)/CLOCKS_PER_SEC << " s. \n";
-
- start = clock();
- st.expansion ( max_dim ); //expand the 1-skeleton until dimension max_dim
- end = clock();
- std::cout << "max_dim = " << max_dim << "\n";
- std::cout << "Expand the simplex tree in "
- << (double)(end-start)/CLOCKS_PER_SEC << " s. \n";
-
- std::cout << "Information of the Simplex Tree: " << std::endl;
- std::cout << " Number of vertices = " << st.num_vertices() << " ";
- std::cout << " Number of simplices = " << st.num_simplices() << std::endl;
- std::cout << std::endl << std::endl;
-
- std::cout << "Iterator on vertices: ";
- for( auto vertex : st.complex_vertex_range() ) { std::cout << vertex << " "; }
-
- std::cout << std::endl;
-
- std::cout << std::endl << std::endl;
-
- std::cout << "Iterator on simplices: " << std::endl;
- for( auto simplex : st.complex_simplex_range() )
- {
- std::cout << " ";
- for( auto vertex : st.simplex_vertex_range(simplex) ) { std::cout << vertex << " "; }
- std::cout << std::endl;
- }
-
- std::cout << std::endl << std::endl;
-
- std::cout << "Iterator on Simplices in the filtration, with [filtration value]:" << std::endl;
- for( auto f_simplex : st.filtration_simplex_range() )
- { std::cout << " " << "[" << st.filtration(f_simplex) << "] ";
- for( auto vertex : st.simplex_vertex_range(f_simplex) )
- { std::cout << vertex << " "; } std::cout << std::endl;
- }
-
- std::cout << std::endl << std::endl;
-
- std::cout << "Iterator on Simplices in the filtration, and their boundary simplices:" << std::endl;
- for( auto f_simplex : st.filtration_simplex_range() )
- {
- std::cout << " " << "[" << st.filtration(f_simplex) << "] ";
- for( auto vertex : st.simplex_vertex_range(f_simplex) )
- { std::cout << vertex << " "; } std::cout << std::endl;
-
- for( auto b_simplex : st.boundary_simplex_range(f_simplex) )
- {
- std::cout << " " << "[" << st.filtration(b_simplex) << "] ";
- for( auto vertex : st.simplex_vertex_range(b_simplex) )
- { std::cout << vertex << " "; } std::cout << std::endl;
- }
- }
- return 0;
-}
diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree.h b/src/Simplex_tree/include/gudhi/Simplex_tree.h
index b79e3c8f..63e3f0e5 100644
--- a/src/Simplex_tree/include/gudhi/Simplex_tree.h
+++ b/src/Simplex_tree/include/gudhi/Simplex_tree.h
@@ -20,59 +20,42 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef SRC_SIMPLEX_TREE_INCLUDE_GUDHI_SIMPLEX_TREE_H_
-#define SRC_SIMPLEX_TREE_INCLUDE_GUDHI_SIMPLEX_TREE_H_
+#ifndef SIMPLEX_TREE_H_
+#define SIMPLEX_TREE_H_
#include <gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h>
#include <gudhi/Simplex_tree/Simplex_tree_siblings.h>
#include <gudhi/Simplex_tree/Simplex_tree_iterators.h>
#include <gudhi/Simplex_tree/indexing_tag.h>
+#include <gudhi/reader_utils.h>
+#include <gudhi/graph_simplicial_complex.h>
+#include <gudhi/Debug_utils.h>
+
#include <boost/container/flat_map.hpp>
#include <boost/iterator/transform_iterator.hpp>
#include <boost/graph/adjacency_list.hpp>
+#include <boost/range/adaptor/reversed.hpp>
+
+#ifdef GUDHI_USE_TBB
+#include <tbb/parallel_sort.h>
+#endif
-#include <algorithm>
#include <utility>
#include <vector>
+#include <functional> // for greater<>
+#include <stdexcept>
+#include <limits> // Inf
+#include <initializer_list>
+#include <algorithm> // for std::max
+#include <cstdint> // for std::uint32_t
namespace Gudhi {
-
-/** \defgroup simplex_tree Filtered Complexes
- *
- * A simplicial complex \f$\mathbf{K}\f$
- * on a set of vertices \f$V = \{1, \cdots ,|V|\}\f$ is a collection of simplices
- * \f$\{\sigma\}\f$,
- * \f$\sigma \subseteq V\f$ such that \f$\tau \subseteq \sigma \in \mathbf{K} \rightarrow \tau \in
- * \mathbf{K}\f$. The
- * dimension \f$n=|\sigma|-1\f$ of \f$\sigma\f$ is its number of elements minus \f$1\f$.
- *
- * A filtration of a simplicial complex is
- * a function \f$f:\mathbf{K} \rightarrow \mathbb{R}\f$ satisfying \f$f(\tau)\leq f(\sigma)\f$ whenever
- * \f$\tau \subseteq \sigma\f$. 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.
- *
-
- <DT>Implementations:</DT>
- 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.
+struct Simplex_tree_options_full_featured;
-
- * \author Clément Maria
- * \version 1.0
- * \date 2014
- * \copyright GNU General Public License v3.
- * @{
- */
/**
+ * \class Simplex_tree Simplex_tree.h gudhi/Simplex_tree.h
* \brief Simplex Tree data structure for representing simplicial complexes.
*
* \details Every simplex \f$[v_0, \cdots ,v_d]\f$ admits a canonical orientation
@@ -83,46 +66,70 @@ namespace Gudhi {
* \implements FilteredComplex
*
*/
-template<typename IndexingTag = linear_indexing_tag,
- typename FiltrationValue = double, typename SimplexKey = int // must be a signed integer type
- , typename VertexHandle = int // must be a signed integer type, int convertible to it
-// , bool ContiguousVertexHandles = true //true is Vertex_handles are exactly the set [0;n)
->
+
+template<typename SimplexTreeOptions = Simplex_tree_options_full_featured>
class Simplex_tree {
public:
- typedef IndexingTag Indexing_tag;
+ typedef SimplexTreeOptions Options;
+ typedef typename Options::Indexing_tag Indexing_tag;
/** \brief Type for the value of the filtration function.
*
* Must be comparable with <. */
- typedef FiltrationValue Filtration_value;
+ typedef typename Options::Filtration_value Filtration_value;
/** \brief Key associated to each simplex.
*
- * Must be a signed integer type. */
- typedef SimplexKey Simplex_key;
+ * Must be an integer type. */
+ typedef typename Options::Simplex_key Simplex_key;
/** \brief Type for the vertex handle.
*
* Must be a signed integer type. It admits a total order <. */
- typedef VertexHandle Vertex_handle;
+ typedef typename Options::Vertex_handle Vertex_handle;
/* Type of node in the simplex tree. */
typedef Simplex_tree_node_explicit_storage<Simplex_tree> Node;
/* Type of dictionary Vertex_handle -> Node for traversing the simplex tree. */
+ // Note: this wastes space when Vertex_handle is 32 bits and Node is aligned on 64 bits. It would be better to use a
+ // flat_set (with our own comparator) where we can control the layout of the struct (put Vertex_handle and
+ // Simplex_key next to each other).
typedef typename boost::container::flat_map<Vertex_handle, Node> Dictionary;
- friend class Simplex_tree_node_explicit_storage< Simplex_tree<FiltrationValue, SimplexKey, VertexHandle> >;
- friend class Simplex_tree_siblings< Simplex_tree<FiltrationValue, SimplexKey, VertexHandle>, Dictionary>;
- friend class Simplex_tree_simplex_vertex_iterator< Simplex_tree<FiltrationValue, SimplexKey, VertexHandle> >;
- friend class Simplex_tree_boundary_simplex_iterator< Simplex_tree<FiltrationValue, SimplexKey, VertexHandle> >;
- friend class Simplex_tree_complex_simplex_iterator< Simplex_tree<FiltrationValue, SimplexKey, VertexHandle> >;
- friend class Simplex_tree_skeleton_simplex_iterator< Simplex_tree<FiltrationValue, SimplexKey, VertexHandle> >;
-
/* \brief Set of nodes sharing a same parent in the simplex tree. */
/* \brief Set of nodes sharing a same parent in the simplex tree. */
typedef Simplex_tree_siblings<Simplex_tree, Dictionary> Siblings;
+ struct Key_simplex_base_real {
+ Key_simplex_base_real() : key_(-1) {}
+ void assign_key(Simplex_key k) { key_ = k; }
+ Simplex_key key() const { return key_; }
+ private:
+ Simplex_key key_;
+ };
+ struct Key_simplex_base_dummy {
+ Key_simplex_base_dummy() {}
+ void assign_key(Simplex_key) { }
+ Simplex_key key() const { assert(false); return -1; }
+ };
+ typedef typename std::conditional<Options::store_key, Key_simplex_base_real, Key_simplex_base_dummy>::type
+ Key_simplex_base;
+
+ struct Filtration_simplex_base_real {
+ Filtration_simplex_base_real() : filt_(0) {}
+ void assign_filtration(Filtration_value f) { filt_ = f; }
+ Filtration_value filtration() const { return filt_; }
+ private:
+ Filtration_value filt_;
+ };
+ struct Filtration_simplex_base_dummy {
+ Filtration_simplex_base_dummy() {}
+ void assign_filtration(Filtration_value f) { assert(f == 0); }
+ Filtration_value filtration() const { return 0; }
+ };
+ typedef typename std::conditional<Options::store_filtration, Filtration_simplex_base_real,
+ Filtration_simplex_base_dummy>::type Filtration_simplex_base;
+
public:
/** \brief Handle type to a simplex contained in the simplicial complex represented
- * byt he simplex tree. */
+ * by the simplex tree. */
typedef typename Dictionary::iterator Simplex_handle;
private:
@@ -156,6 +163,8 @@ class Simplex_tree {
typedef Simplex_tree_simplex_vertex_iterator<Simplex_tree> Simplex_vertex_iterator;
/** \brief Range over the vertices of a simplex. */
typedef boost::iterator_range<Simplex_vertex_iterator> Simplex_vertex_range;
+ /** \brief Range over the cofaces of a simplex. */
+ typedef std::vector<Simplex_handle> Cofaces_simplex_range;
/** \brief Iterator over the simplices of the boundary of a simplex.
*
* 'value_type' is Simplex_handle. */
@@ -176,24 +185,23 @@ class Simplex_tree {
/** \brief Range over the simplices of the skeleton of the simplicial complex, for a given
* dimension. */
typedef boost::iterator_range<Skeleton_simplex_iterator> Skeleton_simplex_range;
+ /** \brief Range over the simplices of the simplicial complex, ordered by the filtration. */
+ typedef std::vector<Simplex_handle> Filtration_simplex_range;
/** \brief Iterator over the simplices of the simplicial complex, ordered by the filtration.
*
* 'value_type' is Simplex_handle. */
- typedef typename std::vector<Simplex_handle>::iterator Filtration_simplex_iterator;
- /** \brief Range over the simplices of the simplicial complex, ordered by the filtration. */
- typedef boost::iterator_range<Filtration_simplex_iterator> Filtration_simplex_range;
+ typedef typename Filtration_simplex_range::const_iterator Filtration_simplex_iterator;
/* @} */ // end name range and iterator types
/** \name Range and iterator methods
* @{ */
- /** \brief Returns a range over the vertices of the simplicial complex.
- *
+ /** \brief Returns a range over the vertices of the simplicial complex.
* The order is increasing according to < on Vertex_handles.*/
Complex_vertex_range complex_vertex_range() {
return Complex_vertex_range(
- boost::make_transform_iterator(root_.members_.begin(), return_first()),
- boost::make_transform_iterator(root_.members_.end(), return_first()));
+ boost::make_transform_iterator(root_.members_.begin(), return_first()),
+ boost::make_transform_iterator(root_.members_.end(), return_first()));
}
/** \brief Returns a range over the simplices of the simplicial complex.
@@ -233,18 +241,15 @@ class Simplex_tree {
* order is used.
*
* The filtration must be valid. If the filtration has not been initialized yet, the
- * method initializes it (i.e. order the simplices). */
- Filtration_simplex_range filtration_simplex_range(Indexing_tag) {
+ * method initializes it (i.e. order the simplices). If the complex has changed since the last time the filtration
+ * was initialized, please call `initialize_filtration()` to recompute it. */
+ Filtration_simplex_range const& filtration_simplex_range(Indexing_tag = Indexing_tag()) {
if (filtration_vect_.empty()) {
initialize_filtration();
}
- return Filtration_simplex_range(filtration_vect_.begin(),
- filtration_vect_.end());
+ return filtration_vect_;
}
- Filtration_simplex_range filtration_simplex_range() {
- return filtration_simplex_range(Indexing_tag());
- }
/** \brief Returns a range over the vertices of a simplex.
*
* The order in which the vertices are visited is the decreasing order for < on Vertex_handles,
@@ -252,6 +257,7 @@ class Simplex_tree {
* equal to \f$(-1)^{\text{dim} \sigma}\f$ the canonical orientation on the simplex.
*/
Simplex_vertex_range simplex_vertex_range(Simplex_handle sh) {
+ assert(sh != null_simplex()); // Empty simplex
return Simplex_vertex_range(Simplex_vertex_iterator(this, sh),
Simplex_vertex_iterator(this));
}
@@ -270,7 +276,8 @@ class Simplex_tree {
* of the simplex.
*
* @param[in] sh Simplex for which the boundary is computed. */
- Boundary_simplex_range boundary_simplex_range(Simplex_handle sh) {
+ template<class SimplexHandle>
+ Boundary_simplex_range boundary_simplex_range(SimplexHandle sh) {
return Boundary_simplex_range(Boundary_simplex_iterator(this, sh),
Boundary_simplex_iterator(this));
}
@@ -282,11 +289,47 @@ class Simplex_tree {
/** \brief Constructs an empty simplex tree. */
Simplex_tree()
: null_vertex_(-1),
- threshold_(0),
- num_simplices_(0),
- root_(NULL, null_vertex_),
- filtration_vect_(),
- dimension_(-1) {
+ threshold_(0),
+ root_(nullptr, null_vertex_),
+ filtration_vect_(),
+ dimension_(-1) { }
+
+ /** \brief User-defined copy constructor reproduces the whole tree structure. */
+ Simplex_tree(const Simplex_tree& simplex_source)
+ : null_vertex_(simplex_source.null_vertex_),
+ threshold_(simplex_source.threshold_),
+ root_(nullptr, null_vertex_ , simplex_source.root_.members_),
+ filtration_vect_(),
+ dimension_(simplex_source.dimension_) {
+ auto root_source = simplex_source.root_;
+ rec_copy(&root_, &root_source);
+ }
+
+ /** \brief depth first search, inserts simplices when reaching a leaf. */
+ void rec_copy(Siblings *sib, Siblings *sib_source) {
+ for (auto sh = sib->members().begin(), sh_source = sib_source->members().begin();
+ sh != sib->members().end(); ++sh, ++sh_source) {
+ if (has_children(sh_source)) {
+ Siblings * newsib = new Siblings(sib, sh_source->first);
+ newsib->members_.reserve(sh_source->second.children()->members().size());
+ for (auto & child : sh_source->second.children()->members())
+ newsib->members_.emplace_hint(newsib->members_.end(), child.first, Node(newsib, child.second.filtration()));
+ rec_copy(newsib, sh_source->second.children());
+ sh->second.assign_children(newsib);
+ }
+ }
+ }
+
+ /** \brief User-defined move constructor moves the whole tree structure. */
+ Simplex_tree(Simplex_tree && old)
+ : null_vertex_(std::move(old.null_vertex_)),
+ threshold_(std::move(old.threshold_)),
+ root_(std::move(old.root_)),
+ filtration_vect_(std::move(old.filtration_vect_)),
+ dimension_(std::move(old.dimension_)) {
+ old.dimension_ = -1;
+ old.threshold_ = 0;
+ old.root_ = Siblings(nullptr, null_vertex_);
}
/** \brief Destructor; deallocates the whole tree structure. */
@@ -299,7 +342,7 @@ class Simplex_tree {
}
/** @} */ // end constructor/destructor
private:
- /** Recursive deletion. */
+ // Recursive deletion
void rec_delete(Siblings * sib) {
for (auto sh = sib->members().begin(); sh != sib->members().end(); ++sh) {
if (has_children(sh)) {
@@ -310,102 +353,184 @@ class Simplex_tree {
}
public:
+ /** \brief Checks if two simplex trees are equal. */
+ bool operator==(Simplex_tree& st2) {
+ if ((null_vertex_ != st2.null_vertex_) ||
+ (threshold_ != st2.threshold_) ||
+ (dimension_ != st2.dimension_))
+ return false;
+ return rec_equal(&root_, &st2.root_);
+ }
+
+ /** \brief Checks if two simplex trees are different. */
+ bool operator!=(Simplex_tree& st2) {
+ return (!(*this == st2));
+ }
+
+ private:
+ /** rec_equal: Checks recursively whether or not two simplex trees are equal, using depth first search. */
+ bool rec_equal(Siblings* s1, Siblings* s2) {
+ if (s1->members().size() != s2->members().size())
+ return false;
+ for (auto sh1 = s1->members().begin(), sh2 = s2->members().begin();
+ (sh1 != s1->members().end() && sh2 != s2->members().end()); ++sh1, ++sh2) {
+ if (sh1->first != sh2->first || sh1->second.filtration() != sh2->second.filtration())
+ return false;
+ if (has_children(sh1) != has_children(sh2))
+ return false;
+ // Recursivity on children only if both have children
+ else if (has_children(sh1))
+ if (!rec_equal(sh1->second.children(), sh2->second.children()))
+ return false;
+ }
+ return true;
+ }
+
+ public:
/** \brief Returns the key associated to a simplex.
*
- * The filtration must be initialized. */
- Simplex_key key(Simplex_handle sh) {
+ * The filtration must be initialized.
+ * \pre SimplexTreeOptions::store_key
+ */
+ static Simplex_key key(Simplex_handle sh) {
return sh->second.key();
}
+
/** \brief Returns the simplex associated to a key.
*
- * The filtration must be initialized. */
- Simplex_handle simplex(Simplex_key key) {
+ * The filtration must be initialized.
+ * \pre SimplexTreeOptions::store_key
+ */
+ Simplex_handle simplex(Simplex_key key) const {
return filtration_vect_[key];
}
+
/** \brief Returns the filtration value of a simplex.
*
- * Called on the null_simplex, returns INFINITY. */
- Filtration_value filtration(Simplex_handle sh) {
+ * Called on the null_simplex, returns INFINITY.
+ * If SimplexTreeOptions::store_filtration is false, returns 0.
+ */
+ static Filtration_value filtration(Simplex_handle sh) {
if (sh != null_simplex()) {
return sh->second.filtration();
} else {
return INFINITY;
- } // filtration(); }
+ }
}
+
+ /** \brief Sets the filtration value of a simplex.
+ * \exception std::invalid_argument In debug mode, if sh is a null_simplex.
+ */
+ void assign_filtration(Simplex_handle sh, Filtration_value fv) {
+ GUDHI_CHECK(sh != null_simplex(),
+ std::invalid_argument("Simplex_tree::assign_filtration - cannot assign filtration on null_simplex"));
+ sh->second.assign_filtration(fv);
+ }
+
/** \brief Returns an upper bound of the filtration values of the simplices. */
- Filtration_value filtration() {
+ Filtration_value filtration() const {
return threshold_;
}
+
/** \brief Returns a Simplex_handle different from all Simplex_handles
* associated to the simplices in the simplicial complex.
*
* One can call filtration(null_simplex()). */
- Simplex_handle null_simplex() {
- return Dictionary_it(NULL);
+ static Simplex_handle null_simplex() {
+ return Dictionary_it(nullptr);
}
+
/** \brief Returns a key different for all keys associated to the
* simplices of the simplicial complex. */
- Simplex_key null_key() {
+ static Simplex_key null_key() {
return -1;
}
+
/** \brief Returns a Vertex_handle different from all Vertex_handles associated
* to the vertices of the simplicial complex. */
- Vertex_handle null_vertex() {
+ Vertex_handle null_vertex() const {
return null_vertex_;
}
+
/** \brief Returns the number of vertices in the complex. */
- size_t num_vertices() {
+ size_t num_vertices() const {
return root_.members_.size();
}
- /** \brief Returns the number of simplices in the complex.
- *
- * Does not count the empty simplex. */
- const unsigned int& num_simplices() const {
- return num_simplices_;
+
+ public:
+ /** \brief returns the number of simplices in the simplex_tree. */
+ size_t num_simplices() {
+ return num_simplices(&root_);
+ }
+
+ private:
+ /** \brief returns the number of simplices in the simplex_tree. */
+ size_t num_simplices(Siblings * sib) {
+ auto sib_begin = sib->members().begin();
+ auto sib_end = sib->members().end();
+ size_t simplices_number = sib_end - sib_begin;
+ for (auto sh = sib_begin; sh != sib_end; ++sh) {
+ if (has_children(sh)) {
+ simplices_number += num_simplices(sh->second.children());
+ }
+ }
+ return simplices_number;
}
+ public:
/** \brief Returns the dimension of a simplex.
*
* Must be different from null_simplex().*/
int dimension(Simplex_handle sh) {
Siblings * curr_sib = self_siblings(sh);
int dim = 0;
- while (curr_sib != NULL) {
+ while (curr_sib != nullptr) {
++dim;
curr_sib = curr_sib->oncles();
}
return dim - 1;
}
+
/** \brief Returns an upper bound on the dimension of the simplicial complex. */
- int dimension() {
+ int dimension() const {
return dimension_;
}
- /** \brief Returns true iff the node in the simplex tree pointed by
+ /** \brief Returns true if the node in the simplex tree pointed by
* sh has children.*/
- bool has_children(Simplex_handle sh) {
+ template<class SimplexHandle>
+ bool has_children(SimplexHandle sh) const {
return (sh->second.children()->parent() == sh->first);
}
- /** \brief Given a range of Vertex_handles, returns the Simplex_handle
+ /** \brief Given a range of Vertex_handles, returns the Simplex_handle
* of the simplex in the simplicial complex containing the corresponding
* vertices. Return null_simplex() if the simplex is not in the complex.
*
- * The type RandomAccessVertexRange must be a range for which .begin() and
- * .end() return random access iterators, with <CODE>value_type</CODE>
- * <CODE>Vertex_handle</CODE>.
+ * The type InputVertexRange must be a range of <CODE>Vertex_handle</CODE>
+ * on which we can call std::begin() function
*/
- template<class RandomAccessVertexRange>
- Simplex_handle find(RandomAccessVertexRange & s) {
- if (s.begin() == s.end())
- std::cerr << "Empty simplex \n";
-
- sort(s.begin(), s.end());
+ template<class InputVertexRange = std::initializer_list<Vertex_handle>>
+ Simplex_handle find(const InputVertexRange & s) {
+ auto first = std::begin(s);
+ auto last = std::end(s);
+
+ if (first == last)
+ return null_simplex(); // ----->>
+
+ // Copy before sorting
+ std::vector<Vertex_handle> copy(first, last);
+ std::sort(std::begin(copy), std::end(copy));
+ return find_simplex(copy);
+ }
+ private:
+ /** Find function, with a sorted range of vertices. */
+ Simplex_handle find_simplex(const std::vector<Vertex_handle> & simplex) {
Siblings * tmp_sib = &root_;
Dictionary_it tmp_dit;
- Vertex_handle last = s[s.size() - 1];
- for (auto v : s) {
+ Vertex_handle last = simplex.back();
+ for (auto v : simplex) {
tmp_dit = tmp_sib->members_.find(v);
if (tmp_dit == tmp_sib->members_.end()) {
return null_simplex();
@@ -421,46 +546,44 @@ class Simplex_tree {
/** \brief Returns the Simplex_handle corresponding to the 0-simplex
* representing the vertex with Vertex_handle v. */
Simplex_handle find_vertex(Vertex_handle v) {
- return root_.members_.begin() + v;
+ if (Options::contiguous_vertices) {
+ assert(contiguous_vertices());
+ return root_.members_.begin() + v;
+ } else {
+ return root_.members_.find(v);
+ }
}
-//{ return root_.members_.find(v); }
- /** \brief Insert a simplex, represented by a range of Vertex_handles, in the simplicial complex.
- *
- * @param[in] simplex range of Vertex_handles, representing the vertices of the new simplex
+ public:
+ /** \private \brief Test if the vertices have contiguous numbering: 0, 1, etc. */
+ bool contiguous_vertices() const {
+ if (root_.members_.empty()) return true;
+ if (root_.members_.begin()->first != 0) return false;
+ if (std::prev(root_.members_.end())->first != static_cast<Vertex_handle>(root_.members_.size() - 1)) return false;
+ return true;
+ }
+
+ private:
+ /** \brief Inserts a simplex represented by a vector of vertex.
+ * @param[in] simplex vector of Vertex_handles, representing the vertices of the new simplex. The vector must be
+ * sorted by increasing vertex handle order.
* @param[in] filtration the filtration value assigned to the new simplex.
- * The return type is a pair. If the new simplex is inserted successfully (i.e. it was not in the
+ * @return If the new simplex is inserted successfully (i.e. it was not in the
* simplicial complex yet) the bool is set to true and the Simplex_handle is the handle assigned
* to the new simplex.
* If the insertion fails (the simplex is already there), the bool is set to false. If the insertion
* fails and the simplex already in the complex has a filtration value strictly bigger than 'filtration',
- * we assign this simplex with the new value 'filtration', and set the Simplex_handle filed of the
+ * we assign this simplex with the new value 'filtration', and set the Simplex_handle field of the
* output pair to the Simplex_handle of the simplex. Otherwise, we set the Simplex_handle part to
* null_simplex.
- *
- * All subsimplices do not necessary need to be already in the simplex tree to proceed to an
- * insertion. However, the property of being a simplicial complex will be violated. This allows
- * us to insert a stream of simplices contained in a simplicial complex without considering any
- * order on them.
- *
- * The filtration value
- * assigned to the new simplex must preserve the monotonicity of the filtration.
- *
- * The type RandomAccessVertexRange must be a range for which .begin() and
- * .end() return random access iterators, with 'value_type' Vertex_handle. */
- template<class RandomAccessVertexRange>
- std::pair<Simplex_handle, bool> insert_simplex(RandomAccessVertexRange & simplex,
- Filtration_value filtration) {
- if (simplex.empty()) {
- return std::pair<Simplex_handle, bool>(null_simplex(), true);
- }
-
- sort(simplex.begin(), simplex.end()); // must be sorted in increasing order
-
+ *
+ */
+ std::pair<Simplex_handle, bool> insert_vertex_vector(const std::vector<Vertex_handle>& simplex,
+ Filtration_value filtration) {
Siblings * curr_sib = &root_;
std::pair<Simplex_handle, bool> res_insert;
- typename RandomAccessVertexRange::iterator vi;
- for (vi = simplex.begin(); vi != simplex.end() - 1; ++vi) {
+ auto vi = simplex.begin();
+ for (; vi != simplex.end() - 1; ++vi) {
res_insert = curr_sib->members_.emplace(*vi, Node(curr_sib, filtration));
if (!(has_children(res_insert.first))) {
res_insert.first->second.assign_children(new Siblings(curr_sib, *vi));
@@ -468,104 +591,177 @@ class Simplex_tree {
curr_sib = res_insert.first->second.children();
}
res_insert = curr_sib->members_.emplace(*vi, Node(curr_sib, filtration));
- if (!res_insert.second) { // if already in the complex
- if (res_insert.first->second.filtration() > filtration) { // if filtration value modified
+ if (!res_insert.second) {
+ // if already in the complex
+ if (res_insert.first->second.filtration() > filtration) {
+ // if filtration value modified
res_insert.first->second.assign_filtration(filtration);
return res_insert;
}
- return std::pair<Simplex_handle, bool>(null_simplex(), false); // if filtration value unchanged
+ // if filtration value unchanged
+ return std::pair<Simplex_handle, bool>(null_simplex(), false);
}
// otherwise the insertion has succeeded
return res_insert;
}
+ public:
+ /** \brief Insert a simplex, represented by a range of Vertex_handles, in the simplicial complex.
+ *
+ * @param[in] simplex range of Vertex_handles, representing the vertices of the new simplex
+ * @param[in] filtration the filtration value assigned to the new simplex.
+ * @return If the new simplex is inserted successfully (i.e. it was not in the
+ * simplicial complex yet) the bool is set to true and the Simplex_handle is the handle assigned
+ * to the new simplex.
+ * If the insertion fails (the simplex is already there), the bool is set to false. If the insertion
+ * fails and the simplex already in the complex has a filtration value strictly bigger than 'filtration',
+ * we assign this simplex with the new value 'filtration', and set the Simplex_handle field of the
+ * output pair to the Simplex_handle of the simplex. Otherwise, we set the Simplex_handle part to
+ * null_simplex.
+ *
+ * All subsimplices do not necessary need to be already in the simplex tree to proceed to an
+ * insertion. However, the property of being a simplicial complex will be violated. This allows
+ * us to insert a stream of simplices contained in a simplicial complex without considering any
+ * order on them.
+ *
+ * The filtration value
+ * assigned to the new simplex must preserve the monotonicity of the filtration.
+ *
+ * The type InputVertexRange must be a range for which .begin() and
+ * .end() return input iterators, with 'value_type' Vertex_handle. */
+ template<class InputVertexRange = std::initializer_list<Vertex_handle>>
+ std::pair<Simplex_handle, bool> insert_simplex(const InputVertexRange & simplex,
+ Filtration_value filtration = 0) {
+ auto first = std::begin(simplex);
+ auto last = std::end(simplex);
+
+ if (first == last)
+ return std::pair<Simplex_handle, bool>(null_simplex(), true); // ----->>
+
+ // Copy before sorting
+ std::vector<Vertex_handle> copy(first, last);
+ std::sort(std::begin(copy), std::end(copy));
+ return insert_vertex_vector(copy, filtration);
+ }
- /** \brief Insert a N-simplex and all his subfaces, from a N-simplex represented by a range of
+ /** \brief Insert a N-simplex and all his subfaces, from a N-simplex represented by a range of
* Vertex_handles, in the simplicial complex.
*
* @param[in] Nsimplex range of Vertex_handles, representing the vertices of the new N-simplex
* @param[in] filtration the filtration value assigned to the new N-simplex.
- */
- template<class RandomAccessVertexRange>
- void insert_simplex_and_subfaces(RandomAccessVertexRange& Nsimplex,
- Filtration_value filtration = 0.0) {
- if (Nsimplex.size() > 1) {
- for (unsigned int NIndex = 0; NIndex < Nsimplex.size(); NIndex++) {
- // insert N (N-1)-Simplex
- RandomAccessVertexRange NsimplexMinusOne;
- for (unsigned int NListIter = 0; NListIter < Nsimplex.size() - 1; NListIter++) {
- // (N-1)-Simplex creation
- NsimplexMinusOne.push_back( Nsimplex[(NIndex + NListIter) % Nsimplex.size()]);
- }
- // (N-1)-Simplex recursive call
- insert_simplex_and_subfaces(NsimplexMinusOne, filtration);
+ * @return If the new simplex is inserted successfully (i.e. it was not in the
+ * simplicial complex yet) the bool is set to true and the Simplex_handle is the handle assigned
+ * to the new simplex.
+ * If the insertion fails (the simplex is already there), the bool is set to false. If the insertion
+ * fails and the simplex already in the complex has a filtration value strictly bigger than 'filtration',
+ * we assign this simplex with the new value 'filtration', and set the Simplex_handle field of the
+ * output pair to the Simplex_handle of the simplex. Otherwise, we set the Simplex_handle part to
+ * null_simplex.
+ */
+ template<class InputVertexRange = std::initializer_list<Vertex_handle>>
+ std::pair<Simplex_handle, bool> insert_simplex_and_subfaces(const InputVertexRange& Nsimplex,
+ Filtration_value filtration = 0) {
+ auto first = std::begin(Nsimplex);
+ auto last = std::end(Nsimplex);
+
+ if (first == last)
+ return std::pair<Simplex_handle, bool>(null_simplex(), true); // ----->>
+
+ // Copy before sorting
+ std::vector<Vertex_handle> copy(first, last);
+ std::sort(std::begin(copy), std::end(copy));
+
+ std::vector<std::vector<Vertex_handle>> to_be_inserted;
+ std::vector<std::vector<Vertex_handle>> to_be_propagated;
+ return rec_insert_simplex_and_subfaces(copy, to_be_inserted, to_be_propagated, filtration);
+ }
+
+ private:
+ std::pair<Simplex_handle, bool> rec_insert_simplex_and_subfaces(std::vector<Vertex_handle>& the_simplex,
+ std::vector<std::vector<Vertex_handle>>& to_be_inserted,
+ std::vector<std::vector<Vertex_handle>>& to_be_propagated,
+ Filtration_value filtration = 0.0) {
+ std::pair<Simplex_handle, bool> insert_result;
+ if (the_simplex.size() > 1) {
+ // Get and remove last vertex
+ Vertex_handle last_vertex = the_simplex.back();
+ the_simplex.pop_back();
+ // Recursive call after last vertex removal
+ insert_result = rec_insert_simplex_and_subfaces(the_simplex, to_be_inserted, to_be_propagated, filtration);
+
+ // Concatenation of to_be_inserted and to_be_propagated
+ to_be_inserted.insert(to_be_inserted.begin(), to_be_propagated.begin(), to_be_propagated.end());
+ to_be_propagated = to_be_inserted;
+
+ // to_be_inserted treatment
+ for (auto& simplex_tbi : to_be_inserted) {
+ simplex_tbi.push_back(last_vertex);
}
- // N-Simplex insert
- std::pair<Simplex_handle, bool> returned = insert_simplex(Nsimplex, filtration);
- if (returned.second == true) {
- num_simplices_++;
+ std::vector<Vertex_handle> last_simplex(1, last_vertex);
+ to_be_inserted.insert(to_be_inserted.begin(), last_simplex);
+ // i.e. (0,1,2) =>
+ // [to_be_inserted | to_be_propagated] = [(1) (0,1) | (0)]
+ // [to_be_inserted | to_be_propagated] = [(2) (0,2) (1,2) (0,1,2) | (0) (1) (0,1)]
+ // N.B. : it is important the last inserted to be the highest in dimension
+ // in order to return the "last" insert_simplex result
+
+ // insert all to_be_inserted
+ for (auto& simplex_tbi : to_be_inserted) {
+ insert_result = insert_vertex_vector(simplex_tbi, filtration);
}
- } else if (Nsimplex.size() == 1) {
- // 1-Simplex insert - End of recursivity
- std::pair<Simplex_handle, bool> returned = insert_simplex(Nsimplex, filtration);
- if (returned.second == true) {
- num_simplices_++;
+ } else if (the_simplex.size() == 1) {
+ // When reaching the end of recursivity, vector of simplices shall be empty and filled on back recursive
+ if ((to_be_inserted.size() != 0) || (to_be_propagated.size() != 0)) {
+ std::cerr << "Simplex_tree::rec_insert_simplex_and_subfaces - Error vector not empty\n";
+ exit(-1);
}
+ std::vector<Vertex_handle> first_simplex(1, the_simplex.back());
+ // i.e. (0,1,2) => [to_be_inserted | to_be_propagated] = [(0) | ]
+ to_be_inserted.push_back(first_simplex);
+
+ insert_result = insert_vertex_vector(first_simplex, filtration);
} else {
- // Nothing to insert - empty vector
+ std::cerr << "Simplex_tree::rec_insert_simplex_and_subfaces - Recursivity error\n";
+ exit(-1);
}
+ return insert_result;
}
+ public:
/** \brief Assign a value 'key' to the key of the simplex
* represented by the Simplex_handle 'sh'. */
void assign_key(Simplex_handle sh, Simplex_key key) {
sh->second.assign_key(key);
}
- public:
/** Returns the two Simplex_handle corresponding to the endpoints of
* and edge. sh must point to a 1-dimensional simplex. This is an
* optimized version of the boundary computation. */
std::pair<Simplex_handle, Simplex_handle> endpoints(Simplex_handle sh) {
- return std::pair<Simplex_handle, Simplex_handle>(
- root_.members_.find(sh->first),
- root_.members_.find(self_siblings(sh)->parent()));
+ assert(dimension(sh) == 1);
+ return { find_vertex(sh->first), find_vertex(self_siblings(sh)->parent()) };
}
/** Returns the Siblings containing a simplex.*/
- Siblings * self_siblings(Simplex_handle sh) {
+ template<class SimplexHandle>
+ Siblings* self_siblings(SimplexHandle sh) {
if (sh->second.children()->parent() == sh->first)
return sh->second.children()->oncles();
else
return sh->second.children();
}
-// void display_simplex(Simplex_handle sh)
-// {
-// std::cout << " " << "[" << filtration(sh) << "] ";
-// for( auto vertex : simplex_vertex_range(sh) )
-// { std::cout << vertex << " "; }
-// }
-
- // void print(Simplex_handle sh, std::ostream& os = std::cout)
- // { for(auto v : simplex_vertex_range(sh)) {os << v << " ";}
- // os << std::endl; }
-
public:
/** Returns a pointer to the root nodes of the simplex tree. */
Siblings * root() {
return &root_;
}
- public:
/** Set an upper bound for the filtration values. */
void set_filtration(Filtration_value fil) {
threshold_ = fil;
}
- /** Set a number of simplices for the simplicial complex. */
- void set_num_simplices(const unsigned int& num_simplices) {
- num_simplices_ = num_simplices;
- }
+
/** Set a dimension for the simplicial complex. */
void set_dimension(int dimension) {
dimension_ = dimension;
@@ -579,25 +775,114 @@ class Simplex_tree {
* assigned a Simplex_key corresponding to its order in the filtration (from 0 to m-1 for a
* simplicial complex with m simplices).
*
- * The use of a depth-first traversal of the simplex tree, provided by
- * complex_simplex_range(), combined with
- * a stable sort is meant to optimize the order of simplices with same
- * filtration value. The heuristic consists in inserting the cofaces of a
- * simplex as soon as possible.
- *
* Will be automatically called when calling filtration_simplex_range()
* if the filtration has never been initialized yet. */
void initialize_filtration() {
filtration_vect_.clear();
filtration_vect_.reserve(num_simplices());
- for (auto cpx_it = complex_simplex_range().begin();
- cpx_it != complex_simplex_range().end(); ++cpx_it) {
- filtration_vect_.push_back(*cpx_it);
+ for (Simplex_handle sh : complex_simplex_range())
+ filtration_vect_.push_back(sh);
+
+ /* We use stable_sort here because with libstdc++ it is faster than sort.
+ * is_before_in_filtration is now a total order, but we used to call
+ * stable_sort for the following heuristic:
+ * The use of a depth-first traversal of the simplex tree, provided by
+ * complex_simplex_range(), combined with a stable sort is meant to
+ * optimize the order of simplices with same filtration value. The
+ * heuristic consists in inserting the cofaces of a simplex as soon as
+ * possible.
+ */
+#ifdef GUDHI_USE_TBB
+ tbb::parallel_sort(filtration_vect_.begin(), filtration_vect_.end(), is_before_in_filtration(this));
+#else
+ std::stable_sort(filtration_vect_.begin(), filtration_vect_.end(), is_before_in_filtration(this));
+#endif
+ }
+
+ private:
+ /** Recursive search of cofaces
+ * This function uses DFS
+ *\param vertices contains a list of vertices, which represent the vertices of the simplex not found yet.
+ *\param curr_nbVertices represents the number of vertices of the simplex we reached by going through the tree.
+ *\param cofaces contains a list of Simplex_handle, representing all the cofaces asked.
+ *\param star true if we need the star of the simplex
+ *\param nbVertices number of vertices of the cofaces we search
+ * Prefix actions : When the bottom vertex matches with the current vertex in the tree, we remove the bottom vertex from vertices.
+ * Infix actions : Then we call or not the recursion.
+ * Postfix actions : Finally, we add back the removed vertex into vertices, and remove this vertex from curr_nbVertices so that we didn't change the parameters.
+ * If the vertices list is empty, we need to check if curr_nbVertices matches with the dimension of the cofaces asked.
+ */
+ void rec_coface(std::vector<Vertex_handle> &vertices, Siblings *curr_sib, int curr_nbVertices,
+ std::vector<Simplex_handle>& cofaces, bool star, int nbVertices) {
+ if (!(star || curr_nbVertices <= nbVertices)) // dimension of actual simplex <= nbVertices
+ return;
+ for (Simplex_handle simplex = curr_sib->members().begin(); simplex != curr_sib->members().end(); ++simplex) {
+ if (vertices.empty()) {
+ // If we reached the end of the vertices, and the simplex has more vertices than the given simplex
+ // => we found a coface
+
+ // Add a coface if we wan't the star or if the number of vertices of the current simplex matches with nbVertices
+ bool addCoface = (star || curr_nbVertices == nbVertices);
+ if (addCoface)
+ cofaces.push_back(simplex);
+ if ((!addCoface || star) && has_children(simplex)) // Rec call
+ rec_coface(vertices, simplex->second.children(), curr_nbVertices + 1, cofaces, star, nbVertices);
+ } else {
+ if (simplex->first == vertices.back()) {
+ // If curr_sib matches with the top vertex
+ bool equalDim = (star || curr_nbVertices == nbVertices); // dimension of actual simplex == nbVertices
+ bool addCoface = vertices.size() == 1 && equalDim;
+ if (addCoface)
+ cofaces.push_back(simplex);
+ if ((!addCoface || star) && has_children(simplex)) {
+ // Rec call
+ Vertex_handle tmp = vertices.back();
+ vertices.pop_back();
+ rec_coface(vertices, simplex->second.children(), curr_nbVertices + 1, cofaces, star, nbVertices);
+ vertices.push_back(tmp);
+ }
+ } else if (simplex->first > vertices.back()) {
+ return;
+ } else {
+ // (simplex->first < vertices.back()
+ if (has_children(simplex))
+ rec_coface(vertices, simplex->second.children(), curr_nbVertices + 1, cofaces, star, nbVertices);
+ }
+ }
}
+ }
- // the stable sort ensures the ordering heuristic
- std::stable_sort(filtration_vect_.begin(), filtration_vect_.end(),
- is_before_in_filtration(this));
+ public:
+ /** \brief Compute the star of a n simplex
+ * \param simplex represent the simplex of which we search the star
+ * \return Vector of Simplex_handle, empty vector if no cofaces found.
+ */
+
+ Cofaces_simplex_range star_simplex_range(const Simplex_handle simplex) {
+ return cofaces_simplex_range(simplex, 0);
+ }
+
+ /** \brief Compute the cofaces of a n simplex
+ * \param simplex represent the n-simplex of which we search the n+codimension cofaces
+ * \param codimension The function returns the n+codimension-cofaces of the n-simplex. If codimension = 0,
+ * return all cofaces (equivalent of star function)
+ * \return Vector of Simplex_handle, empty vector if no cofaces found.
+ */
+
+ Cofaces_simplex_range cofaces_simplex_range(const Simplex_handle simplex, int codimension) {
+ Cofaces_simplex_range cofaces;
+ // codimension must be positive or null integer
+ assert(codimension >= 0);
+ Simplex_vertex_range rg = simplex_vertex_range(simplex);
+ std::vector<Vertex_handle> copy(rg.begin(), rg.end());
+ if (codimension + static_cast<int>(copy.size()) > dimension_ + 1 ||
+ (codimension == 0 && static_cast<int>(copy.size()) > dimension_)) // n+codimension greater than dimension_
+ return cofaces;
+ // must be sorted in decreasing order
+ assert(std::is_sorted(copy.begin(), copy.end(), std::greater<Vertex_handle>()));
+ bool star = codimension == 0;
+ rec_coface(copy, &root_, 1, cofaces, star, codimension + static_cast<int>(copy.size()));
+ return cofaces;
}
private:
@@ -623,6 +908,7 @@ class Simplex_tree {
}
return ((it1 == rg1.end()) && (it2 != rg2.end()));
}
+
/** \brief StrictWeakOrdering, for the simplices, defined by the filtration.
*
* It corresponds to the partial order
@@ -631,15 +917,15 @@ class Simplex_tree {
* to be smaller. The filtration function must be monotonic. */
struct is_before_in_filtration {
explicit is_before_in_filtration(Simplex_tree * st)
- : st_(st) {
- }
+ : st_(st) { }
bool operator()(const Simplex_handle sh1, const Simplex_handle sh2) const {
- if (st_->filtration(sh1) != st_->filtration(sh2)) {
- return st_->filtration(sh1) < st_->filtration(sh2);
+ // Not using st_->filtration(sh1) because it uselessly tests for null_simplex.
+ if (sh1->second.filtration() != sh2->second.filtration()) {
+ return sh1->second.filtration() < sh2->second.filtration();
}
-
- return st_->reverse_lexicographic_order(sh1, sh2); // is sh1 a proper subface of sh2
+ // is sh1 a proper subface of sh2
+ return st_->reverse_lexicographic_order(sh1, sh2);
}
Simplex_tree * st_;
@@ -666,7 +952,8 @@ class Simplex_tree {
* must be undirected_tag. */
template<class OneSkeletonGraph>
void insert_graph(const OneSkeletonGraph& skel_graph) {
- assert(num_simplices() == 0); // the simplex tree must be empty
+ // the simplex tree must be empty
+ assert(num_simplices() == 0);
if (boost::num_vertices(skel_graph) == 0) {
return;
@@ -677,37 +964,37 @@ class Simplex_tree {
dimension_ = 1;
}
- num_simplices_ = boost::num_vertices(skel_graph)
- + boost::num_edges(skel_graph);
root_.members_.reserve(boost::num_vertices(skel_graph));
typename boost::graph_traits<OneSkeletonGraph>::vertex_iterator v_it,
v_it_end;
for (std::tie(v_it, v_it_end) = boost::vertices(skel_graph); v_it != v_it_end;
- ++v_it) {
+ ++v_it) {
root_.members_.emplace_hint(
- root_.members_.end(), *v_it,
- Node(&root_, boost::get(vertex_filtration_t(), skel_graph, *v_it)));
+ root_.members_.end(), *v_it,
+ Node(&root_, boost::get(vertex_filtration_t(), skel_graph, *v_it)));
}
typename boost::graph_traits<OneSkeletonGraph>::edge_iterator e_it,
e_it_end;
for (std::tie(e_it, e_it_end) = boost::edges(skel_graph); e_it != e_it_end;
- ++e_it) {
+ ++e_it) {
auto u = source(*e_it, skel_graph);
auto v = target(*e_it, skel_graph);
- if (u < v) { // count edges only once { std::swap(u,v); } // u < v
+ if (u < v) {
+ // count edges only once { std::swap(u,v); } // u < v
auto sh = find_vertex(u);
if (!has_children(sh)) {
sh->second.assign_children(new Siblings(&root_, sh->first));
}
sh->second.children()->members().emplace(
- v,
- Node(sh->second.children(),
- boost::get(edge_filtration_t(), skel_graph, *e_it)));
+ v,
+ Node(sh->second.children(),
+ boost::get(edge_filtration_t(), skel_graph, *e_it)));
}
}
}
+
/** \brief Expands the Simplex_tree containing only its one skeleton
* until dimension max_dim.
*
@@ -722,7 +1009,7 @@ class Simplex_tree {
void expansion(int max_dim) {
dimension_ = max_dim;
for (Dictionary_it root_it = root_.members_.begin();
- root_it != root_.members_.end(); ++root_it) {
+ root_it != root_.members_.end(); ++root_it) {
if (has_children(root_it)) {
siblings_expansion(root_it->second.children(), max_dim - 1);
}
@@ -733,7 +1020,7 @@ class Simplex_tree {
private:
/** \brief Recursive expansion of the simplex tree.*/
void siblings_expansion(Siblings * siblings, // must contain elements
- int k) {
+ int k) {
if (dimension_ > k) {
dimension_ = k;
}
@@ -744,68 +1031,55 @@ class Simplex_tree {
static std::vector<std::pair<Vertex_handle, Node> > inter; // static, not thread-safe.
for (Dictionary_it s_h = siblings->members().begin();
- s_h != siblings->members().end(); ++s_h, ++next) {
+ s_h != siblings->members().end(); ++s_h, ++next) {
Simplex_handle root_sh = find_vertex(s_h->first);
if (has_children(root_sh)) {
intersection(
- inter, // output intersection
- next, // begin
- siblings->members().end(), // end
- root_sh->second.children()->members().begin(),
- root_sh->second.children()->members().end(),
- s_h->second.filtration());
+ inter, // output intersection
+ next, // begin
+ siblings->members().end(), // end
+ root_sh->second.children()->members().begin(),
+ root_sh->second.children()->members().end(),
+ s_h->second.filtration());
if (inter.size() != 0) {
- this->num_simplices_ += inter.size();
Siblings * new_sib = new Siblings(siblings, // oncles
- s_h->first, // parent
- inter); // boost::container::ordered_unique_range_t
+ s_h->first, // parent
+ inter); // boost::container::ordered_unique_range_t
inter.clear();
s_h->second.assign_children(new_sib);
siblings_expansion(new_sib, k - 1);
} else {
- s_h->second.assign_children(siblings); // ensure the children property
+ // ensure the children property
+ s_h->second.assign_children(siblings);
inter.clear();
}
}
}
}
+
/** \brief Intersects Dictionary 1 [begin1;end1) with Dictionary 2 [begin2,end2)
* and assigns the maximal possible Filtration_value to the Nodes. */
- void intersection(std::vector<std::pair<Vertex_handle, Node> >& intersection,
- Dictionary_it begin1, Dictionary_it end1,
- Dictionary_it begin2, Dictionary_it end2,
- Filtration_value filtration) {
+ static void intersection(std::vector<std::pair<Vertex_handle, Node> >& intersection,
+ Dictionary_it begin1, Dictionary_it end1,
+ Dictionary_it begin2, Dictionary_it end2,
+ Filtration_value filtration_) {
if (begin1 == end1 || begin2 == end2)
return; // ----->>
while (true) {
if (begin1->first == begin2->first) {
- intersection.push_back(
- std::pair<Vertex_handle, Node>(
- begin1->first,
- Node(NULL, maximum(begin1->second.filtration(), begin2->second.filtration(), filtration))));
- ++begin1;
- ++begin2;
- if (begin1 == end1 || begin2 == end2)
+ Filtration_value filt = (std::max)({begin1->second.filtration(), begin2->second.filtration(), filtration_});
+ intersection.emplace_back(begin1->first, Node(nullptr, filt));
+ if (++begin1 == end1 || ++begin2 == end2)
+ return; // ----->>
+ } else if (begin1->first < begin2->first) {
+ if (++begin1 == end1)
+ return;
+ } else /* begin1->first > begin2->first */ {
+ if (++begin2 == end2)
return; // ----->>
- } else {
- if (begin1->first < begin2->first) {
- ++begin1;
- if (begin1 == end1)
- return;
- } else {
- ++begin2;
- if (begin2 == end2)
- return; // ----->>
- }
}
}
}
- /** Maximum over 3 values.*/
- Filtration_value maximum(Filtration_value a, Filtration_value b,
- Filtration_value c) {
- Filtration_value max = (a < b) ? b : a;
- return ((max < c) ? c : max);
- }
public:
/** \brief Write the hasse diagram of the simplicial complex in os.
@@ -816,7 +1090,7 @@ class Simplex_tree {
* of the simplex, and fil is its filtration value. */
void print_hasse(std::ostream& os) {
os << num_simplices() << " " << std::endl;
- for (auto sh : filtration_simplex_range(Indexing_tag())) {
+ for (auto sh : filtration_simplex_range()) {
os << dimension(sh) << " ";
for (auto b_sh : boundary_simplex_range(sh)) {
os << key(b_sh) << " ";
@@ -825,12 +1099,125 @@ class Simplex_tree {
}
}
+ public:
+ /** \brief Browse the simplex tree to ensure the filtration is not decreasing.
+ * The simplex tree is browsed starting from the root until the leaf, and the filtration values are set with their
+ * parent value (increased), in case the values are decreasing.
+ * @return The filtration modification information.
+ * \post Some simplex tree functions require the filtration to be valid. `make_filtration_non_decreasing()`
+ * function is not launching `initialize_filtration()` but returns the filtration modification information. If the
+ * complex has changed , please call `initialize_filtration()` to recompute it.
+ */
+ bool make_filtration_non_decreasing() {
+ bool modified = false;
+ // Loop must be from the end to the beginning, as higher dimension simplex are always on the left part of the tree
+ for (auto& simplex : boost::adaptors::reverse(root_.members())) {
+ if (has_children(&simplex)) {
+ modified |= rec_make_filtration_non_decreasing(simplex.second.children());
+ }
+ }
+ return modified;
+ }
+
+ private:
+ /** \brief Recursively Browse the simplex tree to ensure the filtration is not decreasing.
+ * @param[in] sib Siblings to be parsed.
+ * @return The filtration modification information in order to trigger initialize_filtration.
+ */
+ bool rec_make_filtration_non_decreasing(Siblings * sib) {
+ bool modified = false;
+
+ // Loop must be from the end to the beginning, as higher dimension simplex are always on the left part of the tree
+ for (auto& simplex : boost::adaptors::reverse(sib->members())) {
+ // Find the maximum filtration value in the border
+ Boundary_simplex_range boundary = boundary_simplex_range(&simplex);
+ Boundary_simplex_iterator max_border = std::max_element(std::begin(boundary), std::end(boundary),
+ [](Simplex_handle sh1, Simplex_handle sh2) {
+ return filtration(sh1) < filtration(sh2);
+ });
+
+ Filtration_value max_filt_border_value = filtration(*max_border);
+ if (simplex.second.filtration() < max_filt_border_value) {
+ // Store the filtration modification information
+ modified = true;
+ simplex.second.assign_filtration(max_filt_border_value);
+ }
+ if (has_children(&simplex)) {
+ modified |= rec_make_filtration_non_decreasing(simplex.second.children());
+ }
+ }
+ // Make the modified information to be traced by upper call
+ return modified;
+ }
+
+ public:
+ /** \brief Prune above filtration value given as parameter.
+ * @param[in] filtration Maximum threshold value.
+ * @return The filtration modification information.
+ * \post Some simplex tree functions require the filtration to be valid. `prune_above_filtration()`
+ * function is not launching `initialize_filtration()` but returns the filtration modification information. If the
+ * complex has changed , please call `initialize_filtration()` to recompute it.
+ */
+ bool prune_above_filtration(Filtration_value filtration) {
+ return rec_prune_above_filtration(root(), filtration);
+ }
+
+ private:
+ bool rec_prune_above_filtration(Siblings* sib, Filtration_value filt) {
+ auto&& list = sib->members();
+ auto last = std::remove_if(list.begin(), list.end(), [=](Dit_value_t& simplex) {
+ if (simplex.second.filtration() <= filt) return false;
+ if (has_children(&simplex)) rec_delete(simplex.second.children());
+ return true;
+ });
+
+ bool modified = (last != list.end());
+ if (last == list.begin() && sib != root()) {
+ // Removing the whole siblings, parent becomes a leaf.
+ sib->oncles()->members()[sib->parent()].assign_children(sib->oncles());
+ delete sib;
+ return true;
+ } else {
+ // Keeping some elements of siblings. Remove the others, and recurse in the remaining ones.
+ list.erase(last, list.end());
+ for (auto&& simplex : list)
+ if (has_children(&simplex))
+ modified |= rec_prune_above_filtration(simplex.second.children(), filt);
+ }
+ return modified;
+ }
+
+ public:
+ /** \brief Remove a maximal simplex.
+ * @param[in] sh Simplex handle on the maximal simplex to remove.
+ * \pre Please check the simplex has no coface before removing it.
+ * \exception std::invalid_argument In debug mode, if sh has children.
+ * \post Be aware that removing is shifting data in a flat_map (initialize_filtration to be done).
+ */
+ void remove_maximal_simplex(Simplex_handle sh) {
+ // Guarantee the simplex has no children
+ GUDHI_CHECK(!has_children(sh),
+ std::invalid_argument("Simplex_tree::remove_maximal_simplex - argument has children"));
+
+ // Simplex is a leaf, it means the child is the Siblings owning the leaf
+ Siblings* child = sh->second.children();
+
+ if ((child->size() > 1) || (child == root())) {
+ // Not alone, just remove it from members
+ // Special case when child is the root of the simplex tree, just remove it from members
+ child->erase(sh);
+ } else {
+ // Sibling is emptied : must be deleted, and its parent must point on his own Sibling
+ child->oncles()->members().at(child->parent()).assign_children(child->oncles());
+ delete child;
+ }
+ }
+
private:
Vertex_handle null_vertex_;
/** \brief Upper bound on the filtration values of the simplices.*/
Filtration_value threshold_;
/** \brief Total number of simplices in the complex, without the empty simplex.*/
- unsigned int num_simplices_;
/** \brief Set of simplex tree Nodes representing the vertices.*/
Siblings root_;
/** \brief Simplices ordered according to a filtration.*/
@@ -840,8 +1227,8 @@ class Simplex_tree {
};
// Print a Simplex_tree in os.
-template<typename T1, typename T2, typename T3>
-std::ostream& operator<<(std::ostream & os, Simplex_tree<T1, T2, T3> & st) {
+template<typename...T>
+std::ostream& operator<<(std::ostream & os, Simplex_tree<T...> & st) {
for (auto sh : st.filtration_simplex_range()) {
os << st.dimension(sh) << " ";
for (auto v : st.simplex_vertex_range(sh)) {
@@ -851,35 +1238,66 @@ std::ostream& operator<<(std::ostream & os, Simplex_tree<T1, T2, T3> & st) {
}
return os;
}
-template<typename T1, typename T2, typename T3>
-std::istream& operator>>(std::istream & is, Simplex_tree<T1, T2, T3> & st) {
- // assert(st.num_simplices() == 0);
- std::vector<typename Simplex_tree<T1, T2, T3>::Vertex_handle> simplex;
- typename Simplex_tree<T1, T2, T3>::Filtration_value fil;
- typename Simplex_tree<T1, T2, T3>::Filtration_value max_fil = 0;
+template<typename...T>
+std::istream& operator>>(std::istream & is, Simplex_tree<T...> & st) {
+ typedef Simplex_tree<T...> ST;
+ std::vector<typename ST::Vertex_handle> simplex;
+ typename ST::Filtration_value fil;
+ typename ST::Filtration_value max_fil = 0;
int max_dim = -1;
- size_t num_simplices = 0;
- while (read_simplex(is, simplex, fil)) { // read all simplices in the file as a list of vertices
- ++num_simplices;
- int dim = static_cast<int>(simplex.size() - 1); // Warning : simplex_size needs to be casted in int - Can be 0
+ while (read_simplex(is, simplex, fil)) {
+ // read all simplices in the file as a list of vertices
+ // Warning : simplex_size needs to be casted in int - Can be 0
+ int dim = static_cast<int> (simplex.size() - 1);
if (max_dim < dim) {
max_dim = dim;
}
if (max_fil < fil) {
max_fil = fil;
}
- st.insert_simplex(simplex, fil); // insert every simplex in the simplex tree
+ // insert every simplex in the simplex tree
+ st.insert_simplex(simplex, fil);
simplex.clear();
}
- st.set_num_simplices(num_simplices);
st.set_dimension(max_dim);
st.set_filtration(max_fil);
return is;
}
+/** Model of SimplexTreeOptions.
+ *
+ * Maximum number of simplices to compute persistence is <CODE>std::numeric_limits<std::uint32_t>::max()</CODE>
+ * (about 4 billions of simplices). */
+struct Simplex_tree_options_full_featured {
+ typedef linear_indexing_tag Indexing_tag;
+ typedef int Vertex_handle;
+ typedef double Filtration_value;
+ typedef std::uint32_t Simplex_key;
+ static const bool store_key = true;
+ static const bool store_filtration = true;
+ static const bool contiguous_vertices = false;
+};
+
+/** Model of SimplexTreeOptions, faster than `Simplex_tree_options_full_featured` but note the unsafe
+ * `contiguous_vertices` option.
+ *
+ * Maximum number of simplices to compute persistence is <CODE>std::numeric_limits<std::uint32_t>::max()</CODE>
+ * (about 4 billions of simplices). */
+
+struct Simplex_tree_options_fast_persistence {
+ typedef linear_indexing_tag Indexing_tag;
+ typedef int Vertex_handle;
+ typedef float Filtration_value;
+ typedef std::uint32_t Simplex_key;
+ static const bool store_key = true;
+ static const bool store_filtration = true;
+ static const bool contiguous_vertices = true;
+};
+
/** @} */ // end defgroup simplex_tree
+
} // namespace Gudhi
-#endif // SRC_SIMPLEX_TREE_INCLUDE_GUDHI_SIMPLEX_TREE_H_
+#endif // SIMPLEX_TREE_H_
diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_iterators.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_iterators.h
index 06462c88..7e0a454d 100644
--- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_iterators.h
+++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_iterators.h
@@ -20,10 +20,14 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef SRC_SIMPLEX_TREE_INCLUDE_GUDHI_SIMPLEX_TREE_SIMPLEX_TREE_ITERATORS_H_
-#define SRC_SIMPLEX_TREE_INCLUDE_GUDHI_SIMPLEX_TREE_SIMPLEX_TREE_ITERATORS_H_
+#ifndef SIMPLEX_TREE_SIMPLEX_TREE_ITERATORS_H_
+#define SIMPLEX_TREE_SIMPLEX_TREE_ITERATORS_H_
#include <boost/iterator/iterator_facade.hpp>
+#include <boost/version.hpp>
+#if BOOST_VERSION >= 105600
+# include <boost/container/static_vector.hpp>
+#endif
#include <vector>
@@ -50,7 +54,7 @@ class Simplex_tree_simplex_vertex_iterator : public boost::iterator_facade<
explicit Simplex_tree_simplex_vertex_iterator(SimplexTree * st)
: // any end() iterator
- sib_(NULL),
+ sib_(nullptr),
v_(st->null_vertex()) {
}
@@ -95,21 +99,23 @@ class Simplex_tree_boundary_simplex_iterator : public boost::iterator_facade<
// any end() iterator
explicit Simplex_tree_boundary_simplex_iterator(SimplexTree * st)
- : last_(st->null_vertex()),
- sib_(NULL) {
+ : sib_(nullptr),
+ sh_(st->null_simplex()),
+ st_(st) {
}
- Simplex_tree_boundary_simplex_iterator(SimplexTree * st, Simplex_handle sh)
- : suffix_(),
+ template<class SimplexHandle>
+ Simplex_tree_boundary_simplex_iterator(SimplexTree * st, SimplexHandle sh)
+ : last_(sh->first),
+ sib_(nullptr),
st_(st) {
- last_ = sh->first;
Siblings * sib = st->self_siblings(sh);
next_ = sib->parent();
- sib_ = sib->oncles(); /* \todo check if NULL*/
- if (sib_ != NULL) {
+ sib_ = sib->oncles();
+ if (sib_ != nullptr) {
sh_ = sib_->find(next_);
} else {
- last_ = st->null_vertex();
+ sh_ = st->null_simplex();
} // vertex: == end()
}
@@ -117,34 +123,54 @@ class Simplex_tree_boundary_simplex_iterator : public boost::iterator_facade<
friend class boost::iterator_core_access;
// valid when iterating along the SAME boundary.
bool equal(Simplex_tree_boundary_simplex_iterator const& other) const {
- return (sib_ == other.sib_ && last_ == other.last_);
+ return sh_ == other.sh_;
}
Simplex_handle const& dereference() const {
+ assert(sh_ != st_->null_simplex());
return sh_;
}
void increment() {
- if (sib_ == NULL) {
- last_ = st_->null_vertex();
+ if (sib_ == nullptr) {
+ sh_ = st_->null_simplex();
return;
}
Siblings * for_sib = sib_;
- for (typename std::vector<Vertex_handle>::reverse_iterator rit = suffix_
- .rbegin(); rit != suffix_.rend(); ++rit) {
+ Siblings * new_sib = sib_->oncles();
+ auto rit = suffix_.rbegin();
+ if (SimplexTree::Options::contiguous_vertices && new_sib == nullptr && rit != suffix_.rend()) {
+ // We reached the root, use a short-cut to find a vertex. We could also
+ // optimize finding the second vertex of a segment, but people are
+ // expected to call endpoints().
+ assert(st_->contiguous_vertices());
+ sh_ = for_sib->members_.begin()+*rit;
+ for_sib = sh_->second.children();
+ ++rit;
+ }
+ for (; rit != suffix_.rend(); ++rit) {
sh_ = for_sib->find(*rit);
for_sib = sh_->second.children();
}
sh_ = for_sib->find(last_); // sh_ points to the right simplex now
suffix_.push_back(next_);
next_ = sib_->parent();
- sib_ = sib_->oncles();
+ sib_ = new_sib;
}
+ // Most of the storage should be moved to the range, iterators should be light.
Vertex_handle last_; // last vertex of the simplex
Vertex_handle next_; // next vertex to push in suffix_
+#if BOOST_VERSION >= 105600
+ // 40 seems a conservative bound on the dimension of a Simplex_tree for now,
+ // as it would not fit on the biggest hard-drive.
+ boost::container::static_vector<Vertex_handle, 40> suffix_;
+ // static_vector still has some overhead compared to a trivial hand-made
+ // version using std::aligned_storage, or compared to making suffix_ static.
+#else
std::vector<Vertex_handle> suffix_;
+#endif
Siblings * sib_; // where the next search will start from
Simplex_handle sh_; // current Simplex_handle in the boundary
SimplexTree * st_; // simplex containing the simplicial complex
@@ -164,13 +190,15 @@ class Simplex_tree_complex_simplex_iterator : public boost::iterator_facade<
// any end() iterator
Simplex_tree_complex_simplex_iterator()
- : st_(NULL) {
+ : sib_(nullptr),
+ st_(nullptr) {
}
explicit Simplex_tree_complex_simplex_iterator(SimplexTree * st)
- : st_(st) {
- if (st == NULL || st->root() == NULL || st->root()->members().empty()) {
- st_ = NULL;
+ : sib_(nullptr),
+ st_(st) {
+ if (st == nullptr || st->root() == nullptr || st->root()->members().empty()) {
+ st_ = nullptr;
} else {
sh_ = st->root()->members().begin();
sib_ = st->root();
@@ -185,10 +213,10 @@ class Simplex_tree_complex_simplex_iterator : public boost::iterator_facade<
// valid when iterating along the SAME boundary.
bool equal(Simplex_tree_complex_simplex_iterator const& other) const {
- if (other.st_ == NULL) {
- return (st_ == NULL);
+ if (other.st_ == nullptr) {
+ return (st_ == nullptr);
}
- if (st_ == NULL) {
+ if (st_ == nullptr) {
return false;
}
return (&(sh_->second) == &(other.sh_->second));
@@ -202,8 +230,8 @@ class Simplex_tree_complex_simplex_iterator : public boost::iterator_facade<
void increment() {
++sh_;
if (sh_ == sib_->members().end()) {
- if (sib_->oncles() == NULL) {
- st_ = NULL;
+ if (sib_->oncles() == nullptr) {
+ st_ = nullptr;
return;
} // reach the end
sh_ = sib_->oncles()->members().find(sib_->parent());
@@ -236,15 +264,19 @@ class Simplex_tree_skeleton_simplex_iterator : public boost::iterator_facade<
// any end() iterator
Simplex_tree_skeleton_simplex_iterator()
- : st_(NULL) {
+ : sib_(nullptr),
+ st_(nullptr),
+ dim_skel_(0),
+ curr_dim_(0) {
}
Simplex_tree_skeleton_simplex_iterator(SimplexTree * st, int dim_skel)
- : st_(st),
+ : sib_(nullptr),
+ st_(st),
dim_skel_(dim_skel),
curr_dim_(0) {
- if (st == NULL || st->root() == NULL || st->root()->members().empty()) {
- st_ = NULL;
+ if (st == nullptr || st->root() == nullptr || st->root()->members().empty()) {
+ st_ = nullptr;
} else {
sh_ = st->root()->members().begin();
sib_ = st->root();
@@ -260,10 +292,10 @@ class Simplex_tree_skeleton_simplex_iterator : public boost::iterator_facade<
// valid when iterating along the SAME boundary.
bool equal(Simplex_tree_skeleton_simplex_iterator const& other) const {
- if (other.st_ == NULL) {
- return (st_ == NULL);
+ if (other.st_ == nullptr) {
+ return (st_ == nullptr);
}
- if (st_ == NULL) {
+ if (st_ == nullptr) {
return false;
}
return (&(sh_->second) == &(other.sh_->second));
@@ -277,8 +309,8 @@ class Simplex_tree_skeleton_simplex_iterator : public boost::iterator_facade<
void increment() {
++sh_;
if (sh_ == sib_->members().end()) {
- if (sib_->oncles() == NULL) {
- st_ = NULL;
+ if (sib_->oncles() == nullptr) {
+ st_ = nullptr;
return;
} // reach the end
sh_ = sib_->oncles()->members().find(sib_->parent());
@@ -303,4 +335,4 @@ class Simplex_tree_skeleton_simplex_iterator : public boost::iterator_facade<
/* @} */ // end addtogroup simplex_tree
} // namespace Gudhi
-#endif // SRC_SIMPLEX_TREE_INCLUDE_GUDHI_SIMPLEX_TREE_SIMPLEX_TREE_ITERATORS_H_
+#endif // SIMPLEX_TREE_SIMPLEX_TREE_ITERATORS_H_
diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h
index 1f1a34cc..25d4888a 100644
--- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h
+++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h
@@ -20,8 +20,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef SRC_SIMPLEX_TREE_INCLUDE_GUDHI_SIMPLEX_TREE_SIMPLEX_TREE_NODE_EXPLICIT_STORAGE_H_
-#define SRC_SIMPLEX_TREE_INCLUDE_GUDHI_SIMPLEX_TREE_SIMPLEX_TREE_NODE_EXPLICIT_STORAGE_H_
+#ifndef SIMPLEX_TREE_SIMPLEX_TREE_NODE_EXPLICIT_STORAGE_H_
+#define SIMPLEX_TREE_SIMPLEX_TREE_NODE_EXPLICIT_STORAGE_H_
#include <vector>
@@ -39,65 +39,34 @@ namespace Gudhi {
* It stores explicitely its own filtration value and its own Simplex_key.
*/
template<class SimplexTree>
-class Simplex_tree_node_explicit_storage {
- public:
+struct Simplex_tree_node_explicit_storage : SimplexTree::Filtration_simplex_base, SimplexTree::Key_simplex_base {
typedef typename SimplexTree::Siblings Siblings;
typedef typename SimplexTree::Filtration_value Filtration_value;
typedef typename SimplexTree::Simplex_key Simplex_key;
- // Default constructor.
- Simplex_tree_node_explicit_storage()
- : children_(NULL),
- simplex_key_(-1),
- filtration_(0) {
- }
-
- Simplex_tree_node_explicit_storage(Siblings * sib,
- Filtration_value filtration)
- : children_(sib),
- simplex_key_(-1),
- filtration_(filtration) {
- }
-
- void assign_key(Simplex_key key) {
- simplex_key_ = key;
+ Simplex_tree_node_explicit_storage(Siblings * sib = nullptr,
+ Filtration_value filtration = 0)
+ : children_(sib) {
+ this->assign_filtration(filtration);
}
/*
- * Assign a children to the node
+ * Assign children to the node
*/
void assign_children(Siblings * children) {
children_ = children;
}
- /*
- *
- */
- void assign_filtration(double filtration_value) {
- filtration_ = filtration_value;
- }
-
- Filtration_value filtration() {
- return filtration_;
- }
/* Careful -> children_ can be NULL*/
Siblings * children() {
return children_;
}
- Simplex_key key() {
- return simplex_key_;
- }
-
private:
Siblings * children_;
-
- // Data attached to simplex, explicit storage
- Simplex_key simplex_key_;
- Filtration_value filtration_; // value in the filtration
};
/* @} */ // end addtogroup simplex_tree
} // namespace Gudhi
-#endif // SRC_SIMPLEX_TREE_INCLUDE_GUDHI_SIMPLEX_TREE_SIMPLEX_TREE_NODE_EXPLICIT_STORAGE_H_
+#endif // SIMPLEX_TREE_SIMPLEX_TREE_NODE_EXPLICIT_STORAGE_H_
diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_siblings.h b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_siblings.h
index 977fafa1..1eca7f6f 100644
--- a/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_siblings.h
+++ b/src/Simplex_tree/include/gudhi/Simplex_tree/Simplex_tree_siblings.h
@@ -20,11 +20,12 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef SRC_SIMPLEX_TREE_INCLUDE_GUDHI_SIMPLEX_TREE_SIMPLEX_TREE_SIBLINGS_H_
-#define SRC_SIMPLEX_TREE_INCLUDE_GUDHI_SIMPLEX_TREE_SIMPLEX_TREE_SIBLINGS_H_
+#ifndef SIMPLEX_TREE_SIMPLEX_TREE_SIBLINGS_H_
+#define SIMPLEX_TREE_SIMPLEX_TREE_SIBLINGS_H_
-#include "boost/container/flat_map.hpp"
-#include "Simplex_tree_node_explicit_storage.h"
+#include <gudhi/Simplex_tree/Simplex_tree_node_explicit_storage.h>
+
+#include <boost/container/flat_map.hpp>
#include <utility>
#include <vector>
@@ -56,7 +57,7 @@ class Simplex_tree_siblings {
/* Default constructor.*/
Simplex_tree_siblings()
- : oncles_(NULL),
+ : oncles_(nullptr),
parent_(-1),
members_() {
}
@@ -71,14 +72,14 @@ class Simplex_tree_siblings {
/* \brief Constructor with initialized set of members.
*
* 'members' must be sorted and unique.*/
- Simplex_tree_siblings(Simplex_tree_siblings * oncles, Vertex_handle parent,
- const std::vector<std::pair<Vertex_handle, Node> > & members)
+ template<typename RandomAccessVertexRange>
+ Simplex_tree_siblings(Simplex_tree_siblings * oncles, Vertex_handle parent, const RandomAccessVertexRange & members)
: oncles_(oncles),
parent_(parent),
members_(boost::container::ordered_unique_range, members.begin(),
members.end()) {
- for (auto map_it = members_.begin(); map_it != members_.end(); map_it++) {
- map_it->second.assign_children(this);
+ for (auto& map_el : members_) {
+ map_el.second.assign_children(this);
}
}
@@ -90,19 +91,12 @@ class Simplex_tree_siblings {
* present in the node.
*/
void insert(Vertex_handle v, Filtration_value filtration_value) {
- typename Dictionary::iterator sh = members_.find(v);
- if (sh != members_.end() && sh->second.filtration() > filtration_value) {
- sh->second.assign_filtration(filtration_value);
- return;
- }
- if (sh == members_.end()) {
- members_.insert(
- std::pair<Vertex_handle, Node>(v, Node(this, filtration_value)));
- return;
- }
+ auto ins = members_.emplace(v, Node(this, filtration_value));
+ if (!ins.second && filtration(ins.first) > filtration_value)
+ ins.first->second.assign_filtration(filtration_value);
}
- typename Dictionary::iterator find(Vertex_handle v) {
+ Dictionary_it find(Vertex_handle v) {
return members_.find(v);
}
@@ -110,7 +104,7 @@ class Simplex_tree_siblings {
return oncles_;
}
- Vertex_handle parent() {
+ Vertex_handle parent() const {
return parent_;
}
@@ -118,10 +112,14 @@ class Simplex_tree_siblings {
return members_;
}
- size_t size() {
+ size_t size() const {
return members_.size();
}
+ void erase(const Dictionary_it iterator) {
+ members_.erase(iterator);
+ }
+
Simplex_tree_siblings * oncles_;
Vertex_handle parent_;
Dictionary members_;
@@ -130,4 +128,4 @@ class Simplex_tree_siblings {
/* @} */ // end addtogroup simplex_tree
} // namespace Gudhi
-#endif // SRC_SIMPLEX_TREE_INCLUDE_GUDHI_SIMPLEX_TREE_SIMPLEX_TREE_SIBLINGS_H_
+#endif // SIMPLEX_TREE_SIMPLEX_TREE_SIBLINGS_H_
diff --git a/src/Simplex_tree/include/gudhi/Simplex_tree/indexing_tag.h b/src/Simplex_tree/include/gudhi/Simplex_tree/indexing_tag.h
index 69ffa44b..0adeb46d 100644
--- a/src/Simplex_tree/include/gudhi/Simplex_tree/indexing_tag.h
+++ b/src/Simplex_tree/include/gudhi/Simplex_tree/indexing_tag.h
@@ -20,8 +20,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef SRC_SIMPLEX_TREE_INCLUDE_GUDHI_SIMPLEX_TREE_INDEXING_TAG_H_
-#define SRC_SIMPLEX_TREE_INCLUDE_GUDHI_SIMPLEX_TREE_INDEXING_TAG_H_
+#ifndef SIMPLEX_TREE_INDEXING_TAG_H_
+#define SIMPLEX_TREE_INDEXING_TAG_H_
namespace Gudhi {
@@ -36,4 +36,4 @@ struct linear_indexing_tag {
// struct zigzag_indexing_tag {};
} // namespace Gudhi
-#endif // SRC_SIMPLEX_TREE_INCLUDE_GUDHI_SIMPLEX_TREE_INDEXING_TAG_H_
+#endif // SIMPLEX_TREE_INDEXING_TAG_H_
diff --git a/src/Simplex_tree/test/CMakeLists.txt b/src/Simplex_tree/test/CMakeLists.txt
index b6a1c0b6..e95d0782 100644
--- a/src/Simplex_tree/test/CMakeLists.txt
+++ b/src/Simplex_tree/test/CMakeLists.txt
@@ -1,21 +1,23 @@
cmake_minimum_required(VERSION 2.6)
-project(GUDHISimplexTreeUT)
+project(Simplex_tree_tests)
if (GCOVR_PATH)
# for gcovr to make coverage reports - Corbera Jenkins plugin
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage")
- set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fprofile-arcs -ftest-coverage")
endif()
if (GPROF_PATH)
# for gprof to make coverage reports - Jenkins
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
- set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -pg")
endif()
add_executable ( SimplexTreeUT simplex_tree_unit_test.cpp )
target_link_libraries(SimplexTreeUT ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
+if (TBB_FOUND)
+ target_link_libraries(SimplexTreeUT ${TBB_LIBRARIES})
+endif()
+
+# Do not forget to copy test files in current binary dir
+file(COPY "simplex_tree_for_unit_test.txt" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
# Unitary tests
add_test(NAME SimplexTreeUT
diff --git a/src/Simplex_tree/test/simplex_tree_unit_test.cpp b/src/Simplex_tree/test/simplex_tree_unit_test.cpp
index 6b0a1f3d..b1bb23b1 100644
--- a/src/Simplex_tree/test/simplex_tree_unit_test.cpp
+++ b/src/Simplex_tree/test/simplex_tree_unit_test.cpp
@@ -1,94 +1,92 @@
-#define BOOST_TEST_MODULE simplex_tree test
-#include <boost/test/included/unit_test.hpp>
-#include <boost/system/error_code.hpp>
-#include <boost/chrono/thread_clock.hpp>
#include <iostream>
#include <string>
-
+#include <algorithm>
#include <utility> // std::pair, std::make_pair
-
#include <cmath> // float comparison
#include <limits>
+#include <functional> // greater
+
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_MODULE "simplex_tree"
+#include <boost/test/unit_test.hpp>
+#include <boost/mpl/list.hpp>
-#include "gudhi/graph_simplicial_complex.h"
-#include "gudhi/reader_utils.h"
+// ^
+// /!\ Nothing else from Simplex_tree shall be included to test includes are well defined.
#include "gudhi/Simplex_tree.h"
using namespace Gudhi;
-typedef Simplex_tree<> typeST;
-typedef std::pair<typeST::Simplex_handle, bool> typePairSimplexBool;
-typedef std::vector<Vertex_handle> typeVectorVertex;
-typedef std::pair<typeVectorVertex, Filtration_value> typeSimplex;
+typedef boost::mpl::list<Simplex_tree<>, Simplex_tree<Simplex_tree_options_fast_persistence>> list_of_tested_variants;
-const Vertex_handle DEFAULT_VERTEX_HANDLE = (const Vertex_handle) -1;
+const Vertex_handle DEFAULT_VERTEX_HANDLE = (const Vertex_handle) - 1;
const Filtration_value DEFAULT_FILTRATION_VALUE = (const Filtration_value) 0.0;
+template<class typeST>
void test_empty_simplex_tree(typeST& tst) {
BOOST_CHECK(tst.null_vertex() == DEFAULT_VERTEX_HANDLE);
BOOST_CHECK(tst.filtration() == DEFAULT_FILTRATION_VALUE);
BOOST_CHECK(tst.num_vertices() == (size_t) 0);
BOOST_CHECK(tst.num_simplices() == (size_t) 0);
- typeST::Siblings* STRoot = tst.root();
- BOOST_CHECK(STRoot != NULL);
- BOOST_CHECK(STRoot->oncles() == NULL);
+ typename typeST::Siblings* STRoot = tst.root();
+ BOOST_CHECK(STRoot != nullptr);
+ BOOST_CHECK(STRoot->oncles() == nullptr);
BOOST_CHECK(STRoot->parent() == DEFAULT_VERTEX_HANDLE);
BOOST_CHECK(tst.dimension() == -1);
}
+template<class typeST>
void test_iterators_on_empty_simplex_tree(typeST& tst) {
std::cout << "Iterator on vertices: " << std::endl;
for (auto vertex : tst.complex_vertex_range()) {
std::cout << "vertice:" << vertex << std::endl;
- BOOST_CHECK(false); // shall be empty
+ BOOST_CHECK(false); // shall be empty
}
std::cout << "Iterator on simplices: " << std::endl;
for (auto simplex : tst.complex_simplex_range()) {
- BOOST_CHECK(simplex != simplex); // shall be empty - to remove warning of non-used simplex
+ BOOST_CHECK(simplex != simplex); // shall be empty - to remove warning of non-used simplex
}
std::cout
<< "Iterator on Simplices in the filtration, with [filtration value]:"
<< std::endl;
for (auto f_simplex : tst.filtration_simplex_range()) {
- BOOST_CHECK(false); // shall be empty
+ BOOST_CHECK(false); // shall be empty
std::cout << "test_iterators_on_empty_simplex_tree - filtration="
<< tst.filtration(f_simplex) << std::endl;
}
}
-BOOST_AUTO_TEST_CASE( simplex_tree_when_empty )
-{
- const Filtration_value DEFAULT_FILTRATION_VALUE = 0;
+BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_when_empty, typeST, list_of_tested_variants) {
+ typedef std::pair<typename typeST::Simplex_handle, bool> typePairSimplexBool;
+ typedef std::vector<Vertex_handle> typeVectorVertex;
- // TEST OF DEFAULT CONSTRUCTOR
std::cout << "********************************************************************" << std::endl;
std::cout << "TEST OF DEFAULT CONSTRUCTOR" << std::endl;
typeST st;
- test_empty_simplex_tree (st);
+ test_empty_simplex_tree(st);
- test_iterators_on_empty_simplex_tree (st);
+ test_iterators_on_empty_simplex_tree(st);
// TEST OF EMPTY INSERTION
std::cout << "TEST OF EMPTY INSERTION" << std::endl;
typeVectorVertex simplexVectorEmpty;
BOOST_CHECK(simplexVectorEmpty.empty() == true);
typePairSimplexBool returnEmptyValue = st.insert_simplex(simplexVectorEmpty,
- DEFAULT_FILTRATION_VALUE);
- BOOST_CHECK(returnEmptyValue.first == typeST::Simplex_handle(NULL));
+ DEFAULT_FILTRATION_VALUE);
+ BOOST_CHECK(returnEmptyValue.first == typename typeST::Simplex_handle(nullptr));
BOOST_CHECK(returnEmptyValue.second == true);
- test_empty_simplex_tree (st);
+ test_empty_simplex_tree(st);
- test_iterators_on_empty_simplex_tree (st);
+ test_iterators_on_empty_simplex_tree(st);
}
bool AreAlmostTheSame(float a, float b) {
return std::fabs(a - b) < std::numeric_limits<float>::epsilon();
}
-BOOST_AUTO_TEST_CASE( simplex_tree_from_file )
-{
+BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_from_file, typeST, list_of_tested_variants) {
// TEST OF INSERTION
std::cout << "********************************************************************" << std::endl;
std::cout << "TEST OF SIMPLEX TREE FROM A FILE" << std::endl;
@@ -105,50 +103,53 @@ BOOST_AUTO_TEST_CASE( simplex_tree_from_file )
// Check
BOOST_CHECK(st.num_simplices() == 143353);
BOOST_CHECK(st.dimension() == 3);
- BOOST_CHECK(st.filtration() == 0.4);
+ BOOST_CHECK(AreAlmostTheSame(st.filtration(), 0.4));
int previous_size = 0;
- for( auto f_simplex : st.filtration_simplex_range() )
- {
+ for (auto f_simplex : st.filtration_simplex_range()) {
// Size of simplex
int size = 0;
- for( auto vertex : st.simplex_vertex_range(f_simplex) )
- {
+ for (auto vertex : st.simplex_vertex_range(f_simplex)) {
+ // Remove warning
+ (void) vertex;
size++;
}
- BOOST_CHECK(AreAlmostTheSame(st.filtration(f_simplex),(0.1* size))); // Specific test: filtration = 0.1 * simplex_size
- BOOST_CHECK(previous_size <= size);// Check list is sorted (because of sorted filtrations in simplex_tree.txt)
+ BOOST_CHECK(AreAlmostTheSame(st.filtration(f_simplex), (0.1 * size))); // Specific test: filtration = 0.1 * simplex_size
+ BOOST_CHECK(previous_size <= size); // Check list is sorted (because of sorted filtrations in simplex_tree.txt)
previous_size = size;
}
simplex_tree_stream.close();
}
+template<class typeST, class typeSimplex>
void test_simplex_tree_contains(typeST& simplexTree, typeSimplex& simplex, int pos) {
auto f_simplex = simplexTree.filtration_simplex_range().begin() + pos;
std::cout << "test_simplex_tree_contains - filtration=" << simplexTree.filtration(*f_simplex) << "||" << simplex.second << std::endl;
- BOOST_CHECK( AreAlmostTheSame(simplexTree.filtration(*f_simplex),simplex.second) );
+ BOOST_CHECK(AreAlmostTheSame(simplexTree.filtration(*f_simplex), simplex.second));
- int simplexIndex=simplex.first.size()-1;
- for( auto vertex : simplexTree.simplex_vertex_range(*f_simplex) )
- {
+ int simplexIndex = simplex.first.size() - 1;
+ std::sort(simplex.first.begin(), simplex.first.end()); // if the simplex wasn't sorted, the next test could fail
+ for (auto vertex : simplexTree.simplex_vertex_range(*f_simplex)) {
std::cout << "test_simplex_tree_contains - vertex=" << vertex << "||" << simplex.first.at(simplexIndex) << std::endl;
- BOOST_CHECK(vertex == simplex.first.at(simplexIndex));
+ BOOST_CHECK(vertex == simplex.first.at(simplexIndex));
BOOST_CHECK(simplexIndex >= 0);
simplexIndex--;
}
}
+template<class typeST, class typePairSimplexBool>
void test_simplex_tree_insert_returns_true(const typePairSimplexBool& returnValue) {
BOOST_CHECK(returnValue.second == true);
- typeST::Simplex_handle shReturned = returnValue.first; // Simplex_handle = boost::container::flat_map< Vertex_handle, Node >::iterator
- BOOST_CHECK(shReturned != typeST::Simplex_handle(NULL));
+ typename typeST::Simplex_handle shReturned = returnValue.first; // Simplex_handle = boost::container::flat_map< Vertex_handle, Node >::iterator
+ BOOST_CHECK(shReturned != typename typeST::Simplex_handle(nullptr));
}
// Global variables
Filtration_value max_fil = DEFAULT_FILTRATION_VALUE;
int dim_max = -1;
+template<class typeST, class Filtration_value>
void set_and_test_simplex_tree_dim_fil(typeST& simplexTree, int vectorSize, const Filtration_value& fil) {
if (vectorSize > dim_max + 1) {
dim_max = vectorSize - 1;
@@ -162,24 +163,32 @@ void set_and_test_simplex_tree_dim_fil(typeST& simplexTree, int vectorSize, cons
std::cout << " set_and_test_simplex_tree_dim_fil - max_fil=" << max_fil
<< std::endl;
}
- unsigned int nb_simplices = simplexTree.num_simplices() + 1;
- simplexTree.set_num_simplices(nb_simplices);
BOOST_CHECK(simplexTree.dimension() == dim_max);
BOOST_CHECK(AreAlmostTheSame(simplexTree.filtration(), max_fil));
- BOOST_CHECK(simplexTree.num_simplices() == nb_simplices);
+
+ // Another way to count simplices:
+ size_t num_simp = 0;
+ for (auto f_simplex : simplexTree.complex_simplex_range()) {
+ // Remove warning
+ (void) f_simplex;
+ num_simp++;
+ }
+
+ BOOST_CHECK(simplexTree.num_simplices() == num_simp);
}
-BOOST_AUTO_TEST_CASE( simplex_tree_insertion )
-{
+BOOST_AUTO_TEST_CASE_TEMPLATE(simplex_tree_insertion, typeST, list_of_tested_variants) {
+ typedef std::pair<typename typeST::Simplex_handle, bool> typePairSimplexBool;
+ typedef std::vector<Vertex_handle> typeVectorVertex;
+ typedef std::pair<typeVectorVertex, Filtration_value> typeSimplex;
const Filtration_value FIRST_FILTRATION_VALUE = 0.1;
const Filtration_value SECOND_FILTRATION_VALUE = 0.2;
const Filtration_value THIRD_FILTRATION_VALUE = 0.3;
const Filtration_value FOURTH_FILTRATION_VALUE = 0.4;
- Vertex_handle FIRST_VERTEX_HANDLE = (Vertex_handle) 0;
- Vertex_handle SECOND_VERTEX_HANDLE = (Vertex_handle) 1;
- Vertex_handle THIRD_VERTEX_HANDLE = (Vertex_handle) 2;
- Vertex_handle FOURTH_VERTEX_HANDLE = (Vertex_handle) 3;
+ // reset since we run the test several times
+ dim_max = -1;
+ max_fil = DEFAULT_FILTRATION_VALUE;
// TEST OF INSERTION
std::cout << "********************************************************************" << std::endl;
@@ -188,171 +197,131 @@ BOOST_AUTO_TEST_CASE( simplex_tree_insertion )
// ++ FIRST
std::cout << " - INSERT 0" << std::endl;
- typeVectorVertex firstSimplexVector;
- firstSimplexVector.push_back(FIRST_VERTEX_HANDLE);
- BOOST_CHECK( firstSimplexVector.size() == 1 );
- typeSimplex firstSimplex = std::make_pair(
- firstSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
- typePairSimplexBool returnValue = st.insert_simplex(firstSimplex.first,
- firstSimplex.second);
-
- test_simplex_tree_insert_returns_true (returnValue);
+ typeVectorVertex firstSimplexVector{0};
+ BOOST_CHECK(firstSimplexVector.size() == 1);
+ typeSimplex firstSimplex = std::make_pair(firstSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
+ typePairSimplexBool returnValue = st.insert_simplex(firstSimplex.first, firstSimplex.second);
+
+ test_simplex_tree_insert_returns_true<typeST>(returnValue);
set_and_test_simplex_tree_dim_fil(st, firstSimplexVector.size(), firstSimplex.second);
- BOOST_CHECK( st.num_vertices() == (size_t)1 );
+ BOOST_CHECK(st.num_vertices() == (size_t) 1);
// ++ SECOND
std::cout << " - INSERT 1" << std::endl;
- typeVectorVertex secondSimplexVector;
- secondSimplexVector.push_back(SECOND_VERTEX_HANDLE);
- BOOST_CHECK( secondSimplexVector.size() == 1 );
- typeSimplex secondSimplex = std::make_pair(
- secondSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
- returnValue =
- st.insert_simplex ( secondSimplex.first, secondSimplex.second );
-
- test_simplex_tree_insert_returns_true (returnValue);
+ typeVectorVertex secondSimplexVector{1};
+ BOOST_CHECK(secondSimplexVector.size() == 1);
+ typeSimplex secondSimplex = std::make_pair(secondSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
+ returnValue = st.insert_simplex(secondSimplex.first, secondSimplex.second);
+
+ test_simplex_tree_insert_returns_true<typeST>(returnValue);
set_and_test_simplex_tree_dim_fil(st, secondSimplexVector.size(), secondSimplex.second);
- BOOST_CHECK( st.num_vertices() == (size_t)2 );
+ BOOST_CHECK(st.num_vertices() == (size_t) 2);
// ++ THIRD
std::cout << " - INSERT (0,1)" << std::endl;
- typeVectorVertex thirdSimplexVector;
- thirdSimplexVector.push_back(FIRST_VERTEX_HANDLE);
- thirdSimplexVector.push_back(SECOND_VERTEX_HANDLE);
- BOOST_CHECK( thirdSimplexVector.size() == 2 );
- typeSimplex thirdSimplex = std::make_pair(
- thirdSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
- returnValue =
- st.insert_simplex ( thirdSimplex.first, thirdSimplex.second );
-
- test_simplex_tree_insert_returns_true (returnValue);
+ typeVectorVertex thirdSimplexVector{0, 1};
+ BOOST_CHECK(thirdSimplexVector.size() == 2);
+ typeSimplex thirdSimplex = std::make_pair(thirdSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
+ returnValue = st.insert_simplex(thirdSimplex.first, thirdSimplex.second);
+
+ test_simplex_tree_insert_returns_true<typeST>(returnValue);
set_and_test_simplex_tree_dim_fil(st, thirdSimplexVector.size(), thirdSimplex.second);
- BOOST_CHECK( st.num_vertices() == (size_t)2 ); // Not incremented !!
+ BOOST_CHECK(st.num_vertices() == (size_t) 2); // Not incremented !!
// ++ FOURTH
std::cout << " - INSERT 2" << std::endl;
- typeVectorVertex fourthSimplexVector;
- fourthSimplexVector.push_back(THIRD_VERTEX_HANDLE);
- BOOST_CHECK( fourthSimplexVector.size() == 1 );
- typeSimplex fourthSimplex = std::make_pair(
- fourthSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
- returnValue =
- st.insert_simplex ( fourthSimplex.first, fourthSimplex.second );
-
- test_simplex_tree_insert_returns_true (returnValue);
+ typeVectorVertex fourthSimplexVector{2};
+ BOOST_CHECK(fourthSimplexVector.size() == 1);
+ typeSimplex fourthSimplex = std::make_pair(fourthSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
+ returnValue = st.insert_simplex(fourthSimplex.first, fourthSimplex.second);
+
+ test_simplex_tree_insert_returns_true<typeST>(returnValue);
set_and_test_simplex_tree_dim_fil(st, fourthSimplexVector.size(), fourthSimplex.second);
- BOOST_CHECK( st.num_vertices() == (size_t)3 );
+ BOOST_CHECK(st.num_vertices() == (size_t) 3);
// ++ FIFTH
std::cout << " - INSERT (2,0)" << std::endl;
- typeVectorVertex fifthSimplexVector;
- fifthSimplexVector.push_back(THIRD_VERTEX_HANDLE);
- fifthSimplexVector.push_back(FIRST_VERTEX_HANDLE);
- BOOST_CHECK( fifthSimplexVector.size() == 2 );
- typeSimplex fifthSimplex = std::make_pair(
- fifthSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
- returnValue =
- st.insert_simplex ( fifthSimplex.first, fifthSimplex.second );
-
- test_simplex_tree_insert_returns_true (returnValue);
+ typeVectorVertex fifthSimplexVector{2, 0};
+ BOOST_CHECK(fifthSimplexVector.size() == 2);
+ typeSimplex fifthSimplex = std::make_pair(fifthSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
+ returnValue = st.insert_simplex(fifthSimplex.first, fifthSimplex.second);
+
+ test_simplex_tree_insert_returns_true<typeST>(returnValue);
set_and_test_simplex_tree_dim_fil(st, fifthSimplexVector.size(), fifthSimplex.second);
- BOOST_CHECK( st.num_vertices() == (size_t)3 ); // Not incremented !!
+ BOOST_CHECK(st.num_vertices() == (size_t) 3); // Not incremented !!
// ++ SIXTH
std::cout << " - INSERT (2,1)" << std::endl;
- typeVectorVertex sixthSimplexVector;
- sixthSimplexVector.push_back(THIRD_VERTEX_HANDLE);
- sixthSimplexVector.push_back(SECOND_VERTEX_HANDLE);
- BOOST_CHECK( sixthSimplexVector.size() == 2 );
- typeSimplex sixthSimplex = std::make_pair(
- sixthSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
- returnValue =
- st.insert_simplex ( sixthSimplex.first, sixthSimplex.second );
-
- test_simplex_tree_insert_returns_true (returnValue);
+ typeVectorVertex sixthSimplexVector{2, 1};
+ BOOST_CHECK(sixthSimplexVector.size() == 2);
+ typeSimplex sixthSimplex = std::make_pair(sixthSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
+ returnValue = st.insert_simplex(sixthSimplex.first, sixthSimplex.second);
+
+ test_simplex_tree_insert_returns_true<typeST>(returnValue);
set_and_test_simplex_tree_dim_fil(st, sixthSimplexVector.size(), sixthSimplex.second);
- BOOST_CHECK( st.num_vertices() == (size_t)3 ); // Not incremented !!
+ BOOST_CHECK(st.num_vertices() == (size_t) 3); // Not incremented !!
// ++ SEVENTH
std::cout << " - INSERT (2,1,0)" << std::endl;
- typeVectorVertex seventhSimplexVector;
- seventhSimplexVector.push_back(THIRD_VERTEX_HANDLE);
- seventhSimplexVector.push_back(SECOND_VERTEX_HANDLE);
- seventhSimplexVector.push_back(FIRST_VERTEX_HANDLE);
- BOOST_CHECK( seventhSimplexVector.size() == 3 );
- typeSimplex seventhSimplex = std::make_pair(
- seventhSimplexVector, Filtration_value(THIRD_FILTRATION_VALUE));
- returnValue =
- st.insert_simplex ( seventhSimplex.first, seventhSimplex.second );
-
- test_simplex_tree_insert_returns_true (returnValue);
+ typeVectorVertex seventhSimplexVector{2, 1, 0};
+ BOOST_CHECK(seventhSimplexVector.size() == 3);
+ typeSimplex seventhSimplex = std::make_pair(seventhSimplexVector, Filtration_value(THIRD_FILTRATION_VALUE));
+ returnValue = st.insert_simplex(seventhSimplex.first, seventhSimplex.second);
+
+ test_simplex_tree_insert_returns_true<typeST>(returnValue);
set_and_test_simplex_tree_dim_fil(st, seventhSimplexVector.size(), seventhSimplex.second);
- BOOST_CHECK( st.num_vertices() == (size_t)3 ); // Not incremented !!
+ BOOST_CHECK(st.num_vertices() == (size_t) 3); // Not incremented !!
// ++ EIGHTH
std::cout << " - INSERT 3" << std::endl;
- typeVectorVertex eighthSimplexVector;
- eighthSimplexVector.push_back(FOURTH_VERTEX_HANDLE);
- BOOST_CHECK( eighthSimplexVector.size() == 1 );
- typeSimplex eighthSimplex = std::make_pair(
- eighthSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
- returnValue =
- st.insert_simplex ( eighthSimplex.first, eighthSimplex.second );
-
- test_simplex_tree_insert_returns_true (returnValue);
+ typeVectorVertex eighthSimplexVector{3};
+ BOOST_CHECK(eighthSimplexVector.size() == 1);
+ typeSimplex eighthSimplex = std::make_pair(eighthSimplexVector, Filtration_value(FIRST_FILTRATION_VALUE));
+ returnValue = st.insert_simplex(eighthSimplex.first, eighthSimplex.second);
+
+ test_simplex_tree_insert_returns_true<typeST>(returnValue);
set_and_test_simplex_tree_dim_fil(st, eighthSimplexVector.size(), eighthSimplex.second);
- BOOST_CHECK( st.num_vertices() == (size_t)4 );
+ BOOST_CHECK(st.num_vertices() == (size_t) 4);
// ++ NINETH
std::cout << " - INSERT (3,0)" << std::endl;
- typeVectorVertex ninethSimplexVector;
- ninethSimplexVector.push_back(FOURTH_VERTEX_HANDLE);
- ninethSimplexVector.push_back(FIRST_VERTEX_HANDLE);
- BOOST_CHECK( ninethSimplexVector.size() == 2 );
- typeSimplex ninethSimplex = std::make_pair(
- ninethSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
- returnValue =
- st.insert_simplex ( ninethSimplex.first, ninethSimplex.second );
-
- test_simplex_tree_insert_returns_true (returnValue);
+ typeVectorVertex ninethSimplexVector{3, 0};
+ BOOST_CHECK(ninethSimplexVector.size() == 2);
+ typeSimplex ninethSimplex = std::make_pair(ninethSimplexVector, Filtration_value(SECOND_FILTRATION_VALUE));
+ returnValue = st.insert_simplex(ninethSimplex.first, ninethSimplex.second);
+
+ test_simplex_tree_insert_returns_true<typeST>(returnValue);
set_and_test_simplex_tree_dim_fil(st, ninethSimplexVector.size(), ninethSimplex.second);
- BOOST_CHECK( st.num_vertices() == (size_t)4 ); // Not incremented !!
+ BOOST_CHECK(st.num_vertices() == (size_t) 4); // Not incremented !!
// ++ TENTH
std::cout << " - INSERT 0 (already inserted)" << std::endl;
- typeVectorVertex tenthSimplexVector;
- tenthSimplexVector.push_back(FIRST_VERTEX_HANDLE);
- BOOST_CHECK( tenthSimplexVector.size() == 1 );
- typeSimplex tenthSimplex = std::make_pair(
- tenthSimplexVector, Filtration_value(FOURTH_FILTRATION_VALUE)); // With a different filtration value
- returnValue =
- st.insert_simplex ( tenthSimplex.first, tenthSimplex.second );
+ typeVectorVertex tenthSimplexVector{0};
+ BOOST_CHECK(tenthSimplexVector.size() == 1);
+ // With a different filtration value
+ typeSimplex tenthSimplex = std::make_pair(tenthSimplexVector, Filtration_value(FOURTH_FILTRATION_VALUE));
+ returnValue = st.insert_simplex(tenthSimplex.first, tenthSimplex.second);
BOOST_CHECK(returnValue.second == false);
- typeST::Simplex_handle shReturned = returnValue.first; // Simplex_handle = boost::container::flat_map< Vertex_handle, Node >::iterator
- BOOST_CHECK(shReturned == typeST::Simplex_handle(NULL));
- BOOST_CHECK( st.num_vertices() == (size_t)4 ); // Not incremented !!
- BOOST_CHECK( st.dimension() == dim_max );
- BOOST_CHECK( AreAlmostTheSame(st.filtration(), max_fil) );
+ typename typeST::Simplex_handle shReturned = returnValue.first; // Simplex_handle = boost::container::flat_map< Vertex_handle, Node >::iterator
+ BOOST_CHECK(shReturned == typename typeST::Simplex_handle(nullptr));
+ BOOST_CHECK(st.num_vertices() == (size_t) 4); // Not incremented !!
+ BOOST_CHECK(st.dimension() == dim_max);
+ BOOST_CHECK(AreAlmostTheSame(st.filtration(), max_fil));
// ++ ELEVENTH
std::cout << " - INSERT (2,1,0) (already inserted)" << std::endl;
- typeVectorVertex eleventhSimplexVector;
- eleventhSimplexVector.push_back(THIRD_VERTEX_HANDLE);
- eleventhSimplexVector.push_back(SECOND_VERTEX_HANDLE);
- eleventhSimplexVector.push_back(FIRST_VERTEX_HANDLE);
- BOOST_CHECK( eleventhSimplexVector.size() == 3 );
- typeSimplex eleventhSimplex = std::make_pair(
- eleventhSimplexVector, Filtration_value(FOURTH_FILTRATION_VALUE));
- returnValue =
- st.insert_simplex ( eleventhSimplex.first, eleventhSimplex.second );
+ typeVectorVertex eleventhSimplexVector{2, 1, 0};
+ BOOST_CHECK(eleventhSimplexVector.size() == 3);
+ typeSimplex eleventhSimplex = std::make_pair(eleventhSimplexVector, Filtration_value(FOURTH_FILTRATION_VALUE));
+ returnValue = st.insert_simplex(eleventhSimplex.first, eleventhSimplex.second);
BOOST_CHECK(returnValue.second == false);
- shReturned = returnValue.first; // Simplex_handle = boost::container::flat_map< Vertex_handle, Node >::iterator
- BOOST_CHECK(shReturned == typeST::Simplex_handle(NULL));
- BOOST_CHECK( st.num_vertices() == (size_t)4 );// Not incremented !!
- BOOST_CHECK( st.dimension() == dim_max );
- BOOST_CHECK( AreAlmostTheSame(st.filtration(), max_fil) );
+ shReturned = returnValue.first; // Simplex_handle = boost::container::flat_map< Vertex_handle, Node >::iterator
+ BOOST_CHECK(shReturned == typename typeST::Simplex_handle(nullptr));
+ BOOST_CHECK(st.num_vertices() == (size_t) 4); // Not incremented !!
+ BOOST_CHECK(st.dimension() == dim_max);
+ BOOST_CHECK(AreAlmostTheSame(st.filtration(), max_fil));
/* Inserted simplex: */
/* 1 */
@@ -372,119 +341,154 @@ BOOST_AUTO_TEST_CASE( simplex_tree_insertion )
// [0.3] 2 1 0
// !! Be careful, simplex are sorted by filtration value on insertion !!
std::cout << "simplex_tree_insertion - first - 0" << std::endl;
- test_simplex_tree_contains(st, firstSimplex, 0);// (0) -> 0
+ test_simplex_tree_contains(st, firstSimplex, 0); // (0) -> 0
std::cout << "simplex_tree_insertion - second - 1" << std::endl;
- test_simplex_tree_contains(st, secondSimplex, 1);// (1) -> 1
+ test_simplex_tree_contains(st, secondSimplex, 1); // (1) -> 1
std::cout << "simplex_tree_insertion - third - 4" << std::endl;
- test_simplex_tree_contains(st, thirdSimplex, 4);// (0,1) -> 4
+ test_simplex_tree_contains(st, thirdSimplex, 4); // (0,1) -> 4
std::cout << "simplex_tree_insertion - fourth - 2" << std::endl;
- test_simplex_tree_contains(st, fourthSimplex, 2);// (2) -> 2
+ test_simplex_tree_contains(st, fourthSimplex, 2); // (2) -> 2
std::cout << "simplex_tree_insertion - fifth - 5" << std::endl;
- test_simplex_tree_contains(st, fifthSimplex, 5);// (2,0) -> 5
+ test_simplex_tree_contains(st, fifthSimplex, 5); // (2,0) -> 5
std::cout << "simplex_tree_insertion - sixth - 6" << std::endl;
- test_simplex_tree_contains(st, sixthSimplex, 6);//(2,1) -> 6
+ test_simplex_tree_contains(st, sixthSimplex, 6); //(2,1) -> 6
std::cout << "simplex_tree_insertion - seventh - 8" << std::endl;
- test_simplex_tree_contains(st, seventhSimplex, 8);// (2,1,0) -> 8
+ test_simplex_tree_contains(st, seventhSimplex, 8); // (2,1,0) -> 8
std::cout << "simplex_tree_insertion - eighth - 3" << std::endl;
- test_simplex_tree_contains(st, eighthSimplex, 3);// (3) -> 3
+ test_simplex_tree_contains(st, eighthSimplex, 3); // (3) -> 3
std::cout << "simplex_tree_insertion - nineth - 7" << std::endl;
- test_simplex_tree_contains(st, ninethSimplex, 7);// (3,0) -> 7
+ test_simplex_tree_contains(st, ninethSimplex, 7); // (3,0) -> 7
// Display the Simplex_tree - Can not be done in the middle of 2 inserts
std::cout << "The complex contains " << st.num_simplices() << " simplices" << std::endl;
std::cout << " - dimension " << st.dimension() << " - filtration " << st.filtration() << std::endl;
std::cout << std::endl << std::endl << "Iterator on Simplices in the filtration, with [filtration value]:" << std::endl;
- for( auto f_simplex : st.filtration_simplex_range() )
- {
+ for (auto f_simplex : st.filtration_simplex_range()) {
std::cout << " " << "[" << st.filtration(f_simplex) << "] ";
- for( auto vertex : st.simplex_vertex_range(f_simplex) )
- {
- std::cout << (int)vertex << " ";
+ for (auto vertex : st.simplex_vertex_range(f_simplex)) {
+ std::cout << (int) vertex << " ";
}
std::cout << std::endl;
}
}
-BOOST_AUTO_TEST_CASE( NSimplexAndSubfaces_tree_insertion )
-{
- Vertex_handle FIRST_VERTEX_HANDLE = (Vertex_handle)0;
- Vertex_handle SECOND_VERTEX_HANDLE = (Vertex_handle) 1;
- Vertex_handle THIRD_VERTEX_HANDLE = (Vertex_handle) 2;
- Vertex_handle FOURTH_VERTEX_HANDLE = (Vertex_handle) 3;
- Vertex_handle FIFTH_VERTEX_HANDLE = (Vertex_handle) 4;
- Vertex_handle SIXTH_VERTEX_HANDLE = (Vertex_handle) 5;
- Vertex_handle SEVENTH_VERTEX_HANDLE = (Vertex_handle) 6;
- Vertex_handle EIGHTH_VERTEX_HANDLE = (Vertex_handle) 7;
-
- // TEST OF INSERTION
+BOOST_AUTO_TEST_CASE_TEMPLATE(NSimplexAndSubfaces_tree_insertion, typeST, list_of_tested_variants) {
+ typedef std::pair<typename typeST::Simplex_handle, bool> typePairSimplexBool;
+ typedef std::vector<Vertex_handle> typeVectorVertex;
+ typedef std::pair<typeVectorVertex, Filtration_value> typeSimplex;
std::cout << "********************************************************************" << std::endl;
- std::cout << "TEST OF INSERTION" << std::endl;
+ std::cout << "TEST OF RECURSIVE INSERTION" << std::endl;
typeST st;
+ typePairSimplexBool returnValue;
+ int position = 0;
// ++ FIRST
std::cout << " - INSERT (2,1,0)" << std::endl;
- typeVectorVertex SimplexVector1;
- SimplexVector1.push_back(THIRD_VERTEX_HANDLE);
- SimplexVector1.push_back(SECOND_VERTEX_HANDLE);
- SimplexVector1.push_back(FIRST_VERTEX_HANDLE);
- BOOST_CHECK( SimplexVector1.size() == 3 );
- st.insert_simplex_and_subfaces ( SimplexVector1 );
-
- BOOST_CHECK( st.num_vertices() == (size_t)3 ); // +3 (2, 1 and 0 are not existing)
+ typeVectorVertex SimplexVector1{2, 1, 0};
+ BOOST_CHECK(SimplexVector1.size() == 3);
+ returnValue = st.insert_simplex_and_subfaces(SimplexVector1);
+
+ BOOST_CHECK(st.num_vertices() == (size_t) 3); // +3 (2, 1 and 0 are not existing)
+
+ // Check it is well inserted
+ BOOST_CHECK(true == returnValue.second);
+ position = 0;
+ std::sort(SimplexVector1.begin(), SimplexVector1.end(), std::greater<Vertex_handle>());
+ for (auto vertex : st.simplex_vertex_range(returnValue.first)) {
+ // Check returned Simplex_handle
+ std::cout << "vertex = " << vertex << " | vector[" << position << "] = " << SimplexVector1[position] << std::endl;
+ BOOST_CHECK(vertex == SimplexVector1[position]);
+ position++;
+ }
// ++ SECOND
std::cout << " - INSERT 3" << std::endl;
- typeVectorVertex SimplexVector2;
- SimplexVector2.push_back(FOURTH_VERTEX_HANDLE);
- BOOST_CHECK( SimplexVector2.size() == 1 );
- st.insert_simplex_and_subfaces ( SimplexVector2 );
-
- BOOST_CHECK( st.num_vertices() == (size_t)4 ); // +1 (3 is not existing)
+ typeVectorVertex SimplexVector2{3};
+ BOOST_CHECK(SimplexVector2.size() == 1);
+ returnValue = st.insert_simplex_and_subfaces(SimplexVector2);
+
+ BOOST_CHECK(st.num_vertices() == (size_t) 4); // +1 (3 is not existing)
+
+ // Check it is well inserted
+ BOOST_CHECK(true == returnValue.second);
+ position = 0;
+ std::sort(SimplexVector2.begin(), SimplexVector2.end(), std::greater<Vertex_handle>());
+ for (auto vertex : st.simplex_vertex_range(returnValue.first)) {
+ // Check returned Simplex_handle
+ std::cout << "vertex = " << vertex << " | vector[" << position << "] = " << SimplexVector2[position] << std::endl;
+ BOOST_CHECK(vertex == SimplexVector2[position]);
+ position++;
+ }
// ++ THIRD
std::cout << " - INSERT (0,3)" << std::endl;
- typeVectorVertex SimplexVector3;
- SimplexVector3.push_back(FOURTH_VERTEX_HANDLE);
- SimplexVector3.push_back(FIRST_VERTEX_HANDLE);
- BOOST_CHECK( SimplexVector3.size() == 2 );
- st.insert_simplex_and_subfaces ( SimplexVector3 );
-
- BOOST_CHECK( st.num_vertices() == (size_t)4 ); // Not incremented (all are existing)
+ typeVectorVertex SimplexVector3{3, 0};
+ BOOST_CHECK(SimplexVector3.size() == 2);
+ returnValue = st.insert_simplex_and_subfaces(SimplexVector3);
+
+ BOOST_CHECK(st.num_vertices() == (size_t) 4); // Not incremented (all are existing)
+
+ // Check it is well inserted
+ BOOST_CHECK(true == returnValue.second);
+ position = 0;
+ std::sort(SimplexVector3.begin(), SimplexVector3.end(), std::greater<Vertex_handle>());
+ for (auto vertex : st.simplex_vertex_range(returnValue.first)) {
+ // Check returned Simplex_handle
+ std::cout << "vertex = " << vertex << " | vector[" << position << "] = " << SimplexVector3[position] << std::endl;
+ BOOST_CHECK(vertex == SimplexVector3[position]);
+ position++;
+ }
// ++ FOURTH
std::cout << " - INSERT (1,0) (already inserted)" << std::endl;
- typeVectorVertex SimplexVector4;
- SimplexVector4.push_back(SECOND_VERTEX_HANDLE);
- SimplexVector4.push_back(FIRST_VERTEX_HANDLE);
- BOOST_CHECK( SimplexVector4.size() == 2 );
- st.insert_simplex_and_subfaces ( SimplexVector4 );
+ typeVectorVertex SimplexVector4{1, 0};
+ BOOST_CHECK(SimplexVector4.size() == 2);
+ returnValue = st.insert_simplex_and_subfaces(SimplexVector4);
+
+ BOOST_CHECK(st.num_vertices() == (size_t) 4); // Not incremented (all are existing)
- BOOST_CHECK( st.num_vertices() == (size_t)4 ); // Not incremented (all are existing)
+ // Check it was not inserted (already there from {2,1,0} insertion)
+ BOOST_CHECK(false == returnValue.second);
// ++ FIFTH
std::cout << " - INSERT (3,4,5)" << std::endl;
- typeVectorVertex SimplexVector5;
- SimplexVector5.push_back(FOURTH_VERTEX_HANDLE);
- SimplexVector5.push_back(FIFTH_VERTEX_HANDLE);
- SimplexVector5.push_back(SIXTH_VERTEX_HANDLE);
- BOOST_CHECK( SimplexVector5.size() == 3 );
- st.insert_simplex_and_subfaces ( SimplexVector5 );
-
- BOOST_CHECK( st.num_vertices() == (size_t)6 );
+ typeVectorVertex SimplexVector5{3, 4, 5};
+ BOOST_CHECK(SimplexVector5.size() == 3);
+ returnValue = st.insert_simplex_and_subfaces(SimplexVector5);
+
+ BOOST_CHECK(st.num_vertices() == (size_t) 6);
+
+ // Check it is well inserted
+ BOOST_CHECK(true == returnValue.second);
+ position = 0;
+ std::sort(SimplexVector5.begin(), SimplexVector5.end(), std::greater<Vertex_handle>());
+ for (auto vertex : st.simplex_vertex_range(returnValue.first)) {
+ // Check returned Simplex_handle
+ std::cout << "vertex = " << vertex << " | vector[" << position << "] = " << SimplexVector5[position] << std::endl;
+ BOOST_CHECK(vertex == SimplexVector5[position]);
+ position++;
+ }
// ++ SIXTH
std::cout << " - INSERT (0,1,6,7)" << std::endl;
- typeVectorVertex SimplexVector6;
- SimplexVector6.push_back(FIRST_VERTEX_HANDLE);
- SimplexVector6.push_back(SECOND_VERTEX_HANDLE);
- SimplexVector6.push_back(SEVENTH_VERTEX_HANDLE);
- SimplexVector6.push_back(EIGHTH_VERTEX_HANDLE);
- BOOST_CHECK( SimplexVector6.size() == 4 );
- st.insert_simplex_and_subfaces ( SimplexVector6 );
-
- BOOST_CHECK( st.num_vertices() == (size_t)8 ); // +2 (6 and 7 are not existing - 0 and 1 are already existing)
-
+ typeVectorVertex SimplexVector6{0, 1, 6, 7};
+ BOOST_CHECK(SimplexVector6.size() == 4);
+ returnValue = st.insert_simplex_and_subfaces(SimplexVector6);
+
+ BOOST_CHECK(st.num_vertices() == (size_t) 8); // +2 (6 and 7 are not existing - 0 and 1 are already existing)
+
+ // Check it is well inserted
+ BOOST_CHECK(true == returnValue.second);
+ position = 0;
+ std::sort(SimplexVector6.begin(), SimplexVector6.end(), std::greater<Vertex_handle>());
+ for (auto vertex : st.simplex_vertex_range(returnValue.first)) {
+ // Check returned Simplex_handle
+ std::cout << "vertex = " << vertex << " | vector[" << position << "] = " << SimplexVector6[position] << std::endl;
+ BOOST_CHECK(vertex == SimplexVector6[position]);
+ position++;
+ }
+
/* Inserted simplex: */
/* 1 6 */
/* o---o */
@@ -506,19 +510,18 @@ BOOST_AUTO_TEST_CASE( NSimplexAndSubfaces_tree_insertion )
typeSimplex simplexPair4 = std::make_pair(SimplexVector4, DEFAULT_FILTRATION_VALUE);
typeSimplex simplexPair5 = std::make_pair(SimplexVector5, DEFAULT_FILTRATION_VALUE);
typeSimplex simplexPair6 = std::make_pair(SimplexVector6, DEFAULT_FILTRATION_VALUE);
- test_simplex_tree_contains(st,simplexPair1,6); // (2,1,0) is in position 6
- test_simplex_tree_contains(st,simplexPair2,7); // (3) is in position 7
- test_simplex_tree_contains(st,simplexPair3,8); // (3,0) is in position 8
- test_simplex_tree_contains(st,simplexPair4,2); // (1,0) is in position 2
- test_simplex_tree_contains(st,simplexPair5,14); // (3,4,5) is in position 14
- test_simplex_tree_contains(st,simplexPair6,26); // (7,6,1,0) is in position 26
-
+ test_simplex_tree_contains(st, simplexPair1, 6); // (2,1,0) is in position 6
+ test_simplex_tree_contains(st, simplexPair2, 7); // (3) is in position 7
+ test_simplex_tree_contains(st, simplexPair3, 8); // (3,0) is in position 8
+ test_simplex_tree_contains(st, simplexPair4, 2); // (1,0) is in position 2
+ test_simplex_tree_contains(st, simplexPair5, 14); // (3,4,5) is in position 14
+ test_simplex_tree_contains(st, simplexPair6, 26); // (7,6,1,0) is in position 26
+
// ------------------------------------------------------------------------------------------------------------------
// Find in the simplex_tree
// ------------------------------------------------------------------------------------------------------------------
- typeVectorVertex simpleSimplexVector;
- simpleSimplexVector.push_back(SECOND_VERTEX_HANDLE);
- Simplex_tree<>::Simplex_handle simplexFound = st.find(simpleSimplexVector);
+ typeVectorVertex simpleSimplexVector{1};
+ typename typeST::Simplex_handle simplexFound = st.find(simpleSimplexVector);
std::cout << "**************IS THE SIMPLEX {1} IN THE SIMPLEX TREE ?\n";
if (simplexFound != st.null_simplex())
std::cout << "***+ YES IT IS!\n";
@@ -527,9 +530,7 @@ BOOST_AUTO_TEST_CASE( NSimplexAndSubfaces_tree_insertion )
// Check it is found
BOOST_CHECK(simplexFound != st.null_simplex());
- Vertex_handle UNKNOWN_VERTEX_HANDLE = (Vertex_handle) 15;
- typeVectorVertex unknownSimplexVector;
- unknownSimplexVector.push_back(UNKNOWN_VERTEX_HANDLE);
+ typeVectorVertex unknownSimplexVector{15};
simplexFound = st.find(unknownSimplexVector);
std::cout << "**************IS THE SIMPLEX {15} IN THE SIMPLEX TREE ?\n";
if (simplexFound != st.null_simplex())
@@ -547,10 +548,8 @@ BOOST_AUTO_TEST_CASE( NSimplexAndSubfaces_tree_insertion )
std::cout << "***- NO IT ISN'T\n";
// Check it is found
BOOST_CHECK(simplexFound != st.null_simplex());
-
- typeVectorVertex otherSimplexVector;
- otherSimplexVector.push_back(UNKNOWN_VERTEX_HANDLE);
- otherSimplexVector.push_back(SECOND_VERTEX_HANDLE);
+
+ typeVectorVertex otherSimplexVector{1, 15};
simplexFound = st.find(otherSimplexVector);
std::cout << "**************IS THE SIMPLEX {15,1} IN THE SIMPLEX TREE ?\n";
if (simplexFound != st.null_simplex())
@@ -560,10 +559,7 @@ BOOST_AUTO_TEST_CASE( NSimplexAndSubfaces_tree_insertion )
// Check it is NOT found
BOOST_CHECK(simplexFound == st.null_simplex());
- typeVectorVertex invSimplexVector;
- invSimplexVector.push_back(SECOND_VERTEX_HANDLE);
- invSimplexVector.push_back(THIRD_VERTEX_HANDLE);
- invSimplexVector.push_back(FIRST_VERTEX_HANDLE);
+ typeVectorVertex invSimplexVector{1, 2, 0};
simplexFound = st.find(invSimplexVector);
std::cout << "**************IS THE SIMPLEX {1,2,0} IN THE SIMPLEX TREE ?\n";
if (simplexFound != st.null_simplex())
@@ -572,19 +568,582 @@ BOOST_AUTO_TEST_CASE( NSimplexAndSubfaces_tree_insertion )
std::cout << "***- NO IT ISN'T\n";
// Check it is found
BOOST_CHECK(simplexFound != st.null_simplex());
-
+
// Display the Simplex_tree - Can not be done in the middle of 2 inserts
std::cout << "The complex contains " << st.num_simplices() << " simplices" << std::endl;
std::cout << " - dimension " << st.dimension() << " - filtration " << st.filtration() << std::endl;
std::cout << std::endl << std::endl << "Iterator on Simplices in the filtration, with [filtration value]:" << std::endl;
- for( auto f_simplex : st.filtration_simplex_range() )
- {
+ for (auto f_simplex : st.filtration_simplex_range()) {
+ std::cout << " " << "[" << st.filtration(f_simplex) << "] ";
+ for (auto vertex : st.simplex_vertex_range(f_simplex)) {
+ std::cout << (int) vertex << " ";
+ }
+ std::cout << std::endl;
+ }
+}
+
+template<class typeST, class Vertex_handle>
+void test_cofaces(typeST& st, const std::vector<Vertex_handle>& expected, int dim, const std::vector<typename typeST::Simplex_handle>& res) {
+ typename typeST::Cofaces_simplex_range cofaces;
+ if (dim == 0)
+ cofaces = st.star_simplex_range(st.find(expected));
+ else
+ cofaces = st.cofaces_simplex_range(st.find(expected), dim);
+ for (auto simplex = cofaces.begin(); simplex != cofaces.end(); ++simplex) {
+ typename typeST::Simplex_vertex_range rg = st.simplex_vertex_range(*simplex);
+ for (auto vertex = rg.begin(); vertex != rg.end(); ++vertex) {
+ std::cout << "(" << *vertex << ")";
+ }
+ std::cout << std::endl;
+ BOOST_CHECK(std::find(res.begin(), res.end(), *simplex) != res.end());
+ }
+}
+
+BOOST_AUTO_TEST_CASE_TEMPLATE(coface_on_simplex_tree, typeST, list_of_tested_variants) {
+ typedef std::vector<Vertex_handle> typeVectorVertex;
+ std::cout << "********************************************************************" << std::endl;
+ std::cout << "TEST COFACE ALGORITHM" << std::endl;
+ typeST st;
+
+ typeVectorVertex SimplexVector{2, 1, 0};
+ st.insert_simplex_and_subfaces(SimplexVector);
+
+ SimplexVector = {3, 0};
+ st.insert_simplex_and_subfaces(SimplexVector);
+
+ SimplexVector = {3, 4, 5};
+ st.insert_simplex_and_subfaces(SimplexVector);
+
+ SimplexVector = {0, 1, 6, 7};
+ st.insert_simplex_and_subfaces(SimplexVector);
+
+ /* Inserted simplex: */
+ /* 1 6 */
+ /* o---o */
+ /* /X\7/ */
+ /* o---o---o---o */
+ /* 2 0 3\X/4 */
+ /* o */
+ /* 5 */
+
+ // FIXME
+ st.set_dimension(3);
+
+ std::vector<Vertex_handle> simplex_result;
+ std::vector<typename typeST::Simplex_handle> result;
+ std::cout << "First test - Star of (3):" << std::endl;
+
+ simplex_result = {3};
+ result.push_back(st.find(simplex_result));
+
+ simplex_result = {3, 0};
+ result.push_back(st.find(simplex_result));
+
+ simplex_result = {4, 3};
+ result.push_back(st.find(simplex_result));
+
+ simplex_result = {5, 4, 3};
+ result.push_back(st.find(simplex_result));
+
+ simplex_result = {5, 3};
+ result.push_back(st.find(simplex_result));
+ simplex_result.clear();
+
+ std::vector<Vertex_handle> vertex = {3};
+ test_cofaces(st, vertex, 0, result);
+ vertex.clear();
+ result.clear();
+
+ vertex.push_back(1);
+ vertex.push_back(7);
+ std::cout << "Second test - Star of (1,7): " << std::endl;
+
+ simplex_result = {7, 1};
+ result.push_back(st.find(simplex_result));
+
+ simplex_result = {7, 6, 1, 0};
+ result.push_back(st.find(simplex_result));
+
+ simplex_result = {7, 1, 0};
+ result.push_back(st.find(simplex_result));
+
+ simplex_result = {7, 6, 1};
+ result.push_back(st.find(simplex_result));
+
+ test_cofaces(st, vertex, 0, result);
+ result.clear();
+
+ std::cout << "Third test - 2-dimension Cofaces of simplex(1,7) : " << std::endl;
+
+ simplex_result = {7, 1, 0};
+ result.push_back(st.find(simplex_result));
+
+ simplex_result = {7, 6, 1};
+ result.push_back(st.find(simplex_result));
+
+ test_cofaces(st, vertex, 1, result);
+ result.clear();
+
+ std::cout << "Cofaces with a codimension too high (codimension + vetices > tree.dimension) :" << std::endl;
+ test_cofaces(st, vertex, 5, result);
+
+ //std::cout << "Cofaces with an empty codimension" << std::endl;
+ //test_cofaces(st, vertex, -1, result);
+ // std::cout << "Cofaces in an empty simplex tree" << std::endl;
+ // typeST empty_tree;
+ // test_cofaces(empty_tree, vertex, 1, result);
+ //std::cout << "Cofaces of an empty simplex" << std::endl;
+ //vertex.clear();
+ // test_cofaces(st, vertex, 1, result);
+
+}
+
+BOOST_AUTO_TEST_CASE_TEMPLATE(copy_move_on_simplex_tree, typeST, list_of_tested_variants) {
+ typedef std::vector<Vertex_handle> typeVectorVertex;
+ std::cout << "********************************************************************" << std::endl;
+ std::cout << "TEST COPY MOVE CONSTRUCTORS" << std::endl;
+ typeST st;
+
+ typeVectorVertex SimplexVector{2, 1, 0};
+ st.insert_simplex_and_subfaces(SimplexVector);
+
+ SimplexVector = {3, 0};
+ st.insert_simplex_and_subfaces(SimplexVector);
+
+ SimplexVector = {3, 4, 5};
+ st.insert_simplex_and_subfaces(SimplexVector);
+
+ SimplexVector = {0, 1, 6, 7};
+ st.insert_simplex_and_subfaces(SimplexVector);
+
+ /* Inserted simplex: */
+ /* 1 6 */
+ /* o---o */
+ /* /X\7/ */
+ /* o---o---o---o */
+ /* 2 0 3\X/4 */
+ /* o */
+ /* 5 */
+
+ // FIXME
+ st.set_dimension(3);
+
+ std::cout << "Printing st - address = " << &st << std::endl;
+
+ // Copy constructor
+ typeST st_copy = st;
+ std::cout << "Printing a copy of st - address = " << &st_copy << std::endl;
+
+ // Check the data are the same
+ BOOST_CHECK(st == st_copy);
+ // Check there is a new simplex tree reference
+ BOOST_CHECK(&st != &st_copy);
+
+ // Move constructor
+ typeST st_move = std::move(st);
+ std::cout << "Printing a move of st - address = " << &st_move << std::endl;
+
+ // Check the data are the same
+ BOOST_CHECK(st_move == st_copy);
+ // Check there is a new simplex tree reference
+ BOOST_CHECK(&st_move != &st_copy);
+ BOOST_CHECK(&st_move != &st);
+
+ typeST st_empty;
+ // Check st has been emptied by the move
+ BOOST_CHECK(st == st_empty);
+ BOOST_CHECK(st.filtration() == 0);
+ BOOST_CHECK(st.dimension() == -1);
+ BOOST_CHECK(st.num_simplices() == 0);
+ BOOST_CHECK(st.num_vertices() == (size_t)0);
+
+ std::cout << "Printing st once again- address = " << &st << std::endl;
+}
+
+template<class typeST>
+void test_simplex_is_vertex(typeST& st, typename typeST::Simplex_handle sh, typename typeST::Vertex_handle v) {
+ BOOST_CHECK(st.dimension(sh) == 0);
+ auto&& r = st.simplex_vertex_range(sh);
+ auto i = std::begin(r);
+ BOOST_CHECK(*i == v);
+ BOOST_CHECK(++i == std::end(r));
+}
+
+BOOST_AUTO_TEST_CASE(non_contiguous) {
+ typedef Simplex_tree<> typeST;
+ typedef typeST::Vertex_handle Vertex_handle;
+ typedef typeST::Simplex_handle Simplex_handle;
+ std::cout << "********************************************************************" << std::endl;
+ std::cout << "TEST NON-CONTIGUOUS VERTICES" << std::endl;
+ typeST st;
+ Vertex_handle e[] = {3,-7};
+ std::cout << "Insert" << std::endl;
+ st.insert_simplex_and_subfaces(e);
+ BOOST_CHECK(st.num_vertices() == 2);
+ BOOST_CHECK(st.num_simplices() == 3);
+ std::cout << "Find" << std::endl;
+ Simplex_handle sh = st.find(e);
+ BOOST_CHECK(sh != st.null_simplex());
+ std::cout << "Endpoints" << std::endl;
+ auto p = st.endpoints(sh);
+ test_simplex_is_vertex(st, p.first, 3);
+ test_simplex_is_vertex(st, p.second, -7);
+ std::cout << "Boundary" << std::endl;
+ auto&& b = st.boundary_simplex_range(sh);
+ auto i = std::begin(b);
+ test_simplex_is_vertex(st, *i, -7);
+ test_simplex_is_vertex(st, *++i, 3);
+ BOOST_CHECK(++i == std::end(b));
+}
+
+BOOST_AUTO_TEST_CASE(make_filtration_non_decreasing) {
+ std::cout << "********************************************************************" << std::endl;
+ std::cout << "MAKE FILTRATION NON DECREASING" << std::endl;
+ typedef Simplex_tree<> typeST;
+ typeST st;
+
+ st.insert_simplex_and_subfaces({2, 1, 0}, 2.0);
+ st.insert_simplex_and_subfaces({3, 0}, 2.0);
+ st.insert_simplex_and_subfaces({3, 4, 5}, 2.0);
+
+ // Inserted simplex:
+ // 1
+ // o
+ // /X\
+ // o---o---o---o
+ // 2 0 3\X/4
+ // o
+ // 5
+
+ std::cout << "Check default insertion ensures the filtration values are non decreasing" << std::endl;
+ BOOST_CHECK(!st.make_filtration_non_decreasing());
+
+ // Because of non decreasing property of simplex tree, { 0 } , { 1 } and { 0, 1 } are going to be set from value 2.0
+ // to 1.0
+ st.insert_simplex_and_subfaces({0, 1, 6, 7}, 1.0);
+
+ // Inserted simplex:
+ // 1 6
+ // o---o
+ // /X\7/
+ // o---o---o---o
+ // 2 0 3\X/4
+ // o
+ // 5
+
+ std::cout << "Check default second insertion ensures the filtration values are non decreasing" << std::endl;
+ BOOST_CHECK(!st.make_filtration_non_decreasing());
+
+ // Copy original simplex tree
+ typeST st_copy = st;
+
+ // Modify specific values for st to become like st_copy thanks to make_filtration_non_decreasing
+ st.assign_filtration(st.find({0,1,6,7}), 0.8);
+ st.assign_filtration(st.find({0,1,6}), 0.9);
+ st.assign_filtration(st.find({0,6}), 0.6);
+ st.assign_filtration(st.find({3,4,5}), 1.2);
+ st.assign_filtration(st.find({3,4}), 1.1);
+ st.assign_filtration(st.find({4,5}), 1.99);
+
+ std::cout << "Check the simplex_tree is rolled back in case of decreasing filtration values" << std::endl;
+ BOOST_CHECK(st.make_filtration_non_decreasing());
+ BOOST_CHECK(st == st_copy);
+
+ // Other simplex tree
+ typeST st_other;
+ st_other.insert_simplex_and_subfaces({2, 1, 0}, 3.0); // This one is different from st
+ st_other.insert_simplex_and_subfaces({3, 0}, 2.0);
+ st_other.insert_simplex_and_subfaces({3, 4, 5}, 2.0);
+ st_other.insert_simplex_and_subfaces({0, 1, 6, 7}, 1.0);
+
+ // Modify specific values for st to become like st_other thanks to make_filtration_non_decreasing
+ st.assign_filtration(st.find({2}), 3.0);
+ // By modifying just the simplex {2}
+ // {0,1,2}, {1,2} and {0,2} will be modified
+
+ std::cout << "Check the simplex_tree is repaired in case of decreasing filtration values" << std::endl;
+ BOOST_CHECK(st.make_filtration_non_decreasing());
+ BOOST_CHECK(st == st_other);
+
+ // Modify specific values for st still to be non-decreasing
+ st.assign_filtration(st.find({0,1,2}), 10.0);
+ st.assign_filtration(st.find({0,2}), 9.0);
+ st.assign_filtration(st.find({0,1,6,7}), 50.0);
+ st.assign_filtration(st.find({0,1,6}), 49.0);
+ st.assign_filtration(st.find({0,1,7}), 48.0);
+ // Other copy simplex tree
+ typeST st_other_copy = st;
+
+ std::cout << "Check the simplex_tree is not modified in case of non-decreasing filtration values" << std::endl;
+ BOOST_CHECK(!st.make_filtration_non_decreasing());
+ BOOST_CHECK(st == st_other_copy);
+
+}
+
+struct MyOptions : 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;
+};
+
+BOOST_AUTO_TEST_CASE(remove_maximal_simplex) {
+ std::cout << "********************************************************************" << std::endl;
+ std::cout << "REMOVE MAXIMAL SIMPLEX" << std::endl;
+
+
+ typedef Simplex_tree<MyOptions> miniST;
+ miniST st;
+
+ // FIXME
+ st.set_dimension(3);
+
+ st.insert_simplex_and_subfaces({0, 1, 6, 7});
+ st.insert_simplex_and_subfaces({3, 4, 5});
+
+ // Constructs a copy at this state for further test purpose
+ miniST st_pruned = st;
+
+ st.insert_simplex_and_subfaces({3, 0});
+ st.insert_simplex_and_subfaces({2, 1, 0});
+
+ // Constructs a copy at this state for further test purpose
+ miniST st_complete = st;
+ // st_complete and st:
+ // 1 6
+ // o---o
+ // /X\7/
+ // o---o---o---o
+ // 2 0 3\X/4
+ // o
+ // 5
+ // st_pruned:
+ // 1 6
+ // o---o
+ // \7/
+ // o o---o
+ // 0 3\X/4
+ // o
+ // 5
+
+#ifdef GUDHI_DEBUG
+ std::cout << "Check exception throw in debug mode" << std::endl;
+ // throw excpt because sh has children
+ BOOST_CHECK_THROW (st.remove_maximal_simplex(st.find({0, 1, 6})), std::invalid_argument);
+ BOOST_CHECK_THROW (st.remove_maximal_simplex(st.find({3})), std::invalid_argument);
+ BOOST_CHECK(st == st_complete);
+#endif
+
+ st.remove_maximal_simplex(st.find({0, 2}));
+ st.remove_maximal_simplex(st.find({0, 1, 2}));
+ st.remove_maximal_simplex(st.find({1, 2}));
+ st.remove_maximal_simplex(st.find({2}));
+ st.remove_maximal_simplex(st.find({0, 3}));
+
+ BOOST_CHECK(st == st_pruned);
+ // Remove all, but as the simplex tree is not storing filtration, there is no modification
+ st.prune_above_filtration(0.0);
+ BOOST_CHECK(st == st_pruned);
+
+ miniST st_wo_seven;
+ // FIXME
+ st_wo_seven.set_dimension(3);
+
+ st_wo_seven.insert_simplex_and_subfaces({0, 1, 6});
+ st_wo_seven.insert_simplex_and_subfaces({3, 4, 5});
+ // st_wo_seven:
+ // 1 6
+ // o---o
+ // \X/
+ // o o---o
+ // 0 3\X/4
+ // o
+ // 5
+
+ // Remove all 7 to test the both remove_maximal_simplex cases (when _members is empty or not)
+ st.remove_maximal_simplex(st.find({0, 1, 6, 7}));
+ st.remove_maximal_simplex(st.find({0, 1, 7}));
+ st.remove_maximal_simplex(st.find({0, 6, 7}));
+ st.remove_maximal_simplex(st.find({0, 7}));
+ st.remove_maximal_simplex(st.find({1, 6, 7}));
+ st.remove_maximal_simplex(st.find({1, 7}));
+ st.remove_maximal_simplex(st.find({6, 7}));
+ st.remove_maximal_simplex(st.find({7}));
+
+ BOOST_CHECK(st == st_wo_seven);
+}
+
+BOOST_AUTO_TEST_CASE(prune_above_filtration) {
+ std::cout << "********************************************************************" << std::endl;
+ std::cout << "PRUNE ABOVE FILTRATION" << std::endl;
+ typedef Simplex_tree<> typeST;
+ typeST st;
+
+ // FIXME
+ st.set_dimension(3);
+
+ st.insert_simplex_and_subfaces({0, 1, 6, 7}, 1.0);
+ st.insert_simplex_and_subfaces({3, 4, 5}, 2.0);
+
+ // Constructs a copy at this state for further test purpose
+ typeST st_pruned = st;
+ st_pruned.initialize_filtration(); // reset
+
+ st.insert_simplex_and_subfaces({3, 0}, 3.0);
+ st.insert_simplex_and_subfaces({2, 1, 0}, 4.0);
+
+ // Constructs a copy at this state for further test purpose
+ typeST st_complete = st;
+ // st_complete and st:
+ // 1 6
+ // o---o
+ // /X\7/
+ // o---o---o---o
+ // 2 0 3\X/4
+ // o
+ // 5
+ // st_pruned:
+ // 1 6
+ // o---o
+ // \7/
+ // o o---o
+ // 0 3\X/4
+ // o
+ // 5
+
+ bool simplex_is_changed = false;
+ // Check the no action cases
+ // greater than initial filtration value
+ simplex_is_changed = st.prune_above_filtration(10.0);
+ if (simplex_is_changed)
+ st.initialize_filtration();
+ BOOST_CHECK(st == st_complete);
+ BOOST_CHECK(!simplex_is_changed);
+ // equal to initial filtration value
+ simplex_is_changed = st.prune_above_filtration(6.0);
+ if (simplex_is_changed)
+ st.initialize_filtration();
+ BOOST_CHECK(st == st_complete);
+ BOOST_CHECK(!simplex_is_changed);
+ // lower than initial filtration value, but still greater than the maximum filtration value
+ simplex_is_changed = st.prune_above_filtration(5.0);
+ if (simplex_is_changed)
+ st.initialize_filtration();
+ BOOST_CHECK(st == st_complete);
+ BOOST_CHECK(!simplex_is_changed);
+
+ // Display the Simplex_tree
+ std::cout << "The complex contains " << st.num_simplices() << " simplices";
+ std::cout << " - dimension " << st.dimension() << std::endl;
+ std::cout << "Iterator on Simplices in the filtration, with [filtration value]:" << std::endl;
+ for (auto f_simplex : st.filtration_simplex_range()) {
std::cout << " " << "[" << st.filtration(f_simplex) << "] ";
- for( auto vertex : st.simplex_vertex_range(f_simplex) )
- {
- std::cout << (int)vertex << " ";
+ for (auto vertex : st.simplex_vertex_range(f_simplex)) {
+ std::cout << (int) vertex << " ";
}
std::cout << std::endl;
}
+ // Check the pruned cases
+ simplex_is_changed = st.prune_above_filtration(2.5);
+ if (simplex_is_changed)
+ st.initialize_filtration();
+ BOOST_CHECK(st == st_pruned);
+ BOOST_CHECK(simplex_is_changed);
+
+ // Display the Simplex_tree
+ std::cout << "The complex pruned at 2.5 contains " << st.num_simplices() << " simplices";
+ std::cout << " - dimension " << st.dimension() << std::endl;
+
+ simplex_is_changed = st.prune_above_filtration(2.0);
+ if (simplex_is_changed)
+ st.initialize_filtration();
+
+ std::cout << "The complex pruned at 2.0 contains " << st.num_simplices() << " simplices";
+ std::cout << " - dimension " << st.dimension() << std::endl;
+
+ BOOST_CHECK(st == st_pruned);
+ BOOST_CHECK(!simplex_is_changed);
+
+ typeST st_empty;
+ // FIXME
+ st_empty.set_dimension(3);
+ simplex_is_changed = st.prune_above_filtration(0.0);
+ if (simplex_is_changed)
+ st.initialize_filtration();
+
+ // Display the Simplex_tree
+ std::cout << "The complex pruned at 0.0 contains " << st.num_simplices() << " simplices";
+ std::cout << " - dimension " << st.dimension() << std::endl;
+
+ BOOST_CHECK(st == st_empty);
+ BOOST_CHECK(simplex_is_changed);
+
+ // Test case to the limit
+ simplex_is_changed = st.prune_above_filtration(-1.0);
+ if (simplex_is_changed)
+ st.initialize_filtration();
+ BOOST_CHECK(st == st_empty);
+ BOOST_CHECK(!simplex_is_changed);
}
+
+BOOST_AUTO_TEST_CASE(mini_prune_above_filtration) {
+ std::cout << "********************************************************************" << std::endl;
+ std::cout << "MINI PRUNE ABOVE FILTRATION" << std::endl;
+ typedef Simplex_tree<MyOptions> typeST;
+ typeST st;
+
+ // FIXME
+ st.set_dimension(3);
+
+ st.insert_simplex_and_subfaces({0, 1, 6, 7});
+ st.insert_simplex_and_subfaces({3, 4, 5});
+ st.insert_simplex_and_subfaces({3, 0});
+ st.insert_simplex_and_subfaces({2, 1, 0});
+
+ // st:
+ // 1 6
+ // o---o
+ // /X\7/
+ // o---o---o---o
+ // 2 0 3\X/4
+ // o
+ // 5
+
+ st.initialize_filtration();
+
+ // Display the Simplex_tree
+ std::cout << "The complex contains " << st.num_simplices() << " simplices" << std::endl;
+ BOOST_CHECK(st.num_simplices() == 27);
+
+ // Test case to the limit - With these options, there is no filtration, which means filtration is 0
+ bool simplex_is_changed = st.prune_above_filtration(1.0);
+ if (simplex_is_changed)
+ st.initialize_filtration();
+ // Display the Simplex_tree
+ std::cout << "The complex pruned at 1.0 contains " << st.num_simplices() << " simplices" << std::endl;
+ BOOST_CHECK(!simplex_is_changed);
+ BOOST_CHECK(st.num_simplices() == 27);
+
+ simplex_is_changed = st.prune_above_filtration(0.0);
+ if (simplex_is_changed)
+ st.initialize_filtration();
+ // Display the Simplex_tree
+ std::cout << "The complex pruned at 0.0 contains " << st.num_simplices() << " simplices" << std::endl;
+ BOOST_CHECK(!simplex_is_changed);
+ BOOST_CHECK(st.num_simplices() == 27);
+
+ // Test case to the limit
+ simplex_is_changed = st.prune_above_filtration(-1.0);
+ if (simplex_is_changed)
+ st.initialize_filtration();
+ // Display the Simplex_tree
+ std::cout << "The complex pruned at -1.0 contains " << st.num_simplices() << " simplices" << std::endl;
+ BOOST_CHECK(simplex_is_changed);
+ BOOST_CHECK(st.num_simplices() == 0);
+
+ // Display the Simplex_tree
+ std::cout << "The complex contains " << st.num_simplices() << " simplices" << std::endl;
+
+} \ No newline at end of file
diff --git a/src/Skeleton_blocker/concept/SkeletonBlockerDS.h b/src/Skeleton_blocker/concept/SkeletonBlockerDS.h
index c0386590..3c650f99 100644
--- a/src/Skeleton_blocker/concept/SkeletonBlockerDS.h
+++ b/src/Skeleton_blocker/concept/SkeletonBlockerDS.h
@@ -12,7 +12,7 @@
namespace Gudhi {
-namespace skbl {
+namespace skeleton_blocker {
@@ -118,8 +118,11 @@ struct SkeletonBlockerDS
-} // namespace skbl
-} // namespace GUDHI
+} // namespace skeleton_blocker
+
+namespace skbl = skeleton_blocker;
+
+} // namespace Gudhi
#endif /* GUDHI_SKELETONBLOCKERDS_H_ */
diff --git a/src/Skeleton_blocker/concept/SkeletonBlockerGeometricDS.h b/src/Skeleton_blocker/concept/SkeletonBlockerGeometricDS.h
index 8fbf0d12..c5d52800 100644
--- a/src/Skeleton_blocker/concept/SkeletonBlockerGeometricDS.h
+++ b/src/Skeleton_blocker/concept/SkeletonBlockerGeometricDS.h
@@ -10,7 +10,7 @@
#define GUDHI_SKELETONBLOCKERGEOMETRICDS_H_
namespace Gudhi {
-namespace skbl {
+namespace skeleton_blocker {
/**
* \brief Concept for template class of Skeleton_blocker_geometric_complex .
@@ -68,7 +68,10 @@ struct SkeletonBlockerGeometricDS : public SkeletonBlockerDS
};
};
-} // namespace skbl
-} // namespace GUDHI
+} // namespace skeleton_blocker
+
+namespace skbl = skeleton_blocker;
+
+} // namespace Gudhi
#endif /* GUDHI_SKELETONBLOCKERGEOMETRICDS_H_ */
diff --git a/src/Skeleton_blocker/example/CMakeLists.txt b/src/Skeleton_blocker/example/CMakeLists.txt
index d1228526..cc7f37f3 100644
--- a/src/Skeleton_blocker/example/CMakeLists.txt
+++ b/src/Skeleton_blocker/example/CMakeLists.txt
@@ -1,10 +1,12 @@
cmake_minimum_required(VERSION 2.6)
-project(GUDHIskbl)
-
+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)
+target_link_libraries(SkeletonBlockerIteration ${Boost_TIMER_LIBRARY} ${Boost_SYSTEM_LIBRARY})
-target_link_libraries(SkeletonBlockerIteration ${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)
diff --git a/src/Skeleton_blocker/example/Skeleton_blocker_from_simplices.cpp b/src/Skeleton_blocker/example/Skeleton_blocker_from_simplices.cpp
index 9f9b3d52..171f35f2 100644
--- a/src/Skeleton_blocker/example/Skeleton_blocker_from_simplices.cpp
+++ b/src/Skeleton_blocker/example/Skeleton_blocker_from_simplices.cpp
@@ -1,83 +1,80 @@
- /* This file is part of the Gudhi Library. The Gudhi library
- * (Geometric Understanding in Higher Dimensions) is a generic C++
- * library for computational topology.
- *
- * Author(s): 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 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/>.
+ */
+
+#include <gudhi/Skeleton_blocker.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <fstream>
#include <sstream>
-
-
-#include "gudhi/Skeleton_blocker.h"
+#include <vector>
using namespace std;
using namespace Gudhi;
-using namespace skbl;
+using namespace skeleton_blocker;
typedef Skeleton_blocker_complex<Skeleton_blocker_simple_traits> Complex;
typedef Complex::Vertex_handle Vertex_handle;
-typedef Complex::Simplex_handle Simplex_handle;
-typedef Complex::Simplex_handle Simplex;
+typedef Complex::Simplex Simplex;
-int main (int argc, char *argv[]){
- std::vector<Simplex_handle> simplices;
+int main(int argc, char *argv[]) {
+ std::vector<Simplex> simplices;
- //add 4 triangles of a tetrahedron 0123
- simplices.push_back(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2)));
- simplices.push_back(Simplex_handle(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3)));
- simplices.push_back(Simplex_handle(Vertex_handle(3),Vertex_handle(0),Vertex_handle(2)));
- simplices.push_back(Simplex_handle(Vertex_handle(3),Vertex_handle(0),Vertex_handle(1)));
+ // 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)));
- //get complex from top faces
- Complex complex(make_complex_from_top_faces<Complex>(simplices.begin(),simplices.end()));
+ // get complex from top faces
+ Complex complex(make_complex_from_top_faces<Complex>(simplices.begin(), simplices.end()));
- std::cout << "Simplices:"<<std::endl;
- for(const Simplex & s : complex.simplex_range())
- std::cout << s << " ";
- std::cout << std::endl;
+ std::cout << "Simplices:" << std::endl;
+ for (const Simplex & s : complex.complex_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;
+ // 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_handle(Vertex_handle(0)));
- simplices.push_back(Simplex_handle(Vertex_handle(1)));
- simplices.push_back(Simplex_handle(Vertex_handle(2)));
- simplices.push_back(Simplex_handle(Vertex_handle(0),Vertex_handle(1)));
- simplices.push_back(Simplex_handle(Vertex_handle(1),Vertex_handle(2)));
- simplices.push_back(Simplex_handle(Vertex_handle(2),Vertex_handle(0)));
- complex = Complex(simplices.begin(),simplices.end());
+ // 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.simplex_range())
- std::cout << s << " ";
- std::cout << std::endl;
+ std::cout << "Simplices:" << std::endl;
+ for (const Simplex & s : complex.complex_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;
+ // 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;
- return EXIT_SUCCESS;
+ return EXIT_SUCCESS;
}
-
diff --git a/src/Skeleton_blocker/example/Skeleton_blocker_iteration.cpp b/src/Skeleton_blocker/example/Skeleton_blocker_iteration.cpp
index 92fa17f3..8d9d1a67 100644
--- a/src/Skeleton_blocker/example/Skeleton_blocker_iteration.cpp
+++ b/src/Skeleton_blocker/example/Skeleton_blocker_iteration.cpp
@@ -1,24 +1,26 @@
- /* 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 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/>.
+ */
+
+#include <gudhi/Skeleton_blocker.h>
#include <boost/timer/timer.hpp>
@@ -29,62 +31,60 @@
#include <sstream>
-#include "gudhi/Skeleton_blocker.h"
-
using namespace std;
using namespace Gudhi;
-using namespace skbl;
+using namespace skeleton_blocker;
typedef Skeleton_blocker_complex<Skeleton_blocker_simple_traits> Complex;
typedef Complex::Vertex_handle Vertex_handle;
-typedef Complex::Simplex_handle Simplex;
+typedef Complex::Simplex Simplex;
-
-Complex build_complete_complex(int n){
- // build a full complex with n 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++)
- //note that add_edge, add the edge and all its cofaces
- complex.add_edge(Vertex_handle(i),Vertex_handle(j));
- return complex;
+Complex build_complete_complex(int n) {
+ // build a full complex with n 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));
+ return complex;
}
-int main (int argc, char *argv[]){
- boost::timer::auto_cpu_timer t;
+int main(int argc, char *argv[]) {
+ boost::timer::auto_cpu_timer t;
- const int n = 15;
+ const int n = 15;
- // build a full complex with n vertices and 2^n-1 simplices
- Complex complex(build_complete_complex(n));
+ // build a full complex with n vertices and 2^n-1 simplices
+ Complex complex(build_complete_complex(n));
- // 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;
+ // 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()) {
+ std::cout << "Vertex " << v << std::endl;
+ ++num_vertices;
+ }
- // such loop can also be done directly with distance as iterators are STL compliant
- auto edges = complex.edge_range();
- unsigned num_edges = std::distance(edges.begin(), edges.end());
+ // such loop can also be done directly with distance as iterators are STL compliant
+ auto edges = complex.edge_range();
+ unsigned num_edges = std::distance(edges.begin(), edges.end());
- 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.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;
- return EXIT_SUCCESS;
+ 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.complex_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;
+ return EXIT_SUCCESS;
}
-
diff --git a/src/Skeleton_blocker/example/Skeleton_blocker_link.cpp b/src/Skeleton_blocker/example/Skeleton_blocker_link.cpp
index 0987cc89..1f937170 100644
--- a/src/Skeleton_blocker/example/Skeleton_blocker_link.cpp
+++ b/src/Skeleton_blocker/example/Skeleton_blocker_link.cpp
@@ -1,25 +1,26 @@
- /* 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 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/>.
+ */
+#include <gudhi/Skeleton_blocker.h>
#include <stdio.h>
#include <stdlib.h>
@@ -27,45 +28,44 @@
#include <fstream>
#include <sstream>
-
-#include "gudhi/Skeleton_blocker.h"
-
using namespace std;
using namespace Gudhi;
-using namespace skbl;
+using namespace skeleton_blocker;
typedef Skeleton_blocker_complex<Skeleton_blocker_simple_traits> Complex;
typedef Complex::Vertex_handle Vertex_handle;
typedef Complex::Root_vertex_handle Root_vertex_handle;
-typedef Complex::Simplex_handle Simplex;
+typedef Complex::Simplex Simplex;
+int main(int argc, char *argv[]) {
+ // build a full complex with 4 vertices and 2^4-1 simplices
-int main (int argc, char *argv[]){
- // build a full complex with 4 vertices and 2^4-1 simplices
- // Initial vertices are (0,1,2,3,4)
- Simplex tetrahedron(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2),Vertex_handle(3));
- Complex complex;
- complex.add_simplex(tetrahedron);
+ // Create a complex with four vertices (0,1,2,3)
+ Complex complex;
- cout<<"complex:"<<complex.to_string()<<endl;
+ // Add a tetrahedron to this complex
+ Simplex tetrahedron(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3));
+ complex.add_simplex(tetrahedron);
- //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;
+ cout << "complex:" << complex.to_string() << 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;
+ // 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;
- //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;
+ // 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;
- return EXIT_SUCCESS;
-}
+ // 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;
+ return EXIT_SUCCESS;
+}
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h
index 049db6d5..822282fd 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker.h
@@ -19,23 +19,24 @@
* 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 SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_H_
-#define SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_H_
-#include "gudhi/Skeleton_blocker_complex.h"
-#include "gudhi/Skeleton_blocker_geometric_complex.h"
-#include "gudhi/Skeleton_blocker_simplifiable_complex.h"
-#include "gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h"
+#ifndef SKELETON_BLOCKER_H_
+#define SKELETON_BLOCKER_H_
-#include "gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h"
-#include "gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h"
+#include <gudhi/Skeleton_blocker_complex.h>
+#include <gudhi/Skeleton_blocker_geometric_complex.h>
+#include <gudhi/Skeleton_blocker_simplifiable_complex.h>
+#include <gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h>
+#include <gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h>
+#include <gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h>
-#include "gudhi/Utils.h" // xxx
-
+#include <gudhi/Debug_utils.h>
namespace Gudhi {
-namespace skbl {
+
+namespace skeleton_blocker {
+
/** \defgroup skbl Skeleton-Blocker
\author David Salinas
@@ -109,7 +110,7 @@ and point access in addition.
\subsection 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.
+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).
@@ -128,7 +129,7 @@ of a simplicial complex.
\code{.cpp}
typedef Skeleton_blocker_complex<Skeleton_blocker_simple_traits> Complex;
typedef Complex::Vertex_handle Vertex_handle;
- typedef Complex::Simplex_handle Simplex;
+ typedef Complex::Simplex Simplex;
const int n = 15;
@@ -138,8 +139,7 @@ of a simplicial complex.
complex.add_vertex();
for(int i=0;i<n;i++)
for(int j=0;j<i;j++)
- //note that add_edge adds the edge and all its cofaces
- complex.add_edge(Vertex_handle(i),Vertex_handle(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
@@ -158,7 +158,7 @@ of a simplicial complex.
// 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.simplex_range()){
+ for(const Simplex & s : complex.star_simplex_range()){
++num_simplices;
if(s.dimension()%2 == 0)
euler += 1;
@@ -181,20 +181,20 @@ 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_handle> simplices;
+ std::vector<Simplex> simplices;
//add 4 triangles of a tetrahedron 0123
- simplices.push_back(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2)));
- simplices.push_back(Simplex_handle(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3)));
- simplices.push_back(Simplex_handle(Vertex_handle(3),Vertex_handle(0),Vertex_handle(2)));
- simplices.push_back(Simplex_handle(Vertex_handle(3),Vertex_handle(0),Vertex_handle(1)));
+ 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.simplex_range())
+ for(const Simplex & s : complex.star_simplex_range())
std::cout << s << " ";
std::cout << std::endl;
@@ -203,16 +203,16 @@ The Euler Characteristic is 1
//now build a complex from its full list of simplices
simplices.clear();
- simplices.push_back(Simplex_handle(Vertex_handle(0)));
- simplices.push_back(Simplex_handle(Vertex_handle(1)));
- simplices.push_back(Simplex_handle(Vertex_handle(2)));
- simplices.push_back(Simplex_handle(Vertex_handle(0),Vertex_handle(1)));
- simplices.push_back(Simplex_handle(Vertex_handle(1),Vertex_handle(2)));
- simplices.push_back(Simplex_handle(Vertex_handle(2),Vertex_handle(0)));
+ 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.simplex_range())
+ for(const Simplex & s : complex.star_simplex_range())
std::cout << s << " ";
std::cout << std::endl;
@@ -240,14 +240,13 @@ their collaboration to write the two initial papers
\copyright GNU General Public License v3.
-\verbatim Contact: David Salinas, david.salinas@inria.fr \endverbatim
*/
/** @} */ // end defgroup
-} // namespace skbl
-} // namespace Gudhi
-
-#endif // SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_H_
+} // namespace skeleton_blocker
+namespace skbl = skeleton_blocker;
+} // namespace Gudhi
+#endif // SKELETON_BLOCKER_H_
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_complex_visitor.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_complex_visitor.h
index 829ab1e8..32f40a4b 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_complex_visitor.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_complex_visitor.h
@@ -19,14 +19,14 @@
* 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 SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_COMPLEX_VISITOR_H_
-#define SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_COMPLEX_VISITOR_H_
+#ifndef SKELETON_BLOCKER_SKELETON_BLOCKER_COMPLEX_VISITOR_H_
+#define SKELETON_BLOCKER_SKELETON_BLOCKER_COMPLEX_VISITOR_H_
-#include "gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h"
+#include <gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h>
namespace Gudhi {
-namespace skbl {
+namespace skeleton_blocker {
// todo rajouter les const
/**
@@ -41,7 +41,7 @@ class Skeleton_blocker_complex_visitor {
virtual void on_add_vertex(Vertex_handle) = 0;
virtual void on_remove_vertex(Vertex_handle) = 0;
- virtual void on_add_edge(Vertex_handle a, Vertex_handle b) = 0;
+ virtual void on_add_edge_without_blockers(Vertex_handle a, Vertex_handle b) = 0;
virtual void on_remove_edge(Vertex_handle a, Vertex_handle b) = 0;
/**
@@ -54,12 +54,12 @@ class Skeleton_blocker_complex_visitor {
* @brief Called when performing an edge contraction when
* an edge bx is replaced by an edge ax (not already present).
* Precisely, this methods is called this way in contract_edge :
- * add_edge(a,x)
+ * add_edge_without_blockers(a,x)
* on_swaped_edge(a,b,x)
* remove_edge(b,x)
*/
virtual void on_swaped_edge(Vertex_handle a, Vertex_handle b,
- Vertex_handle x)=0;
+ Vertex_handle x) = 0;
virtual void on_add_blocker(
const Skeleton_blocker_simplex<Vertex_handle>&) = 0;
virtual void on_delete_blocker(
@@ -79,7 +79,7 @@ class Dummy_complex_visitor : public Skeleton_blocker_complex_visitor<
}
void on_remove_vertex(Vertex_handle) {
}
- void on_add_edge(Vertex_handle a, Vertex_handle b) {
+ void on_add_edge_without_blockers(Vertex_handle a, Vertex_handle b) {
}
void on_remove_edge(Vertex_handle a, Vertex_handle b) {
}
@@ -108,8 +108,8 @@ class Print_complex_visitor : public Skeleton_blocker_complex_visitor<
void on_remove_vertex(Vertex_handle v) {
std::cerr << "on_remove_vertex:" << v << std::endl;
}
- void on_add_edge(Vertex_handle a, Vertex_handle b) {
- std::cerr << "on_add_edge:" << a << "," << b << 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;
@@ -128,8 +128,10 @@ class Print_complex_visitor : public Skeleton_blocker_complex_visitor<
}
};
-} // namespace skbl
+} // namespace skeleton_blocker
+
+namespace skbl = skeleton_blocker;
} // namespace Gudhi
-#endif // SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_COMPLEX_VISITOR_H_
+#endif // SKELETON_BLOCKER_SKELETON_BLOCKER_COMPLEX_VISITOR_H_
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.h
index 17d58956..3bfb5d11 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.h
@@ -19,14 +19,14 @@
* 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 SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_LINK_SUPERIOR_H_
-#define SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_LINK_SUPERIOR_H_
+#ifndef SKELETON_BLOCKER_SKELETON_BLOCKER_LINK_SUPERIOR_H_
+#define SKELETON_BLOCKER_SKELETON_BLOCKER_LINK_SUPERIOR_H_
-#include "gudhi/Skeleton_blocker_link_complex.h"
+#include <gudhi/Skeleton_blocker_link_complex.h>
namespace Gudhi {
-namespace skbl {
+namespace skeleton_blocker {
template<class ComplexType> class Skeleton_blocker_sub_complex;
@@ -44,13 +44,13 @@ class Skeleton_blocker_link_superior : public Skeleton_blocker_link_complex<
public:
typedef typename ComplexType::Vertex_handle Vertex_handle;
typedef typename ComplexType::Root_vertex_handle Root_vertex_handle;
- typedef typename ComplexType::Simplex_handle Simplex_handle;
+ typedef typename ComplexType::Simplex Simplex;
typedef typename ComplexType::Root_simplex_handle Root_simplex_handle;
typedef typename ComplexType::BlockerMap BlockerMap;
typedef typename ComplexType::BlockerPair BlockerPair;
typedef typename ComplexType::BlockerMapIterator BlockerMapIterator;
typedef typename ComplexType::BlockerMapConstIterator BlockerMapConstIterator;
- typedef typename ComplexType::Simplex_handle::Simplex_vertex_const_iterator AddressSimplexConstIterator;
+ typedef typename ComplexType::Simplex::Simplex_vertex_const_iterator AddressSimplexConstIterator;
typedef typename ComplexType::Root_simplex_handle::Simplex_vertex_const_iterator IdSimplexConstIterator;
Skeleton_blocker_link_superior()
@@ -58,7 +58,7 @@ class Skeleton_blocker_link_superior : public Skeleton_blocker_link_complex<
}
Skeleton_blocker_link_superior(const ComplexType & parent_complex,
- Simplex_handle& alpha_parent_adress)
+ Simplex& alpha_parent_adress)
: Skeleton_blocker_link_complex<ComplexType>(parent_complex,
alpha_parent_adress, true) {
}
@@ -70,8 +70,10 @@ class Skeleton_blocker_link_superior : public Skeleton_blocker_link_complex<
}
};
-} // namespace skbl
+} // namespace skeleton_blocker
+
+namespace skbl = skeleton_blocker;
} // namespace Gudhi
-#endif // SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_LINK_SUPERIOR_H_
+#endif // SKELETON_BLOCKER_SKELETON_BLOCKER_LINK_SUPERIOR_H_
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h
index aaaab8b0..ba46c49e 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_off_io.h
@@ -19,18 +19,18 @@
* 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 SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_OFF_IO_H_
-#define SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_OFF_IO_H_
+#ifndef SKELETON_BLOCKER_SKELETON_BLOCKER_OFF_IO_H_
+#define SKELETON_BLOCKER_SKELETON_BLOCKER_OFF_IO_H_
+
+#include <gudhi/Off_reader.h>
#include <string>
#include <vector>
#include <map>
-#include "gudhi/Off_reader.h"
-
namespace Gudhi {
-namespace skbl {
+namespace skeleton_blocker {
/**
*@brief Off reader visitor that can be passed to Off_reader to read a Skeleton_blocker_complex.
@@ -61,7 +61,7 @@ class Skeleton_blocker_off_flag_visitor_reader {
if (!load_only_points_) {
for (size_t i = 0; i < face.size(); ++i)
for (size_t j = i + 1; j < face.size(); ++j) {
- complex_.add_edge(Vertex_handle(face[i]), Vertex_handle(face[j]));
+ complex_.add_edge_without_blockers(Vertex_handle(face[i]), Vertex_handle(face[j]));
}
}
}
@@ -76,12 +76,12 @@ template<typename Complex>
class Skeleton_blocker_off_visitor_reader {
Complex& complex_;
typedef typename Complex::Vertex_handle Vertex_handle;
- typedef typename Complex::Simplex_handle Simplex_handle;
+ typedef typename Complex::Simplex Simplex;
typedef typename Complex::Point Point;
const bool load_only_points_;
std::vector<Point> points_;
- std::vector<Simplex_handle> maximal_faces_;
+ std::vector<Simplex> maximal_faces_;
public:
explicit Skeleton_blocker_off_visitor_reader(Complex& complex, bool load_only_points = false) :
@@ -99,7 +99,7 @@ class Skeleton_blocker_off_visitor_reader {
void maximal_face(const std::vector<int>& face) {
if (!load_only_points_) {
- Simplex_handle s;
+ Simplex s;
for (auto x : face)
s.add_vertex(Vertex_handle(x));
maximal_faces_.emplace_back(s);
@@ -107,7 +107,7 @@ class Skeleton_blocker_off_visitor_reader {
}
void done() {
- complex_ = make_complex_from_top_faces(maximal_faces_.begin(), maximal_faces_.end(),
+ complex_ = make_complex_from_top_faces<Complex>(maximal_faces_.begin(), maximal_faces_.end(),
points_.begin(), points_.end() );
}
};
@@ -193,8 +193,10 @@ class Skeleton_blocker_off_writer {
}
};
-} // namespace skbl
+} // namespace skeleton_blocker
+
+namespace skbl = skeleton_blocker;
} // namespace Gudhi
-#endif // SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_OFF_IO_H_
+#endif // SKELETON_BLOCKER_SKELETON_BLOCKER_OFF_IO_H_
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h
index d3a5b9d8..fb4a1106 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_geometric_traits.h
@@ -19,17 +19,17 @@
* 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 SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_GEOMETRIC_TRAITS_H_
-#define SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_GEOMETRIC_TRAITS_H_
+#ifndef SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_GEOMETRIC_TRAITS_H_
+#define SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_GEOMETRIC_TRAITS_H_
+
+#include <gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h>
#include <string>
#include <sstream>
-#include "gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h"
-
namespace Gudhi {
-namespace skbl {
+namespace skeleton_blocker {
/**
* @extends SkeletonBlockerGeometricDS
@@ -39,7 +39,7 @@ namespace skbl {
*/
template<typename GeometryTrait>
struct Skeleton_blocker_simple_geometric_traits :
- public skbl::Skeleton_blocker_simple_traits {
+ public Skeleton_blocker_simple_traits {
public:
typedef GeometryTrait GT;
typedef typename GT::Point Point;
@@ -87,8 +87,10 @@ struct Skeleton_blocker_simple_geometric_traits :
typedef Skeleton_blocker_simple_traits::Graph_edge Graph_edge;
};
-} // namespace skbl
+} // namespace skeleton_blocker
+
+namespace skbl = skeleton_blocker;
} // namespace Gudhi
-#endif // SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_GEOMETRIC_TRAITS_H_
+#endif // SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_GEOMETRIC_TRAITS_H_
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h
index 52e454ea..31bec3b6 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simple_traits.h
@@ -19,16 +19,17 @@
* 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 SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_TRAITS_H_
-#define SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_TRAITS_H_
+#ifndef SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_TRAITS_H_
+#define SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_TRAITS_H_
+
+#include <gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h>
#include <string>
#include <sstream>
-#include "Skeleton_blocker_simplex.h"
namespace Gudhi {
-namespace skbl {
+namespace skeleton_blocker {
/**
* @extends SkeletonBlockerDS
@@ -77,7 +78,7 @@ struct Skeleton_blocker_simple_traits {
: vertex(val) {
}
- operator int() const { return (int)vertex; }
+ operator int() const { return static_cast<int>(vertex); }
boost_vertex_handle vertex;
@@ -174,8 +175,10 @@ struct Skeleton_blocker_simple_traits {
};
};
-} // namespace skbl
+} // namespace skeleton_blocker
+
+namespace skbl = skeleton_blocker;
} // namespace Gudhi
-#endif // SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_TRAITS_H_
+#endif // SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLE_TRAITS_H_
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h
index 10d64e98..3c7f1dd5 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h
@@ -20,8 +20,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLEX_H_
-#define SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLEX_H_
+#ifndef SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLEX_H_
+#define SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLEX_H_
#include <cassert>
#include <iostream>
@@ -33,7 +33,7 @@
namespace Gudhi {
-namespace skbl {
+namespace skeleton_blocker {
/**
*@brief Abstract simplex used in Skeleton blockers data-structure.
@@ -69,7 +69,9 @@ class Skeleton_blocker_simplex {
}
Skeleton_blocker_simplex(std::initializer_list<T>& list) {
- for_each(list.begin(), list.end(), add_vertex);
+ std::for_each(list.begin(), list.end(), [&] (T const& elt) {
+ add_vertex(elt);
+ });
}
template<typename ... Args>
@@ -216,7 +218,7 @@ class Skeleton_blocker_simplex {
}
/**
- * Returns the first vertex of the (oriented) simplex.
+ * Returns the first and smallest vertex of the simplex.
*
* Be careful : assumes the simplex is non-empty.
*/
@@ -226,7 +228,7 @@ class Skeleton_blocker_simplex {
}
/**
- * Returns the last vertex of the (oriented) simplex.
+ * Returns the last and greatest vertex of the simplex.
*
* Be careful : assumes the simplex is non-empty.
*/
@@ -365,9 +367,10 @@ class Skeleton_blocker_simplex {
}
};
-} // namespace skbl
+} // namespace skeleton_blocker
-} // namespace Gudhi
+namespace skbl = skeleton_blocker;
-#endif // SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLEX_H_
+} // namespace Gudhi
+#endif // SKELETON_BLOCKER_SKELETON_BLOCKER_SIMPLEX_H_
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h
index e906df75..196fe8c0 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h
@@ -20,19 +20,19 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_SUB_COMPLEX_H_
-#define SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_SUB_COMPLEX_H_
+#ifndef SKELETON_BLOCKER_SKELETON_BLOCKER_SUB_COMPLEX_H_
+#define SKELETON_BLOCKER_SKELETON_BLOCKER_SUB_COMPLEX_H_
+
+#include <gudhi/Skeleton_blocker_complex.h>
+#include <gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h>
+#include <gudhi/Debug_utils.h>
#include <map>
#include <vector>
-#include "gudhi/Skeleton_blocker_complex.h"
-#include "gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h"
-#include "gudhi/Utils.h"
-
namespace Gudhi {
-namespace skbl {
+namespace skeleton_blocker {
/**
* @brief Simplicial subcomplex of a complex represented by a skeleton/blockers pair.
@@ -66,34 +66,19 @@ class Skeleton_blocker_sub_complex : public ComplexType {
public:
using ComplexType::add_vertex;
- using ComplexType::add_edge;
+ using ComplexType::add_edge_without_blockers;
using ComplexType::add_blocker;
typedef typename ComplexType::Vertex_handle Vertex_handle;
typedef typename ComplexType::Root_vertex_handle Root_vertex_handle;
- typedef typename ComplexType::Simplex_handle Simplex_handle;
+ typedef typename ComplexType::Simplex Simplex;
typedef typename ComplexType::Root_simplex_handle Root_simplex_handle;
protected:
- ///**
- //* @brief Returns true iff the simplex formed by all vertices contained in 'addresses_sigma_in_link'
- //* but 'vertex_to_be_ignored' is in 'link'
- //*/
- /*
- template<typename T> friend bool
- proper_face_in_union(
- Skeleton_blocker_sub_complex<T> & link,
- std::vector<boost::optional<typename T::Vertex_handle> > & addresses_sigma_in_link,
- int vertex_to_be_ignored);*/
-
/**
* @brief Determines whether all proper faces of simplex 'sigma' belong to 'link1' \cup 'link2'
* where 'link1' and 'link2' are subcomplexes of the same complex of type ComplexType
*/
- // template<typename T> friend bool
- // proper_faces_in_union(Skeleton_blocker_simplex<typename T::Root_vertex_handle> & sigma, Skeleton_blocker_sub_complex<T> & link1, Skeleton_blocker_sub_complex<T> & link2){
- // template<typename T> friend bool
- // proper_faces_in_union(Skeleton_blocker_simplex<typename T::Root_vertex_handle> & sigma, Skeleton_blocker_sub_complex<T> & link1, Skeleton_blocker_sub_complex<T> & link2);
typedef std::map<Root_vertex_handle, Vertex_handle> IdAddressMap;
typedef typename IdAddressMap::value_type AddressPair;
typedef typename IdAddressMap::iterator IdAddressMapIterator;
@@ -124,11 +109,11 @@ class Skeleton_blocker_sub_complex : public ComplexType {
* It assumes that both vertices corresponding to v1_root and v2_root are present
* in the sub-complex.
*/
- void add_edge(Root_vertex_handle v1_root, Root_vertex_handle v2_root) {
+ void add_edge_without_blockers(Root_vertex_handle v1_root, Root_vertex_handle v2_root) {
auto v1_sub(this->get_address(v1_root));
auto v2_sub(this->get_address(v2_root));
assert(v1_sub && v2_sub);
- this->ComplexType::add_edge(*v1_sub, *v2_sub);
+ this->ComplexType::add_edge_without_blockers(*v1_sub, *v2_sub);
}
/**
@@ -139,7 +124,7 @@ class Skeleton_blocker_sub_complex : public ComplexType {
void add_blocker(const Root_simplex_handle& blocker_root) {
auto blocker_sub = this->get_address(blocker_root);
assert(blocker_sub);
- this->add_blocker(new Simplex_handle(*blocker_sub));
+ this->add_blocker(new Simplex(*blocker_sub));
}
public:
@@ -148,7 +133,7 @@ class Skeleton_blocker_sub_complex : public ComplexType {
* vertices of 'simplex'.
*/
void make_restricted_complex(const ComplexType & parent_complex,
- const Simplex_handle& simplex) {
+ const Simplex& simplex) {
this->clear();
// add vertices to the sub complex
for (auto x : simplex) {
@@ -160,11 +145,11 @@ class Skeleton_blocker_sub_complex : public ComplexType {
// add edges to the sub complex
for (auto x : simplex) {
// x_neigh is the neighbor of x intersected with vertices_simplex
- Simplex_handle x_neigh;
+ Simplex x_neigh;
parent_complex.add_neighbours(x, x_neigh, true);
x_neigh.intersection(simplex);
for (auto y : x_neigh) {
- this->add_edge(parent_complex[x].get_id(), parent_complex[y].get_id());
+ this->add_edge_without_blockers(parent_complex[x].get_id(), parent_complex[y].get_id());
}
}
@@ -173,9 +158,9 @@ class Skeleton_blocker_sub_complex : public ComplexType {
// check if it is the first time we encounter the blocker
if (simplex.contains(*blocker)) {
Root_simplex_handle blocker_root(parent_complex.get_id(*(blocker)));
- Simplex_handle blocker_restr(
+ Simplex blocker_restr(
*(this->get_simplex_address(blocker_root)));
- this->add_blocker(new Simplex_handle(blocker_restr));
+ this->add_blocker(new Simplex(blocker_restr));
}
}
}
@@ -203,7 +188,7 @@ class Skeleton_blocker_sub_complex : public ComplexType {
// * Allocates a simplex in L corresponding to the simplex s in K
// * with its local adresses and returns an AddressSimplex.
// */
- // boost::optional<Simplex_handle> get_address(const Root_simplex_handle & s) const;
+ // boost::optional<Simplex> get_address(const Root_simplex_handle & s) const;
// private:
/**
@@ -235,7 +220,7 @@ bool proper_face_in_union(
// 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_handle sigma_in_link;
+ typename ComplexType::Simplex sigma_in_link;
for (int i = 0; i < addresses_sigma_in_link.size(); ++i) {
if (i != vertex_to_be_ignored) {
if (!addresses_sigma_in_link[i]) {
@@ -297,9 +282,11 @@ bool proper_faces_in_union(
return true;
}
-} // namespace skbl
+} // namespace skeleton_blocker
+
+namespace skbl = skeleton_blocker;
} // namespace Gudhi
-#endif // SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SKELETON_BLOCKER_SUB_COMPLEX_H_
+#endif // SKELETON_BLOCKER_SKELETON_BLOCKER_SUB_COMPLEX_H_
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Top_faces.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Top_faces.h
index 32538f38..39d95661 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Top_faces.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Top_faces.h
@@ -1,67 +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.
- *
- * 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 TOP_FACES_H_
-#define TOP_FACES_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.
+ *
+ * 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 SKELETON_BLOCKER_INTERNAL_TOP_FACES_H_
+#define SKELETON_BLOCKER_INTERNAL_TOP_FACES_H_
#include <list>
#include <vector>
#include <set>
+namespace Gudhi {
+
+namespace skeleton_blocker {
+
template<typename SimplexHandle>
-std::list<SimplexHandle> subfaces(SimplexHandle top_face){
- std::list<SimplexHandle> res;
- if(top_face.dimension()==-1) return res;
- if(top_face.dimension()==0) {
- res.push_back(top_face);
- return res;
- }
- else{
- auto first_vertex = top_face.first_vertex();
- top_face.remove_vertex(first_vertex);
- res = subfaces(top_face);
- std::list<SimplexHandle> copy = res;
- for(auto& simplex : copy){
- simplex.add_vertex(first_vertex);
- }
- res.push_back(SimplexHandle(first_vertex));
- res.splice(res.end(),copy);
- return res;
- }
+std::list<SimplexHandle> subfaces(SimplexHandle top_face) {
+ std::list<SimplexHandle> res;
+ if (top_face.dimension() == -1) return res;
+ if (top_face.dimension() == 0) {
+ res.push_back(top_face);
+ return res;
+ } else {
+ auto first_vertex = top_face.first_vertex();
+ top_face.remove_vertex(first_vertex);
+ res = subfaces(top_face);
+ std::list<SimplexHandle> copy = res;
+ for (auto& simplex : copy) {
+ simplex.add_vertex(first_vertex);
+ }
+ res.push_back(SimplexHandle(first_vertex));
+ res.splice(res.end(), copy);
+ return res;
+ }
}
/**
* add all faces of top_face in simplices_per_dimension
*/
template<typename SimplexHandle>
-void register_faces(
- std::vector< std::set<SimplexHandle> >& simplices_per_dimension,
- const SimplexHandle& top_face){
- std::list<SimplexHandle> subfaces_list = subfaces(top_face);
- for(auto& simplex : subfaces_list ){
- simplices_per_dimension[simplex.dimension()].insert(simplex);
- }
+void register_faces(std::vector< std::set<SimplexHandle> >& simplices_per_dimension,
+ const SimplexHandle& top_face) {
+ std::list<SimplexHandle> subfaces_list = subfaces(top_face);
+ for (auto& simplex : subfaces_list) {
+ simplices_per_dimension[simplex.dimension()].insert(simplex);
+ }
}
+} // namespace skeleton_blocker
+namespace skbl = skeleton_blocker;
+} // namespace Gudhi
-#endif /* TOP_FACES_H_ */
+#endif // SKELETON_BLOCKER_INTERNAL_TOP_FACES_H_
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Trie.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Trie.h
index f2a443dc..cdc47b8a 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Trie.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/internal/Trie.h
@@ -1,13 +1,10 @@
-/*
- * Trie.h
- * Created on: Jan 29, 2015
- * This file is part of the Gudhi Library. The Gudhi library
+/* 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-Méditerranée (France)
+ * 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
@@ -25,8 +22,8 @@
*/
-#ifndef TRIE_H_
-#define TRIE_H_
+#ifndef SKELETON_BLOCKER_INTERNAL_TRIE_H_
+#define SKELETON_BLOCKER_INTERNAL_TRIE_H_
#include <memory>
#include <vector>
@@ -35,242 +32,239 @@
namespace Gudhi {
-
-namespace skbl {
-
+namespace skeleton_blocker {
template<typename SimplexHandle>
-struct Trie{
- typedef SimplexHandle Simplex_handle;
- typedef typename SimplexHandle::Vertex_handle Vertex_handle;
-
- Vertex_handle v;
- std::vector<std::shared_ptr<Trie> > childs;
- //std::vector<std::unique_ptr<Trie> > childs; -> use of deleted function
-private:
- const Trie* parent_;
-public:
- Trie():parent_(0){}
- Trie(Vertex_handle v_):v(v_),parent_(0){}
-
- Trie(Vertex_handle v_,Trie* parent):v(v_),parent_(parent){}
-
-
- bool operator==(const Trie& other) const{
- return (v == other.v) ;
- }
-
- void add_child(Trie* child){
- if(child){
- std::shared_ptr<Trie> ptr_to_add(child);
- childs.push_back(ptr_to_add);
- child->parent_ = this;
- }
- }
-
- typedef typename Simplex_handle::Simplex_vertex_const_iterator Simplex_vertex_const_iterator;
-
-
- Trie* make_trie(Simplex_vertex_const_iterator s_it,Simplex_vertex_const_iterator s_end){
- if(s_it == s_end) return 0;
- else{
- Trie* res = new Trie(*s_it);
- Trie* child = make_trie(++s_it,s_end);
- res->add_child(child);
- return res;
- }
- }
-private:
- //go down recursively in the tree while advancing the simplex iterator.
- //when it reaches a leaf, it inserts the remaining that is not present
- void add_simplex_helper(Simplex_vertex_const_iterator s_it,Simplex_vertex_const_iterator s_end){
- assert(*s_it == v);
- ++s_it;
- if(s_it==s_end) return ;
- if(!is_leaf()){
- for(auto child : childs){
- if(child->v == *s_it)
- return child->add_simplex_helper(s_it,s_end);
- }
- //s_it is not found and needs to be inserted
- }
- //not leaf -> remaining of s needs to be inserted
- Trie* son_with_what_remains_of_s(make_trie(s_it,s_end));
- add_child(son_with_what_remains_of_s);
- return;
- }
-
- void maximal_faces_helper(std::vector<Simplex_handle>& res) const{
- if(is_leaf()) res.push_back(simplex());
- else
- for(auto child : childs)
- child->maximal_faces_helper(res);
- }
-
-public:
- /**
- * adds the simplex to the trie
- */
- void add_simplex(const Simplex_handle& s){
- if(s.empty()) return;
- assert(v==s.first_vertex());
- add_simplex_helper(s.begin(),s.end());
- }
-
- std::vector<Simplex_handle> maximal_faces() const{
- std::vector<Simplex_handle> res;
- maximal_faces_helper(res);
- return res;
- }
-
- /**
- * Goes to the root in the trie to consitute simplex
- */
- void add_vertices_up_to_the_root(Simplex_handle& res) const{
- res.add_vertex(v);
- if(parent_)
- parent_->add_vertices_up_to_the_root(res);
- }
-
- Simplex_handle simplex() const{
- Simplex_handle res;
- add_vertices_up_to_the_root(res);
- return res;
- }
-
- bool is_leaf() const{
- return childs.empty();
- }
-
- bool is_root() const{
- return parent_==0;
- }
-
- const Trie* parent() {
- return parent_;
- }
-
- void remove_leaf() {
- assert(is_leaf);
- if(!is_root())
- parent_->childs.erase(this);
- }
-
- /**
- * true iff the simplex corresponds to one node in the trie
- */
- bool contains(const Simplex_handle& s) const{
- Trie const* current = this;
- if(s.empty()) return true;
- if(current->v != s.first_vertex()) return false;
- auto s_pos = s.begin();
- ++s_pos;
- while(s_pos != s.end() && current != 0){
- bool found = false;
- for(const auto child : current->childs){
- if(child->v == *s_pos) {
- ++s_pos;
- current = child.get();
- found = true;
- break;
- }
- }
- if(!found) return false;
- }
- return current!=0;
- }
-
- Trie* go_bottom_left(){
- if(is_leaf())
- return this;
- else
- return (*childs.begin())->go_bottom_left();
- }
-
- friend std::ostream& operator<<(std::ostream& stream, const Trie& trie){
- stream<< "T( "<< trie.v<< " ";
- for(auto t : trie.childs)
- stream << *t ;
- stream<<")";
- return stream;
- }
+struct Trie {
+ typedef SimplexHandle Simplex;
+ typedef typename SimplexHandle::Vertex_handle Vertex_handle;
+
+ Vertex_handle v;
+ std::vector<std::shared_ptr<Trie> > childs;
+ // std::vector<std::unique_ptr<Trie> > childs; -> use of deleted function
+ private:
+ const Trie* parent_;
+
+ public:
+ Trie() : parent_(0) { }
+
+ Trie(Vertex_handle v_) : v(v_), parent_(0) { }
+
+ Trie(Vertex_handle v_, Trie* parent) : v(v_), parent_(parent) { }
+
+ bool operator==(const Trie& other) const {
+ return (v == other.v);
+ }
+
+ void add_child(Trie* child) {
+ if (child) {
+ std::shared_ptr<Trie> ptr_to_add(child);
+ childs.push_back(ptr_to_add);
+ child->parent_ = this;
+ }
+ }
+
+ typedef typename Simplex::Simplex_vertex_const_iterator Simplex_vertex_const_iterator;
+
+ Trie* make_trie(Simplex_vertex_const_iterator s_it, Simplex_vertex_const_iterator s_end) {
+ if (s_it == s_end) {
+ return 0;
+ } else {
+ Trie* res = new Trie(*s_it);
+ Trie* child = make_trie(++s_it, s_end);
+ res->add_child(child);
+ return res;
+ }
+ }
+
+ private:
+ // go down recursively in the tree while advancing the simplex iterator.
+ // when it reaches a leaf, it inserts the remaining that is not present
+ void add_simplex_helper(Simplex_vertex_const_iterator s_it, Simplex_vertex_const_iterator s_end) {
+ assert(*s_it == v);
+ ++s_it;
+ if (s_it == s_end) return;
+ if (!is_leaf()) {
+ for (auto child : childs) {
+ if (child->v == *s_it)
+ return child->add_simplex_helper(s_it, s_end);
+ }
+ // s_it is not found and needs to be inserted
+ }
+ // not leaf -> remaining of s needs to be inserted
+ Trie * son_with_what_remains_of_s(make_trie(s_it, s_end));
+ add_child(son_with_what_remains_of_s);
+ return;
+ }
+
+ void maximal_faces_helper(std::vector<Simplex>& res) const {
+ if (is_leaf()) res.push_back(simplex());
+ else
+ for (auto child : childs)
+ child->maximal_faces_helper(res);
+ }
+
+ public:
+ /**
+ * adds the simplex to the trie
+ */
+ void add_simplex(const Simplex& s) {
+ if (s.empty()) return;
+ assert(v == s.first_vertex());
+ add_simplex_helper(s.begin(), s.end());
+ }
+
+ std::vector<Simplex> maximal_faces() const {
+ std::vector<Simplex> res;
+ maximal_faces_helper(res);
+ return res;
+ }
+
+ /**
+ * Goes to the root in the trie to consitute simplex
+ */
+ void add_vertices_up_to_the_root(Simplex& res) const {
+ res.add_vertex(v);
+ if (parent_)
+ parent_->add_vertices_up_to_the_root(res);
+ }
+
+ Simplex simplex() const {
+ Simplex res;
+ add_vertices_up_to_the_root(res);
+ return res;
+ }
+
+ bool is_leaf() const {
+ return childs.empty();
+ }
+
+ bool is_root() const {
+ return parent_ == 0;
+ }
+
+ const Trie* parent() {
+ return parent_;
+ }
+
+ void remove_leaf() {
+ assert(is_leaf);
+ if (!is_root())
+ parent_->childs.erase(this);
+ }
+
+ /**
+ * true iff the simplex corresponds to one node in the trie
+ */
+ bool contains(const Simplex& s) const {
+ Trie const* current = this;
+ if (s.empty()) return true;
+ if (current->v != s.first_vertex()) return false;
+ auto s_pos = s.begin();
+ ++s_pos;
+ while (s_pos != s.end() && current != 0) {
+ bool found = false;
+ for (const auto child : current->childs) {
+ if (child->v == *s_pos) {
+ ++s_pos;
+ current = child.get();
+ found = true;
+ break;
+ }
+ }
+ if (!found) return false;
+ }
+ return current != 0;
+ }
+
+ Trie* go_bottom_left() {
+ if (is_leaf())
+ return this;
+ else
+ return (*childs.begin())->go_bottom_left();
+ }
+
+ friend std::ostream& operator<<(std::ostream& stream, const Trie& trie) {
+ stream << "T( " << trie.v << " ";
+ for (auto t : trie.childs)
+ stream << *t;
+ stream << ")";
+ return stream;
+ }
};
-
template<typename SimplexHandle>
-struct Tries{
- typedef typename SimplexHandle::Vertex_handle Vertex_handle;
- typedef SimplexHandle Simplex_handle;
-
- typedef Trie<Simplex_handle> STrie;
-
-
- template<typename SimpleHandleOutputIterator>
- Tries(unsigned num_vertices,SimpleHandleOutputIterator simplex_begin, SimpleHandleOutputIterator simplex_end):
- cofaces_(num_vertices,0){
- for (auto i = 0u; i < num_vertices; ++i)
- cofaces_[i] = new STrie(Vertex_handle(i));
- for (auto s_it = simplex_begin; s_it != simplex_end; ++s_it) {
- if (s_it->dimension() >= 1)
- cofaces_[s_it->first_vertex()]->add_simplex(*s_it);
- }
- }
-
- ~Tries(){
- for(STrie* t : cofaces_)
- delete t;
- }
-
- //return a simplex that consists in all u such uv is an edge and u>v
- Simplex_handle positive_neighbors(Vertex_handle v) const{
- Simplex_handle res;
- for(auto child : cofaces_[v]->childs)
- res.add_vertex(child->v);
- return res;
- }
-
- bool contains(const Simplex_handle& s) const{
- auto first_v = s.first_vertex();
- return cofaces_[first_v]->contains(s);
- }
-
- friend std::ostream& operator<<(std::ostream& stream, const Tries& tries){
- for(auto trie : tries.cofaces_)
- stream<<*trie<<std::endl;
- return stream;
- }
-
- //init_next_dimension must be called first
- std::vector<Simplex_handle> next_dimension_simplices() const{
- std::vector<Simplex_handle> res;
- 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());
- to_see_.pop_front();
- }
- ++current_dimension_;
- return res;
- }
-
- void init_next_dimension() const{
- for(auto trie : cofaces_)
- to_see_.push_back(trie);
- }
-
-private:
- mutable std::deque<STrie*> to_see_;
- mutable unsigned current_dimension_=0;
-
-
- std::vector<STrie*> cofaces_;
-
+struct Tries {
+ typedef typename SimplexHandle::Vertex_handle Vertex_handle;
+ typedef SimplexHandle Simplex;
+
+ typedef Trie<Simplex> STrie;
+
+ template<typename SimpleHandleOutputIterator>
+ Tries(unsigned num_vertices, SimpleHandleOutputIterator simplex_begin, SimpleHandleOutputIterator simplex_end) :
+ cofaces_(num_vertices, 0) {
+ for (auto i = 0u; i < num_vertices; ++i)
+ cofaces_[i] = new STrie(Vertex_handle(i));
+ for (auto s_it = simplex_begin; s_it != simplex_end; ++s_it) {
+ if (s_it->dimension() >= 1)
+ cofaces_[s_it->first_vertex()]->add_simplex(*s_it);
+ }
+ }
+
+ ~Tries() {
+ for (STrie* t : cofaces_)
+ delete t;
+ }
+
+ // return a simplex that consists in all u such uv is an edge and u>v
+
+ Simplex positive_neighbors(Vertex_handle v) const {
+ Simplex res;
+ for (auto child : cofaces_[v]->childs)
+ res.add_vertex(child->v);
+ return res;
+ }
+
+ bool contains(const Simplex& s) const {
+ auto first_v = s.first_vertex();
+ return cofaces_[first_v]->contains(s);
+ }
+
+ friend std::ostream& operator<<(std::ostream& stream, const Tries& tries) {
+ for (auto trie : tries.cofaces_)
+ stream << *trie << std::endl;
+ return stream;
+ }
+
+ // init_next_dimension must be called first
+
+ std::vector<Simplex> next_dimension_simplices() const {
+ std::vector<Simplex> res;
+ 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());
+ to_see_.pop_front();
+ }
+ ++current_dimension_;
+ return res;
+ }
+
+ void init_next_dimension() const {
+ for (auto trie : cofaces_)
+ to_see_.push_back(trie);
+ }
+
+ private:
+ mutable std::deque<STrie*> to_see_;
+ mutable unsigned current_dimension_ = 0;
+ std::vector<STrie*> cofaces_;
};
+} // namespace skeleton_blocker
+namespace skbl = skeleton_blocker;
-}
-
-}
+} // namespace Gudhi
-#endif /* TRIE_H_ */
+#endif // SKELETON_BLOCKER_INTERNAL_TRIE_H_
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h
index f6f2c955..4dbc9ed3 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h
@@ -1,134 +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): 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 GUDHI_SKELETON_BLOCKERS_BLOCKERS_ITERATORS_H_
-#define GUDHI_SKELETON_BLOCKERS_BLOCKERS_ITERATORS_H_
-
-#include "boost/iterator/iterator_facade.hpp"
-
-namespace Gudhi{
-
-namespace skbl {
+/* 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 SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_BLOCKERS_ITERATORS_H_
+#define SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_BLOCKERS_ITERATORS_H_
+
+#include <boost/iterator/iterator_facade.hpp>
+
+namespace Gudhi {
+
+namespace skeleton_blocker {
/**
* @brief Iterator through the blockers of a vertex.
- */
-// ReturnType = const Simplex_handle* or Simplex_handle*
+ */
+// ReturnType = const Simplex* or Simplex*
// MapIteratorType = BlockerMapConstIterator or BlockerMapIterator
+
template<typename MapIteratorType, typename ReturnType>
class Blocker_iterator_internal : public boost::iterator_facade<
- Blocker_iterator_internal<MapIteratorType,ReturnType>,
- ReturnType,
- boost::forward_traversal_tag,
- ReturnType
- >{
-private:
- MapIteratorType current_position;
- MapIteratorType end_of_map;
-public:
-
- Blocker_iterator_internal():current_position(){}
-
- Blocker_iterator_internal(MapIteratorType position,MapIteratorType end_of_map_ ):
- current_position(position), end_of_map(end_of_map_)
- { }
-
- bool equal(const Blocker_iterator_internal& other) const{
- return current_position == other.current_position;
- }
-
- void increment(){
- goto_next_blocker();
- }
-
- ReturnType dereference() const {
- return(current_position->second);
- }
-
-private:
- /**
- * Let the current pair be (v,sigma) where v is a vertex and sigma is a blocker.
- * If v is not the first vertex of sigma then we already have seen sigma as a blocker
- * and we look for the next one.
- */
- void goto_next_blocker(){
- do {
- ++current_position;
- } while (!(current_position == end_of_map) && !first_time_blocker_is_seen());
- }
-
- bool first_time_blocker_is_seen() const{
- return current_position->first == current_position->second->first_vertex();
- }
+Blocker_iterator_internal<MapIteratorType, ReturnType>,
+ReturnType,
+boost::forward_traversal_tag,
+ReturnType
+> {
+ private:
+ MapIteratorType current_position;
+ MapIteratorType end_of_map;
+
+ public:
+ Blocker_iterator_internal() : current_position() { }
+
+ Blocker_iterator_internal(MapIteratorType position, MapIteratorType end_of_map_) :
+ current_position(position), end_of_map(end_of_map_) { }
+
+ bool equal(const Blocker_iterator_internal& other) const {
+ return current_position == other.current_position;
+ }
+
+ void increment() {
+ goto_next_blocker();
+ }
+
+ ReturnType dereference() const {
+ return (current_position->second);
+ }
+
+ private:
+ /**
+ * Let the current pair be (v,sigma) where v is a vertex and sigma is a blocker.
+ * If v is not the first vertex of sigma then we already have seen sigma as a blocker
+ * and we look for the next one.
+ */
+ void goto_next_blocker() {
+ do {
+ ++current_position;
+ } while (!(current_position == end_of_map) && !first_time_blocker_is_seen());
+ }
+
+ bool first_time_blocker_is_seen() const {
+ return current_position->first == current_position->second->first_vertex();
+ }
};
-
-
/**
* @brief Iterator through the blockers of a vertex
*/
-// ReturnType = const Simplex_handle* or Simplex_handle*
+// ReturnType = const Simplex* or Simplex*
// MapIteratorType = BlockerMapConstIterator or BlockerMapIterator
+
template<typename MapIteratorType, typename ReturnType>
class Blocker_iterator_around_vertex_internal : public boost::iterator_facade<
- Blocker_iterator_around_vertex_internal<MapIteratorType,ReturnType>,
- ReturnType,
- boost::forward_traversal_tag,
- ReturnType
->{
-private:
- MapIteratorType current_position_;
-public:
-
- Blocker_iterator_around_vertex_internal():current_position_(){}
-
- Blocker_iterator_around_vertex_internal(MapIteratorType position):
- current_position_(position)
- {}
-
- Blocker_iterator_around_vertex_internal& operator=(Blocker_iterator_around_vertex_internal other){
- this->current_position_ = other.current_position_;
- return *this;
- }
-
- bool equal(const Blocker_iterator_around_vertex_internal& other) const{
- return current_position_ == other.current_position_;
- }
-
- void increment(){
- current_position_++;
- }
-
- ReturnType dereference() const{
- return(current_position_->second);
- }
-
-
- MapIteratorType current_position(){
- return this->current_position_;
- }
+Blocker_iterator_around_vertex_internal<MapIteratorType, ReturnType>,
+ReturnType,
+boost::forward_traversal_tag,
+ReturnType
+> {
+ private:
+ MapIteratorType current_position_;
+
+ public:
+ Blocker_iterator_around_vertex_internal() : current_position_() { }
+
+ Blocker_iterator_around_vertex_internal(MapIteratorType position) :
+ current_position_(position) { }
+
+ Blocker_iterator_around_vertex_internal& operator=(Blocker_iterator_around_vertex_internal other) {
+ this->current_position_ = other.current_position_;
+ return *this;
+ }
+
+ bool equal(const Blocker_iterator_around_vertex_internal& other) const {
+ return current_position_ == other.current_position_;
+ }
+
+ void increment() {
+ current_position_++;
+ }
+
+ ReturnType dereference() const {
+ return (current_position_->second);
+ }
+
+ MapIteratorType current_position() {
+ return this->current_position_;
+ }
};
-}
+} // namespace skeleton_blocker
+
+namespace skbl = skeleton_blocker;
-} // namespace GUDHI
+} // namespace Gudhi
-#endif /* GUDHI_SKELETON_BLOCKERS_BLOCKERS_ITERATORS_H_ */
+#endif // SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_BLOCKERS_ITERATORS_H_
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h
index 0be6c74d..15618932 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h
@@ -1,167 +1,146 @@
- /* 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 GUDHI_SKELETON_BLOCKERS_ITERATORS_EDGES_H_
-#define GUDHI_SKELETON_BLOCKERS_ITERATORS_EDGES_H_
-
-#include "boost/iterator/iterator_facade.hpp"
-
-
-namespace Gudhi{
-
-namespace skbl {
+/* 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 SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_EDGES_ITERATORS_H_
+#define SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_EDGES_ITERATORS_H_
-template<typename SkeletonBlockerComplex>
-class Edge_around_vertex_iterator :
- public boost::iterator_facade < Edge_around_vertex_iterator<SkeletonBlockerComplex>
- , typename SkeletonBlockerComplex::Edge_handle const
- , boost::forward_traversal_tag
- , typename SkeletonBlockerComplex::Edge_handle const
- >
-{
- friend class boost::iterator_core_access;
-
- typedef SkeletonBlockerComplex Complex;
- typedef typename Complex::boost_adjacency_iterator boost_adjacency_iterator;
- typedef typename Complex::Vertex_handle Vertex_handle;
- typedef typename Complex::Edge_handle Edge_handle;
-
-private:
-
- const Complex* complex;
- Vertex_handle v;
-
- boost_adjacency_iterator current_;
- boost_adjacency_iterator end_;
-
-public:
-
- Edge_around_vertex_iterator():complex(NULL){
- }
-
- Edge_around_vertex_iterator(const Complex* complex_,Vertex_handle v_):
- complex(complex_),
- v(v_)
- {
- tie(current_,end_) = adjacent_vertices(v.vertex, complex->skeleton);
- }
-
- /**
- * returns an iterator to the end
- */
- Edge_around_vertex_iterator(const Complex* complex_,Vertex_handle v_,int end):
- complex(complex_),
- v(v_)
- {
- tie(current_,end_) = adjacent_vertices(v.vertex, complex->skeleton);
- set_end();
- }
-
- bool equal(const Edge_around_vertex_iterator& other) const{
- return (complex== other.complex) && (v == other.v) && (current_ == other.current_) && (end_ == other.end_);
- }
-
- void increment(){
- if(current_ != end_)
- ++current_;
- }
-
- Edge_handle dereference() const{
- return *(*complex)[std::make_pair(v,static_cast<Vertex_handle>(*current_))];
- }
-
-private:
- //remove this ugly hack
- void set_end(){
- current_ = end_;
- }
-};
+#include <boost/iterator/iterator_facade.hpp>
+#include <boost/graph/adjacency_list.hpp>
+
+#include <utility> // for pair<>
+namespace Gudhi {
+namespace skeleton_blocker {
+
+template<typename SkeletonBlockerComplex>
+class Edge_around_vertex_iterator : public boost::iterator_facade <Edge_around_vertex_iterator<SkeletonBlockerComplex>
+, typename SkeletonBlockerComplex::Edge_handle const, boost::forward_traversal_tag
+, typename SkeletonBlockerComplex::Edge_handle const> {
+ friend class boost::iterator_core_access;
+
+ typedef SkeletonBlockerComplex Complex;
+ typedef typename Complex::boost_adjacency_iterator boost_adjacency_iterator;
+ typedef typename Complex::Vertex_handle Vertex_handle;
+ typedef typename Complex::Edge_handle Edge_handle;
+
+ private:
+ const Complex* complex;
+ Vertex_handle v;
+
+ boost_adjacency_iterator current_;
+ boost_adjacency_iterator end_;
+
+ public:
+ Edge_around_vertex_iterator() : complex(NULL) { }
+
+ Edge_around_vertex_iterator(const Complex* complex_, Vertex_handle v_) :
+ complex(complex_),
+ v(v_) {
+ tie(current_, end_) = adjacent_vertices(v.vertex, complex->skeleton);
+ }
+
+ /**
+ * returns an iterator to the end
+ */
+ Edge_around_vertex_iterator(const Complex* complex_, Vertex_handle v_, int end) :
+ complex(complex_),
+ v(v_) {
+ tie(current_, end_) = adjacent_vertices(v.vertex, complex->skeleton);
+ set_end();
+ }
+
+ bool equal(const Edge_around_vertex_iterator& other) const {
+ return (complex == other.complex) && (v == other.v) && (current_ == other.current_) && (end_ == other.end_);
+ }
+
+ void increment() {
+ if (current_ != end_)
+ ++current_;
+ }
+
+ Edge_handle dereference() const {
+ return *(*complex)[std::make_pair(v, static_cast<Vertex_handle> (*current_))];
+ }
+
+ private:
+ // remove this ugly hack
+ void set_end() {
+ current_ = end_;
+ }
+};
/**
*@brief Iterator on the edges of a simplicial complex.
*
*/
template<typename SkeletonBlockerComplex>
-class Edge_iterator :
-public boost::iterator_facade < Edge_iterator<SkeletonBlockerComplex>
+class Edge_iterator : public boost::iterator_facade <Edge_iterator<SkeletonBlockerComplex>
, typename SkeletonBlockerComplex::Edge_handle const
, boost::forward_traversal_tag
-, typename SkeletonBlockerComplex::Edge_handle const
->
-
-{
- friend class boost::iterator_core_access;
-public:
- typedef SkeletonBlockerComplex Complex;
- typedef typename Complex::boost_edge_iterator boost_edge_iterator;
- typedef typename Complex::Edge_handle Edge_handle;
-
-
- const Complex* complex;
- std::pair<boost_edge_iterator,boost_edge_iterator> edge_iterator ;
-
- Edge_iterator():complex(NULL){
- }
-
- Edge_iterator(const SkeletonBlockerComplex* complex_):
- complex(complex_),
- edge_iterator(boost::edges(complex_->skeleton))
- {
- }
-
- /**
- * return an iterator to the end
- */
- Edge_iterator(const SkeletonBlockerComplex* complex_,int end):
- complex(complex_),
- edge_iterator(boost::edges(complex_->skeleton))
- {
- edge_iterator.first = edge_iterator.second;
- }
-
-
- bool equal(const Edge_iterator& other) const{
- return (complex == other.complex) && (edge_iterator == other.edge_iterator);
- }
-
- void increment(){
- if(edge_iterator.first != edge_iterator.second){
- ++(edge_iterator.first);
- }
- }
-
- Edge_handle dereference() const{
- return(*(edge_iterator.first));
- }
+, typename SkeletonBlockerComplex::Edge_handle const> {
+ friend class boost::iterator_core_access;
+
+ public:
+ typedef SkeletonBlockerComplex Complex;
+ typedef typename Complex::boost_edge_iterator boost_edge_iterator;
+ typedef typename Complex::Edge_handle Edge_handle;
+
+ const Complex* complex;
+ std::pair<boost_edge_iterator, boost_edge_iterator> edge_iterator;
+
+ Edge_iterator() : complex(NULL) { }
+
+ Edge_iterator(const SkeletonBlockerComplex* complex_) :
+ complex(complex_),
+ edge_iterator(boost::edges(complex_->skeleton)) { }
+
+ /**
+ * return an iterator to the end
+ */
+ Edge_iterator(const SkeletonBlockerComplex* complex_, int end) :
+ complex(complex_),
+ edge_iterator(boost::edges(complex_->skeleton)) {
+ edge_iterator.first = edge_iterator.second;
+ }
+
+ bool equal(const Edge_iterator& other) const {
+ return (complex == other.complex) && (edge_iterator == other.edge_iterator);
+ }
+
+ void increment() {
+ if (edge_iterator.first != edge_iterator.second) {
+ ++(edge_iterator.first);
+ }
+ }
+
+ Edge_handle dereference() const {
+ return (*(edge_iterator.first));
+ }
};
+} // namespace skeleton_blocker
+namespace skbl = skeleton_blocker;
-}
-
-} // namespace GUDHI
-
-
-#endif /* GUDHI_SKELETON_BLOCKERS_ITERATORS_EDGES_H_ */
-
+} // namespace Gudhi
+#endif // SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_EDGES_ITERATORS_H_
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_iterators.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_iterators.h
index 20a94734..cc3ed276 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_iterators.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_iterators.h
@@ -19,17 +19,14 @@
* 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_SKELETON_BLOCKERS_ITERATORS_H_
-#define GUDHI_SKELETON_BLOCKERS_ITERATORS_H_
+#ifndef SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_ITERATORS_H_
+#define SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_ITERATORS_H_
-#include "Skeleton_blockers_vertices_iterators.h"
-#include "Skeleton_blockers_edges_iterators.h"
-#include "Skeleton_blockers_blockers_iterators.h"
-#include "Skeleton_blockers_triangles_iterators.h"
-#include "Skeleton_blockers_simplices_iterators.h"
+#include <gudhi/Skeleton_blocker/iterators/Skeleton_blockers_vertices_iterators.h>
+#include <gudhi/Skeleton_blocker/iterators/Skeleton_blockers_edges_iterators.h>
+#include <gudhi/Skeleton_blocker/iterators/Skeleton_blockers_blockers_iterators.h>
+#include <gudhi/Skeleton_blocker/iterators/Skeleton_blockers_triangles_iterators.h>
+#include <gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h>
-
-
-
-#endif /* GUDHI_SKELETON_BLOCKERS_ITERATORS_H_ */
+#endif // SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_ITERATORS_H_
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h
index 666ce430..3b941be5 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h
@@ -1,45 +1,41 @@
- /* 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 GUDHI_KELETON_BLOCKERS_SIMPLICES_ITERATORS_H_
-#define GUDHI_SKELETON_BLOCKERS_SIMPLICES_ITERATORS_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.
+ *
+ * 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 SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_SIMPLICES_ITERATORS_H_
+#define SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_SIMPLICES_ITERATORS_H_
+
+#include <gudhi/Skeleton_blocker_link_complex.h>
+#include <gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.h>
+#include <gudhi/Skeleton_blocker/internal/Trie.h>
+#include <gudhi/Debug_utils.h>
+
+#include <boost/iterator/iterator_facade.hpp>
#include <memory>
#include <list>
#include <iostream>
-#include "gudhi/Utils.h"
-#include "boost/iterator/iterator_facade.hpp"
-
-
-#include "gudhi/Skeleton_blocker_link_complex.h"
-#include "gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.h"
-
-#include "gudhi/Skeleton_blocker/internal/Trie.h"
-
namespace Gudhi {
-
-namespace skbl {
-
+namespace skeleton_blocker {
/**
* Link may be Skeleton_blocker_link_complex<SkeletonBlockerComplex> to iterate over all
@@ -49,299 +45,356 @@ namespace skbl {
* The iteration is done by computing a trie with the link and doing a breadth-first traversal
* of the trie.
*/
-template<typename SkeletonBlockerComplex,typename Link>
+template<typename SkeletonBlockerComplex, typename Link>
class Simplex_around_vertex_iterator :
- public boost::iterator_facade < Simplex_around_vertex_iterator<SkeletonBlockerComplex,Link>
-, typename SkeletonBlockerComplex::Simplex_handle
+public boost::iterator_facade < Simplex_around_vertex_iterator<SkeletonBlockerComplex, Link>
+, typename SkeletonBlockerComplex::Simplex
, boost::forward_traversal_tag
-, typename SkeletonBlockerComplex::Simplex_handle
->
-{
- friend class boost::iterator_core_access;
- typedef SkeletonBlockerComplex Complex;
- typedef typename Complex::Vertex_handle Vertex_handle;
- typedef typename Complex::Edge_handle Edge_handle;
- typedef typename Complex::Simplex_handle Simplex_handle;
-
-
- typedef typename Link::Vertex_handle Link_vertex_handle;
- // Link_vertex_handle == Complex_Vertex_handle but this renaming helps avoiding confusion
-
- typedef typename Gudhi::skbl::Trie<Simplex_handle> Trie;
-
-
-private:
- const Complex* complex;
- Vertex_handle v;
- std::shared_ptr<Link> link_v;
- std::shared_ptr<Trie> trie;
- std::list<Trie*> nodes_to_be_seen; // todo deque
-
-public:
- Simplex_around_vertex_iterator():complex(0){
- }
-
- Simplex_around_vertex_iterator(const Complex* complex_,Vertex_handle v_):
- complex(complex_),
- v(v_),
- link_v(new Link(*complex_,v_)),
- trie(new Trie(v_)){
- compute_trie_and_nodes_to_be_seen();
- }
-
- // todo avoid useless copy
- // todo 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()){
- }
- }
-
- /**
- * returns an iterator to the end
- */
- Simplex_around_vertex_iterator(const Complex* complex_,Vertex_handle v_,bool end):
- complex(complex_),
- v(v_){
- set_end();
- }
-
-private:
-
-
- void compute_trie_and_nodes_to_be_seen(){
- // once we go through every simplices passing through v0
- // we remove v0. That way, it prevents from passing a lot of times
- // though edges leaving v0.
- // another solution would have been to provides an adjacency iterator
- // to superior vertices that avoids lower ones.
- while(!link_v->empty()){
- auto v0 = *(link_v->vertex_range().begin());
- trie->add_child(build_trie(v0,trie.get()));
- link_v->remove_vertex(v0);
- }
- nodes_to_be_seen.push_back(trie.get());
- }
-
- Trie* build_trie(Link_vertex_handle link_vh,Trie* parent){
- Trie* res = new Trie(parent_vertex(link_vh),parent);
- for(Link_vertex_handle nv : link_v->vertex_range(link_vh)) {
- if(link_vh < nv){
- Simplex_handle simplex_node_plus_nv(res->simplex());
- simplex_node_plus_nv.add_vertex(parent_vertex(nv));
- if(complex->contains(simplex_node_plus_nv)){
- res->add_child(build_trie(nv,res));
- }
- }
- }
- return res;
- }
-
- bool is_node_in_complex(Trie* trie){
- return true;
- }
-
- Vertex_handle parent_vertex(Link_vertex_handle link_vh) const{
- return complex->convert_handle_from_another_complex(*link_v,link_vh);
- }
-
-
-
-public:
-
- friend std::ostream& operator<<(std::ostream& stream, const Simplex_around_vertex_iterator& savi){
- stream<< savi.trie<< std::endl; ;
- stream << "("<<savi.nodes_to_be_seen.size()<<") nodes to see\n";
- return stream;
- }
-
- bool equal(const Simplex_around_vertex_iterator& other) const{
- bool same_complex = (complex == other.complex);
- if(!same_complex)
- return false;
-
- if(!(v == other.v))
- return false;
-
- bool both_empty = nodes_to_be_seen.empty() && other.nodes_to_be_seen.empty();
- if(both_empty)
- return true;
-
- 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
-
- bool same_node = (**(nodes_to_be_seen.begin()) == **(other.nodes_to_be_seen.begin()));
- return same_node;
- }
-
- void increment(){
- assert(!is_end());
- Trie* first_node = nodes_to_be_seen.front();
-
- nodes_to_be_seen.pop_front();
-
- for(auto childs : first_node->childs){
- nodes_to_be_seen.push_back(childs.get());
- }
-
- }
-
- Simplex_handle dereference() const{
- assert(!nodes_to_be_seen.empty());
- Trie* first_node = nodes_to_be_seen.front();
- return first_node->simplex();
- }
-
-//private:
- Simplex_handle get_trie_address() const{
- assert(!nodes_to_be_seen.empty());
- return nodes_to_be_seen.front();
- }
-
-private:
- void set_end(){
- nodes_to_be_seen.clear();
- }
-
- bool is_end() const{
- return nodes_to_be_seen.empty();
- }
+, typename SkeletonBlockerComplex::Simplex
+> {
+ friend class boost::iterator_core_access;
+ typedef SkeletonBlockerComplex Complex;
+ typedef typename Complex::Vertex_handle Vertex_handle;
+ typedef typename Complex::Edge_handle Edge_handle;
+ typedef typename Complex::Simplex Simplex;
+
+ // Link_vertex_handle == Complex_Vertex_handle but this renaming helps avoiding confusion
+ typedef typename Link::Vertex_handle Link_vertex_handle;
+
+ typedef typename Gudhi::skeleton_blocker::Trie<Simplex> Trie;
+
+ private:
+ const Complex* complex;
+ Vertex_handle v;
+ std::shared_ptr<Link> link_v;
+ std::shared_ptr<Trie> trie;
+ std::list<Trie*> nodes_to_be_seen; // todo deque
+
+ public:
+ Simplex_around_vertex_iterator() : complex(0) {}
+
+ Simplex_around_vertex_iterator(const Complex* complex_, Vertex_handle v_) :
+ complex(complex_),
+ v(v_),
+ link_v(new Link(*complex_, v_)),
+ trie(new Trie(v_)) {
+ compute_trie_and_nodes_to_be_seen();
+ }
+
+ // todo avoid useless copy
+ // todo 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()) {}
+ }
+
+ /**
+ * returns an iterator to the end
+ */
+ Simplex_around_vertex_iterator(const Complex* complex_, Vertex_handle v_, bool end) :
+ complex(complex_),
+ v(v_) {
+ set_end();
+ }
+
+ private:
+ void compute_trie_and_nodes_to_be_seen() {
+ // once we go through every simplices passing through v0
+ // we remove v0. That way, it prevents from passing a lot of times
+ // though edges leaving v0.
+ // another solution would have been to provides an adjacency iterator
+ // to superior vertices that avoids lower ones.
+ while (!link_v->empty()) {
+ auto v0 = *(link_v->vertex_range().begin());
+ trie->add_child(build_trie(v0, trie.get()));
+ link_v->remove_vertex(v0);
+ }
+ nodes_to_be_seen.push_back(trie.get());
+ }
+
+ Trie* build_trie(Link_vertex_handle link_vh, Trie* parent) {
+ Trie* res = new Trie(parent_vertex(link_vh), parent);
+ for (Link_vertex_handle nv : link_v->vertex_range(link_vh)) {
+ if (link_vh < nv) {
+ Simplex simplex_node_plus_nv(res->simplex());
+ simplex_node_plus_nv.add_vertex(parent_vertex(nv));
+ if (complex->contains(simplex_node_plus_nv)) {
+ res->add_child(build_trie(nv, res));
+ }
+ }
+ }
+ return res;
+ }
+
+ bool is_node_in_complex(Trie* trie) {
+ return true;
+ }
+
+ Vertex_handle parent_vertex(Link_vertex_handle link_vh) const {
+ return complex->convert_handle_from_another_complex(*link_v, link_vh);
+ }
+
+ public:
+ friend std::ostream& operator<<(std::ostream& stream, const Simplex_around_vertex_iterator& savi) {
+ stream << savi.trie << std::endl;
+ stream << "(" << savi.nodes_to_be_seen.size() << ") nodes to see\n";
+ return stream;
+ }
+
+ bool equal(const Simplex_around_vertex_iterator& other) const {
+ bool same_complex = (complex == other.complex);
+ if (!same_complex)
+ return false;
+
+ if (!(v == other.v))
+ return false;
+
+ bool both_empty = nodes_to_be_seen.empty() && other.nodes_to_be_seen.empty();
+ if (both_empty)
+ return true;
+
+ 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
+
+ bool same_node = (**(nodes_to_be_seen.begin()) == **(other.nodes_to_be_seen.begin()));
+ return same_node;
+ }
+
+ void increment() {
+ assert(!is_end());
+ Trie* first_node = nodes_to_be_seen.front();
+
+ nodes_to_be_seen.pop_front();
+
+ for (auto childs : first_node->childs) {
+ nodes_to_be_seen.push_back(childs.get());
+ }
+ }
+
+ Simplex dereference() const {
+ assert(!nodes_to_be_seen.empty());
+ Trie* first_node = nodes_to_be_seen.front();
+ return first_node->simplex();
+ }
+
+ Simplex get_trie_address() const {
+ assert(!nodes_to_be_seen.empty());
+ return nodes_to_be_seen.front();
+ }
+
+ private:
+ void set_end() {
+ nodes_to_be_seen.clear();
+ }
+
+ bool is_end() const {
+ return nodes_to_be_seen.empty();
+ }
};
-
-
template<typename SkeletonBlockerComplex>
class Simplex_iterator :
- public boost::iterator_facade < Simplex_iterator<SkeletonBlockerComplex>
-, typename SkeletonBlockerComplex::Simplex_handle
+public boost::iterator_facade < Simplex_iterator<SkeletonBlockerComplex>
+, typename SkeletonBlockerComplex::Simplex
, boost::forward_traversal_tag
-, typename SkeletonBlockerComplex::Simplex_handle
->
-{
- typedef Skeleton_blocker_link_superior<SkeletonBlockerComplex> Link;
-
- friend class boost::iterator_core_access;
-
- template<class SkBlDS> friend class Skeleton_blocker_complex;
-
-
- typedef SkeletonBlockerComplex Complex;
- typedef typename Complex::Vertex_handle Vertex_handle;
- typedef typename Complex::Edge_handle Edge_handle;
- typedef typename Complex::Simplex_handle Simplex_handle;
-
- typedef typename Complex::Complex_vertex_iterator Complex_vertex_iterator;
-
-
- typedef typename Link::Vertex_handle Link_vertex_handle;
-
-private:
-
- const Complex* complex_;
- Complex_vertex_iterator current_vertex_;
-
- typedef Simplex_around_vertex_iterator<SkeletonBlockerComplex,Link> SAVI;
- SAVI current_simplex_around_current_vertex_;
- SAVI simplices_around_current_vertex_end_;
-
-
-public:
- Simplex_iterator():complex_(0){}
-
- // should not be called if the complex is empty
- Simplex_iterator(const Complex* complex):
- complex_(complex),
- current_vertex_(complex->vertex_range().begin()),
- current_simplex_around_current_vertex_(complex,*current_vertex_),
- simplices_around_current_vertex_end_(complex,*current_vertex_,true)
- {
- assert(!complex->empty());
- }
+, typename SkeletonBlockerComplex::Simplex
+> {
+ typedef Skeleton_blocker_link_superior<SkeletonBlockerComplex> Link;
+
+ friend class boost::iterator_core_access;
+
+ template<class SkBlDS> friend class Skeleton_blocker_complex;
+
+ typedef SkeletonBlockerComplex Complex;
+ typedef typename Complex::Vertex_handle Vertex_handle;
+ typedef typename Complex::Edge_handle Edge_handle;
+ typedef typename Complex::Simplex Simplex;
+ typedef typename Complex::Complex_vertex_iterator Complex_vertex_iterator;
+ typedef typename Link::Vertex_handle Link_vertex_handle;
+
+ private:
+ const Complex* complex_;
+ Complex_vertex_iterator current_vertex_;
+
+ typedef Simplex_around_vertex_iterator<SkeletonBlockerComplex, Link> SAVI;
+ SAVI current_simplex_around_current_vertex_;
+ SAVI simplices_around_current_vertex_end_;
+
+ public:
+ Simplex_iterator() : complex_(0) { }
+
+ Simplex_iterator(const Complex* complex) :
+ complex_(complex),
+ current_vertex_(complex->vertex_range().begin()),
+ current_simplex_around_current_vertex_(complex, *current_vertex_),
+ simplices_around_current_vertex_end_(complex, *current_vertex_, true) {
+ // should not be called if the complex is empty
+ assert(!complex->empty());
+ }
+
+ private:
+ // todo return to private
+ Simplex_iterator(const Complex* complex, bool end) :
+ complex_(complex) {
+ set_end();
+ }
+
+ public:
+ Simplex_iterator(const Simplex_iterator& other)
+ :
+ complex_(other.complex_),
+ current_vertex_(other.current_vertex_),
+ current_simplex_around_current_vertex_(other.current_simplex_around_current_vertex_),
+ simplices_around_current_vertex_end_(other.simplices_around_current_vertex_end_) { }
+
+ friend Simplex_iterator make_begin_iterator(const Complex* complex) {
+ if (complex->empty())
+ return make_end_simplex_iterator(complex);
+ else
+ return Simplex_iterator(complex);
+ }
+
+ friend Simplex_iterator make_end_simplex_iterator(const Complex* complex) {
+ return Simplex_iterator(complex, true);
+ }
+
+ bool equal(const Simplex_iterator& other) const {
+ if (complex_ != other.complex_) return false;
+ if (current_vertex_ != other.current_vertex_) return false;
+ if (is_end() && other.is_end()) return true;
+ if (current_simplex_around_current_vertex_ != other.current_simplex_around_current_vertex_)
+ return false;
+ return true;
+ }
+
+ void increment() {
+ if (current_simplex_around_current_vertex_ != simplices_around_current_vertex_end_) {
+ current_simplex_around_current_vertex_.increment();
+ if (current_simplex_around_current_vertex_ == simplices_around_current_vertex_end_)
+ goto_next_vertex();
+ } else {
+ goto_next_vertex();
+ }
+ }
+
+ void goto_next_vertex() {
+ current_vertex_.increment();
+ if (!is_end()) {
+ current_simplex_around_current_vertex_ = SAVI(complex_, *current_vertex_);
+ simplices_around_current_vertex_end_ = SAVI(complex_, *current_vertex_, true);
+ }
+ }
+
+ Simplex dereference() const {
+ return current_simplex_around_current_vertex_.dereference();
+ }
+
+ private:
+ void set_end() {
+ current_vertex_ = complex_->vertex_range().end();
+ }
+
+ bool is_end() const {
+ return (current_vertex_ == complex_->vertex_range().end());
+ }
+};
-private:
- // todo return to private
- Simplex_iterator(const Complex* complex,bool end):
- complex_(complex)
- {
- set_end();
- }
+/**
+ * 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>
+, typename SkeletonBlockerComplex::Simplex, boost::forward_traversal_tag, typename SkeletonBlockerComplex::Simplex> {
+ friend class boost::iterator_core_access;
+ typedef SkeletonBlockerComplex Complex;
+ typedef typename Complex::Vertex_handle Vertex_handle;
+ typedef typename Complex::Edge_handle Edge_handle;
+ typedef typename Complex::Simplex Simplex;
+ typedef typename Complex::Complex_vertex_iterator Complex_vertex_iterator;
+
+ // Link_vertex_handle == Complex_Vertex_handle but this renaming helps avoiding confusion
+ typedef typename Link::Vertex_handle Link_vertex_handle;
+
+ private:
+ const Complex* complex;
+ const Simplex& sigma;
+ std::shared_ptr<Link> link;
+ Complex_vertex_iterator current_vertex;
+ Complex_vertex_iterator link_vertex_end;
+
+ public:
+ 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
+ link(new Link(*complex_, sigma_, false, true)) {
+ auto link_vertex_range = link->vertex_range();
+ current_vertex = link_vertex_range.begin();
+ link_vertex_end = link_vertex_range.end();
+ }
+
+ Simplex_coboundary_iterator(const Simplex_coboundary_iterator& other) :
+ complex(other.complex),
+ sigma(other.sigma),
+ 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) :
+ complex(complex_),
+ sigma(sigma_) {
+ // to represent an end iterator without having to build a useless link, we use
+ // the convection that link is not initialized.
+ }
+
+ private:
+ Vertex_handle parent_vertex(Link_vertex_handle link_vh) const {
+ return complex->convert_handle_from_another_complex(*link, link_vh);
+ }
public:
-
- Simplex_iterator(const Simplex_iterator& other)
- :
- complex_(other.complex_),
- current_vertex_(other.current_vertex_),
- current_simplex_around_current_vertex_(other.current_simplex_around_current_vertex_),
- simplices_around_current_vertex_end_(other.simplices_around_current_vertex_end_)
- {
- }
-
- friend Simplex_iterator make_begin_iterator(const Complex* complex){
- if(complex->empty())
- return make_end_simplex_iterator(complex);
- else
- return Simplex_iterator(complex);
- }
-
- friend Simplex_iterator make_end_simplex_iterator(const Complex* complex){
- return Simplex_iterator(complex,true);
- }
-
- bool equal(const Simplex_iterator& other) const{
- if(complex_!=other.complex_) return false;
- if(current_vertex_!=other.current_vertex_) return false;
- if(is_end() && other.is_end()) return true;
- if(current_simplex_around_current_vertex_ != other.current_simplex_around_current_vertex_)
- return false;
- return true;
- }
-
- void increment(){
- if(current_simplex_around_current_vertex_!= simplices_around_current_vertex_end_){
- current_simplex_around_current_vertex_.increment();
- if( current_simplex_around_current_vertex_== simplices_around_current_vertex_end_)
- goto_next_vertex();
- }
- else{
- goto_next_vertex();
- }
- }
-
- void goto_next_vertex(){
- current_vertex_.increment();
- if(!is_end()){
- current_simplex_around_current_vertex_= SAVI(complex_,*current_vertex_);
- simplices_around_current_vertex_end_ = SAVI(complex_,*current_vertex_,true);
- }
- }
-
- Simplex_handle dereference() const{
- return current_simplex_around_current_vertex_.dereference();
- }
+ friend std::ostream& operator<<(std::ostream& stream, const Simplex_coboundary_iterator& sci) {
+ return stream;
+ }
+
+ // 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();
+ return *current_vertex == *(other.current_vertex);
+ }
+
+ void increment() {
+ ++current_vertex;
+ }
+
+ Simplex dereference() const {
+ Simplex res(sigma);
+ res.add_vertex(parent_vertex(*current_vertex));
+ return res;
+ }
private:
- void set_end(){
- current_vertex_ = complex_->vertex_range().end();
- }
-
- bool is_end() const{
- return (current_vertex_ == complex_->vertex_range().end());
- }
+ bool is_end() const {
+ return !link || current_vertex == link_vertex_end;
+ }
};
-}
-
-} // namespace GUDHI
-
-
+} // namespace skeleton_blocker
+namespace skbl = skeleton_blocker;
+} // namespace Gudhi
-#endif /* SKELETON_BLOCKERS_SIMPLICES_ITERATORS_H_ */
+#endif // SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_SIMPLICES_ITERATORS_H_
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_triangles_iterators.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_triangles_iterators.h
index e137d1ea..b2dd9a21 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_triangles_iterators.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_triangles_iterators.h
@@ -1,117 +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): 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 GUDHI_SKELETON_BLOCKERS_TRIANGLES_ITERATORS_H_
-#define GUDHI_SKELETON_BLOCKERS_TRIANGLES_ITERATORS_H_
-
-#include "boost/iterator/iterator_facade.hpp"
+/* 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 SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_TRIANGLES_ITERATORS_H_
+#define SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_TRIANGLES_ITERATORS_H_
+
+#include <boost/iterator/iterator_facade.hpp>
#include <memory>
-namespace Gudhi{
+namespace Gudhi {
-namespace skbl {
+namespace skeleton_blocker {
-//////////////////////////////////////////////////////////////////////
/**
* \brief Iterator over the triangles that are
* adjacent to a vertex of the simplicial complex.
* \remark Will be removed soon -> dont look
*/
-template<typename Complex,typename LinkType>
+template<typename Complex, typename LinkType>
class Triangle_around_vertex_iterator : public boost::iterator_facade
-< Triangle_around_vertex_iterator <Complex,LinkType>
-, typename Complex::Simplex_handle const
+< Triangle_around_vertex_iterator <Complex, LinkType>
+, typename Complex::Simplex const
, boost::forward_traversal_tag
-, typename Complex::Simplex_handle const
->
-{
- friend class boost::iterator_core_access;
- template<typename T> friend class Triangle_iterator;
-private:
- typedef typename LinkType::Vertex_handle Vertex_handle;
- typedef typename LinkType::Root_vertex_handle Root_vertex_handle;
- typedef typename LinkType::Simplex_handle Simplex_handle;
- typedef typename Complex::Complex_edge_iterator Complex_edge_iterator_;
-
- const Complex* complex_;
- Vertex_handle v_;
- std::shared_ptr<LinkType> link_;
- Complex_edge_iterator_ current_edge_;
- bool is_end_;
-public:
- Triangle_around_vertex_iterator(const Complex* complex,Vertex_handle v):
- complex_(complex),v_(v),link_(new LinkType(*complex,v_)),
- current_edge_(link_->edge_range().begin()),
- is_end_(current_edge_ == link_->edge_range().end()){
- }
-
- /**
- * @brief ugly hack to get an iterator to the end
- */
- Triangle_around_vertex_iterator(const Complex* complex,Vertex_handle v,bool is_end):
- complex_(complex),v_(v),link_(0),is_end_(true){
- }
-
- /**
- * @brief ugly hack to get an iterator to the end
- */
- Triangle_around_vertex_iterator():
- complex_(0),v_(-1),link_(0),is_end_(true){
- }
-
-
- Triangle_around_vertex_iterator(const Triangle_around_vertex_iterator& other){
- v_ = other.v_;
- complex_ = other.complex_;
- is_end_ = other.is_end_;
-
- if(!is_end_){
- link_ = other.link_;
- current_edge_= other.current_edge_;
- }
- }
-
- bool equal(const Triangle_around_vertex_iterator& other) const{
- return (complex_==other.complex_) && ((finished() &&other.finished()) || current_edge_ == other.current_edge_);
- }
-
- Simplex_handle dereference() const{
- Root_vertex_handle v1 = (*link_)[*current_edge_].first();
- Root_vertex_handle v2 = (*link_)[*current_edge_].second();
- return Simplex_handle(v_,*(complex_->get_address(v1)),*(complex_->get_address(v2)));
- }
-
- void increment(){
- ++current_edge_;
- }
-
-private:
- bool finished() const{
- return is_end_ || (current_edge_ == link_->edge_range().end());
- }
-
+, typename Complex::Simplex const> {
+ friend class boost::iterator_core_access;
+ template<typename T> friend class Triangle_iterator;
+ private:
+ typedef typename LinkType::Vertex_handle Vertex_handle;
+ typedef typename LinkType::Root_vertex_handle Root_vertex_handle;
+ typedef typename LinkType::Simplex Simplex;
+ typedef typename Complex::Complex_edge_iterator Complex_edge_iterator_;
+
+ const Complex* complex_;
+ Vertex_handle v_;
+ std::shared_ptr<LinkType> link_;
+ Complex_edge_iterator_ current_edge_;
+ bool is_end_;
+
+ public:
+ Triangle_around_vertex_iterator(const Complex* complex, Vertex_handle v) :
+ complex_(complex), v_(v), link_(new LinkType(*complex, v_)),
+ current_edge_(link_->edge_range().begin()),
+ is_end_(current_edge_ == link_->edge_range().end()) { }
+
+ /**
+ * @brief ugly hack to get an iterator to the end
+ */
+ Triangle_around_vertex_iterator(const Complex* complex, Vertex_handle v, bool is_end) :
+ complex_(complex), v_(v), link_(0), is_end_(true) { }
+
+ /**
+ * @brief ugly hack to get an iterator to the end
+ */
+ Triangle_around_vertex_iterator() :
+ complex_(0), v_(-1), link_(0), is_end_(true) { }
+
+ Triangle_around_vertex_iterator(const Triangle_around_vertex_iterator& other) {
+ v_ = other.v_;
+ complex_ = other.complex_;
+ is_end_ = other.is_end_;
+
+ if (!is_end_) {
+ link_ = other.link_;
+ current_edge_ = other.current_edge_;
+ }
+ }
+
+ bool equal(const Triangle_around_vertex_iterator& other) const {
+ return (complex_ == other.complex_) && ((finished() && other.finished()) || current_edge_ == other.current_edge_);
+ }
+
+ Simplex dereference() const {
+ Root_vertex_handle v1 = (*link_)[*current_edge_].first();
+ Root_vertex_handle v2 = (*link_)[*current_edge_].second();
+ return Simplex(v_, *(complex_->get_address(v1)), *(complex_->get_address(v2)));
+ }
+
+ void increment() {
+ ++current_edge_;
+ }
+
+ private:
+ bool finished() const {
+ return is_end_ || (current_edge_ == link_->edge_range().end());
+ }
};
-
-
/**
* \brief Iterator over the triangles of the
* simplicial complex.
@@ -119,121 +110,113 @@ private:
*
*/
template<typename SkeletonBlockerComplex>
-class Triangle_iterator :
- public boost::iterator_facade<
- Triangle_iterator <SkeletonBlockerComplex>,
- typename SkeletonBlockerComplex::Simplex_handle const
- , boost::forward_traversal_tag
- , typename SkeletonBlockerComplex::Simplex_handle const
- >
-{
- friend class boost::iterator_core_access;
-private:
- typedef typename SkeletonBlockerComplex::Vertex_handle Vertex_handle;
- typedef typename SkeletonBlockerComplex::Root_vertex_handle Root_vertex_handle;
- typedef typename SkeletonBlockerComplex::Simplex_handle Simplex_handle;
- typedef typename SkeletonBlockerComplex::Superior_triangle_around_vertex_iterator STAVI;
- typedef typename SkeletonBlockerComplex::Complex_vertex_iterator Complex_vertex_iterator;
-
- const SkeletonBlockerComplex* complex_;
- Complex_vertex_iterator current_vertex_;
- STAVI current_triangle_;
- bool is_end_;
-public:
-
- /*
- * @remark assume that the complex is non-empty
- */
- 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
- is_end_(false){
-
- assert(!complex->empty());
- gotoFirstTriangle();
- }
-
-private:
- //goto to the first triangle or to the end if none
- void gotoFirstTriangle(){
- if(!is_finished() && current_triangle_.finished()){
- goto_next_vertex();
- }
- }
-public:
-
- /**
- * @brief ugly hack to get an iterator to the end
- * @remark assume that the complex is non-empty
- */
- Triangle_iterator(const SkeletonBlockerComplex* complex,bool is_end):
- complex_(complex),
- current_vertex_(complex->vertex_range().end()),
- current_triangle_(), // xxx this line is problematic is the complex is empty
- is_end_(true){
- }
-
-
- Triangle_iterator& operator=(const Triangle_iterator & other){
- complex_ = other.complex_;
- Complex_vertex_iterator current_vertex_;
- STAVI current_triangle_;
- return *this;
- }
-
-
- bool equal(const Triangle_iterator& other) const{
- bool both_are_finished = is_finished() && other.is_finished();
- 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_));
-
- }
-
- Simplex_handle dereference() const{
- return *current_triangle_;
- }
-
-private:
-
- // 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
-
- ++current_vertex_;
-
- if(!is_finished()){
- current_triangle_ = STAVI(complex_, *current_vertex_);
- if(current_triangle_.finished())
- goto_next_vertex();
- }
- }
-public:
- void increment(){
- if(!current_triangle_.finished()){
- ++current_triangle_; // problem here
- if(current_triangle_.finished())
- goto_next_vertex();
- }
- else{
- assert(!is_finished());
- goto_next_vertex();
- }
- }
-
-private:
- bool is_finished() const{
- return is_end_ || current_vertex_ == complex_->vertex_range().end();
- }
+class Triangle_iterator : public boost::iterator_facade<
+Triangle_iterator <SkeletonBlockerComplex>,
+typename SkeletonBlockerComplex::Simplex const
+, boost::forward_traversal_tag
+, typename SkeletonBlockerComplex::Simplex const> {
+ friend class boost::iterator_core_access;
+ private:
+ typedef typename SkeletonBlockerComplex::Vertex_handle Vertex_handle;
+ typedef typename SkeletonBlockerComplex::Root_vertex_handle Root_vertex_handle;
+ typedef typename SkeletonBlockerComplex::Simplex Simplex;
+ typedef typename SkeletonBlockerComplex::Superior_triangle_around_vertex_iterator STAVI;
+ typedef typename SkeletonBlockerComplex::Complex_vertex_iterator Complex_vertex_iterator;
+
+ const SkeletonBlockerComplex* complex_;
+ Complex_vertex_iterator current_vertex_;
+ STAVI current_triangle_;
+ bool is_end_;
+
+ public:
+ /*
+ * @remark assume that the complex is non-empty
+ */
+ 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
+ is_end_(false) {
+ assert(!complex->empty());
+ gotoFirstTriangle();
+ }
+
+ private:
+ // goto to the first triangle or to the end if none
+ void gotoFirstTriangle() {
+ if (!is_finished() && current_triangle_.finished()) {
+ goto_next_vertex();
+ }
+ }
+
+ public:
+ /**
+ * @brief ugly hack to get an iterator to the end
+ * @remark assume that the complex is non-empty
+ */
+ Triangle_iterator(const SkeletonBlockerComplex* complex, bool is_end) :
+ complex_(complex),
+ current_vertex_(complex->vertex_range().end()),
+ current_triangle_(), // xxx this line is problematic is the complex is empty
+ is_end_(true) { }
+
+ Triangle_iterator& operator=(const Triangle_iterator & other) {
+ complex_ = other.complex_;
+ Complex_vertex_iterator current_vertex_;
+ STAVI current_triangle_;
+ return *this;
+ }
+
+ bool equal(const Triangle_iterator& other) const {
+ bool both_are_finished = is_finished() && other.is_finished();
+ 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_));
+ }
+
+ Simplex dereference() const {
+ return *current_triangle_;
+ }
+
+ private:
+ // 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
+
+ ++current_vertex_;
+
+ if (!is_finished()) {
+ current_triangle_ = STAVI(complex_, *current_vertex_);
+ if (current_triangle_.finished())
+ goto_next_vertex();
+ }
+ }
+
+ public:
+ void increment() {
+ if (!current_triangle_.finished()) {
+ ++current_triangle_; // problem here
+ if (current_triangle_.finished())
+ goto_next_vertex();
+ } else {
+ assert(!is_finished());
+ goto_next_vertex();
+ }
+ }
+
+ private:
+ bool is_finished() const {
+ return is_end_ || current_vertex_ == complex_->vertex_range().end();
+ }
};
-}
+} // namespace skeleton_blocker
+
+namespace skbl = skeleton_blocker;
-} // namespace GUDHI
+} // namespace Gudhi
-#endif /* GUDHI_SKELETON_BLOCKERS_TRIANGLES_ITERATORS_H_ */
+#endif // SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_TRIANGLES_ITERATORS_H_
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_vertices_iterators.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_vertices_iterators.h
index a9d4e373..f06cab71 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_vertices_iterators.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker/iterators/Skeleton_blockers_vertices_iterators.h
@@ -1,33 +1,34 @@
- /* 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 GUDHI_SKELETON_BLOCKERS_VERTICES_ITERATORS_H_
-#define GUDHI_SKELETON_BLOCKERS_VERTICES_ITERATORS_H_
-
-#include "boost/iterator/iterator_facade.hpp"
-
-
-namespace Gudhi{
-
-namespace skbl {
+/* 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 SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_VERTICES_ITERATORS_H_
+#define SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_VERTICES_ITERATORS_H_
+
+#include <boost/iterator/iterator_facade.hpp>
+
+#include <utility> // for pair<>
+
+namespace Gudhi {
+
+namespace skeleton_blocker {
/**
*@brief Iterator on the vertices of a simplicial complex
@@ -35,148 +36,139 @@ namespace skbl {
*@remark Incrementation increases Vertex_handle.
*/
template<typename SkeletonBlockerComplex>
-class Vertex_iterator : public boost::iterator_facade
-< Vertex_iterator <SkeletonBlockerComplex>
- , typename SkeletonBlockerComplex::Vertex_handle const
- , boost::forward_traversal_tag
- , typename SkeletonBlockerComplex::Vertex_handle const
- >
-{
- friend class boost::iterator_core_access;
-
- typedef typename SkeletonBlockerComplex::boost_vertex_iterator boost_vertex_iterator;
- typedef typename SkeletonBlockerComplex::Vertex_handle Vertex_handle;
-private:
- const SkeletonBlockerComplex* complex;
- std::pair<boost_vertex_iterator,boost_vertex_iterator> vertexIterator;
-
-
-public:
- Vertex_iterator():complex(NULL){
- }
-
- Vertex_iterator(const SkeletonBlockerComplex* complex_):
- complex(complex_),
- vertexIterator(vertices(complex_->skeleton)){
- if(!finished() && !is_active()) {
- goto_next_valid();
- }
- }
-
- /**
- * return an iterator to the end.
- */
- Vertex_iterator(const SkeletonBlockerComplex* complex_,int end):
- complex(complex_),vertexIterator(vertices(complex_->skeleton)){
- vertexIterator.first = vertexIterator.second ;
- }
-
-public:
- void increment () {goto_next_valid();}
- Vertex_handle dereference() const {
- return(Vertex_handle(*(vertexIterator.first)));
- }
-
- bool equal(const Vertex_iterator& other) const{
- return vertexIterator == other.vertexIterator && complex == other.complex;
- }
-
- bool operator<(const Vertex_iterator& other) const{
- return dereference()<other.dereference();
- }
-
-private:
- bool finished() const{
- return vertexIterator.first == vertexIterator.second;
- }
-
- void goto_next_valid(){
- ++vertexIterator.first;
- if(!finished() && !is_active()){
- goto_next_valid();
- }
- }
-
- bool is_active() const{
- return ((*complex)[Vertex_handle(*vertexIterator.first)]).is_active();
- }
-
+class Vertex_iterator : public boost::iterator_facade< Vertex_iterator <SkeletonBlockerComplex>
+, typename SkeletonBlockerComplex::Vertex_handle const
+, boost::forward_traversal_tag
+, typename SkeletonBlockerComplex::Vertex_handle const> {
+ friend class boost::iterator_core_access;
+
+ typedef typename SkeletonBlockerComplex::boost_vertex_iterator boost_vertex_iterator;
+ typedef typename SkeletonBlockerComplex::Vertex_handle Vertex_handle;
+ private:
+ const SkeletonBlockerComplex* complex;
+ std::pair<boost_vertex_iterator, boost_vertex_iterator> vertexIterator;
+
+
+ public:
+ Vertex_iterator() : complex(NULL) { }
+
+ Vertex_iterator(const SkeletonBlockerComplex* complex_) :
+ complex(complex_),
+ vertexIterator(vertices(complex_->skeleton)) {
+ if (!finished() && !is_active()) {
+ goto_next_valid();
+ }
+ }
+
+ /**
+ * return an iterator to the end.
+ */
+ Vertex_iterator(const SkeletonBlockerComplex* complex_, int end) :
+ complex(complex_), vertexIterator(vertices(complex_->skeleton)) {
+ vertexIterator.first = vertexIterator.second;
+ }
+
+ public:
+ void increment() {
+ goto_next_valid();
+ }
+
+ Vertex_handle dereference() const {
+ return (Vertex_handle(*(vertexIterator.first)));
+ }
+
+ bool equal(const Vertex_iterator& other) const {
+ return vertexIterator == other.vertexIterator && complex == other.complex;
+ }
+
+ bool operator<(const Vertex_iterator& other) const {
+ return dereference() < other.dereference();
+ }
+
+ private:
+ bool finished() const {
+ return vertexIterator.first == vertexIterator.second;
+ }
+
+ void goto_next_valid() {
+ ++vertexIterator.first;
+ if (!finished() && !is_active()) {
+ goto_next_valid();
+ }
+ }
+
+ bool is_active() const {
+ return ((*complex)[Vertex_handle(*vertexIterator.first)]).is_active();
+ }
};
-
-
-
template<typename 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
- >
-{
- friend class boost::iterator_core_access;
-
- typedef SkeletonBlockerComplex Complex;
- typedef typename Complex::boost_adjacency_iterator boost_adjacency_iterator;
- typedef typename Complex::Vertex_handle Vertex_handle;
- typedef typename Complex::Edge_handle Edge_handle;
-
-private:
-
- const Complex* complex;
- Vertex_handle v;
-
- boost_adjacency_iterator current_;
- 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_):
- complex(complex_),
- v(v_){
- tie(current_,end_) = adjacent_vertices(v.vertex, complex->skeleton);
- }
-
- /**
- * returns an iterator to the end
- */
- Neighbors_vertices_iterator(const Complex* complex_,Vertex_handle v_,int end):
- complex(complex_),
- v(v_){
- tie(current_,end_) = adjacent_vertices(v.vertex, complex->skeleton);
- set_end();
- }
-
-
- void increment () {
- if(current_ != end_)
- ++current_;
- }
-
- Vertex_handle dereference() const {
- return(Vertex_handle(*current_));
- }
-
- bool equal(const Neighbors_vertices_iterator& other) const{
- return (complex== other.complex) && (v == other.v) && (current_ == other.current_) && (end_ == other.end_);
- }
-
-private:
- //todo remove this ugly hack
- void set_end(){
- current_ = end_;
- }
+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> {
+ friend class boost::iterator_core_access;
+
+ typedef SkeletonBlockerComplex Complex;
+ typedef typename Complex::boost_adjacency_iterator boost_adjacency_iterator;
+ typedef typename Complex::Vertex_handle Vertex_handle;
+ typedef typename Complex::Edge_handle Edge_handle;
+
+ private:
+ const Complex* complex;
+ Vertex_handle v;
+
+ boost_adjacency_iterator current_;
+ 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_) :
+ complex(complex_),
+ v(v_) {
+ tie(current_, end_) = adjacent_vertices(v.vertex, complex->skeleton);
+ }
+
+ /**
+ * returns an iterator to the end
+ */
+ Neighbors_vertices_iterator(const Complex* complex_, Vertex_handle v_, int end) :
+ complex(complex_),
+ v(v_) {
+ tie(current_, end_) = adjacent_vertices(v.vertex, complex->skeleton);
+ set_end();
+ }
+
+ void increment() {
+ if (current_ != end_)
+ ++current_;
+ }
+
+ Vertex_handle dereference() const {
+ return (Vertex_handle(*current_));
+ }
+
+ bool equal(const Neighbors_vertices_iterator& other) const {
+ return (complex == other.complex) && (v == other.v) && (current_ == other.current_) && (end_ == other.end_);
+ }
+
+ private:
+ // todo remove this ugly hack
+ void set_end() {
+ current_ = end_;
+ }
};
-}
+} // namespace skeleton_blocker
+
+namespace skbl = skeleton_blocker;
-} // namespace GUDHI
+} // namespace Gudhi
-#endif /* GUDHI_SKELETON_BLOCKERS_VERTICES_ITERATORS_H_ */
+#endif // SKELETON_BLOCKER_ITERATORS_SKELETON_BLOCKERS_VERTICES_ITERATORS_H_
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h
index 700830f2..7a6d1d50 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_complex.h
@@ -20,8 +20,18 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_COMPLEX_H_
-#define SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_COMPLEX_H_
+#ifndef SKELETON_BLOCKER_COMPLEX_H_
+#define SKELETON_BLOCKER_COMPLEX_H_
+
+#include <gudhi/Skeleton_blocker/iterators/Skeleton_blockers_iterators.h>
+#include <gudhi/Skeleton_blocker_link_complex.h>
+#include <gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.h>
+#include <gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h>
+#include <gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h>
+#include <gudhi/Skeleton_blocker/Skeleton_blocker_complex_visitor.h>
+#include <gudhi/Skeleton_blocker/internal/Top_faces.h>
+#include <gudhi/Skeleton_blocker/internal/Trie.h>
+#include <gudhi/Debug_utils.h>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/connected_components.hpp>
@@ -40,21 +50,9 @@
#include <algorithm>
#include <utility>
-#include "gudhi/Skeleton_blocker/iterators/Skeleton_blockers_iterators.h"
-#include "gudhi/Skeleton_blocker_link_complex.h"
-#include "gudhi/Skeleton_blocker/Skeleton_blocker_link_superior.h"
-#include "gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h"
-#include "gudhi/Skeleton_blocker/Skeleton_blocker_simplex.h"
-
-#include "gudhi/Skeleton_blocker/Skeleton_blocker_complex_visitor.h"
-#include "gudhi/Skeleton_blocker/internal/Top_faces.h"
-#include "gudhi/Skeleton_blocker/internal/Trie.h"
-
-#include "gudhi/Utils.h"
-
namespace Gudhi {
-namespace skbl {
+namespace skeleton_blocker {
/**
*@class Skeleton_blocker_complex
@@ -94,16 +92,16 @@ class Skeleton_blocker_complex {
/**
* @brief A ordered set of integers that represents a simplex.
*/
- typedef Skeleton_blocker_simplex<Vertex_handle> Simplex_handle;
+ typedef Skeleton_blocker_simplex<Vertex_handle> Simplex;
typedef Skeleton_blocker_simplex<Root_vertex_handle> Root_simplex_handle;
/**
* @brief Handle to a blocker of the complex.
*/
- typedef Simplex_handle* Blocker_handle;
+ typedef Simplex* Blocker_handle;
typedef typename Root_simplex_handle::Simplex_vertex_const_iterator Root_simplex_iterator;
- typedef typename Simplex_handle::Simplex_vertex_const_iterator Simplex_handle_iterator;
+ typedef typename Simplex::Simplex_vertex_const_iterator Simplex_handle_iterator;
protected:
typedef typename boost::adjacency_list<boost::setS, // edges
@@ -128,14 +126,14 @@ class Skeleton_blocker_complex {
typedef typename boost::graph_traits<Graph>::edge_descriptor Edge_handle;
protected:
- typedef std::multimap<Vertex_handle, Simplex_handle *> BlockerMap;
- typedef typename std::multimap<Vertex_handle, Simplex_handle *>::value_type BlockerPair;
- typedef typename std::multimap<Vertex_handle, Simplex_handle *>::iterator BlockerMapIterator;
- typedef typename std::multimap<Vertex_handle, Simplex_handle *>::const_iterator BlockerMapConstIterator;
+ typedef std::multimap<Vertex_handle, Simplex *> BlockerMap;
+ typedef typename std::multimap<Vertex_handle, Simplex *>::value_type BlockerPair;
+ typedef typename std::multimap<Vertex_handle, Simplex *>::iterator BlockerMapIterator;
+ typedef typename std::multimap<Vertex_handle, Simplex *>::const_iterator BlockerMapConstIterator;
protected:
- int num_vertices_;
- int num_blockers_;
+ size_t num_vertices_;
+ size_t num_blockers_;
typedef Skeleton_blocker_complex_visitor<Vertex_handle> Visitor;
// typedef Visitor* Visitor_ptr;
@@ -164,17 +162,17 @@ class Skeleton_blocker_complex {
/**
*@brief constructs a simplicial complex with a given number of vertices and a visitor.
*/
- explicit Skeleton_blocker_complex(int num_vertices_ = 0, Visitor* visitor_ = NULL)
+ explicit Skeleton_blocker_complex(size_t num_vertices_ = 0, Visitor* visitor_ = NULL)
: visitor(visitor_) {
clear();
- for (int i = 0; i < num_vertices_; ++i) {
+ for (size_t i = 0; i < num_vertices_; ++i) {
add_vertex();
}
}
private:
// typedef Trie<Skeleton_blocker_complex<SkeletonBlockerDS>> STrie;
- typedef Trie<Simplex_handle> STrie;
+ typedef Trie<Simplex> STrie;
public:
/**
@@ -182,37 +180,41 @@ class Skeleton_blocker_complex {
* @details is_flag_complex indicates if the complex is a flag complex or not (to know if blockers have to be computed or not).
*/
template<typename SimpleHandleOutputIterator>
- Skeleton_blocker_complex(SimpleHandleOutputIterator simplex_begin, SimpleHandleOutputIterator simplex_end,
+ Skeleton_blocker_complex(SimpleHandleOutputIterator simplices_begin, SimpleHandleOutputIterator simplices_end,
bool is_flag_complex = false, Visitor* visitor_ = NULL)
: num_vertices_(0),
num_blockers_(0),
visitor(visitor_) {
- add_vertex_and_edges(simplex_begin, simplex_end);
+ add_vertices_and_edges(simplices_begin, simplices_end);
if (!is_flag_complex)
// need to compute blockers
- add_blockers(simplex_begin, simplex_end);
+ add_blockers(simplices_begin, simplices_end);
}
private:
+ /**
+ * Add vertices and edges of a simplex in one pass
+ */
template<typename SimpleHandleOutputIterator>
- void add_vertex_and_edges(SimpleHandleOutputIterator simplex_begin, SimpleHandleOutputIterator simplex_end) {
+ void add_vertices_and_edges(SimpleHandleOutputIterator simplices_begin, SimpleHandleOutputIterator simplices_end) {
std::vector<std::pair<Vertex_handle, Vertex_handle>> edges;
// first pass to add vertices and edges
int num_vertex = -1;
- for (auto s_it = simplex_begin; s_it != simplex_end; ++s_it) {
+ for (auto s_it = simplices_begin; s_it != simplices_end; ++s_it) {
if (s_it->dimension() == 0) num_vertex = (std::max)(num_vertex, s_it->first_vertex().vertex);
if (s_it->dimension() == 1) edges.emplace_back(s_it->first_vertex(), s_it->last_vertex());
}
while (num_vertex-- >= 0) add_vertex();
for (const auto& e : edges)
- add_edge(e.first, e.second);
+ add_edge_without_blockers(e.first, e.second);
}
+
template<typename SimpleHandleOutputIterator>
- void add_blockers(SimpleHandleOutputIterator simplex_begin, SimpleHandleOutputIterator simplex_end) {
- Tries<Simplex_handle> tries(num_vertices(), simplex_begin, simplex_end);
+ void add_blockers(SimpleHandleOutputIterator simplices_begin, SimpleHandleOutputIterator simplices_end) {
+ Tries<Simplex> tries(num_vertices(), simplices_begin, simplices_end);
tries.init_next_dimension();
auto simplices(tries.next_dimension_simplices());
@@ -221,7 +223,7 @@ class Skeleton_blocker_complex {
for (auto& sigma : simplices) {
// common_positive_neighbors is the set of vertices u such that
// for all s in sigma, us is an edge and u>s
- Simplex_handle common_positive_neighbors(tries.positive_neighbors(sigma.last_vertex()));
+ Simplex common_positive_neighbors(tries.positive_neighbors(sigma.last_vertex()));
for (auto sigma_it = sigma.rbegin(); sigma_it != sigma.rend(); ++sigma_it)
if (sigma_it != sigma.rbegin())
common_positive_neighbors.intersection(tries.positive_neighbors(*sigma_it));
@@ -378,6 +380,7 @@ class Skeleton_blocker_complex {
/**
* @brief Adds a vertex to the simplicial complex and returns its Vertex_handle.
+ * @remark Vertex representation is contiguous.
*/
Vertex_handle add_vertex() {
Vertex_handle address(boost::add_vertex(skeleton));
@@ -427,7 +430,7 @@ class Skeleton_blocker_complex {
* @return true iff the simplicial complex contains all vertices
* of simplex sigma
*/
- bool contains_vertices(const Simplex_handle & sigma) const {
+ bool contains_vertices(const Simplex & sigma) const {
for (auto vertex : sigma)
if (!contains_vertex(vertex))
return false;
@@ -535,41 +538,68 @@ class Skeleton_blocker_complex {
* @details it assumes that the edge is present in the complex
*/
- Simplex_handle get_vertices(Edge_handle edge_handle) const {
+ Simplex get_vertices(Edge_handle edge_handle) const {
auto edge((*this)[edge_handle]);
- return Simplex_handle((*this)[edge.first()], (*this)[edge.second()]);
+ return Simplex((*this)[edge.first()], (*this)[edge.second()]);
}
/**
- * @brief Adds an edge between vertices a and b and all its cofaces.
+ * @brief Adds an edge between vertices a and b.
+ * @details For instance, the complex contains edge 01 and 12, then calling
+ * add_edge with vertex 0 and 2 will create a complex containing
+ * the edges 01, 12, 20 but not the triangle 012 (and hence this complex
+ * will contains a blocker 012).
*/
Edge_handle add_edge(Vertex_handle a, Vertex_handle b) {
+ // if the edge is already there we musnt go further
+ // as we may add blockers that should not be here
+ if (contains_edge(a, b))
+ return *((*this)[std::make_pair(a, b)]);
+ auto res = add_edge_without_blockers(a, b);
+ add_blockers_after_simplex_insertion(Simplex(a, b));
+ return res;
+ }
+
+ /**
+ * @brief Adds all edges of s in the complex.
+ */
+ void add_edge(const Simplex& s) {
+ for (auto i = s.begin(); i != s.end(); ++i)
+ for (auto j = i; ++j != s.end(); /**/)
+ add_edge(*i, *j);
+ }
+
+ /**
+ * @brief Adds an edge between vertices a and b without blockers.
+ * @details For instance, the complex contains edge 01 and 12, then calling
+ * add_edge with vertex 0 and 2 will create a complex containing
+ * the triangle 012.
+ */
+ Edge_handle add_edge_without_blockers(Vertex_handle a, Vertex_handle b) {
assert(contains_vertex(a) && contains_vertex(b));
assert(a != b);
auto edge_handle((*this)[std::make_pair(a, b)]);
- // std::pair<Edge_handle,bool> pair_descr_bool = (*this)[std::make_pair(a,b)];
- // Edge_handle edge_descr;
- // bool edge_present = pair_descr_bool.second;
if (!edge_handle) {
edge_handle = boost::add_edge(a.vertex, b.vertex, skeleton).first;
(*this)[*edge_handle].setId(get_id(a), get_id(b));
degree_[a.vertex]++;
degree_[b.vertex]++;
if (visitor)
- visitor->on_add_edge(a, b);
+ visitor->on_add_edge_without_blockers(a, b);
}
return *edge_handle;
}
+
/**
- * @brief Adds all edges and their cofaces of a simplex to the simplicial complex.
+ * @brief Adds all edges of s in the complex without adding blockers.
*/
- void add_edges(const Simplex_handle & sigma) {
- Simplex_handle_iterator i, j;
- for (i = sigma.begin(); i != sigma.end(); ++i)
- for (j = i, j++; j != sigma.end(); ++j)
- add_edge(*i, *j);
+ void add_edge_without_blockers(Simplex s) {
+ for (auto i = s.begin(); i != s.end(); ++i) {
+ for (auto j = i; ++j != s.end(); /**/)
+ add_edge_without_blockers(*i, *j);
+ }
}
/**
@@ -627,7 +657,7 @@ class Skeleton_blocker_complex {
* @return true iff the simplicial complex contains all vertices
* and all edges of simplex sigma
*/
- bool contains_edges(const Simplex_handle & sigma) const {
+ bool contains_edges(const Simplex & sigma) const {
for (auto i = sigma.begin(); i != sigma.end(); ++i) {
if (!contains_vertex(*i))
return false;
@@ -649,15 +679,14 @@ class Skeleton_blocker_complex {
* @brief Adds the simplex to the set of blockers and
* returns a Blocker_handle toward it if was not present before and 0 otherwise.
*/
- Blocker_handle add_blocker(const Simplex_handle& blocker) {
+ Blocker_handle add_blocker(const Simplex& blocker) {
assert(blocker.dimension() > 1);
if (contains_blocker(blocker)) {
- // std::cerr << "ATTEMPT TO ADD A BLOCKER ALREADY THERE ---> BLOCKER IGNORED" << endl;
return 0;
} else {
if (visitor)
visitor->on_add_blocker(blocker);
- Blocker_handle blocker_pt = new Simplex_handle(blocker);
+ Blocker_handle blocker_pt = new Simplex(blocker);
num_blockers_++;
auto vertex = blocker_pt->begin();
while (vertex != blocker_pt->end()) {
@@ -739,7 +768,7 @@ class Skeleton_blocker_complex {
*
* @remark contrarily to delete_blockers does not call the destructor
*/
- void remove_blocker(const Simplex_handle& sigma) {
+ void remove_blocker(const Simplex& sigma) {
assert(contains_blocker(sigma));
for (auto vertex : sigma)
remove_blocker(sigma, vertex);
@@ -777,7 +806,7 @@ class Skeleton_blocker_complex {
/**
* @return true iff s is a blocker of the simplicial complex
*/
- bool contains_blocker(const Simplex_handle & s) const {
+ bool contains_blocker(const Simplex & s) const {
if (s.dimension() < 2)
return false;
@@ -795,7 +824,7 @@ class Skeleton_blocker_complex {
* @return true iff a blocker of the simplicial complex
* is a face of sigma.
*/
- bool blocks(const Simplex_handle & sigma) const {
+ bool blocks(const Simplex & sigma) const {
for (auto s : sigma)
for (auto blocker : const_blocker_range(s))
if (sigma.contains(*blocker))
@@ -810,7 +839,7 @@ class Skeleton_blocker_complex {
* @details Adds to simplex the neighbours of v e.g. \f$ n \leftarrow n \cup N(v) \f$.
* If keep_only_superior is true then only vertices that are greater than v are added.
*/
- virtual void add_neighbours(Vertex_handle v, Simplex_handle & n,
+ virtual void add_neighbours(Vertex_handle v, Simplex & n,
bool keep_only_superior = false) const {
boost_adjacency_iterator ai, ai_end;
for (tie(ai, ai_end) = adjacent_vertices(v.vertex, skeleton); ai != ai_end;
@@ -833,7 +862,7 @@ class Skeleton_blocker_complex {
* todo revoir
*
*/
- virtual void add_neighbours(const Simplex_handle &alpha, Simplex_handle & res,
+ virtual void add_neighbours(const Simplex &alpha, Simplex & res,
bool keep_only_superior = false) const {
res.clear();
auto alpha_vertex = alpha.begin();
@@ -848,9 +877,9 @@ class Skeleton_blocker_complex {
* not neighbours of v e.g. \f$ res \leftarrow res \cap N(v) \f$.
* If 'keep_only_superior' is true then only vertices that are greater than v are keeped.
*/
- virtual void keep_neighbours(Vertex_handle v, Simplex_handle& res,
+ virtual void keep_neighbours(Vertex_handle v, Simplex& res,
bool keep_only_superior = false) const {
- Simplex_handle nv;
+ Simplex nv;
add_neighbours(v, nv, keep_only_superior);
res.intersection(nv);
}
@@ -860,9 +889,9 @@ class Skeleton_blocker_complex {
* neighbours of v eg \f$ res \leftarrow res \setminus N(v) \f$.
* If 'keep_only_superior' is true then only vertices that are greater than v are added.
*/
- virtual void remove_neighbours(Vertex_handle v, Simplex_handle & res,
+ virtual void remove_neighbours(Vertex_handle v, Simplex & res,
bool keep_only_superior = false) const {
- Simplex_handle nv;
+ Simplex nv;
add_neighbours(v, nv, keep_only_superior);
res.difference(nv);
}
@@ -874,7 +903,7 @@ class Skeleton_blocker_complex {
* Constructs the link of 'simplex' with points coordinates.
*/
Link_complex link(Vertex_handle v) const {
- return Link_complex(*this, Simplex_handle(v));
+ return Link_complex(*this, Simplex(v));
}
/**
@@ -887,7 +916,7 @@ class Skeleton_blocker_complex {
/**
* Constructs the link of 'simplex' with points coordinates.
*/
- Link_complex link(const Simplex_handle& simplex) const {
+ Link_complex link(const Simplex& simplex) const {
return Link_complex(*this, simplex);
}
@@ -899,11 +928,11 @@ class Skeleton_blocker_complex {
*/
// xxx rename get_address et place un using dans sub_complex
- boost::optional<Simplex_handle> get_simplex_address(
+ boost::optional<Simplex> get_simplex_address(
const Root_simplex_handle& s) const {
- boost::optional<Simplex_handle> res;
+ boost::optional<Simplex> res;
- Simplex_handle s_address;
+ Simplex s_address;
// Root_simplex_const_iterator i;
for (auto i = s.begin(); i != s.end(); ++i) {
boost::optional<Vertex_handle> address = get_address(*i);
@@ -920,7 +949,7 @@ class Skeleton_blocker_complex {
* @brief returns a simplex with vertices which are the id of vertices of the
* argument.
*/
- Root_simplex_handle get_id(const Simplex_handle& local_simplex) const {
+ Root_simplex_handle get_id(const Simplex& local_simplex) const {
Root_simplex_handle global_simplex;
for (auto x = local_simplex.begin(); x != local_simplex.end(); ++x) {
global_simplex.add_vertex(get_id(*x));
@@ -932,7 +961,7 @@ class Skeleton_blocker_complex {
* @brief returns true iff the simplex s belongs to the simplicial
* complex.
*/
- virtual bool contains(const Simplex_handle & s) const {
+ virtual bool contains(const Simplex & s) const {
if (s.dimension() == -1) {
return false;
} else if (s.dimension() == 0) {
@@ -972,10 +1001,31 @@ 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());
+ }
+
+ /*
+ * @brief returns the number of simplices of a given dimension in the complex.
+ */
+ size_t num_simplices(unsigned dimension) const {
+ // TODO(DS): iterator on k-simplices
+ size_t res = 0;
+ for (const auto& s : complex_simplex_range())
+ if (s.dimension() == dimension)
+ ++res;
+ return res;
+ }
+
/*
* @brief returns the number of blockers in the complex.
*/
- int num_blockers() const {
+ size_t num_blockers() const {
return num_blockers_;
}
@@ -1018,7 +1068,7 @@ class Skeleton_blocker_complex {
}
//@}
- /** @Simplification operations
+ /** @name Simplification operations
*/
//@{
@@ -1061,7 +1111,7 @@ class Skeleton_blocker_complex {
* Furthermore, all simplices tau of the form sigma \setminus simplex_to_be_removed must be added
* whenever the dimension of tau is at least 2.
*/
- void update_blockers_after_remove_star_of_vertex_or_edge(const Simplex_handle& simplex_to_be_removed);
+ void update_blockers_after_remove_star_of_vertex_or_edge(const Simplex& simplex_to_be_removed);
public:
/**
@@ -1078,31 +1128,33 @@ class Skeleton_blocker_complex {
/**
* Remove the star of the simplex 'sigma' which needs to belong to the complex
*/
- void remove_star(const Simplex_handle& sigma);
+ void remove_star(const Simplex& sigma);
/**
- * @brief add a maximal simplex plus all its cofaces.
- * @details the simplex must have dimension greater than one (otherwise use add_vertex or add_edge).
+ * @brief add a simplex and all its faces.
+ * @details the simplex must have dimension greater than one (otherwise use add_vertex or add_edge_without_blockers).
*/
- void add_simplex(const Simplex_handle& sigma);
+ void add_simplex(const Simplex& sigma);
private:
+ void add_blockers_after_simplex_insertion(Simplex s);
+
/**
* remove all blockers that contains sigma
*/
- void remove_blocker_containing_simplex(const Simplex_handle& sigma);
+ void remove_blocker_containing_simplex(const Simplex& sigma);
/**
* remove all blockers that contains sigma
*/
- void remove_blocker_include_in_simplex(const Simplex_handle& sigma);
+ void remove_blocker_include_in_simplex(const Simplex& sigma);
public:
enum simplifiable_status {
NOT_HOMOTOPY_EQ, MAYBE_HOMOTOPY_EQ, HOMOTOPY_EQ
};
- simplifiable_status is_remove_star_homotopy_preserving(const Simplex_handle& simplex) {
+ simplifiable_status is_remove_star_homotopy_preserving(const Simplex& simplex) {
// todo write a virtual method 'link' in Skeleton_blocker_complex which will be overloaded by the current one of
// Skeleton_blocker_geometric_complex
// then call it there to build the link and return the value of link.is_contractible()
@@ -1131,7 +1183,7 @@ class Skeleton_blocker_complex {
}
//@}
- /** @Edge contraction operations
+ /** @name Edge contraction operations
*/
//@{
@@ -1174,7 +1226,7 @@ class Skeleton_blocker_complex {
* that may be used to construct a new blocker after contracting ab.
* It requires that the link condition is satisfied.
*/
- void tip_blockers(Vertex_handle a, Vertex_handle b, std::vector<Simplex_handle> & buffer) const;
+ void tip_blockers(Vertex_handle a, Vertex_handle b, std::vector<Simplex> & buffer) const;
private:
/**
@@ -1217,7 +1269,7 @@ class Skeleton_blocker_complex {
private:
void get_blockers_to_be_added_after_contraction(Vertex_handle a, Vertex_handle b,
- std::set<Simplex_handle>& blockers_to_add);
+ std::set<Simplex>& blockers_to_add);
/**
* delete all blockers that passes through a or b
*/
@@ -1358,12 +1410,28 @@ class Skeleton_blocker_complex {
/**
* @brief Returns a Complex_simplex_around_vertex_range over all the simplices around a vertex of the complex
*/
- Complex_simplex_around_vertex_range simplex_range(Vertex_handle v) const {
+ Complex_simplex_around_vertex_range star_simplex_range(Vertex_handle v) const {
assert(contains_vertex(v));
return Complex_simplex_around_vertex_range(
Complex_simplex_around_vertex_iterator(this, v),
Complex_simplex_around_vertex_iterator(this, v, true));
}
+ typedef Simplex_coboundary_iterator<Skeleton_blocker_complex, Link> Complex_simplex_coboundary_iterator;
+
+ /**
+ * @brief Range over the simplices of the coboundary of a simplex.
+ * Methods .begin() and .end() return a Complex_simplex_coboundary_iterator.
+ */
+ typedef boost::iterator_range < Complex_simplex_coboundary_iterator > Complex_coboundary_range;
+
+ /**
+ * @brief Returns a Complex_simplex_coboundary_iterator over the simplices of the coboundary of a simplex.
+ */
+ Complex_coboundary_range coboundary_range(const Simplex& s) const {
+ assert(contains(s));
+ return Complex_coboundary_range(Complex_simplex_coboundary_iterator(this, s),
+ Complex_simplex_coboundary_iterator(this, s, true));
+ }
// typedef Simplex_iterator<Skeleton_blocker_complex,Superior_link> Complex_simplex_iterator;
typedef Simplex_iterator<Skeleton_blocker_complex> Complex_simplex_iterator;
@@ -1373,7 +1441,7 @@ class Skeleton_blocker_complex {
/**
* @brief Returns a Complex_simplex_range over all the simplices of the complex
*/
- Complex_simplex_range simplex_range() const {
+ Complex_simplex_range complex_simplex_range() const {
Complex_simplex_iterator end(this, true);
if (empty()) {
return Complex_simplex_range(end, end);
@@ -1393,7 +1461,7 @@ class Skeleton_blocker_complex {
* @brief Iterator over the blockers adjacent to a vertex
*/
typedef Blocker_iterator_around_vertex_internal<
- typename std::multimap<Vertex_handle, Simplex_handle *>::iterator,
+ typename std::multimap<Vertex_handle, Simplex *>::iterator,
Blocker_handle>
Complex_blocker_around_vertex_iterator;
@@ -1401,12 +1469,13 @@ class Skeleton_blocker_complex {
* @brief Iterator over (constant) blockers adjacent to a vertex
*/
typedef Blocker_iterator_around_vertex_internal<
- typename std::multimap<Vertex_handle, Simplex_handle *>::const_iterator,
+ typename std::multimap<Vertex_handle, Simplex *>::const_iterator,
const Blocker_handle>
Const_complex_blocker_around_vertex_iterator;
typedef boost::iterator_range <Complex_blocker_around_vertex_iterator> Complex_blocker_around_vertex_range;
- typedef boost::iterator_range <Const_complex_blocker_around_vertex_iterator> Const_complex_blocker_around_vertex_range;
+ typedef boost::iterator_range <Const_complex_blocker_around_vertex_iterator>
+ Const_complex_blocker_around_vertex_range;
public:
/**
@@ -1432,7 +1501,7 @@ class Skeleton_blocker_complex {
* @brief Iterator over the blockers.
*/
typedef Blocker_iterator_internal<
- typename std::multimap<Vertex_handle, Simplex_handle *>::iterator,
+ typename std::multimap<Vertex_handle, Simplex *>::iterator,
Blocker_handle>
Complex_blocker_iterator;
@@ -1440,7 +1509,7 @@ class Skeleton_blocker_complex {
* @brief Iterator over the (constant) blockers.
*/
typedef Blocker_iterator_internal<
- typename std::multimap<Vertex_handle, Simplex_handle *>::const_iterator,
+ typename std::multimap<Vertex_handle, Simplex *>::const_iterator,
const Blocker_handle>
Const_complex_blocker_iterator;
@@ -1514,23 +1583,24 @@ class Skeleton_blocker_complex {
* return the total number of simplices
*/
template<typename Complex, typename SimplexHandleIterator>
-Complex make_complex_from_top_faces(SimplexHandleIterator simplex_begin, SimplexHandleIterator simplex_end,
+Complex make_complex_from_top_faces(SimplexHandleIterator simplices_begin, SimplexHandleIterator simplices_end,
bool is_flag_complex = false) {
- typedef typename Complex::Simplex_handle Simplex_handle;
- std::vector<Simplex_handle> simplices;
- for (auto top_face = simplex_begin; top_face != simplex_end; ++top_face) {
+ // TODO(DS): use add_simplex instead! should be more efficient and more elegant :)
+ typedef typename Complex::Simplex Simplex;
+ std::vector<Simplex> simplices;
+ for (auto top_face = simplices_begin; top_face != simplices_end; ++top_face) {
auto subfaces_topface = subfaces(*top_face);
simplices.insert(simplices.end(), subfaces_topface.begin(), subfaces_topface.end());
}
return Complex(simplices.begin(), simplices.end(), is_flag_complex);
}
-} // namespace skbl
+} // namespace skeleton_blocker
+
+namespace skbl = skeleton_blocker;
} // namespace Gudhi
#include "Skeleton_blocker_simplifiable_complex.h"
-
-#endif // SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_COMPLEX_H_
-
+#endif // SKELETON_BLOCKER_COMPLEX_H_
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_geometric_complex.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_geometric_complex.h
index 437482cb..1130ca9f 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_geometric_complex.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_geometric_complex.h
@@ -19,16 +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/>.
*/
-#ifndef SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_GEOMETRIC_COMPLEX_H_
-#define SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_GEOMETRIC_COMPLEX_H_
+#ifndef SKELETON_BLOCKER_GEOMETRIC_COMPLEX_H_
+#define SKELETON_BLOCKER_GEOMETRIC_COMPLEX_H_
-#include "gudhi/Utils.h"
-#include "gudhi/Skeleton_blocker_complex.h"
-#include "gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h"
+#include <gudhi/Skeleton_blocker_complex.h>
+#include <gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h>
+#include <gudhi/Debug_utils.h>
namespace Gudhi {
-namespace skbl {
+namespace skeleton_blocker {
/**
* @brief Class that represents a geometric complex that can be simplified.
@@ -46,7 +46,7 @@ public Skeleton_blocker_complex<SkeletonBlockerGeometricDS> {
typedef typename SimplifiableSkeletonblocker::Vertex_handle Vertex_handle;
typedef typename SimplifiableSkeletonblocker::Root_vertex_handle Root_vertex_handle;
typedef typename SimplifiableSkeletonblocker::Edge_handle Edge_handle;
- typedef typename SimplifiableSkeletonblocker::Simplex_handle Simplex_handle;
+ typedef typename SimplifiableSkeletonblocker::Simplex Simplex;
typedef typename SimplifiableSkeletonblocker::Graph_vertex Graph_vertex;
@@ -79,23 +79,6 @@ public Skeleton_blocker_complex<SkeletonBlockerGeometricDS> {
(*this)[Vertex_handle(current++)].point() = Point(point->begin(), point->end());
}
- template<typename SimpleHandleOutputIterator, typename PointIterator>
- friend Skeleton_blocker_geometric_complex make_complex_from_top_faces(
- SimpleHandleOutputIterator simplex_begin,
- SimpleHandleOutputIterator simplex_end,
- PointIterator points_begin,
- PointIterator points_end,
- bool is_flag_complex = false) {
- Skeleton_blocker_geometric_complex complex;
- unsigned current = 0;
- complex =
- make_complex_from_top_faces<Skeleton_blocker_geometric_complex>(simplex_begin, simplex_end, is_flag_complex);
- for (auto point = points_begin; point != points_end; ++point)
- // complex.point(Vertex_handle(current++)) = Point(point->begin(),point->end());
- complex.point(Vertex_handle(current++)) = Point(*point);
- return complex;
- }
-
/**
* @brief Constructor with a list of simplices.
* Points of every vertex are the point constructed with default constructor.
@@ -157,7 +140,7 @@ public Skeleton_blocker_complex<SkeletonBlockerGeometricDS> {
* Constructs the link of 'simplex' with points coordinates.
*/
Geometric_link link(Vertex_handle v) const {
- Geometric_link link(*this, Simplex_handle(v));
+ Geometric_link link(*this, Simplex(v));
// we now add the point info
add_points_to_link(link);
return link;
@@ -166,7 +149,7 @@ public Skeleton_blocker_complex<SkeletonBlockerGeometricDS> {
/**
* Constructs the link of 'simplex' with points coordinates.
*/
- Geometric_link link(const Simplex_handle& simplex) const {
+ Geometric_link link(const Simplex& simplex) const {
Geometric_link link(*this, simplex);
// we now add the point info
add_points_to_link(link);
@@ -189,13 +172,13 @@ public Skeleton_blocker_complex<SkeletonBlockerGeometricDS> {
* Constructs the abstract link of v (without points coordinates).
*/
Abstract_link abstract_link(Vertex_handle v) const {
- return Abstract_link(*this, Simplex_handle(v));
+ return Abstract_link(*this, Simplex(v));
}
/**
* Constructs the link of 'simplex' with points coordinates.
*/
- Abstract_link abstract_link(const Simplex_handle& simplex) const {
+ Abstract_link abstract_link(const Simplex& simplex) const {
return Abstract_link(*this, simplex);
}
@@ -215,8 +198,29 @@ public Skeleton_blocker_complex<SkeletonBlockerGeometricDS> {
}
};
-} // namespace skbl
+
+template<typename SkeletonBlockerGeometricComplex, typename SimpleHandleOutputIterator, typename PointIterator>
+SkeletonBlockerGeometricComplex make_complex_from_top_faces(
+ SimpleHandleOutputIterator simplex_begin,
+ SimpleHandleOutputIterator simplex_end,
+ PointIterator points_begin,
+ PointIterator points_end,
+ bool is_flag_complex = false) {
+ typedef SkeletonBlockerGeometricComplex SBGC;
+ SkeletonBlockerGeometricComplex complex;
+ unsigned current = 0;
+ complex =
+ make_complex_from_top_faces<SBGC>(simplex_begin, simplex_end, is_flag_complex);
+ for (auto point = points_begin; point != points_end; ++point)
+ // complex.point(Vertex_handle(current++)) = Point(point->begin(),point->end());
+ complex.point(typename SBGC::Vertex_handle(current++)) = typename SBGC::Point(*point);
+ return complex;
+}
+
+} // namespace skeleton_blocker
+
+namespace skbl = skeleton_blocker;
} // namespace Gudhi
-#endif // SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_GEOMETRIC_COMPLEX_H_
+#endif // SKELETON_BLOCKER_GEOMETRIC_COMPLEX_H_
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_link_complex.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_link_complex.h
index 725ecce5..1bd66289 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_link_complex.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_link_complex.h
@@ -19,15 +19,15 @@
* 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 SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_LINK_COMPLEX_H_
-#define SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_LINK_COMPLEX_H_
+#ifndef SKELETON_BLOCKER_LINK_COMPLEX_H_
+#define SKELETON_BLOCKER_LINK_COMPLEX_H_
-#include "gudhi/Utils.h"
-#include "gudhi/Skeleton_blocker_complex.h"
+#include <gudhi/Skeleton_blocker_complex.h>
+#include <gudhi/Debug_utils.h>
namespace Gudhi {
-namespace skbl {
+namespace skeleton_blocker {
template<class ComplexType> class Skeleton_blocker_sub_complex;
@@ -52,12 +52,11 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
typedef typename ComplexType::Vertex_handle Vertex_handle;
typedef typename ComplexType::Root_vertex_handle Root_vertex_handle;
- typedef typename ComplexType::Simplex_handle Simplex_handle;
+ typedef typename ComplexType::Simplex Simplex;
typedef typename ComplexType::Root_simplex_handle Root_simplex_handle;
typedef typename ComplexType::Blocker_handle Blocker_handle;
- typedef typename ComplexType::Simplex_handle::Simplex_vertex_const_iterator Simplex_handle_iterator;
typedef typename ComplexType::Root_simplex_handle::Simplex_vertex_const_iterator Root_simplex_handle_iterator;
explicit Skeleton_blocker_link_complex(bool only_superior_vertices = false)
@@ -67,13 +66,15 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
/**
* If the parameter only_superior_vertices is true,
* only vertices greater than the one of alpha are added.
+ * Only vertices are computed if only_vertices is true.
*/
Skeleton_blocker_link_complex(const ComplexType & parent_complex,
- const Simplex_handle& alpha_parent_adress,
- bool only_superior_vertices = false)
+ const Simplex& alpha_parent_adress,
+ bool only_superior_vertices = false,
+ bool only_vertices = false)
: only_superior_vertices_(only_superior_vertices) {
if (!alpha_parent_adress.empty())
- build_link(parent_complex, alpha_parent_adress);
+ build_link(parent_complex, alpha_parent_adress, only_vertices);
}
/**
@@ -84,7 +85,7 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
Vertex_handle a_parent_adress,
bool only_superior_vertices = false)
: only_superior_vertices_(only_superior_vertices) {
- Simplex_handle alpha_simplex(a_parent_adress);
+ Simplex alpha_simplex(a_parent_adress);
build_link(parent_complex, alpha_simplex);
}
@@ -96,7 +97,7 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
Edge_handle edge, bool only_superior_vertices =
false)
: only_superior_vertices_(only_superior_vertices) {
- Simplex_handle alpha_simplex(parent_complex.first_vertex(edge),
+ Simplex alpha_simplex(parent_complex.first_vertex(edge),
parent_complex.second_vertex(edge));
build_link(parent_complex, alpha_simplex);
}
@@ -108,7 +109,7 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
* are greater than vertices of alpha_parent_adress are added.
*/
void compute_link_vertices(const ComplexType & parent_complex,
- const Simplex_handle& alpha_parent_adress,
+ const Simplex& alpha_parent_adress,
bool only_superior_vertices,
bool is_alpha_blocker = false) {
if (alpha_parent_adress.dimension() == 0) {
@@ -119,7 +120,7 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
only_superior_vertices_);
} else {
// we compute the intersection of neighbors of alpha and store it in link_vertices
- Simplex_handle link_vertices_parent;
+ Simplex link_vertices_parent;
parent_complex.add_neighbours(alpha_parent_adress, link_vertices_parent,
only_superior_vertices);
// For all vertex 'v' in this intersection, we go through all its adjacent blockers.
@@ -162,13 +163,8 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
}
void compute_link_edges(const ComplexType & parent_complex,
- const Simplex_handle& alpha_parent_adress,
+ const Simplex& alpha_parent_adress,
bool is_alpha_blocker = false) {
- Simplex_handle_iterator y_link, x_parent, y_parent;
- // ----------------------------
- // Compute edges in the link
- // -------------------------
-
if (this->num_vertices() <= 1)
return;
@@ -194,7 +190,7 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
}
}
if (new_edge)
- this->add_edge(*x_link, *y_link);
+ this->add_edge_without_blockers(*x_link, *y_link);
}
}
}
@@ -217,7 +213,7 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
* the blocker is anticollapsed.
*/
void compute_link_blockers(const ComplexType & parent_complex,
- const Simplex_handle& alpha_parent,
+ const Simplex& alpha_parent,
bool is_alpha_blocker = false) {
for (auto x_link : this->vertex_range()) {
Vertex_handle x_parent = *this->give_equivalent_vertex(parent_complex,
@@ -225,7 +221,7 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
for (auto blocker_parent : parent_complex.const_blocker_range(x_parent)) {
if (!is_alpha_blocker || *blocker_parent != alpha_parent) {
- Simplex_handle sigma_parent(*blocker_parent);
+ Simplex sigma_parent(*blocker_parent);
sigma_parent.difference(alpha_parent);
@@ -239,7 +235,7 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
for (auto a : alpha_parent) {
for (auto eta_parent : parent_complex.const_blocker_range(a)) {
if (!is_alpha_blocker || *eta_parent != alpha_parent) {
- Simplex_handle eta_minus_alpha(*eta_parent);
+ Simplex eta_minus_alpha(*eta_parent);
eta_minus_alpha.difference(alpha_parent);
if (eta_minus_alpha != sigma_parent
&& sigma_parent.contains_difference(*eta_parent,
@@ -253,7 +249,7 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
break;
}
if (is_new_blocker)
- this->add_blocker(new Simplex_handle(*sigma_link));
+ this->add_blocker(new Simplex(*sigma_link));
}
}
}
@@ -268,14 +264,15 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
* with vertices that are greater than vertices of alpha_parent_adress.
*/
void build_link(const ComplexType & parent_complex,
- const Simplex_handle& alpha_parent_adress,
- bool is_alpha_blocker = false) {
+ const Simplex& alpha_parent_adress,
+ bool is_alpha_blocker = false,
+ 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_);
- compute_link_edges(parent_complex, alpha_parent_adress, is_alpha_blocker);
- compute_link_blockers(parent_complex, alpha_parent_adress,
- is_alpha_blocker);
+ compute_link_vertices(parent_complex, alpha_parent_adress, only_superior_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);
+ }
}
/**
@@ -284,7 +281,7 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
* removed from the blockers of the complex.
*/
friend void build_link_of_blocker(const ComplexType & parent_complex,
- Simplex_handle& blocker,
+ Simplex& blocker,
Skeleton_blocker_link_complex & result) {
assert(blocker.dimension() >= 2);
assert(parent_complex.contains_blocker(blocker));
@@ -293,8 +290,10 @@ class Skeleton_blocker_link_complex : public Skeleton_blocker_sub_complex<
}
};
-} // namespace skbl
+} // namespace skeleton_blocker
+
+namespace skbl = skeleton_blocker;
} // namespace Gudhi
-#endif // SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_LINK_COMPLEX_H_
+#endif // SKELETON_BLOCKER_LINK_COMPLEX_H_
diff --git a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h
index 86a12d90..171efd4b 100644
--- a/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h
+++ b/src/Skeleton_blocker/include/gudhi/Skeleton_blocker_simplifiable_complex.h
@@ -19,18 +19,18 @@
* 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 SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SIMPLIFIABLE_COMPLEX_H_
-#define SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SIMPLIFIABLE_COMPLEX_H_
+#ifndef SKELETON_BLOCKER_SIMPLIFIABLE_COMPLEX_H_
+#define SKELETON_BLOCKER_SIMPLIFIABLE_COMPLEX_H_
+
+#include <gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h>
#include <list>
#include <vector>
#include <set>
-#include "gudhi/Skeleton_blocker/Skeleton_blocker_sub_complex.h"
-
namespace Gudhi {
-namespace skbl {
+namespace skeleton_blocker {
/**
* Returns true iff the blocker 'sigma' is popable.
@@ -45,9 +45,7 @@ bool Skeleton_blocker_complex<SkeletonBlockerDS>::is_popable_blocker(Blocker_han
assert(this->contains_blocker(*sigma));
Skeleton_blocker_link_complex<Skeleton_blocker_complex> link_blocker_sigma;
build_link_of_blocker(*this, *sigma, link_blocker_sigma);
-
- bool res = link_blocker_sigma.is_contractible() == CONTRACTIBLE;
- return res;
+ return link_blocker_sigma.is_contractible() == CONTRACTIBLE;
}
/**
@@ -133,7 +131,7 @@ void Skeleton_blocker_complex<SkeletonBlockerDS>::remove_all_popable_blockers(Ve
template<typename SkeletonBlockerDS>
void Skeleton_blocker_complex<SkeletonBlockerDS>::remove_star(Vertex_handle v) {
// we remove the blockers that are not consistent anymore
- update_blockers_after_remove_star_of_vertex_or_edge(Simplex_handle(v));
+ update_blockers_after_remove_star_of_vertex_or_edge(Simplex(v));
while (this->degree(v) > 0) {
Vertex_handle w(* (adjacent_vertices(v.vertex, this->skeleton).first));
this->remove_edge(v, w);
@@ -148,7 +146,7 @@ void Skeleton_blocker_complex<SkeletonBlockerDS>::remove_star(Vertex_handle v) {
*/
template<typename SkeletonBlockerDS>
void Skeleton_blocker_complex<SkeletonBlockerDS>::update_blockers_after_remove_star_of_vertex_or_edge(
- const Simplex_handle& simplex_to_be_removed) {
+ const Simplex& simplex_to_be_removed) {
std::list <Blocker_handle> blockers_to_update;
if (simplex_to_be_removed.empty()) return;
@@ -159,7 +157,7 @@ void Skeleton_blocker_complex<SkeletonBlockerDS>::update_blockers_after_remove_s
}
for (auto blocker_to_update : blockers_to_update) {
- Simplex_handle sub_blocker_to_be_added;
+ Simplex sub_blocker_to_be_added;
bool sub_blocker_need_to_be_added =
(blocker_to_update->dimension() - simplex_to_be_removed.dimension()) >= 2;
if (sub_blocker_need_to_be_added) {
@@ -178,7 +176,7 @@ void Skeleton_blocker_complex<SkeletonBlockerDS>::update_blockers_after_remove_s
*/
template<typename SkeletonBlockerDS>
void Skeleton_blocker_complex<SkeletonBlockerDS>::remove_star(Vertex_handle a, Vertex_handle b) {
- update_blockers_after_remove_star_of_vertex_or_edge(Simplex_handle(a, b));
+ update_blockers_after_remove_star_of_vertex_or_edge(Simplex(a, b));
// we remove the edge
this->remove_edge(a, b);
}
@@ -195,7 +193,7 @@ void Skeleton_blocker_complex<SkeletonBlockerDS>::remove_star(Edge_handle e) {
* Remove the star of the simplex 'sigma' which needs to belong to the complex
*/
template<typename SkeletonBlockerDS>
-void Skeleton_blocker_complex<SkeletonBlockerDS>::remove_star(const Simplex_handle& sigma) {
+void Skeleton_blocker_complex<SkeletonBlockerDS>::remove_star(const Simplex& sigma) {
assert(this->contains(sigma));
if (sigma.dimension() == 0) {
remove_star(sigma.first_vertex());
@@ -207,33 +205,41 @@ void Skeleton_blocker_complex<SkeletonBlockerDS>::remove_star(const Simplex_hand
}
}
-/**
- * @brief add a maximal simplex plus all its cofaces.
- * @details the simplex must have dimension greater than one (otherwise use add_vertex or add_edge).
- */
template<typename SkeletonBlockerDS>
-void Skeleton_blocker_complex<SkeletonBlockerDS>::add_simplex(const Simplex_handle& sigma) {
+void Skeleton_blocker_complex<SkeletonBlockerDS>::add_simplex(const Simplex& sigma) {
+ // to add a simplex s, all blockers included in s are first removed
+ // and then all simplex in the coboundary of s are added as blockers
assert(!this->contains(sigma));
assert(sigma.dimension() > 1);
+ if (!contains_vertices(sigma)) {
+ std::cerr << "add_simplex: Some vertices were not present in the complex, adding them" << std::endl;
+ size_t num_vertices_to_add = sigma.last_vertex() - this->num_vertices() + 1;
+ for (size_t i = 0; i < num_vertices_to_add; ++i)
+ this->add_vertex();
+ }
+ assert(contains_vertices(sigma));
+ if (!contains_edges(sigma))
+ add_edge(sigma);
+ remove_blocker_include_in_simplex(sigma);
+ add_blockers_after_simplex_insertion(sigma);
+}
- int num_vertex_to_add = 0;
- for (auto v : sigma)
- if (!contains_vertex(v)) ++num_vertex_to_add;
- while (num_vertex_to_add--) add_vertex();
- for (auto u_it = sigma.begin(); u_it != sigma.end(); ++u_it)
- for (auto v_it = u_it; ++v_it != sigma.end(); /**/) {
- std::cout << "add edge" << *u_it << " " << *v_it << std::endl;
- add_edge(*u_it, *v_it);
- }
- remove_blocker_include_in_simplex(sigma);
+
+template<typename SkeletonBlockerDS>
+void Skeleton_blocker_complex<SkeletonBlockerDS>::add_blockers_after_simplex_insertion(Simplex sigma) {
+ if (sigma.dimension() < 1) return;
+
+ for (auto s : coboundary_range(sigma)) {
+ this->add_blocker(s);
+ }
}
/**
* remove all blockers that contains sigma
*/
template<typename SkeletonBlockerDS>
-void Skeleton_blocker_complex<SkeletonBlockerDS>::remove_blocker_containing_simplex(const Simplex_handle& sigma) {
+void Skeleton_blocker_complex<SkeletonBlockerDS>::remove_blocker_containing_simplex(const Simplex& sigma) {
std::vector <Blocker_handle> blockers_to_remove;
for (auto blocker : this->blocker_range(sigma.first_vertex())) {
if (blocker->contains(sigma))
@@ -247,14 +253,26 @@ void Skeleton_blocker_complex<SkeletonBlockerDS>::remove_blocker_containing_simp
* remove all blockers that contains sigma
*/
template<typename SkeletonBlockerDS>
-void Skeleton_blocker_complex<SkeletonBlockerDS>::remove_blocker_include_in_simplex(const Simplex_handle& sigma) {
- std::vector <Blocker_handle> blockers_to_remove;
- for (auto blocker : this->blocker_range(sigma.first_vertex())) {
- if (sigma.contains(*blocker))
- blockers_to_remove.push_back(blocker);
+void Skeleton_blocker_complex<SkeletonBlockerDS>::remove_blocker_include_in_simplex(const Simplex& sigma) {
+ // TODO(DS): write efficiently by using only superior blockers
+ // eg for all s, check blockers whose vertices are all greater than s
+ std::set <Blocker_handle> blockers_to_remove;
+ for (auto s : sigma) {
+ for (auto blocker : this->blocker_range(s)) {
+ if (sigma.contains(*blocker))
+ blockers_to_remove.insert(blocker);
+ }
}
- for (auto blocker_to_update : blockers_to_remove)
+ for (auto blocker_to_update : blockers_to_remove) {
+ auto s = *blocker_to_update;
this->delete_blocker(blocker_to_update);
+ // now if there is a vertex v in the link of s
+ // and v is not included in sigma then v.s is a blocker
+ // (all faces of v.s are there since v belongs to the link of s)
+ for (const auto& b : coboundary_range(s))
+ if (!sigma.contains(b))
+ this->add_blocker(b);
+ }
}
/**
@@ -264,21 +282,21 @@ void Skeleton_blocker_complex<SkeletonBlockerDS>::remove_blocker_include_in_simp
*/
template<typename SkeletonBlockerDS>
void Skeleton_blocker_complex<SkeletonBlockerDS>::tip_blockers(Vertex_handle a, Vertex_handle b,
- std::vector<Simplex_handle> & buffer) const {
+ std::vector<Simplex> & buffer) const {
for (auto const & blocker : this->const_blocker_range(a)) {
- Simplex_handle beta = (*blocker);
+ Simplex beta = (*blocker);
beta.remove_vertex(a);
buffer.push_back(beta);
}
- Simplex_handle n;
+ Simplex n;
this->add_neighbours(b, n);
this->remove_neighbours(a, n);
n.remove_vertex(a);
for (Vertex_handle y : n) {
- Simplex_handle beta;
+ Simplex beta;
beta.add_vertex(y);
buffer.push_back(beta);
}
@@ -295,7 +313,7 @@ void Skeleton_blocker_complex<SkeletonBlockerDS>::tip_blockers(Vertex_handle a,
template<typename SkeletonBlockerDS>
void
Skeleton_blocker_complex<SkeletonBlockerDS>::swap_edge(Vertex_handle a, Vertex_handle b, Vertex_handle x) {
- this->add_edge(a, x);
+ this->add_edge_without_blockers(a, x);
if (this->visitor) this->visitor->on_swaped_edge(a, b, x);
this->remove_edge(b, x);
}
@@ -338,13 +356,15 @@ void
Skeleton_blocker_complex<SkeletonBlockerDS>::contract_edge(Vertex_handle a, Vertex_handle b) {
assert(this->contains_vertex(a));
assert(this->contains_vertex(b));
- assert(this->contains_edge(a, b));
- // if some blockers passes through 'ab', we remove them.
+ if (this->contains_edge(a, b))
+ this->add_edge_without_blockers(a, b);
+
+ // if some blockers passes through 'ab', we need to remove them.
if (!link_condition(a, b))
delete_blockers_around_edge(a, b);
- std::set<Simplex_handle> blockers_to_add;
+ std::set<Simplex> blockers_to_add;
get_blockers_to_be_added_after_contraction(a, b, blockers_to_add);
@@ -364,9 +384,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_handle>& blockers_to_add) {
+void Skeleton_blocker_complex<SkeletonBlockerDS>::get_blockers_to_be_added_after_contraction(Vertex_handle a,
+ Vertex_handle b, std::set<Simplex>& blockers_to_add) {
blockers_to_add.clear();
typedef Skeleton_blocker_link_complex<Skeleton_blocker_complex<SkeletonBlockerDS> > LinkComplexType;
@@ -374,19 +393,19 @@ Skeleton_blocker_complex<SkeletonBlockerDS>::get_blockers_to_be_added_after_cont
LinkComplexType link_a(*this, a);
LinkComplexType link_b(*this, b);
- std::vector<Simplex_handle> vector_alpha, vector_beta;
+ std::vector<Simplex> vector_alpha, vector_beta;
tip_blockers(a, b, vector_alpha);
tip_blockers(b, a, vector_beta);
for (auto alpha = vector_alpha.begin(); alpha != vector_alpha.end(); ++alpha) {
for (auto beta = vector_beta.begin(); beta != vector_beta.end(); ++beta) {
- Simplex_handle sigma = *alpha;
+ Simplex sigma = *alpha;
sigma.union_vertices(*beta);
Root_simplex_handle sigma_id = this->get_id(sigma);
if (this->contains(sigma) &&
proper_faces_in_union<Skeleton_blocker_complex < SkeletonBlockerDS >> (sigma_id, link_a, link_b)) {
- // Blocker_handle blocker = new Simplex_handle(sigma);
+ // Blocker_handle blocker = new Simplex(sigma);
sigma.add_vertex(a);
blockers_to_add.insert(sigma);
}
@@ -440,8 +459,10 @@ Skeleton_blocker_complex<SkeletonBlockerDS>::notify_changed_edges(Vertex_handle
}
-} // namespace skbl
+} // namespace skeleton_blocker
+
+namespace skbl = skeleton_blocker;
} // namespace Gudhi
-#endif // SRC_SKELETON_BLOCKER_INCLUDE_GUDHI_SKELETON_BLOCKER_SIMPLIFIABLE_COMPLEX_H_
+#endif // SKELETON_BLOCKER_SIMPLIFIABLE_COMPLEX_H_
diff --git a/src/Skeleton_blocker/test/CMakeLists.txt b/src/Skeleton_blocker/test/CMakeLists.txt
index e62600a2..a4576b36 100644
--- a/src/Skeleton_blocker/test/CMakeLists.txt
+++ b/src/Skeleton_blocker/test/CMakeLists.txt
@@ -1,23 +1,23 @@
cmake_minimum_required(VERSION 2.6)
-project(GUDHIskbl)
+project(Skeleton_blocker_tests)
if (GCOVR_PATH)
# for gcovr to make coverage reports - Corbera Jenkins plugin
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fprofile-arcs -ftest-coverage")
- set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fprofile-arcs -ftest-coverage")
endif()
if (GPROF_PATH)
# for gprof to make coverage reports - Jenkins
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
- set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -pg")
endif()
add_executable(TestSkeletonBlockerComplex TestSkeletonBlockerComplex.cpp)
add_executable(TestSimplifiable TestSimplifiable.cpp)
add_executable(TestGeometricComplex TestGeometricComplex.cpp)
+# Do not forget to copy test files in current binary dir
+file(COPY "test.off" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
+file(COPY "test2.off" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
+
add_test(TestSkeletonBlockerComplex ${CMAKE_CURRENT_BINARY_DIR}/TestSkeletonBlockerComplex)
add_test(TestSimplifiable ${CMAKE_CURRENT_BINARY_DIR}/TestSimplifiable)
add_test(TestGeometricComplex ${CMAKE_CURRENT_BINARY_DIR}/TestGeometricComplex)
diff --git a/src/Skeleton_blocker/test/TestGeometricComplex.cpp b/src/Skeleton_blocker/test/TestGeometricComplex.cpp
index bd7af89b..9edb13fe 100644
--- a/src/Skeleton_blocker/test/TestGeometricComplex.cpp
+++ b/src/Skeleton_blocker/test/TestGeometricComplex.cpp
@@ -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 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/>.
+ */
#include <stdio.h>
#include <stdlib.h>
@@ -31,10 +31,10 @@
using namespace std;
using namespace Gudhi;
-using namespace skbl;
+using namespace skeleton_blocker;
-struct Geometry_trait{
- typedef std::vector<double> Point;
+struct Geometry_trait {
+ typedef std::vector<double> Point;
};
typedef Geometry_trait::Point Point;
@@ -42,79 +42,77 @@ typedef Skeleton_blocker_simple_geometric_traits<Geometry_trait> Complex_geometr
typedef Skeleton_blocker_geometric_complex< Complex_geometric_traits > Complex;
typedef Complex::Vertex_handle Vertex_handle;
+bool test_constructor1() {
+ Complex complex;
+ Skeleton_blocker_off_reader<Complex> off_reader("test2.off", complex);
+ if (!off_reader.is_valid()) {
+ std::cerr << "Unable to read file" << std::endl;
+ return false;
+ }
-bool test_constructor1(){
- Complex complex;
- Skeleton_blocker_off_reader<Complex> off_reader("test2.off",complex);
- if(!off_reader.is_valid()){
- std::cerr << "Unable to read file"<<std::endl;
- return false;
- }
+ std::cout << "complex has " <<
+ complex.num_vertices() << " vertices, " <<
+ complex.num_blockers() << " blockers, " <<
+ complex.num_edges() << " edges and" <<
+ complex.num_triangles() << " triangles.";
- std::cout << "complex has "<<
- complex.num_vertices()<<" vertices, "<<
- complex.num_blockers()<<" blockers, "<<
- complex.num_edges()<<" edges and" <<
- complex.num_triangles()<<" triangles.";
+ if (complex.num_vertices() != 7 || complex.num_edges() != 12 || complex.num_triangles() != 6)
+ return false;
- if(complex.num_vertices()!=7 || complex.num_edges()!=12 || complex.num_triangles() !=6)
- return false;
+ Skeleton_blocker_off_writer<Complex> off_writer("tmp.off", complex);
+ Complex same;
+ Skeleton_blocker_off_reader<Complex> off_reader2("tmp.off", same);
- Skeleton_blocker_off_writer<Complex> off_writer("tmp.off",complex);
- Complex same;
- Skeleton_blocker_off_reader<Complex> off_reader2("tmp.off",same);
+ std::cout << "\ncomplex:" << complex.to_string() << endl;
+ std::cout << "\nsame:" << same.to_string() << endl;
- std::cout<<"\ncomplex:"<<complex.to_string()<<endl;
- std::cout<<"\nsame:"<<same.to_string()<<endl;
-
- return (complex==same);
+ return (complex == same);
}
-bool test_constructor2(){
- Complex complex;
- Skeleton_blocker_off_reader<Complex> off_reader("test2.off",complex);
- if(!off_reader.is_valid()){
- std::cerr << "Unable to read file"<<std::endl;
- return false;
- }
- std::cout << "complex has "<<
- complex.num_vertices()<<" vertices, "<<
- complex.num_blockers()<<" blockers, "<<
- complex.num_edges()<<" edges and" <<
- complex.num_triangles()<<" triangles.";
+bool test_constructor2() {
+ Complex complex;
+ Skeleton_blocker_off_reader<Complex> off_reader("test2.off", complex);
+ if (!off_reader.is_valid()) {
+ std::cerr << "Unable to read file" << std::endl;
+ return false;
+ }
+ std::cout << "complex has " <<
+ complex.num_vertices() << " vertices, " <<
+ complex.num_blockers() << " blockers, " <<
+ complex.num_edges() << " edges and" <<
+ complex.num_triangles() << " triangles.";
- if(complex.num_vertices()!=7 || complex.num_edges()!=12 || complex.num_triangles() !=6)
- return false;
+ if (complex.num_vertices() != 7 || complex.num_edges() != 12 || complex.num_triangles() != 6)
+ return false;
- auto link_0 = complex.abstract_link(Vertex_handle(0));
+ auto link_0 = complex.abstract_link(Vertex_handle(0));
- std::cout<<"\n link(0):"<<link_0.to_string()<<endl;
+ std::cout << "\n link(0):" << link_0.to_string() << endl;
- auto link_geometric_0 = complex.link(Vertex_handle(0));
+ auto link_geometric_0 = complex.link(Vertex_handle(0));
- auto print_point = [&](Vertex_handle v){for(auto x : link_geometric_0.point(v)) std::cout <<x<<" "; std::cout<<std::endl;};
+ auto print_point = [&](Vertex_handle v) {
+ for (auto x : link_geometric_0.point(v)) std::cout << x << " ";
+ std::cout << std::endl;
+ };
- std::for_each(link_geometric_0.vertex_range().begin(),link_geometric_0.vertex_range().end(),print_point);
+ std::for_each(link_geometric_0.vertex_range().begin(), link_geometric_0.vertex_range().end(), print_point);
-// for(auto v : link_geometric_0.vertex_range())
-// std::cout<<"point("<<v<<"):"<<link_geometric_0.point(v)<<std::endl;
+ // for(auto v : link_geometric_0.vertex_range())
+ // std::cout<<"point("<<v<<"):"<<link_geometric_0.point(v)<<std::endl;
- return link_0.num_vertices()==2;
+ return link_0.num_vertices() == 2;
}
+int main(int argc, char *argv[]) {
+ Tests tests_geometric_complex;
+ tests_geometric_complex.add("Test constructor 1", test_constructor1);
+ tests_geometric_complex.add("Test constructor 2", test_constructor2);
-
-
-int main (int argc, char *argv[])
-{
- Tests tests_geometric_complex;
- tests_geometric_complex.add("Test constructor 1",test_constructor1);
- tests_geometric_complex.add("Test constructor 2",test_constructor2);
-
- if(tests_geometric_complex.run())
- return EXIT_SUCCESS;
- else
- return EXIT_FAILURE;
+ if (tests_geometric_complex.run())
+ return EXIT_SUCCESS;
+ else
+ return EXIT_FAILURE;
}
diff --git a/src/Skeleton_blocker/test/TestSimplifiable.cpp b/src/Skeleton_blocker/test/TestSimplifiable.cpp
index 09176934..76736240 100644
--- a/src/Skeleton_blocker/test/TestSimplifiable.cpp
+++ b/src/Skeleton_blocker/test/TestSimplifiable.cpp
@@ -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 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/>.
+ */
#include <stdio.h>
@@ -35,322 +35,388 @@ using namespace std;
using namespace Gudhi;
-using namespace skbl;
+using namespace skeleton_blocker;
template<typename ComplexType> class Skeleton_blocker_sub_complex;
typedef Skeleton_blocker_complex<Skeleton_blocker_simple_traits> Complex;
typedef Complex::Vertex_handle Vertex_handle;
typedef Complex::Root_vertex_handle Root_vertex_handle;
-typedef Skeleton_blocker_simplex<Vertex_handle> Simplex_handle;
+typedef Skeleton_blocker_simplex<Vertex_handle> Simplex;
// true iff v \in complex
-bool assert_vertex(Complex &complex,Vertex_handle v){
- Simplex_handle simplex(v);
- bool test = complex.contains(simplex);
- assert(test);
- return test;
+
+bool assert_vertex(Complex &complex, Vertex_handle v) {
+ Simplex simplex(v);
+ bool test = complex.contains(simplex);
+ assert(test);
+ return test;
}
// true iff the blocker (a,b,c) is in complex
-bool assert_blocker(Complex &complex,Root_vertex_handle a,Root_vertex_handle b,Root_vertex_handle c){
- return complex.contains_blocker(Simplex_handle(*complex.get_address(a),*complex.get_address(b),*complex.get_address(c)));
- //return complex.contains_blocker((a),(b),(c));
+bool assert_blocker(Complex &complex, Root_vertex_handle a, Root_vertex_handle b, Root_vertex_handle c) {
+
+ return complex.contains_blocker(Simplex(*complex.get_address(a), *complex.get_address(b), *complex.get_address(c)));
+ //return complex.contains_blocker((a),(b),(c));
}
-void build_complete(int n,Complex& complex){
- complex.clear();
- 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(Vertex_handle(i),Vertex_handle(j));
+void build_complete(int n, Complex& complex) {
+ complex.clear();
+ 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));
}
-bool test_contraction1(){
- enum { a, b, x, y, z, n };
- Complex complex(n);
- build_complete(n,complex);
- complex.remove_edge(static_cast<Vertex_handle>(b), static_cast<Vertex_handle>(z));
- complex.add_blocker(Simplex_handle(static_cast<Vertex_handle>(a), static_cast<Vertex_handle>(x),
- static_cast<Vertex_handle>(y)));
- complex.add_blocker(Simplex_handle(static_cast<Vertex_handle>(b), static_cast<Vertex_handle>(x),
- static_cast<Vertex_handle>(y)));
-
- // Print result
- cerr << "complex before complex"<< complex.to_string()<<endl;
-
- cerr <<endl<<endl;
- complex.contract_edge(static_cast<Vertex_handle>(a),static_cast<Vertex_handle>(b));
- // Print result
- cerr << "ContractEdge(0,1)\n";
- PRINT(complex.to_string());
-
- // verification
- for (int i=0;i<5;i++)
- if (i!=1) assert_vertex(complex, static_cast<Vertex_handle>(i));
- bool test1 = !complex.contains_edge(static_cast<Vertex_handle>(a),static_cast<Vertex_handle>(b));
- bool test2 = assert_blocker(complex,Root_vertex_handle(a),Root_vertex_handle(x),Root_vertex_handle(y));
- bool test3 = complex.num_edges()==6;
- bool test4 = complex.num_blockers()==1;
- Simplex_handle sigma;
- sigma.add_vertex(static_cast<Vertex_handle>(a));
- sigma.add_vertex(static_cast<Vertex_handle>(x));
- sigma.add_vertex(static_cast<Vertex_handle>(y));
- sigma.add_vertex(static_cast<Vertex_handle>(z));
- bool test5 = !(complex.contains(sigma));
- return test1&&test2&&test3&&test4&&test5;
+bool test_contraction1() {
+
+ enum {
+ a, b, x, y, z, n
+ };
+ Complex complex(n);
+ build_complete(n, complex);
+ complex.remove_edge(static_cast<Vertex_handle> (b), static_cast<Vertex_handle> (z));
+ complex.add_blocker(Simplex(static_cast<Vertex_handle> (a), static_cast<Vertex_handle> (x),
+ static_cast<Vertex_handle> (y)));
+ complex.add_blocker(Simplex(static_cast<Vertex_handle> (b), static_cast<Vertex_handle> (x),
+ static_cast<Vertex_handle> (y)));
+
+ // Print result
+ cerr << "complex before complex" << complex.to_string() << endl;
+
+ cerr << endl << endl;
+ complex.contract_edge(static_cast<Vertex_handle> (a), static_cast<Vertex_handle> (b));
+ // Print result
+ cerr << "ContractEdge(0,1)\n";
+ PRINT(complex.to_string());
+
+ // verification
+ for (int i = 0; i < 5; i++)
+ if (i != 1) assert_vertex(complex, static_cast<Vertex_handle> (i));
+ bool test1 = !complex.contains_edge(static_cast<Vertex_handle> (a), static_cast<Vertex_handle> (b));
+ bool test2 = assert_blocker(complex, Root_vertex_handle(a), Root_vertex_handle(x), Root_vertex_handle(y));
+ bool test3 = complex.num_edges() == 6;
+ bool test4 = complex.num_blockers() == 1;
+ Simplex sigma;
+ sigma.add_vertex(static_cast<Vertex_handle> (a));
+ sigma.add_vertex(static_cast<Vertex_handle> (x));
+ sigma.add_vertex(static_cast<Vertex_handle> (y));
+ sigma.add_vertex(static_cast<Vertex_handle> (z));
+ bool test5 = !(complex.contains(sigma));
+ return test1 && test2 && test3 && test4&&test5;
}
+bool test_contraction2() {
-bool test_contraction2(){
- enum { a, b, x, y, z, n };
- Complex complex(n);
- build_complete(n,complex);
- complex.remove_edge(static_cast<Vertex_handle>(b),static_cast<Vertex_handle>(x));
- Simplex_handle blocker;
- blocker.add_vertex(static_cast<Vertex_handle>(a));
- blocker.add_vertex(static_cast<Vertex_handle>(y));
- blocker.add_vertex(static_cast<Vertex_handle>(z));
+ enum {
+ a, b, x, y, z, n
+ };
+ Complex complex(n);
+ build_complete(n, complex);
+ complex.remove_edge(static_cast<Vertex_handle> (b), static_cast<Vertex_handle> (x));
+ Simplex blocker;
+ blocker.add_vertex(static_cast<Vertex_handle> (a));
+ blocker.add_vertex(static_cast<Vertex_handle> (y));
+ blocker.add_vertex(static_cast<Vertex_handle> (z));
- complex.add_blocker(blocker);
+ complex.add_blocker(blocker);
- // Print result
- cerr << "complex complex"<< complex.to_string();
- cerr <<endl<<endl;
- complex.contract_edge(static_cast<Vertex_handle>(a),static_cast<Vertex_handle>(b));
+ // Print result
+ cerr << "complex complex" << complex.to_string();
+ cerr << endl << endl;
+ complex.contract_edge(static_cast<Vertex_handle> (a), static_cast<Vertex_handle> (b));
- cerr << "complex.ContractEdge(a,b)"<< complex.to_string();
+ cerr << "complex.ContractEdge(a,b)" << complex.to_string();
- cerr <<endl<<endl;
+ cerr << endl << endl;
- // there should be one blocker (a,c,d,e) in the complex
- bool test ;
- test = complex.contains_blocker(Simplex_handle(static_cast<Vertex_handle>(a), static_cast<Vertex_handle>(x),
- static_cast<Vertex_handle>(y),static_cast<Vertex_handle>(z)));
- test = test && complex.num_blockers()==1;
- return test;
+ // there should be one blocker (a,c,d,e) in the complex
+ bool test;
+ test = complex.contains_blocker(Simplex(static_cast<Vertex_handle> (a), static_cast<Vertex_handle> (x),
+ static_cast<Vertex_handle> (y), static_cast<Vertex_handle> (z)));
+ test = test && complex.num_blockers() == 1;
+ return test;
}
-bool test_link_condition1(){
+bool test_link_condition1() {
- Complex complex(0);
- // Build the complexes
- build_complete(4,complex);
- complex.add_blocker(Simplex_handle(static_cast<Vertex_handle>(0), static_cast<Vertex_handle>(1), static_cast<Vertex_handle>(2)));
+ Complex complex(0);
+ // Build the complexes
+ build_complete(4, complex);
+ complex.add_blocker(Simplex(static_cast<Vertex_handle> (0), static_cast<Vertex_handle> (1), static_cast<Vertex_handle> (2)));
- // Print result
- cerr << "complex complex"<< complex.to_string();
- cerr <<endl<<endl;
+ // Print result
+ cerr << "complex complex" << complex.to_string();
+ cerr << endl << endl;
- bool weak_link_condition = complex.link_condition(Vertex_handle(1),Vertex_handle(2),true);
+ bool weak_link_condition = complex.link_condition(Vertex_handle(1), Vertex_handle(2), true);
- bool strong_link_condition = complex.link_condition(Vertex_handle(1),Vertex_handle(2),false);
+ bool strong_link_condition = complex.link_condition(Vertex_handle(1), Vertex_handle(2), false);
- return weak_link_condition && !strong_link_condition;
+ return weak_link_condition && !strong_link_condition;
}
-
-bool test_collapse0(){
- Complex complex(5);
- build_complete(4,complex);
- complex.add_vertex();
- complex.add_edge(static_cast<Vertex_handle>(2), static_cast<Vertex_handle>(4));
- complex.add_edge(static_cast<Vertex_handle>(3), static_cast<Vertex_handle>(4));
- // Print result
- cerr << "initial complex :\n"<< complex.to_string();
- cerr <<endl<<endl;
-
- Simplex_handle simplex_123(static_cast<Vertex_handle>(1), static_cast<Vertex_handle>(2), static_cast<Vertex_handle>(3));
- complex.remove_star(simplex_123);
- cerr << "complex.remove_star(1,2,3):\n"<< complex.to_string();
- cerr <<endl<<endl;
-
- // verification
- bool blocker123_here = complex.contains_blocker(simplex_123);
- cerr <<"----> Ocomplex \n";
- return blocker123_here;
+bool test_collapse0() {
+ Complex complex(5);
+ build_complete(4, complex);
+ complex.add_vertex();
+ complex.add_edge_without_blockers(static_cast<Vertex_handle> (2), static_cast<Vertex_handle> (4));
+ complex.add_edge_without_blockers(static_cast<Vertex_handle> (3), static_cast<Vertex_handle> (4));
+ // Print result
+ cerr << "initial complex :\n" << complex.to_string();
+ cerr << endl << endl;
+
+ Simplex simplex_123(static_cast<Vertex_handle> (1), static_cast<Vertex_handle> (2), static_cast<Vertex_handle> (3));
+ complex.remove_star(simplex_123);
+ cerr << "complex.remove_star(1,2,3):\n" << complex.to_string();
+ cerr << endl << endl;
+
+ // verification
+ bool blocker123_here = complex.contains_blocker(simplex_123);
+ cerr << "----> Ocomplex \n";
+ return blocker123_here;
}
-
-bool test_collapse1(){
- Complex complex(5);
- build_complete(4,complex);
- complex.add_blocker(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2),Vertex_handle(3)));
- // Print result
- cerr << "initial complex :\n"<< complex.to_string();
- cerr <<endl<<endl;
-
- Simplex_handle simplex_123(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3));
- complex.remove_star(simplex_123);
- cerr << "complex.remove_star(1,2,3):\n"<< complex.to_string();
- cerr <<endl<<endl;
-
- // verification
- bool res = complex.contains_blocker(simplex_123);
- res = res && complex.num_blockers()==1;
- cerr <<"----> Ocomplex \n";
- return res;
+bool test_collapse1() {
+ Complex complex(5);
+ build_complete(4, complex);
+ complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)));
+ // Print result
+ cerr << "initial complex :\n" << complex.to_string();
+ cerr << endl << endl;
+
+ Simplex simplex_123(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3));
+ complex.remove_star(simplex_123);
+ cerr << "complex.remove_star(1,2,3):\n" << complex.to_string();
+ cerr << endl << endl;
+
+ // verification
+ bool res = complex.contains_blocker(simplex_123);
+ res = res && complex.num_blockers() == 1;
+ cerr << "----> Ocomplex \n";
+ return res;
}
-bool test_collapse2(){
- Complex complex(5);
- build_complete(4,complex);
- complex.add_vertex();
- complex.add_edge(Vertex_handle(1),Vertex_handle(4));
- complex.add_edge(Vertex_handle(2),Vertex_handle(4));
- complex.add_edge(Vertex_handle(3),Vertex_handle(4));
- complex.add_blocker(Simplex_handle(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3),Vertex_handle(4)));
- // Print result
- cerr << "initial complex :\n"<< complex.to_string();
- cerr <<endl<<endl;
-
- Simplex_handle sigma(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3));
- complex.remove_star(sigma);
- cerr << "complex.remove_star(1,2,3):\n"<< complex.to_string();
- cerr <<endl<<endl;
-
- // verification
- bool blocker_removed = !complex.contains_blocker(Simplex_handle(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3),Vertex_handle(4)));
- bool blocker123_here = complex.contains_blocker(sigma);
- return blocker_removed && blocker123_here;
+bool test_collapse2() {
+ Complex complex(5);
+ build_complete(4, complex);
+ complex.add_vertex();
+ complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(4));
+ complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(4));
+ complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(4));
+ complex.add_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3), Vertex_handle(4)));
+ // Print result
+ cerr << "initial complex :\n" << complex.to_string();
+ cerr << endl << endl;
+
+ Simplex sigma(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3));
+ complex.remove_star(sigma);
+ cerr << "complex.remove_star(1,2,3):\n" << complex.to_string();
+ cerr << endl << endl;
+
+ // verification
+ bool blocker_removed = !complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3), Vertex_handle(4)));
+ bool blocker123_here = complex.contains_blocker(sigma);
+ return blocker_removed && blocker123_here;
}
-bool test_collapse3(){
- Complex complex(5);
- build_complete(4,complex);
- complex.add_vertex();
- complex.add_edge(Vertex_handle(1),Vertex_handle(4));
- complex.add_edge(Vertex_handle(2),Vertex_handle(4));
- complex.add_edge(Vertex_handle(3),Vertex_handle(4));
- complex.add_blocker(Simplex_handle(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3),Vertex_handle(4)));
- // Print result
- cerr << "initial complex:\n"<< complex.to_string();
- cerr <<endl<<endl;
-
- complex.remove_star(static_cast<Vertex_handle>(2));
- cerr << "complex after remove star of 2:\n"<< complex.to_string();
-
- bool blocker134_here = complex.contains_blocker(Simplex_handle(Vertex_handle(1),Vertex_handle(3),Vertex_handle(4)));
- bool blocker1234_here = complex.contains_blocker(Simplex_handle(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3),Vertex_handle(4)));
- return blocker134_here && !blocker1234_here;
+bool test_collapse3() {
+ Complex complex(5);
+ build_complete(4, complex);
+ complex.add_vertex();
+ complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(4));
+ complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(4));
+ complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(4));
+ complex.add_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3), Vertex_handle(4)));
+ // Print result
+ cerr << "initial complex:\n" << complex.to_string();
+ cerr << endl << endl;
+
+ complex.remove_star(static_cast<Vertex_handle> (2));
+ cerr << "complex after remove star of 2:\n" << complex.to_string();
+
+ bool blocker134_here = complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(3), Vertex_handle(4)));
+ bool blocker1234_here = complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3), Vertex_handle(4)));
+ return blocker134_here && !blocker1234_here;
}
-bool test_add_simplex(){
- Complex complex(5);
- build_complete(4,complex);
- complex.add_blocker(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2)));
- // Print result
- cerr << "initial complex:\n"<< complex.to_string();
- cerr <<endl<<endl;
-
- complex.add_simplex(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2),Vertex_handle(3)));
- cerr << "complex after add_simplex:\n"<< complex.to_string();
-
- return complex.num_blockers()==0;
+bool test_add_simplex() {
+ Complex complex(4);
+ build_complete(4, complex);
+ complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(3)));
+ cerr << "initial complex:\n" << complex.to_string();
+ cerr << endl << endl;
+
+ complex.add_simplex(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(3)));
+ cerr << "complex after add_simplex:\n" << complex.to_string();
+ return complex.num_blockers() == 1
+ && complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)));
}
-bool test_add_simplex2(){
- Complex complex;
- build_complete(4,complex);
- // Print result
- cerr << "initial complex:\n"<< complex.to_string();
- cerr <<endl<<endl;
+bool test_add_simplex2() {
+ Complex complex;
+ build_complete(4, complex);
+ // Print result
+ cerr << "initial complex:\n" << complex.to_string();
+ cerr << endl << endl;
- Complex copy(complex.num_vertices());
+ Complex copy(complex.num_vertices());
- std::vector<Simplex_handle> simplices(complex.simplex_range().begin(),complex.simplex_range().end());
- sort(simplices.begin(),simplices.end(),[&](const Simplex_handle& s1,const Simplex_handle& s2){
- return s1.dimension()<s2.dimension();
- });
- for(const auto & simplex : simplices){
- if(!copy.contains(simplex) && simplex.dimension()==1)
- copy.add_edge(simplex.first_vertex(),simplex.last_vertex());
- if(!copy.contains(simplex) && simplex.dimension()>1)
- copy.add_simplex(simplex);
- }
+ std::vector<Simplex> simplices(complex.complex_simplex_range().begin(), complex.complex_simplex_range().end());
+ sort(simplices.begin(), simplices.end(), [&](const Simplex& s1, const Simplex & s2) {
+ return s1.dimension() < s2.dimension();
+ });
+ for (const auto & simplex : simplices) {
+ if (!copy.contains(simplex) && simplex.dimension() == 1)
+ copy.add_edge_without_blockers(simplex.first_vertex(), simplex.last_vertex());
+ if (!copy.contains(simplex) && simplex.dimension() > 1)
+ copy.add_simplex(simplex);
+ }
- cerr << "complex after add_simplex:\n"<< copy.to_string();
+ cerr << "complex after add_simplex:\n" << copy.to_string();
- return complex.num_blockers()==copy.num_blockers() &&
- complex.num_edges()==copy.num_edges() &&
- complex.num_vertices()==copy.num_vertices();
+ return complex.num_blockers() == copy.num_blockers() &&
+ complex.num_edges() == copy.num_edges() &&
+ complex.num_vertices() == copy.num_vertices();
}
+bool test_add_simplex3() {
+ Complex complex(5);
+ build_complete(5, complex);
+ complex.remove_edge(Vertex_handle(3), Vertex_handle(4));
+ Simplex sigma(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2));
+ complex.add_blocker(sigma);
+ // Print result
+ cerr << "initial complex:\n" << complex.to_string();
+ cerr << endl << endl;
+ complex.add_simplex(sigma);
+ //should create two blockers 0123 and 0124
+ cerr << "complex after adding simplex 012:\n" << complex.to_string();
+ return complex.num_blockers() == 2
+ && complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)))
+ && complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(4)));
+}
-
-bool test_remove_popable_blockers(){
- Complex complex;
- build_complete(4,complex);
- complex.add_vertex();
- complex.add_edge(Vertex_handle(3),Vertex_handle(4));
- complex.add_edge(Vertex_handle(2),Vertex_handle(4));
- Simplex_handle sigma1=Simplex_handle(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3));
- Simplex_handle sigma2=Simplex_handle(Vertex_handle(2),Vertex_handle(3),Vertex_handle(4));
-
- complex.add_blocker(sigma1);
- complex.add_blocker(sigma2);
- cerr << "complex complex"<< complex.to_string();
- cerr <<endl<<endl;
- cerr << "complex.RemovePopableBlockers();"<<endl;
- complex.remove_popable_blockers();
- cerr << "complex complex"<< complex.to_string();
- cerr <<endl<<endl;
-
- bool test1 = (complex.num_blockers()==1);
-
-
- // test 2
- complex.clear();
- build_complete(4,complex);
- complex.add_vertex();
- complex.add_vertex();
- complex.add_edge(Vertex_handle(3),Vertex_handle(4));
- complex.add_edge(Vertex_handle(2),Vertex_handle(4));
- complex.add_edge(Vertex_handle(2),Vertex_handle(5));
- complex.add_edge(Vertex_handle(3),Vertex_handle(5));
- complex.add_edge(Vertex_handle(4),Vertex_handle(5));
- sigma1=Simplex_handle(Vertex_handle(1),Vertex_handle(2),Vertex_handle(3));
- sigma2=Simplex_handle(Vertex_handle(2),Vertex_handle(3),Vertex_handle(4));
-
- complex.add_blocker(sigma1);
- complex.add_blocker(sigma2);
- cerr << "complex complex"<< complex.to_string();
- cerr <<endl<<endl; cerr << "complex.RemovePopableBlockers();"<<endl;
- complex.remove_popable_blockers();
- cerr << "complex complex"<< complex.to_string();
-
- cerr <<endl<<endl;
- bool test2 = (complex.num_blockers()==0);
- return test1&&test2;
+bool test_add_simplex4() {
+ int n = 6;
+ Complex complex(n);
+
+ // add all simplex 0..n without i
+ for (int i = 0; i < n; i++) {
+ Simplex s;
+ for (int k = 0; k < n; k++)
+ s.add_vertex(Vertex_handle(k));
+ s.remove_vertex(Vertex_handle(i));
+ complex.add_simplex(s);
+
+ //at step i there is only blocker 0..i
+ if (i < 2 && complex.num_blockers() > 0)
+ return false;
+ if (i >= 2 && complex.num_blockers() != 1) {
+ Simplex b;
+ for (int k = 0; k < i; k++)
+ b.add_vertex(Vertex_handle(i));
+ if (!complex.contains_blocker(b))
+ return false;
+ }
+ TESTVALUE(complex.blockers_to_string());
+ }
+ Simplex s;
+ for (int k = 0; k < n; k++)
+ s.add_vertex(Vertex_handle(k));
+ return complex.num_blockers() == 1 && complex.contains_blocker(s);
}
+bool test_add_edge() {
+ Complex complex(4);
+ for (unsigned i = 0u; i < 4; i++)
+ complex.add_edge(Vertex_handle(i), Vertex_handle((i + 1) % 4));
+
+ // Print result
+ cerr << "initial complex:\n" << complex.to_string();
+ cerr << endl << endl;
+ complex.add_edge(Vertex_handle(1), Vertex_handle(3));
+ //should create two blockers 013 and 012
+ cerr << "complex after adding edge 13:\n" << complex.to_string();
+ return complex.num_blockers() == 2
+ && complex.contains_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(3)))
+ && complex.contains_blocker(Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)));
+}
+bool test_remove_popable_blockers() {
+ Complex complex;
+ build_complete(4, complex);
+ complex.add_vertex();
+ complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(4));
+ complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(4));
+ Simplex sigma1 = Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3));
+ Simplex sigma2 = Simplex(Vertex_handle(2), Vertex_handle(3), Vertex_handle(4));
+
+ complex.add_blocker(sigma1);
+ complex.add_blocker(sigma2);
+ cerr << "complex complex" << complex.to_string();
+ cerr << endl << endl;
+ cerr << "complex.RemovePopableBlockers();" << endl;
+ complex.remove_popable_blockers();
+ cerr << "complex complex" << complex.to_string();
+ cerr << endl << endl;
+
+ bool test1 = (complex.num_blockers() == 1);
+
+
+ // test 2
+ complex.clear();
+ build_complete(4, complex);
+ complex.add_vertex();
+ complex.add_vertex();
+ complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(4));
+ complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(4));
+ complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(5));
+ complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(5));
+ complex.add_edge_without_blockers(Vertex_handle(4), Vertex_handle(5));
+ sigma1 = Simplex(Vertex_handle(1), Vertex_handle(2), Vertex_handle(3));
+ sigma2 = Simplex(Vertex_handle(2), Vertex_handle(3), Vertex_handle(4));
+
+ complex.add_blocker(sigma1);
+ complex.add_blocker(sigma2);
+ cerr << "complex complex" << complex.to_string();
+ cerr << endl << endl;
+ cerr << "complex.RemovePopableBlockers();" << endl;
+ complex.remove_popable_blockers();
+ cerr << "complex complex" << complex.to_string();
+
+ cerr << endl << endl;
+ bool test2 = (complex.num_blockers() == 0);
+ return test1&&test2;
+}
-int main (int argc, char *argv[])
-{
- Tests tests_simplifiable_complex;
- tests_simplifiable_complex.add("Test contraction 1",test_contraction1);
- tests_simplifiable_complex.add("Test contraction 2",test_contraction2);
- tests_simplifiable_complex.add("Test Link condition 1",test_link_condition1);
- tests_simplifiable_complex.add("Test remove popable blockers",test_remove_popable_blockers);
+int main(int argc, char *argv[]) {
+ Tests tests_simplifiable_complex;
+ tests_simplifiable_complex.add("Test contraction 1", test_contraction1);
+ tests_simplifiable_complex.add("Test contraction 2", test_contraction2);
+ tests_simplifiable_complex.add("Test Link condition 1", test_link_condition1);
+ tests_simplifiable_complex.add("Test remove popable blockers", test_remove_popable_blockers);
- tests_simplifiable_complex.add("Test collapse 0",test_collapse0);
- tests_simplifiable_complex.add("Test collapse 1",test_collapse1);
- tests_simplifiable_complex.add("Test collapse 2",test_collapse2);
- tests_simplifiable_complex.add("Test collapse 3",test_collapse3);
+ tests_simplifiable_complex.add("Test collapse 0", test_collapse0);
+ tests_simplifiable_complex.add("Test collapse 1", test_collapse1);
+ tests_simplifiable_complex.add("Test collapse 2", test_collapse2);
+ tests_simplifiable_complex.add("Test collapse 3", test_collapse3);
- tests_simplifiable_complex.add("Test add simplex",test_add_simplex);
- tests_simplifiable_complex.add("Test add simplex2",test_add_simplex2);
+ tests_simplifiable_complex.add("Test add edge",test_add_edge);
+ tests_simplifiable_complex.add("Test add simplex", test_add_simplex);
+ tests_simplifiable_complex.add("Test add simplex2", test_add_simplex2);
+ tests_simplifiable_complex.add("Test add simplex3",test_add_simplex3);
+ tests_simplifiable_complex.add("Test add simplex4",test_add_simplex4);
- tests_simplifiable_complex.run();
+ tests_simplifiable_complex.run();
- if(tests_simplifiable_complex.run())
- return EXIT_SUCCESS;
- else
- return EXIT_FAILURE;
+ if (tests_simplifiable_complex.run())
+ return EXIT_SUCCESS;
+ else
+ return EXIT_FAILURE;
}
diff --git a/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp b/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp
index 3dc38572..6e891483 100644
--- a/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp
+++ b/src/Skeleton_blocker/test/TestSkeletonBlockerComplex.cpp
@@ -24,7 +24,7 @@
#include <string>
#include <fstream>
#include <sstream>
-#include "gudhi/Utils.h"
+#include "gudhi/Debug_utils.h"
#include "gudhi/Test.h"
#include "gudhi/Skeleton_blocker.h"
//#include "gudhi/Skeleton_blocker_link_complex.h"
@@ -36,917 +36,917 @@ using namespace std;
using namespace Gudhi;
-using namespace skbl;
+using namespace skeleton_blocker;
typedef Skeleton_blocker_complex<Skeleton_blocker_simple_traits> Complex;
typedef Complex::Vertex_handle Vertex_handle;
typedef Complex::Root_vertex_handle Root_vertex_handle;
-typedef Complex::Simplex_handle Simplex_handle;
+typedef Complex::Simplex Simplex;
typedef Complex::Root_simplex_handle Root_simplex_handle;
-typedef Simplex_handle::Simplex_vertex_const_iterator Simplex_vertex_const_iterator;
+typedef Simplex::Simplex_vertex_const_iterator Simplex_vertex_const_iterator;
typedef Complex::Edge_handle Edge_handle;
// true if v in complex
-bool assert_vertex(Complex &complex,Vertex_handle v){
- //assert(complex.contains(v));
- return complex.contains(static_cast<Simplex_handle>(v));
-}
-
-bool assert_simplex(Complex &complex,Root_vertex_handle a,Root_vertex_handle b,Root_vertex_handle c){
- return true;
- // AddressSimplex simplex((a),(b),(c));
- // return complex.contains(&simplex);
-}
-// true iff the blocker (a,b,c) is in complex
-bool assert_blocker(Complex &complex,Root_vertex_handle a,Root_vertex_handle b,Root_vertex_handle c){
- return true;
- //return complex.contains_blocker((a),(b),(c));
+bool assert_vertex(Complex &complex, Vertex_handle v) {
+ //assert(complex.contains(v));
+ return complex.contains(static_cast<Simplex> (v));
}
-// true iff the blocker (a,b,c,d) is in complex
-bool assert_blocker(Complex &complex,Root_vertex_handle a,Root_vertex_handle b,Root_vertex_handle c,Root_vertex_handle d){
- return true;
- //Simplex blocker (a,b,c,d);
- //return complex.contains_blocker(&blocker);
-}
-
-
-
-void build_complete(int n,Complex& complex){
- complex.clear();
- for(int i=0;i<n;i++)
- complex.add_vertex();
-
- // for(int i=n-1;i>=0;i--)
- // for(int j=i-1;j>=0;j--)
- // complex.add_edge(Vertex_handle(i),Vertex_handle(j));
-
- for(int i=0;i<n;i++)
- for(int j=0;j<i;j++)
- complex.add_edge(Vertex_handle(i),Vertex_handle(j));
-}
-
-
-bool test_simplex(){
- // PRINT("test simplex");
- Simplex_handle simplex(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2),Vertex_handle(3));
- for (auto i = simplex.begin() ; i != simplex.end() ; ++i){
- PRINT(*i);
- auto j = i;
- for (++j ;
- j != simplex.end() ;
- ++j){
- PRINT(*j);
- }
- }
- return simplex.dimension()==3;
-}
-
-
-bool test_iterator_vertices1(){
- int n = 10;
- Complex complex(10);
- cerr << "complex.num_vertices():"<<complex.num_vertices()<<endl;
- int num_vertex_seen = 0;
- for(auto vi :complex.vertex_range()){
- cerr << "vertex:"<<vi<<endl;
- ++num_vertex_seen;
- }
- return num_vertex_seen == n;
-}
-
-bool test_iterator_vertices2(){
- int n = 10;
- Complex complex(10);
- build_complete(10,complex);
- cerr << "complex.num_vertices():"<<complex.num_vertices()<<endl;
- cerr << "complex.num_edges():"<<complex.num_edges()<<endl;
- int num_vertex_seen = 0;
- for(auto vi :complex.vertex_range(Vertex_handle(2))){
- cerr << "vertex:"<<vi<<endl;
- ++num_vertex_seen;
- }
- std::cerr<<"num_vertex_seen:"<<num_vertex_seen<<std::endl;
- return num_vertex_seen == (n-1);
-}
-
-
-
-bool test_iterator_edge(){
- const int n = 10;
- Complex complex(n);
- for(int i=0;i<n;i++)
- for(int j=0;j<i;j++)
- complex.add_edge(Vertex_handle(i),Vertex_handle(j));
- complex.remove_edge(Vertex_handle(2),Vertex_handle(3));
- complex.remove_edge(Vertex_handle(3),Vertex_handle(5));
- cerr << "complex.num_edges():"<<complex.num_edges()<<endl;
- int num_edges_seen = 0;
- for(auto edge : complex.edge_range()){
- cerr << "edge :"<<complex[edge]<<endl;
- ++num_edges_seen;
- }
-
- return num_edges_seen == n*(n-1)/2-2;
-}
-
-bool test_iterator_edge2(){
- const int n = 10;
- Complex complex(n);
- for(int i=0;i<n;i++)
- for(int j=0;j<i;j++)
- complex.add_edge(Vertex_handle(i),Vertex_handle(j));
- complex.remove_edge(Vertex_handle(2),Vertex_handle(3));
- complex.remove_edge(Vertex_handle(3),Vertex_handle(5));
- cerr << "complex.num_edges():"<<complex.num_edges()<<endl;
- int num_neigbors_seen = 0;
- for(auto neighbor : complex.vertex_range(Vertex_handle(2))){
- cerr << "neighbor"<<neighbor<<endl;
- ++num_neigbors_seen;
- }
- return num_neigbors_seen==8;
-}
-
-
-
-bool test_iterator_edge3(){
- const int n = 10;
- Complex complex(n);
- for(int i=0;i<n;i++)
- for(int j=0;j<i;j++)
- complex.add_edge(Vertex_handle(i),Vertex_handle(j));
- complex.remove_edge(Vertex_handle(2),Vertex_handle(3));
- complex.remove_edge(Vertex_handle(3),Vertex_handle(5));
- cerr << "complex.num_edges():"<<complex.num_edges()<<endl;
- int num_neigbors_seen = 0;
- for(auto edge : complex.edge_range(Vertex_handle(2))){
- std::cerr << edge<< std::endl;
- ++num_neigbors_seen;
- }
- return num_neigbors_seen==8;
-}
-
-
-
-bool test_iterator_triangles(){
- const int n = 7;
- Complex complex(n);
- //create a "ring" around '0'
- for(int i=1;i<n;i++)
- complex.add_edge(Vertex_handle(0),Vertex_handle(i));
- for(int i=1;i<n-1;i++)
- complex.add_edge(Vertex_handle(i),Vertex_handle(i+1));
- complex.add_edge(Vertex_handle(1),Vertex_handle(6));
-
- PRINT(complex.to_string());
-
- int num_triangles_seen=0;
- //for (auto t : complex.triangle_range(5)){
- TEST("triangles around 5 (should be 2 of them):");
- for (auto t : complex.triangle_range(Vertex_handle(5))){
- PRINT(t);
- ++num_triangles_seen;
- }
- bool test = (num_triangles_seen==2);
-
- num_triangles_seen=0;
- TEST("triangles around 0 (should be 6 of them):");
- for (auto t : complex.triangle_range(Vertex_handle(0))){
- PRINT(t);
- ++num_triangles_seen;
- }
- test = test&&(num_triangles_seen==6);
-
- // we now add another triangle
- complex.add_vertex();
- complex.add_edge(Vertex_handle(4),Vertex_handle(7));
- complex.add_edge(Vertex_handle(3),Vertex_handle(7));
- complex.add_blocker(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(6)));
- num_triangles_seen=0;
-
- TEST("triangles (should be 6 of them):");
- num_triangles_seen=0;
- for (auto t : complex.triangle_range()){
- PRINT(t);
- ++num_triangles_seen;
- }
- test = test&&(num_triangles_seen==6);
- PRINT(num_triangles_seen);
-
- return test;
+bool assert_simplex(Complex &complex, Root_vertex_handle a, Root_vertex_handle b, Root_vertex_handle c) {
+ return true;
+ // AddressSimplex simplex((a),(b),(c));
+ // return complex.contains(&simplex);
}
+// true iff the blocker (a,b,c) is in complex
-//#include "combinatorics/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h"
-
-bool test_iterator_simplices(){
- Complex complex(6);
- complex.add_edge(Vertex_handle(0),Vertex_handle(1));
- complex.add_edge(Vertex_handle(1),Vertex_handle(2));
- complex.add_edge(Vertex_handle(2),Vertex_handle(0));
- complex.add_edge(Vertex_handle(1),Vertex_handle(3));
- complex.add_edge(Vertex_handle(2),Vertex_handle(3));
- complex.add_edge(Vertex_handle(2),Vertex_handle(5));
- complex.add_edge(Vertex_handle(3),Vertex_handle(5));
- complex.add_edge(Vertex_handle(2),Vertex_handle(4));
- complex.add_edge(Vertex_handle(4),Vertex_handle(5));
- complex.add_edge(Vertex_handle(3),Vertex_handle(4));
-
- complex.add_blocker(Simplex_handle(Vertex_handle(2),Vertex_handle(3),Vertex_handle(4),Vertex_handle(5)));
-
- bool correct_number_simplices = true;
-
- std::map<Vertex_handle,unsigned> expected_num_simplices;
-
- expected_num_simplices[Vertex_handle(0)] = 4;
- expected_num_simplices[Vertex_handle(1)] = 6;
- expected_num_simplices[Vertex_handle(2)] = 11;
- expected_num_simplices[Vertex_handle(3)] = 9;
- expected_num_simplices[Vertex_handle(4)] = 7;
- expected_num_simplices[Vertex_handle(5)] = 7;
-
- for(auto pair : expected_num_simplices){
- unsigned num_simplices_around = 0;
- for(const auto& simplex : complex.simplex_range(pair.first)){
- simplex.dimension();
- DBGVALUE(simplex);
- ++num_simplices_around;
- }
-
- correct_number_simplices = correct_number_simplices && (num_simplices_around == pair.second);
-
- DBGMSG("current vertex:",pair.first);
- DBGMSG("expected_num_simplices:",pair.second);
- DBGMSG("found:",num_simplices_around);
- }
- return correct_number_simplices;
+bool assert_blocker(Complex &complex, Root_vertex_handle a, Root_vertex_handle b, Root_vertex_handle c) {
+ return true;
+ //return complex.contains_blocker((a),(b),(c));
}
+// true iff the blocker (a,b,c,d) is in complex
-
-bool test_iterator_simplices2(){
- Complex complex(2);
- complex.add_edge(Vertex_handle(0),Vertex_handle(1));
-
- for(const auto& s:complex.triangle_range()){
- s.dimension();
- return false; // there are no triangles
- }
-
- unsigned num_simplices = 0 ;
-
-
- DBGVALUE(complex.to_string());
-
- for(const auto& simplex : complex.simplex_range(Vertex_handle(0))){
- simplex.dimension();
- DBGVALUE(simplex);
- }
-
-
- for(const auto& simplex : complex.simplex_range()){
- DBGVALUE(simplex);
- simplex.dimension();
- ++num_simplices;
- }
- bool correct_number_simplices = (num_simplices == 3);
- return correct_number_simplices;
+bool assert_blocker(Complex &complex, Root_vertex_handle a, Root_vertex_handle b, Root_vertex_handle c, Root_vertex_handle d) {
+ return true;
+ //Simplex blocker (a,b,c,d);
+ //return complex.contains_blocker(&blocker);
+}
+
+void build_complete(int n, Complex& complex) {
+ complex.clear();
+ for (int i = 0; i < n; i++)
+ complex.add_vertex();
+
+ // for(int i=n-1;i>=0;i--)
+ // for(int j=i-1;j>=0;j--)
+ // complex.add_edge_without_blockers(Vertex_handle(i),Vertex_handle(j));
+
+ 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));
+}
+
+bool test_simplex() {
+ // PRINT("test simplex");
+ Simplex simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3));
+ for (auto i = simplex.begin(); i != simplex.end(); ++i) {
+ PRINT(*i);
+ auto j = i;
+ for (++j;
+ j != simplex.end();
+ ++j) {
+ PRINT(*j);
+ }
+ }
+ return simplex.dimension() == 3;
+}
+
+bool test_num_simplices() {
+ int n = 4;
+ Complex complex;
+ build_complete(n, complex);
+ size_t sum = 0;
+ for (int i = 0; i < n; i++) {
+ PRINT(complex.num_simplices(i));
+ sum += complex.num_simplices(i);
+ }
+ return
+ complex.num_vertices() == n &&
+ complex.num_edges() == 6 &&
+ sum == 15 &&
+ complex.num_simplices() == 15;
+}
+
+
+bool test_iterator_vertices1() {
+ int n = 10;
+ Complex complex(10);
+ cerr << "complex.num_vertices():" << complex.num_vertices() << endl;
+ int num_vertex_seen = 0;
+ for (auto vi : complex.vertex_range()) {
+ cerr << "vertex:" << vi << endl;
+ ++num_vertex_seen;
+ }
+ return num_vertex_seen == n;
+}
+
+bool test_iterator_vertices2() {
+ int n = 10;
+ Complex complex;
+ build_complete(10, complex);
+ cerr << "complex.num_vertices():" << complex.num_vertices() << endl;
+ cerr << "complex.num_edges():" << complex.num_edges() << endl;
+ int num_vertex_seen = 0;
+ for (auto vi : complex.vertex_range(Vertex_handle(2))) {
+ cerr << "vertex:" << vi << endl;
+ ++num_vertex_seen;
+ }
+ std::cerr << "num_vertex_seen:" << num_vertex_seen << std::endl;
+ return num_vertex_seen == (n - 1);
+}
+
+bool test_iterator_edge() {
+ const int n = 10;
+ Complex complex(n);
+ 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));
+ complex.remove_edge(Vertex_handle(2), Vertex_handle(3));
+ complex.remove_edge(Vertex_handle(3), Vertex_handle(5));
+ cerr << "complex.num_edges():" << complex.num_edges() << endl;
+ int num_edges_seen = 0;
+ for (auto edge : complex.edge_range()) {
+ cerr << "edge :" << complex[edge] << endl;
+ ++num_edges_seen;
+ }
+
+ return num_edges_seen == n * (n - 1) / 2 - 2;
+}
+
+bool test_iterator_edge2() {
+ const int n = 10;
+ Complex complex(n);
+ 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));
+ complex.remove_edge(Vertex_handle(2), Vertex_handle(3));
+ complex.remove_edge(Vertex_handle(3), Vertex_handle(5));
+ cerr << "complex.num_edges():" << complex.num_edges() << endl;
+ int num_neigbors_seen = 0;
+ for (auto neighbor : complex.vertex_range(Vertex_handle(2))) {
+ cerr << "neighbor" << neighbor << endl;
+ ++num_neigbors_seen;
+ }
+ return num_neigbors_seen == 8;
+}
+
+bool test_iterator_edge3() {
+ const int n = 10;
+ Complex complex(n);
+ 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));
+ complex.remove_edge(Vertex_handle(2), Vertex_handle(3));
+ complex.remove_edge(Vertex_handle(3), Vertex_handle(5));
+ cerr << "complex.num_edges():" << complex.num_edges() << endl;
+ int num_neigbors_seen = 0;
+ for (auto edge : complex.edge_range(Vertex_handle(2))) {
+ std::cerr << edge << std::endl;
+ ++num_neigbors_seen;
+ }
+ return num_neigbors_seen == 8;
+}
+
+bool test_iterator_triangles() {
+ const int n = 7;
+ Complex complex(n);
+ //create a "ring" around '0'
+ for (int i = 1; i < n; i++)
+ complex.add_edge_without_blockers(Vertex_handle(0), Vertex_handle(i));
+ for (int i = 1; i < n - 1; i++)
+ complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(i + 1));
+ complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(6));
+
+ PRINT(complex.to_string());
+
+ int num_triangles_seen = 0;
+ //for (auto t : complex.triangle_range(5)){
+ TEST("triangles around 5 (should be 2 of them):");
+ for (auto t : complex.triangle_range(Vertex_handle(5))) {
+ PRINT(t);
+ ++num_triangles_seen;
+ }
+ bool test = (num_triangles_seen == 2);
+
+ num_triangles_seen = 0;
+ TEST("triangles around 0 (should be 6 of them):");
+ for (auto t : complex.triangle_range(Vertex_handle(0))) {
+ PRINT(t);
+ ++num_triangles_seen;
+ }
+ test = test && (num_triangles_seen == 6);
+
+ // we now add another triangle
+ complex.add_vertex();
+ complex.add_edge_without_blockers(Vertex_handle(4), Vertex_handle(7));
+ complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(7));
+ complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(6)));
+ num_triangles_seen = 0;
+
+ TEST("triangles (should be 6 of them):");
+ num_triangles_seen = 0;
+ for (auto t : complex.triangle_range()) {
+ PRINT(t);
+ ++num_triangles_seen;
+ }
+ test = test && (num_triangles_seen == 6);
+ PRINT(num_triangles_seen);
+
+ return test;
}
-bool test_iterator_simplices3(){
- Complex complex(3);
- complex.add_edge(Vertex_handle(0),Vertex_handle(1));
- complex.add_edge(Vertex_handle(1),Vertex_handle(2));
- complex.add_edge(Vertex_handle(2),Vertex_handle(0));
- complex.add_blocker(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2)));
-
- unsigned num_simplices = 0 ;
-
- for(const auto& simplex : complex.simplex_range(Vertex_handle(0))){
- simplex.dimension();
- DBGVALUE(simplex);
- }
-
+//#include "combinatorics/Skeleton_blocker/iterators/Skeleton_blockers_simplices_iterators.h"
- for(const auto& simplex : complex.simplex_range()){
- DBGVALUE(simplex);
- simplex.dimension();
- ++num_simplices;
- }
- bool correct_number_simplices = (num_simplices == 6);
- return correct_number_simplices;
+bool test_iterator_simplices() {
+ Complex complex(6);
+ complex.add_edge_without_blockers(Vertex_handle(0), Vertex_handle(1));
+ complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(2));
+ complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(0));
+ complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(3));
+ complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(3));
+ complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(5));
+ complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(5));
+ complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(4));
+ complex.add_edge_without_blockers(Vertex_handle(4), Vertex_handle(5));
+ complex.add_edge_without_blockers(Vertex_handle(3), Vertex_handle(4));
+
+ complex.add_blocker(Simplex(Vertex_handle(2), Vertex_handle(3), Vertex_handle(4), Vertex_handle(5)));
+
+ bool correct_number_simplices = true;
+
+ std::map<Vertex_handle, unsigned> expected_num_simplices;
+
+ expected_num_simplices[Vertex_handle(0)] = 4;
+ expected_num_simplices[Vertex_handle(1)] = 6;
+ expected_num_simplices[Vertex_handle(2)] = 11;
+ expected_num_simplices[Vertex_handle(3)] = 9;
+ expected_num_simplices[Vertex_handle(4)] = 7;
+ expected_num_simplices[Vertex_handle(5)] = 7;
+
+ for (auto pair : expected_num_simplices) {
+ unsigned num_simplices_around = 0;
+ for (const auto& simplex : complex.star_simplex_range(pair.first)) {
+ simplex.dimension();
+ DBGVALUE(simplex);
+ ++num_simplices_around;
+ }
+
+ correct_number_simplices = correct_number_simplices && (num_simplices_around == pair.second);
+
+ DBGMSG("current vertex:", pair.first);
+ DBGMSG("expected_num_simplices:", pair.second);
+ DBGMSG("found:", num_simplices_around);
+ }
+ return correct_number_simplices;
+}
+
+bool test_iterator_simplices2() {
+ Complex complex(2);
+ complex.add_edge_without_blockers(Vertex_handle(0), Vertex_handle(1));
+
+ for (const auto& s : complex.triangle_range()) {
+ s.dimension();
+ return false; // there are no triangles
+ }
+
+ unsigned num_simplices = 0;
+
+
+ DBGVALUE(complex.to_string());
+
+ for (const auto& simplex : complex.star_simplex_range(Vertex_handle(0))) {
+ simplex.dimension();
+ DBGVALUE(simplex);
+ }
+
+
+ for (const auto& simplex : complex.complex_simplex_range()) {
+ DBGVALUE(simplex);
+ simplex.dimension();
+ ++num_simplices;
+ }
+ bool correct_number_simplices = (num_simplices == 3);
+ return correct_number_simplices;
+}
+
+bool test_iterator_simplices3() {
+ Complex complex(3);
+ complex.add_edge_without_blockers(Vertex_handle(0), Vertex_handle(1));
+ complex.add_edge_without_blockers(Vertex_handle(1), Vertex_handle(2));
+ complex.add_edge_without_blockers(Vertex_handle(2), Vertex_handle(0));
+ complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2)));
+
+ unsigned num_simplices = 0;
+
+ for (const auto& simplex : complex.star_simplex_range(Vertex_handle(0))) {
+ simplex.dimension();
+ DBGVALUE(simplex);
+ }
+
+
+ for (const auto& simplex : complex.complex_simplex_range()) {
+ DBGVALUE(simplex);
+ simplex.dimension();
+ ++num_simplices;
+ }
+ bool correct_number_simplices = (num_simplices == 6);
+ return correct_number_simplices;
+}
+
+bool test_iterator_simplices4() {
+ Complex empty_complex;
+ for (auto v : empty_complex.vertex_range()) {
+ (void) v;
+ }
+ for (auto e : empty_complex.edge_range()) {
+ empty_complex[e];
+ }
+ for (auto t : empty_complex.triangle_range()) {
+ t.dimension();
+ }
+ for (auto s : empty_complex.complex_simplex_range()) {
+ s.dimension();
+ }
+ return true;
}
-bool test_iterator_simplices4(){
- Complex empty_complex;
- for(auto v : empty_complex.vertex_range()){
- v;
- }
- for(auto e : empty_complex.edge_range()){
- empty_complex[e];
- }
- for(auto t : empty_complex.triangle_range()){
- t.dimension();
- }
- for(auto s : empty_complex.simplex_range()){
- s.dimension();
- }
- return true;
+bool test_iterator_coboundary() {
+ Complex c;
+ build_complete(4, c);
+ c.remove_edge(Vertex_handle(1), Vertex_handle(3));
+ PRINT(c.to_string());
+ Simplex s02(Vertex_handle(0), Vertex_handle(2));
+ int n = 0;
+ std::set<Simplex> expected;
+ expected.insert(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2)));
+ expected.insert(Simplex(Vertex_handle(0), Vertex_handle(2), Vertex_handle(3)));
+ for (const auto & s : c.coboundary_range(s02)) {
+ PRINT(s);
+ if (expected.find(s) == expected.end())
+ return false;
+ ++n;
+ }
+ return n == 2;
}
-
template<typename Map>
-auto blocker_range(Map map) -> decltype( map | boost::adaptors::map_values){
- return map| boost::adaptors::map_values ;
-}
-
-
-bool test_iterator_blockers(){
- Complex complex;
- Simplex_handle alpha;
- Simplex_handle vertex_set_expected;
- // Build the complexes
- for (int i=0;i<20;i++){
- complex.add_vertex();
- }
- for (int i=10;i<15;i++){
- for (int j=i+1;j<15;j++)
- complex.add_edge(Vertex_handle(i),Vertex_handle(j));
- }
-
- complex.add_blocker(Simplex_handle(Vertex_handle(10),Vertex_handle(11),Vertex_handle(12)));
- complex.add_blocker(Simplex_handle(Vertex_handle(2),Vertex_handle(1),Vertex_handle(10)));
- complex.add_blocker(Simplex_handle(Vertex_handle(10),Vertex_handle(9),Vertex_handle(15)));
- complex.add_blocker(Simplex_handle(Vertex_handle(1),Vertex_handle(9),Vertex_handle(8)));
-
- // Print result
- int num_blockers=0;
- for(auto blockers : complex.blocker_range(Vertex_handle(10))){
- TESTVALUE(*blockers) ;
- num_blockers++;
- }
- bool test = (num_blockers==3);
-
- num_blockers=0;
- for (auto blockers : complex.blocker_range()){
- TESTVALUE(*blockers) ;
- num_blockers++;
- }
- test = test && (num_blockers==4) ;
-
- return test;
-}
-
-
-bool test_link0(){
-
- enum { a, b, c, d, n };
- Complex complex(n);
- complex.add_edge(Vertex_handle(b),Vertex_handle(c));complex.add_edge(Vertex_handle(c),Vertex_handle(d));
- Simplex_handle alpha = Simplex_handle(Vertex_handle(c));
- Skeleton_blocker_link_complex<Complex> L(complex,alpha);
-
- auto L2 = complex.link(alpha);
- if(L!=L2) return false;
-
- PRINT(L.num_vertices());
- PRINT(L.to_string());
-
- bool test1 = L.contains_vertex(*L.get_address(Root_vertex_handle(b)));
- bool test2 = L.contains_vertex(*L.get_address(Root_vertex_handle(d)));
- bool test3 = L.num_edges()==0;
- bool test4 = L.num_blockers()==0;
- return test1&&test2&&test3&&test4;
-
-}
-
-bool test_link1(){
- Complex complex;
-
-
- // Build the complexes
- for (int i=0;i<20;i++){
- complex.add_vertex();
- }
- for (int i=10;i<15;i++){
- for (int j=i+1;j<15;j++)
- complex.add_edge(Vertex_handle(i),Vertex_handle(j));
- }
- Simplex_handle alpha(Vertex_handle(12),Vertex_handle(14));
- Skeleton_blocker_link_complex<Complex> L(complex,alpha);
- // Complexes built
-
- auto L2 = complex.link(alpha);
- if(L!=L2) return false;
-
- // verification
- bool test1 = L.contains_vertex(*L.get_address(Root_vertex_handle(10)));
- bool test2 = L.contains_vertex(*L.get_address(Root_vertex_handle(11)));
- bool test3 = L.contains_vertex(*L.get_address(Root_vertex_handle(13)));
- bool test4 = L.num_edges()==3;
- bool test5 = L.num_blockers()==0;
- Root_simplex_handle simplex;
- simplex.add_vertex(Root_vertex_handle(10));
- simplex.add_vertex(Root_vertex_handle(11));
- simplex.add_vertex(Root_vertex_handle(13));
- bool test6(L.get_simplex_address(simplex));
- bool test7 = L.contains(*(L.get_simplex_address(simplex)));
- cerr <<"----> Ocomplex \n";
- return test1&&test2&&test3&&test4&&test5&&test6&&test7 ;
-
-}
-
-
-bool test_link2(){
- Complex complex;
-
- Simplex_handle alpha;
- Simplex_handle vertex_set_expected;
- // Build the complexes
- for (int i=0;i<20;i++){
- complex.add_vertex();
- }
- for (int i=10;i<15;i++){
- for (int j=i+1;j<15;j++)
- complex.add_edge(Vertex_handle(i),Vertex_handle(j));
- }
- complex.add_blocker(Simplex_handle(Vertex_handle(10),Vertex_handle(11),Vertex_handle(13)));
- alpha = Simplex_handle(Vertex_handle(12),Vertex_handle(14));
- Skeleton_blocker_link_complex<Complex> L(complex,alpha);
- // Complexes built
-
- // Print result
- cerr << "complex complex"<< complex.to_string();
- cerr <<endl<<endl;
- cerr << "L= Link_complex("<<alpha<<") : \n"<<L.to_string();
-
- auto L2 = complex.link(alpha);
- if(L!=L2) return false;
-
-
- // verification
- bool test1 = L.contains_vertex(*L.get_address(Root_vertex_handle(10)));
- bool test2 = L.contains_vertex(*L.get_address(Root_vertex_handle(11)));
- bool test3 = L.contains_vertex(*L.get_address(Root_vertex_handle(13)));
- bool test4 = L.num_edges()==3;
- bool test5 = L.num_blockers()==1;
- Root_simplex_handle simplex;
- simplex.add_vertex(Root_vertex_handle(10));
- simplex.add_vertex(Root_vertex_handle(11));
- simplex.add_vertex(Root_vertex_handle(13));
- bool test6 = L.contains_blocker(*(L.get_simplex_address(simplex)));
- cerr <<"----> Ocomplex \n";
- return test1&&test2&&test3&&test4&&test5&&test6 ;
-}
-
-bool test_link3(){
- Complex complex;
-
- Simplex_handle alpha;
- Simplex_handle vertex_set_expected;
- // Build the complexes
- for (int i=0;i<20;i++){
- complex.add_vertex();
- }
- for (int i=10;i<15;i++){
- for (int j=i+1;j<15;j++)
- complex.add_edge(Vertex_handle(i),Vertex_handle(j));
- }
- complex.add_blocker(Simplex_handle(Vertex_handle(10),Vertex_handle(11),Vertex_handle(12)));
- alpha = Simplex_handle(Vertex_handle(12),Vertex_handle(14));
- Skeleton_blocker_link_complex<Complex> L(complex,alpha);
- // Complexes built
-
- // Print result
- cerr << "complex complex"<< complex.to_string();
- cerr <<endl<<endl;
- cerr << "L= Link_complex("<<alpha<<") : \n"<<L.to_string();
-
- auto L2 = complex.link(alpha);
- if(L!=L2) return false;
-
-
- // verification
- bool test = assert_vertex(L,*L.get_address(Root_vertex_handle(10)));
- test = test&& assert_vertex(L,*L.get_address(Root_vertex_handle(11)));
- test = test&& assert_vertex(L,*L.get_address(Root_vertex_handle(13)));
- test = test&& L.num_edges()==2;
- test = test&&L.contains_edge(*L.get_address(Root_vertex_handle(10)),*L.get_address(Root_vertex_handle(13)));
- test=test&&L.contains_edge(*L.get_address(Root_vertex_handle(13)),*L.get_address(Root_vertex_handle(11)));
- test=test&&L.num_blockers()==0;
- return test;
-}
-
-bool test_link4(){
- Complex complex;
-
- // Build the complexes
- for (int i=0;i<20;i++){
- complex.add_vertex();
- }
- for (int i=10;i<15;i++){
- for (int j=i+1;j<15;j++)
- complex.add_edge(Vertex_handle(i),Vertex_handle(j));
- }
- complex.add_blocker(Simplex_handle(Vertex_handle(10),Vertex_handle(11),Vertex_handle(12),Vertex_handle(13)));
- Simplex_handle alpha(Vertex_handle(12),Vertex_handle(14));
- Skeleton_blocker_link_complex<Complex> L(complex,alpha);
- // Complexes built
-
- // verification
- bool test1 = L.contains_vertex(*L.get_address(Root_vertex_handle(10)));
- bool test2 = L.contains_vertex(*L.get_address(Root_vertex_handle(11)));
- bool test3 = L.contains_vertex(*L.get_address(Root_vertex_handle(13)));
- bool test4 = L.num_edges()==3;
- bool test5 = L.num_blockers()==1;
- Root_simplex_handle simplex;
- simplex.add_vertex(Root_vertex_handle(10));
- simplex.add_vertex(Root_vertex_handle(11));
- simplex.add_vertex(Root_vertex_handle(13));
- bool test6 = L.contains_blocker(*(L.get_simplex_address(simplex)));
- cerr <<"----> Ocomplex \n";
- return test1&&test2&&test3&&test4&&test5&&test6 ;
-
-}
-
-bool test_link5(){
- Complex complex(0,new Print_complex_visitor<Vertex_handle>());
- // Build the complexes
- build_complete(4,complex);
- complex.add_blocker(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2),Vertex_handle(3)));
-
- Simplex_handle alpha(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2));
+auto blocker_range(Map map) -> decltype(map | boost::adaptors::map_values) {
+ return map | boost::adaptors::map_values;
+}
+
+bool test_iterator_blockers() {
+ Complex complex;
+ Simplex alpha;
+ Simplex vertex_set_expected;
+ // Build the complexes
+ for (int i = 0; i < 20; i++) {
+ complex.add_vertex();
+ }
+ for (int i = 10; i < 15; i++) {
+ for (int j = i + 1; j < 15; j++)
+ complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j));
+ }
+
+ complex.add_blocker(Simplex(Vertex_handle(10), Vertex_handle(11), Vertex_handle(12)));
+ complex.add_blocker(Simplex(Vertex_handle(2), Vertex_handle(1), Vertex_handle(10)));
+ complex.add_blocker(Simplex(Vertex_handle(10), Vertex_handle(9), Vertex_handle(15)));
+ complex.add_blocker(Simplex(Vertex_handle(1), Vertex_handle(9), Vertex_handle(8)));
+
+ // Print result
+ int num_blockers = 0;
+ for (auto blockers : complex.blocker_range(Vertex_handle(10))) {
+ TESTVALUE(*blockers);
+ num_blockers++;
+ }
+ bool test = (num_blockers == 3);
+
+ num_blockers = 0;
+ for (auto blockers : complex.blocker_range()) {
+ TESTVALUE(*blockers);
+ num_blockers++;
+ }
+ test = test && (num_blockers == 4);
+
+ return test;
+}
+
+bool test_link0() {
+
+ enum {
+ a, b, c, d, n
+ };
+ Complex complex(n);
+ complex.add_edge_without_blockers(Vertex_handle(b), Vertex_handle(c));
+ complex.add_edge_without_blockers(Vertex_handle(c), Vertex_handle(d));
+ Simplex alpha = Simplex(Vertex_handle(c));
+ Skeleton_blocker_link_complex<Complex> L(complex, alpha);
+
+ auto L2 = complex.link(alpha);
+ if (L != L2) return false;
+
+ PRINT(L.num_vertices());
+ PRINT(L.to_string());
+
+ bool test1 = L.contains_vertex(*L.get_address(Root_vertex_handle(b)));
+ bool test2 = L.contains_vertex(*L.get_address(Root_vertex_handle(d)));
+ bool test3 = L.num_edges() == 0;
+ bool test4 = L.num_blockers() == 0;
+ return test1 && test2 && test3&&test4;
+
+}
+
+bool test_link1() {
+ Complex complex;
+
+
+ // Build the complexes
+ for (int i = 0; i < 20; i++) {
+ complex.add_vertex();
+ }
+ for (int i = 10; i < 15; i++) {
+ for (int j = i + 1; j < 15; j++)
+ complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j));
+ }
+ Simplex alpha(Vertex_handle(12), Vertex_handle(14));
+ Skeleton_blocker_link_complex<Complex> L(complex, alpha);
+ // Complexes built
+
+ auto L2 = complex.link(alpha);
+ if (L != L2) return false;
+
+ // verification
+ bool test1 = L.contains_vertex(*L.get_address(Root_vertex_handle(10)));
+ bool test2 = L.contains_vertex(*L.get_address(Root_vertex_handle(11)));
+ bool test3 = L.contains_vertex(*L.get_address(Root_vertex_handle(13)));
+ bool test4 = L.num_edges() == 3;
+ bool test5 = L.num_blockers() == 0;
+ Root_simplex_handle simplex;
+ simplex.add_vertex(Root_vertex_handle(10));
+ simplex.add_vertex(Root_vertex_handle(11));
+ simplex.add_vertex(Root_vertex_handle(13));
+ bool test6(L.get_simplex_address(simplex));
+ bool test7 = L.contains(*(L.get_simplex_address(simplex)));
+ cerr << "----> Ocomplex \n";
+ return test1 && test2 && test3 && test4 && test5 && test6&&test7;
+
+}
+
+bool test_link2() {
+ Complex complex;
+
+ Simplex alpha;
+ Simplex vertex_set_expected;
+ // Build the complexes
+ for (int i = 0; i < 20; i++) {
+ complex.add_vertex();
+ }
+ for (int i = 10; i < 15; i++) {
+ for (int j = i + 1; j < 15; j++)
+ complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j));
+ }
+ complex.add_blocker(Simplex(Vertex_handle(10), Vertex_handle(11), Vertex_handle(13)));
+ alpha = Simplex(Vertex_handle(12), Vertex_handle(14));
+ Skeleton_blocker_link_complex<Complex> L(complex, alpha);
+ // Complexes built
+
+ // Print result
+ cerr << "complex complex" << complex.to_string();
+ cerr << endl << endl;
+ cerr << "L= Link_complex(" << alpha << ") : \n" << L.to_string();
+
+ auto L2 = complex.link(alpha);
+ if (L != L2) return false;
+
+
+ // verification
+ bool test1 = L.contains_vertex(*L.get_address(Root_vertex_handle(10)));
+ bool test2 = L.contains_vertex(*L.get_address(Root_vertex_handle(11)));
+ bool test3 = L.contains_vertex(*L.get_address(Root_vertex_handle(13)));
+ bool test4 = L.num_edges() == 3;
+ bool test5 = L.num_blockers() == 1;
+ Root_simplex_handle simplex;
+ simplex.add_vertex(Root_vertex_handle(10));
+ simplex.add_vertex(Root_vertex_handle(11));
+ simplex.add_vertex(Root_vertex_handle(13));
+ bool test6 = L.contains_blocker(*(L.get_simplex_address(simplex)));
+ cerr << "----> Ocomplex \n";
+ return test1 && test2 && test3 && test4 && test5&&test6;
+}
+
+bool test_link3() {
+ Complex complex;
+
+ Simplex alpha;
+ Simplex vertex_set_expected;
+ // Build the complexes
+ for (int i = 0; i < 20; i++) {
+ complex.add_vertex();
+ }
+ for (int i = 10; i < 15; i++) {
+ for (int j = i + 1; j < 15; j++)
+ complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j));
+ }
+ complex.add_blocker(Simplex(Vertex_handle(10), Vertex_handle(11), Vertex_handle(12)));
+ alpha = Simplex(Vertex_handle(12), Vertex_handle(14));
+ Skeleton_blocker_link_complex<Complex> L(complex, alpha);
+ // Complexes built
+
+ // Print result
+ cerr << "complex complex" << complex.to_string();
+ cerr << endl << endl;
+ cerr << "L= Link_complex(" << alpha << ") : \n" << L.to_string();
+
+ auto L2 = complex.link(alpha);
+ if (L != L2) return false;
+
+
+ // verification
+ bool test = assert_vertex(L, *L.get_address(Root_vertex_handle(10)));
+ test = test && assert_vertex(L, *L.get_address(Root_vertex_handle(11)));
+ test = test && assert_vertex(L, *L.get_address(Root_vertex_handle(13)));
+ test = test && L.num_edges() == 2;
+ test = test && L.contains_edge(*L.get_address(Root_vertex_handle(10)), *L.get_address(Root_vertex_handle(13)));
+ test = test && L.contains_edge(*L.get_address(Root_vertex_handle(13)), *L.get_address(Root_vertex_handle(11)));
+ test = test && L.num_blockers() == 0;
+ return test;
+}
+
+bool test_link4() {
+ Complex complex;
+
+ // Build the complexes
+ for (int i = 0; i < 20; i++) {
+ complex.add_vertex();
+ }
+ for (int i = 10; i < 15; i++) {
+ for (int j = i + 1; j < 15; j++)
+ complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(j));
+ }
+ complex.add_blocker(Simplex(Vertex_handle(10), Vertex_handle(11), Vertex_handle(12), Vertex_handle(13)));
+ Simplex alpha(Vertex_handle(12), Vertex_handle(14));
+ Skeleton_blocker_link_complex<Complex> L(complex, alpha);
+ // Complexes built
+
+ // verification
+ bool test1 = L.contains_vertex(*L.get_address(Root_vertex_handle(10)));
+ bool test2 = L.contains_vertex(*L.get_address(Root_vertex_handle(11)));
+ bool test3 = L.contains_vertex(*L.get_address(Root_vertex_handle(13)));
+ bool test4 = L.num_edges() == 3;
+ bool test5 = L.num_blockers() == 1;
+ Root_simplex_handle simplex;
+ simplex.add_vertex(Root_vertex_handle(10));
+ simplex.add_vertex(Root_vertex_handle(11));
+ simplex.add_vertex(Root_vertex_handle(13));
+ bool test6 = L.contains_blocker(*(L.get_simplex_address(simplex)));
+ cerr << "----> Ocomplex \n";
+ return test1 && test2 && test3 && test4 && test5&&test6;
+
+}
+
+bool test_link5() {
+ Complex complex(0);
+ // Build the complexes
+ build_complete(4, complex);
+ complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2), Vertex_handle(3)));
+
+ Simplex alpha(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2));
+
+
+ Skeleton_blocker_link_complex<Complex> L(complex, alpha); // Complexes built
+
+ // Print result
+ PRINT(complex.to_string());
+ cerr << endl << endl;
+ PRINT(L.to_string());
+
+ // verification
+ return L.num_vertices() == 0;
+}
+
+bool test_link6() {
+ Complex complex(0);
+ // Build the complexes
+ build_complete(4, complex);
+ complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2)));
+ Simplex alpha(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2));
- Skeleton_blocker_link_complex<Complex> L(complex,alpha); // Complexes built
+ Skeleton_blocker_link_complex<Complex> link_blocker_alpha;
- // Print result
- PRINT(complex.to_string());
- cerr <<endl<<endl;
- PRINT(L.to_string());
+ build_link_of_blocker(complex, alpha, link_blocker_alpha);
+
+ // Print result
+ PRINT(complex.to_string());
+ cerr << endl << endl;
+ PRINT(link_blocker_alpha.to_string());
- // verification
- return L.num_vertices()==0;
+ // verification
+ return link_blocker_alpha.num_vertices() == 1;
}
-bool test_link6(){
- Complex complex(0,new Print_complex_visitor<Vertex_handle>());
- // Build the complexes
- build_complete(4,complex);
- complex.add_blocker(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2)));
+bool test_link7() {
+ Complex complex(0);
+ // Build the complexes
+ build_complete(6, complex);
+ complex.add_vertex();
+ complex.add_vertex();
+ for (int i = 3; i < 6; ++i) {
+ complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(6));
+ complex.add_edge_without_blockers(Vertex_handle(i), Vertex_handle(7));
+ }
+ complex.add_edge_without_blockers(Vertex_handle(6), Vertex_handle(7));
+ complex.add_blocker(Simplex(Vertex_handle(0), Vertex_handle(1), Vertex_handle(2)));
+ complex.add_blocker(Simplex(Vertex_handle(3), Vertex_handle(4), Vertex_handle(5)));
- Simplex_handle alpha(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2));
+ Simplex alpha(Vertex_handle(3), Vertex_handle(4), Vertex_handle(5));
- Skeleton_blocker_link_complex<Complex> link_blocker_alpha;
+ Skeleton_blocker_link_complex<Complex> link_blocker_alpha;
- build_link_of_blocker(complex,alpha,link_blocker_alpha);
+ build_link_of_blocker(complex, alpha, link_blocker_alpha);
- // Print result
- PRINT(complex.to_string());
- cerr <<endl<<endl;
- PRINT(link_blocker_alpha.to_string());
+ //the result should be the edge {6,7} plus the blocker {0,1,2}
- // verification
- return link_blocker_alpha.num_vertices()==1;
-}
-
-
-bool test_link7(){
- Complex complex(0,new Print_complex_visitor<Vertex_handle>());
- // Build the complexes
- build_complete(6,complex);
- complex.add_vertex();
- complex.add_vertex();
- for(int i = 3; i<6; ++i){
- complex.add_edge(Vertex_handle(i),Vertex_handle(6));
- complex.add_edge(Vertex_handle(i),Vertex_handle(7));
- }
- complex.add_edge(Vertex_handle(6),Vertex_handle(7));
- complex.add_blocker(Simplex_handle(Vertex_handle(0),Vertex_handle(1),Vertex_handle(2)));
- complex.add_blocker(Simplex_handle(Vertex_handle(3),Vertex_handle(4),Vertex_handle(5)));
-
- Simplex_handle alpha(Vertex_handle(3),Vertex_handle(4),Vertex_handle(5));
-
- Skeleton_blocker_link_complex<Complex> link_blocker_alpha;
-
- build_link_of_blocker(complex,alpha,link_blocker_alpha);
+ // Print result
+ PRINT(complex.to_string());
+ cerr << endl << endl;
+ DBGVALUE(link_blocker_alpha.to_string());
- //the result should be the edge {6,7} plus the blocker {0,1,2}
+ Skeleton_blocker_link_complex<Complex> link_blocker_alpha_cpy = link_blocker_alpha;
- // Print result
- PRINT(complex.to_string());
- cerr <<endl<<endl;
- DBGVALUE(link_blocker_alpha.to_string());
+ DBGVALUE(link_blocker_alpha_cpy.to_string());
- Skeleton_blocker_link_complex<Complex> link_blocker_alpha_cpy = link_blocker_alpha;
+ bool equal_complexes =
+ (link_blocker_alpha.num_vertices() == link_blocker_alpha_cpy.num_vertices())
+ &&(link_blocker_alpha.num_blockers() == link_blocker_alpha_cpy.num_blockers())
+ &&(link_blocker_alpha.num_edges() == link_blocker_alpha_cpy.num_edges())
+ ;
+ DBGVALUE((link_blocker_alpha.num_blockers() == link_blocker_alpha_cpy.num_blockers()));
+ DBGVALUE((link_blocker_alpha.num_blockers()));
+ DBGVALUE((link_blocker_alpha_cpy.num_blockers()));
- DBGVALUE(link_blocker_alpha_cpy.to_string());
+ DBGVALUE(equal_complexes);
- bool equal_complexes =
- (link_blocker_alpha.num_vertices() == link_blocker_alpha_cpy.num_vertices())
- &&(link_blocker_alpha.num_blockers() == link_blocker_alpha_cpy.num_blockers())
- &&(link_blocker_alpha.num_edges() == link_blocker_alpha_cpy.num_edges())
- ;
- DBGVALUE((link_blocker_alpha.num_blockers() == link_blocker_alpha_cpy.num_blockers()));
- DBGVALUE((link_blocker_alpha.num_blockers() ));
- DBGVALUE(( link_blocker_alpha_cpy.num_blockers()));
-
- DBGVALUE(equal_complexes);
-
- // verification
- return link_blocker_alpha.num_vertices()==5 && link_blocker_alpha.num_edges()==4 && link_blocker_alpha.num_blockers()==1 && equal_complexes;
+ // verification
+ return link_blocker_alpha.num_vertices() == 5 && link_blocker_alpha.num_edges() == 4 && link_blocker_alpha.num_blockers() == 1 && equal_complexes;
}
-
-
-
-
-
-
-
template<typename SimplexHandle>
-void add_triangle_edges(int a,int b,int c,list<SimplexHandle>& simplices){
- typedef SimplexHandle Simplex_handle;
- typedef typename SimplexHandle::Vertex_handle Vertex_handle;
+void add_triangle_edges(int a, int b, int c, list<SimplexHandle>& simplices) {
+ typedef SimplexHandle Simplex;
+ typedef typename SimplexHandle::Vertex_handle Vertex_handle;
- simplices.push_back(Simplex_handle(Vertex_handle(a),Vertex_handle(b) ));
- simplices.push_back(Simplex_handle(Vertex_handle(b),Vertex_handle(c) ));
- simplices.push_back(Simplex_handle(Vertex_handle(c),Vertex_handle(a) ));
+ simplices.push_back(Simplex(Vertex_handle(a), Vertex_handle(b)));
+ simplices.push_back(Simplex(Vertex_handle(b), Vertex_handle(c)));
+ simplices.push_back(Simplex(Vertex_handle(c), Vertex_handle(a)));
}
template<typename SimplexHandle>
-void add_triangle(int a,int b,int c,list<SimplexHandle>& simplices){
- typedef SimplexHandle Simplex_handle;
- typedef typename SimplexHandle::Vertex_handle Vertex_handle;
- simplices.push_back(Simplex_handle(Vertex_handle(a),Vertex_handle(b),Vertex_handle(c)));
-}
-
-bool test_constructor(){
- list <Simplex_handle> simplices;
-
- simplices.push_back(Simplex_handle(Vertex_handle(0)));
- simplices.push_back(Simplex_handle(Vertex_handle(1)));
- simplices.push_back(Simplex_handle(Vertex_handle(2)));
- simplices.push_back(Simplex_handle(Vertex_handle(3)));
- simplices.push_back(Simplex_handle(Vertex_handle(4)));
- simplices.push_back(Simplex_handle(Vertex_handle(5)));
-
- simplices.push_back(Simplex_handle(Vertex_handle(3),Vertex_handle(5) ));
-
- add_triangle_edges(0,1,5,simplices);
- add_triangle_edges(1,2,3,simplices);
- add_triangle_edges(2,3,4,simplices);
- add_triangle_edges(1,3,4,simplices);
- add_triangle_edges(1,2,4,simplices);
-
-
- add_triangle(0,1,5,simplices);
- add_triangle(1,2,3,simplices);
- add_triangle(1,3,4,simplices);
- add_triangle(1,2,4,simplices);
- add_triangle(2,3,4,simplices);
-
- Complex complex(simplices.begin(),simplices.end());
-
- PRINT(complex.to_string());
-
- return ( complex.num_vertices()==6&&complex.num_edges()==10&& complex.num_blockers()==2);
-}
-
-
-list<Simplex_handle> subfaces(Simplex_handle top_face){
- list<Simplex_handle> res;
- if(top_face.dimension()==-1) return res;
- if(top_face.dimension()==0) {
- res.push_back(top_face);
- return res;
- }
- else{
- Vertex_handle first_vertex = top_face.first_vertex();
- top_face.remove_vertex(first_vertex);
- res = subfaces(top_face);
- list<Simplex_handle> copy = res;
- for(auto& simplex : copy){
- simplex.add_vertex(first_vertex);
- }
- res.push_back(Simplex_handle(first_vertex));
- res.splice(res.end(),copy);
- return res;
- }
-}
-
-
-bool test_constructor2(){
- Simplex_handle simplex;
- for(int i =0 ; i < 5;++i)
- simplex.add_vertex(static_cast<Vertex_handle>(i));
-
- list <Simplex_handle> simplices(subfaces(simplex));
- simplices.remove(simplex);
-
- Complex complex(simplices.begin(),simplices.end());
-
- PRINT(complex.to_string());
-
- for(auto b : complex.const_blocker_range()){
- cout << "b:"<<b<<endl;
- }
-
- return ( complex.num_vertices()==5&&complex.num_edges()==10&& complex.num_blockers()==1);
+void add_triangle(int a, int b, int c, list<SimplexHandle>& simplices) {
+ typedef SimplexHandle Simplex;
+ typedef typename SimplexHandle::Vertex_handle Vertex_handle;
+ simplices.push_back(Simplex(Vertex_handle(a), Vertex_handle(b), Vertex_handle(c)));
}
+bool test_constructor() {
+ list <Simplex> simplices;
-bool test_constructor3(){
- typedef Vertex_handle Vh;
- typedef Simplex_handle Sh;
- std::vector<Simplex_handle> simplices;
- auto subf(subfaces(Sh(Vh(0),Vh(1),Vh(2))));
- subf.pop_back(); //remove max face -> now a blocker 012
- simplices.insert(simplices.begin(),subf.begin(),subf.end());
- DBGCONT(simplices);
- Complex complex(simplices.begin(),simplices.end());
-
- DBGVALUE(complex.to_string());
+ 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(3)));
+ simplices.push_back(Simplex(Vertex_handle(4)));
+ simplices.push_back(Simplex(Vertex_handle(5)));
- if(complex.num_blockers()!=1) return false;
- Sh expected_blocker(Vh(0),Vh(1),Vh(2));
- for(auto b : complex.const_blocker_range())
- if(*b!=expected_blocker) return false;
+ simplices.push_back(Simplex(Vertex_handle(3), Vertex_handle(5)));
+ add_triangle_edges(0, 1, 5, simplices);
+ add_triangle_edges(1, 2, 3, simplices);
+ add_triangle_edges(2, 3, 4, simplices);
+ add_triangle_edges(1, 3, 4, simplices);
+ add_triangle_edges(1, 2, 4, simplices);
- return complex.num_vertices()==3 && complex.num_blockers()==1;
-}
-
-bool test_constructor4(){
- typedef Vertex_handle Vh;
- typedef Simplex_handle Sh;
- std::vector<Simplex_handle> simplices;
- auto subf(subfaces(Sh(Vh(0),Vh(1),Vh(2),Vh(3))));
- simplices.insert(simplices.begin(),subf.begin(),subf.end());
- simplices.push_back(Sh(Vh(4)));
- simplices.push_back(Sh(Vh(4),Vh(1)));
- simplices.push_back(Sh(Vh(4),Vh(0)));
+ add_triangle(0, 1, 5, simplices);
+ add_triangle(1, 2, 3, simplices);
+ add_triangle(1, 3, 4, simplices);
+ add_triangle(1, 2, 4, simplices);
+ add_triangle(2, 3, 4, simplices);
- DBGCONT(simplices);
- Complex complex(simplices.begin(),simplices.end());
+ Complex complex(simplices.begin(), simplices.end());
- DBGVALUE(complex.to_string());
- if(complex.num_blockers()!=1) return false;
- Sh expected_blocker(Vh(0),Vh(1),Vh(4));
- for(auto b : complex.const_blocker_range())
- if(*b!=expected_blocker) return false;
+ PRINT(complex.to_string());
- return complex.num_vertices()==5 && complex.num_blockers()==1 && complex.num_edges()==8;
+ return ( complex.num_vertices() == 6 && complex.num_edges() == 10 && complex.num_blockers() == 2);
}
-
-
-bool test_constructor5(){
- typedef Vertex_handle Vh;
- typedef Simplex_handle Sh;
- std::vector<Simplex_handle> simplices;
- auto subf(subfaces(Sh(Vh(0),Vh(1),Vh(2))));
- simplices.insert(simplices.begin(),subf.begin(),subf.end());
-
- simplices.push_back(Sh(Vh(3)));
- simplices.push_back(Sh(Vh(3),Vh(1)));
- simplices.push_back(Sh(Vh(3),Vh(2)));
- simplices.push_back(Sh(Vh(4)));
- simplices.push_back(Sh(Vh(4),Vh(1)));
- simplices.push_back(Sh(Vh(4),Vh(0)));
- simplices.push_back(Sh(Vh(5)));
- simplices.push_back(Sh(Vh(5),Vh(2)));
- simplices.push_back(Sh(Vh(5),Vh(0)));
-
- DBGCONT(simplices);
- Complex complex(simplices.begin(),simplices.end());
-
- DBGVALUE(complex.to_string());
-
- return complex.num_vertices()==6 && complex.num_blockers()==3 && complex.num_edges()==9;
+list<Simplex> subfaces(Simplex top_face) {
+ list<Simplex> res;
+ if (top_face.dimension() == -1) return res;
+ if (top_face.dimension() == 0) {
+ res.push_back(top_face);
+ return res;
+ } else {
+ Vertex_handle first_vertex = top_face.first_vertex();
+ top_face.remove_vertex(first_vertex);
+ res = subfaces(top_face);
+ list<Simplex> copy = res;
+ for (auto& simplex : copy) {
+ simplex.add_vertex(first_vertex);
+ }
+ res.push_back(Simplex(first_vertex));
+ res.splice(res.end(), copy);
+ return res;
+ }
}
+bool test_constructor2() {
+ Simplex simplex;
+ for (int i = 0; i < 5; ++i)
+ simplex.add_vertex(static_cast<Vertex_handle> (i));
-bool test_constructor6(){
- typedef Vertex_handle Vh;
- typedef Simplex_handle Sh;
- std::vector<Simplex_handle> simplices;
- auto subf(subfaces(Sh(Vh(0),Vh(1),Vh(2),Vh(3))));
- for(auto s:subf){
- Sh s1(Vh(0),Vh(1),Vh(2),Vh(3));
- Sh s2(Vh(1),Vh(2),Vh(3));
- if(s!=s1 && s!=s2) simplices.push_back(s);
- }
+ list <Simplex> simplices(subfaces(simplex));
+ simplices.remove(simplex);
- DBGCONT(simplices);
- Complex complex(simplices.begin(),simplices.end());
+ Complex complex(simplices.begin(), simplices.end());
- DBGVALUE(complex.to_string());
+ PRINT(complex.to_string());
- if(complex.num_blockers()!=1) return false;
- Sh expected_blocker(Vh(1),Vh(2),Vh(3));
- for(auto b : complex.const_blocker_range())
- if(*b!=expected_blocker) return false;
- return complex.num_vertices()==4 && complex.num_blockers()==1 && complex.num_edges()==6;
-}
+ for (auto b : complex.const_blocker_range()) {
+ cout << "b:" << b << endl;
+ }
-
-bool test_constructor7(){
- typedef Vertex_handle Vh;
- typedef Simplex_handle Sh;
- std::vector<Simplex_handle> simplices;
- simplices.push_back(Sh(Vh(0),Vh(1),Vh(2)));
- simplices.push_back(Sh(Vh(1),Vh(2),Vh(3)));
- simplices.push_back(Sh(Vh(3),Vh(0),Vh(2)));
- simplices.push_back(Sh(Vh(3),Vh(0),Vh(1)));
-
- //get complex from top faces
- Complex complex(make_complex_from_top_faces<Complex>(simplices.begin(),simplices.end()));
-
- DBGVALUE(complex.to_string());
-
- if(complex.num_blockers()!=1) return false;
- Sh expected_blocker(Vh(0),Vh(1),Vh(2),Vh(3));
- for(auto b : complex.const_blocker_range())
- if(*b!=expected_blocker) return false;
- return complex.num_vertices()==4 && complex.num_blockers()==1 && complex.num_edges()==6;
+ return ( complex.num_vertices() == 5 && complex.num_edges() == 10 && complex.num_blockers() == 1);
}
+bool test_constructor3() {
+ typedef Vertex_handle Vh;
+ typedef Simplex Sh;
+ std::vector<Simplex> simplices;
+ auto subf(subfaces(Sh(Vh(0), Vh(1), Vh(2))));
+ subf.pop_back(); //remove max face -> now a blocker 012
+ simplices.insert(simplices.begin(), subf.begin(), subf.end());
+ DBGCONT(simplices);
+ Complex complex(simplices.begin(), simplices.end());
-bool test_constructor8(){
- typedef Vertex_handle Vh;
- typedef Simplex_handle Sh;
- std::vector<Simplex_handle> simplices;
- simplices.push_back(Sh(Vh(0),Vh(1)));
- simplices.push_back(Sh(Vh(2),Vh(1)));
- simplices.push_back(Sh(Vh(0),Vh(2)));
- simplices.push_back(Sh(Vh(3),Vh(1)));
- simplices.push_back(Sh(Vh(2),Vh(3)));
+ DBGVALUE(complex.to_string());
- //get complex from top faces
- Complex complex(make_complex_from_top_faces<Complex>(simplices.begin(),simplices.end()));
+ if (complex.num_blockers() != 1) return false;
+ Sh expected_blocker(Vh(0), Vh(1), Vh(2));
+ for (auto b : complex.const_blocker_range())
+ if (*b != expected_blocker) return false;
- DBGVALUE(complex.to_string());
- return complex.num_vertices()==4 && complex.num_blockers()==2 && complex.num_edges()==5;
+ return complex.num_vertices() == 3 && complex.num_blockers() == 1;
}
+bool test_constructor4() {
+ typedef Vertex_handle Vh;
+ typedef Simplex Sh;
+ std::vector<Simplex> simplices;
+ auto subf(subfaces(Sh(Vh(0), Vh(1), Vh(2), Vh(3))));
+ simplices.insert(simplices.begin(), subf.begin(), subf.end());
+ simplices.push_back(Sh(Vh(4)));
+ simplices.push_back(Sh(Vh(4), Vh(1)));
+ simplices.push_back(Sh(Vh(4), Vh(0)));
+ DBGCONT(simplices);
+ Complex complex(simplices.begin(), simplices.end());
+ DBGVALUE(complex.to_string());
+ if (complex.num_blockers() != 1) return false;
+ Sh expected_blocker(Vh(0), Vh(1), Vh(4));
+ for (auto b : complex.const_blocker_range())
+ if (*b != expected_blocker) return false;
-int main (int argc, char *argv[])
-{
- Tests tests_complex;
- tests_complex.add("test simplex",test_simplex);
- tests_complex.add("test_link0",test_link0);
- tests_complex.add("test_link1",test_link1);
- tests_complex.add("test_link2",test_link2);
- tests_complex.add("test_link3",test_link3);
- tests_complex.add("test_link4",test_link4);
- tests_complex.add("test_link5",test_link5);
- tests_complex.add("test_link6",test_link6);
- tests_complex.add("test_link7",test_link7);
-
- tests_complex.add("test iterator vertices 1",test_iterator_vertices1);
- tests_complex.add("test iterator vertices 2",test_iterator_vertices2);
- tests_complex.add("test iterator edges",test_iterator_edge);
- tests_complex.add("test iterator edges 2",test_iterator_edge2);
- tests_complex.add("test iterator edges 3",test_iterator_edge3);
-
- tests_complex.add("test iterator simplices",test_iterator_simplices);
- tests_complex.add("test iterator simplices2",test_iterator_simplices2);
- tests_complex.add("test iterator simplices3",test_iterator_simplices3);
- tests_complex.add("test iterator simplices4",test_iterator_simplices4);
-
-
- tests_complex.add("test iterator blockers",test_iterator_blockers);
- tests_complex.add("test_iterator_triangles",test_iterator_triangles);
-
- tests_complex.add("test_constructor_list_simplices",test_constructor);
- tests_complex.add("test_constructor_list_simplices2",test_constructor2);
- tests_complex.add("test_constructor_list_simplices3",test_constructor3);
- tests_complex.add("test_constructor_list_simplices4",test_constructor4);
- tests_complex.add("test_constructor_list_simplices5",test_constructor5);
- tests_complex.add("test_constructor_list_simplices6",test_constructor6);
- tests_complex.add("test_constructor_list_simplices7",test_constructor7);
- tests_complex.add("test_constructor_list_simplices8",test_constructor8);
-
-
- if(tests_complex.run()){
- return EXIT_SUCCESS;
- }
- else{
- return EXIT_FAILURE;
- }
+ return complex.num_vertices() == 5 && complex.num_blockers() == 1 && complex.num_edges() == 8;
+}
- // test_iterator_simplices();
+bool test_constructor5() {
+ typedef Vertex_handle Vh;
+ typedef Simplex Sh;
+ std::vector<Simplex> simplices;
+ auto subf(subfaces(Sh(Vh(0), Vh(1), Vh(2))));
+ simplices.insert(simplices.begin(), subf.begin(), subf.end());
+
+ simplices.push_back(Sh(Vh(3)));
+ simplices.push_back(Sh(Vh(3), Vh(1)));
+ simplices.push_back(Sh(Vh(3), Vh(2)));
+ simplices.push_back(Sh(Vh(4)));
+ simplices.push_back(Sh(Vh(4), Vh(1)));
+ simplices.push_back(Sh(Vh(4), Vh(0)));
+ simplices.push_back(Sh(Vh(5)));
+ simplices.push_back(Sh(Vh(5), Vh(2)));
+ simplices.push_back(Sh(Vh(5), Vh(0)));
+
+ DBGCONT(simplices);
+ Complex complex(simplices.begin(), simplices.end());
+
+ DBGVALUE(complex.to_string());
+
+ return complex.num_vertices() == 6 && complex.num_blockers() == 3 && complex.num_edges() == 9;
+}
+
+bool test_constructor6() {
+ typedef Vertex_handle Vh;
+ typedef Simplex Sh;
+ std::vector<Simplex> simplices;
+ auto subf(subfaces(Sh(Vh(0), Vh(1), Vh(2), Vh(3))));
+ for (auto s : subf) {
+ Sh s1(Vh(0), Vh(1), Vh(2), Vh(3));
+ Sh s2(Vh(1), Vh(2), Vh(3));
+ if (s != s1 && s != s2) simplices.push_back(s);
+ }
+
+ DBGCONT(simplices);
+ Complex complex(simplices.begin(), simplices.end());
+
+ DBGVALUE(complex.to_string());
+
+ if (complex.num_blockers() != 1) return false;
+ Sh expected_blocker(Vh(1), Vh(2), Vh(3));
+ for (auto b : complex.const_blocker_range())
+ if (*b != expected_blocker) return false;
+ return complex.num_vertices() == 4 && complex.num_blockers() == 1 && complex.num_edges() == 6;
+}
+
+bool test_constructor7() {
+ typedef Vertex_handle Vh;
+ typedef Simplex Sh;
+ std::vector<Simplex> simplices;
+ simplices.push_back(Sh(Vh(0), Vh(1), Vh(2)));
+ simplices.push_back(Sh(Vh(1), Vh(2), Vh(3)));
+ simplices.push_back(Sh(Vh(3), Vh(0), Vh(2)));
+ simplices.push_back(Sh(Vh(3), Vh(0), Vh(1)));
+
+ //get complex from top faces
+ Complex complex(make_complex_from_top_faces<Complex>(simplices.begin(), simplices.end()));
+
+ DBGVALUE(complex.to_string());
+
+ if (complex.num_blockers() != 1) return false;
+ Sh expected_blocker(Vh(0), Vh(1), Vh(2), Vh(3));
+ for (auto b : complex.const_blocker_range())
+ if (*b != expected_blocker) return false;
+ return complex.num_vertices() == 4 && complex.num_blockers() == 1 && complex.num_edges() == 6;
+}
+
+bool test_constructor8() {
+ typedef Vertex_handle Vh;
+ typedef Simplex Sh;
+ std::vector<Simplex> simplices;
+ simplices.push_back(Sh(Vh(0), Vh(1)));
+ simplices.push_back(Sh(Vh(2), Vh(1)));
+ simplices.push_back(Sh(Vh(0), Vh(2)));
+ simplices.push_back(Sh(Vh(3), Vh(1)));
+ simplices.push_back(Sh(Vh(2), Vh(3)));
+
+ //get complex from top faces
+ Complex complex(make_complex_from_top_faces<Complex>(simplices.begin(), simplices.end()));
+
+ DBGVALUE(complex.to_string());
+
+ return complex.num_vertices() == 4 && complex.num_blockers() == 2 && complex.num_edges() == 5;
+}
+
+int main(int argc, char *argv[]) {
+ Tests tests_complex;
+ tests_complex.add("test simplex", test_simplex);
+ tests_complex.add("test_num_simplices", test_num_simplices);
+ tests_complex.add("test_link0", test_link0);
+ tests_complex.add("test_link1", test_link1);
+ tests_complex.add("test_link2", test_link2);
+ tests_complex.add("test_link3", test_link3);
+ tests_complex.add("test_link4", test_link4);
+ tests_complex.add("test_link5", test_link5);
+ tests_complex.add("test_link6", test_link6);
+ tests_complex.add("test_link7", test_link7);
+
+ tests_complex.add("test_constructor_list_simplices", test_constructor);
+ tests_complex.add("test_constructor_list_simplices2", test_constructor2);
+ tests_complex.add("test_constructor_list_simplices3", test_constructor3);
+ tests_complex.add("test_constructor_list_simplices4", test_constructor4);
+ tests_complex.add("test_constructor_list_simplices5", test_constructor5);
+ tests_complex.add("test_constructor_list_simplices6", test_constructor6);
+ tests_complex.add("test_constructor_list_simplices7", test_constructor7);
+ tests_complex.add("test_constructor_list_simplices8", test_constructor8);
+
+ tests_complex.add("test iterator vertices 1", test_iterator_vertices1);
+ tests_complex.add("test iterator vertices 2", test_iterator_vertices2);
+ tests_complex.add("test iterator edges", test_iterator_edge);
+ tests_complex.add("test iterator edges 2", test_iterator_edge2);
+ tests_complex.add("test iterator edges 3", test_iterator_edge3);
+ tests_complex.add("test iterator blockers", test_iterator_blockers);
+ tests_complex.add("test_iterator_triangles", test_iterator_triangles);
+ tests_complex.add("test iterator simplices", test_iterator_simplices);
+ tests_complex.add("test iterator simplices2", test_iterator_simplices2);
+ tests_complex.add("test iterator simplices3", test_iterator_simplices3);
+ tests_complex.add("test iterator simplices4", test_iterator_simplices4);
+ tests_complex.add("test iterator coboundary", test_iterator_coboundary);
+
+ if (tests_complex.run()) {
+ return EXIT_SUCCESS;
+ } else {
+ return EXIT_FAILURE;
+ }
+
+ // test_iterator_simplices();
}
diff --git a/src/Witness_complex/concept/Simplicial_complex_for_witness.h b/src/Witness_complex/concept/Simplicial_complex_for_witness.h
new file mode 100644
index 00000000..caaf0db6
--- /dev/null
+++ b/src/Witness_complex/concept/Simplicial_complex_for_witness.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): Siargey Kachanovich
+ *
+ * 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/>.
+ */
+
+#ifndef CONCEPT_WITNESS_COMPLEX_SIMPLICIAL_COMPLEX_FOR_WITNESS_H_
+#define CONCEPT_WITNESS_COMPLEX_SIMPLICIAL_COMPLEX_FOR_WITNESS_H_
+
+namespace Gudhi {
+
+namespace witness_complex {
+
+/** \brief The concept Simplicial_Complex describes the requirements
+ * for a type to implement a simplicial complex,
+ * used for example to build a '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;
+
+ /** 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.
+ */
+ 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);
+
+ /** \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.
+ * */
+ template< typedef Input_vertex_range >
+ Insertion_result_type insert_simplex(Input_vertex_range const & vertex_range);
+
+ /** \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);
+};
+
+} // namespace witness_complex
+
+} // namespace Gudhi
+
+#endif // CONCEPT_WITNESS_COMPLEX_SIMPLICIAL_COMPLEX_FOR_WITNESS_H_
diff --git a/src/Witness_complex/doc/Witness_complex_doc.h b/src/Witness_complex/doc/Witness_complex_doc.h
new file mode 100644
index 00000000..60dfd27b
--- /dev/null
+++ b/src/Witness_complex/doc/Witness_complex_doc.h
@@ -0,0 +1,42 @@
+#ifndef WITNESS_COMPLEX_DOC_H_
+#define WITNESS_COMPLEX_DOC_H_
+
+/**
+ \defgroup witness_complex Witness complex
+
+ \author Siargey Kachanovich
+
+ \image html "Witness_complex_representation.png" "Witness complex representation"
+
+ \section Definitions
+
+ Witness complex \f$ Wit(W,L) \f$ 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**.
+
+ The simplices are based on landmarks
+ and a simplex belongs to the witness complex if and only if it is witnessed, that is:
+
+ \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 .
+
+ \section Implementation
+
+ The principal class of this module is Gudhi::Witness_complex.
+
+ 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.
+
+ *\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
+
+
+ \copyright GNU General Public License v3.
+
+
+ */
+
+#endif // WITNESS_COMPLEX_DOC_H_
diff --git a/src/Witness_complex/doc/Witness_complex_representation.png b/src/Witness_complex/doc/Witness_complex_representation.png
new file mode 100644
index 00000000..1d31a490
--- /dev/null
+++ b/src/Witness_complex/doc/Witness_complex_representation.png
Binary files differ
diff --git a/src/Witness_complex/doc/bench_Cy8.png b/src/Witness_complex/doc/bench_Cy8.png
new file mode 100644
index 00000000..d9045294
--- /dev/null
+++ b/src/Witness_complex/doc/bench_Cy8.png
Binary files differ
diff --git a/src/Witness_complex/doc/bench_sphere.png b/src/Witness_complex/doc/bench_sphere.png
new file mode 100644
index 00000000..ba6bb381
--- /dev/null
+++ b/src/Witness_complex/doc/bench_sphere.png
Binary files differ
diff --git a/src/Witness_complex/example/CMakeLists.txt b/src/Witness_complex/example/CMakeLists.txt
new file mode 100644
index 00000000..4d67e0d0
--- /dev/null
+++ b/src/Witness_complex/example/CMakeLists.txt
@@ -0,0 +1,16 @@
+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)
+endif()
diff --git a/src/Witness_complex/example/generators.h b/src/Witness_complex/example/generators.h
new file mode 100644
index 00000000..ac445261
--- /dev/null
+++ b/src/Witness_complex/example/generators.h
@@ -0,0 +1,147 @@
+/* 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 EXAMPLE_WITNESS_COMPLEX_GENERATORS_H_
+#define EXAMPLE_WITNESS_COMPLEX_GENERATORS_H_
+
+#include <CGAL/Epick_d.h>
+#include <CGAL/point_generators_d.h>
+
+#include <fstream>
+#include <string>
+#include <vector>
+
+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;
+
+/**
+ * \brief Rock age method of reading off file
+ *
+ */
+inline void
+off_reader_cust(std::string file_name, std::vector<Point_d> & 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;
+ // Line OFF. No need in it
+ if (!getline(in_file, line)) {
+ std::cerr << "No line OFF\n";
+ return;
+ }
+ // Line with 3 numbers. No need
+ if (!getline(in_file, line)) {
+ std::cerr << "No line with 3 numbers\n";
+ return;
+ }
+ // Reading points
+ while (getline(in_file, line)) {
+ std::vector< double > point;
+ std::istringstream iss(line);
+ while (iss >> x) {
+ point.push_back(x);
+ }
+ points.push_back(Point_d(point));
+ }
+ in_file.close();
+}
+
+/**
+ * \brief Customized version of read_points
+ * which takes into account a possible nbP first line
+ *
+ */
+inline void
+read_points_cust(std::string file_name, Point_Vector & 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);
+ }
+ Point_d p(point.begin(), point.end());
+ if (point.size() != 1)
+ points.push_back(p);
+ }
+ in_file.close();
+}
+
+/** \brief Generate points on a grid in a cube of side 2
+ * having {+-1}^D as vertices and insert them in W.
+ * The grid has "width" points on each side.
+ * If torus is true then it is supposed that the cube represents
+ * a flat torus, hence the opposite borders are associated.
+ * The points on border in this case are not placed twice.
+ */
+void generate_points_grid(Point_Vector& W, int width, int D, bool torus) {
+ int nb_points = 1;
+ for (int i = 0; i < D; ++i)
+ nb_points *= width;
+ for (int i = 0; i < nb_points; ++i) {
+ std::vector<double> point;
+ int cell_i = i;
+ for (int l = 0; l < D; ++l) {
+ if (torus)
+ point.push_back(-1 + (2.0 / (width - 1))*(cell_i % width));
+ else
+ point.push_back(-1 + (2.0 / width)*(cell_i % width));
+ // attention: the bottom and the right are covered too!
+ cell_i /= width;
+ }
+ W.push_back(point);
+ }
+}
+
+/** \brief Generate nbP points uniformly in a cube of side 2
+ * having {+-1}^dim as its vertices and insert them in W.
+ */
+void generate_points_random_box(Point_Vector& W, int nbP, int dim) {
+ Random_cube_iterator rp(dim, 1.0);
+ for (int i = 0; i < nbP; i++) {
+ W.push_back(*rp++);
+ }
+}
+
+/** \brief Generate nbP points uniformly on a (dim-1)-sphere
+ * and insert them in W.
+ */
+void generate_points_sphere(Point_Vector& W, int nbP, int dim) {
+ CGAL::Random_points_on_sphere_d<Point_d> rp(dim, 1);
+ for (int i = 0; i < nbP; i++)
+ W.push_back(*rp++);
+}
+
+#endif // EXAMPLE_WITNESS_COMPLEX_GENERATORS_H_
diff --git a/src/Witness_complex/example/witness_complex_from_file.cpp b/src/Witness_complex/example/witness_complex_from_file.cpp
new file mode 100644
index 00000000..53207ad2
--- /dev/null
+++ b/src/Witness_complex/example/witness_complex_from_file.cpp
@@ -0,0 +1,100 @@
+/* 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/src/Witness_complex/example/witness_complex_sphere.cpp b/src/Witness_complex/example/witness_complex_sphere.cpp
new file mode 100644
index 00000000..b26c9f36
--- /dev/null
+++ b/src/Witness_complex/example/witness_complex_sphere.cpp
@@ -0,0 +1,90 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): 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/>.
+ */
+#define BOOST_PARAMETER_MAX_ARITY 12
+
+
+#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 <utility>
+#include <string>
+#include <vector>
+
+#include "generators.h"
+
+/** Write a gnuplot readable file.
+ * Data range is a random access range of pairs (arg, value)
+ */
+template < typename Data_range >
+void write_data(Data_range & data, std::string filename) {
+ std::ofstream ofs(filename, std::ofstream::out);
+ for (auto entry : data)
+ ofs << entry.first << ", " << entry.second << "\n";
+ ofs.close();
+}
+
+int main(int argc, char * const argv[]) {
+ if (argc != 2) {
+ std::cerr << "Usage: " << argv[0]
+ << " number_of_landmarks \n";
+ return 0;
+ }
+
+ 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
+ for (int nbP = 500; nbP < 10000; nbP += 500) {
+ Point_Vector point_vector;
+ 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);
+
+ // Compute witness complex
+ Gudhi::witness_complex::witness_complex(knn, number_of_landmarks, point_vector[0].size(), simplex_tree);
+ end = clock();
+ double time = static_cast<double>(end - start) / CLOCKS_PER_SEC;
+ std::cout << "Witness complex for " << number_of_landmarks << " landmarks took "
+ << time << " s. \n";
+ std::cout << "Number of simplices is: " << simplex_tree.num_simplices() << "\n";
+ l_time.push_back(std::make_pair(nbP, time));
+ }
+ write_data(l_time, "w_time.dat");
+}
diff --git a/src/Witness_complex/include/gudhi/Landmark_choice_by_furthest_point.h b/src/Witness_complex/include/gudhi/Landmark_choice_by_furthest_point.h
new file mode 100644
index 00000000..df93155b
--- /dev/null
+++ b/src/Witness_complex/include/gudhi/Landmark_choice_by_furthest_point.h
@@ -0,0 +1,105 @@
+/* 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/src/Witness_complex/include/gudhi/Landmark_choice_by_random_point.h b/src/Witness_complex/include/gudhi/Landmark_choice_by_random_point.h
new file mode 100644
index 00000000..ebf6aad1
--- /dev/null
+++ b/src/Witness_complex/include/gudhi/Landmark_choice_by_random_point.h
@@ -0,0 +1,96 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): 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/src/Witness_complex/include/gudhi/Witness_complex.h b/src/Witness_complex/include/gudhi/Witness_complex.h
new file mode 100644
index 00000000..489cdf11
--- /dev/null
+++ b/src/Witness_complex/include/gudhi/Witness_complex.h
@@ -0,0 +1,265 @@
+/* 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 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 <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>
+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
+
+ public:
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ /* @name Constructor
+ */
+
+ //@{
+
+ // Witness_range<Closest_landmark_range<Vertex_handle>>
+
+ /*
+ * \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]
+ */
+ 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
+ }
+ 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
+ }
+ }
+ k++;
+ }
+ }
+
+ //@}
+
+ 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
+ */
+ 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]);
+ }
+ } // 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;
+ }
+ }
+ 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;
+ }
+ assert(is_witnessed);
+ return false;
+ }
+ }
+ return true;
+ }
+};
+
+ /**
+ * \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
+
+#endif // WITNESS_COMPLEX_H_
diff --git a/src/Witness_complex/test/CMakeLists.txt b/src/Witness_complex/test/CMakeLists.txt
new file mode 100644
index 00000000..bb55b0f1
--- /dev/null
+++ b/src/Witness_complex/test/CMakeLists.txt
@@ -0,0 +1,30 @@
+cmake_minimum_required(VERSION 2.6)
+project(Witness_complex_tests)
+
+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()
+
+add_executable ( simple_witness_complexUT simple_witness_complex.cpp )
+target_link_libraries(simple_witness_complexUT ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
+
+# Unitary tests definition and xml result file generation
+add_test(NAME simple_witness_complexUT
+ COMMAND ${CMAKE_CURRENT_BINARY_DIR}/simple_witness_complexUT
+ # XML format for Jenkins xUnit plugin
+ --log_format=XML --log_sink=${CMAKE_SOURCE_DIR}/simple_witness_complexUT.xml --log_level=test_suite --report_level=no)
+
+add_executable ( witness_complex_pointsUT witness_complex_points.cpp )
+target_link_libraries(witness_complex_pointsUT ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
+
+# Unitary tests definition and xml result file generation
+add_test(NAME witness_complex_pointsUT
+ COMMAND ${CMAKE_CURRENT_BINARY_DIR}/witness_complex_pointsUT
+ # XML format for Jenkins xUnit plugin
+ --log_format=XML --log_sink=${CMAKE_SOURCE_DIR}/witness_complex_pointsUT.xml --log_level=test_suite --report_level=no)
+
diff --git a/src/Witness_complex/test/simple_witness_complex.cpp b/src/Witness_complex/test/simple_witness_complex.cpp
new file mode 100644
index 00000000..03df78ee
--- /dev/null
+++ b/src/Witness_complex/test/simple_witness_complex.cpp
@@ -0,0 +1,59 @@
+/* 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 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/>.
+ */
+
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_MODULE "simple_witness_complex"
+#include <boost/test/unit_test.hpp>
+#include <boost/mpl/list.hpp>
+
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/Witness_complex.h>
+
+#include <iostream>
+#include <ctime>
+#include <vector>
+
+typedef Gudhi::Simplex_tree<> Simplex_tree;
+typedef std::vector< Vertex_handle > typeVectorVertex;
+typedef Gudhi::witness_complex::Witness_complex<Simplex_tree> WitnessComplex;
+
+BOOST_AUTO_TEST_CASE(simple_witness_complex) {
+ Simplex_tree complex;
+ std::vector< typeVectorVertex > knn;
+
+ knn.push_back({1, 0, 5, 2, 6, 3, 4});
+ knn.push_back({2, 6, 4, 5, 0, 1, 3});
+ knn.push_back({3, 4, 2, 1, 5, 6, 0});
+ knn.push_back({4, 2, 1, 3, 5, 6, 0});
+ knn.push_back({5, 1, 6, 0, 2, 3, 4});
+ knn.push_back({6, 0, 5, 2, 1, 3, 4});
+ knn.push_back({0, 5, 6, 1, 2, 3, 4});
+ knn.push_back({2, 6, 4, 5, 3, 1, 0});
+ knn.push_back({1, 2, 5, 4, 3, 6, 0});
+ knn.push_back({3, 4, 0, 6, 5, 1, 2});
+ knn.push_back({5, 0, 1, 3, 6, 2, 4});
+ knn.push_back({5, 6, 1, 0, 2, 3, 4});
+ knn.push_back({1, 6, 0, 5, 2, 3, 4});
+ WitnessComplex witnessComplex(knn, 7, 7, complex);
+
+ BOOST_CHECK(witnessComplex.is_witness_complex(knn, false));
+}
diff --git a/src/Witness_complex/test/witness_complex_points.cpp b/src/Witness_complex/test/witness_complex_points.cpp
new file mode 100644
index 00000000..bd3df604
--- /dev/null
+++ b/src/Witness_complex/test/witness_complex_points.cpp
@@ -0,0 +1,64 @@
+/* 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 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/>.
+ */
+
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_MODULE "witness_complex_points"
+#include <boost/test/unit_test.hpp>
+#include <boost/mpl/list.hpp>
+
+#include <gudhi/Simplex_tree.h>
+#include <gudhi/Witness_complex.h>
+#include <gudhi/Landmark_choice_by_random_point.h>
+#include <gudhi/Landmark_choice_by_furthest_point.h>
+
+#include <iostream>
+#include <vector>
+
+typedef std::vector<double> Point;
+typedef std::vector< Vertex_handle > typeVectorVertex;
+typedef Gudhi::Simplex_tree<> Simplex_tree;
+typedef Gudhi::witness_complex::Witness_complex<Simplex_tree> WitnessComplex;
+
+BOOST_AUTO_TEST_CASE(witness_complex_points) {
+ std::vector< typeVectorVertex > knn;
+ std::vector< Point > points;
+ // Add grid points as witnesses
+ for (double i = 0; i < 10; i += 1.0)
+ for (double j = 0; j < 10; j += 1.0)
+ for (double k = 0; k < 10; k += 1.0)
+ points.push_back(Point({i, j, k}));
+
+ bool b_print_output = false;
+ // First test: random choice
+ Simplex_tree complex1;
+ Gudhi::witness_complex::landmark_choice_by_random_point(points, 100, knn);
+ assert(!knn.empty());
+ WitnessComplex witnessComplex1(knn, 100, 3, complex1);
+ BOOST_CHECK(witnessComplex1.is_witness_complex(knn, b_print_output));
+
+ // Second test: furthest choice
+ knn.clear();
+ Simplex_tree complex2;
+ Gudhi::witness_complex::landmark_choice_by_furthest_point(points, 100, knn);
+ WitnessComplex witnessComplex2(knn, 100, 3, complex2);
+ BOOST_CHECK(witnessComplex2.is_witness_complex(knn, b_print_output));
+}
diff --git a/src/cmake/modules/FindEigen3.cmake b/src/cmake/modules/FindEigen3.cmake
new file mode 100644
index 00000000..70c07dfb
--- /dev/null
+++ b/src/cmake/modules/FindEigen3.cmake
@@ -0,0 +1,86 @@
+# - Try to find Eigen3 lib
+#
+# This module supports requiring a minimum version, e.g. you can do
+# find_package(Eigen3 3.1.2)
+# to require version 3.1.2 or newer of Eigen3.
+#
+# Once done this will define
+#
+# EIGEN3_FOUND - system has eigen lib with correct version
+# EIGEN3_INCLUDE_DIR - the eigen include directory
+# EIGEN3_VERSION - eigen version
+
+# Copyright (c) 2006, 2007 Montel Laurent, <montel@kde.org>
+# Copyright (c) 2008, 2009 Gael Guennebaud, <g.gael@free.fr>
+# Copyright (c) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>
+# Redistribution and use is allowed according to the terms of the 2-clause BSD license.
+
+include(FindPackageHandleStandardArgs)
+
+if(NOT Eigen3_FIND_VERSION)
+ if(NOT Eigen3_FIND_VERSION_MAJOR)
+ set(Eigen3_FIND_VERSION_MAJOR 2)
+ endif(NOT Eigen3_FIND_VERSION_MAJOR)
+ if(NOT Eigen3_FIND_VERSION_MINOR)
+ set(Eigen3_FIND_VERSION_MINOR 91)
+ endif(NOT Eigen3_FIND_VERSION_MINOR)
+ if(NOT Eigen3_FIND_VERSION_PATCH)
+ set(Eigen3_FIND_VERSION_PATCH 0)
+ endif(NOT Eigen3_FIND_VERSION_PATCH)
+
+ set(Eigen3_FIND_VERSION "${Eigen3_FIND_VERSION_MAJOR}.${Eigen3_FIND_VERSION_MINOR}.${Eigen3_FIND_VERSION_PATCH}")
+endif(NOT Eigen3_FIND_VERSION)
+
+macro(_eigen3_get_version)
+ file(READ "${EIGEN3_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header)
+
+ string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match "${_eigen3_version_header}")
+ set(EIGEN3_WORLD_VERSION "${CMAKE_MATCH_1}")
+ string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen3_major_version_match "${_eigen3_version_header}")
+ set(EIGEN3_MAJOR_VERSION "${CMAKE_MATCH_1}")
+ string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen3_minor_version_match "${_eigen3_version_header}")
+ set(EIGEN3_MINOR_VERSION "${CMAKE_MATCH_1}")
+
+ set(EIGEN3_VERSION ${EIGEN3_WORLD_VERSION}.${EIGEN3_MAJOR_VERSION}.${EIGEN3_MINOR_VERSION})
+endmacro(_eigen3_get_version)
+
+set(EIGEN3_USE_FILE "UseEigen3")
+
+if (EIGEN3_INCLUDE_DIR)
+
+ if (EXISTS ${EIGEN3_INCLUDE_DIR}/signature_of_eigen3_matrix_library)
+ # in cache already and valid
+ _eigen3_get_version()
+ set(EIGEN3_FOUND ${EIGEN3_VERSION_OK})
+
+ find_package_handle_standard_args(Eigen3
+ REQUIRED_VARS EIGEN3_INCLUDE_DIR
+ VERSION_VAR EIGEN3_VERSION)
+
+ else()
+ message(STATUS "Eigen3 path specified in cmake variable EIGEN3_INCLUDE_DIR is "
+ "set to ${EIGEN3_INCLUDE_DIR}, but that path does not contains the file "
+ "signature_of_eigen3_matrix_library and is considered as invalid.")
+ endif()
+
+
+
+else (EIGEN3_INCLUDE_DIR)
+
+ find_path(EIGEN3_INCLUDE_DIR NAMES signature_of_eigen3_matrix_library
+ HINTS ENV EIGEN3_INC_DIR
+ ENV EIGEN3_DIR
+ PATHS ${KDE4_INCLUDE_DIR}
+ PATH_SUFFIXES include eigen3 eigen
+ DOC "Directory containing the Eigen3 header files"
+ )
+
+ if(EIGEN3_INCLUDE_DIR)
+ _eigen3_get_version()
+ endif(EIGEN3_INCLUDE_DIR)
+
+ find_package_handle_standard_args(Eigen3
+ REQUIRED_VARS EIGEN3_INCLUDE_DIR
+ VERSION_VAR EIGEN3_VERSION)
+
+endif(EIGEN3_INCLUDE_DIR)
diff --git a/src/cmake/modules/FindQGLViewer.cmake b/src/cmake/modules/FindQGLViewer.cmake
new file mode 100644
index 00000000..65723d67
--- /dev/null
+++ b/src/cmake/modules/FindQGLViewer.cmake
@@ -0,0 +1,61 @@
+# - Try to find QGLViewer
+# Once done this will define
+#
+# QGLVIEWER_FOUND - system has QGLViewer
+# QGLVIEWER_INCLUDE_DIR - the QGLViewer include directory
+# QGLVIEWER_LIBRARIES - Link these to use QGLViewer
+# QGLVIEWER_DEFINITIONS - Compiler switches required for using QGLViewer
+#
+
+find_path(QGLVIEWER_INCLUDE_DIR
+ NAMES QGLViewer/qglviewer.h
+ PATHS /usr/include
+ /usr/local/include
+ ENV QGLVIEWERROOT
+ )
+
+find_library(QGLVIEWER_LIBRARY_RELEASE
+ NAMES qglviewer-qt4 qglviewer QGLViewer QGLViewer2
+ PATHS /usr/lib
+ /usr/local/lib
+ ENV QGLVIEWERROOT
+ ENV LD_LIBRARY_PATH
+ ENV LIBRARY_PATH
+ PATH_SUFFIXES QGLViewer QGLViewer/release
+ )
+
+find_library(QGLVIEWER_LIBRARY_DEBUG
+ NAMES dqglviewer dQGLViewer dQGLViewer2 QGLViewerd2
+ PATHS /usr/lib
+ /usr/local/lib
+ ENV QGLVIEWERROOT
+ ENV LD_LIBRARY_PATH
+ ENV LIBRARY_PATH
+ PATH_SUFFIXES QGLViewer QGLViewer/debug
+ )
+
+if(QGLVIEWER_LIBRARY_RELEASE)
+ if(QGLVIEWER_LIBRARY_DEBUG)
+ set(QGLVIEWER_LIBRARIES_ optimized ${QGLVIEWER_LIBRARY_RELEASE} debug ${QGLVIEWER_LIBRARY_DEBUG})
+ else()
+ set(QGLVIEWER_LIBRARIES_ ${QGLVIEWER_LIBRARY_RELEASE})
+ endif()
+
+ set(QGLVIEWER_LIBRARIES ${QGLVIEWER_LIBRARIES_} CACHE FILEPATH "The QGLViewer library")
+
+endif()
+
+IF(QGLVIEWER_INCLUDE_DIR AND QGLVIEWER_LIBRARIES)
+ SET(QGLVIEWER_FOUND TRUE)
+ENDIF(QGLVIEWER_INCLUDE_DIR AND QGLVIEWER_LIBRARIES)
+
+IF(QGLVIEWER_FOUND)
+ IF(NOT QGLViewer_FIND_QUIETLY)
+ MESSAGE(STATUS "Found QGLViewer: ${QGLVIEWER_LIBRARIES}")
+ ENDIF(NOT QGLViewer_FIND_QUIETLY)
+ELSE(QGLVIEWER_FOUND)
+ IF(QGLViewer_FIND_REQUIRED)
+ MESSAGE(FATAL_ERROR "Could not find QGLViewer")
+ ENDIF(QGLViewer_FIND_REQUIRED)
+ENDIF(QGLVIEWER_FOUND)
+
diff --git a/src/cmake/modules/FindTBB.cmake b/src/cmake/modules/FindTBB.cmake
new file mode 100644
index 00000000..13f4d929
--- /dev/null
+++ b/src/cmake/modules/FindTBB.cmake
@@ -0,0 +1,425 @@
+# Locate Intel Threading Building Blocks include paths and libraries
+# FindTBB.cmake can be found at https://code.google.com/p/findtbb/
+# Written by Hannes Hofmann <hannes.hofmann _at_ informatik.uni-erlangen.de>
+# Improvements by Gino van den Bergen <gino _at_ dtecta.com>,
+# Florian Uhlig <F.Uhlig _at_ gsi.de>,
+# Jiri Marsik <jiri.marsik89 _at_ gmail.com>
+
+# The MIT License
+#
+# Copyright (c) 2011 Hannes Hofmann
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+# GvdB: This module uses the environment variable TBB_ARCH_PLATFORM which defines architecture and compiler.
+# e.g. "ia32/vc8" or "em64t/cc4.1.0_libc2.4_kernel2.6.16.21"
+# TBB_ARCH_PLATFORM is set by the build script tbbvars[.bat|.sh|.csh], which can be found
+# in the TBB installation directory (TBB_INSTALL_DIR).
+#
+# GvdB: Mac OS X distribution places libraries directly in lib directory.
+#
+# For backwards compatibility, you may explicitely set the CMake variables TBB_ARCHITECTURE and TBB_COMPILER.
+# TBB_ARCHITECTURE [ ia32 | em64t | itanium ]
+# which architecture to use
+# TBB_COMPILER e.g. vc9 or cc3.2.3_libc2.3.2_kernel2.4.21 or cc4.0.1_os10.4.9
+# which compiler to use (detected automatically on Windows)
+
+# This module respects
+# TBB_INSTALL_DIR or $ENV{TBB21_INSTALL_DIR} or $ENV{TBB_INSTALL_DIR}
+
+# This module defines
+# TBB_INCLUDE_DIRS, where to find task_scheduler_init.h, etc.
+# TBB_LIBRARY_DIRS, where to find TBB libraries
+# TBB_INSTALL_DIR, the base TBB install directory.
+# TBB_LIBRARIES, all the following TBB libraries (both release and debug versions, using "optimized" and "debug" CMake keywords). Note that if the debug versions are not found, the release versions will be used instead for the debug mode.
+# TBB_RELEASE_LIBRARY, the TBB release library
+# TBB_MALLOC_RELEASE_LIBRARY, the TBB release malloc library
+# TBB_DEBUG_LIBRARY, the TBB debug library
+# TBB_MALLOC_DEBUG_LIBRARY, the TBB debug malloc library
+# TBB_FOUND, If false, don't try to use TBB.
+# TBB_INTERFACE_VERSION, as defined in tbb/tbb_stddef.h
+# TBB_MALLOCPROXY_DEBUG_LIBRARY, the TBB debug malloc_proxy library (not included in TBB_LIBRARIES since it's optionnal)
+# TBB_MALLOCPROXY_RELEASE_LIBRARY, the TBB release malloc_proxy library (not included in TBB_LIBRARIES since it's optionnal)
+
+include(CheckCXXSourceCompiles)
+
+# Usage:
+# try_TBB_with_pthread(<result_var_name> [additional linker args...])
+function(try_TBB_with_pthread result_var)
+ set(TBB_try_ts_source "
+ #include <tbb/enumerable_thread_specific.h>
+ int main() {
+ tbb::enumerable_thread_specific<
+ bool*,
+ tbb::cache_aligned_allocator<bool*>,
+ tbb::ets_key_per_instance> grid;
+ }
+ ")
+ set(CMAKE_REQUIRED_LIBRARIES ${ALL_TBB_LIBRARIES} ${ARGN})
+ set(CMAKE_REQUIRED_INCLUDES ${TBB_INCLUDE_DIR})
+ check_cxx_source_compiles("${TBB_try_ts_source}" ${result_var})
+ set(${result_var} ${${result_var}} PARENT_SCOPE)
+endfunction(try_TBB_with_pthread)
+
+if (WIN32)
+ # has em64t/vc8 em64t/vc9
+ # has ia32/vc7.1 ia32/vc8 ia32/vc9
+ set(_TBB_DEFAULT_INSTALL_DIR "C:/Program Files/Intel/TBB" "C:/Program Files (x86)/Intel/TBB")
+ set(_TBB_LIB_RELEASE_NAME "tbb")
+ set(_TBB_LIB_MALLOC_RELEASE_NAME "${_TBB_LIB_RELEASE_NAME}malloc")
+ set(_TBB_LIB_MALLOCPROXY_RELEASE_NAME "${_TBB_LIB_RELEASE_NAME}malloc_proxy")
+ set(_TBB_LIB_DEBUG_NAME "${_TBB_LIB_RELEASE_NAME}_debug")
+ set(_TBB_LIB_MALLOC_DEBUG_NAME "${_TBB_LIB_MALLOC_RELEASE_NAME}_debug")
+ set(_TBB_LIB_MALLOCPROXY_DEBUG_NAME "${_TBB_LIB_MALLOCPROXY_RELEASE_NAME}_debug")
+ if (MSVC71)
+ set (_TBB_COMPILER "vc7.1")
+ endif(MSVC71)
+ if (MSVC80)
+ set(_TBB_COMPILER "vc8")
+ endif(MSVC80)
+ if (MSVC90)
+ set(_TBB_COMPILER "vc9")
+ endif(MSVC90)
+ if(MSVC10)
+ set(_TBB_COMPILER "vc10")
+ endif(MSVC10)
+ if(MSVC11)
+ set(_TBB_COMPILER "vc11")
+ endif(MSVC11)
+ if(MSVC12)
+ set(_TBB_COMPILER "vc12")
+ endif(MSVC12)
+ #note there was no MSVC13
+ if(MSVC14)
+ set(_TBB_COMPILER "vc14")
+ endif(MSVC14)
+ # Todo: add other Windows compilers such as ICL.
+ set(_TBB_ARCHITECTURE ${TBB_ARCHITECTURE})
+endif (WIN32)
+
+if (UNIX)
+ if (APPLE)
+ # MAC
+ set(_TBB_DEFAULT_INSTALL_DIR "/Library/Frameworks/Intel_TBB.framework/Versions")
+ # libs: libtbb.dylib, libtbbmalloc.dylib, *_debug
+ set(_TBB_LIB_RELEASE_NAME "tbb")
+ set(_TBB_LIB_MALLOC_RELEASE_NAME "${_TBB_LIB_RELEASE_NAME}malloc")
+ #set(_TBB_LIB_MALLOCPROXY_RELEASE_NAME "${_TBB_LIB_RELEASE_NAME}malloc_proxy")
+ set(_TBB_LIB_DEBUG_NAME "${_TBB_LIB_RELEASE_NAME}_debug")
+ set(_TBB_LIB_MALLOC_DEBUG_NAME "${_TBB_LIB_MALLOC_RELEASE_NAME}_debug")
+ #set(_TBB_LIB_MALLOCPROXY_DEBUG_NAME "${_TBB_LIB_MALLOCPROXY_RELEASE_NAME}_debug")
+ # default flavor on apple: ia32/cc4.0.1_os10.4.9
+ # Jiri: There is no reason to presume there is only one flavor and
+ # that user's setting of variables should be ignored.
+ if(NOT TBB_COMPILER)
+ set(_TBB_COMPILER "cc4.0.1_os10.4.9")
+ elseif (NOT TBB_COMPILER)
+ set(_TBB_COMPILER ${TBB_COMPILER})
+ endif(NOT TBB_COMPILER)
+ if(NOT TBB_ARCHITECTURE)
+ set(_TBB_ARCHITECTURE "ia32")
+ elseif(NOT TBB_ARCHITECTURE)
+ set(_TBB_ARCHITECTURE ${TBB_ARCHITECTURE})
+ endif(NOT TBB_ARCHITECTURE)
+ else (APPLE)
+ # LINUX
+ set(_TBB_DEFAULT_INSTALL_DIR "/opt/intel/tbb" "/usr/local/include" "/usr/include")
+ set(_TBB_LIB_RELEASE_NAME "tbb")
+ set(_TBB_LIB_MALLOC_RELEASE_NAME "${_TBB_LIB_RELEASE_NAME}malloc")
+ set(_TBB_LIB_MALLOCPROXY_RELEASE_NAME "${_TBB_LIB_RELEASE_NAME}malloc_proxy")
+ set(_TBB_LIB_DEBUG_NAME "${_TBB_LIB_RELEASE_NAME}_debug")
+ set(_TBB_LIB_MALLOC_DEBUG_NAME "${_TBB_LIB_MALLOC_RELEASE_NAME}_debug")
+ set(_TBB_LIB_MALLOCPROXY_DEBUG_NAME "${_TBB_LIB_MALLOCPROXY_RELEASE_NAME}_debug")
+ # has em64t/cc3.2.3_libc2.3.2_kernel2.4.21 em64t/cc3.3.3_libc2.3.3_kernel2.6.5 em64t/cc3.4.3_libc2.3.4_kernel2.6.9 em64t/cc4.1.0_libc2.4_kernel2.6.16.21
+ # has ia32/*
+ # has itanium/*
+ set(_TBB_COMPILER ${TBB_COMPILER})
+ set(_TBB_ARCHITECTURE ${TBB_ARCHITECTURE})
+ endif (APPLE)
+endif (UNIX)
+
+if (CMAKE_SYSTEM MATCHES "SunOS.*")
+# SUN
+# not yet supported
+# has em64t/cc3.4.3_kernel5.10
+# has ia32/*
+endif (CMAKE_SYSTEM MATCHES "SunOS.*")
+
+
+#-- Clear the public variables
+set (TBB_FOUND "NO")
+
+
+#-- Find TBB install dir and set ${_TBB_INSTALL_DIR} and cached ${TBB_INSTALL_DIR}
+# first: use CMake variable TBB_INSTALL_DIR
+if (TBB_INSTALL_DIR)
+ set (_TBB_INSTALL_DIR ${TBB_INSTALL_DIR})
+endif (TBB_INSTALL_DIR)
+# second: use environment variable
+if (NOT _TBB_INSTALL_DIR)
+ if (NOT "$ENV{TBBROOT}" STREQUAL "")
+ set (_TBB_INSTALL_DIR $ENV{TBBROOT})
+ endif (NOT "$ENV{TBBROOT}" STREQUAL "")
+ if (NOT "$ENV{TBB_INSTALL_DIR}" STREQUAL "")
+ set (_TBB_INSTALL_DIR $ENV{TBB_INSTALL_DIR})
+ endif (NOT "$ENV{TBB_INSTALL_DIR}" STREQUAL "")
+ # Intel recommends setting TBB21_INSTALL_DIR
+ if (NOT "$ENV{TBB21_INSTALL_DIR}" STREQUAL "")
+ set (_TBB_INSTALL_DIR $ENV{TBB21_INSTALL_DIR})
+ endif (NOT "$ENV{TBB21_INSTALL_DIR}" STREQUAL "")
+ if (NOT "$ENV{TBB22_INSTALL_DIR}" STREQUAL "")
+ set (_TBB_INSTALL_DIR $ENV{TBB22_INSTALL_DIR})
+ endif (NOT "$ENV{TBB22_INSTALL_DIR}" STREQUAL "")
+ if (NOT "$ENV{TBB30_INSTALL_DIR}" STREQUAL "")
+ set (_TBB_INSTALL_DIR $ENV{TBB30_INSTALL_DIR})
+ endif (NOT "$ENV{TBB30_INSTALL_DIR}" STREQUAL "")
+endif (NOT _TBB_INSTALL_DIR)
+# third: try to find path automatically
+if (NOT _TBB_INSTALL_DIR)
+ if (_TBB_DEFAULT_INSTALL_DIR)
+ set (_TBB_INSTALL_DIR ${_TBB_DEFAULT_INSTALL_DIR})
+ endif (_TBB_DEFAULT_INSTALL_DIR)
+endif (NOT _TBB_INSTALL_DIR)
+# sanity check
+if (NOT _TBB_INSTALL_DIR)
+ message ("ERROR: Unable to find Intel TBB install directory. ${_TBB_INSTALL_DIR}")
+else (NOT _TBB_INSTALL_DIR)
+# finally: set the cached CMake variable TBB_INSTALL_DIR
+if (NOT TBB_INSTALL_DIR)
+ set (TBB_INSTALL_DIR ${_TBB_INSTALL_DIR} CACHE PATH "Intel TBB install directory")
+ mark_as_advanced(TBB_INSTALL_DIR)
+endif (NOT TBB_INSTALL_DIR)
+
+
+#-- A macro to rewrite the paths of the library. This is necessary, because
+# find_library() always found the em64t/vc9 version of the TBB libs
+macro(TBB_CORRECT_LIB_DIR var_name)
+# if (NOT "${_TBB_ARCHITECTURE}" STREQUAL "em64t")
+ string(REPLACE em64t "${_TBB_ARCHITECTURE}" ${var_name} ${${var_name}})
+# endif (NOT "${_TBB_ARCHITECTURE}" STREQUAL "em64t")
+ string(REPLACE ia32 "${_TBB_ARCHITECTURE}" ${var_name} ${${var_name}})
+ string(REGEX REPLACE "vc[0-9]+(\.[0-9]+)?" "${_TBB_COMPILER}" ${var_name} ${${var_name}})
+endmacro(TBB_CORRECT_LIB_DIR var_content)
+
+
+#-- Look for include directory and set ${TBB_INCLUDE_DIR}
+set (TBB_INC_SEARCH_DIR ${_TBB_INSTALL_DIR}/include)
+# Jiri: tbbvars now sets the CPATH environment variable to the directory
+# containing the headers.
+# LR: search first with NO_DEFAULT_PATH...
+find_path(TBB_INCLUDE_DIR
+ tbb/task_scheduler_init.h
+ PATHS ${TBB_INC_SEARCH_DIR} ENV CPATH
+ NO_DEFAULT_PATH
+)
+if(NOT TBB_INCLUDE_DIR)
+# LR: ... and then search again with NO_DEFAULT_PATH if nothing was found in
+# hinted paths
+ find_path(TBB_INCLUDE_DIR
+ tbb/task_scheduler_init.h
+ PATHS ${TBB_INC_SEARCH_DIR} ENV CPATH
+ )
+endif()
+mark_as_advanced(TBB_INCLUDE_DIR)
+
+
+#-- Look for libraries
+# GvdB: $ENV{TBB_ARCH_PLATFORM} is set by the build script tbbvars[.bat|.sh|.csh]
+if (NOT $ENV{TBB_ARCH_PLATFORM} STREQUAL "")
+ set (_TBB_LIBRARY_DIR
+ ${_TBB_INSTALL_DIR}/lib/$ENV{TBB_ARCH_PLATFORM}
+ ${_TBB_INSTALL_DIR}/$ENV{TBB_ARCH_PLATFORM}/lib
+ )
+endif (NOT $ENV{TBB_ARCH_PLATFORM} STREQUAL "")
+# Jiri: This block isn't mutually exclusive with the previous one
+# (hence no else), instead I test if the user really specified
+# the variables in question.
+if ((NOT ${TBB_ARCHITECTURE} STREQUAL "") AND (NOT ${TBB_COMPILER} STREQUAL ""))
+ # HH: deprecated
+ message(STATUS "[Warning] FindTBB.cmake: The use of TBB_ARCHITECTURE and TBB_COMPILER is deprecated and may not be supported in future versions. Please set \$ENV{TBB_ARCH_PLATFORM} (using tbbvars.[bat|csh|sh]).")
+ # Jiri: It doesn't hurt to look in more places, so I store the hints from
+ # ENV{TBB_ARCH_PLATFORM} and the TBB_ARCHITECTURE and TBB_COMPILER
+ # variables and search them both.
+ set (_TBB_LIBRARY_DIR "${_TBB_INSTALL_DIR}/${_TBB_ARCHITECTURE}/${_TBB_COMPILER}/lib" ${_TBB_LIBRARY_DIR})
+endif ((NOT ${TBB_ARCHITECTURE} STREQUAL "") AND (NOT ${TBB_COMPILER} STREQUAL ""))
+
+# GvdB: Mac OS X distribution places libraries directly in lib directory.
+list(APPEND _TBB_LIBRARY_DIR ${_TBB_INSTALL_DIR}/lib)
+
+# Jiri: No reason not to check the default paths. From recent versions,
+# tbbvars has started exporting the LIBRARY_PATH and LD_LIBRARY_PATH
+# variables, which now point to the directories of the lib files.
+# It all makes more sense to use the ${_TBB_LIBRARY_DIR} as a HINTS
+# argument instead of the implicit PATHS as it isn't hard-coded
+# but computed by system introspection. Searching the LIBRARY_PATH
+# and LD_LIBRARY_PATH environment variables is now even more important
+# that tbbvars doesn't export TBB_ARCH_PLATFORM and it facilitates
+# the use of TBB built from sources.
+# LR: search first with NO_DEFAULT_PATH...
+find_library(TBB_RELEASE_LIBRARY ${_TBB_LIB_RELEASE_NAME} HINTS ${_TBB_LIBRARY_DIR}
+ PATHS ENV LIBRARY_PATH ENV LD_LIBRARY_PATH NO_DEFAULT_PATH)
+find_library(TBB_MALLOC_RELEASE_LIBRARY ${_TBB_LIB_MALLOC_RELEASE_NAME} HINTS ${_TBB_LIBRARY_DIR}
+ PATHS ENV LIBRARY_PATH ENV LD_LIBRARY_PATH NO_DEFAULT_PATH)
+find_library(TBB_MALLOCPROXY_RELEASE_LIBRARY ${_TBB_LIB_MALLOCPROXY_RELEASE_NAME} HINTS ${_TBB_LIBRARY_DIR}
+ PATHS ENV LIBRARY_PATH ENV LD_LIBRARY_PATH NO_DEFAULT_PATH)
+if(NOT TBB_RELEASE_LIBRARY OR NOT TBB_MALLOC_RELEASE_LIBRARY OR NOT TBB_MALLOCPROXY_RELEASE_LIBRARY)
+# LR: ... and then search again with NO_DEFAULT_PATH if nothing was found
+# in hinted paths
+ find_library(TBB_RELEASE_LIBRARY ${_TBB_LIB_RELEASE_NAME} HINTS ${_TBB_LIBRARY_DIR}
+ PATHS ENV LIBRARY_PATH ENV LD_LIBRARY_PATH)
+ find_library(TBB_MALLOC_RELEASE_LIBRARY ${_TBB_LIB_MALLOC_RELEASE_NAME} HINTS ${_TBB_LIBRARY_DIR}
+ PATHS ENV LIBRARY_PATH ENV LD_LIBRARY_PATH)
+ find_library(TBB_MALLOCPROXY_RELEASE_LIBRARY ${_TBB_LIB_MALLOCPROXY_RELEASE_NAME} HINTS ${_TBB_LIBRARY_DIR}
+ PATHS ENV LIBRARY_PATH ENV LD_LIBRARY_PATH)
+endif()
+
+#Extract path from TBB_RELEASE_LIBRARY name
+get_filename_component(TBB_RELEASE_LIBRARY_DIR ${TBB_RELEASE_LIBRARY} PATH)
+
+#TBB_CORRECT_LIB_DIR(TBB_RELEASE_LIBRARY)
+#TBB_CORRECT_LIB_DIR(TBB_MALLOC_RELEASE_LIBRARY)
+#TBB_CORRECT_LIB_DIR(TBB_MALLOCPROXY_RELEASE_LIBRARY)
+mark_as_advanced(TBB_RELEASE_LIBRARY TBB_MALLOC_RELEASE_LIBRARY TBB_MALLOCPROXY_RELEASE_LIBRARY)
+
+#-- Look for debug libraries
+# Jiri: Changed the same way as for the release libraries.
+find_library(TBB_DEBUG_LIBRARY ${_TBB_LIB_DEBUG_NAME} HINTS ${_TBB_LIBRARY_DIR}
+ PATHS ENV LIBRARY_PATH ENV LD_LIBRARY_PATH NO_DEFAULT_PATH)
+find_library(TBB_MALLOC_DEBUG_LIBRARY ${_TBB_LIB_MALLOC_DEBUG_NAME} HINTS ${_TBB_LIBRARY_DIR}
+ PATHS ENV LIBRARY_PATH ENV LD_LIBRARY_PATH NO_DEFAULT_PATH)
+find_library(TBB_MALLOCPROXY_DEBUG_LIBRARY ${_TBB_LIB_MALLOCPROXY_DEBUG_NAME} HINTS ${_TBB_LIBRARY_DIR}
+ PATHS ENV LIBRARY_PATH ENV LD_LIBRARY_PATH NO_DEFAULT_PATH)
+if(NOT TBB_DEBUG_LIBRARY OR NOT TBB_MALLOC_DEBUG_LIBRARY OR NOT TBB_MALLOCPROXY_DEBUG_LIBRARY)
+ find_library(TBB_DEBUG_LIBRARY ${_TBB_LIB_DEBUG_NAME} HINTS ${_TBB_LIBRARY_DIR}
+ PATHS ENV LIBRARY_PATH ENV LD_LIBRARY_PATH)
+ find_library(TBB_MALLOC_DEBUG_LIBRARY ${_TBB_LIB_MALLOC_DEBUG_NAME} HINTS ${_TBB_LIBRARY_DIR}
+ PATHS ENV LIBRARY_PATH ENV LD_LIBRARY_PATH)
+ find_library(TBB_MALLOCPROXY_DEBUG_LIBRARY ${_TBB_LIB_MALLOCPROXY_DEBUG_NAME} HINTS ${_TBB_LIBRARY_DIR}
+ PATHS ENV LIBRARY_PATH ENV LD_LIBRARY_PATH)
+endif()
+
+# Jiri: Self-built TBB stores the debug libraries in a separate directory.
+# Extract path from TBB_DEBUG_LIBRARY name
+get_filename_component(TBB_DEBUG_LIBRARY_DIR ${TBB_DEBUG_LIBRARY} PATH)
+
+#TBB_CORRECT_LIB_DIR(TBB_DEBUG_LIBRARY)
+#TBB_CORRECT_LIB_DIR(TBB_MALLOC_DEBUG_LIBRARY)
+#TBB_CORRECT_LIB_DIR(TBB_MALLOCPROXY_DEBUG_LIBRARY)
+mark_as_advanced(TBB_DEBUG_LIBRARY TBB_MALLOC_DEBUG_LIBRARY TBB_MALLOCPROXY_DEBUG_LIBRARY)
+
+if (TBB_INCLUDE_DIR)
+ if (TBB_RELEASE_LIBRARY)
+ set (TBB_FOUND "YES")
+
+ # NOTE: Removed because we don't want to link with the malloc_proxy by default
+ #if (NOT "${TBB_MALLOCPROXY_RELEASE_LIBRARY}" STREQUAL "TBB_MALLOCPROXY_RELEASE_LIBRARY-NOTFOUND")
+ # mark_as_advanced(TBB_MALLOCPROXY_RELEASE_LIBRARY)
+ # set (_TBB_MALLOCPROXY optimized ${TBB_MALLOCPROXY_RELEASE_LIBRARY})
+ #endif (NOT "${TBB_MALLOCPROXY_RELEASE_LIBRARY}" STREQUAL "TBB_MALLOCPROXY_RELEASE_LIBRARY-NOTFOUND")
+ #if (NOT "${TBB_MALLOCPROXY_DEBUG_LIBRARY}" STREQUAL "TBB_MALLOCPROXY_DEBUG_LIBRARY-NOTFOUND")
+ # mark_as_advanced(TBB_MALLOCPROXY_DEBUG_LIBRARY)
+ # set (_TBB_MALLOCPROXY ${_TBB_MALLOCPROXY} debug ${TBB_MALLOCPROXY_DEBUG_LIBRARY})
+ #endif (NOT "${TBB_MALLOCPROXY_DEBUG_LIBRARY}" STREQUAL "TBB_MALLOCPROXY_DEBUG_LIBRARY-NOTFOUND")
+
+ # TBB release library
+ set (ALL_TBB_LIBRARIES optimized ${TBB_RELEASE_LIBRARY})
+
+ # TBB debug library found?
+ if (TBB_DEBUG_LIBRARY)
+ list(APPEND ALL_TBB_LIBRARIES debug ${TBB_DEBUG_LIBRARY})
+ else (TBB_DEBUG_LIBRARY)
+ # Otherwise, link with the release library even in debug mode
+ list(APPEND ALL_TBB_LIBRARIES debug ${TBB_RELEASE_LIBRARY})
+ endif (TBB_DEBUG_LIBRARY)
+
+ # TBB malloc - release
+ if (TBB_MALLOC_RELEASE_LIBRARY)
+ list(APPEND ALL_TBB_LIBRARIES optimized ${TBB_MALLOC_RELEASE_LIBRARY})
+
+ # TBB malloc - debug
+ if (TBB_MALLOC_DEBUG_LIBRARY)
+ list(APPEND ALL_TBB_LIBRARIES debug ${TBB_MALLOC_DEBUG_LIBRARY})
+ else (TBB_MALLOC_DEBUG_LIBRARY)
+ list(APPEND ALL_TBB_LIBRARIES debug ${TBB_MALLOC_RELEASE_LIBRARY})
+ endif (TBB_MALLOC_DEBUG_LIBRARY)
+ endif (TBB_MALLOC_RELEASE_LIBRARY)
+
+ if(UNIX AND NOT APPLE)
+ # On Fedora, code using TBB might need -pthread
+
+ # First check without pthread
+ try_TBB_with_pthread(TBB_without_pthread)
+
+ if(NOT TBB_without_pthread)
+ # Then check with -pthread
+ try_TBB_with_pthread(TBB_with_pthread -pthread)
+ if(TBB_with_pthread)
+ list(APPEND ALL_TBB_LIBRARIES general -pthread)
+ endif(TBB_with_pthread)
+ endif(NOT TBB_without_pthread)
+ endif(UNIX AND NOT APPLE)
+
+ set (TBB_LIBRARIES ${ALL_TBB_LIBRARIES}
+ CACHE PATH "TBB libraries" FORCE)
+
+ # Include dirs
+ set (TBB_INCLUDE_DIRS ${TBB_INCLUDE_DIR} CACHE PATH "TBB include directory" FORCE)
+
+ # Library dirs
+ if( "${TBB_DEBUG_LIBRARY_DIR}" STREQUAL "" OR "${TBB_RELEASE_LIBRARY_DIR}" STREQUAL "${TBB_DEBUG_LIBRARY_DIR}" )
+ set (TBB_LIBRARY_DIRS
+ ${TBB_RELEASE_LIBRARY_DIR}
+ CACHE PATH "TBB library directories" FORCE)
+ else( "${TBB_DEBUG_LIBRARY_DIR}" STREQUAL "" OR "${TBB_RELEASE_LIBRARY_DIR}" STREQUAL "${TBB_DEBUG_LIBRARY_DIR}" )
+ set (TBB_LIBRARY_DIRS
+ ${TBB_RELEASE_LIBRARY_DIR} ${TBB_DEBUG_LIBRARY_DIR}
+ CACHE PATH "TBB library directories" FORCE)
+ endif( "${TBB_DEBUG_LIBRARY_DIR}" STREQUAL "" OR "${TBB_RELEASE_LIBRARY_DIR}" STREQUAL "${TBB_DEBUG_LIBRARY_DIR}" )
+
+ message(STATUS "Found Intel TBB")
+ endif (TBB_RELEASE_LIBRARY)
+endif (TBB_INCLUDE_DIR)
+
+if (NOT TBB_FOUND)
+ if(NOT TBB_FIND_QUIETLY)
+ message("ERROR: Intel TBB NOT found! Please define the TBBROOT (or TBB_INSTALL_DIR) and/or TBB_ARCH_PLATFORM environment variables.")
+ message(STATUS "Looked for Threading Building Blocks in ${_TBB_INSTALL_DIR}")
+ endif(NOT TBB_FIND_QUIETLY)
+ SET(TBB_INSTALL_DIR "TBB_INSTALL_DIR_NOT_FOUND" CACHE STRING "Intel TBB install directory")
+ # do only throw fatal, if this pkg is REQUIRED
+ if (TBB_FIND_REQUIRED)
+ message(FATAL_ERROR "Could NOT find TBB library.")
+ endif (TBB_FIND_REQUIRED)
+endif (NOT TBB_FOUND)
+
+endif (NOT _TBB_INSTALL_DIR)
+
+if (TBB_FOUND)
+ set(TBB_INTERFACE_VERSION 0)
+ FILE(READ "${TBB_INCLUDE_DIRS}/tbb/tbb_stddef.h" _TBB_VERSION_CONTENTS)
+ STRING(REGEX REPLACE ".*#define TBB_INTERFACE_VERSION ([0-9]+).*" "\\1" TBB_INTERFACE_VERSION "${_TBB_VERSION_CONTENTS}")
+ set(TBB_INTERFACE_VERSION "${TBB_INTERFACE_VERSION}")
+endif (TBB_FOUND)
+
+set(TBB_USE_FILE "UseTBB")
+
+### ** Emacs settings **
+### Local Variables:
+### cmake-tab-width: 4
+### End:
diff --git a/src/cmake/modules/GUDHI_doxygen_target.txt b/src/cmake/modules/GUDHI_doxygen_target.txt
new file mode 100644
index 00000000..d2cb952d
--- /dev/null
+++ b/src/cmake/modules/GUDHI_doxygen_target.txt
@@ -0,0 +1,11 @@
+# add a target to generate API documentation with Doxygen
+find_package(Doxygen)
+if(DOXYGEN_FOUND)
+ # configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)
+
+ add_custom_target(doxygen ${DOXYGEN_EXECUTABLE} ${GUDHI_USER_VERSION_DIR}/Doxyfile
+ WORKING_DIRECTORY ${GUDHI_USER_VERSION_DIR}
+ DEPENDS ${GUDHI_USER_VERSION_DIR}/Doxyfile ${GUDHI_DOXYGEN_DEPENDENCY}
+ COMMENT "Generating API documentation with Doxygen in ${GUDHI_USER_VERSION_DIR}/doc/html/" VERBATIM)
+
+endif(DOXYGEN_FOUND)
diff --git a/src/cmake/modules/GUDHI_user_version_target.txt b/src/cmake/modules/GUDHI_user_version_target.txt
new file mode 100644
index 00000000..805f0a83
--- /dev/null
+++ b/src/cmake/modules/GUDHI_user_version_target.txt
@@ -0,0 +1,115 @@
+# 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)
+
+ if(DEFINED USER_VERSION_DIR)
+ # set the GUDHI_USER_VERSION_DIR with USER_VERSION_DIR defined by the user
+ 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
+ set(GUDHI_USER_VERSION_DIR ${CMAKE_CURRENT_BINARY_DIR}/${DATE_AND_TIME}_GUDHI_${GUDHI_VERSION})
+ endif()
+
+ set(GUDHI_DOXYGEN_DEPENDENCY user_version)
+
+ add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
+ make_directory ${GUDHI_USER_VERSION_DIR}
+ 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}/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)
+ add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
+ copy ${CMAKE_SOURCE_DIR}/src/CMakeLists.txt ${GUDHI_USER_VERSION_DIR}/CMakeLists.txt)
+ add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
+ copy ${CMAKE_SOURCE_DIR}/src/Doxyfile ${GUDHI_USER_VERSION_DIR}/Doxyfile)
+ add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
+ copy ${CMAKE_SOURCE_DIR}/src/GUDHIConfigVersion.cmake.in ${GUDHI_USER_VERSION_DIR}/GUDHIConfigVersion.cmake.in)
+ add_custom_command(TARGET user_version PRE_BUILD COMMAND ${CMAKE_COMMAND} -E
+ 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}/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")
+
+ 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()
+
+endif()
diff --git a/src/cmake/modules/UseEigen3.cmake b/src/cmake/modules/UseEigen3.cmake
new file mode 100644
index 00000000..e3ed18be
--- /dev/null
+++ b/src/cmake/modules/UseEigen3.cmake
@@ -0,0 +1,9 @@
+# This module setups the compiler for using Eigen v3 library.
+# It assumes that find_package(Eigen3) was already called.
+
+
+include_directories( SYSTEM ${EIGEN3_INCLUDE_DIR} )
+
+add_definitions(-DCGAL_EIGEN3_ENABLED)
+
+set (EIGEN3_SETUP TRUE)
diff --git a/src/cmake/modules/UseTBB.cmake b/src/cmake/modules/UseTBB.cmake
new file mode 100644
index 00000000..e1ef5dfe
--- /dev/null
+++ b/src/cmake/modules/UseTBB.cmake
@@ -0,0 +1,6 @@
+# This module setups the compiler for using TBB library.
+# It assumes that find_package(TBB) was already called.
+
+include_directories ( ${TBB_INCLUDE_DIRS} )
+link_directories( ${TBB_LIBRARY_DIRS} )
+add_definitions( -DNOMINMAX -DGUDHI_USE_TBB )
diff --git a/src/common/doc/Gudhi_banner.jpg b/src/common/doc/Gudhi_banner.jpg
deleted file mode 100644
index ebd3d8af..00000000
--- a/src/common/doc/Gudhi_banner.jpg
+++ /dev/null
Binary files differ
diff --git a/src/common/doc/Gudhi_banner.png b/src/common/doc/Gudhi_banner.png
new file mode 100644
index 00000000..18e8a672
--- /dev/null
+++ b/src/common/doc/Gudhi_banner.png
Binary files differ
diff --git a/src/common/doc/footer.html b/src/common/doc/footer.html
new file mode 100644
index 00000000..7b4cdc5c
--- /dev/null
+++ b/src/common/doc/footer.html
@@ -0,0 +1,29 @@
+<!-- HTML footer for doxygen 1.8.6-->
+<!-- start footer part -->
+<table style="width:100%">
+ <tr class="no-bullet shadow-black">
+ <td class="network-entypo">
+<!--BEGIN PROJECT_NAME--> $projectname
+<!--BEGIN PROJECT_NUMBER-->&#160;Version $projectnumber<!--END PROJECT_NUMBER-->
+<!--BEGIN PROJECT_BRIEF-->&#160;-&#160;$projectbrief<!--END PROJECT_BRIEF-->
+<!--END PROJECT_NAME-->
+ </td>
+ <td class="network-entypo">
+<!--BEGIN GENERATE_TREEVIEW-->
+ $generatedby
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="$relpath^doxygen.png" alt="doxygen"/></a> $doxygenversion
+<!--END GENERATE_TREEVIEW-->
+ </td>
+ </tr>
+</table>
+
+<!--BEGIN !GENERATE_TREEVIEW-->
+<hr class="footer"/><address class="footer"><small> tralala
+$generatedby &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/>
+</a> $doxygenversion
+</small></address>
+<!--END !GENERATE_TREEVIEW-->
+</body>
+</html>
diff --git a/src/common/doc/header.html b/src/common/doc/header.html
new file mode 100644
index 00000000..a6f3ed9c
--- /dev/null
+++ b/src/common/doc/header.html
@@ -0,0 +1,83 @@
+<!-- HTML header for doxygen 1.8.6-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- GUDHI website : class="no-js" lang="en" is necessary -->
+<html xmlns="http://www.w3.org/1999/xhtml" class="no-js" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen $doxygenversion"/>
+<!--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" />
+<!-- 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>
+<script type="text/javascript" src="$relpath^dynsections.js"></script>
+$treeview
+$search
+$mathjax
+<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
+$extrastylesheet
+</head>
+<body>
+
+<!-- GUDHI website header BEGIN -->
+<div id="navigation" class="sticky">
+ <nav class="top-bar" role="navigation" data-topbar>
+ <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/getinvolved/">Get involved</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>
+ <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="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 -->
+
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+
+<!--BEGIN TITLEAREA-->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 30px;">
+ <!--BEGIN DISABLE_INDEX-->
+ <!--BEGIN SEARCHENGINE-->
+ <td>$searchbox</td>
+ <!--END SEARCHENGINE-->
+ <!--END DISABLE_INDEX-->
+ </tr>
+ </tbody>
+</table>
+</div>
+<!--END TITLEAREA-->
+<!-- end header part -->
diff --git a/src/common/doc/main_page.h b/src/common/doc/main_page.h
index 83908905..0983051d 100644
--- a/src/common/doc/main_page.h
+++ b/src/common/doc/main_page.h
@@ -1,67 +1,343 @@
-/**
-\mainpage
-
-\image html "Gudhi_banner.jpg" "" width=20cm
-
-The Gudhi library (Geometric Understanding in Higher Dimensions) is a generic C++ library for
-topological analysis of high-dimensional data whose goal is to provide robust, efficient, flexible and easy to use
-implementations of
-state-of-the-art algorithms and data structures for computational topology.
-
-The current release of the library allows to use several data-structures for simplicial complexes :
-simplex tree, Hasse diagram or skeleton-blocker. Several operations can then be done on top of these
-representations such as persistent homology computation or simplification.
-All data-structures are generic and several of their aspects (such as stored elements, policies)
-can be parameterized via template classes.
-We refer to
-\cite gudhilibrary_ICMS14
-for a detailed description of the design of the library.
-
-
-\section compiling Compiling
-
-The library uses c++11 and requires Boost with version 1.48.0 or more recent : http://www.boost.org/.
-It is a multiplaform library and compiles on Linux, Mac OSX and Visual Studio 2013.
-
-
-\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 examples require The GNU Multiple Precision Arithmetic Library (GMP) http://gmplib.org/
-and will not be built if GMP is not installed:
- - Persistent_cohomology/rips_multifield_persistence
- - Simplex_tree/simplex_tree_from_alpha_shapes_3
-
-Having GMP version 4.2 or higher installed is recommended. This library can be obtained from http://gmplib.org/
-
-\subsection cgal CGAL:
-CGAL is a C++ library which provides easy access to efficient and reliable geometric algorithms.
-
-The following example requires CGAL https://www.cgal.org/ and will not be built if CGAL is not installed:
- - Simplex_tree/simplex_tree_from_alpha_shapes_3
-
-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
-
-\section demos Demos and Examples
-
-To build the library, run the following in a terminal:
+/*! \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 Simplification of simplicial complexes by edge contraction.
+ * \li Algorithms to compute persistent homology persistent homology.
+ *
+ * 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::alpha_complex::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::skeleton_blocker::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>
+*/
-\verbatim
-cd /path-to-gudhi/
+/*! \page installation Gudhi installation
+ * \tableofcontents
+ * As Gudhi is a header only library, there is no need to install the library.
+ *
+ * Examples of Gudhi headers inclusion can be found in \ref demos.
+ *
+ * \section compiling Compiling
+ * The library uses c++11 and requires <a target="_blank" href="http://www.boost.org/">Boost</a> with version 1.48.0 or
+ * more recent. It is a multi-platform library and compiles on Linux, Mac OSX and Visual Studio 2015.
+ *
+ * \subsection demos Demos and examples
+ * To build the demos and examples, run the following commands in a terminal:
+\verbatim cd /path-to-gudhi/
mkdir build
cd build/
-cmake -DCMAKE_BUILD_TYPE=Release ..
-make
-\endverbatim
-
-
-
-
+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 optionallibrary Optional third-party library
+ * \subsection gmp GMP:
+ * The multi-field persistent homology algorithm requires GMP which is a free library for arbitrary-precision
+ * arithmetic, operating on signed integers, rational numbers, and floating point numbers.
+ *
+ * The following example requires the <a target="_blank" href="http://gmplib.org/">GNU Multiple Precision Arithmetic
+ * Library</a> (GMP) and will not be built if GMP is not installed:
+ * \li <a href="_persistent_cohomology_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.
+ *
+ * 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>
+ *
+ * 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:
+ * The \ref alpha_complex data structure and few examples requires
+ * <a target="_blank" href="http://eigen.tuxfamily.org/">Eigen3</a> is a C++ template library for linear algebra:
+ * matrices, vectors, numerical solvers, and related algorithms.
+ *
+ * The following example requires the <a target="_blank" href="http://eigen.tuxfamily.org/">Eigen3</a> and will not be
+ * built if Eigen3 is not installed:
+ * \li <a href="_alpha_complex_2_alpha_complex_from_off_8cpp-example.html">
+ * Alpha_complex/Alpha_complex_from_off.cpp</a> (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_complex_3d_persistence_8cpp-example.html">
+ * Persistent_cohomology/alpha_complex_3d_persistence.cpp</a>
+ * \li <a href="_persistent_cohomology_2alpha_complex_persistence_8cpp-example.html">
+ * Persistent_cohomology/alpha_complex_persistence.cpp</a>
+ * \li <a href="_persistent_cohomology_2rips_persistence_via_boundary_matrix_8cpp-example.html">
+ * Persistent_cohomology/rips_persistence_via_boundary_matrix.cpp</a>
+ * \li <a href="_persistent_cohomology_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>
+ *
+ * \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.
+ *
+*/
-\details
+/*! \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
+*/
-\copyright GNU General Public License v3.
-\verbatim Contact: gudhi-users@lists.gforge.inria.fr \endverbatim
+// 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/src/common/doc/stylesheet.css b/src/common/doc/stylesheet.css
new file mode 100644
index 00000000..1df177a4
--- /dev/null
+++ b/src/common/doc/stylesheet.css
@@ -0,0 +1,1367 @@
+/* The standard CSS for doxygen 1.8.6 */
+
+body, table, div, p, dl {
+ font: 400 14px/22px Roboto,sans-serif;
+}
+
+/* @group Heading Levels */
+
+h1.groupheader {
+ font-size: 150%;
+}
+
+.title {
+ font: 400 14px/28px Roboto,sans-serif;
+ font-size: 150%;
+ font-weight: bold;
+ margin: 10px 2px;
+}
+
+h2.groupheader {
+ border-bottom: 1px solid #879ECB;
+ color: #354C7B;
+ font-size: 150%;
+ font-weight: normal;
+ margin-top: 1.75em;
+ padding-top: 8px;
+ padding-bottom: 4px;
+ width: 100%;
+}
+
+h3.groupheader {
+ font-size: 100%;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ -webkit-transition: text-shadow 0.5s linear;
+ -moz-transition: text-shadow 0.5s linear;
+ -ms-transition: text-shadow 0.5s linear;
+ -o-transition: text-shadow 0.5s linear;
+ transition: text-shadow 0.5s linear;
+ margin-right: 15px;
+}
+
+h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+ text-shadow: 0 0 15px cyan;
+}
+
+dt {
+ font-weight: bold;
+}
+
+div.multicol {
+ -moz-column-gap: 1em;
+ -webkit-column-gap: 1em;
+ -moz-column-count: 3;
+ -webkit-column-count: 3;
+}
+
+p.startli, p.startdd {
+ margin-top: 2px;
+}
+
+p.starttd {
+ margin-top: 0px;
+}
+
+p.endli {
+ margin-bottom: 0px;
+}
+
+p.enddd {
+ margin-bottom: 4px;
+}
+
+p.endtd {
+ margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+ font-weight: bold;
+}
+
+span.legend {
+ font-size: 70%;
+ text-align: center;
+}
+
+h3.version {
+ font-size: 90%;
+ text-align: center;
+}
+
+div.qindex, div.navtab{
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+}
+
+div.qindex, div.navpath {
+ width: 100%;
+ line-height: 140%;
+}
+
+div.navtab {
+ margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+ color: #3D578C;
+ font-weight: normal;
+ text-decoration: none;
+}
+
+.contents a:visited {
+ color: #4665A2;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+a.qindex {
+ font-weight: bold;
+}
+
+a.qindexHL {
+ font-weight: bold;
+ background-color: #9CAFD4;
+ color: #ffffff;
+ border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+ color: #ffffff;
+}
+
+a.el {
+ font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code, a.code:visited, a.line, a.line:visited {
+ color: #4665A2;
+}
+
+a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
+ color: #4665A2;
+}
+
+/* @end */
+
+dl.el {
+ margin-left: -1cm;
+}
+
+pre.fragment {
+ border: 1px solid #C4CFE5;
+ background-color: #FBFCFD;
+ padding: 4px 6px;
+ margin: 4px 8px 4px 2px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+ font-family: monospace, fixed;
+ font-size: 105%;
+}
+
+div.fragment {
+ padding: 4px 6px;
+ margin: 4px 8px 4px 2px;
+ background-color: #FBFCFD;
+ border: 1px solid #C4CFE5;
+}
+
+div.line {
+ font-family: monospace, fixed;
+ font-size: 13px;
+ min-height: 13px;
+ line-height: 1.0;
+ text-wrap: unrestricted;
+ white-space: -moz-pre-wrap; /* Moz */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ white-space: pre-wrap; /* CSS3 */
+ word-wrap: break-word; /* IE 5.5+ */
+ text-indent: -53px;
+ padding-left: 53px;
+ padding-bottom: 0px;
+ margin: 0px;
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+div.line.glow {
+ background-color: cyan;
+ box-shadow: 0 0 10px cyan;
+}
+
+
+span.lineno {
+ padding-right: 4px;
+ text-align: right;
+ border-right: 2px solid #0F0;
+ background-color: #E8E8E8;
+ white-space: pre;
+}
+span.lineno a {
+ background-color: #D8D8D8;
+}
+
+span.lineno a:hover {
+ background-color: #C8C8C8;
+}
+
+div.ah {
+ background-color: black;
+ font-weight: bold;
+ color: #ffffff;
+ margin-bottom: 3px;
+ margin-top: 3px;
+ padding: 0.2em;
+ border: solid thin #333;
+ border-radius: 0.5em;
+ -webkit-border-radius: .5em;
+ -moz-border-radius: .5em;
+ box-shadow: 2px 2px 3px #999;
+ -webkit-box-shadow: 2px 2px 3px #999;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+ background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
+}
+
+div.groupHeader {
+ margin-left: 16px;
+ margin-top: 12px;
+ font-weight: bold;
+}
+
+div.groupText {
+ margin-left: 16px;
+ font-style: italic;
+}
+
+body {
+ background-color: white;
+ color: black;
+ margin: 0;
+}
+
+div.contents {
+ margin-top: 10px;
+ margin-left: 12px;
+ margin-right: 8px;
+}
+
+td.indexkey {
+ background-color: #EBEFF6;
+ font-weight: bold;
+ border: 1px solid #C4CFE5;
+ margin: 2px 0px 2px 0;
+ padding: 2px 10px;
+ white-space: nowrap;
+ vertical-align: top;
+}
+
+td.indexvalue {
+ background-color: #EBEFF6;
+ border: 1px solid #C4CFE5;
+ padding: 2px 10px;
+ margin: 2px 0px;
+}
+
+tr.memlist {
+ background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+ text-align: center;
+}
+
+img.formulaDsp {
+
+}
+
+img.formulaInl {
+ vertical-align: middle;
+}
+
+div.center {
+ text-align: center;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding: 0px;
+}
+
+div.center img {
+ border: 0px;
+}
+
+address.footer {
+ text-align: right;
+ padding-right: 12px;
+}
+
+img.footer {
+ border: 0px;
+ vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+ color: #008000
+}
+
+span.keywordtype {
+ color: #604020
+}
+
+span.keywordflow {
+ color: #e08000
+}
+
+span.comment {
+ color: #800000
+}
+
+span.preprocessor {
+ color: #806020
+}
+
+span.stringliteral {
+ color: #002080
+}
+
+span.charliteral {
+ color: #008080
+}
+
+span.vhdldigit {
+ color: #ff00ff
+}
+
+span.vhdlchar {
+ color: #000000
+}
+
+span.vhdlkeyword {
+ color: #700070
+}
+
+span.vhdllogic {
+ color: #ff0000
+}
+
+blockquote {
+ background-color: #F7F8FB;
+ border-left: 2px solid #9CAFD4;
+ margin: 0 24px 0 4px;
+ padding: 0 12px 0 16px;
+}
+
+/* @end */
+
+/*
+.search {
+ color: #003399;
+ font-weight: bold;
+}
+
+form.search {
+ margin-bottom: 0px;
+ margin-top: 0px;
+}
+
+input.search {
+ font-size: 75%;
+ color: #000080;
+ font-weight: normal;
+ background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+ font-size: 75%;
+}
+
+.dirtab {
+ padding: 4px;
+ border-collapse: collapse;
+ border: 1px solid #A3B4D7;
+}
+
+th.dirtab {
+ background: #EBEFF6;
+ font-weight: bold;
+}
+
+hr {
+ height: 0px;
+ border: none;
+ border-top: 1px solid #4A6AAA;
+}
+
+hr.footer {
+ height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+ border-spacing: 0px;
+ padding: 0px;
+}
+
+.memberdecls td, .fieldtable tr {
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+.memberdecls td.glow, .fieldtable tr.glow {
+ background-color: cyan;
+ box-shadow: 0 0 15px cyan;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ background-color: #F9FAFC;
+ border: none;
+ margin: 4px;
+ padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+ padding: 0px 8px 4px 8px;
+ color: #555;
+}
+
+.memSeparator {
+ border-bottom: 1px solid #DEE4F0;
+ line-height: 1px;
+ margin: 0px;
+ padding: 0px;
+}
+
+.memItemLeft, .memTemplItemLeft {
+ white-space: nowrap;
+}
+
+.memItemRight {
+ width: 100%;
+}
+
+.memTemplParams {
+ color: #4665A2;
+ white-space: nowrap;
+ font-size: 80%;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtemplate {
+ font-size: 80%;
+ color: #4665A2;
+ font-weight: normal;
+ margin-left: 9px;
+}
+
+.memnav {
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px;
+}
+
+.mempage {
+ width: 100%;
+}
+
+.memitem {
+ padding: 0;
+ margin-bottom: 10px;
+ margin-right: 5px;
+ -webkit-transition: box-shadow 0.5s linear;
+ -moz-transition: box-shadow 0.5s linear;
+ -ms-transition: box-shadow 0.5s linear;
+ -o-transition: box-shadow 0.5s linear;
+ transition: box-shadow 0.5s linear;
+ display: table !important;
+ width: 100%;
+}
+
+.memitem.glow {
+ box-shadow: 0 0 15px cyan;
+}
+
+.memname {
+ font-weight: bold;
+ margin-left: 6px;
+}
+
+.memname td {
+ vertical-align: bottom;
+}
+
+.memproto, dl.reflist dt {
+ border-top: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 0px 6px 0px;
+ color: #253555;
+ font-weight: bold;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+ /* opera specific markup */
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ /* firefox specific markup */
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ -moz-border-radius-topright: 4px;
+ -moz-border-radius-topleft: 4px;
+ /* webkit specific markup */
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+
+}
+
+.memdoc, dl.reflist dd {
+ border-bottom: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 10px 2px 10px;
+ background-color: #FBFCFD;
+ border-top-width: 0;
+ background-image:url('nav_g.png');
+ background-repeat:repeat-x;
+ background-color: #FFFFFF;
+ /* opera specific markup */
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ /* firefox specific markup */
+ -moz-border-radius-bottomleft: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ /* webkit specific markup */
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+dl.reflist dt {
+ padding: 5px;
+}
+
+dl.reflist dd {
+ margin: 0px 0px 10px 0px;
+ padding: 5px;
+}
+
+.paramkey {
+ text-align: right;
+}
+
+.paramtype {
+ white-space: nowrap;
+}
+
+.paramname {
+ color: #602020;
+ white-space: nowrap;
+}
+.paramname em {
+ font-style: normal;
+}
+.paramname code {
+ line-height: 14px;
+}
+
+.params, .retval, .exception, .tparams {
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+.params .paramname, .retval .paramname {
+ font-weight: bold;
+ vertical-align: top;
+}
+
+.params .paramtype {
+ font-style: italic;
+ vertical-align: top;
+}
+
+.params .paramdir {
+ font-family: "courier new",courier,monospace;
+ vertical-align: top;
+}
+
+table.mlabels {
+ border-spacing: 0px;
+}
+
+td.mlabels-left {
+ width: 100%;
+ padding: 0px;
+}
+
+td.mlabels-right {
+ vertical-align: bottom;
+ padding: 0px;
+ white-space: nowrap;
+}
+
+span.mlabels {
+ margin-left: 8px;
+}
+
+span.mlabel {
+ background-color: #728DC1;
+ border-top:1px solid #5373B4;
+ border-left:1px solid #5373B4;
+ border-right:1px solid #C4CFE5;
+ border-bottom:1px solid #C4CFE5;
+ text-shadow: none;
+ color: white;
+ margin-right: 4px;
+ padding: 2px 3px;
+ border-radius: 3px;
+ font-size: 7pt;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+
+
+/* @end */
+
+/* these are for tree view when not used as main index */
+
+div.directory {
+ margin: 10px 0px;
+ border-top: 1px solid #A8B8D9;
+ border-bottom: 1px solid #A8B8D9;
+ width: 100%;
+}
+
+.directory table {
+ border-collapse:collapse;
+}
+
+.directory td {
+ margin: 0px;
+ padding: 0px;
+ vertical-align: top;
+}
+
+.directory td.entry {
+ white-space: nowrap;
+ padding-right: 6px;
+ padding-top: 3px;
+}
+
+.directory td.entry a {
+ outline:none;
+}
+
+.directory td.entry a img {
+ border: none;
+}
+
+.directory td.desc {
+ width: 100%;
+ padding-left: 6px;
+ padding-right: 6px;
+ padding-top: 3px;
+ border-left: 1px solid rgba(0,0,0,0.05);
+}
+
+.directory tr.even {
+ padding-left: 6px;
+ background-color: #F7F8FB;
+}
+
+.directory img {
+ vertical-align: -30%;
+}
+
+.directory .levels {
+ white-space: nowrap;
+ width: 100%;
+ text-align: right;
+ font-size: 9pt;
+}
+
+.directory .levels span {
+ cursor: pointer;
+ padding-left: 2px;
+ padding-right: 2px;
+ color: #3D578C;
+}
+
+div.dynheader {
+ margin-top: 8px;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+address {
+ font-style: normal;
+ color: #2A3D61;
+}
+
+table.doxtable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+table.doxtable td, table.doxtable th {
+ border: 1px solid #2D4068;
+ padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+ background-color: #374F7F;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+}
+
+table.fieldtable {
+ /*width: 100%;*/
+ margin-bottom: 10px;
+ border: 1px solid #A8B8D9;
+ border-spacing: 0px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+ box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+ padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+ white-space: nowrap;
+ border-right: 1px solid #A8B8D9;
+ border-bottom: 1px solid #A8B8D9;
+ vertical-align: top;
+}
+
+.fieldtable td.fieldname {
+ padding-top: 3px;
+}
+
+.fieldtable td.fielddoc {
+ border-bottom: 1px solid #A8B8D9;
+ /*width: 100%;*/
+}
+
+.fieldtable td.fielddoc p:first-child {
+ margin-top: 0px;
+}
+
+.fieldtable td.fielddoc p:last-child {
+ margin-bottom: 2px;
+}
+
+.fieldtable tr:last-child td {
+ border-bottom: none;
+}
+
+.fieldtable th {
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+ font-size: 90%;
+ color: #253555;
+ padding-bottom: 4px;
+ padding-top: 5px;
+ text-align:left;
+ -moz-border-radius-topleft: 4px;
+ -moz-border-radius-topright: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom: 1px solid #A8B8D9;
+}
+
+
+.tabsearch {
+ top: 0px;
+ left: 10px;
+ height: 36px;
+ background-image: url('tab_b.png');
+ z-index: 101;
+ overflow: hidden;
+ font-size: 13px;
+}
+
+.navpath ul
+{
+ font-size: 11px;
+ background-image:url('tab_b.png');
+ background-repeat:repeat-x;
+ background-position: 0 -5px;
+ height:30px;
+ line-height:30px;
+ color:#8AA0CC;
+ border:solid 1px #C2CDE4;
+ overflow:hidden;
+ margin:0px;
+ padding:0px;
+}
+
+.navpath li
+{
+ list-style-type:none;
+ float:left;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:url('bc_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+}
+
+.navpath li.navelem a
+{
+ height:32px;
+ display:block;
+ text-decoration: none;
+ outline: none;
+ color: #283A5D;
+ font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-decoration: none;
+}
+
+.navpath li.navelem a:hover
+{
+ color:#6884BD;
+}
+
+.navpath li.footer
+{
+ list-style-type:none;
+ float:right;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:none;
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+ font-size: 8pt;
+}
+
+
+div.summary
+{
+ float: right;
+ font-size: 8pt;
+ padding-right: 5px;
+ width: 50%;
+ text-align: right;
+}
+
+div.summary a
+{
+ white-space: nowrap;
+}
+
+div.ingroups
+{
+ font-size: 8pt;
+ width: 50%;
+ text-align: left;
+}
+
+div.ingroups a
+{
+ white-space: nowrap;
+}
+
+div.header
+{
+ background-image:url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: #F9FAFC;
+ margin: 0px;
+ border-bottom: 1px solid #C4CFE5;
+}
+
+div.headertitle
+{
+ padding: 5px 5px 5px 10px;
+}
+
+dl
+{
+ padding: 0 0 0 10px;
+}
+
+/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */
+dl.section
+{
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+dl.note
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #D0C000;
+}
+
+dl.warning, dl.attention
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #00D000;
+}
+
+dl.deprecated
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #505050;
+}
+
+dl.todo
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #00C0E0;
+}
+
+dl.test
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #3030E0;
+}
+
+dl.bug
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #C08050;
+}
+
+dl.section dd {
+ margin-bottom: 6px;
+}
+
+
+#projectlogo
+{
+ text-align: center;
+ vertical-align: bottom;
+ border-collapse: separate;
+}
+
+#projectlogo img
+{
+ border: 0px none;
+}
+
+#projectname
+{
+ border: 0px none;
+ font: 300% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 2px 0px;
+}
+
+#projectbrief
+{
+ font: 60% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#projectnumber
+{
+ font: 80% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#titlearea
+{
+ padding: 0px;
+ margin: 0px;
+ width: 100%;
+ border-bottom: 1px solid #5373B4;
+}
+
+.image
+{
+ text-align: center;
+}
+
+.dotgraph
+{
+ text-align: center;
+}
+
+.mscgraph
+{
+ text-align: center;
+}
+
+.diagraph
+{
+ text-align: center;
+}
+
+.caption
+{
+ font-weight: bold;
+}
+
+div.zoom
+{
+ border: 1px solid #90A5CE;
+}
+
+dl.citelist {
+ margin-bottom:50px;
+}
+
+dl.citelist dt {
+ color:#334975;
+ float:left;
+ font-weight:bold;
+ margin-right:10px;
+ padding:5px;
+}
+
+dl.citelist dd {
+ margin:2px 0;
+ padding:5px 0;
+}
+
+div.toc {
+ padding: 14px 25px;
+ background-color: #F4F6FA;
+ border: 1px solid #D8DFEE;
+ border-radius: 7px 7px 7px 7px;
+ float: right;
+ height: auto;
+ margin: 0 20px 10px 10px;
+ width: 200px;
+}
+
+div.toc li {
+ background: url("bdwn.png") no-repeat scroll 0 5px transparent;
+ font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
+ margin-top: 5px;
+ padding-left: 10px;
+ padding-top: 2px;
+}
+
+div.toc h3 {
+ font: bold 12px/1.2 Arial,FreeSans,sans-serif;
+ color: #4665A2;
+ border-bottom: 0 none;
+ margin: 0;
+}
+
+div.toc ul {
+ list-style: none outside none;
+ border: medium none;
+ padding: 0px;
+}
+
+div.toc li.level1 {
+ margin-left: 0px;
+}
+
+div.toc li.level2 {
+ margin-left: 15px;
+}
+
+div.toc li.level3 {
+ margin-left: 30px;
+}
+
+div.toc li.level4 {
+ margin-left: 45px;
+}
+
+.inherit_header {
+ font-weight: bold;
+ color: gray;
+ cursor: pointer;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.inherit_header td {
+ padding: 6px 0px 2px 5px;
+}
+
+.inherit {
+ display: none;
+}
+
+tr.heading h2 {
+ margin-top: 12px;
+ margin-bottom: 4px;
+}
+
+/* tooltip related style info */
+
+.ttc {
+ position: absolute;
+ display: none;
+}
+
+#powerTip {
+ cursor: default;
+ white-space: nowrap;
+ background-color: white;
+ border: 1px solid gray;
+ border-radius: 4px 4px 4px 4px;
+ box-shadow: 1px 1px 7px gray;
+ display: none;
+ font-size: smaller;
+ max-width: 80%;
+ opacity: 0.9;
+ padding: 1ex 1em 1em;
+ position: absolute;
+ z-index: 2147483647;
+}
+
+#powerTip div.ttdoc {
+ color: grey;
+ font-style: italic;
+}
+
+#powerTip div.ttname a {
+ font-weight: bold;
+}
+
+#powerTip div.ttname {
+ font-weight: bold;
+}
+
+#powerTip div.ttdeci {
+ color: #006318;
+}
+
+#powerTip div {
+ margin: 0px;
+ padding: 0px;
+ font: 12px/16px Roboto,sans-serif;
+}
+
+#powerTip:before, #powerTip:after {
+ content: "";
+ position: absolute;
+ margin: 0px;
+}
+
+#powerTip.n:after, #powerTip.n:before,
+#powerTip.s:after, #powerTip.s:before,
+#powerTip.w:after, #powerTip.w:before,
+#powerTip.e:after, #powerTip.e:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.nw:after, #powerTip.nw:before,
+#powerTip.sw:after, #powerTip.sw:before {
+ border: solid transparent;
+ content: " ";
+ height: 0;
+ width: 0;
+ position: absolute;
+}
+
+#powerTip.n:after, #powerTip.s:after,
+#powerTip.w:after, #powerTip.e:after,
+#powerTip.nw:after, #powerTip.ne:after,
+#powerTip.sw:after, #powerTip.se:after {
+ border-color: rgba(255, 255, 255, 0);
+}
+
+#powerTip.n:before, #powerTip.s:before,
+#powerTip.w:before, #powerTip.e:before,
+#powerTip.nw:before, #powerTip.ne:before,
+#powerTip.sw:before, #powerTip.se:before {
+ border-color: rgba(128, 128, 128, 0);
+}
+
+#powerTip.n:after, #powerTip.n:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.nw:after, #powerTip.nw:before {
+ top: 100%;
+}
+
+#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after {
+ border-top-color: #ffffff;
+ border-width: 10px;
+ margin: 0px -10px;
+}
+#powerTip.n:before {
+ border-top-color: #808080;
+ border-width: 11px;
+ margin: 0px -11px;
+}
+#powerTip.n:after, #powerTip.n:before {
+ left: 50%;
+}
+
+#powerTip.nw:after, #powerTip.nw:before {
+ right: 14px;
+}
+
+#powerTip.ne:after, #powerTip.ne:before {
+ left: 14px;
+}
+
+#powerTip.s:after, #powerTip.s:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.sw:after, #powerTip.sw:before {
+ bottom: 100%;
+}
+
+#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after {
+ border-bottom-color: #ffffff;
+ border-width: 10px;
+ margin: 0px -10px;
+}
+
+#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before {
+ border-bottom-color: #808080;
+ border-width: 11px;
+ margin: 0px -11px;
+}
+
+#powerTip.s:after, #powerTip.s:before {
+ left: 50%;
+}
+
+#powerTip.sw:after, #powerTip.sw:before {
+ right: 14px;
+}
+
+#powerTip.se:after, #powerTip.se:before {
+ left: 14px;
+}
+
+#powerTip.e:after, #powerTip.e:before {
+ left: 100%;
+}
+#powerTip.e:after {
+ border-left-color: #ffffff;
+ border-width: 10px;
+ top: 50%;
+ margin-top: -10px;
+}
+#powerTip.e:before {
+ border-left-color: #808080;
+ border-width: 11px;
+ top: 50%;
+ margin-top: -11px;
+}
+
+#powerTip.w:after, #powerTip.w:before {
+ right: 100%;
+}
+#powerTip.w:after {
+ border-right-color: #ffffff;
+ border-width: 10px;
+ top: 50%;
+ margin-top: -10px;
+}
+#powerTip.w:before {
+ border-right-color: #808080;
+ border-width: 11px;
+ top: 50%;
+ margin-top: -11px;
+}
+
+@media print
+{
+ #top { display: none; }
+ #side-nav { display: none; }
+ #nav-path { display: none; }
+ body { overflow:visible; }
+ h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+ .summary { display: none; }
+ .memitem { page-break-inside: avoid; }
+ #doc-content
+ {
+ margin-left:0 !important;
+ height:auto !important;
+ width:auto !important;
+ overflow:inherit;
+ display:inline;
+ }
+}
+
diff --git a/src/common/example/CGAL_3D_points_off_reader.cpp b/src/common/example/CGAL_3D_points_off_reader.cpp
new file mode 100644
index 00000000..d48bb17d
--- /dev/null
+++ b/src/common/example/CGAL_3D_points_off_reader.cpp
@@ -0,0 +1,41 @@
+#include <gudhi/Points_3D_off_io.h>
+
+#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
+
+#include <iostream>
+#include <string>
+#include <vector>
+
+using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
+using Point_3 = Kernel::Point_3;
+
+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_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> point_cloud = off_reader.get_point_cloud();
+
+ int n {0};
+ for (auto point : point_cloud) {
+ ++n;
+ std::cout << "Point[" << n << "] = (" << point[0] << ", " << point[1] << ", " << point[2] << ")\n";
+ }
+ return 0;
+}
diff --git a/src/common/example/CGAL_points_off_reader.cpp b/src/common/example/CGAL_points_off_reader.cpp
new file mode 100644
index 00000000..d1ca166d
--- /dev/null
+++ b/src/common/example/CGAL_points_off_reader.cpp
@@ -0,0 +1,46 @@
+#include <gudhi/Points_off_io.h>
+
+// For CGAL points type in dimension d
+// cf. http://doc.cgal.org/latest/Kernel_d/classCGAL_1_1Point__d.html
+#include <CGAL/Epick_d.h>
+
+#include <iostream>
+#include <string>
+#include <vector>
+
+using Kernel = CGAL::Epick_d< CGAL::Dynamic_dimension_tag >;
+using Point_d = Kernel::Point_d;
+
+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 (int i {0}; i < point.dimension(); i++)
+ std::cout << point[i] << " ";
+ std::cout << "\n";
+ ++n;
+ }
+ return 0;
+}
diff --git a/src/common/example/CMakeLists.txt b/src/common/example/CMakeLists.txt
new file mode 100644
index 00000000..0da3dcc0
--- /dev/null
+++ b/src/common/example/CMakeLists.txt
@@ -0,0 +1,17 @@
+cmake_minimum_required(VERSION 2.6)
+project(Common_examples)
+
+# need CGAL 4.7
+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)
+
+ 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)
+endif()
diff --git a/src/common/example/cgal3Doffreader_result.txt b/src/common/example/cgal3Doffreader_result.txt
new file mode 100644
index 00000000..f992c8e3
--- /dev/null
+++ b/src/common/example/cgal3Doffreader_result.txt
@@ -0,0 +1,8 @@
+Point[1] = (0.959535, -0.418347, 0.302237)
+Point[2] = (2.16795, 1.85348, -0.52312)
+Point[3] = (-2.38753, -1.50911, -0.565889)
+Point[4] = (-2.70428, -1.25688, 0.188394)
+Point[5] = (-1.22932, -1.64337, -0.998632)
+...
+Point[300] = (-0.56244, 2.6018, -0.749591)
+
diff --git a/src/common/example/cgaloffreader_result.txt b/src/common/example/cgaloffreader_result.txt
new file mode 100644
index 00000000..1deb8dbd
--- /dev/null
+++ b/src/common/example/cgaloffreader_result.txt
@@ -0,0 +1,7 @@
+Point[0] = 1 1
+Point[1] = 7 0
+Point[2] = 4 6
+Point[3] = 9 6
+Point[4] = 0 14
+Point[5] = 2 19
+Point[6] = 9 17
diff --git a/src/common/include/gudhi/Clock.h b/src/common/include/gudhi/Clock.h
index 08096c05..04c6ffb9 100644
--- a/src/common/include/gudhi/Clock.h
+++ b/src/common/include/gudhi/Clock.h
@@ -1,82 +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): 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 GUDHI_CLOCK_H_
-#define GUDHI_CLOCK_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.
+ *
+ * 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 CLOCK_H_
+#define CLOCK_H_
#include <boost/date_time/posix_time/posix_time.hpp>
-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_;
- }
-
-
- void begin() const{
- end_called = false;
- startTime = boost::posix_time::microsec_clock::local_time( );
- }
-
- void end() const{
- end_called = true;
- endTime = boost::posix_time::microsec_clock::local_time( );
- }
-
- 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.end_called) stream << "end not called";
- else{
- stream << clock.msg <<":"<<clock.num_seconds() <<"s";
- }
- return stream;
-
- }
-
- double num_seconds() const{
- if(!end_called) return -1;
- return (endTime-startTime).total_milliseconds()/1000.;
- }
-
-private:
- mutable boost::posix_time::ptime startTime, endTime;
- mutable bool end_called;
- std::string msg;
-
+#include <string>
+
+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_;
+ }
+
+ void begin() const {
+ end_called = false;
+ startTime = boost::posix_time::microsec_clock::local_time();
+ }
+
+ void end() const {
+ end_called = true;
+ endTime = boost::posix_time::microsec_clock::local_time();
+ }
+
+ 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.end_called) {
+ stream << "end not called";
+ } else {
+ stream << clock.msg << ":" << clock.num_seconds() << "s";
+ }
+ return stream;
+ }
+
+ double num_seconds() const {
+ if (!end_called) return -1;
+ return (endTime - startTime).total_milliseconds() / 1000.;
+ }
+
+ private:
+ mutable boost::posix_time::ptime startTime, endTime;
+ mutable bool end_called;
+ std::string msg;
};
-
-#endif /* GUDHI_CLOCK_H_ */
+#endif // CLOCK_H_
diff --git a/src/common/include/gudhi/Debug_utils.h b/src/common/include/gudhi/Debug_utils.h
new file mode 100644
index 00000000..7573a9db
--- /dev/null
+++ b/src/common/include/gudhi/Debug_utils.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): 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 DEBUG_UTILS_H_
+#define DEBUG_UTILS_H_
+
+#include <iostream>
+
+#ifndef NDEBUG
+ // GUDHI_DEBUG is the Gudhi official flag for debug mode.
+ #define GUDHI_DEBUG
+#endif
+
+// GUDHI_CHECK throw an exception if expression is false in debug mode, but does nothing in release mode
+// Could assert in release mode, but cmake sets NDEBUG (for "NO DEBUG") in this mode, means assert does nothing.
+#ifdef GUDHI_DEBUG
+ #define GUDHI_CHECK(expression, excpt) if ((expression) == 0) throw excpt
+#else
+ #define GUDHI_CHECK(expression, excpt) (void) 0
+#endif
+
+#define PRINT(a) std::cerr << #a << ": " << (a) << " (DISP)" << std::endl
+
+// #define DBG_VERBOSE
+#ifdef DBG_VERBOSE
+ #define DBG(a) std::cout << "DBG: " << (a) << std::endl
+ #define DBGMSG(a, b) std::cout << "DBG: " << a << b << std::endl
+ #define DBGVALUE(a) std::cout << "DBG: " << #a << ": " << a << std::endl
+ #define DBGCONT(a) std::cout << "DBG: container " << #a << " -> "; for (auto x : a) std::cout << x << ","; std::cout << std::endl
+#else
+ #define DBG(a) (void) 0
+ #define DBGMSG(a, b) (void) 0
+ #define DBGVALUE(a) (void) 0
+ #define DBGCONT(a) (void) 0
+#endif
+
+#endif // DEBUG_UTILS_H_
diff --git a/src/common/include/gudhi/Off_reader.h b/src/common/include/gudhi/Off_reader.h
index e29218d8..4fcd2af2 100644
--- a/src/common/include/gudhi/Off_reader.h
+++ b/src/common/include/gudhi/Off_reader.h
@@ -1,13 +1,10 @@
-/*
- * Off_reader.h
- * Created on: Nov 28, 2014
- * This file is part of the Gudhi Library. The Gudhi library
+/* 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-Méditerranée (France)
+ * 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
@@ -25,174 +22,163 @@
*/
-#ifndef GUDHI_OFF_READER_H_
-#define GUDHI_OFF_READER_H_
+#ifndef OFF_READER_H_
+#define OFF_READER_H_
#include <sstream>
#include <iostream>
#include <iterator>
-
+#include <string>
+#include <vector>
+#include <fstream>
namespace Gudhi {
-/**
- * Read an off file and calls a visitor methods while reading it.
- * An off file must have its first/snd line in this format :
- * OFF
- * num_vert num_faces num_edges
- *
- * A noff file must have its first/snd line in this format :
- * nOFF
- * dim num_vert num_faces num_edges
- *
- * The number of edges num_edges is optional and can be left to zero.
+/** \brief OFF file reader top class visitor.
+ *
+ * OFF file must be conform to format described here :
+ * http://www.geomview.org/docs/html/OFF.html
*/
-class Off_reader{
-public:
- Off_reader(std::ifstream& stream):stream_(stream){
- }
-// Off_reader(const std::string& name):stream_(name){
-// if(!stream_.is_open())
-// std::cerr <<"could not open file \n";
-// }
-
- ~Off_reader(){
- stream_.close();
- }
-
- /**
- * read an off file and calls the following methods :
- * void init(int dim,int num_vertices,int num_faces,int num_edges); //num_edges may not be set
- * void point(const std::vector<double>& point);
- * void maximal_face(const std::list<int>& face);
- * void done();
- * of the visitor when reading a point or a maximal face.
- */
- template<typename OffVisitor>
- bool read(OffVisitor& off_visitor){
- bool success_read_off_preambule = read_off_preambule(off_visitor);
- if(!success_read_off_preambule) {
- std::cerr <<"could not read off preambule\n";
- return false;
- }
-
- bool success_read_off_points = read_off_points(off_visitor);
- if(!success_read_off_points) {
- std::cerr <<"could not read off points\n";
- return false;
- }
-
- bool success_read_off_faces = read_off_faces(off_visitor);
- if(!success_read_off_faces) {
- std::cerr <<"could not read off faces\n";
- return false;
- }
-
- off_visitor.done();
- return success_read_off_preambule && success_read_off_points && success_read_off_faces;
- }
-
-private:
- std::ifstream& stream_;
-
- struct Off_info{
- int dim;
- int num_vertices;
- int num_edges;
- int num_faces;
- };
-
- Off_info off_info_;
-
- template<typename OffVisitor>
- bool read_off_preambule(OffVisitor& off_visitor){
- std::string line;
- if(!goto_next_uncomment_line(line)) return false;
-
- bool is_off_file = (line.find("OFF") != std::string::npos);
- bool is_noff_file = (line.find("nOFF") != std::string::npos);
-
- if(!is_off_file && !is_noff_file) {
- std::cerr << line<<std::endl;
- std::cerr << "missing off header\n";
- return false;
- }
-
- if(!goto_next_uncomment_line(line)) return false;
- std::istringstream iss(line);
- if(is_off_file){
- off_info_.dim = 3;
- if(!(iss >> off_info_.num_vertices >> off_info_.num_faces >> off_info_.num_edges)){
- std::cerr << "incorrect number of vertices/faces/edges\n";
- return false;
- }
- }
- else
- if(!(iss >> off_info_.dim >> off_info_.num_vertices >> off_info_.num_faces >> off_info_.num_edges)){
- std::cerr << "incorrect number of vertices/faces/edges\n";
- return false;
- }
- off_visitor.init(off_info_.dim,off_info_.num_vertices,off_info_.num_faces,off_info_.num_edges);
-
- return true;
- }
-
- bool goto_next_uncomment_line(std::string& uncomment_line){
- uncomment_line.clear();
- do
- std::getline(stream_, uncomment_line);
- while(uncomment_line[0] == '%');// || uncomment_line.empty());
- return (uncomment_line.size()>0 && uncomment_line[0] != '%');
- }
-
-
- template<typename OffVisitor>
- bool read_off_points(OffVisitor& visitor){
- int num_vertices_to_read = off_info_.num_vertices;
- while(num_vertices_to_read--){
- std::string line;
- if(!goto_next_uncomment_line(line)) return false;
- std::vector<double> point;
- std::istringstream iss(line);
- point.assign(std::istream_iterator<double>(iss),std::istream_iterator<double>());
-// if(point.size() != off_info_.dim) return false;
- visitor.point(point);
- }
- return true;
- }
-
- template<typename OffVisitor>
- bool read_off_faces(OffVisitor& visitor){
- std::string line;
- while(goto_next_uncomment_line(line)){
- std::istringstream iss(line);
- int num_face_vertices;
- iss >> num_face_vertices;
- std::vector<int> face;
- face.assign(std::istream_iterator<int>(iss),std::istream_iterator<int>());
- if(!face.size() == off_info_.num_vertices) return false;
- visitor.maximal_face(face);
- }
- return true;
- }
+class Off_reader {
+ public:
+ Off_reader(std::ifstream& stream) : stream_(stream) { }
+
+ ~Off_reader() {
+ stream_.close();
+ }
+
+ /** \brief
+ * Read an OFF file and calls the following methods :
+ *
+ * <CODE>void init(int dim,int num_vertices,int num_faces,int num_edges); // from file header - num_edges may not be set
+ *
+ * void point(const std::vector<double>& point); // for each point read
+ *
+ * void maximal_face(const std::list<int>& face); // for each face read
+ *
+ * void done(); // upon file read is finished</CODE>
+ *
+ * of the visitor when reading a point or a maximal face. Edges are not taken into account.
+ */
+ template<typename OffVisitor>
+ bool read(OffVisitor& off_visitor) {
+ bool success_read_off_preambule = read_off_preambule(off_visitor);
+ if (!success_read_off_preambule) {
+ std::cerr << "could not read off preambule\n";
+ return false;
+ }
+
+ bool success_read_off_points = read_off_points(off_visitor);
+ if (!success_read_off_points) {
+ std::cerr << "could not read off points\n";
+ return false;
+ }
+
+ bool success_read_off_faces = read_off_faces(off_visitor);
+ if (!success_read_off_faces) {
+ std::cerr << "could not read off faces\n";
+ return false;
+ }
+
+ off_visitor.done();
+ return success_read_off_preambule && success_read_off_points && success_read_off_faces;
+ }
+
+ private:
+ std::ifstream& stream_;
+
+ struct Off_info {
+ int dim;
+ int num_vertices;
+ int num_edges;
+ int num_faces;
+ };
+
+ Off_info off_info_;
+
+ template<typename OffVisitor>
+ bool read_off_preambule(OffVisitor& off_visitor) {
+ std::string line;
+ if (!goto_next_uncomment_line(line)) return false;
+
+ bool is_off_file = (line.find("OFF") != std::string::npos);
+ bool is_noff_file = (line.find("nOFF") != std::string::npos);
+
+ if (!is_off_file && !is_noff_file) {
+ std::cerr << line << std::endl;
+ std::cerr << "missing off header\n";
+ return false;
+ }
+
+ if (!goto_next_uncomment_line(line)) return false;
+ std::istringstream iss(line);
+ if ((is_off_file) && (!is_noff_file)) {
+ off_info_.dim = 3;
+ if (!(iss >> off_info_.num_vertices >> off_info_.num_faces >> off_info_.num_edges)) {
+ std::cerr << "incorrect number of vertices/faces/edges\n";
+ return false;
+ }
+ } else {
+ if (!(iss >> off_info_.dim >> off_info_.num_vertices >> off_info_.num_faces >> off_info_.num_edges)) {
+ std::cerr << "incorrect number of vertices/faces/edges\n";
+ return false;
+ }
+ }
+ off_visitor.init(off_info_.dim, off_info_.num_vertices, off_info_.num_faces, off_info_.num_edges);
+
+ return true;
+ }
+
+ bool goto_next_uncomment_line(std::string& uncomment_line) {
+ uncomment_line.clear();
+ do
+ std::getline(stream_, uncomment_line); while (uncomment_line[0] == '%');
+ return (uncomment_line.size() > 0 && uncomment_line[0] != '%');
+ }
+
+ template<typename OffVisitor>
+ bool read_off_points(OffVisitor& visitor) {
+ int num_vertices_to_read = off_info_.num_vertices;
+ while (num_vertices_to_read--) {
+ std::string line;
+ if (!goto_next_uncomment_line(line)) return false;
+ std::vector<double> point;
+ std::istringstream iss(line);
+ point.assign(std::istream_iterator<double>(iss), std::istream_iterator<double>());
+ // if(point.size() != off_info_.dim) return false;
+ visitor.point(point);
+ }
+ return true;
+ }
+
+ template<typename OffVisitor>
+ bool read_off_faces(OffVisitor& visitor) {
+ std::string line;
+ while (goto_next_uncomment_line(line)) {
+ std::istringstream iss(line);
+ int num_face_vertices;
+ iss >> num_face_vertices;
+ std::vector<int> face;
+ face.assign(std::istream_iterator<int>(iss), std::istream_iterator<int>());
+ // if (face.size() != (off_info_.dim + 1)) return false;
+ visitor.maximal_face(face);
+ }
+ return true;
+ }
};
-
template<typename OFFVisitor>
-void read_off(const std::string& name_file_off,OFFVisitor& vis){
- std::ifstream stream(name_file_off);
- if(!stream.is_open())
- std::cerr <<"could not open file \n";
- else{
- Off_reader off_reader(stream);
- off_reader.read(vis);
- }
+void read_off(const std::string& name_file_off, OFFVisitor& vis) {
+ std::ifstream stream(name_file_off);
+ if (!stream.is_open()) {
+ std::cerr << "could not open file \n";
+ } else {
+ Off_reader off_reader(stream);
+ off_reader.read(vis);
+ }
}
-
-
} // namespace Gudhi
-
-#endif /* GUDHI_OFF_READER_H_ */
+#endif // OFF_READER_H_
diff --git a/src/common/include/gudhi/Point.h b/src/common/include/gudhi/Point.h
index 4023445b..0479e71e 100644
--- a/src/common/include/gudhi/Point.h
+++ b/src/common/include/gudhi/Point.h
@@ -1,13 +1,10 @@
-/*
- * Basic_geometry.h
- * Created on: Feb 10, 2015
- * This file is part of the Gudhi Library. The Gudhi library
+/* 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-Méditerranée (France)
+ * 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
@@ -24,9 +21,8 @@
*
*/
-
-#ifndef BASIC_GEOMETRY_H_
-#define BASIC_GEOMETRY_H_
+#ifndef POINT_H_
+#define POINT_H_
#include <cmath>
#include <vector>
@@ -34,143 +30,141 @@
#include <cstddef>
#include <initializer_list>
-class Point_d{
-public:
- Point_d(size_t dim=3):coords_(dim,0){}
- Point_d(const Point_d& other):coords_(other.coords_){}
- Point_d(const std::initializer_list<double>& list):coords_(list) {
- }
- template<typename CoordsIt>
- Point_d(CoordsIt begin,CoordsIt end):coords_(begin,end){}
-
- size_t dimension() const{
- return coords_.size();
- }
-
- double x() const{
- return coords_[0];
- }
-
- double y() const{
- return coords_[1];
- }
-
- double z() const{
- return coords_[2];
- }
-
- double& x(){
- return coords_[0];
- }
-
- double& y(){
- return coords_[1];
- }
-
- double& z(){
- return coords_[2];
- }
-
- std::vector<double>::const_iterator begin() const{
- return coords_.begin();
- }
-
- std::vector<double>::const_iterator end() const{
- return coords_.end();
- }
-
- double& operator[](unsigned i){
- return coords_[i];
- }
- const double& operator[](unsigned i) const{
- return coords_[i];
- }
-
- double squared_norm() const{
- double res = 0;
- for(auto x : coords_)
- res+= x*x;
- return res;
- }
-
- friend double squared_dist(const Point_d& p1,const Point_d& p2){
- assert(p1.dimension()==p2.dimension());
- double res = 0;
- for(unsigned i = 0; i < p1.coords_.size(); ++i)
- res+= (p1[i]-p2[i])*(p1[i]-p2[i]);
- return res;
- }
-
- /**
- * dot product
- */
- double operator*(const Point_d& other) const{
- assert(dimension()==other.dimension());
- double res = 0;
- for(unsigned i = 0; i < coords_.size(); ++i)
- res+= coords_[i]*other[i];
- return res;
- }
-
- /**
- * only if points have dimension 3
- */
- Point_d cross_product(const Point_d& other){
- assert(dimension()==3 && other.dimension()==3);
- Point_d res(3);
- res[0] = (*this)[1] * other[2] - (*this)[2] * other[1];
- res[1] = (*this)[2] * other[0] - (*this)[0] * other[2];
- res[2] = (*this)[0] * other[1] - (*this)[1] * other[0];
- return res;
- }
-
- Point_d operator+(const Point_d& other) const{
- assert(dimension()==other.dimension());
- Point_d res(dimension());
- for(unsigned i = 0; i < coords_.size(); ++i)
- res[i] = (*this)[i] + other[i];
- return res;
- }
-
- Point_d operator*(double lambda) const{
- Point_d res(dimension());
- for(unsigned i = 0; i < coords_.size(); ++i)
- res[i] = (*this)[i] * lambda;
- return res;
- }
-
- Point_d operator/(double lambda) const{
- Point_d res(dimension());
- for(unsigned i = 0; i < coords_.size(); ++i)
- res[i] = (*this)[i] / lambda;
- return res;
- }
-
- Point_d operator-(const Point_d& other) const{
- assert(dimension()==other.dimension());
- Point_d res(dimension());
- for(unsigned i = 0; i < coords_.size(); ++i)
- res[i] = (*this)[i] - other[i];
- return res;
- }
-
- friend Point_d unit_normal(const Point_d& p1,const Point_d& p2,const Point_d& p3){
- assert(p1.dimension()==3);
- assert(p2.dimension()==3);
- assert(p3.dimension()==3);
- Point_d p1p2 = p2 - p1;
- Point_d p1p3 = p3 - p1;
- Point_d res(p1p2.cross_product(p1p3));
- return res / std::sqrt(res.squared_norm());
- }
-
-
-private:
- std::vector<double> coords_;
+class Point_d {
+ public:
+ Point_d(size_t dim = 3) : coords_(dim, 0) { }
+
+ Point_d(const Point_d& other) : coords_(other.coords_) { }
+
+ Point_d(const std::initializer_list<double>& list) : coords_(list) { }
+
+ template<typename CoordsIt>
+ Point_d(CoordsIt begin, CoordsIt end) : coords_(begin, end) { }
+
+ size_t dimension() const {
+ return coords_.size();
+ }
+
+ double x() const {
+ return coords_[0];
+ }
+
+ double y() const {
+ return coords_[1];
+ }
+
+ double z() const {
+ return coords_[2];
+ }
+
+ double& x() {
+ return coords_[0];
+ }
+
+ double& y() {
+ return coords_[1];
+ }
+
+ double& z() {
+ return coords_[2];
+ }
+
+ std::vector<double>::const_iterator begin() const {
+ return coords_.begin();
+ }
+
+ std::vector<double>::const_iterator end() const {
+ return coords_.end();
+ }
+
+ double& operator[](unsigned i) {
+ return coords_[i];
+ }
+
+ const double& operator[](unsigned i) const {
+ return coords_[i];
+ }
+
+ double squared_norm() const {
+ double res = 0;
+ for (auto x : coords_)
+ res += x * x;
+ return res;
+ }
+
+ friend double squared_dist(const Point_d& p1, const Point_d& p2) {
+ assert(p1.dimension() == p2.dimension());
+ double res = 0;
+ for (unsigned i = 0; i < p1.coords_.size(); ++i)
+ res += (p1[i] - p2[i])*(p1[i] - p2[i]);
+ return res;
+ }
+
+ /**
+ * dot product
+ */
+ double operator*(const Point_d& other) const {
+ assert(dimension() == other.dimension());
+ double res = 0;
+ for (unsigned i = 0; i < coords_.size(); ++i)
+ res += coords_[i] * other[i];
+ return res;
+ }
+
+ /**
+ * only if points have dimension 3
+ */
+ Point_d cross_product(const Point_d& other) {
+ assert(dimension() == 3 && other.dimension() == 3);
+ Point_d res(3);
+ res[0] = (*this)[1] * other[2] - (*this)[2] * other[1];
+ res[1] = (*this)[2] * other[0] - (*this)[0] * other[2];
+ res[2] = (*this)[0] * other[1] - (*this)[1] * other[0];
+ return res;
+ }
+
+ Point_d operator+(const Point_d& other) const {
+ assert(dimension() == other.dimension());
+ Point_d res(dimension());
+ for (unsigned i = 0; i < coords_.size(); ++i)
+ res[i] = (*this)[i] + other[i];
+ return res;
+ }
+
+ Point_d operator*(double lambda) const {
+ Point_d res(dimension());
+ for (unsigned i = 0; i < coords_.size(); ++i)
+ res[i] = (*this)[i] * lambda;
+ return res;
+ }
+
+ Point_d operator/(double lambda) const {
+ Point_d res(dimension());
+ for (unsigned i = 0; i < coords_.size(); ++i)
+ res[i] = (*this)[i] / lambda;
+ return res;
+ }
+
+ Point_d operator-(const Point_d& other) const {
+ assert(dimension() == other.dimension());
+ Point_d res(dimension());
+ for (unsigned i = 0; i < coords_.size(); ++i)
+ res[i] = (*this)[i] - other[i];
+ return res;
+ }
+
+ friend Point_d unit_normal(const Point_d& p1, const Point_d& p2, const Point_d& p3) {
+ assert(p1.dimension() == 3);
+ assert(p2.dimension() == 3);
+ assert(p3.dimension() == 3);
+ Point_d p1p2 = p2 - p1;
+ Point_d p1p3 = p3 - p1;
+ Point_d res(p1p2.cross_product(p1p3));
+ return res / std::sqrt(res.squared_norm());
+ }
+
+ private:
+ std::vector<double> coords_;
};
-
-
-
-
-#endif /* BASIC_GEOMETRY_H_ */
+#endif // POINT_H_
diff --git a/src/common/include/gudhi/Points_3D_off_io.h b/src/common/include/gudhi/Points_3D_off_io.h
new file mode 100644
index 00000000..2647f11e
--- /dev/null
+++ b/src/common/include/gudhi/Points_3D_off_io.h
@@ -0,0 +1,202 @@
+/* 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 POINTS_3D_OFF_IO_H_
+#define POINTS_3D_OFF_IO_H_
+
+#include <gudhi/Off_reader.h>
+
+#include <string>
+#include <vector>
+#include <fstream>
+#include <map>
+
+namespace Gudhi {
+
+/**
+ * @brief OFF file visitor implementation according to Off_reader in order to read points from an OFF file.
+ */
+template<typename Point_3>
+class Points_3D_off_visitor_reader {
+ private:
+ std::vector<Point_3> point_cloud_;
+ bool valid_;
+
+ public:
+ /** @brief Off_reader visitor init implementation.
+ *
+ * The init parameters are set from OFF file header.
+ * Dimension value is required and the value must be 3.
+ *
+ * @param[in] dim space dimension of vertices.
+ * @param[in] num_vertices number of vertices in the OFF file (not used).
+ * @param[in] num_faces number of faces in the OFF file (not used).
+ * @param[in] num_edges number of edges in the OFF file (not used).
+ */
+ void init(int dim, int num_vertices, int num_faces, int num_edges) {
+#ifdef DEBUG_TRACES
+ std::cout << "Points_3D_off_visitor_reader::init - dim=" << dim << " - num_vertices=" <<
+ num_vertices << " - num_faces=" << num_faces << " - num_edges=" << num_edges << std::endl;
+#endif // DEBUG_TRACES
+ if (dim == 3) {
+ valid_ = true;
+ } else {
+ valid_ = false;
+ std::cerr << "Points_3D_off_reader::Points_3D_off_reader cannot read OFF files in dimension " << dim << "\n";
+ }
+
+ if (num_faces > 0) {
+ std::cerr << "Points_3D_off_visitor_reader::init faces are not taken into account from OFF file for Points.\n";
+ }
+ if (num_edges > 0) {
+ std::cerr << "Points_3D_off_visitor_reader::init edges are not taken into account from OFF file for Points.\n";
+ }
+ }
+
+ /** @brief Off_reader visitor point implementation.
+ *
+ * The point function is called on each vertex line from OFF file.
+ * This function inserts the vertex in the vector of points.
+ *
+ * @param[in] point vector of vertex coordinates.
+ *
+ * @details
+ * Point_3 must have a constructor with the following form:
+ *
+ * @code template<class InputIterator > Point_3::Point_3(double x, double y, double z) @endcode
+ */
+ void point(const std::vector<double>& point) {
+ if (valid_) {
+#ifdef DEBUG_TRACES
+ std::cout << "Points_3D_off_visitor_reader::point ";
+ for (auto coordinate : point) {
+ std::cout << coordinate << " | ";
+ }
+ std::cout << std::endl;
+#endif // DEBUG_TRACES
+ // Fill the point cloud
+ point_cloud_.push_back(Point_3(point[0], point[1], point[2]));
+ }
+ }
+
+ // Off_reader visitor maximal_face implementation - Only points are read
+
+ void maximal_face(const std::vector<int>& face) { }
+
+ // Off_reader visitor done implementation - Only points are read
+
+ void done() { }
+
+ /** @brief Point cloud getter.
+ *
+ * @return The point cloud.
+ */
+ const std::vector<Point_3>& get_point_cloud() const {
+ return point_cloud_;
+ }
+
+ /** @brief Returns if the OFF file read operation was successful or not.
+ *
+ * @return OFF file read status.
+ */
+ bool is_valid() const {
+ return valid_;
+ }
+};
+
+/**
+ * \@brief OFF file reader implementation in order to read dimension 3 points from an OFF file.
+ *
+ * @details
+ * This class is using the Points_3D_off_visitor_reader to visit the OFF file according to Off_reader.
+ *
+ * Point_3 must have a constructor with the following form:
+ *
+ * @code template<class InputIterator > Point_3::Point_3(double x, double y, double z) @endcode
+ *
+ * @section 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
+ *
+ * When launching:
+ *
+ * @code $> ./cgal3Doffreader ../../data/points/tore3D_300.off
+ * @endcode
+ *
+ * the program output is:
+ *
+ * @include common/cgal3Doffreader_result.txt
+ */
+template<typename Point_3>
+class Points_3D_off_reader {
+ public:
+ /** @brief Reads the OFF file and constructs a vector of points from the points
+ * that are in the OFF file.
+ *
+ * @param[in] name_file OFF file to read.
+ *
+ * @post Check with is_valid() function to see if read operation was successful.
+ */
+ Points_3D_off_reader(const std::string& name_file)
+ : valid_(false) {
+ std::ifstream stream(name_file);
+ if (stream.is_open()) {
+ Off_reader off_reader(stream);
+ Points_3D_off_visitor_reader<Point_3> off_visitor;
+ valid_ = off_reader.read(off_visitor);
+ valid_ = valid_ && off_visitor.is_valid();
+ if (valid_) {
+ point_cloud = off_visitor.get_point_cloud();
+ }
+ } else {
+ std::cerr << "Points_3D_off_reader::Points_3D_off_reader could not open file " << name_file << "\n";
+ }
+ }
+
+ /** @brief Returns if the OFF file read operation was successful or not.
+ *
+ * @return OFF file read status.
+ */
+ bool is_valid() const {
+ return valid_;
+ }
+
+ /** @brief Point cloud getter.
+ *
+ * @return point_cloud.
+ */
+ const std::vector<Point_3>& get_point_cloud() const {
+ return point_cloud;
+ }
+
+ private:
+ /** @brief point_cloud.*/
+ std::vector<Point_3> point_cloud;
+ /** @brief OFF file read status.*/
+ bool valid_;
+};
+
+} // namespace Gudhi
+
+#endif // POINTS_3D_OFF_IO_H_
diff --git a/src/common/include/gudhi/Points_off_io.h b/src/common/include/gudhi/Points_off_io.h
new file mode 100644
index 00000000..74b49386
--- /dev/null
+++ b/src/common/include/gudhi/Points_off_io.h
@@ -0,0 +1,184 @@
+/* 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 POINTS_OFF_IO_H_
+#define POINTS_OFF_IO_H_
+
+#include <gudhi/Off_reader.h>
+
+#include <string>
+#include <vector>
+#include <fstream>
+#include <map>
+
+namespace Gudhi {
+
+/**
+ * \brief OFF file visitor implementation according to Off_reader in order to read points from an OFF file.
+ */
+template<typename Point_d>
+class Points_off_visitor_reader {
+ private:
+ std::vector<Point_d> point_cloud;
+
+ public:
+ /** \brief Off_reader visitor init implementation.
+ *
+ * The init parameters are set from OFF file header.
+ * Dimension value is required in order to construct a vector of points.
+ *
+ * @param[in] dim space dimension of vertices.
+ * @param[in] num_vertices number of vertices in the OFF file (not used).
+ * @param[in] num_faces number of faces in the OFF file (not used).
+ * @param[in] num_edges number of edges in the OFF file (not used).
+ */
+ void init(int dim, int num_vertices, int num_faces, int num_edges) {
+#ifdef DEBUG_TRACES
+ std::cout << "Points_off_visitor_reader::init - dim=" << dim << " - num_vertices=" <<
+ num_vertices << " - num_faces=" << num_faces << " - num_edges=" << num_edges << std::endl;
+#endif // DEBUG_TRACES
+ if (num_faces > 0) {
+ std::cerr << "Points_off_visitor_reader::init faces are not taken into account from OFF file for Points.\n";
+ }
+ if (num_edges > 0) {
+ std::cerr << "Points_off_visitor_reader::init edges are not taken into account from OFF file for Points.\n";
+ }
+ }
+
+ /** @brief Off_reader visitor point implementation.
+ *
+ * The point function is called on each vertex line from OFF file.
+ * This function inserts the vertex in the vector of points.
+ *
+ * @param[in] point vector of vertex coordinates.
+ *
+ * @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
+ *
+ * where d is the point dimension.
+ */
+ void point(const std::vector<double>& point) {
+#ifdef DEBUG_TRACES
+ std::cout << "Points_off_visitor_reader::point ";
+ for (auto coordinate : point) {
+ std::cout << coordinate << " | ";
+ }
+ std::cout << std::endl;
+#endif // DEBUG_TRACES
+ // Fill the point cloud
+ point_cloud.push_back(Point_d(point.size(), point.begin(), point.end()));
+ }
+
+ // Off_reader visitor maximal_face implementation - Only points are read
+ void maximal_face(const std::vector<int>& face) { }
+
+ // Off_reader visitor done implementation - Only points are read
+ void done() { }
+
+ /** \brief Point cloud getter.
+ *
+ * @return point_cloud.
+ */
+ const std::vector<Point_d>& get_point_cloud() const {
+ return point_cloud;
+ }
+};
+
+/**
+ * \brief OFF file reader implementation in order to read points from an OFF file.
+ *
+ * This class is using the Points_off_visitor_reader to visit the OFF file according to Off_reader.
+ *
+ * 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
+ *
+ * where d is the point dimension.
+ *
+ * \section Example
+ *
+ * This example loads points from an OFF file and builds a vector of CGAL points in dimension d.
+ * Then, it is asked to display the points.
+ *
+ * \include common/CGAL_points_off_reader.cpp
+ *
+ * When launching:
+ *
+ * \code $> ./cgaloffreader ../../data/points/alphacomplexdoc.off
+ * \endcode
+ *
+ * the program output is:
+ *
+ * \include common/cgaloffreader_result.txt
+ */
+template<typename Point_d>
+class Points_off_reader {
+ public:
+ /** \brief Reads the OFF file and constructs a vector of points from the points
+ * that are in the OFF file.
+ *
+ * @param[in] name_file OFF file to read.
+ *
+ * \post Check with is_valid() function to see if read operation was successful.
+ */
+ Points_off_reader(const std::string& name_file)
+ : valid_(false) {
+ std::ifstream stream(name_file);
+ if (stream.is_open()) {
+ Off_reader off_reader(stream);
+ Points_off_visitor_reader<Point_d> off_visitor;
+ valid_ = off_reader.read(off_visitor);
+ if (valid_) {
+ point_cloud = off_visitor.get_point_cloud();
+ }
+ } else {
+ std::cerr << "Points_off_reader::Points_off_reader could not open file " << name_file << "\n";
+ }
+ }
+
+ /** \brief Returns if the OFF file read operation was successful or not.
+ *
+ * @return OFF file read status.
+ */
+ bool is_valid() const {
+ return valid_;
+ }
+
+ /** \brief Point cloud getter.
+ *
+ * @return point_cloud.
+ */
+ const std::vector<Point_d>& get_point_cloud() const {
+ return point_cloud;
+ }
+
+ private:
+ /** \brief point_cloud.*/
+ std::vector<Point_d> point_cloud;
+ /** \brief OFF file read status.*/
+ bool valid_;
+};
+
+} // namespace Gudhi
+
+#endif // POINTS_OFF_IO_H_
diff --git a/src/common/include/gudhi/Simple_object_pool.h b/src/common/include/gudhi/Simple_object_pool.h
new file mode 100644
index 00000000..fb9c8e23
--- /dev/null
+++ b/src/common/include/gudhi/Simple_object_pool.h
@@ -0,0 +1,81 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Marc Glisse
+ *
+ * Copyright (C) 2015 INRIA Saclay - Ile de 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 SIMPLE_OBJECT_POOL_H_
+#define SIMPLE_OBJECT_POOL_H_
+
+#include <boost/pool/pool.hpp>
+#include <utility>
+
+namespace Gudhi {
+
+/** \private
+ * This is a simpler version of boost::object_pool, that requires
+ * that users explicitly destroy all objects. This lets the
+ * performance scale much better, see
+ * https://svn.boost.org/trac/boost/ticket/3789 .
+ */
+template <class T>
+class Simple_object_pool : protected boost::pool<boost::default_user_allocator_malloc_free> {
+ protected:
+ typedef boost::pool<boost::default_user_allocator_malloc_free> Base;
+ typedef T* pointer;
+
+ Base& base() {
+ return *this;
+ }
+
+ Base const& base()const {
+ return *this;
+ }
+
+ public:
+ typedef T element_type;
+ typedef boost::default_user_allocator_malloc_free user_allocator;
+ typedef typename Base::size_type size_type;
+ typedef typename Base::difference_type difference_type;
+
+ template<class...U>
+ Simple_object_pool(U&&...u) : Base(sizeof (T), std::forward<U>(u)...) { }
+
+ template<class...U>
+ pointer construct(U&&...u) {
+ void* p = base().malloc BOOST_PREVENT_MACRO_SUBSTITUTION();
+ assert(p);
+ try {
+ new(p) T(std::forward<U>(u)...);
+ } catch (...) {
+ base().free BOOST_PREVENT_MACRO_SUBSTITUTION(p);
+ throw;
+ }
+ return static_cast<pointer> (p);
+ }
+
+ void destroy(pointer p) {
+ p->~T();
+ base().free BOOST_PREVENT_MACRO_SUBSTITUTION(p);
+ }
+};
+
+} // namespace Gudhi
+
+#endif // SIMPLE_OBJECT_POOL_H_
diff --git a/src/common/include/gudhi/Test.h b/src/common/include/gudhi/Test.h
index 18b7ca82..6024c822 100644
--- a/src/common/include/gudhi/Test.h
+++ b/src/common/include/gudhi/Test.h
@@ -1,5 +1,28 @@
-#ifndef __TEST_H
-#define __TEST_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.
+ *
+ * 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>
@@ -8,78 +31,75 @@
#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
-
+#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 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;
-
- }
+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
+#endif // TEST_H_
diff --git a/src/common/include/gudhi/Utils.h b/src/common/include/gudhi/Utils.h
deleted file mode 100644
index 7678685c..00000000
--- a/src/common/include/gudhi/Utils.h
+++ /dev/null
@@ -1,48 +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 GUDHI_UTILS_H_
-#define GUDHI_UTILS_H_
-
-
-#define PRINT(a) std::cerr << #a << ": " << (a) << " (DISP)"<<std::endl
-
-//#define DBG_VERBOSE
-#ifdef DBG_VERBOSE
-#define DBG(a) std::cerr << "DBG: " << (a)<<std::endl
-#define DBGMSG(a,b) std::cerr << "DBG: " << a<<b<<std::endl
-#define DBGVALUE(a) std::cerr << "DBG: " << #a << ": " << a<<std::endl
-#define DBGCONT(a) std::cerr << "DBG: container "<< #a<<" -> "; for(auto x:a) std::cerr<< x << ","; std::cerr<<std::endl
-#else
-//#define DBG(a) a
-//#define DBGMSG(a,b) b
-//#define DBGVALUE(a) a
-//#define DBGCONT(a) a
-#define DBG(a)
-#define DBGMSG(a,b)
-#define DBGVALUE(a)
-#define DBGCONT(a)
-#endif
-
-
-
-
-#endif /* UTILS_H_ */
diff --git a/src/common/include/gudhi/allocator.h b/src/common/include/gudhi/allocator.h
new file mode 100644
index 00000000..4ede14e4
--- /dev/null
+++ b/src/common/include/gudhi/allocator.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): Marc Glisse
+ *
+ * Copyright (C) 2015 INRIA Saclay - Ile de 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 ALLOCATOR_H_
+#define ALLOCATOR_H_
+
+#include <memory>
+#include <utility>
+
+namespace Gudhi {
+
+/** \private
+ * An allocator that can be used to build an uninitialized vector.
+ */
+template <class T, class Base = std::allocator<T>>
+struct no_init_allocator : Base {
+ typedef std::allocator_traits<Base> Base_traits;
+ template <class U> struct rebind {
+ typedef no_init_allocator<U, typename Base_traits::template rebind_alloc<U>> other;
+ };
+
+ // Inherit constructors.
+ using Base::Base;
+
+ // Do nothing: that's the whole point!
+ template<class P>
+ void construct(P*) noexcept {}
+
+ template<class P, class...U> void construct(P*p, U&&...u) {
+ Base_traits::construct(*(Base*)this, p, std::forward<U>(u)...);
+ }
+};
+
+} // namespace Gudhi
+
+#endif // ALLOCATOR_H_
diff --git a/src/common/include/gudhi/distance_functions.h b/src/common/include/gudhi/distance_functions.h
index 7a2ab035..cd518581 100644
--- a/src/common/include/gudhi/distance_functions.h
+++ b/src/common/include/gudhi/distance_functions.h
@@ -1,37 +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): 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/>.
- */
+/* 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/>.
+ */
+
+#ifndef DISTANCE_FUNCTIONS_H_
+#define DISTANCE_FUNCTIONS_H_
+
+#include <cmath> // for std::sqrt
/* 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 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;
- }
- return sqrt(dist);
+ auto it1 = p1.begin();
+ auto it2 = p2.begin();
+ for (; it1 != p1.end(); ++it1, ++it2) {
+ double tmp = *it1 - *it2;
+ dist += tmp*tmp;
+ }
+ return std::sqrt(dist);
}
+
+#endif // DISTANCE_FUNCTIONS_H_
diff --git a/src/common/include/gudhi/graph_simplicial_complex.h b/src/common/include/gudhi/graph_simplicial_complex.h
index 1ad9dabd..042ef516 100644
--- a/src/common/include/gudhi/graph_simplicial_complex.h
+++ b/src/common/include/gudhi/graph_simplicial_complex.h
@@ -1,96 +1,99 @@
- /* 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/>.
- */
+/* 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/>.
+ */
-#ifndef GUDHI_GRAPH_SIMPLICIAL_COMPLEX_FILTRATION_TAG_H
-#define GUDHI_GRAPH_SIMPLICIAL_COMPLEX_FILTRATION_TAG_H
+#ifndef GRAPH_SIMPLICIAL_COMPLEX_H_
+#define GRAPH_SIMPLICIAL_COMPLEX_H_
#include <boost/graph/adjacency_list.hpp>
+#include <utility> // for pair<>
+#include <vector>
+#include <map>
+
/* Edge tag for Boost PropertyGraph. */
struct edge_filtration_t {
typedef boost::edge_property_tag kind;
};
+
/* Vertex tag for Boost PropertyGraph. */
struct vertex_filtration_t {
typedef boost::vertex_property_tag kind;
};
-typedef int Vertex_handle;
-typedef double Filtration_value;
+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;
+, 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.
- */
+ *
+ * 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;
+, 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);
+ 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
+ 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);
+ 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.); }
-
+ for (std::tie(vi, vi_end) = boost::vertices(skel_graph);
+ vi != vi_end; ++vi) {
+ boost::put(vertex_prop, *vi, 0.);
+ }
+
return skel_graph;
}
-#endif // GUDHI_GRAPH_SIMPLICIAL_COMPLEX_FILTRATION_TAG_H
+#endif // GRAPH_SIMPLICIAL_COMPLEX_H_
diff --git a/src/common/include/gudhi/reader_utils.h b/src/common/include/gudhi/reader_utils.h
index ab12c268..899f9df6 100644
--- a/src/common/include/gudhi/reader_utils.h
+++ b/src/common/include/gudhi/reader_utils.h
@@ -1,32 +1,38 @@
- /* 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/>.
- */
-
-#ifndef GUDHI_READER_UTILS_H
-#define GUDHI_READER_UTILS_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.
+ *
+ * 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/>.
+ */
+
+#ifndef READER_UTILS_H_
+#define READER_UTILS_H_
+
+#include <gudhi/graph_simplicial_complex.h>
+
+#include <boost/graph/adjacency_list.hpp>
#include <iostream>
#include <fstream>
-#include <boost/graph/adjacency_list.hpp>
-#include "gudhi/graph_simplicial_complex.h"
+#include <map>
+#include <limits> // for numeric_limits<>
+#include <string>
+#include <vector>
/**
* \brief Read a set of points to turn it
@@ -37,23 +43,24 @@
* X21 X22 ... X2d
* etc
*/
-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);
- if(!in_file.is_open()) {
+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);
+ if (!in_file.is_open()) {
std::cerr << "Unable to open file " << file_name << std::endl;
- return;}
+ return;
+ }
std::string line;
double x;
- while( getline ( in_file , line ) )
- {
+ while (getline(in_file, line)) {
std::vector< double > point;
- std::istringstream iss( line );
- while(iss >> x) { point.push_back(x); }
- points.push_back(point);
+ std::istringstream iss(line);
+ while (iss >> x) {
+ point.push_back(x);
+ }
+ // Check for empty lines
+ if (!point.empty())
+ points.push_back(point);
}
in_file.close();
}
@@ -70,53 +77,64 @@ read_points ( std::string file_name
* Every simplex must appear exactly once.
* Simplices of dimension more than 1 are ignored.
*/
-inline 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; }
-
- std::vector< Edge_t > edges;
- std::vector< Filtration_value > edges_fil;
+inline 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;
+ }
+
+ std::vector< Edge_t > edges;
+ std::vector< Filtration_value > edges_fil;
std::map< Vertex_handle, Filtration_value > vertices;
-
- std::string line;
- int dim;
- Vertex_handle u,v,max_h = -1;
+
+ std::string line;
+ int dim;
+ Vertex_handle u, v, max_h = -1;
Filtration_value fil;
- while( getline ( in_ , line ) )
- {
- std::istringstream iss( line );
- while(iss >> dim) {
- switch ( dim ) {
- case 0 : {
- iss >> u; iss >> fil;
+ while (getline(in_, line)) {
+ std::istringstream iss(line);
+ while (iss >> dim) {
+ switch (dim) {
+ case 0:
+ {
+ iss >> u;
+ iss >> fil;
vertices[u] = fil;
- if(max_h < u) { max_h = u; }
+ if (max_h < u) {
+ max_h = u;
+ }
break;
}
- case 1 : {
- iss >> u; iss >> v; iss >> fil;
- edges.push_back(Edge_t(u,v));
+ case 1:
+ {
+ iss >> u;
+ iss >> v;
+ iss >> fil;
+ edges.push_back(Edge_t(u, v));
edges_fil.push_back(fil);
break;
}
- default: {break;}
- }
+ default:
+ {
+ break;
+ }
+ }
}
}
in_.close();
- if((size_t)(max_h+1) != vertices.size())
- { std::cerr << "Error: vertices must be labeled from 0 to n-1 \n"; }
+ if ((size_t) (max_h + 1) != vertices.size()) {
+ std::cerr << "Error: vertices must be labeled from 0 to n-1 \n";
+ }
- Graph_t skel_graph(edges.begin(),edges.end(),edges_fil.begin(),vertices.size());
- auto vertex_prop = boost::get(vertex_filtration_t(),skel_graph);
+ 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;
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); }
+ for (std::tie(vi, vi_end) = boost::vertices(skel_graph); vi != vi_end; ++vi, ++v_it) {
+ boost::put(vertex_prop, *vi, v_it->second);
+ }
return skel_graph;
}
@@ -133,19 +151,17 @@ read_graph ( std::string file_name )
* Every simplex must appear exactly once.
* Simplices of dimension more than 1 are ignored.
*/
-template< typename Vertex_handle
- , typename Filtration_value >
-bool read_simplex ( std::istream & in_
- , std::vector< Vertex_handle > & simplex
- , Filtration_value & fil )
-{
- int dim=0;
- if(!(in_ >> dim)) return false;
+template< typename Vertex_handle, typename Filtration_value >
+bool read_simplex(std::istream & in_, std::vector< Vertex_handle > & simplex, Filtration_value & fil) {
+ int dim = 0;
+ if (!(in_ >> dim)) return false;
Vertex_handle v;
- for(int i=0; i<dim+1; ++i)
- { in_ >> v; simplex.push_back(v); }
+ for (int i = 0; i < dim + 1; ++i) {
+ in_ >> v;
+ simplex.push_back(v);
+ }
in_ >> fil;
- in_.ignore((std::numeric_limits<std::streamsize>::max)(), '\n'); // ignore until the carriage return
+ in_.ignore((std::numeric_limits<std::streamsize>::max)(), '\n'); // ignore until the carriage return
return true;
}
@@ -162,20 +178,21 @@ bool read_simplex ( std::istream & in_
* 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 )
-{
+template< typename Simplex_key, typename Filtration_value >
+bool read_hasse_simplex(std::istream & in_, std::vector< Simplex_key > & boundary, Filtration_value & fil) {
int dim;
- if(!(in_ >> dim)) return false;
- if(dim == 0) {in_ >> fil; return true;}
+ if (!(in_ >> dim)) return false;
+ if (dim == 0) {
+ in_ >> fil;
+ return true;
+ }
Simplex_key key;
- for(int i=0; i<dim+1; ++i)
- { in_ >> key; boundary.push_back(key); }
+ for (int i = 0; i < dim + 1; ++i) {
+ in_ >> key;
+ boundary.push_back(key);
+ }
in_ >> fil;
return true;
}
-#endif // GUDHI_READER_UTILS_H
+#endif // READER_UTILS_H_
diff --git a/src/common/test/CMakeLists.txt b/src/common/test/CMakeLists.txt
new file mode 100644
index 00000000..0a88cf8e
--- /dev/null
+++ b/src/common/test/CMakeLists.txt
@@ -0,0 +1,35 @@
+cmake_minimum_required(VERSION 2.6)
+project(Common_tests)
+
+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()
+
+# need CGAL 4.7
+if(CGAL_FOUND)
+ if (NOT CGAL_VERSION VERSION_LESS 4.7.0)
+ if (EIGEN3_FOUND)
+ add_executable ( poffreader_UT points_off_reader_unit_test.cpp )
+ target_link_libraries(poffreader_UT ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})
+
+ # 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}/)
+
+ # Unitary tests
+ add_test(poffreader_UT ${CMAKE_CURRENT_BINARY_DIR}/poffreader_UT
+ # XML format for Jenkins xUnit plugin
+ --log_format=XML --log_sink=${CMAKE_SOURCE_DIR}/poffreader_UT.xml --log_level=test_suite --report_level=no)
+
+ else()
+ message(WARNING "Eigen3 not found. Version 3.1.0 is required for points_off_reader unitary tests.")
+ endif()
+ else()
+ message(WARNING "CGAL version: ${CGAL_VERSION} is too old to compile points_off_reader unitary tests. Version 4.7.0 is required.")
+ endif ()
+endif()
+
diff --git a/src/common/test/README b/src/common/test/README
new file mode 100644
index 00000000..f2a7eb5a
--- /dev/null
+++ b/src/common/test/README
@@ -0,0 +1,14 @@
+To compile:
+***********
+
+cmake .
+make
+
+To launch with details:
+***********************
+
+./dtoffrw_UT --report_level=detailed --log_level=all
+
+ ==> echo $? returns 0 in case of success (non-zero otherwise)
+
+
diff --git a/src/common/test/dtoffrw_alphashapedoc_result.off b/src/common/test/dtoffrw_alphashapedoc_result.off
new file mode 100644
index 00000000..1deb8dbd
--- /dev/null
+++ b/src/common/test/dtoffrw_alphashapedoc_result.off
@@ -0,0 +1,7 @@
+Point[0] = 1 1
+Point[1] = 7 0
+Point[2] = 4 6
+Point[3] = 9 6
+Point[4] = 0 14
+Point[5] = 2 19
+Point[6] = 9 17
diff --git a/src/common/test/points_off_reader_unit_test.cpp b/src/common/test/points_off_reader_unit_test.cpp
new file mode 100644
index 00000000..dbcc0434
--- /dev/null
+++ b/src/common/test/points_off_reader_unit_test.cpp
@@ -0,0 +1,78 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): 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/>.
+ */
+
+#include <gudhi/Points_off_io.h>
+
+// For CGAL points type in dimension d
+// cf. http://doc.cgal.org/latest/Kernel_d/classCGAL_1_1Point__d.html
+#include <CGAL/Epick_d.h>
+
+#include <iostream>
+#include <string>
+#include <vector>
+
+#define BOOST_TEST_DYN_LINK
+#define BOOST_TEST_MODULE "points_off_read_write"
+#include <boost/test/unit_test.hpp>
+
+typedef CGAL::Epick_d< CGAL::Dynamic_dimension_tag > Kernel;
+typedef Kernel::Point_d Point_d;
+
+BOOST_AUTO_TEST_CASE( points_doc_test )
+{
+ // Read the OFF file (input file name given as parameter) and triangulates points
+ Gudhi::Points_off_reader<Point_d> off_reader("alphacomplexdoc.off");
+ // Check the read operation was correct
+ BOOST_CHECK(off_reader.is_valid());
+
+ // Retrieve the triangulation
+ std::vector<Point_d> point_cloud = off_reader.get_point_cloud();
+ BOOST_CHECK(point_cloud.size() == 7);
+
+ std::vector<Point_d> expected_points;
+ std::vector<double> point = {1.0, 1.0};
+ expected_points.push_back(Point_d(2, point.begin(), point.end()));
+ point = {7.0, 0.0};
+ expected_points.push_back(Point_d(2, point.begin(), point.end()));
+ point = {4.0, 6.0};
+ expected_points.push_back(Point_d(2, point.begin(), point.end()));
+ point = {9.0, 6.0};
+ expected_points.push_back(Point_d(2, point.begin(), point.end()));
+ point = {0.0, 14.0};
+ expected_points.push_back(Point_d(2, point.begin(), point.end()));
+ point = {2.0, 19.0};
+ expected_points.push_back(Point_d(2, point.begin(), point.end()));
+ point = {9.0, 17.0};
+ expected_points.push_back(Point_d(2, point.begin(), point.end()));
+
+ BOOST_CHECK(point_cloud == expected_points);
+}
+
+BOOST_AUTO_TEST_CASE( Delaunay_triangulation_unexisting_file_read_test )
+{
+ Gudhi::Points_off_reader<Point_d> off_reader("some_impossible_weird_file_name.off");
+ // Check the read operation was correct
+ BOOST_CHECK(!off_reader.is_valid());
+
+ std::vector<Point_d> point_cloud = off_reader.get_point_cloud();
+ BOOST_CHECK(point_cloud.size() == 0);
+}
diff --git a/src/debian/changelog b/src/debian/changelog
new file mode 100644
index 00000000..32b3f6f9
--- /dev/null
+++ b/src/debian/changelog
@@ -0,0 +1,5 @@
+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/src/debian/compat b/src/debian/compat
new file mode 100644
index 00000000..ec635144
--- /dev/null
+++ b/src/debian/compat
@@ -0,0 +1 @@
+9
diff --git a/src/debian/control b/src/debian/control
new file mode 100644
index 00000000..838234a9
--- /dev/null
+++ b/src/debian/control
@@ -0,0 +1,26 @@
+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/src/debian/copyright b/src/debian/copyright
new file mode 100644
index 00000000..2e1f88cd
--- /dev/null
+++ b/src/debian/copyright
@@ -0,0 +1,28 @@
+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/src/debian/docs b/src/debian/docs
new file mode 100644
index 00000000..878a2ba1
--- /dev/null
+++ b/src/debian/docs
@@ -0,0 +1,2 @@
+Conventions.txt
+README
diff --git a/src/debian/rules b/src/debian/rules
new file mode 100755
index 00000000..c9b049af
--- /dev/null
+++ b/src/debian/rules
@@ -0,0 +1,28 @@
+#!/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/src/debian/source/format b/src/debian/source/format
new file mode 100644
index 00000000..163aaf8d
--- /dev/null
+++ b/src/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)