24 : initial_vertices_(vertices), directed_(directed), graph_(vertices, directed) {}
27 [[nodiscard]] std::uint64_t
version() const noexcept {
return graph_.
version(); }
28 [[nodiscard]]
const std::vector<VersionedUpdateBatch>&
history() const noexcept {
return history_; }
31 if (batch.
empty())
return;
32 std::uint64_t min_ts = batch.
updates.front().timestamp;
33 std::uint64_t max_ts = batch.
updates.front().timestamp;
34 for (
const auto& update : batch.
updates) {
35 min_ts = std::min(min_ts, update.timestamp);
36 max_ts = std::max(max_ts, update.timestamp);
39 history_.push_back({graph_.
version(), min_ts, max_ts, batch});
43 if (
version > graph_.
version())
throw std::out_of_range(
"requested version is in the future");
45 for (
const auto& entry : history_) {
46 if (entry.version >
version)
break;
47 snapshot.
apply(entry.batch);
54 for (
const auto& entry : history_) {
56 for (
const auto& update : entry.batch.updates) {
57 if (update.timestamp <= timestamp) filtered.
updates.push_back(update);
59 if (!filtered.
empty()) snapshot.
apply(filtered);
65 std::uint64_t to_inclusive)
const {
66 if (from_exclusive > to_inclusive || to_inclusive > graph_.
version())
67 throw std::out_of_range(
"invalid version range");
68 std::vector<EdgeUpdate> out;
69 for (
const auto& entry : history_) {
70 if (entry.version <= from_exclusive)
continue;
71 if (entry.version > to_inclusive)
break;
72 out.insert(out.end(), entry.batch.updates.begin(), entry.batch.updates.end());
78 std::uint64_t to_inclusive)
const {
79 if (from_exclusive > to_inclusive)
throw std::out_of_range(
"invalid timestamp range");
80 std::vector<EdgeUpdate> out;
81 for (
const auto& entry : history_) {
82 if (entry.max_timestamp <= from_exclusive || entry.min_timestamp > to_inclusive)
continue;
83 for (
const auto& update : entry.batch.updates) {
84 if (update.timestamp > from_exclusive && update.timestamp <= to_inclusive) out.push_back(update);
91 std::uint64_t window_width)
const {
92 const auto begin = end_timestamp > window_width ? end_timestamp - window_width : 0;
94 for (
const auto& entry : history_) {
96 for (
const auto& update : entry.batch.updates) {
97 if (update.timestamp > begin && update.timestamp <= end_timestamp) filtered.
updates.push_back(update);
105 std::size_t initial_vertices_{0};
106 bool directed_{
false};
108 std::vector<VersionedUpdateBatch> history_;
std::uint64_t version() const noexcept
void apply(const UpdateBatch &batch)
const std::vector< VersionedUpdateBatch > & history() const noexcept
std::vector< EdgeUpdate > changes_between_versions(std::uint64_t from_exclusive, std::uint64_t to_inclusive) const
std::uint64_t version() const noexcept
DynamicGraph sliding_window(std::uint64_t end_timestamp, std::uint64_t window_width) const
DynamicGraph snapshot_time(std::uint64_t timestamp) const
TemporalGraph(std::size_t vertices=0, bool directed=false)
DynamicGraph snapshot_version(std::uint64_t version) const
std::vector< EdgeUpdate > changes_between_times(std::uint64_t from_exclusive, std::uint64_t to_inclusive) const
const DynamicGraph & graph() const noexcept
void apply(const UpdateBatch &batch)
bool empty() const noexcept
std::vector< EdgeUpdate > updates
std::uint64_t min_timestamp
std::uint64_t max_timestamp