#pragma once #include #include #include #include constexpr int64_t DIPHA_MAGIC = 8067171840; constexpr int64_t DIPHA_DISTANCE_MATRIX = 7; constexpr int64_t DIPHA_PERSISTENCE_DIAGRAM = 2; constexpr int64_t DIPHA_WEIGHTED_BOUNDARY_MATRIX = 0; inline constexpr double PI = 4*std::atan(1); template inline void reverse_endianness(T & x) { uint8_t * p = reinterpret_cast(&x); std::reverse(p, p + sizeof(T)); } template inline T read_le(std::istream & s) { T result; s.read(reinterpret_cast(&result), sizeof(T)); #ifdef BIGENDIAN reverse_endianness(result); #endif return result; } template inline void write_le(std::ostream & s, T value) { #ifdef BIGENDIAN reverse_endianness(value); #endif s.write(reinterpret_cast(&value), sizeof(T)); } template inline T read_be(std::istream & s) { T result; s.read(reinterpret_cast(&result), sizeof(T)); #ifndef BIGENDIAN reverse_endianness(result); #endif return result; } template inline void write_be(std::ostream & s, T value) { #ifndef BIGENDIAN reverse_endianness(value); #endif s.write(reinterpret_cast(&value), sizeof(T)); } enum class Message_tag : int { result, work }; template inline T unroll_upper_tri(T n, T i, T j) { return i*(n-1) - ((i-1)*i)/2 + j; } template inline T unroll_full(T n, T i, T j) { return i*n + j; }