summaryrefslogtreecommitdiff
path: root/matching/include/common_util.hpp
blob: 9c7df37275d2df88055b3eecf867e296bf430c04 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <vector>
#include <utility>
#include <cmath>
#include <ostream>
#include <limits>
#include <algorithm>

#include <common_util.h>

namespace md {

    template<class Real>
    Point<Real> operator+(const Point<Real>& u, const Point<Real>& v)
    {
        return Point<Real>(u.x + v.x, u.y + v.y);
    }

    template<class Real>
    Point<Real> operator-(const Point<Real>& u, const Point<Real>& v)
    {
        return Point<Real>(u.x - v.x, u.y - v.y);
    }

    template<class Real>
    Point<Real> least_upper_bound(const Point<Real>& u, const Point<Real>& v)
    {
        return Point<Real>(std::max(u.x, v.x), std::max(u.y, v.y));
    }

    template<class Real>
    Point<Real> greatest_lower_bound(const Point<Real>& u, const Point<Real>& v)
    {
        return Point<Real>(std::min(u.x, v.x), std::min(u.y, v.y));
    }

    template<class Real>
    Point<Real> max_point()
    {
        return Point<Real>(std::numeric_limits<Real>::max(), std::numeric_limits<Real>::min());
    }

    template<class Real>
    Point<Real> min_point()
    {
        return Point<Real>(-std::numeric_limits<Real>::max(), -std::numeric_limits<Real>::min());
    }

    template<class Real>
    std::ostream& operator<<(std::ostream& ostr, const Point<Real>& vec)
    {
        ostr << "(" << vec.x << ", " << vec.y << ")";
        return ostr;
    }

    template<class Real>
    Real l_infty_norm(const Point<Real>& v)
    {
        return std::max(std::abs(v.x), std::abs(v.y));
    }

    template<class Real>
    Real l_2_norm(const Point<Real>& v)
    {
        return v.norm();
    }

    template<class Real>
    Real l_2_dist(const Point<Real>& x, const Point<Real>& y)
    {
        return l_2_norm(x - y);
    }

    template<class Real>
    Real l_infty_dist(const Point<Real>& x, const Point<Real>& y)
    {
        return l_infty_norm(x - y);
    }

    template<class Real>
    void DiagramKeeper<Real>::add_point(int dim, Real birth, Real death)
    {
        data_[dim].emplace_back(birth, death);
    }

    template<class Real>
    Diagram<Real> DiagramKeeper<Real>::get_diagram(int dim) const
    {
        if (data_.count(dim) == 1)
            return data_.at(dim);
        else
            return Diagram<Real>();
    }
}