summaryrefslogtreecommitdiff
path: root/src/Subsampling/include/gudhi/pick_n_random_points.h
diff options
context:
space:
mode:
authorskachano <skachano@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2016-09-20 16:14:38 +0000
committerskachano <skachano@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2016-09-20 16:14:38 +0000
commit6ad5ac6794ebc46638cd1f0862a553f40d2557d7 (patch)
treeb00d85803303ea9d9a8c5fa381a04760dc65ad06 /src/Subsampling/include/gudhi/pick_n_random_points.h
parente8183d76c99eac5458d8f72cb4479cc680c6a6c4 (diff)
Renamed pick_random_points -> pick_n_random_points
git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/subsampling_and_spatialsearching@1516 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 45cc8cca9debf56dd0d21762e537649dd92d9a4d
Diffstat (limited to 'src/Subsampling/include/gudhi/pick_n_random_points.h')
-rw-r--r--src/Subsampling/include/gudhi/pick_n_random_points.h82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/Subsampling/include/gudhi/pick_n_random_points.h b/src/Subsampling/include/gudhi/pick_n_random_points.h
new file mode 100644
index 00000000..4ca1fafc
--- /dev/null
+++ b/src/Subsampling/include/gudhi/pick_n_random_points.h
@@ -0,0 +1,82 @@
+/* This file is part of the Gudhi Library. The Gudhi library
+ * (Geometric Understanding in Higher Dimensions) is a generic C++
+ * library for computational topology.
+ *
+ * Author(s): Siargey Kachanovich
+ *
+ * Copyright (C) 2016 INRIA
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef PICK_RANDOM_POINTS_H_
+#define PICK_RANDOM_POINTS_H_
+
+#include <boost/range/size.hpp>
+
+#include <random> // random_device, mt19937
+#include <algorithm> // shuffle
+#include <numeric> // iota
+#include <iterator>
+#include <gudhi/Clock.h>
+
+
+namespace Gudhi {
+
+namespace subsampling {
+
+ /**
+ * \ingroup subsampling
+ * \brief Subsample a point set by picking random vertices.
+ *
+ * \details It chooses `final_size` distinct points from a random access range `points`
+ * and outputs them to the output iterator `output_it`.
+ * Point_container::iterator should be ValueSwappable and RandomAccessIterator.
+ */
+
+ template <typename Point_container,
+ typename OutputIterator>
+ void pick_n_random_points(Point_container const &points,
+ unsigned final_size,
+ OutputIterator output_it) {
+#ifdef GUDHI_SUBS_PROFILING
+ Gudhi::Clock t;
+#endif
+
+ unsigned nbP = boost::size(points);
+ assert(nbP >= final_size);
+ std::vector<int> landmarks(nbP);
+ std::iota(landmarks.begin(), landmarks.end(), 0);
+
+ std::random_device rd;
+ std::mt19937 g(rd());
+
+ std::shuffle(landmarks.begin(), landmarks.end(), g);
+ landmarks.resize(final_size);
+
+ for (int l: landmarks)
+ *output_it++ = points[l];
+
+#ifdef GUDHI_SUBS_PROFILING
+ t.end();
+ std::cerr << "Random landmark choice took " << t.num_seconds()
+ << " seconds." << std::endl;
+#endif
+ }
+
+} // namesapce subsampling
+
+} // namespace Gudhi
+
+#endif // PICK_RANDOM_POINTS_H_