diff options
author | Arnur Nigmetov <nigmetov@tugraz.at> | 2020-03-09 16:43:07 +0100 |
---|---|---|
committer | Arnur Nigmetov <nigmetov@tugraz.at> | 2020-03-09 16:43:07 +0100 |
commit | ca4222ab40f1c6c0d17fb7d43539aa675f640976 (patch) | |
tree | e2a91037ac1d9e8895eafbab54c1c11f0b257c85 /matching/include/bifiltration.h | |
parent | 7fb44351b487c64f23066a428089ef14a95b4176 (diff) | |
parent | 14e91d6c3ad81a1ec763d75a28f20fb689e5166e (diff) |
Merge README
Diffstat (limited to 'matching/include/bifiltration.h')
-rw-r--r-- | matching/include/bifiltration.h | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/matching/include/bifiltration.h b/matching/include/bifiltration.h new file mode 100644 index 0000000..4dd8662 --- /dev/null +++ b/matching/include/bifiltration.h @@ -0,0 +1,140 @@ +#ifndef MATCHING_DISTANCE_BIFILTRATION_H +#define MATCHING_DISTANCE_BIFILTRATION_H + +#include <string> +#include <ostream> +#include <iostream> +#include <fstream> +#include <sstream> +#include <cassert> + +#include "common_util.h" +#include "box.h" +#include "simplex.h" +#include "dual_point.h" +#include "phat/boundary_matrix.h" +#include "phat/compute_persistence_pairs.h" + +#include "spdlog/spdlog.h" +#include "spdlog/fmt/fmt.h" +#include "spdlog/fmt/ostr.h" + +#include "common_util.h" + +namespace md { + + template<class Real> + class Bifiltration { + public: + using SimplexVector = std::vector<Simplex<Real>>; + + Bifiltration() = default; + + Bifiltration(const Bifiltration&) = default; + + Bifiltration(Bifiltration&&) = default; + + Bifiltration& operator=(const Bifiltration& other)& = default; + + Bifiltration& operator=(Bifiltration&& other) = default; + + Bifiltration(const std::string& fname); // read from file + + template<class Iter> + Bifiltration(Iter begin, Iter end) + : simplices_(begin, end) + { + init(); + } + + Diagram<Real> weighted_slice_diagram(const DualPoint<Real>& line, int dim) const; + + SimplexVector simplices() const { return simplices_; } + + // translate all points by vector (a,a) + void translate(Real a); + + // return minimal value of x- and y-coordinates + // among all simplices + Real minimal_coordinate() const; + + // return box that contains positions of all simplices + Box<Real> bounding_box() const; + + void sanity_check() const; + + int maximal_dim() const { return maximal_dim_; } + + Real max_x() const; + + Real max_y() const; + + Real min_x() const; + + Real min_y() const; + + void add_simplex(Index _id, Point<Real> birth, int _dim, const Column& _bdry); + + void save(const std::string& filename, BifiltrationFormat format = BifiltrationFormat::rivet); // save to file + + void scale(Real lambda); + + private: + SimplexVector simplices_; + + Box<Real> bounding_box_; + int maximal_dim_ {-1}; + + void init(); + + void rivet_format_reader(std::ifstream&); + + void phat_like_format_reader(std::ifstream&); + + // in Rene format each simplex knows IDs of its boundary facets + // postprocess_phat_like_format fills vector of IDs of boundary facets + // in each simplex + void postprocess_phat_like_format(); + + // in Rivet format each simplex knows its vertices, + // postprocess_rivet_format fills vector of IDs of boundary facets + // in each simplex + void postprocess_rivet_format(); + + }; + + template<class Real> + std::ostream& operator<<(std::ostream& os, const Bifiltration<Real>& bif); + + template<class Real> + class BifiltrationProxy { + public: + BifiltrationProxy(const Bifiltration<Real>& bif, int dim = 0); + // return critical values of simplices that are important for current dimension (dim and dim+1) + PointVec<Real> positions() const; + // set current dimension + int set_dim(int new_dim); + + // wrappers of Bifiltration + int maximal_dim() const; + void translate(Real a); + Real minimal_coordinate() const; + Box<Real> bounding_box() const; + Real max_x() const; + Real max_y() const; + Real min_x() const; + Real min_y() const; + Diagram<Real> weighted_slice_diagram(const DualPoint<Real>& slice) const; + + private: + int dim_ { 0 }; + mutable PointVec<Real> cached_positions_; + Bifiltration<Real> bif_; + + void cache_positions() const; + }; +} + +#include "bifiltration.hpp" + +#endif //MATCHING_DISTANCE_BIFILTRATION_H |