From e778857da09c25ed351b5e77dcba319ce44fdb7f Mon Sep 17 00:00:00 2001 From: mcarrier Date: Thu, 10 May 2018 05:52:21 +0000 Subject: added betti sequences git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/kernels@3431 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 4680471ce781468c247c40fb5e6eb699dce890c8 --- .../example/CMakeLists.txt | 5 ++ .../example/betti_sequence.cpp | 49 +++++++++++ .../persistence_landscape_on_grid_exact.cpp | 4 +- .../include/gudhi/Betti_sequence.h | 95 ++++++++++++++++++++++ .../gudhi/Persistence_landscape_on_grid_exact.h | 25 +++--- 5 files changed, 164 insertions(+), 14 deletions(-) create mode 100644 src/Persistence_representations/example/betti_sequence.cpp create mode 100644 src/Persistence_representations/include/gudhi/Betti_sequence.h (limited to 'src/Persistence_representations') diff --git a/src/Persistence_representations/example/CMakeLists.txt b/src/Persistence_representations/example/CMakeLists.txt index 3142f19b..9be22085 100644 --- a/src/Persistence_representations/example/CMakeLists.txt +++ b/src/Persistence_representations/example/CMakeLists.txt @@ -46,3 +46,8 @@ add_executable ( Persistence_landscape_on_grid_exact persistence_landscape_on_gr add_test(NAME Persistence_landscape_on_grid_exact COMMAND $) install(TARGETS Persistence_landscape_on_grid_exact DESTINATION bin) + +add_executable ( Betti_sequence betti_sequence.cpp ) +add_test(NAME Betti_sequence + COMMAND $) +install(TARGETS Betti_sequence DESTINATION bin) diff --git a/src/Persistence_representations/example/betti_sequence.cpp b/src/Persistence_representations/example/betti_sequence.cpp new file mode 100644 index 00000000..a422a822 --- /dev/null +++ b/src/Persistence_representations/example/betti_sequence.cpp @@ -0,0 +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): Mathieu Carriere + * + * Copyright (C) 2018 INRIA (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 . + */ + +#include + +#include +#include +#include + +using Persistence_diagram = Gudhi::Persistence_representations::Persistence_diagram; +using BS = Gudhi::Persistence_representations::Betti_sequence; + +int main(int argc, char** argv) { + + Persistence_diagram persistence; + + persistence.push_back(std::make_pair(1, 2)); + persistence.push_back(std::make_pair(6, 8)); + persistence.push_back(std::make_pair(0, 4)); + persistence.push_back(std::make_pair(3, 8)); + + double min_x = 0; double max_x = 8; int res_x = 1000; + + BS bs(persistence, min_x, max_x, res_x); + std::vector B = bs.vectorize(); + + for(int i = 0; i < res_x; i++) std::cout << B[i] << ", "; + + return 0; +} diff --git a/src/Persistence_representations/example/persistence_landscape_on_grid_exact.cpp b/src/Persistence_representations/example/persistence_landscape_on_grid_exact.cpp index da27bc5a..9ce42649 100644 --- a/src/Persistence_representations/example/persistence_landscape_on_grid_exact.cpp +++ b/src/Persistence_representations/example/persistence_landscape_on_grid_exact.cpp @@ -38,13 +38,13 @@ int main(int argc, char** argv) { persistence.push_back(std::make_pair(0, 4)); persistence.push_back(std::make_pair(3, 8)); - int nb_ls = 3; double min_x = 0.0; double max_x = 10.0; int res_x = 100; + int nb_ls = 2; double min_x = 0; double max_x = 8; int res_x = 1000; LS ls(persistence, nb_ls, min_x, max_x, res_x); std::vector > L = ls.vectorize(); for(int i = 0; i < nb_ls; i++){ - for(int j = 0; j < res_x; j++) std::cout << L[i][j] << " "; + for(int j = 0; j < res_x; j++) std::cout << L[i][j] << ", "; std::cout << std::endl; } diff --git a/src/Persistence_representations/include/gudhi/Betti_sequence.h b/src/Persistence_representations/include/gudhi/Betti_sequence.h new file mode 100644 index 00000000..57c52ad2 --- /dev/null +++ b/src/Persistence_representations/include/gudhi/Betti_sequence.h @@ -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): Mathieu Carriere + * + * Copyright (C) 2018 INRIA (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 BETTI_SEQUENCE_H_ +#define BETTI_SEQUENCE_H_ + +// gudhi include +#include +#include +#include + +// standard include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Gudhi { +namespace Persistence_representations { + +/** + * \class Betti_sequence gudhi/Betti_sequence.h + * \brief A class implementing Betti sequences + * + * \ingroup Persistence_representations + * + * \details +**/ + +class Betti_sequence { + + protected: + Persistence_diagram diagram; + int res_x, nb_cv; + double min_x, max_x; + + public: + + /** \brief Betti_sequence constructor. + * \ingroup Betti_sequence + * + * @param[in] _diagram persistence diagram. + * @param[in] _min_x minimum value of samples. + * @param[in] _max_x maximum value of samples. + * @param[in] _res_x number of samples. + * + */ + Betti_sequence(const Persistence_diagram & _diagram, double _min_x = 0.0, double _max_x = 1.0, int _res_x = 10){diagram = _diagram; min_x = _min_x; max_x = _max_x; res_x = _res_x;} + + /** \brief Computes the Betti sequences of a diagram. + * \ingroup Betti_sequence + * + */ + std::vector vectorize() const { + int num_pts = diagram.size(); double step = (max_x - min_x)/(res_x - 1); + std::vector bs(res_x); for(int i = 0; i < res_x; i++) bs[i] = 0; + for(int j = 0; j < num_pts; j++){ + double px = diagram[j].first; double py = diagram[j].second; + int first = std::ceil((px-min_x)/step); int last = std::ceil((py-min_x)/step); + for(int i = first; i < last; i++) bs[i] += 1; + } + + return bs; + } + +}; // class Betti_sequence +} // namespace Persistence_representations +} // namespace Gudhi + +#endif // BETTI_SEQUENCE_H_ diff --git a/src/Persistence_representations/include/gudhi/Persistence_landscape_on_grid_exact.h b/src/Persistence_representations/include/gudhi/Persistence_landscape_on_grid_exact.h index 25f71e27..52f24195 100644 --- a/src/Persistence_representations/include/gudhi/Persistence_landscape_on_grid_exact.h +++ b/src/Persistence_representations/include/gudhi/Persistence_landscape_on_grid_exact.h @@ -82,24 +82,25 @@ class Persistence_landscape_on_grid_exact { */ std::vector > vectorize() const { std::vector > ls; for(int i = 0; i < nb_ls; i++) ls.emplace_back(); - int num_pts = diagram.size(); double step = (max_x - min_x)/res_x; + int num_pts = diagram.size(); double step = (max_x - min_x)/(res_x - 1); + + std::vector > ls_t; for(int i = 0; i < res_x; i++) ls_t.emplace_back(); + for(int j = 0; j < num_pts; j++){ + double px = diagram[j].first; double py = diagram[j].second; double mid = (px+py)/2; + int first = std::ceil((px-min_x)/step); int middle = std::ceil((mid-min_x)/step); int last = std::ceil((py-min_x)/step); double x = min_x + first*step; + for(int i = first; i < middle; i++){ double value = std::sqrt(2)*(x-px); ls_t[i].push_back(value); x += step; } + for(int i = middle; i < last; i++){ double value = std::sqrt(2)*(py-x); ls_t[i].push_back(value); x += step; } + } for(int i = 0; i < res_x; i++){ - double x = min_x + i*step; double t = x / std::sqrt(2); std::vector events; - for(int j = 0; j < num_pts; j++){ - double px = diagram[j].first; double py = diagram[j].second; - if(t >= px && t <= py){ if(t >= (px+py)/2) events.push_back(std::sqrt(2)*(py-t)); else events.push_back(std::sqrt(2)*(t-px)); } - } - - std::sort(events.begin(), events.end(), [](const double & a, const double & b){return a > b;}); int nb_events = events.size(); - for (int j = 0; j < nb_ls; j++){ if(j < nb_events) ls[j].push_back(events[j]); else ls[j].push_back(0); } + std::sort(ls_t[i].begin(), ls_t[i].end(), [](const double & a, const double & b){return a > b;}); + int nb_events_i = ls_t[i].size(); + for (int j = 0; j < nb_ls; j++){ if(j < nb_events_i) ls[j].push_back(ls_t[i][j]); else ls[j].push_back(0); } } + return ls; } - - - }; // class Persistence_landscape_on_grid_exact } // namespace Persistence_representations } // namespace Gudhi -- cgit v1.2.3