diff options
author | Ulrich Bauer <ulrich.bauer@tum.de> | 2015-11-09 14:03:29 -0500 |
---|---|---|
committer | Ulrich Bauer <ulrich.bauer@tum.de> | 2015-11-09 14:03:29 -0500 |
commit | 07f9b5d36ebeceb796ec711892cddc49d114c90a (patch) | |
tree | 3d7d298f6cd1bbfb94c831e0113ebb5f641e4ab5 | |
parent | e361112c56e2c26c2250a9b7a99eccd3851b89b4 (diff) |
fixed code to enable cached diameters without coefficients
-rw-r--r-- | ripser.cpp | 174 |
1 files changed, 92 insertions, 82 deletions
@@ -18,20 +18,20 @@ typedef long coefficient_t; //#define PRECOMPUTE_DIAMETERS //#define PRECOMPUTE_DIAMETERS_IN_TOP_DIMENSION -#define STORE_DIAMETERS +//#define STORE_DIAMETERS #define USE_BINARY_SEARCH //#define USE_EXPONENTIAL_SEARCH -#define ASSEMBLE_REDUCTION_MATRIX -#define USE_COEFFICIENTS +//#define ASSEMBLE_REDUCTION_MATRIX +//#define USE_COEFFICIENTS //#define INDICATE_PROGRESS -#define PRINT_PERSISTENCE_PAIRS +//#define PRINT_PERSISTENCE_PAIRS //#define FILE_FORMAT_DIPHA -//#define FILE_FORMAT_UPPER_TRIANGULAR_CSV -#define FILE_FORMAT_LOWER_TRIANGULAR_CSV +#define FILE_FORMAT_UPPER_TRIANGULAR_CSV +//#define FILE_FORMAT_LOWER_TRIANGULAR_CSV class binomial_coeff_table { std::vector<std::vector<index_t> > B; @@ -124,63 +124,7 @@ std::vector<index_t> vertices_of_simplex(const index_t simplex_index, const inde return vertices; } -template <typename DistanceMatrix> -class rips_filtration_comparator { -public: - const DistanceMatrix& dist; - - const index_t dim; - -private: - mutable std::vector<index_t> vertices; - - const binomial_coeff_table& binomial_coeff; - -public: - rips_filtration_comparator( - const DistanceMatrix& _dist, - const index_t _dim, - const binomial_coeff_table& _binomial_coeff - ): dist(_dist), dim(_dim), vertices(_dim + 1), binomial_coeff(_binomial_coeff) {}; - - inline value_t diameter(const index_t index) const { - value_t diam = 0; - get_simplex_vertices(index, dim, dist.size(), binomial_coeff, vertices.begin() ); - - for (index_t i = 0; i <= dim; ++i) - for (index_t j = 0; j < i; ++j) { - diam = std::max(diam, dist(vertices[i], vertices[j])); - } - return diam; - } - - inline bool operator()(const index_t a, const index_t b) const - { - assert(a < binomial_coeff(dist.size(), dim + 1)); - assert(b < binomial_coeff(dist.size(), dim + 1)); - - value_t a_diam = 0, b_diam = 0; - - b_diam = diameter(b); - - get_simplex_vertices(a, dim, dist.size(), binomial_coeff, vertices.begin() ); - for (index_t i = 0; i <= dim; ++i) - for (index_t j = i + 1; j <= dim; ++j) { - a_diam = std::max(a_diam, dist(vertices[i], vertices[j])); - if (a_diam > b_diam) - return true; - } - - return (a_diam == b_diam) && (a > b); - } - - template <typename Entry> - inline bool operator()(const Entry& a, const Entry& b) const - { - return operator()(get_index(a), get_index(b)); - } -}; #ifdef USE_COEFFICIENTS struct entry_t { @@ -225,7 +169,7 @@ std::ostream& operator<< (std::ostream& stream, const entry_t& e) { typedef index_t entry_t; -inline index_t get_index(entry_t i) { +inline const index_t get_index(entry_t i) { return i; } @@ -237,6 +181,8 @@ inline entry_t make_entry(index_t _index, coefficient_t _value) { return entry_t(_index); } +inline void set_coefficient(index_t& e, const coefficient_t c) { e = c; } + #endif inline const entry_t& get_entry(const entry_t& e) { return e; } @@ -248,6 +194,89 @@ struct greater_index { }; + +#ifdef STORE_DIAMETERS +typedef std::pair<entry_t, value_t> entry_diameter_t; + +inline const entry_t& get_entry(const entry_diameter_t& p) { return p.first; } +inline entry_t& get_entry(entry_diameter_t& p) { return p.first; } +inline const index_t get_index(const entry_diameter_t& p) { return get_index(get_entry(p)); } +inline const coefficient_t get_coefficient(const entry_diameter_t& p) { return get_coefficient(get_entry(p)); } +inline const value_t& get_diameter(const entry_diameter_t& p) { return p.second; } +inline void set_coefficient(entry_diameter_t& p, const coefficient_t c) { set_coefficient(get_entry(p), c); } + + +struct greater_diameter_or_index { + inline bool operator() (const entry_diameter_t& a, const entry_diameter_t& b) { + return (get_diameter(a) > get_diameter(b)) || + ((get_diameter(a) == get_diameter(b)) && (get_index(a) > get_index(b))); + } +}; +#else +typedef entry_t entry_diameter_t; +#endif + + + +template <typename DistanceMatrix> +class rips_filtration_comparator { +public: + const DistanceMatrix& dist; + + const index_t dim; + +private: + mutable std::vector<index_t> vertices; + + const binomial_coeff_table& binomial_coeff; + +public: + rips_filtration_comparator( + const DistanceMatrix& _dist, + const index_t _dim, + const binomial_coeff_table& _binomial_coeff + ): dist(_dist), dim(_dim), vertices(_dim + 1), binomial_coeff(_binomial_coeff) {}; + + inline value_t diameter(const index_t index) const { + value_t diam = 0; + get_simplex_vertices(index, dim, dist.size(), binomial_coeff, vertices.begin() ); + + for (index_t i = 0; i <= dim; ++i) + for (index_t j = 0; j < i; ++j) { + diam = std::max(diam, dist(vertices[i], vertices[j])); + } + return diam; + } + + inline bool operator()(const index_t a, const index_t b) const + { + assert(a < binomial_coeff(dist.size(), dim + 1)); + assert(b < binomial_coeff(dist.size(), dim + 1)); + + value_t a_diam = 0, b_diam = 0; + + b_diam = diameter(b); + + get_simplex_vertices(a, dim, dist.size(), binomial_coeff, vertices.begin() ); + for (index_t i = 0; i <= dim; ++i) + for (index_t j = i + 1; j <= dim; ++j) { + a_diam = std::max(a_diam, dist(vertices[i], vertices[j])); + if (a_diam > b_diam) + return true; + } + + return (a_diam == b_diam) && (a > b); + } + + template <typename Entry> + inline bool operator()(const Entry& a, const Entry& b) const + { + return operator()(get_index(a), get_index(b)); + } + +}; + + class simplex_coboundary_enumerator { private: index_t idx, modified_idx, dim, n, k; @@ -499,25 +528,6 @@ public: -#ifdef STORE_DIAMETERS -typedef std::pair<entry_t, value_t> entry_diameter_t; - -inline const entry_t& get_entry(const entry_diameter_t& p) { return p.first; } -inline const index_t get_index(const entry_diameter_t& p) { return get_index(get_entry(p)); } -inline const coefficient_t get_coefficient(const entry_diameter_t& p) { return get_coefficient(get_entry(p)); } -inline const value_t& get_diameter(const entry_diameter_t& p) { return p.second; } -inline void set_coefficient(entry_diameter_t& p, const coefficient_t c) { set_coefficient(p.first, c); } - - -struct greater_diameter_or_index { - inline bool operator() (const entry_diameter_t& a, const entry_diameter_t& b) { - return (get_diameter(a) > get_diameter(b)) || - ((get_diameter(a) == get_diameter(b)) && (get_index(a) > get_index(b))); - } -}; -#else -typedef entry_t entry_diameter_t; -#endif #ifdef USE_COEFFICIENTS |