/* 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 . */ #ifndef PICK_RANDOM_POINTS_H_ #define PICK_RANDOM_POINTS_H_ #include #include // random_device, mt19937 #include // shuffle #include // iota #include #include namespace Gudhi { /** * \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 them to an output iterator. * Point_container::iterator should be ValueSwappable and RandomAccessIterator. */ template void pick_random_points(Point_container const &points, unsigned nbL, OutputIterator output_it) { #ifdef GUDHI_LM_PROFILING Gudhi::Clock t; #endif unsigned nbP = boost::size(points); assert(nbP >= nbL); std::vector 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(nbL); for (int l: landmarks) *output_it++ = points[l]; #ifdef GUDHI_LM_PROFILING t.end(); std::cerr << "Random landmark choice took " << t.num_seconds() << " seconds." << std::endl; #endif } } // namespace Gudhi #endif // PICK_RANDOM_POINTS_H_