summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Bauer <ulrich.bauer@tum.de>2015-11-09 14:03:29 -0500
committerUlrich Bauer <ulrich.bauer@tum.de>2015-11-09 14:03:29 -0500
commit07f9b5d36ebeceb796ec711892cddc49d114c90a (patch)
tree3d7d298f6cd1bbfb94c831e0113ebb5f641e4ab5
parente361112c56e2c26c2250a9b7a99eccd3851b89b4 (diff)
fixed code to enable cached diameters without coefficients
-rw-r--r--ripser.cpp174
1 files changed, 92 insertions, 82 deletions
diff --git a/ripser.cpp b/ripser.cpp
index 5c29022..3b0acae 100644
--- a/ripser.cpp
+++ b/ripser.cpp
@@ -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