From 355ff89d1860f8d928bbc97a542b4560c257b9e6 Mon Sep 17 00:00:00 2001 From: Gard Spreemann Date: Wed, 5 Aug 2020 16:12:17 +0200 Subject: Improve. --- include/pd.hpp | 82 ++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 66 insertions(+), 16 deletions(-) (limited to 'include/pd.hpp') diff --git a/include/pd.hpp b/include/pd.hpp index 04b8609..2641125 100644 --- a/include/pd.hpp +++ b/include/pd.hpp @@ -3,22 +3,32 @@ #include #include #include +#include #include #include #include "misc.hpp" -template class PD +template class Interval { public: - class Interval - { - public: - T birth; - T death; - }; + inline T length() const { return death - birth; } + T birth; + T death; +}; - +template inline bool operator==(Interval x, Interval y) { return x.birth == y.birth && x.death == y.death; } +template inline bool operator!=(Interval x, Interval y) { return !(x == y); } +template inline bool operator<(Interval x, Interval y) +{ + return (x.length() < y.length()) || + ((x.length() == y.length()) && (x.birth < y.birth)) || + (((x.length() == y.length()) && (x.birth == y.birth) && (x.death < y.death))); +} + +template class PD +{ +public: PD() : intervals() { }; @@ -27,7 +37,7 @@ public: { if (m > 0 && b < d) { - Interval interval; + Interval interval; interval.birth = b; interval.death = d; intervals.push_back(std::make_pair(interval, m)); @@ -45,18 +55,58 @@ public: } } - typename std::vector::Interval, unsigned int> >::size_type size() const { return intervals.size(); } + void discretize(T delta) + { + if (delta <= 0) + return; + for (auto it = begin(); it != end(); ++it) + { + it->first.birth = std::round(it->first.birth/delta)*delta; + it->first.death = std::round(it->first.death/delta)*delta; + } + } + + void compress_and_sort() + { + std::map, unsigned int> tmp; + for (auto it = cbegin(); it != cend(); ++it) + { + auto existing = tmp.find(it->first); + if (existing == tmp.end()) + { + tmp.insert(*it); + } + else + { + existing->second += it->second; + } + } + intervals = std::vector, unsigned int> >(tmp.cbegin(), tmp.cend()); + } + + unsigned int size() const + { + unsigned int ret = 0; + for (auto it = cbegin(); it != cend(); ++it) + ret += it->second; + return ret; + } + + inline typename std::vector, unsigned int> >::size_type size_2() const { return intervals.size(); } - using Iterator = typename std::vector::Interval, unsigned int> >::const_iterator; + using Iterator = typename std::vector, unsigned int> >::iterator; + using Const_iterator = typename std::vector, unsigned int> >::const_iterator; - inline Iterator cbegin() const { return intervals.cbegin(); } - inline Iterator cend() const { return intervals.cend(); } + inline Const_iterator cbegin() const { return intervals.cbegin(); } + inline Const_iterator cend() const { return intervals.cend(); } + inline Iterator begin() { return intervals.begin(); } + inline Iterator end() { return intervals.end(); } private: - std::vector::Interval, unsigned int> > intervals; + std::vector, unsigned int> > intervals; }; -inline double sqdist(PD::Interval x, PD::Interval y) +template inline T sqdist(Interval x, Interval y) { return (x.birth - y.birth)*(x.birth - y.birth) + (x.death - y.death)*(x.death - y.death); } @@ -68,7 +118,7 @@ template T heat_kernel(T sigma, const PD & a, const PD & b) for (auto it = a.cbegin(); it != a.cend(); ++it) { auto x = *it; - typename PD::Interval xbar; + Interval xbar; xbar.birth = x.first.death; xbar.death = x.first.birth; -- cgit v1.2.3