summaryrefslogtreecommitdiff
path: root/src/Persistent_cohomology/test
diff options
context:
space:
mode:
authorvrouvrea <vrouvrea@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2014-12-10 14:04:18 +0000
committervrouvrea <vrouvrea@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2014-12-10 14:04:18 +0000
commit429d4f06cede4d97144592eff91689fc1c707474 (patch)
tree10cbfc316b7445b887672b8b70a39b763d65fe9a /src/Persistent_cohomology/test
parente8cca67a337b9d4bdbd1a8558ad99862862145f3 (diff)
Add persistent unit test - warning fix - cpplint fix
git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/cpplint_test@346 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 9ef774de762c68a449b2a9791085f58c39a0705e
Diffstat (limited to 'src/Persistent_cohomology/test')
-rw-r--r--src/Persistent_cohomology/test/CMakeLists.txt40
-rw-r--r--src/Persistent_cohomology/test/README12
-rw-r--r--src/Persistent_cohomology/test/persistent_cohomology_unit_test.cpp170
-rw-r--r--src/Persistent_cohomology/test/persistent_cohomology_unit_test_multi_field.cpp129
-rw-r--r--src/Persistent_cohomology/test/simplex_tree_file_for_multi_field_unit_test.txt.REMOVED.git-id1
-rw-r--r--src/Persistent_cohomology/test/simplex_tree_file_for_unit_test.txt98
6 files changed, 450 insertions, 0 deletions
diff --git a/src/Persistent_cohomology/test/CMakeLists.txt b/src/Persistent_cohomology/test/CMakeLists.txt
new file mode 100644
index 00000000..0e5bab1b
--- /dev/null
+++ b/src/Persistent_cohomology/test/CMakeLists.txt
@@ -0,0 +1,40 @@
+cmake_minimum_required(VERSION 2.6)
+project(GUDHITestSimplexTree)
+
+# NEED TO FIND BOOST NEEDED COMPONENTS TO LINK WITH
+find_package(Boost 1.45.0 COMPONENTS system unit_test_framework)
+message("Boost_lib = ${Boost_LIBRARIES}")
+
+if(NOT MSVC)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")
+ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} --coverage")
+ set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} --coverage")
+endif()
+
+include_directories(${Boost_INCLUDE_DIRS})
+add_executable ( persistent_cohomology_unit_test persistent_cohomology_unit_test.cpp )
+target_link_libraries(persistent_cohomology_unit_test ${Boost_LIBRARIES})
+
+# Unitary tests
+add_test(persistent_cohomology_unit_test ${CMAKE_CURRENT_BINARY_DIR}/persistent_cohomology_unit_test)
+
+if(GMPXX_FOUND AND GMP_FOUND)
+ add_executable ( persistent_cohomology_unit_test_multi_field persistent_cohomology_unit_test_multi_field.cpp )
+ target_link_libraries(persistent_cohomology_unit_test_multi_field ${Boost_LIBRARIES} ${GMPXX_LIBRARIES} ${GMP_LIBRARIES})
+
+ # Unitary tests
+ add_test(persistent_cohomology_unit_test_multi_field ${CMAKE_CURRENT_BINARY_DIR}/persistent_cohomology_unit_test_multi_field)
+endif()
+
+if (LCOV_PATH)
+ # Lcov code coverage of unitary test
+ add_test(persistent_cohomology_unit_test_coverage.info ${CMAKE_SOURCE_DIR}/scripts/check_code_coverage.sh ${CMAKE_SOURCE_DIR}/src/Persistent_cohomology)
+endif()
+
+if (PYTHON_PATH)
+ # Cpplint tests on coding style
+ add_test(Persistent_cohomology.h.cpplint ${CMAKE_SOURCE_DIR}/scripts/check_google_style.sh ${CMAKE_SOURCE_DIR}/src/Persistent_cohomology/include/gudhi/Persistent_cohomology.h)
+ add_test(Field_Zp.h.cpplint ${CMAKE_SOURCE_DIR}/scripts/check_google_style.sh ${CMAKE_SOURCE_DIR}/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Field_Zp.h)
+ add_test(Multi_field.h.cpplint ${CMAKE_SOURCE_DIR}/scripts/check_google_style.sh ${CMAKE_SOURCE_DIR}/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Multi_field.h)
+ add_test(Persistent_cohomology_column.h.cpplint ${CMAKE_SOURCE_DIR}/scripts/check_google_style.sh ${CMAKE_SOURCE_DIR}/src/Persistent_cohomology/include/gudhi/Persistent_cohomology/Persistent_cohomology_column.h)
+endif() \ No newline at end of file
diff --git a/src/Persistent_cohomology/test/README b/src/Persistent_cohomology/test/README
new file mode 100644
index 00000000..56474fa0
--- /dev/null
+++ b/src/Persistent_cohomology/test/README
@@ -0,0 +1,12 @@
+To compile:
+***********
+
+cmake .
+make
+
+To launch with details:
+***********************
+
+./persistent_cohomology_unit_test --report_level=detailed --log_level=all
+
+ ==> echo $? returns 0 in case of success (non-zero otherwise)
diff --git a/src/Persistent_cohomology/test/persistent_cohomology_unit_test.cpp b/src/Persistent_cohomology/test/persistent_cohomology_unit_test.cpp
new file mode 100644
index 00000000..e180bea3
--- /dev/null
+++ b/src/Persistent_cohomology/test/persistent_cohomology_unit_test.cpp
@@ -0,0 +1,170 @@
+#define BOOST_TEST_MODULE const_string 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 <utility> // std::pair, std::make_pair
+
+#include <cmath> // float comparison
+#include <limits>
+
+#include "gudhi/graph_simplicial_complex.h"
+#include "gudhi/reader_utils.h"
+#include "gudhi/Simplex_tree.h"
+#include "gudhi/Persistent_cohomology.h"
+
+using namespace Gudhi;
+
+typedef Simplex_tree<> typeST;
+
+std::string test_rips_persistence(int coefficient, int min_persistence) {
+ const std::string inputFile("simplex_tree_file_for_unit_test.txt");
+ std::ifstream simplex_tree_stream;
+ simplex_tree_stream.open(inputFile.c_str());
+ typeST st;
+ simplex_tree_stream >> st;
+ simplex_tree_stream.close();
+
+ // Display the Simplex_tree
+ std::cout << "The complex contains " << st.num_simplices() << " simplices" << " - dimension= " << st.dimension()
+ << " - filtration= " << st.filtration() << std::endl;
+
+ // Check
+ BOOST_CHECK(st.num_simplices() == 98);
+ BOOST_CHECK(st.dimension() == 3);
+ BOOST_CHECK(st.filtration() == 1.89);
+
+ // Sort the simplices in the order of the filtration
+ st.initialize_filtration();
+
+ // Compute the persistence diagram of the complex
+ Persistent_cohomology<Simplex_tree<>, Field_Zp> pcoh(st);
+
+ pcoh.init_coefficients( coefficient ); // initializes the coefficient field for homology
+ // Check infinite rips
+ pcoh.compute_persistent_cohomology( min_persistence ); // Minimal lifetime of homology feature to be recorded.
+ std::ostringstream ossInfinite;
+
+ pcoh.output_diagram(ossInfinite);
+ std::string strInfinite = ossInfinite.str();
+ return strInfinite;
+}
+
+void test_rips_persistence_in_dimension(int dimension) {
+ std::string value0(" 0 0.02 1.12");
+ std::string value1(" 0 0.03 1.13");
+ std::string value2(" 0 0.04 1.14");
+ std::string value3(" 0 0.05 1.15");
+ std::string value4(" 0 0.06 1.16");
+ std::string value5(" 0 0.07 1.17");
+ std::string value6(" 0 0.08 1.18");
+ std::string value7(" 0 0.09 1.19");
+ std::string value8(" 0 0 inf" );
+ std::string value9(" 0 0.01 inf" );
+
+ value0.insert(0,std::to_string(dimension));
+ value1.insert(0,std::to_string(dimension));
+ value2.insert(0,std::to_string(dimension));
+ value3.insert(0,std::to_string(dimension));
+ value4.insert(0,std::to_string(dimension));
+ value5.insert(0,std::to_string(dimension));
+ value6.insert(0,std::to_string(dimension));
+ value7.insert(0,std::to_string(dimension));
+ value8.insert(0,std::to_string(dimension));
+ value9.insert(0,std::to_string(dimension));
+
+ std::cout << "********************************************************************" << std::endl;
+ std::cout << "TEST OF RIPS_PERSISTENT_COHOMOLOGY_SINGLE_FIELD DIM=" << dimension << " MIN_PERS=0" << std::endl;
+
+ std::string str_rips_persistence = test_rips_persistence(dimension, 0);
+
+ 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
+ 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
+ BOOST_CHECK(str_rips_persistence.find(value8) != std::string::npos); // Check found
+ BOOST_CHECK(str_rips_persistence.find(value9) != 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_SINGLE_FIELD DIM=" << dimension << " MIN_PERS=1" << std::endl;
+
+ str_rips_persistence = test_rips_persistence(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
+ 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
+ BOOST_CHECK(str_rips_persistence.find(value8) != std::string::npos); // Check found
+ BOOST_CHECK(str_rips_persistence.find(value9) != 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_SINGLE_FIELD DIM=" << dimension << " MIN_PERS=2" << std::endl;
+
+ str_rips_persistence = test_rips_persistence(dimension, 2);
+
+ BOOST_CHECK(str_rips_persistence.find(value0) == std::string::npos); // Check not found
+ BOOST_CHECK(str_rips_persistence.find(value1) == std::string::npos); // Check not found
+ BOOST_CHECK(str_rips_persistence.find(value2) == std::string::npos); // Check not found
+ 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(value8) != std::string::npos); // Check found
+ BOOST_CHECK(str_rips_persistence.find(value9) != 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_SINGLE_FIELD DIM=" << dimension << " MIN_PERS=Inf" << std::endl;
+
+ str_rips_persistence = test_rips_persistence(dimension, std::numeric_limits<int>::max());
+
+ BOOST_CHECK(str_rips_persistence.find(value0) == std::string::npos); // Check not found
+ BOOST_CHECK(str_rips_persistence.find(value1) == std::string::npos); // Check not found
+ BOOST_CHECK(str_rips_persistence.find(value2) == std::string::npos); // Check not found
+ 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(value8) != std::string::npos); // Check found
+ BOOST_CHECK(str_rips_persistence.find(value9) != std::string::npos); // Check found
+ std::cout << "str_rips_persistence=" << str_rips_persistence << std::endl;
+}
+
+BOOST_AUTO_TEST_CASE( rips_persistent_cohomology_single_field_dim_1 )
+{
+ test_rips_persistence_in_dimension(1);
+}
+
+BOOST_AUTO_TEST_CASE( rips_persistent_cohomology_single_field_dim_2 )
+{
+ test_rips_persistence_in_dimension(2);
+}
+
+BOOST_AUTO_TEST_CASE( rips_persistent_cohomology_single_field_dim_3 )
+{
+ test_rips_persistence_in_dimension(3);
+}
+
+BOOST_AUTO_TEST_CASE( rips_persistent_cohomology_single_field_dim_5 )
+{
+ test_rips_persistence_in_dimension(5);
+}
+
+// TODO(VR): not working from 6
+// 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);
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
new file mode 100644
index 00000000..cef29bb0
--- /dev/null
+++ b/src/Persistent_cohomology/test/persistent_cohomology_unit_test_multi_field.cpp
@@ -0,0 +1,129 @@
+#define BOOST_TEST_MODULE const_string 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 <utility> // std::pair, std::make_pair
+
+#include <cmath> // float comparison
+#include <limits>
+
+#include "gudhi/graph_simplicial_complex.h"
+#include "gudhi/reader_utils.h"
+#include "gudhi/Simplex_tree.h"
+#include "gudhi/Persistent_cohomology.h"
+#include "gudhi/Persistent_cohomology/Multi_field.h"
+
+using namespace Gudhi;
+
+typedef Simplex_tree<> typeST;
+
+std::string test_rips_persistence(int min_coefficient, int max_coefficient, int min_persistence) {
+ const std::string inputFile("simplex_tree_file_for_multi_field_unit_test.txt");
+ std::ifstream simplex_tree_stream;
+ simplex_tree_stream.open(inputFile.c_str());
+ typeST st;
+ simplex_tree_stream >> st;
+ simplex_tree_stream.close();
+
+ // Display the Simplex_tree
+ std::cout << "The complex contains " << st.num_simplices() << " simplices" << " - dimension= " << st.dimension()
+ << " - filtration= " << st.filtration() << std::endl;
+
+ // Check
+ BOOST_CHECK(st.num_simplices() == 6142604);
+ BOOST_CHECK(st.dimension() == 3);
+ BOOST_CHECK(st.filtration() == 0.249999);
+
+ // 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_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.
+
+ std::ostringstream ossRips;
+ pcoh.output_diagram(ossRips);
+
+ std::string strRips = ossRips.str();
+ return strRips;
+}
+
+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");
+
+ 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::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);
+
+ 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_2_3 )
+{
+ test_rips_persistence_in_dimension(2, 3);
+}
+
+BOOST_AUTO_TEST_CASE( rips_persistent_cohomology_multi_field_dim_1_5 )
+{
+ test_rips_persistence_in_dimension(1, 5);
+}
+
+// TODO(VR): not working from 6
+// 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);
+// TODO(VR): is result OK of :
+// test_rips_persistence_in_dimension(3, 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
new file mode 100644
index 00000000..2dd38515
--- /dev/null
+++ b/src/Persistent_cohomology/test/simplex_tree_file_for_multi_field_unit_test.txt.REMOVED.git-id
@@ -0,0 +1 @@
+ce87199d425b05f51c74cbf635870bfa5abbc7a1 \ No newline at end of file
diff --git a/src/Persistent_cohomology/test/simplex_tree_file_for_unit_test.txt b/src/Persistent_cohomology/test/simplex_tree_file_for_unit_test.txt
new file mode 100644
index 00000000..90756ce0
--- /dev/null
+++ b/src/Persistent_cohomology/test/simplex_tree_file_for_unit_test.txt
@@ -0,0 +1,98 @@
+0 0 0
+0 1 0.01
+0 2 0.02
+0 3 0.03
+0 4 0.04
+0 5 0.05
+0 6 0.06
+0 7 0.07
+0 8 0.08
+0 9 0.09
+1 2 1 1.12
+1 3 1 1.13
+1 4 1 1.14
+1 5 1 1.15
+1 6 1 1.16
+1 7 1 1.17
+1 8 1 1.18
+1 9 1 1.19
+1 3 2 1.23
+2 3 2 1 1.23
+1 6 2 1.26
+2 6 2 1 1.26
+1 8 2 1.28
+2 8 2 1 1.28
+1 9 2 1.29
+2 9 2 1 1.29
+1 6 3 1.36
+2 6 3 1 1.36
+2 6 3 2 1.36
+3 6 3 2 1 1.36
+1 7 3 1.37
+2 7 3 1 1.37
+1 8 3 1.38
+2 8 3 1 1.38
+2 8 3 2 1.38
+3 8 3 2 1 1.38
+1 5 4 1.45
+2 5 4 1 1.45
+1 6 4 1.46
+2 6 4 1 1.46
+1 8 4 1.48
+2 8 4 1 1.48
+1 6 5 1.56
+2 6 5 1 1.56
+2 6 5 4 1.56
+3 6 5 4 1 1.56
+1 7 5 1.57
+2 7 5 1 1.57
+1 8 5 1.58
+2 8 5 1 1.58
+2 8 5 4 1.58
+3 8 5 4 1 1.58
+1 9 5 1.59
+2 9 5 1 1.59
+1 7 6 1.67
+2 7 6 1 1.67
+2 7 6 3 1.67
+3 7 6 3 1 1.67
+2 7 6 5 1.67
+3 7 6 5 1 1.67
+1 8 6 1.68
+2 8 6 1 1.68
+2 8 6 2 1.68
+3 8 6 2 1 1.68
+2 8 6 3 1.68
+3 8 6 3 1 1.68
+3 8 6 3 2 1.68
+2 8 6 4 1.68
+3 8 6 4 1 1.68
+2 8 6 5 1.68
+3 8 6 5 1 1.68
+3 8 6 5 4 1.68
+1 9 6 1.69
+2 9 6 1 1.69
+2 9 6 2 1.69
+3 9 6 2 1 1.69
+2 9 6 5 1.69
+3 9 6 5 1 1.69
+1 8 7 1.78
+2 8 7 1 1.78
+2 8 7 3 1.78
+3 8 7 3 1 1.78
+2 8 7 5 1.78
+3 8 7 5 1 1.78
+2 8 7 6 1.78
+3 8 7 6 1 1.78
+3 8 7 6 3 1.78
+3 8 7 6 5 1.78
+1 9 8 1.89
+2 9 8 1 1.89
+2 9 8 2 1.89
+3 9 8 2 1 1.89
+2 9 8 5 1.89
+3 9 8 5 1 1.89
+2 9 8 6 1.89
+3 9 8 6 1 1.89
+3 9 8 6 2 1.89
+3 9 8 6 5 1.89