From e0b41bae4d55fa98ec2d1d20fc8b0dffdc0db601 Mon Sep 17 00:00:00 2001 From: Bill March Date: Tue, 1 Nov 2011 18:48:39 +0000 Subject: [PATCH] wrote emst_tests, fixed a few problems created by blindly replacing index_t with size_t --- src/mlpack/methods/emst/CMakeLists.txt | 8 + src/mlpack/methods/emst/README | 19 - src/mlpack/methods/emst/dtb.hpp | 99 +- src/mlpack/methods/emst/emst_main.cpp | 163 +-- src/mlpack/methods/emst/emst_test.cc | 138 +++ src/mlpack/methods/emst/test_data.csv | 20 - src/mlpack/methods/emst/test_data_3_1000.csv | 1000 ++++++++++++++++++ 7 files changed, 1247 insertions(+), 200 deletions(-) delete mode 100644 src/mlpack/methods/emst/README create mode 100644 src/mlpack/methods/emst/emst_test.cc delete mode 100644 src/mlpack/methods/emst/test_data.csv create mode 100755 src/mlpack/methods/emst/test_data_3_1000.csv diff --git a/src/mlpack/methods/emst/CMakeLists.txt b/src/mlpack/methods/emst/CMakeLists.txt index 15feb78a45..050afcecc9 100644 --- a/src/mlpack/methods/emst/CMakeLists.txt +++ b/src/mlpack/methods/emst/CMakeLists.txt @@ -33,3 +33,11 @@ target_link_libraries(union_find_test mlpack boost_unit_test_framework ) + +add_executable(emst_test + emst_test.cc +) +target_link_libraries(emst_test + mlpack + boost_unit_test_framework +) diff --git a/src/mlpack/methods/emst/README b/src/mlpack/methods/emst/README deleted file mode 100644 index 8a9e0633e0..0000000000 --- a/src/mlpack/methods/emst/README +++ /dev/null @@ -1,19 +0,0 @@ -This folder contains an implementation of the DualTreeBoruvka algorithm for finding a Euclidean Minimum Spanning Tree. NOTE: this algorithm is awaiting publication and is not for distribution. - -Compile with fl-build emst_main - -Run with ./emst_main --data="filename" for basic use. This will create a file "output.txt" with the minimum spanning tree represented as an edge list. - -Other options: - -bool --using_thor -> defaults to 0, thor is not yet supported, so setting it to 1 will cause an error message to be printed - -string --data -> the name of the file with the data points - -int --dtb/leaf_size -> defaults to 1, the number of points in the leaves of the tree. For the DualTreeBoruvka algorithm, 1 gives the fastest performance. I recommend only changing this parameter to conserve memory. - -bool --do_naive -> defaults to 0. If it is 1, then the algorithm will compute the MST with both DualTreeBoruvka and a naive implementation of Boruvka's algorithm. It will compare the two results and exit with an error if they are different. - -string --naive/output_filename -> The name of the file where the naive edge list should be printed. Defaults to naive_output.txt - -string --dtb/output_filename -> The name of the file where the DTB edge list should be printed. Defaults to output.txt \ No newline at end of file diff --git a/src/mlpack/methods/emst/dtb.hpp b/src/mlpack/methods/emst/dtb.hpp index 7cab1ef3a1..9fa1da300d 100644 --- a/src/mlpack/methods/emst/dtb.hpp +++ b/src/mlpack/methods/emst/dtb.hpp @@ -4,7 +4,7 @@ * @author Bill March (march@gatech.edu) * * Contains an implementation of the DualTreeBoruvka algorithm for finding a - * Euclidean Minimum Spanning Tree. + * Euclidean Minimum Spanning Tree using the kd-tree data structure. * * Citation: March, W. B.; Ram, P.; and Gray, A. G. Fast Euclidean Minimum Spanning * Tree: Algorithm, Analysis, Applications. In KDD, 2010. @@ -21,17 +21,9 @@ #include #include -PARAM(size_t, "leaf_size", "Size of the leaves.", "naive", 1, false); - namespace mlpack { namespace emst { -/* -const fx_submodule_doc dtb_submodules[] = { -FX_SUBMODULE_DOC_DONE -}; - */ - /** * A Stat class for use with fastlib's trees. This one only stores two values. * @@ -43,10 +35,11 @@ FX_SUBMODULE_DOC_DONE * points in this node. If points in this node are in different components, * this value will be negative. */ + class DTBStat { private: double max_neighbor_distance_; - size_t component_membership_; + int component_membership_; public: void set_max_neighbor_distance(double distance) { @@ -57,11 +50,11 @@ class DTBStat { return max_neighbor_distance_; } - void set_component_membership(size_t membership) { + void set_component_membership(int membership) { component_membership_ = membership; } - size_t component_membership() { + int component_membership() { return component_membership_; } @@ -108,8 +101,6 @@ class DTBStat { */ class DualTreeBoruvka { -// FORBID_ACCIDENTAL_COPIES(DualTreeBoruvka); - public: // For now, everything is in Euclidean space static const size_t metric = 2; @@ -144,7 +135,7 @@ class DualTreeBoruvka { size_t number_r_recursions_; size_t number_both_recursions_; - int do_naive_; + bool do_naive_; DTBTree* tree_; @@ -286,6 +277,9 @@ class DualTreeBoruvka { //pruned by component membership mlpack::Log::Assert(reference_node->stat().component_membership() >= 0); + + mlpack::Log::Info << query_node->stat().component_membership() << "q mem\n"; + mlpack::Log::Info << reference_node->stat().component_membership() << "r mem\n"; number_component_prunes_++; } @@ -411,7 +405,7 @@ class DualTreeBoruvka { struct SortEdgesHelper_ { bool operator() (const EdgePair& pairA, const EdgePair& pairB) { - return (pairA.distance() > pairB.distance()); + return (pairA.distance() < pairB.distance()); } } SortFun; @@ -432,29 +426,33 @@ class DualTreeBoruvka { SortEdges_(); mlpack::Log::Assert(number_of_edges_ == number_of_points_ - 1); - results.set_size(3, number_of_edges_); + results.set_size(number_of_edges_, 3); + // need to unpermute the point labels if (!do_naive_) { for (size_t i = 0; i < (number_of_points_ - 1); i++) { - edges_[i].set_lesser_index(old_from_new_permutation_[edges_[i] - .lesser_index()]); + // Make sure the edge list stores the smaller index first to + // make checking correctness easier + size_t ind1, ind2; + ind1 = old_from_new_permutation_[edges_[i].lesser_index()]; + ind2 = old_from_new_permutation_[edges_[i].greater_index()]; + + edges_[i].set_lesser_index(std::min(ind1, ind2)); + edges_[i].set_greater_index(std::max(ind1, ind2)); - edges_[i].set_greater_index(old_from_new_permutation_[edges_[i] - .greater_index()]); - - results(0, i) = edges_[i].lesser_index(); - results(1, i) = edges_[i].greater_index(); - results(2, i) = sqrt(edges_[i].distance()); + results(i, 0) = edges_[i].lesser_index(); + results(i, 1) = edges_[i].greater_index(); + results(i, 2) = sqrt(edges_[i].distance()); } } else { for (size_t i = 0; i < number_of_edges_; i++) { - results(0, i) = edges_[i].lesser_index(); - results(1, i) = edges_[i].greater_index(); - results(2, i) = sqrt(edges_[i].distance()); + results(i, 0) = edges_[i].lesser_index(); + results(i, 1) = edges_[i].greater_index(); + results(i, 2) = sqrt(edges_[i].distance()); } } @@ -532,9 +530,10 @@ class DualTreeBoruvka { fx_result_int(module_, "number_r_recursions", number_r_recursions_); fx_result_int(module_, "number_both_recursions", number_both_recursions_);*/ // TODO, not sure how I missed this last time. - mlpack::Log::Info << "total_squared_length" << total_dist_ << std::endl; - mlpack::Log::Info << "number_of_points" << number_of_points_ << std::endl; - mlpack::Log::Info << "dimension" << data_points_.n_rows << std::endl; + mlpack::Log::Info << "Total squared length: " << total_dist_ << std::endl; + mlpack::Log::Info << "Number of points: " << number_of_points_ << std::endl; + mlpack::Log::Info << "Dimension: " << data_points_.n_rows << std::endl; + /* mlpack::Log::Info << "number_of_loops" << std::endl; mlpack::Log::Info << "number_distance_prunes" << std::endl; mlpack::Log::Info << "number_component_prunes" << std::endl; @@ -542,6 +541,10 @@ class DualTreeBoruvka { mlpack::Log::Info << "number_q_recursions" << std::endl; mlpack::Log::Info << "number_r_recursions" << std::endl; mlpack::Log::Info << "number_both_recursions" << std::endl; + */ + + mlpack::CLI::GetParam("dtb/total_squared_length") = total_dist_; + } // OutputResults_ /////////// Public Functions /////////////////// @@ -554,11 +557,9 @@ class DualTreeBoruvka { /** - * Takes in a reference to the data set and a module. Copies the data, + * Takes in a reference to the data set. Copies the data, * builds the tree, and initializes all of the member variables. * - * This module will be checked for the optional parameters "leaf_size" and - * "do_naive". */ void Init(const arma::mat& data) { @@ -572,17 +573,20 @@ class DualTreeBoruvka { // This gives best pruning empirically // Use leaf_size=1 unless space is a big concern CLI::GetParam("tree/leaf_size") = - CLI::GetParam("naive/leaf_size"); + CLI::GetParam("emst/leaf_size"); - Timers::StartTimer("naive/tree_building"); + Timers::StartTimer("emst/tree_building"); tree_ = new DTBTree(data_points_, old_from_new_permutation_); - Timers::StopTimer("naive/tree_building"); + Timers::StopTimer("emst/tree_building"); + } else { + tree_ = NULL; old_from_new_permutation_.resize(0); + } number_of_points_ = data_points_.n_cols; @@ -614,23 +618,30 @@ class DualTreeBoruvka { Timers::StartTimer("emst/MST_computation"); while (number_of_edges_ < (number_of_points_ - 1)) { + ComputeNeighbors_(); AddAllEdges_(); Cleanup_(); - Log::Info << "number_of_loops = " << number_of_loops_ << std::endl; + + Log::Info << "Finished loop number: " << number_of_loops_ << std::endl; + Log::Info << number_of_edges_ << " edges found so far.\n\n"; + /* + Log::Info << number_leaf_computations_ << " base cases.\n"; + Log::Info << number_distance_prunes_ << " distance prunes.\n"; + Log::Info << number_component_prunes_ << " component prunes.\n"; + Log::Info << number_r_recursions_ << " reference recursions.\n"; + Log::Info << number_q_recursions_ << " query recursions.\n"; + Log::Info << number_both_recursions_ << " dual recursions.\n\n"; + */ + } Timers::StopTimer("emst/MST_computation"); -// if (results != NULL) { - - EmitResults_(results); - -// } - + EmitResults_(results); OutputResults_(); diff --git a/src/mlpack/methods/emst/emst_main.cpp b/src/mlpack/methods/emst/emst_main.cpp index 42cde83bd0..8fff985162 100644 --- a/src/mlpack/methods/emst/emst_main.cpp +++ b/src/mlpack/methods/emst/emst_main.cpp @@ -3,149 +3,78 @@ * * Calls the DualTreeBoruvka algorithm from dtb.h * Can optionally call Naive Boruvka's method - * See README for command line options. + * + * For algorithm details, see: + * March, W.B., Ram, P., and Gray, A.G. + * Fast Euclidean Minimum Spanning Tree: Algorithm, Analysis, Applications. + * In KDD, 2010. * * @author Bill March (march@gatech.edu) */ - -#include #include "dtb.hpp" -PARAM_FLAG("using_thor", "For when an implementation of thor is around", - "emst"); -PARAM_STRING_REQ("input_file", "Data input file.", "emst"); -PARAM_STRING("output_file", "Data output file.", "emst", "emst_output.csv"); +#include -PARAM_FLAG("do_naive", "Check against naive.", "naive"); +PARAM_STRING_REQ("input_file", "Data input file.", "emst"); +PARAM_STRING("output_file", "Data output file. Stored as an edge list.", "emst", "emst_output.csv"); +PARAM_FLAG("do_naive", "Compute the MST using .", "naive"); PARAM_STRING("output_file", "Naive data output file.", "naive", "naive_output.csv"); - -PARAM(double, "total_squared_length", "Calculation result.", "dtb", 0.0, false); +PARAM_INT("leaf_size", "Leaf size in the kd-tree. Singleton leaves give the empirically best performance at the cost of greater memory requirements.", "emst", 1); +PARAM_DOUBLE("total_squared_length", "Squared length of the computed tree.", "dtb", 0.0); using namespace mlpack; using namespace mlpack::emst; int main(int argc, char* argv[]) { + CLI::ParseCommandLine(argc, argv); - // For when I implement a thor version - bool using_thor = CLI::GetParam("emst/using_thor"); + ///////////////// READ IN DATA ////////////////////////////////// + std::string data_file_name = CLI::GetParam("emst/input_file"); - if (using_thor) { - Log::Warn << "thor is not yet supported" << std::endl; + Log::Info << "Reading in data.\n"; + + arma::mat data_points; + data_points.load(data_file_name.c_str()); + + // Do naive + if (CLI::GetParam("naive/do_naive")) { + + Log::Info << "Running naive algorithm.\n"; + + DualTreeBoruvka naive; + //CLI::GetParam("naive/do_naive") = true; + + naive.Init(data_points); + + arma::mat naive_results; + naive.ComputeMST(naive_results); + + std::string naive_output_filename = + CLI::GetParam("naive/output_file"); + + naive_results.save(naive_output_filename.c_str(), arma::csv_ascii, false, + true); + } else { - - ///////////////// READ IN DATA ////////////////////////////////// - - std::string data_file_name = CLI::GetParam("emst/input_file"); - - arma::mat data_points; - data_points.load(data_file_name.c_str()); + + Log::Info << "Data read, building tree.\n"; /////////////// Initialize DTB ////////////////////// DualTreeBoruvka dtb; - + dtb.Init(data_points); + + Log::Info << "Tree built, running algorithm.\n\n"; + ////////////// Run DTB ///////////////////// arma::mat results; dtb.ComputeMST(results); - //////////////// Check against naive ////////////////////////// - if (CLI::GetParam("naive/do_naive")) { - - DualTreeBoruvka naive; - CLI::GetParam("naive/do_naive") = true; - - naive.Init(data_points); - - arma::mat naive_results; - naive.ComputeMST(naive_results); - - /* Compare the naive output to the DTB output */ - - Timers::StartTimer("naive/comparison"); - - - // Check if the edge lists are the same - // Loop over the naive edge list - int is_correct = 1; - /* - for (size_t naive_index = 0; naive_index < results.size(); - naive_index++) { - - int this_loop_correct = 0; - size_t naive_lesser_index = results[naive_index].lesser_index(); - size_t naive_greater_index = results[naive_index].greater_index(); - double naive_distance = results[naive_index].distance(); - - // Loop over the DTB edge list and compare against naive - // Break when an edge is found that matches the current naive edge - for (size_t dual_index = 0; dual_index < naive_results.size(); - dual_index++) { - - size_t dual_lesser_index = results[dual_index].lesser_index(); - size_t dual_greater_index = results[dual_index].greater_index(); - double dual_distance = results[dual_index].distance(); - - if (naive_lesser_index == dual_lesser_index) { - if (naive_greater_index == dual_greater_index) { - DEBUG_ASSERT(naive_distance == dual_distance); - this_loop_correct = 1; - break; - } - } - - } - - if (this_loop_correct == 0) { - is_correct = 0; - break; - } - - } - */ - if (is_correct == 0) { - - Log::Warn << "Naive check failed!" << std::endl << - "Edge lists are different." << std::endl << std::endl; - - // Check if the outputs have the same length - if (CLI::GetParam("naive/total_squared_length") != - CLI::GetParam("naive/total_squared_length")) { - - Log::Fatal << "Total lengths are different! " - << " One algorithm has failed." << std::endl; - - return 1; - } - else { - // NOTE: if the edge lists are different, but the total lengths are - // the same, the algorithm may still be correct. The MST is not - // uniquely defined for some point sets. For example, an equilateral - // triangle has three minimum spanning trees. It is possible for - // naive and DTB to find different spanning trees in this case. - Log::Info << "Total lengths are the same."; - Log::Info << "It is possible the point set"; - Log::Info << "has more than one minimum spanning tree." << std::endl; - } - - } - else { - Log::Info << "Naive and DualTreeBoruvka produced the same MST." << - std::endl << std::endl; - } - - Timers::StopTimer("naive/comparison"); - - std::string naive_output_filename = - CLI::GetParam("naive/output_file"); - - naive_results.save(naive_output_filename.c_str(), arma::csv_ascii, false, - true); - } //////////////// Output the Results //////////////// @@ -153,8 +82,8 @@ int main(int argc, char* argv[]) { CLI::GetParam("emst/output_file"); results.save(output_filename.c_str(), arma::csv_ascii, false, true); - - }// end else (if using_thor) + + } return 0; diff --git a/src/mlpack/methods/emst/emst_test.cc b/src/mlpack/methods/emst/emst_test.cc new file mode 100644 index 0000000000..104ccf7b88 --- /dev/null +++ b/src/mlpack/methods/emst/emst_test.cc @@ -0,0 +1,138 @@ +/** + * @file emst_test.cc + * + * Test file for EMST methods + */ +#include +#include "dtb.hpp" + +#define BOOST_TEST_MODULE EMST Test +#include + +using namespace mlpack; +using namespace mlpack::emst; + +/*** + * Simple emst test with small, synthetic dataset. This is an + * exhaustive test, which checks that each method for performing the calculation + * (dual-tree, single-tree, naive) produces the correct results. The dataset is + * in one dimension for simplicity -- the correct functionality of distance + * functions is not tested here. + */ +BOOST_AUTO_TEST_CASE(exhaustive_synthetic_test) { + // Set up our data. + arma::mat data(1, 11); + data[0] = 0.05; // Row addressing is unnecessary (they are all 0). + data[1] = 0.37; + data[2] = 0.15; + data[3] = 1.25; + data[4] = 5.05; + data[5] = -0.22; + data[6] = -2.00; + data[7] = -1.30; + data[8] = 0.45; + data[9] = 0.91; + data[10] = 1.00; + + + // Now perform the actual calculation. + arma::mat results; + + + DualTreeBoruvka dtb; + dtb.Init(data); + dtb.ComputeMST(results); + + // Now the exhaustive check for correctness. + + BOOST_REQUIRE(results(0, 0) == 1); + BOOST_REQUIRE(results(0, 1) == 8); + BOOST_REQUIRE_CLOSE(results(0, 2), 0.08, 1e-5); + + BOOST_REQUIRE(results(1, 0) == 9); + BOOST_REQUIRE(results(1, 1) == 10); + BOOST_REQUIRE_CLOSE(results(1, 2), 0.09, 1e-5); + + BOOST_REQUIRE(results(2, 0) == 0); + BOOST_REQUIRE(results(2, 1) == 2); + BOOST_REQUIRE_CLOSE(results(2, 2), 0.1, 1e-5); + + BOOST_REQUIRE(results(3, 0) == 1); + BOOST_REQUIRE(results(3, 1) == 2); + BOOST_REQUIRE_CLOSE(results(3, 2), 0.22, 1e-5); + + BOOST_REQUIRE(results(4, 0) == 3); + BOOST_REQUIRE(results(4, 1) == 10); + BOOST_REQUIRE_CLOSE(results(4, 2), 0.25, 1e-5); + + BOOST_REQUIRE(results(5, 0) == 0); + BOOST_REQUIRE(results(5, 1) == 5); + BOOST_REQUIRE_CLOSE(results(5, 2), 0.27, 1e-5); + + BOOST_REQUIRE(results(6, 0) == 8); + BOOST_REQUIRE(results(6, 1) == 9); + BOOST_REQUIRE_CLOSE(results(6, 2), 0.46, 1e-5); + + BOOST_REQUIRE(results(7, 0) == 6); + BOOST_REQUIRE(results(7, 1) == 7); + BOOST_REQUIRE_CLOSE(results(7, 2), 0.7, 1e-5); + + BOOST_REQUIRE(results(8, 0) == 5); + BOOST_REQUIRE(results(8, 1) == 7); + BOOST_REQUIRE_CLOSE(results(8, 2), 1.08, 1e-5); + + BOOST_REQUIRE(results(9, 0) == 3); + BOOST_REQUIRE(results(9, 1) == 4); + BOOST_REQUIRE_CLOSE(results(9, 2), 3.8, 1e-5); + + +} + +/** + * Test the dual tree method against the naive computation. + * + * Errors are produced if the results are not identical. + */ +BOOST_AUTO_TEST_CASE(dual_tree_vs_naive) { + arma::mat input_data; + + // Hard-coded filename: bad! + // Code duplication: also bad! + if (!input_data.load("test_data_3_1000.csv", arma::auto_detect, false, + true)) + BOOST_FAIL("Cannot load test dataset test_data_3_1000.csv!"); + + // Set up matrices to work with (may not be necessary with no ALIAS_MATRIX?). + arma::mat dual_data = arma::trans(input_data); + arma::mat naive_data = arma::trans(input_data); + + // Reset parameters from last test. + DualTreeBoruvka dtb; + dtb.Init(dual_data); + + arma::mat dual_results; + dtb.ComputeMST(dual_results); + + // Set naive mode. + CLI::GetParam("naive/do_naive") = true; + + DualTreeBoruvka dtb_naive; + dtb_naive.Init(naive_data); + + arma::mat naive_results; + dtb_naive.ComputeMST(naive_results); + + BOOST_REQUIRE(dual_results.n_cols == naive_results.n_cols); + BOOST_REQUIRE(dual_results.n_rows == naive_results.n_rows); + + for (size_t i = 0; i < dual_results.n_rows; i++) { + + BOOST_REQUIRE(dual_results(i,0) == naive_results(i,0)); + BOOST_REQUIRE(dual_results(i,1) == naive_results(i,1)); + BOOST_REQUIRE_CLOSE(dual_results(i,2), naive_results(i,2), 1e-5); + + } + + +} + diff --git a/src/mlpack/methods/emst/test_data.csv b/src/mlpack/methods/emst/test_data.csv deleted file mode 100644 index b190ddfbb4..0000000000 --- a/src/mlpack/methods/emst/test_data.csv +++ /dev/null @@ -1,20 +0,0 @@ -0.3964647737602753 0.8404853694114252 -0.3533360972452435 0.4465834347965441 -0.3186927723118806 0.8864284332230312 -0.01558284940832877 0.5840902203172718 -0.1593686265318048 0.3837158748071943 -0.6910043733821958 0.05885891359273643 -0.899854306161604 0.1635459506303647 -0.1590715025818064 0.5330647140218545 -0.6041441897112385 0.5826990212072189 -0.2699711179070157 0.3904781954634089 -0.2934005701189513 0.7423774060339809 -0.298525606318119 0.07553807853778238 -0.4049826335833338 0.8573779427081831 -0.9419683232918992 0.6628306597899964 -0.8464757799300067 0.002755081426883521 -0.4623792450254847 0.5325960244382983 -0.78787662089292 0.2656122349713712 -0.9827522631010304 0.3067851306141804 -0.6008551364891055 0.608715653358658 -0.2124387982011875 0.8858951305876062 diff --git a/src/mlpack/methods/emst/test_data_3_1000.csv b/src/mlpack/methods/emst/test_data_3_1000.csv new file mode 100755 index 0000000000..d72e289ea5 --- /dev/null +++ b/src/mlpack/methods/emst/test_data_3_1000.csv @@ -0,0 +1,1000 @@ +0.339406815,0.843176636,0.472701471 +0.212587646,0.351174901,0.81056695 +0.605649993,0.45338097,0.623370668 +0.269783539,0.482031883,0.36535861 +0.725254282,0.477113042,0.042100268 +0.529287901,0.776008587,0.303809928 +0.098778217,0.318454787,0.983422857 +0.685345453,0.837942768,0.540406673 +0.503220972,0.268813629,0.41488501 +0.160147626,0.255047893,0.04072469 +0.564535197,0.943435462,0.597070812 +0.663842864,0.276972185,0.02208704 +0.077321401,0.032366881,0.826784604 +0.794220519,0.319582218,0.266025433 +0.466815953,0.864683732,0.684380976 +0.680962499,0.009554527,0.484176898 +0.257862396,0.875068776,0.326253946 +0.695503778,0.695095604,0.955586038 +0.569205007,0.662786497,0.036489177 +0.604542917,0.250714055,0.232826165 +0.928175028,0.871769923,0.327107027 +0.362809806,0.270846833,0.917535106 +0.567471988,0.09223176,0.018232595 +0.30294,0.197331083,0.676067984 +0.136497436,0.991079028,0.640906359 +0.490191642,0.321877535,0.210121475 +0.886240693,0.124811844,0.109638108 +0.487537807,0.474289999,0.34183089 +0.038698268,0.515865087,0.984297254 +0.437309222,0.534489172,0.792665419 +0.898099395,0.461121197,0.785225662 +0.256850927,0.840446806,0.056158684 +0.335408063,0.806637161,0.913551388 +0.11329872,0.670392847,0.333361274 +0.954403847,0.024104509,0.325578493 +0.824152332,0.614355433,0.271931013 +0.729647547,0.666093053,0.579723184 +0.25675029,0.94037263,0.530553224 +0.799877963,0.555666351,0.056606945 +0.213120693,0.763046224,0.341926361 +0.975873714,0.554796483,0.049489218 +0.422782321,0.375502502,0.875514176 +0.732474122,0.920181004,0.273895723 +0.288070185,0.878065303,0.57017629 +0.269706239,0.854626516,0.607709975 +0.615118638,0.006748605,0.00278243 +0.655373608,0.348029869,0.909502319 +0.358287814,0.419322455,0.362741982 +0.152473842,0.659459939,0.497284571 +0.930791658,0.934132013,0.150924236 +0.792977546,0.953203388,0.465884431 +0.971953827,0.268751729,0.220474277 +0.244730747,0.056636753,0.088649766 +0.873554351,0.305649442,0.91790044 +0.26662478,0.221646762,0.310857157 +0.659541537,0.93018384,0.139339275 +0.833616742,0.833734413,0.551027856 +0.43405195,0.874582065,0.996443541 +0.442896336,0.118977275,0.03127628 +0.388886541,0.976070927,0.294801481 +0.14757794,0.195944854,0.129778502 +0.73209291,0.551685931,0.218866346 +0.85393572,0.675733762,0.501776114 +0.804291505,0.746786474,0.94053733 +0.199998362,0.403471102,0.614783956 +0.302029244,0.084831174,0.043490422 +0.458371115,0.076068613,0.940418665 +0.122287089,0.867270578,0.612001352 +0.423331474,0.370629389,0.407480574 +0.400056969,0.919523609,0.940521669 +0.74852813,0.872400563,0.915423635 +0.614934326,0.67621724,0.382278246 +0.0184522,0.545825352,0.74127138 +0.937453855,0.175662201,0.666301896 +0.504358818,0.251308945,0.849159677 +0.397410107,0.973000161,0.648601332 +0.398342217,0.110698975,0.916968596 +0.464980239,0.683124011,0.070633362 +0.787030874,0.393777381,0.731973049 +0.612845512,0.893440416,0.475331995 +0.241219407,0.792282417,0.389574277 +0.465756798,0.552685716,0.092092299 +0.908028882,0.837528446,0.794160948 +0.552741674,0.898614081,0.764312365 +0.607116253,0.958698621,0.334887326 +0.322583246,0.541387861,0.879874555 +0.124522558,0.229074642,0.510214096 +0.049900273,0.471371867,0.367698395 +0.261657863,0.105228571,0.748191349 +0.216818324,0.700885804,0.34479269 +0.896337659,0.634574468,0.203599217 +0.961150989,0.920563011,0.795999477 +0.120635447,0.744570376,0.107177572 +0.696406743,0.788342315,0.173664558 +0.577700329,0.493151732,0.989211395 +0.270346683,0.586765585,0.208832269 +0.171412097,0.116618251,0.53141933 +0.596260532,0.819973735,0.531503373 +0.120665467,0.556332466,0.643268746 +0.546751646,0.563896374,0.079856633 +0.637150933,0.126536213,0.823749724 +0.637940649,0.951567917,0.397777975 +0.344749598,0.517031469,0.48297473 +0.296545224,0.419944602,0.99985146 +0.707956343,0.985929306,0.942420811 +0.24734852,0.001808114,0.489512545 +0.29395388,0.751934338,0.924845167 +0.306350765,0.676837884,0.614397758 +0.387029257,0.668882644,0.316866608 +0.166701475,0.220250465,0.70788096 +0.666366134,0.343214579,0.063804166 +0.970614577,0.514452347,0.643280872 +0.084297811,0.906111319,0.590434434 +0.163302217,0.226212634,0.074753132 +0.20207705,0.197835179,0.217985026 +0.413236066,0.640190511,0.520645448 +0.807941459,0.463910044,0.996796367 +0.208875906,0.182468954,0.876826443 +0.743474185,0.840439019,0.143677671 +0.266758693,0.103719005,0.920995789 +0.030607849,0.973154392,0.814015083 +0.237753714,0.374336732,0.44138091 +0.83212984,0.547216604,0.371699647 +0.302411666,0.58054099,0.303141758 +0.949214871,0.783756542,0.457582838 +0.32776739,0.133095384,0.351183944 +0.673471065,0.432009028,0.761641303 +0.120361022,0.494421101,0.954699616 +0.049975694,0.857405242,0.133753572 +0.314326245,0.599784238,0.698931698 +0.10972582,0.994733888,0.603365409 +0.246939825,0.79385323,0.576049373 +0.420949269,0.55824091,0.684730016 +0.085903635,0.678776288,0.759533545 +0.221902971,0.606683148,0.183625782 +0.934582003,0.263106456,0.195228637 +0.276550653,0.563455012,0.477130256 +0.939865401,0.683543172,0.98694541 +0.090714119,0.155392084,0.183225576 +0.546170002,0.226065658,0.757518873 +0.635725491,0.259656977,0.803254796 +0.768135532,0.329687113,0.784471673 +0.67201594,0.69314804,0.216292884 +0.731388623,0.632648812,0.298465113 +0.030104188,0.531279626,0.68605789 +0.404907965,0.617707054,0.646985633 +0.38264213,0.522044947,0.606066308 +0.850778503,0.771072538,0.780038925 +0.333386945,0.62981651,0.838539888 +0.144526261,0.90723358,0.672092924 +0.803193149,0.545698586,0.740250704 +0.144775421,0.073065649,0.81327723 +0.800150626,0.077947117,0.498989131 +0.805355858,0.282274855,0.111520406 +0.432276345,0.614069782,0.04562788 +0.119740317,0.122788948,0.68461108 +0.188596378,0.666133286,0.753645204 +0.143050522,0.393902986,0.609633117 +0.754401856,0.84172035,0.387786256 +0.97549575,0.97044364,0.621482928 +0.735098473,0.96738673,0.239086021 +0.825090649,0.153687653,0.520111132 +0.720848546,0.211391499,0.513430909 +0.572411742,0.56579983,0.313933048 +0.766584951,0.704264072,0.103088529 +0.933914925,0.70795791,0.378434849 +0.232266382,0.864968616,0.664769493 +0.180748316,0.792633394,0.983236654 +0.320744207,0.073646797,0.915148464 +0.058415284,0.478244018,0.171213592 +0.613274471,0.423949271,0.899198164 +0.83818587,0.622457639,0.496368891 +0.547369341,0.5160996,0.318684775 +0.489079348,0.504840066,0.174865371 +0.133510366,0.873938618,0.95342181 +0.355477984,0.610358907,0.32242224 +0.32167355,0.132961802,0.381440702 +0.660257981,0.59386003,0.570704079 +0.519799486,0.220676336,0.85452965 +0.097125446,0.037837774,0.581579153 +0.801485909,0.741547848,0.06310355 +0.413142247,0.303102946,0.30224609 +0.07746447,0.555846316,0.750106689 +0.593760097,0.256631753,0.179035377 +0.819000445,0.86578977,0.797167379 +0.644052663,0.148335877,0.377067692 +0.02037784,0.835405997,0.192438566 +0.248506314,0.951214215,0.492923258 +0.387445752,0.862693509,0.11983047 +0.411437123,0.512831692,0.516380652 +0.481199694,0.970780992,0.565521666 +0.967908564,0.168755985,0.447517833 +0.280607962,0.670538365,0.548021587 +0.402044213,0.121532495,0.136718448 +0.83696286,0.739549154,0.495218329 +0.652215616,0.664877651,0.838254198 +0.846246408,0.411635906,0.96601722 +0.359827733,0.627436225,0.666295882 +0.522326573,0.496565812,0.404066784 +0.614406114,0.160072022,0.269439305 +0.221722954,0.558736063,0.890699947 +0.561777087,0.782270647,0.792345194 +0.385698506,0.295964873,0.697613223 +0.101162968,0.27600378,0.239798872 +0.075127486,0.14163579,0.728168103 +0.982440842,0.583109151,0.395072917 +0.69628067,0.26642599,0.283866713 +0.073093261,0.914332418,0.925554624 +0.01642578,0.927883834,0.248712685 +0.11636724,0.556067816,0.248282085 +0.487453151,0.058684617,0.294624957 +0.813726551,0.860917181,0.678149491 +0.492581545,0.501803813,0.193032429 +0.642766795,0.422421802,0.950458987 +0.662519175,0.950448071,0.157126432 +0.548815699,0.127905654,0.23337741 +0.159163516,0.345059322,0.586704542 +0.40029112,0.928563882,0.954476476 +0.587201396,0.44357769,0.797926632 +0.026827624,0.206281621,0.680220462 +0.884217164,0.266754666,0.652197582 +0.475019281,0.447732834,0.14299077 +0.193076354,0.317892868,0.976621856 +0.515208981,0.512331237,0.422351595 +0.336671812,0.870606258,0.364554196 +0.438596677,0.333836845,0.801388791 +0.194389409,0.929245672,0.589545825 +0.205377525,0.079938747,0.187363423 +0.426814991,0.823224852,0.707435026 +0.262972959,0.517545732,0.19872636 +0.720354434,0.847649202,0.709246477 +0.355306192,0.303943053,0.835051265 +0.949975427,0.106134411,0.204516092 +0.106374426,0.874129261,0.971439223 +0.14517828,0.371147898,0.695954142 +0.739099753,0.331888701,0.890413781 +0.627551297,0.9001009,0.177324543 +0.047488938,0.224289129,0.220822902 +0.912785118,0.79570392,0.838242455 +0.49717293,0.703176431,0.754883589 +0.090976094,0.502530756,0.657999889 +0.194042479,0.284561692,0.14516165 +0.409960603,0.285564554,0.097001811 +0.310205693,0.003434942,0.173823303 +0.233583043,0.118822434,0.816665508 +0.513843271,0.539640669,0.864405207 +0.40692643,0.436463418,0.369798489 +0.126544008,0.159580886,0.933714485 +0.286441339,0.872974675,0.04454198 +0.964565622,0.910027403,0.897861798 +0.203121728,0.899714292,0.085173744 +0.445639841,0.360999337,0.016645134 +0.307793993,0.117750087,0.562967352 +0.281587526,0.174834541,0.274581395 +0.119660773,0.099740072,0.484016211 +0.511583585,0.54938211,0.339766424 +0.188451695,0.073022292,0.006123739 +0.346586219,0.49567248,0.234826476 +0.225242461,0.587641331,0.725805817 +0.075409614,0.208266437,0.826377328 +0.204076002,0.04779427,0.040457828 +0.050861901,0.763043363,0.256073344 +0.972150662,0.792678045,0.909955027 +0.506115605,0.031837525,0.903340416 +0.804010111,0.955685921,0.175896939 +0.092926989,0.062223289,0.821308211 +0.363715968,0.726101463,0.79168981 +0.787381816,0.338102828,0.005758252 +0.484331698,0.495765424,0.891180155 +0.241982415,0.277129738,0.561477087 +0.484161267,0.286665154,0.03556541 +0.211600046,0.304292614,0.395789513 +0.372524976,0.202611617,0.166595985 +0.265124748,0.017345601,0.037686194 +0.701786714,0.420334817,0.714000487 +0.034048463,0.651290563,0.050634716 +0.802331316,0.558297752,0.291679579 +0.344037056,0.467477672,0.358504649 +0.639463582,0.425507582,0.954817361 +0.602885138,0.374751922,0.374607167 +0.993637385,0.955212301,0.16550343 +0.955669008,0.745723993,0.889786752 +0.365337348,0.19682491,0.506234866 +0.7457291,0.51831627,0.978818087 +0.92625289,0.631584997,0.443128894 +0.786168714,0.264993195,0.263960382 +0.316681591,0.61079768,0.089349247 +0.858371024,0.834969763,0.174819213 +0.525393487,0.243792169,0.955241627 +0.720242053,0.143419208,0.402799979 +0.749292304,0.217311863,0.799688479 +0.246462289,0.958943724,0.142358796 +0.528138907,0.590786754,0.948225902 +0.454799161,0.510565688,0.295103038 +0.953069085,0.021533141,0.116332423 +0.188120341,0.690529852,0.623168048 +0.318359731,0.758493036,0.91843922 +0.726077549,0.902046947,0.327147423 +0.386752461,0.338547997,0.651921958 +0.707225745,0.584329479,0.37703596 +0.060288975,0.494620757,0.075518168 +0.237652566,0.962903992,0.824801251 +0.535945075,0.958493881,0.754701994 +0.064404553,0.235151293,0.39448081 +0.979476468,0.347342952,0.99138709 +0.189166661,0.798328607,0.697048046 +0.180560013,0.342106481,0.174983336 +0.28337819,0.962425666,0.955845318 +0.593924663,0.66654314,0.570147835 +0.114749593,0.903677338,0.957687266 +0.151925114,0.716482401,0.637800283 +0.235669594,0.580788646,0.528893286 +0.778117587,0.250968708,0.684104646 +0.747849981,0.214563448,0.02984775 +0.720813243,0.066656345,0.737883757 +0.626964368,0.953760147,0.459809098 +0.469018562,0.720549931,0.518332767 +0.821461664,0.507041049,0.514946331 +0.384160041,0.953174654,0.443907617 +0.233220889,0.511502601,0.369065624 +0.434955659,0.150497671,0.76574469 +0.8958592,0.481635774,0.942994014 +0.979260732,0.445148596,0.323549157 +0.334878174,0.403760723,0.385124629 +0.460214884,0.33828675,0.592783427 +0.518346254,0.909618383,0.6009723 +0.338370801,0.317375424,0.337490389 +0.636668843,0.96449714,0.481975016 +0.025064304,0.923419227,0.119203699 +0.048318449,0.53489191,0.76133984 +0.491930784,0.016568024,0.112619998 +0.17743988,0.903969674,0.481918653 +0.981634317,0.513179093,0.316557669 +0.02560158,0.930375993,0.563316641 +0.017997936,0.890571459,0.4580491 +0.96277821,0.443025655,0.083145161 +0.419576578,0.112060055,0.531294103 +0.494454706,0.954168063,0.047922651 +0.800000835,0.673332473,0.064026809 +0.870702162,0.510095577,0.863030178 +0.851121904,0.916229763,0.781903614 +0.159726434,0.082081261,0.19548317 +0.362450326,0.788524336,0.826141196 +0.270846003,0.098989879,0.574494436 +0.406889772,0.838173717,0.436699777 +0.035503139,0.853255007,0.642800341 +0.083155666,0.952721164,0.708076056 +0.847697478,0.56519776,0.894660498 +0.037841045,0.984301359,0.365909559 +0.177721428,0.418447797,0.157612683 +0.429370039,0.508723836,0.767724035 +0.071851749,0.216253471,0.819600825 +0.578083664,0.212360494,0.627380646 +0.380746754,0.954034946,0.11483721 +0.211278539,0.560080096,0.685450354 +0.770737322,0.813954563,0.79322567 +0.318759117,0.06983,0.664250133 +0.059856737,0.06677071,0.26622355 +0.968241527,0.953861837,0.311894576 +0.504226431,0.06220937,0.289105117 +0.256406511,0.249902695,0.348997399 +0.674888311,0.860374,0.605942473 +0.246067727,0.048342783,0.343006159 +0.830735494,0.783740344,0.677522751 +0.99887952,0.341758368,0.229922444 +0.731699282,0.940258743,0.10886285 +0.541383735,0.910293019,0.381124662 +0.750868727,0.848911762,0.265718422 +0.425671591,0.626146239,0.622684142 +0.214013066,0.091251581,0.864057899 +0.545601885,0.310480085,0.046543211 +0.517244356,0.115819763,0.248517895 +0.872633121,0.50117097,0.12009094 +0.255496857,0.472006579,0.796438566 +0.468962035,0.26918685,0.131735945 +0.742353904,0.528441793,0.565922864 +0.85366711,0.2676075,0.914062206 +0.447698287,0.149534939,0.670156644 +0.445589481,0.6431063,0.225580433 +0.357872915,0.788565726,0.814611643 +0.580287142,0.506307991,0.527031912 +0.500500265,0.365277722,0.04677688 +0.141881394,0.926001483,0.86894952 +0.221717771,0.366035312,0.125658418 +0.600339909,0.684670388,0.826168927 +0.307898392,0.20966968,0.752966481 +0.959700077,0.899536378,0.491452813 +0.230433688,0.613941888,0.415683508 +0.495527265,0.634504412,0.370199526 +0.506575734,0.986633413,0.84941237 +0.761764339,0.963921599,0.828872018 +0.348601654,0.087553061,0.791174897 +0.104944192,0.102179531,0.905877926 +0.375324247,0.246387607,0.301420991 +0.875454272,0.118686164,0.988824311 +0.17698346,0.393647261,0.159870783 +0.917659703,0.583236755,0.630992101 +0.285048123,0.469986869,0.37272766 +0.011480822,0.597073945,0.904116141 +0.313259229,0.510005423,0.894823085 +0.795838324,0.911141124,0.928152818 +0.164974957,0.359128099,0.60236716 +0.983429159,0.003861397,0.083218217 +0.242529745,0.562773547,0.664077813 +0.765913188,0.194009625,0.286229668 +0.070781352,0.102661854,0.249285398 +0.511452125,0.418997177,0.284014634 +0.439472205,0.891870259,0.82363463 +0.580892549,0.466753672,0.140496383 +0.615517449,0.738921356,0.461546367 +0.824697707,0.698589656,0.941554339 +0.46610398,0.902958283,0.688012984 +0.523365471,0.691567649,0.547171487 +0.545929937,0.714552317,0.041938604 +0.32756288,0.701840615,0.927731162 +0.761874356,0.276228477,0.886668834 +0.979442228,0.298771691,0.591610911 +0.374731022,0.860510449,0.321638525 +0.8074911,0.097011746,0.930723417 +0.453431338,0.206882669,0.431005917 +0.910029309,0.03223923,0.493150704 +0.2897017,0.170401689,0.739971322 +0.024666309,0.777054677,0.769170439 +0.05624039,0.089983601,0.64642539 +0.149696037,0.539762835,0.702098143 +0.676100319,0.000479419,0.639516981 +0.967411256,0.893394783,0.958913773 +0.158669993,0.527294695,0.347808355 +0.181672491,0.532695548,0.988953142 +0.053598946,0.497693858,0.118111495 +0.132496571,0.985450674,0.753931807 +0.87586561,0.732063591,0.884137731 +0.419609591,0.012639269,0.645369169 +0.102047486,0.008854525,0.658344391 +0.123913855,0.210708056,0.499395878 +0.159685659,0.968477268,0.586268979 +0.834269522,0.369645239,0.245380904 +0.637297781,0.768550638,0.48870442 +0.778386961,0.376787501,0.03205647 +0.67713794,0.632054697,0.000672655 +0.860752189,0.140567399,0.326727043 +0.220600271,0.039797462,0.871431738 +0.373493897,0.910009286,0.043303147 +0.269453424,0.571833998,0.346704152 +0.919787568,0.373470212,0.873193468 +0.776952353,0.362003265,0.172733797 +0.575862615,0.900415576,0.599884308 +0.616882997,0.8845633,0.13177173 +0.366855251,0.729104299,0.950578149 +0.668847681,0.753527405,0.660832331 +0.264243456,0.308498641,0.912106098 +0.542527865,0.880831766,0.535728949 +0.460634645,0.013712653,0.152280892 +0.828209711,0.921304334,0.049084108 +0.874065663,0.473229025,0.545232499 +0.731220357,0.126627169,0.996060848 +0.943461868,0.033256065,0.992038738 +0.211193798,0.522810965,0.907780013 +0.767158364,0.967162642,0.888059793 +0.689583275,0.841550923,0.377520241 +0.147705388,0.959063909,0.031580823 +0.654707489,0.752912445,0.305046055 +0.628378168,0.075829853,0.719349441 +0.886468112,0.185491156,0.719710557 +0.749470564,0.448017109,0.897349202 +0.492693185,0.884164268,0.633427171 +0.44686733,0.7934547,0.773846432 +0.630683325,0.776592453,0.708944434 +0.814848973,0.845977344,0.643222219 +0.016975156,0.729138989,0.058020996 +0.511298247,0.07057554,0.733405098 +0.784480806,0.738595698,0.373688534 +0.530814843,0.44312087,0.691107945 +0.944091316,0.957332961,0.639542386 +0.771047017,0.811962024,0.977774991 +0.87020688,0.755962661,0.925248114 +0.458700988,0.334773333,0.095844508 +0.533831151,0.912609619,0.027149015 +0.524625598,0.652693277,0.497418106 +0.805674264,0.723021478,0.80073208 +0.113696528,0.650247192,0.344709776 +0.826900827,0.593783006,0.550936366 +0.940655423,0.740273144,0.630218018 +0.141520315,0.632429144,0.838610834 +0.39673597,0.503240828,0.590691376 +0.037602886,0.040815285,0.620639119 +0.716116291,0.506754028,0.253596249 +0.619782298,7.76626E-05,0.676065593 +0.496033457,0.98742451,0.984019601 +0.649314148,0.147470427,0.489967654 +0.691622038,0.161245902,0.647851723 +0.936526892,0.590442875,0.939555093 +0.604802621,0.838823011,0.251219058 +0.071190531,0.67647138,0.597666328 +0.019410183,0.495778133,0.44031324 +0.726411874,0.262687025,0.086312948 +0.830480537,0.135077568,0.079159787 +0.950841893,0.769723105,0.47873095 +0.611417896,0.84114966,0.395349789 +0.181347141,0.287776713,0.883076078 +0.200712222,0.873964629,0.571505353 +0.65202277,0.084117342,0.250545655 +0.342561024,0.202306216,0.079726003 +0.584301932,0.122693153,0.129858724 +0.591176502,0.051275102,0.876431468 +0.165946295,0.474087103,0.856717365 +0.839385948,0.763414504,0.961778868 +0.528260865,0.865453126,0.680673095 +0.076050301,0.71693581,0.15210816 +0.780443967,0.33197709,0.73242445 +0.363327494,0.164977224,0.185099911 +0.687912867,0.396104619,0.249748592 +0.88391393,0.554502064,0.089705278 +0.33788714,0.686247878,0.252660937 +0.19163616,0.441496434,0.513458703 +0.478908993,0.15156254,0.818829745 +0.918896553,0.899169945,0.780767514 +0.782967436,0.327693122,0.755050753 +0.32558364,0.492239506,0.12339517 +0.047070459,0.693552034,0.508452959 +0.109465204,0.821862145,0.632136838 +0.826253828,0.610682399,0.632137891 +0.162364171,0.5709024,0.027035072 +0.479768494,0.607203769,0.077566143 +0.897031412,0.795684932,0.974415558 +0.801002173,0.551618649,0.876984199 +0.123312093,0.411438516,0.901446561 +0.594677287,0.32833558,0.914104796 +0.741635419,0.14325589,0.115905361 +0.08993896,0.243272135,0.742401503 +0.116491314,0.690400792,0.020805328 +0.180855336,0.599454312,0.340688071 +0.087037755,0.006886539,0.952560809 +0.300603611,0.113658264,0.797478049 +0.832235841,0.05963984,0.771465426 +0.095194013,0.247650851,0.801344581 +0.300632189,0.150924198,0.086360387 +0.874625368,0.700861247,0.713919826 +0.863383564,0.57922769,0.870911826 +0.11913471,0.767551415,0.50918181 +0.556749667,0.691513618,0.782003681 +0.197331319,0.827247513,0.779623914 +0.987023902,0.734883462,0.623629089 +0.420615082,0.614082171,0.741891207 +0.312249031,0.014913149,0.070878868 +0.974642188,0.983123549,0.086275706 +0.783360774,0.814835668,0.67625897 +0.540478752,0.254940938,0.449867885 +0.048763621,0.290768213,0.625363258 +0.697965851,0.033892112,0.612844092 +0.724879255,0.708375839,0.525641059 +0.747562377,0.173208535,0.263779612 +0.867179342,0.213616814,0.754428508 +0.02226162,0.326141353,0.081963664 +0.627227744,0.116451144,0.409565408 +0.543129433,0.092850944,0.54072763 +0.281594806,0.709633472,0.876793176 +0.35647452,0.063874296,0.965050871 +0.045168661,0.497624359,0.186815072 +0.524949861,0.944601324,0.332059785 +0.126474627,0.02739514,0.246752374 +0.208604998,0.568408651,0.772918262 +0.125784169,0.514833609,0.514478954 +0.154512957,0.373291441,0.993402025 +0.233618131,0.572616698,0.016411005 +0.999890963,0.570275565,0.216853317 +0.486828361,0.379924401,0.696213866 +0.075314427,0.667395497,0.863855433 +0.86294927,0.812782874,0.997533964 +0.031445186,0.249022328,0.973324576 +0.326573891,0.118171329,0.965763005 +0.332020059,0.604459411,0.538268842 +0.706622108,0.694323961,0.209014536 +0.932949763,0.08165582,0.356510191 +0.75591714,0.880443277,0.240181713 +0.227219665,0.515538046,0.063202431 +0.069200681,0.150851636,0.361221939 +0.902427408,0.646942656,0.504832272 +0.262382978,0.180972368,0.403132445 +0.032506623,0.656194,0.257345113 +0.959652463,0.776117592,0.653289283 +0.778669537,0.171816058,0.383820737 +0.64856927,0.78342696,0.966231461 +0.638608998,0.323023815,0.667259556 +0.120265759,0.176019011,0.416173717 +0.275065523,0.921190579,0.324061946 +0.490137925,0.337844445,0.135339916 +0.724097632,0.992269402,0.410123181 +0.296958503,0.142356399,0.479483213 +0.092381103,0.57773093,0.290898447 +0.89183933,0.312149005,0.295126666 +0.669251799,0.071453982,0.955861716 +0.938378225,0.324238979,0.455589077 +0.762236627,0.048617283,0.120655973 +0.886194063,0.842136906,0.886167779 +0.420448588,0.826040453,0.209811195 +0.496120113,0.140244984,0.010275807 +0.291770734,0.089337397,0.940136172 +0.823744617,0.442752205,0.79506829 +0.86635257,0.308919721,0.929313191 +0.124187371,0.515507145,0.3952627 +0.515643261,0.514493405,0.592216269 +0.435577703,0.202265522,0.749380396 +0.851215206,0.581140662,0.909262689 +0.97276388,0.305964393,0.119556192 +0.833642983,0.44267292,0.574065373 +0.908658096,0.985442117,0.032891222 +0.120536868,0.898167052,0.754847347 +0.328480689,0.206500348,0.883388839 +0.584233318,0.127164736,0.934356548 +0.520904286,0.085542266,0.469645136 +0.118804512,0.276694477,0.255706174 +0.669152609,0.480169645,0.350044668 +0.784599588,0.030844507,0.672270616 +0.97462202,0.984822685,0.801402402 +0.09061512,0.20599842,0.288943446 +0.500630874,0.668012143,0.326107661 +0.243946646,0.885842685,0.356343047 +0.704519934,0.112411764,0.840776533 +0.064722176,0.148130565,0.724221405 +0.069998846,0.826917642,0.285248236 +0.463142105,0.129132053,0.071693121 +0.065672617,0.491471158,0.143248345 +0.345719852,0.550477283,0.417188691 +0.523811405,0.923188335,0.366706095 +0.57113315,0.798590349,0.465646081 +0.828359309,0.886833757,0.470994632 +0.649200809,0.422037446,0.338970547 +0.991959241,0.065292471,0.545926733 +0.402707667,0.892315167,0.157737898 +0.583371677,0.915247643,0.510882162 +0.286752954,0.119216908,0.422178531 +0.000574842,0.932477989,0.322762631 +0.521100182,0.182516345,0.799539149 +0.217552185,0.32460329,0.001286413 +0.129263953,0.832799191,0.746800354 +0.859133069,0.682500693,0.035727655 +0.081296267,0.499283963,0.851895509 +0.709384988,0.14985208,0.186521894 +0.247922963,0.253358356,0.872326832 +0.203028631,0.068652472,0.553487984 +0.292370767,0.925595124,0.401383438 +0.721522222,0.300176493,0.452098604 +0.622021123,0.308001842,0.51395483 +0.601298816,0.268135963,0.584441602 +0.207949629,0.407128704,0.699430418 +0.152216375,0.92660356,0.07049208 +0.997031345,0.789488864,0.194662825 +0.14170589,0.513011324,0.250918681 +0.979853004,0.246273698,0.732371057 +0.441466086,0.428787477,0.680856737 +0.513859379,0.668402062,0.50429415 +0.32103853,0.59436219,0.481843963 +0.466004374,0.019901121,0.225087815 +0.546731744,0.359957666,0.776590304 +0.088133727,0.021028123,0.579299556 +0.172044151,0.237278834,0.567876411 +0.576325796,0.86256513,0.487980769 +0.459957415,0.004052068,0.41344615 +0.72021758,0.906208873,0.049850195 +0.835505139,0.006504875,0.716129577 +0.974913096,0.06350265,0.945758998 +0.538076764,0.931252476,0.05429443 +0.921879308,0.750002283,0.120075272 +0.825790117,0.095295707,0.471769578 +0.667512779,0.726667248,0.68041055 +0.604774928,0.209313615,0.803678279 +0.058678158,0.457882119,0.491090679 +0.46503574,0.647148555,0.063745514 +0.268569925,0.07151649,0.354414339 +0.309997568,0.048651773,0.652050824 +0.852057231,0.800064591,0.378993288 +0.101844132,0.975250128,0.919521375 +0.879950774,0.012524944,0.243977924 +0.71298613,0.410784591,0.766666426 +0.253953963,0.18863912,0.353408633 +0.859540187,0.786140568,0.50468592 +0.885165537,0.182373738,0.365436093 +0.919226953,0.132590959,0.305319302 +0.794222067,0.325843691,0.81503301 +0.360472386,0.828503699,0.992751302 +0.568328182,0.596642015,0.166689456 +0.495797608,0.390533497,0.466894225 +0.497383703,0.057721092,0.136501948 +0.18770586,0.924785691,0.325442341 +0.693138587,0.351786889,0.499636742 +0.898980429,0.759285754,0.006488642 +0.203362481,0.362873482,0.576750046 +0.178651329,0.720602676,0.881219809 +0.176525065,0.325805008,0.029694687 +0.280908733,0.527522643,0.545345238 +0.370750152,0.138599939,0.044930538 +0.675097184,0.14761356,0.378589866 +0.735023127,0.793326142,0.751658301 +0.589712544,0.569527756,0.006401988 +0.528971516,0.297342992,0.454367414 +0.691477287,0.799565463,0.424110191 +0.261622015,0.848996059,0.848455301 +0.401014342,0.684428894,0.631646442 +0.16646465,0.252704215,0.907185556 +0.100875707,0.566947803,0.906685851 +0.434813596,0.104021401,0.167032575 +0.525475323,0.508926771,0.950312938 +0.159164103,0.298161029,0.813651341 +0.688364345,0.371765734,0.533450516 +0.712069354,0.849924822,0.351626269 +0.322500041,0.141195673,0.954104724 +0.146595062,0.93264431,0.190821916 +0.71991816,0.904994255,0.945180752 +0.025505056,0.369278227,0.225567491 +0.450884297,0.163076541,0.835655337 +0.666130325,0.52707414,0.82767262 +0.747584223,0.050899988,0.253442115 +0.525074918,0.930938393,0.27765909 +0.940041036,0.129750051,0.169526547 +0.976328221,0.406056506,0.156213454 +0.413206486,0.217043404,0.425652131 +0.108491931,0.963192763,0.498477601 +0.958709036,0.585116585,0.507265441 +0.048428848,0.713725414,0.728970388 +0.587791364,0.896305822,0.279922122 +0.086686919,0.740059232,0.914875869 +0.422027713,0.086096483,0.419750985 +0.767716034,0.871663257,0.103971292 +0.549835043,0.371430165,0.801009346 +0.557408598,0.341725364,0.279171927 +0.071240148,0.765613908,0.173767574 +0.713230298,0.779720404,0.253165546 +0.572322236,0.663937254,0.045664107 +0.428432377,0.161070991,0.891029544 +0.818292324,0.971164957,0.271696059 +0.269446053,0.962766931,0.051526478 +0.515277086,0.74833971,0.351491465 +0.796419252,0.556278732,0.361314209 +0.801556269,0.987424165,0.117197305 +0.782772261,0.05866778,0.982749779 +0.21806961,0.609256862,0.798461899 +0.699205142,0.038761394,0.271238908 +0.534754129,0.27476979,0.163606178 +0.003518131,0.437675965,0.388250875 +0.619198012,0.090710318,0.566559914 +0.178576562,0.885793567,0.022734794 +0.578539981,0.281190469,0.008260142 +0.177713211,0.393560621,0.052236228 +0.846158221,0.357695748,0.875170299 +0.127568308,0.638314871,0.946658268 +0.767138325,0.621405933,0.564104167 +0.798451074,0.40443786,0.599831193 +0.616223487,0.665752297,0.971012789 +0.267441096,0.388352985,0.430687937 +0.923867358,0.654582643,0.464037122 +0.492137227,0.706258913,0.378247168 +0.536642887,0.555595419,0.104998227 +0.992969717,0.688862613,0.896407883 +0.454975157,0.851727744,0.144297419 +0.317976254,0.620102227,0.416793119 +0.440632343,0.535615753,0.913356284 +0.791010869,0.962116708,0.627040144 +0.926826073,0.382456611,0.465806072 +0.568904993,0.514101455,0.724489494 +0.895517901,0.391005356,0.347893715 +0.289875186,0.830981849,0.92116788 +0.95185048,0.996829271,0.970163256 +0.079055453,0.999386589,0.528208258 +0.926932102,0.147799896,0.417138668 +0.244651465,0.832349744,0.221104338 +0.179560876,0.149581841,0.97827318 +0.869778794,0.116050413,0.930858226 +0.681347988,0.700100934,0.003010153 +0.688804753,0.087819887,0.217246073 +0.054919581,0.536206628,0.011960678 +0.640496257,0.193125181,0.654595034 +0.879605152,0.152112809,0.50946439 +0.336877078,0.352944356,0.032651908 +0.578287892,0.410740871,0.424981809 +0.655610763,0.370342392,0.021605292 +0.184746216,0.078627828,0.615262076 +0.335250916,0.744164606,0.7834867 +0.086006226,0.796624922,0.100735176 +0.278674471,0.483655368,0.117132599 +0.994681992,0.915583798,0.682419845 +0.077364925,0.488968443,0.762836001 +0.460939585,0.226843633,0.262301782 +0.998409563,0.464398025,0.918229672 +0.221191504,0.605272697,0.236818579 +0.305532514,0.107986913,0.285771959 +0.429457882,0.021852143,0.417044654 +0.4398254,0.904405397,0.587007492 +0.472361927,0.615492219,0.311474339 +0.4847793,0.830454499,0.692963217 +0.525054945,0.760690911,0.176296268 +0.117729529,0.425190139,0.763022992 +0.435815483,0.901034288,0.68353143 +0.310722347,0.711502874,0.050054312 +0.692557474,0.756865138,0.823601442 +0.748561397,0.302607431,0.404056776 +0.370478834,0.749199053,0.220199408 +0.686929375,0.172808164,0.22046762 +0.037511035,0.299597568,0.543432459 +0.513900441,0.892613907,0.740051648 +0.389543522,0.806516669,0.891439062 +0.053758187,0.367104684,0.356060944 +0.450039969,0.18662041,0.022226949 +0.481122219,0.376490604,0.455652341 +0.97009151,0.252002631,0.121449418 +0.322174741,0.359645571,0.785282495 +0.904310053,0.730301338,0.994210513 +0.450101531,0.92830086,0.086584177 +0.456948101,0.90305291,0.216589856 +0.430158828,0.574385535,0.812451667 +0.958800913,0.229029132,0.004822368 +0.641856333,0.757170989,0.097059421 +0.442276634,0.278413528,0.877655305 +0.036927777,0.425286999,0.92305997 +0.996003678,0.902465847,0.265142606 +0.306340939,0.260744837,0.528606261 +0.098272048,0.162476078,0.354882218 +0.658054373,0.890822429,0.9000076 +0.087284546,0.695167739,0.026293663 +0.667310433,0.902843368,0.248946207 +0.451887926,0.995052067,0.181712955 +0.721298527,0.006611482,0.727102995 +0.180137144,0.38951174,0.678305837 +0.420761331,0.419860176,0.010656383 +0.788488075,0.180473318,0.708019695 +0.662265015,0.757397169,0.348937464 +0.22732873,0.663301685,0.39923678 +0.716892599,0.552981067,0.089832495 +0.177215605,0.465175647,0.887666589 +0.4010009,0.597937203,0.09497585 +0.259096154,0.591668012,0.145793124 +0.7855796,0.541345166,0.383678057 +0.201753532,0.613603748,0.879697044 +0.825321851,0.452349759,0.192581377 +0.171266337,0.782789247,0.848185787 +0.989170718,0.575391852,0.643933271 +0.224216552,0.128615538,0.261286445 +0.355440689,0.629457955,0.902600249 +0.72784327,0.282293864,0.605943451 +0.210467186,0.748327916,0.269725684 +0.703080367,0.411052005,0.029450281 +0.611720264,0.653108765,0.115754888 +0.625714261,0.426502244,0.253625516 +0.080879639,0.231561531,0.000776511 +0.580765049,0.214103901,0.655333535 +0.411287343,0.079075761,0.794277642 +0.710073858,0.646863988,0.71074505 +0.335569397,0.900645276,0.683474835 +0.967747154,0.579773932,0.534024604 +0.766717973,0.582199309,0.533102234 +0.383468743,0.426721157,0.027251934 +0.490400205,0.117276739,0.92366954 +0.526437331,0.70107653,0.671085752 +0.889392656,0.764668251,0.594183178 +0.638642815,0.578480214,0.97861599 +0.87668719,0.16462794,0.216101311 +0.42672965,0.578827138,0.263549989 +0.811170473,0.093966938,0.225951223 +0.099089206,0.263591386,0.882393744 +0.38399777,0.327948679,0.494541301 +0.183583616,0.008025085,0.345896483 +0.584960878,0.5469813,0.968535684 +0.361345034,0.854037953,0.527327995 +0.984905322,0.997741532,0.876521812 +0.074758264,0.39928899,0.847634791 +0.78330323,0.392062416,0.024783838 +0.467728166,0.712167022,0.024533141 +0.587280899,0.398576247,0.573112113 +0.964829971,0.025982741,0.969019811 +0.9497508,0.659436309,0.204878206 +0.657359903,0.347373583,0.193308068 +0.186434557,0.521059421,0.070439079 +0.870109867,0.062761012,0.710077454 +0.217962469,0.288311322,0.190708548 +0.955539243,0.022311215,0.71590241 +0.625665814,0.76136552,0.988044588 +0.597252746,0.710748192,0.314068902 +0.516054372,0.327282916,0.54307302 +0.271367679,0.738701611,0.304169987 +0.933804469,0.580994455,0.210076964 +0.127919156,0.599299518,0.585857959 +0.676065679,0.558987708,0.958866142 +0.316141871,0.460898294,0.141769324 +0.471335921,0.089770919,0.358606362 +0.623875078,0.120949677,0.031070096 +0.279561054,0.756633154,0.523821594 +0.367638452,0.041473293,0.205100917 +0.194748444,0.554149226,0.891998106 +0.41189445,0.060780804,0.739908884 +0.463521747,0.175865472,0.535693142 +0.945971006,0.966028962,0.856940254 +0.183047078,0.337562524,0.181769865 +0.594627884,0.198176957,0.150059332 +0.843270928,0.530723522,0.928016742 +0.223830394,0.396224789,0.671524797 +0.660767374,0.651553136,0.816830801 +0.435601302,0.067504838,0.286367496 +0.118647364,0.597413606,0.736034901 +0.130876628,0.718657894,0.132667782 +0.512036173,0.807939768,0.573980493 +0.651567779,0.146952948,0.239972065 +0.288725439,0.224872447,0.043641949 +0.13707238,0.381109232,0.022199238 +0.754226814,0.167426623,0.961971718 +0.951586322,0.053557001,0.223348551 +0.618926676,0.885546611,0.123622882 +0.790423531,0.278666859,0.501354777 +0.038612914,0.868235102,0.288826116 +0.488859959,0.478054033,0.700027159 +0.862804894,0.011591559,0.750381881 +0.994070885,0.954113216,0.968886216 +0.452966461,0.985185262,0.402556559 +0.163204173,0.188199516,0.352205827 +0.15850908,0.505182571,0.583169832 +0.135779826,0.409087768,0.238200196 +0.643385144,0.86154063,0.14538336 +0.50233965,0.544662955,0.992305772 +0.208435385,0.031950832,0.061424365 +0.866478253,0.391456921,0.511463088 +0.4937369,0.216683838,0.68183869 +0.635277683,0.264963125,0.828569956 +0.57036797,0.199089208,0.947261901 +0.622849636,0.554898686,0.300444481 +0.148150252,0.793195105,0.95852649 +0.118643776,0.375521816,0.127817104 +0.758672306,0.928120507,0.147843091 +0.988902496,0.305378105,0.027460368 +0.101391422,0.187140233,0.666743757 +0.742622491,0.913697728,0.538923383 +0.093250323,0.083342814,0.253041857 +0.769590781,0.9991462,0.438612548 +0.729371479,0.304770086,0.732577389 +0.309854988,0.231328158,0.907015378 +0.357043464,0.291981607,0.210471606 +0.310867898,0.310831132,0.021305479 +0.099716251,0.743995352,0.892636908 +0.41508308,0.015438634,0.257251295 +0.53442204,0.552940574,0.911759333 +0.066875817,0.519643391,0.683239895 +0.960228558,0.637860456,0.564663828 +0.166667197,0.282113595,0.909573438 +0.400063729,0.629753113,0.314970443 +0.708945745,0.167807931,0.868195558 +0.371947838,0.749772529,0.913374887 +0.364252703,0.719347038,0.968988396 +0.565947998,0.47317603,0.848594323 +0.963005103,0.86347636,0.213376655 +0.010974265,0.115488107,0.918644935 +0.579274525,0.748172658,0.195517101 +0.054742886,0.089561473,0.35514667 +0.352904397,0.177453817,0.485671073 +0.86540568,0.455589491,0.325840682 +0.826269285,0.742045207,0.836774969 +0.075485913,0.446267336,0.134777488 +0.123130773,0.10695964,0.319080831 +0.353341713,0.250920125,0.94582804 +0.934151416,0.641155987,0.332526901 +0.183094596,0.975798892,0.512697523 +0.931523642,0.525759501,0.067066893 +0.171012136,0.581683693,0.603794825 +0.489763176,0.561915728,0.886623062 +0.427818728,0.227974683,0.462025302 +0.059325421,0.726266371,0.692412984 +0.770271664,0.743519141,0.117959307 +0.107862896,0.552555172,0.592259145 +0.445007388,0.046308389,0.69499137 +0.056486616,0.370154602,0.498507879 +0.347798483,0.541312622,0.44955603 +0.01637411,0.777726654,0.346640124 +0.918778501,0.247274577,0.931656904 +0.468325578,0.552066653,0.233304727 +0.558842714,0.30110019,0.237582706 +0.520406065,0.396600845,0.627623904 +0.42717615,0.55961213,0.312743984 +0.043819454,0.060632818,0.168267929 +0.151405047,0.276450913,0.385322692 +0.864539894,0.203199707,0.865006307 +0.866179018,0.649792248,0.369625823 +0.566181508,0.155001949,0.751738414 +0.022193506,0.262524266,0.378478591 +0.835870282,0.436869514,0.439857307 +0.54507765,0.825712044,0.425012638 +0.180124959,0.284189803,0.059324375 +0.91303517,0.659662103,0.021990781 +0.068890512,0.857174742,0.245915138 +0.146299591,0.2282098,0.992357695 +0.279495766,0.087424865,0.532747766 +0.095737503,0.107245868,0.190786801 +0.276947216,0.537071712,0.654100689 +0.010738646,0.40673838,0.479608479 +0.420307684,0.947352567,0.178277524 +0.108124774,0.127227634,0.278086371 +0.18958629,0.587262704,0.69187928 +0.814773727,0.220263054,0.007250506 +0.948149379,0.572617808,0.939774741 +0.150492895,0.970045889,0.979230909 +0.997567108,0.897085006,0.573132383 +0.039773611,0.517659257,0.317936584 +0.915778891,0.598912752,0.541405962 +0.081857212,0.994515385,0.261260636