#include #include #include #include #include #include #include namespace md { template Point operator+(const Point& u, const Point& v) { return Point(u.x + v.x, u.y + v.y); } template Point operator-(const Point& u, const Point& v) { return Point(u.x - v.x, u.y - v.y); } template Point least_upper_bound(const Point& u, const Point& v) { return Point(std::max(u.x, v.x), std::max(u.y, v.y)); } template Point greatest_lower_bound(const Point& u, const Point& v) { return Point(std::min(u.x, v.x), std::min(u.y, v.y)); } template Point max_point() { return Point(std::numeric_limits::max(), std::numeric_limits::min()); } template Point min_point() { return Point(-std::numeric_limits::max(), -std::numeric_limits::min()); } template std::ostream& operator<<(std::ostream& ostr, const Point& vec) { ostr << "(" << vec.x << ", " << vec.y << ")"; return ostr; } template Real l_infty_norm(const Point& v) { return std::max(std::abs(v.x), std::abs(v.y)); } template Real l_2_norm(const Point& v) { return v.norm(); } template Real l_2_dist(const Point& x, const Point& y) { return l_2_norm(x - y); } template Real l_infty_dist(const Point& x, const Point& y) { return l_infty_norm(x - y); } template void DiagramKeeper::add_point(int dim, Real birth, Real death) { data_[dim].emplace_back(birth, death); } template Diagram DiagramKeeper::get_diagram(int dim) const { if (data_.count(dim) == 1) return data_.at(dim); else return Diagram(); } }