From 5a774f264af1628d350d3c5bcd1d2b7466323106 Mon Sep 17 00:00:00 2001 From: venkat1701 Date: Wed, 14 Oct 2026 21:38:37 +0530 Subject: [PATCH 1/7] docs(paper): add the HStore paper sources and the R figures The paper describes the engine's design (data model, counted and summarized copy-on-write trees, the tree-of-trees layout, logged keys and checkpoints, recovery, compaction through the page directory) and evaluates it against HyperGraphDB. It uses the ACM sigconf layout. R/diagrams.R draws the architecture figures and R/results.R turns the benchmark JSON files into the plots, the results table and the \M{...} macros the text uses for every number, so no measured value is typed into the text. build.sh points R at the fonts tectonic uses for the text, draws the figures and compiles the PDF. --- paper/.gitignore | 1 + paper/R/diagrams.R | 256 ++++++++++++++++++++++ paper/R/results.R | 347 ++++++++++++++++++++++++++++++ paper/R/theme.R | 86 ++++++++ paper/build.sh | 55 +++++ paper/hstore.tex | 45 ++++ paper/references.bib | 287 ++++++++++++++++++++++++ paper/sections/abstract.tex | 3 + paper/sections/conclusion.tex | 12 ++ paper/sections/evaluation.tex | 137 ++++++++++++ paper/sections/implementation.tex | 10 + paper/sections/introduction.tex | 22 ++ paper/sections/layout.tex | 57 +++++ paper/sections/model.tex | 16 ++ paper/sections/overview.tex | 15 ++ paper/sections/related.tex | 12 ++ paper/sections/space.tex | 27 +++ paper/sections/transactions.tex | 50 +++++ 18 files changed, 1438 insertions(+) create mode 100644 paper/.gitignore create mode 100644 paper/R/diagrams.R create mode 100644 paper/R/results.R create mode 100644 paper/R/theme.R create mode 100755 paper/build.sh create mode 100644 paper/hstore.tex create mode 100644 paper/references.bib create mode 100644 paper/sections/abstract.tex create mode 100644 paper/sections/conclusion.tex create mode 100644 paper/sections/evaluation.tex create mode 100644 paper/sections/implementation.tex create mode 100644 paper/sections/introduction.tex create mode 100644 paper/sections/layout.tex create mode 100644 paper/sections/model.tex create mode 100644 paper/sections/overview.tex create mode 100644 paper/sections/related.tex create mode 100644 paper/sections/space.tex create mode 100644 paper/sections/transactions.tex diff --git a/paper/.gitignore b/paper/.gitignore new file mode 100644 index 0000000..567609b --- /dev/null +++ b/paper/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/paper/R/diagrams.R b/paper/R/diagrams.R new file mode 100644 index 0000000..8e1760c --- /dev/null +++ b/paper/R/diagrams.R @@ -0,0 +1,256 @@ +source(file.path(Sys.getenv("PAPER_R", "R"), "theme.R")) + +out <- Sys.getenv("PAPER_FIGURES", "figures") + +triangle <- function(x, y, w, h, fill, col = rule, lwd = 0.5) { + grid.polygon(mm(c(x, x - w / 2, x + w / 2)), mm(c(y, y - h, y - h)), gp = gpar(fill = fill, col = col, lwd = lwd)) +} + +disk_shape <- function(x, y, w, h, label, size = 6.6) { + e <- 1.6 + grid.rect(mm(x), mm(y - h / 2 + e / 2), mm(w), mm(h - e), just = c("left", "bottom"), gp = gpar(fill = disk, col = NA)) + grid.lines(mm(c(x, x)), mm(c(y - h / 2 + e / 2, y + h / 2 - e / 2)), gp = gpar(col = rule, lwd = 0.5)) + grid.lines(mm(c(x + w, x + w)), mm(c(y - h / 2 + e / 2, y + h / 2 - e / 2)), gp = gpar(col = rule, lwd = 0.5)) + t <- seq(0, 2 * pi, length.out = 60) + grid.polygon(mm(x + w / 2 + w / 2 * cos(t)), mm(y + h / 2 - e / 2 + e / 2 * sin(t)), gp = gpar(fill = disk, col = rule, lwd = 0.5)) + b <- seq(pi, 2 * pi, length.out = 30) + grid.lines(mm(x + w / 2 + w / 2 * cos(b)), mm(y - h / 2 + e / 2 + e / 2 * sin(b)), gp = gpar(col = rule, lwd = 0.5)) + label(label, x + w / 2, y - e / 4, size = size) +} + +overview <- function() { + W <- textwidth * 25.4 + grid.lines(mm(c(12, W - 2)), mm(c(22.5, 22.5)), gp = gpar(col = rule, lwd = 0.5, lty = "22")) + label("memory", 4, 46, size = 6.4, rot = 90, col = rule) + label("disk", 4, 11, size = 6.4, rot = 90, col = rule) + + box(24, 56, 25, 8.5, "Transaction\nprivate workspace", size = 6.4) + box(24, 43, 25, 8.5, "Transaction\nprivate workspace", size = 6.4) + label("Writers", 24, 66, size = 7.2, face = "bold") + box(56, 49.5, 29, 14, "Commit\nfast path or rebase,\nencode changed keys", fill = paper, size = 6.4) + label("under the commit lock", 56, 58.6, size = 5.6, col = rule) + arrow_line(c(36.5, 41.5), c(55, 52)) + arrow_line(c(36.5, 41.5), c(44, 47)) + + gx <- 80 + gw <- 66 + for (k in 2:1) { + box(gx + k * 1.8, 56 + k * 1.8, gw, 6, fill = "#f7f7f7", lwd = 0.45, just = c("left", "centre")) + } + box(gx, 56, gw, 6, fill = "white", lwd = 0.5, just = c("left", "centre")) + slots <- c("catalog", "reverse", "type", "canonical", "symbols", "requests", "...") + sw <- (gw - 1.6) / length(slots) + for (i in seq_along(slots)) { + sx <- gx + 0.8 + (i - 1) * sw + rect(sx + 0.2, 53.8, sw - 0.4, 4.4, fill = hs_light, col = rule, lwd = 0.35) + label(slots[i], sx + sw / 2, 56, size = 5.5) + } + label("Root vectors of published generations", gx + gw / 2 + 2, 66, size = 7.2, face = "bold") + arrow_line(c(70.5, gx - 0.5), c(51, 54)) + label("publish", 74.5, 49, size = 5.6, col = rule) + + tree <- function(cx, slot_x, leaf) { + triangle(cx, 49.6, 13, 13.5, fill = disk) + arrow_line(c(slot_x, cx), c(53.8, 49.9), lwd = 0.4, length = 0.9) + px <- c(cx, cx + leaf * 2.6, cx + leaf * 4.9) + py <- c(49.6, 44.6, 37.4) + grid.lines(mm(px), mm(py), gp = gpar(col = "#b8962e", lwd = 0.9)) + grid.circle(mm(px), mm(py), r = unit(0.95, "mm"), gp = gpar(fill = "#f3d36b", col = "#8a6d1a", lwd = 0.4)) + } + for (j in 0:3) { + cx <- gx + 0.8 + (2 * j + 0.5) * sw + tree(cx, cx, c(1, -1, 0.4, -0.5)[j + 1]) + } + + box(gx + 32.5, 29, 46, 8, "Checkpoint (background)\nwrites each changed node once", fill = paper, size = 6.4) + arrow_line(c(gx + 32.5, gx + 32.5), c(35.6, 33.4)) + + disk_shape(37, 11, 38, 13, "Write-ahead log\nBegin, Changes, Feed, Commit") + arrow_line(c(56, 56), c(42.3, 18)) + label("append, then one fsync\nper commit group", 57.5, 30, size = 5.6, hjust = 0, col = rule) + arrow_line(c(gx + 9.5, 75.5), c(29, 14)) + label("truncate", gx + 4.5, 19.5, size = 5.6, col = rule, hjust = 0) + + disk_shape(gx + 4, 11, 24, 13, "Segment files\n64-byte units", size = 6.2) + disk_shape(gx + 32, 11, 24, 13, "Page directory,\nreference counts", size = 6.2) + disk_shape(gx + 60, 11, 24, 13, "Catalog\nimage", size = 6.2) + arrow_line(c(gx + 24, gx + 16), c(25, 17.6)) + arrow_line(c(gx + 32.5, gx + 41), c(25, 17.6)) + arrow_line(c(gx + 41, gx + 70), c(25, 17.6)) + + rx <- W - 12 + label("Readers", rx, 66, size = 7.2, face = "bold") + box(rx, 56, 16, 6, "snapshot", size = 6) + box(rx, 47, 16, 6, "snapshot", size = 6) + arrow_line(c(rx - 8, gx + gw + 0.6), c(56, 56)) + arrow_line(c(rx - 8, gx + gw + 2.4), c(47, 57.8)) + label("pinned, read\nwithout locks", rx, 39.5, size = 5.6, col = rule) + + grid.circle(mm(rx - 6), mm(31), r = unit(0.95, "mm"), gp = gpar(fill = "#f3d36b", col = "#8a6d1a", lwd = 0.4)) + label("node in memory", rx - 4, 31, size = 5.6, hjust = 0) + rect(rx - 7.2, 26.2, 2.4, 2.4, fill = disk, col = rule, lwd = 0.4) + label("stored page", rx - 4, 27.4, size = 5.6, hjust = 0) +} + +save_grid(file.path(out, "overview.pdf"), textwidth, 70 / 25.4, overview) + +cell <- function(x, y, w, h, text, fill = "white", size = 5.6, family = sans, col = rule) { + rect(x, y, w, h, fill = fill, col = col, lwd = 0.4) + label(text, x + w / 2, y + h / 2, size = size, family = family) +} + +layout_figure <- function() { + label("(a) Catalog: a tree of trees", 2, 54, size = 7.2, face = "bold", hjust = 0) + bx <- 20 + for (i in 0:3) { + cell(bx + i * 15, 43.5, 4, 5, c("4000", "4100", "4183", "4270")[i + 1], fill = "#f7f7f7", size = 5.2) + cell(bx + i * 15 + 4, 43.5, 11, 5, "#p \u03a3", fill = hs_light, size = 5.4) + } + label("branch node", bx - 1.5, 46, size = 5.6, hjust = 1, col = rule) + label("\u03a3: count, key range, weight and time ranges,\nrole mask and fingerprint of the child", bx + 61.5, 39.6, + size = 5.4, col = rule, hjust = 1) + arrow_line(c(bx + 4 + 15 + 5.5, 44), c(43.5, 33.6), lwd = 0.5, length = 1.1) + label("packed leaf", 4, 35.6, size = 5.6, hjust = 0, col = rule) + + segs <- list(c("header", 9, "#f7f7f7"), c("\u03a3", 5, "#f7f7f7"), c("keys \u0394", 9, "#f7f7f7"), + c("4100 node", 14, "white"), c("4101 edge", 15, "white"), c("4102 edge", 15, "white"), + c("4103 node", 14, "white"), c("...", 7, "white")) + x <- 4 + starts <- numeric() + for (sg in segs) { + w <- as.numeric(sg[2]) + starts <- c(starts, x) + cell(x, 27.8, w, 5.8, sg[1], fill = sg[3], size = 5.4) + if (x > 25) rect(x, 27.8, 1.6, 5.8, fill = "#e8e8e8", col = rule, lwd = 0.3) + x <- x + w + } + label("length of each record", starts[4] + 0.8, 25.4, size = 5.2, col = rule, hjust = 0) + + ex <- starts[5] + 8.3 + arrow_line(c(ex, ex), c(27.8, 20.4), lwd = 0.5, length = 1.1) + cell(ex - 9, 14.6, 18, 5.6, "members 7, 19, 23", fill = memory, size = 5.4) + label("inline in the record\n(at most 32 entries)", ex, 9.6, size = 5.4, col = rule) + + fx <- starts[6] + 8.3 + arrow_line(c(fx, fx + 10), c(27.8, 21.6), lwd = 0.5, length = 1.1) + triangle(fx + 12, 21.6, 12, 11, fill = disk) + label("member tree on\nits own pages", fx + 12, 6.4, size = 5.4, col = rule) + + ox <- 110 + label("(b) Reverse incidence index", ox, 54, size = 7.2, face = "bold", hjust = 0) + label("directory leaf: atom to posting set", ox, 48, size = 5.6, hjust = 0, col = rule) + rows <- list(c("7", "4101, 4310, 5022"), c("19", "4101"), c("23", "4101, 4877"), c("3", "promoted")) + for (i in seq_along(rows)) { + y <- 40.5 - (i - 1) * 6.4 + cell(ox, y, 9, 5.4, rows[[i]][1], fill = "#f7f7f7", size = 5.6) + fill <- if (rows[[i]][2] == "promoted") hs_light else memory + cell(ox + 9, y, 30, 5.4, rows[[i]][2], fill = fill, size = 5.4) + } + label("inline while at most\n48 entries", ox + 54, 37.6, size = 5.4, col = rule) + arrow_line(c(ox + 39.2, ox + 47.5), c(43.2, 39.8), lwd = 0.4, length = 0.9) + arrow_line(c(ox + 39.2, ox + 50), c(24.2, 21.6), lwd = 0.5, length = 1.1) + triangle(ox + 54, 21.6, 13, 11.5, fill = disk) + label("postings tree,\nkeyed by hyperedge", ox + 54, 6.4, size = 5.4, col = rule) + label("summaries count the postings\nunder any range of atoms", ox, 13.5, size = 5.4, col = rule, hjust = 0) +} + +save_grid(file.path(out, "layout.pdf"), textwidth, 57 / 25.4, layout_figure) + +compaction_figure <- function() { + live <- hs_light + dead <- "#ececec" + cell(2, 41, 22, 6, "child ref #1234", fill = "white", size = 5.6) + label("any node, any generation", 13, 38.4, size = 5.2, col = rule) + arrow_line(c(24.2, 30.6), c(44, 44), lwd = 0.5, length = 1.1) + rect(31, 41, 51, 6, fill = "white", col = rule, lwd = 0.45) + label("pages.dir[1234]", 33, 44, size = 5.6, hjust = 0, family = mono) + label("seg 3, unit 210", 57.5, 45.5, size = 5.3, hjust = 0, col = rule) + grid.lines(mm(c(57.3, 73.6)), mm(c(45.35, 45.35)), gp = gpar(col = hg, lwd = 0.6)) + label("seg 7, unit 512", 57.5, 42.4, size = 5.3, hjust = 0, col = hs, face = "bold") + label("Page numbers never change; only the directory entry moves.", 2, 51.5, size = 5.6, hjust = 0, col = ink) + + pattern3 <- c(2, 1, 1, 3, 1, 2, 1, 1, 2, 1, 3, 1) + state3 <- c("live", "dead", "dead", "live", "dead", "live", "dead", "dead", "live", "dead", "dead", "dead") + label("segment 3 (sealed, 30% live)", 2, 31.8, size = 5.6, hjust = 0) + x <- 2 + centers <- numeric() + for (i in seq_along(pattern3)) { + w <- pattern3[i] * 3.3 + rect(x, 24, w, 5.6, fill = if (state3[i] == "live") live else dead, col = rule, lwd = 0.35) + if (state3[i] == "live") centers <- c(centers, x + w / 2) + x <- x + w + } + label("segment 7 (active)", 2, 15.6, size = 5.6, hjust = 0) + rect(2, 7.8, 30, 5.6, fill = live, col = rule, lwd = 0.35) + label("earlier pages", 17, 10.6, size = 5.2, col = rule) + nx <- 32 + for (k in seq_along(centers)) { + w <- c(2, 3, 2, 2)[k] * 3.3 + rect(nx, 7.8, w, 5.6, fill = "#c4d9ea", col = rule, lwd = 0.35) + arrow_line(c(centers[k], nx + w / 2), c(24, 13.6), lwd = 0.45, length = 0.9) + nx <- nx + w + } + rect(nx, 7.8, 82 - nx, 5.6, fill = "white", col = rule, lwd = 0.35) + label("bytes copied unchanged: the header holds the page number, so the checksum stays valid", + 2, 3.4, size = 5.2, hjust = 0, col = rule) + rect(62, 31, 2.4, 2.4, fill = live, col = rule, lwd = 0.35) + label("live", 65.2, 32.2, size = 5.2, hjust = 0) + rect(71, 31, 2.4, 2.4, fill = dead, col = rule, lwd = 0.35) + label("released", 74.2, 32.2, size = 5.2, hjust = 0) +} + +save_grid(file.path(out, "compaction.pdf"), column, 55 / 25.4, compaction_figure) + +wal_figure <- function() { + y <- 17 + h <- 6 + fills <- c(B = "#f7f7f7", X = hs_light, F = "#eef3e6", C = hs, K = "#f3d36b", P = "#e3d7ee") + text_col <- c(B = ink, X = ink, F = ink, C = "white", K = ink, P = ink) + names_short <- c(B = "B", X = "Changes", F = "Feed", C = "Commit", K = "Ckpt", P = "PageRef") + widths <- c(B = 2.8, X = 8, F = 5, C = 7.5, K = 5.5, P = 7.5) + groups <- list( + list(g = "g102", recs = c("B", "X", "C")), + list(g = "g103", recs = c("B", "X", "F", "C")), + list(g = "g104", recs = c("B", "X", "C")), + list(g = "", recs = c("K")), + list(g = "g105", recs = c("B", "X", "F", "C")), + list(g = "g106", recs = c("B", "P", "X", "C")), + list(g = "txn 41", recs = c("B", "X")) + ) + x0 <- 24 + grid.rect(mm(2), mm(y), mm(x0 - 2), mm(h), just = c("left", "bottom"), gp = gpar(fill = "#f1f1f1", col = rule, lwd = 0.35, lty = "22")) + label("deleted by an\nearlier checkpoint", 2 + (x0 - 2) / 2, y + h / 2, size = 5, col = rule) + x <- x0 + bounds <- list() + for (gi in seq_along(groups)) { + gx0 <- x + for (r in groups[[gi]]$recs) { + rect(x, y, widths[[r]], h, fill = fills[[r]], col = rule, lwd = 0.35) + label(names_short[[r]], x + widths[[r]] / 2, y + h / 2, size = 5.2, col = text_col[[r]]) + x <- x + widths[[r]] + } + bounds[[gi]] <- c(gx0, x) + if (nzchar(groups[[gi]]$g)) label(groups[[gi]]$g, (gx0 + x) / 2, y + h + 2.2, size = 5.8) + x <- x + 0.8 + } + ck <- bounds[[2]][2] + grid.lines(mm(c(ck + 0.6, ck + 0.6)), mm(c(y - 3, y + h + 9)), gp = gpar(col = hs, lwd = 0.8)) + label("checkpoint LSN in the catalog image:\nend of g103's Commit", ck + 0.6, y + h + 12, size = 5.4, col = hs) + arrow_curve(bounds[[4]][1] + 3.2, y + h + 0.2, ck + 1.2, y + h + 4.5, curvature = 0.45, col = "#b8962e", lwd = 0.45) + label("written later, points back", bounds[[4]][1] + 6.5, y + h + 6.8, size = 5, col = "#8a6d1a", hjust = 0) + endx <- bounds[[7]][2] + grid.lines(mm(c(endx + 0.6, endx + 0.6)), mm(c(y - 3, y + h + 9)), gp = gpar(col = ink, lwd = 0.8)) + label("log end after\nthe torn tail is cut", endx - 1, y + h + 12, size = 5.4) + + bracket <- function(a, b, yy, text, col) { + grid.lines(mm(c(a, a, b, b)), mm(c(yy + 1.4, yy, yy, yy + 1.4)), gp = gpar(col = col, lwd = 0.6)) + label(text, (a + b) / 2, yy - 2.6, size = 5.4, col = col) + } + bracket(bounds[[3]][1], bounds[[5]][2], y - 2, "replayed: g104, g105", hs) + bracket(bounds[[6]][1], bounds[[6]][2], y - 2, "page fails its CRC:\ng106 and later dropped", hg) + bracket(bounds[[7]][1], bounds[[7]][2], y - 2, "no Commit\nrecord: dropped", hg) + label("After recovery the first checkpoint starts at the log end and the next transaction id is above every id in the log,\nso the records of txn 41 can never be grouped with a later transaction.", + x0, 3.2, size = 5.4, hjust = 0, col = rule) +} + +save_grid(file.path(out, "wal.pdf"), textwidth, 40 / 25.4, wal_figure) diff --git a/paper/R/results.R b/paper/R/results.R new file mode 100644 index 0000000..b837b36 --- /dev/null +++ b/paper/R/results.R @@ -0,0 +1,347 @@ +source(file.path(Sys.getenv("PAPER_R", "R"), "theme.R")) +suppressPackageStartupMessages(library(patchwork)) + +results_dir <- Sys.getenv("PAPER_RESULTS", "results") +generated <- Sys.getenv("PAPER_GENERATED", "generated") +figures <- Sys.getenv("PAPER_FIGURES", "figures") +dir.create(generated, showWarnings = FALSE) + +configs <- c(`s1-async` = "S1 async", `s1-sync` = "S1 sync", `s4-async` = "S4 async") +config_colours <- c(`S1 async` = hs, `S1 sync` = "#6a9a3a", `S4 async` = hg) + +num <- function(v) if (is.null(v)) NA_real_ else as.numeric(v) +lat <- function(r, p) if (is.null(r$latency)) NA_real_ else num(r$latency[[p]]) + +read_config <- function(cfg) { + files <- list.files(file.path(results_dir, cfg), pattern = "\\.json$", full.names = TRUE) + do.call(rbind, lapply(files, function(f) { + d <- fromJSON(f, simplifyVector = FALSE) + engine <- if (d$store == "HStore") "HStore" else "HyperGraphDB" + run <- as.integer(sub(".*-(\\d+)\\.json$", "\\1", basename(f))) + do.call(rbind, lapply(d$results, function(r) data.frame( + config = cfg, engine = engine, run = run, workload = r$workload, + ops = num(r$operations), millis = num(r$millis), checksum = num(r$checksum), + allocated = num(r$allocated), written = num(r$bytesWritten), read = num(r$bytesRead), + gc_ms = num(r$gcMillis), p50 = lat(r, "p50"), p99 = lat(r, "p99"), p999 = lat(r, "p99.9"), + max = lat(r, "max"), lost = num(r$lost), acknowledged = num(r$acknowledged), + reclaimed = num(r$reclaimed), compaction_ms = num(r$compactionMillis), + retained = num(d$retainedHeap), total_written = num(d$bytesWritten), + stringsAsFactors = FALSE))) + })) +} + +runs <- do.call(rbind, lapply(names(configs), read_config)) +runs$rate <- runs$ops / runs$millis * 1000 + +size_workloads <- c("disk", "disk.churned", "disk.compacted") +time_workloads <- c("reopen", "recover") +fixed_rate <- c("mixed.write", "compaction.baseline", "compaction") + +value_of <- function(d, w) { + if (w %in% size_workloads) d$checksum else if (w %in% time_workloads) d$millis else d$rate +} +higher_is_better <- function(w) !(w %in% c(size_workloads, time_workloads)) + +cell <- function(cfg, w) { + d <- runs[runs$config == cfg & runs$workload == w, ] + h <- value_of(d[d$engine == "HStore", ], w) + g <- value_of(d[d$engine == "HyperGraphDB", ], w) + if (length(h) == 0 || length(g) == 0) return(NULL) + hm <- median(h) + gm <- median(g) + up <- higher_is_better(w) + ratio <- if (up) hm / gm else gm / hm + lo <- if (up) min(h) / max(g) else min(g) / max(h) + hi <- if (up) max(h) / min(g) else max(g) / min(h) + overlap <- max(min(h), min(g)) <= min(max(h), max(g)) + data.frame(config = cfg, workload = w, hstore = hm, hgdb = gm, ratio = ratio, lo = lo, hi = hi, + overlap = overlap, runs_h = length(h), runs_g = length(g), stringsAsFactors = FALSE) +} + +workload_order <- unique(runs$workload) +cells <- do.call(rbind, lapply(names(configs), function(cfg) do.call(rbind, lapply(workload_order, function(w) cell(cfg, w))))) + +macros <- character() +put <- function(key, value) macros <<- c(macros, sprintf("\\expandafter\\def\\csname m@%s\\endcsname{%s}", key, value)) + +sig <- function(x, digits = 2) { + if (is.na(x)) return("n/a") + if (abs(x) >= 100) return(format(round(x), big.mark = ",", trim = TRUE)) + formatC(signif(x, digits), format = "fg", digits = digits, flag = "#") |> sub(pattern = "\\.$", replacement = "") +} +ratio_text <- function(x) { + if (x >= 10) format(round(x, 1), nsmall = 1, big.mark = ",") |> sub(pattern = "\\.0$", replacement = "") + else sig(x, 2) +} +rate_text <- function(x) { + if (x >= 1e6) paste0(sig(x / 1e6, 3), "\\,M") else if (x >= 1e3) paste0(sig(x / 1e3, 3), "\\,k") else sig(x, 3) +} +bytes_text <- function(x) { + if (x >= 2^30) paste0(sig(x / 2^30, 3), "\\,GiB") else if (x >= 2^20) paste0(sig(x / 2^20, 3), "\\,MiB") + else if (x >= 2^10) paste0(sig(x / 2^10, 3), "\\,KiB") else paste0(round(x), "\\,B") +} +micros_text <- function(us) { + if (us >= 1e6) paste0(sig(us / 1e6, 3), "\\,s") else if (us >= 1e3) paste0(sig(us / 1e3, 3), "\\,ms") else paste0(sig(us, 3), "\\,\\textmu{}s") +} +value_text <- function(w, v) { + if (w %in% size_workloads) bytes_text(v) else if (w %in% time_workloads) paste0(sig(v, 3), "\\,ms") else rate_text(v) +} + +key <- function(...) gsub("[^A-Za-z0-9]", "", paste(..., sep = "")) + +for (i in seq_len(nrow(cells))) { + c <- cells[i, ] + base <- key(c$config, c$workload) + put(paste0("ratio", base), paste0(ratio_text(c$ratio), if (c$overlap) "$^\\dagger$" else "")) + put(paste0("hs", base), value_text(c$workload, c$hstore)) + put(paste0("hg", base), value_text(c$workload, c$hgdb)) +} +put("workloadCount", length(workload_order)) +for (cfg in names(configs)) { + n <- unique(runs$run[runs$config == cfg & runs$engine == "HStore"]) + put(paste0("runs", key(cfg)), length(n)) +} + +percentile_names <- c(p50 = "pfifty", p99 = "pninetynine", p999 = "pninetyninenine", max = "max") +for (cfg in names(configs)) for (w in c("latency.read", "latency.commit", "mixed.read", "mixed.write", "compaction.baseline", "compaction")) { + for (engine in c("HStore", "HyperGraphDB")) { + d <- runs[runs$config == cfg & runs$workload == w & runs$engine == engine, ] + if (nrow(d) == 0) next + for (p in names(percentile_names)) { + put(paste0("lat", key(cfg, w), if (engine == "HStore") "hs" else "hg", percentile_names[[p]]), micros_text(median(d[[p]]))) + } + put(paste0("lat", key(cfg, w), if (engine == "HStore") "hs" else "hg", "worst"), micros_text(max(d$max))) + } +} + +per_op <- function(cfg, w, engine, field) { + d <- runs[runs$config == cfg & runs$workload == w & runs$engine == engine, ] + median(d[[field]] / d$ops) +} +for (cfg in names(configs)) for (w in workload_order) for (engine in c("HStore", "HyperGraphDB")) { + e <- if (engine == "HStore") "hs" else "hg" + a <- per_op(cfg, w, engine, "allocated") + b <- per_op(cfg, w, engine, "written") + r <- per_op(cfg, w, engine, "read") + if (!is.na(a)) put(paste0("alloc", key(cfg, w), e), bytes_text(a)) + if (!is.na(b)) put(paste0("written", key(cfg, w), e), bytes_text(b)) + if (!is.na(r)) put(paste0("read", key(cfg, w), e), bytes_text(r)) +} +for (cfg in names(configs)) for (engine in c("HStore", "HyperGraphDB")) { + d <- runs[runs$config == cfg & runs$engine == engine & runs$workload == "ingest.nodes", ] + put(paste0("retained", key(cfg), if (engine == "HStore") "hs" else "hg"), bytes_text(median(d$retained))) +} + +seconds_text <- function(ms) if (ms >= 60000) paste0(sig(ms / 60000, 2), "\\,min") else if (ms >= 1000) paste0(sig(ms / 1000, 2), "\\,s") else paste0(sig(ms, 2), "\\,ms") +for (cfg in names(configs)) for (engine in c("HStore", "HyperGraphDB")) { + e <- if (engine == "HStore") "hs" else "hg" + d <- runs[runs$config == cfg & runs$engine == engine, ] + comp <- d[d$workload == "compaction", ] + packed <- d[d$workload == "disk.compacted", ] + if (nrow(comp) > 0) { + put(paste0("compactms", key(cfg), e), seconds_text(median(comp$compaction_ms))) + put(paste0("compactmsmax", key(cfg), e), seconds_text(max(comp$compaction_ms))) + put(paste0("compactwritten", key(cfg), e), bytes_text(median(comp$written))) + before <- merge(comp[, c("run", "reclaimed")], packed[, c("run", "checksum")], by = "run") + put(paste0("diskbeforecompact", key(cfg), e), bytes_text(median(before$checksum + before$reclaimed))) + } + totals <- d[d$workload == "ingest.nodes", ] + put(paste0("totalwritten", key(cfg), e), bytes_text(median(totals$total_written))) + put(paste0("totalwrittenmax", key(cfg), e), bytes_text(max(totals$total_written))) + for (w in c("mixed.read", "ingest.edges")) { + g <- d[d$workload == w, ] + if (nrow(g) > 0) put(paste0("gcms", key(cfg, w), e), seconds_text(median(g$gc_ms))) + } +} + +writeLines(c("\\makeatletter", "\\newcommand{\\M}[1]{\\@ifundefined{m@#1}{\\textbf{??#1}}{\\csname m@#1\\endcsname}}", macros, "\\makeatother"), + file.path(generated, "numbers.tex")) + +byte_breaks <- 4^(0:15) +byte_labels <- function(v) ifelse(v >= 2^30, paste0(v / 2^30, " GiB"), ifelse(v >= 2^20, paste0(v / 2^20, " MiB"), + ifelse(v >= 2^10, paste0(v / 2^10, " KiB"), paste0(v, " B")))) + +labels <- c( + ingest.nodes = "ingest nodes", ingest.edges = "ingest hyperedges", read.incidence = "incidence set", + read.members = "member list", read.comembership = "co-membership", read.twohop = "two-hop", + read.incidence.parallel = "incidence, 8 threads", latency.read = "single lookup txn", write.update = "update", + latency.commit = "single-update commit", mixed.read = "reads during writes", large.ingest = "load giant edge", + large.scan = "scan giant edge", large.probe = "probe giant edge", reopen = "clean reopen", + read.incidence.cold = "incidence, cold", disk = "disk after load", churn.delete = "delete hyperedges", + churn.remove = "remove members", read.incidence.churned = "incidence after deletes", disk.churned = "disk after deletes", + disk.compacted = "disk after reclaim", recover = "crash recovery") +groups <- c(ingest.nodes = "write", ingest.edges = "write", write.update = "write", latency.commit = "write", + churn.delete = "write", churn.remove = "write", large.ingest = "write", + read.incidence = "read", read.members = "read", read.comembership = "read", read.twohop = "read", + read.incidence.parallel = "read", latency.read = "read", mixed.read = "read", large.scan = "read", + large.probe = "read", read.incidence.cold = "read", read.incidence.churned = "read", + reopen = "lifecycle", recover = "lifecycle", disk = "space", disk.churned = "space", disk.compacted = "space") + +plotted <- cells[cells$workload %in% names(labels), ] +plotted$label <- factor(labels[plotted$workload], levels = rev(labels[names(labels) %in% plotted$workload])) +plotted$group <- factor(groups[plotted$workload], levels = c("write", "read", "lifecycle", "space")) +plotted$Configuration <- factor(configs[plotted$config], levels = configs) + +ratio_plot <- ggplot(plotted, aes(x = ratio, y = label, colour = Configuration)) + + geom_vline(xintercept = 1, colour = rule, linewidth = 0.35) + + geom_linerange(aes(xmin = lo, xmax = hi), position = position_dodge(width = 0.65), linewidth = 0.35, alpha = 0.7) + + geom_point(position = position_dodge(width = 0.65), size = 1.1) + + scale_x_log10(breaks = c(0.1, 0.3, 1, 3, 10, 30, 100, 300), labels = c("0.1", "0.3", "1", "3", "10", "30", "100", "300")) + + scale_colour_manual(values = config_colours) + + facet_grid(group ~ ., scales = "free_y", space = "free_y") + + labs(x = "HStore advantage (log scale; above 1 favours HStore)", y = NULL) + + theme_paper(7) + + theme(strip.text.y = element_text(angle = 0, hjust = 0), panel.spacing = unit(1.2, "mm")) +ggsave(file.path(figures, "ratios.pdf"), ratio_plot, device = cairo_pdf, width = column, height = 4.6) + +lat_workloads <- c(latency.read = "single lookup txn", mixed.read = "reads during writes", + latency.commit = "single-update commit", mixed.write = "writer during reads") +lat <- runs[runs$workload %in% names(lat_workloads), c("config", "engine", "run", "workload", "p50", "p99", "p999", "max")] +lat_long <- do.call(rbind, lapply(c("p50", "p99", "p999", "max"), function(p) { + data.frame(lat[, c("config", "engine", "run", "workload")], percentile = p, micros = lat[[p]]) +})) +lat_med <- aggregate(micros ~ config + engine + workload + percentile, lat_long, median) +lat_med$percentile <- factor(lat_med$percentile, levels = c("p50", "p99", "p999", "max"), labels = c("p50", "p99", "p99.9", "max")) +lat_med$workload <- factor(lat_workloads[lat_med$workload], levels = lat_workloads) +lat_med$config <- factor(configs[lat_med$config], levels = configs) +latency_plot <- ggplot(lat_med, aes(x = percentile, y = micros, colour = engine, group = engine)) + + geom_line(linewidth = 0.4) + geom_point(size = 0.9) + + scale_y_log10(labels = function(v) ifelse(v >= 1000, paste0(v / 1000, " ms"), paste0(v, " µs"))) + + scale_colour_manual(values = engine_colours) + + facet_grid(config ~ workload) + + labs(x = NULL, y = "latency (log scale)") + + theme_paper(7) +ggsave(file.path(figures, "latency.pdf"), latency_plot, device = cairo_pdf, width = textwidth, height = 2.9) + +write_workloads <- c(ingest.nodes = "ingest nodes", ingest.edges = "ingest hyperedges", write.update = "update (1,000 per txn)", + latency.commit = "single-update commit", churn.delete = "delete hyperedge", churn.remove = "remove member") +wr <- runs[runs$workload %in% names(write_workloads) & runs$config %in% c("s1-async", "s4-async"), ] +wr$per_op <- wr$written / wr$ops +wr_med <- aggregate(per_op ~ config + engine + workload, wr, median) +wr_med$workload <- factor(write_workloads[wr_med$workload], levels = rev(write_workloads)) +wr_med$config <- factor(configs[wr_med$config], levels = configs) +dumbbell <- function(d, xlab, title, legend = TRUE) { + span <- aggregate(per_op ~ config + workload, d, function(v) c(min(v), max(v))) + span <- data.frame(config = span$config, workload = span$workload, lo = span$per_op[, 1], hi = span$per_op[, 2]) + ggplot(d, aes(x = per_op, y = workload)) + + geom_segment(data = span, aes(x = lo, xend = hi, y = workload, yend = workload), colour = rule, linewidth = 0.5) + + geom_point(aes(colour = engine), size = 1.4) + + scale_x_log10(breaks = byte_breaks, labels = byte_labels) + + scale_colour_manual(values = engine_colours) + + facet_grid(. ~ config) + + labs(x = xlab, y = NULL, title = title) + + theme_paper(7) + + theme(plot.title = element_text(size = 7.5, face = "bold"), legend.position = if (legend) "top" else "none") +} +written_plot <- dumbbell(wr_med, "bytes written per operation (log scale)", "(a) Write amplification") + +read_workloads <- c(read.incidence = "incidence set", read.members = "member list", read.comembership = "co-membership", + read.twohop = "two-hop", latency.read = "single lookup txn") +rd <- runs[runs$workload %in% names(read_workloads) & runs$config %in% c("s1-async", "s4-async"), ] +rd$per_op <- rd$allocated / rd$ops +rd_med <- aggregate(per_op ~ config + engine + workload, rd, median) +rd_med$per_op <- pmax(rd_med$per_op, 1) +rd_med$workload <- factor(read_workloads[rd_med$workload], levels = rev(read_workloads)) +rd_med$config <- factor(configs[rd_med$config], levels = configs) +alloc_plot <- dumbbell(rd_med, "heap bytes allocated per operation (log scale; below 1 B drawn at 1 B)", + "(b) Allocation on reads", legend = FALSE) + +disk_steps <- c(disk = "after load", disk.churned = "after deletes", disk.compacted = "after reclaim") +dk <- runs[runs$workload %in% names(disk_steps), ] +dk_med <- aggregate(checksum ~ config + engine + workload, dk, median) +dk_med$step <- factor(disk_steps[dk_med$workload], levels = disk_steps) +dk_med$config <- factor(configs[dk_med$config], levels = configs) +disk_plot <- ggplot(dk_med, aes(x = step, y = checksum / 2^20, colour = engine, group = engine)) + + geom_line(linewidth = 0.45) + geom_point(size = 1) + + scale_colour_manual(values = engine_colours) + + facet_wrap(~ config, nrow = 1, scales = "free_y") + + expand_limits(y = 0) + + labs(x = NULL, y = "MiB on disk", title = "(c) Space through the churn") + + theme_paper(7) + theme(plot.title = element_text(size = 7.5, face = "bold"), legend.position = "none") + +resources <- written_plot / alloc_plot / disk_plot + plot_layout(heights = c(1.15, 1, 0.9)) +ggsave(file.path(figures, "resources.pdf"), resources, device = cairo_pdf, width = textwidth, height = 5.2) + +combined_rows <- sapply(workload_order, function(w) { + get <- function(cfg) cells[cells$config == cfg & cells$workload == w, ] + a <- get("s1-async"); y <- get("s1-sync"); b <- get("s4-async") + if (nrow(a) == 0 || nrow(b) == 0 || nrow(y) == 0) return(NA_character_) + mark <- function(r) paste0(ratio_text(r$ratio), if (r$overlap) "$^\\dagger$" else "") + sprintf("\\wl{%s} & %s & %s & %s & %s & %s & %s & %s \\\\", w, + value_text(w, a$hstore), value_text(w, a$hgdb), mark(a), mark(y), + value_text(w, b$hstore), value_text(w, b$hgdb), mark(b)) +}) +writeLines(c(combined_rows[!is.na(combined_rows)], "\\bottomrule"), file.path(generated, "table-all.tex")) + +ablation_dir <- Sys.getenv("PAPER_ABLATION", "ablation") +ablations <- c(logical = "logged keys", inline = "inline member trees", lazy = "records decoded on demand") +ablation_workloads <- list( + logical = c(write.update = "update", latency.commit = "single-update commit", ingest.edges = "ingest hyperedges", + read.incidence = "incidence set", recover = "crash recovery"), + inline = c(read.members = "member list", read.twohop = "two-hop", large.scan = "scan giant edge", + latency.read = "single lookup txn", disk.compacted = "disk after reclaim"), + lazy = c(read.members = "member list", read.twohop = "two-hop", read.incidence.cold = "incidence, cold", + read.incidence.parallel = "incidence, 8 threads", churn.delete = "delete hyperedges")) +read_ablation <- function(name) { + files <- list.files(file.path(ablation_dir, name), pattern = "\\.json$", full.names = TRUE) + if (length(files) == 0) return(NULL) + do.call(rbind, lapply(files, function(f) { + d <- fromJSON(f, simplifyVector = FALSE) + side <- sub("-\\d+\\.json$", "", basename(f)) + do.call(rbind, lapply(d$results, function(r) data.frame( + ablation = name, side = side, workload = r$workload, ops = num(r$operations), millis = num(r$millis), + checksum = num(r$checksum), written = num(r$bytesWritten), allocated = num(r$allocated), stringsAsFactors = FALSE))) + })) +} +abl <- do.call(rbind, lapply(names(ablations), read_ablation)) +if (!is.null(abl)) { + abl$rate <- abl$ops / abl$millis * 1000 + abl_cell <- function(name, w, field) { + d <- abl[abl$ablation == name & abl$workload == w, ] + value <- function(x) if (field == "written") x$written / x$ops else value_of(x, w) + b <- value(d[d$side == "before", ]) + a <- value(d[d$side == "after", ]) + if (length(a) == 0 || length(b) == 0 || anyNA(c(a, b))) return(NULL) + up <- field != "written" && higher_is_better(w) + data.frame(ablation = name, workload = w, field = field, before = median(b), after = median(a), + ratio = if (up) median(a) / median(b) else median(b) / median(a), + lo = if (up) min(a) / max(b) else min(b) / max(a), hi = if (up) max(a) / min(b) else max(b) / min(a), + overlap = max(min(a), min(b)) <= min(max(a), max(b)), stringsAsFactors = FALSE) + } + abl_cells <- do.call(rbind, lapply(names(ablations), function(name) do.call(rbind, c( + lapply(names(ablation_workloads[[name]]), function(w) abl_cell(name, w, "value")), + lapply(names(ablation_workloads[[name]]), function(w) abl_cell(name, w, "written")))))) + ablation_macros <- character() + for (i in seq_len(nrow(abl_cells))) { + c <- abl_cells[i, ] + base <- key("abl", c$ablation, c$workload, if (c$field == "written") "written" else "") + ablation_macros <- c(ablation_macros, + sprintf("\\expandafter\\def\\csname m@%s\\endcsname{%s}", base, paste0(ratio_text(c$ratio), if (c$overlap) "$^\\dagger$" else "")), + sprintf("\\expandafter\\def\\csname m@%sbefore\\endcsname{%s}", base, + if (c$field == "written") bytes_text(c$before) else value_text(c$workload, c$before)), + sprintf("\\expandafter\\def\\csname m@%safter\\endcsname{%s}", base, + if (c$field == "written") bytes_text(c$after) else value_text(c$workload, c$after))) + } + for (name in names(ablations)) { + n <- length(unique(sub("^.*-", "", list.files(file.path(ablation_dir, name), pattern = "^after-")))) + ablation_macros <- c(ablation_macros, sprintf("\\expandafter\\def\\csname m@ablruns%s\\endcsname{%d}", name, n)) + } + writeLines(c("\\makeatletter", ablation_macros, "\\makeatother"), file.path(generated, "ablation.tex")) + shown <- abl_cells[abl_cells$field == "value", ] + shown$label <- mapply(function(name, w) ablation_workloads[[name]][[w]], shown$ablation, shown$workload) + shown$Change <- factor(ablations[shown$ablation], levels = ablations) + shown$label <- factor(paste(shown$ablation, shown$label), levels = rev(unlist(lapply(names(ablation_workloads), function(n) paste(n, ablation_workloads[[n]]))))) + ablation_plot <- ggplot(shown, aes(x = ratio, y = label)) + + scale_y_discrete(labels = function(v) sub("^[a-z]+ ", "", v)) + + geom_vline(xintercept = 1, colour = rule, linewidth = 0.35) + + geom_linerange(aes(xmin = lo, xmax = hi), linewidth = 0.35, colour = hs, alpha = 0.7) + + geom_point(size = 1.1, colour = hs) + + scale_x_log10(breaks = c(0.25, 0.5, 1, 2, 4, 8, 16), labels = c("0.25", "0.5", "1", "2", "4", "8", "16")) + + facet_grid(Change ~ ., scales = "free_y", space = "free_y") + + labs(x = "with the change / without it (log scale; above 1 is better)", y = NULL) + + theme_paper(7) + + theme(strip.text.y = element_text(angle = 0, hjust = 0), panel.spacing = unit(1.2, "mm")) + ggsave(file.path(figures, "ablation.pdf"), ablation_plot, device = cairo_pdf, width = column, height = 2.6) +} else { + writeLines(character(), file.path(generated, "ablation.tex")) +} diff --git a/paper/R/theme.R b/paper/R/theme.R new file mode 100644 index 0000000..57c1fe1 --- /dev/null +++ b/paper/R/theme.R @@ -0,0 +1,86 @@ +suppressPackageStartupMessages({ + library(grid) + library(ggplot2) + library(jsonlite) + library(scales) +}) + +sans <- "Linux Biolinum O" +mono <- "Inconsolatazi4" + +ink <- "#1f1f1f" +rule <- "#5b5b5b" +faint <- "#d9d9d9" +paper <- "#f4f4f2" +hs <- "#1f5f8b" +hs_light <- "#d6e4ef" +hg <- "#b5532f" +hg_light <- "#f2ddd3" +memory <- "#fbf3d5" +disk <- "#e3ecf3" + +column <- 3.33 +textwidth <- 7.0 + +save_grid <- function(file, width, height, draw) { + cairo_pdf(file, width = width, height = height, family = sans) + on.exit(dev.off()) + grid.newpage() + pushViewport(viewport(xscale = c(0, width * 25.4), yscale = c(0, height * 25.4))) + draw() + popViewport() +} + +mm <- function(v) unit(v, "native") + +box <- function(x, y, w, h, label = NULL, fill = "white", col = rule, size = 7, face = "plain", + family = sans, lwd = 0.6, just = "centre", r = 0.6, text_col = ink, lineheight = 1.05) { + cx <- if (identical(just[1], "left")) x + w / 2 else x + grid.roundrect(mm(cx), mm(y), mm(w), mm(h), r = unit(r, "mm"), + gp = gpar(fill = fill, col = col, lwd = lwd)) + if (!is.null(label)) { + grid.text(label, mm(cx), mm(y), gp = gpar(fontsize = size, fontface = face, fontfamily = family, + col = text_col, lineheight = lineheight)) + } +} + +rect <- function(x, y, w, h, fill = "white", col = rule, lwd = 0.5) { + grid.rect(mm(x), mm(y), mm(w), mm(h), just = c("left", "bottom"), gp = gpar(fill = fill, col = col, lwd = lwd)) +} + +label <- function(text, x, y, size = 7, face = "plain", family = sans, col = ink, hjust = 0.5, vjust = 0.5, + rot = 0, lineheight = 1.05) { + grid.text(text, mm(x), mm(y), hjust = hjust, vjust = vjust, rot = rot, + gp = gpar(fontsize = size, fontface = face, fontfamily = family, col = col, lineheight = lineheight)) +} + +arrow_line <- function(x, y, col = rule, lwd = 0.6, lty = "solid", head = TRUE, length = 1.4) { + grid.lines(mm(x), mm(y), gp = gpar(col = col, lwd = lwd, lty = lty, fill = col), + arrow = if (head) arrow(length = unit(length, "mm"), type = "closed", angle = 22) else NULL) +} + +arrow_curve <- function(x1, y1, x2, y2, curvature = 0.3, col = rule, lwd = 0.6, lty = "solid") { + grid.curve(mm(x1), mm(y1), mm(x2), mm(y2), curvature = curvature, square = FALSE, ncp = 8, + gp = gpar(col = col, lwd = lwd, lty = lty, fill = col), + arrow = arrow(length = unit(1.4, "mm"), type = "closed", angle = 22)) +} + +theme_paper <- function(size = 7.5) { + theme_minimal(base_size = size, base_family = sans) + + theme( + text = element_text(colour = ink), + axis.text = element_text(colour = ink, size = rel(0.92)), + axis.title = element_text(size = rel(0.95)), + panel.grid.minor = element_blank(), + panel.grid.major = element_line(colour = "#e6e6e6", linewidth = 0.25), + strip.text = element_text(face = "bold", hjust = 0, size = rel(0.95)), + legend.position = "top", + legend.title = element_blank(), + legend.key.size = unit(3, "mm"), + legend.margin = margin(0, 0, 0, 0), + legend.box.spacing = unit(1, "mm"), + plot.margin = margin(2, 4, 2, 2) + ) +} + +engine_colours <- c(HStore = hs, HyperGraphDB = hg) diff --git a/paper/build.sh b/paper/build.sh new file mode 100755 index 0000000..5de0f62 --- /dev/null +++ b/paper/build.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +set -euo pipefail + +here=$(cd "$(dirname "$0")" && pwd) +work=$here/build +mkdir -p "$work/fonts" "$here/figures" + +find_font() { + local name=$1 found="" + if command -v kpsewhich > /dev/null; then + found=$(kpsewhich "$name" 2> /dev/null || true) + fi + if [ -z "$found" ]; then + for root in "$HOME/Library/Caches/TectonicProject.Tectonic" "$HOME/.cache/Tectonic"; do + [ -d "$root" ] && found=$(find "$root" -name "$name" -print -quit 2> /dev/null) + [ -n "$found" ] && break + done + fi + [ -n "$found" ] || { echo "font $name not found; run tectonic on the paper once so it downloads the fonts" >&2; exit 1; } + cp "$found" "$work/fonts/" +} + +if [ ! -s "$work/fonts/LinBiolinum_R.otf" ]; then + tectonic -X compile --outdir "$work" "$here/hstore.tex" > /dev/null 2>&1 || true +fi +for font in LinBiolinum_R.otf LinBiolinum_RB.otf LinBiolinum_RI.otf LinLibertine_R.otf LinLibertine_RI.otf Inconsolatazi4-Regular.otf; do + find_font "$font" +done + +cat > "$work/fonts.conf" << EOF + + + + $work/fonts + $work/fontcache + +EOF + +export FONTCONFIG_FILE=$work/fonts.conf +export PAPER_R=$here/R +export PAPER_FIGURES=$here/figures +export PAPER_RESULTS=$here/results +export PAPER_ABLATION=$here/ablation +export PAPER_GENERATED=$here/generated + +cd "$here" +mkdir -p generated +for script in diagrams results; do + [ -f "R/$script.R" ] && Rscript "R/$script.R" +done + +if [ "${1:-}" != "figures" ]; then + tectonic -X compile --keep-logs --outdir "$work" hstore.tex + cp "$work/hstore.pdf" "$here/../docs/hstore-paper.pdf" +fi diff --git a/paper/hstore.tex b/paper/hstore.tex new file mode 100644 index 0000000..0ed30bf --- /dev/null +++ b/paper/hstore.tex @@ -0,0 +1,45 @@ +\documentclass[sigconf,nonacm]{acmart} + +\usepackage{booktabs} +\usepackage{tabularx} +\usepackage{xspace} +\usepackage[capitalise,noabbrev]{cleveref} + +\settopmatter{printacmref=false,printccs=false,printfolios=true} +\renewcommand\footnotetextcopyrightpermission[1]{} +\pagestyle{plain} + +\setlength{\emergencystretch}{2.5em} +\newcommand{\hstore}{HStore\xspace} +\newcommand{\hgdb}{HyperGraphDB\xspace} +\newcommand{\wl}[1]{\textsf{#1}} +\newcommand{\code}[1]{\texttt{#1}} +\input{generated/numbers} +\input{generated/ablation} + +\begin{document} + +\title{HStore: A Copy-on-Write Storage Engine for Hypergraphs} + +\author{Metacog Labs} +\affiliation{\institution{Metacog Labs}\country{India}} + +\input{sections/abstract} + +\maketitle + +\input{sections/introduction} +\input{sections/model} +\input{sections/overview} +\input{sections/layout} +\input{sections/transactions} +\input{sections/space} +\input{sections/implementation} +\input{sections/evaluation} +\input{sections/related} +\input{sections/conclusion} + +\bibliographystyle{ACM-Reference-Format} +\bibliography{references} + +\end{document} diff --git a/paper/references.bib b/paper/references.bib new file mode 100644 index 0000000..ac8d026 --- /dev/null +++ b/paper/references.bib @@ -0,0 +1,287 @@ +@inproceedings{hgdb, + author = {Borislav Iordanov}, + title = {HyperGraphDB: A Generalized Graph Database}, + booktitle = {Web-Age Information Management, WAIM 2010 International Workshops}, + series = {Lecture Notes in Computer Science}, + volume = {6185}, + pages = {25--36}, + publisher = {Springer}, + year = {2010} +} + +@inproceedings{opencog, + author = {David Hart and Ben Goertzel}, + title = {OpenCog: A Software Framework for Integrative Artificial General Intelligence}, + booktitle = {Proceedings of the First Conference on Artificial General Intelligence (AGI 2008)}, + series = {Frontiers in Artificial Intelligence and Applications}, + volume = {171}, + pages = {468--472}, + publisher = {IOS Press}, + year = {2008} +} + +@article{typeql, + author = {Christoph Dorn and Haikal Pribadi}, + title = {TypeQL: A Type-Theoretic \& Polymorphic Query Language}, + journal = {Proceedings of the ACM on Management of Data}, + volume = {2}, + number = {2}, + pages = {1--27}, + year = {2024} +} + +@article{battiston, + author = {Federico Battiston and Giulia Cencetti and Iacopo Iacopini and Vito Latora and Maxime Lucas and Alice Patania and Jean-Gabriel Young and Giovanni Petri}, + title = {Networks beyond Pairwise Interactions: Structure and Dynamics}, + journal = {Physics Reports}, + volume = {874}, + pages = {1--92}, + year = {2020} +} + +@article{wikidata, + author = {Denny Vrande{\v{c}}i{\'c} and Markus Kr{\"o}tzsch}, + title = {Wikidata: A Free Collaborative Knowledgebase}, + journal = {Communications of the ACM}, + volume = {57}, + number = {10}, + pages = {78--85}, + year = {2014} +} + +@article{angles, + author = {Renzo Angles and Claudio Gutierrez}, + title = {Survey of Graph Database Models}, + journal = {ACM Computing Surveys}, + volume = {40}, + number = {1}, + articleno = {1}, + year = {2008} +} + +@inproceedings{hygra, + author = {Julian Shun}, + title = {Practical Parallel Hypergraph Algorithms}, + booktitle = {Proceedings of the 25th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming (PPoPP)}, + pages = {232--249}, + year = {2020} +} + +@inproceedings{mesh, + author = {Benjamin Heintz and Rankyung Hong and Shivangi Singh and Gaurav Khandelwal and Corey Tesdahl and Abhishek Chandra}, + title = {MESH: A Flexible Distributed Hypergraph Processing System}, + booktitle = {IEEE International Conference on Cloud Engineering (IC2E)}, + pages = {12--22}, + year = {2019} +} + +@inproceedings{hyperx, + author = {Jin Huang and Rui Zhang and Jeffrey Xu Yu}, + title = {Scalable Hypergraph Learning and Processing}, + booktitle = {IEEE International Conference on Data Mining (ICDM)}, + pages = {775--780}, + year = {2015} +} + +@article{lorie, + author = {Raymond A. Lorie}, + title = {Physical Integrity in a Large Segmented Database}, + journal = {ACM Transactions on Database Systems}, + volume = {2}, + number = {1}, + pages = {91--104}, + year = {1977} +} + +@article{rodeh-shadowing, + author = {Ohad Rodeh}, + title = {B-trees, Shadowing, and Clones}, + journal = {ACM Transactions on Storage}, + volume = {3}, + number = {4}, + articleno = {15}, + year = {2008} +} + +@article{btrfs, + author = {Ohad Rodeh and Josef Bacik and Chris Mason}, + title = {BTRFS: The Linux B-Tree Filesystem}, + journal = {ACM Transactions on Storage}, + volume = {9}, + number = {3}, + articleno = {9}, + year = {2013} +} + +@inproceedings{lmdb, + author = {Howard Chu}, + title = {MDB: A Memory-Mapped Database and Backend for OpenLDAP}, + booktitle = {LDAPCon 2011}, + year = {2011} +} + +@article{persistent, + author = {James R. Driscoll and Neil Sarnak and Daniel D. Sleator and Robert E. Tarjan}, + title = {Making Data Structures Persistent}, + journal = {Journal of Computer and System Sciences}, + volume = {38}, + number = {1}, + pages = {86--124}, + year = {1989} +} + +@article{aries, + author = {C. Mohan and Don Haderle and Bruce Lindsay and Hamid Pirahesh and Peter Schwarz}, + title = {ARIES: A Transaction Recovery Method Supporting Fine-Granularity Locking and Partial Rollbacks Using Write-Ahead Logging}, + journal = {ACM Transactions on Database Systems}, + volume = {17}, + number = {1}, + pages = {94--162}, + year = {1992} +} + +@inproceedings{pillai, + author = {Thanumalayan Sankaranarayana Pillai and Vijay Chidambaram and Ramnatthan Alagappan and Samer Al-Kiswany and Andrea C. Arpaci-Dusseau and Remzi H. Arpaci-Dusseau}, + title = {All File Systems Are Not Created Equal: On the Complexity of Crafting Crash-Consistent Applications}, + booktitle = {11th USENIX Symposium on Operating Systems Design and Implementation (OSDI)}, + pages = {433--448}, + year = {2014} +} + +@inproceedings{torturing, + author = {Mai Zheng and Joseph Tucek and Dachuan Huang and Feng Qin and Mark Lillibridge and Elizabeth S. Yang and Bill W. Zhao and Shashank Singh}, + title = {Torturing Databases for Fun and Profit}, + booktitle = {11th USENIX Symposium on Operating Systems Design and Implementation (OSDI)}, + pages = {449--464}, + year = {2014} +} + +@article{lfs, + author = {Mendel Rosenblum and John K. Ousterhout}, + title = {The Design and Implementation of a Log-Structured File System}, + journal = {ACM Transactions on Computer Systems}, + volume = {10}, + number = {1}, + pages = {26--52}, + year = {1992} +} + +@article{lsm, + author = {Patrick O'Neil and Edward Cheng and Dieter Gawlick and Elizabeth O'Neil}, + title = {The Log-Structured Merge-Tree (LSM-Tree)}, + journal = {Acta Informatica}, + volume = {33}, + number = {4}, + pages = {351--385}, + year = {1996} +} + +@inproceedings{bwtree, + author = {Justin J. Levandoski and David B. Lomet and Sudipta Sengupta}, + title = {The Bw-Tree: A B-tree for New Hardware Platforms}, + booktitle = {29th IEEE International Conference on Data Engineering (ICDE)}, + pages = {302--313}, + year = {2013} +} + +@inproceedings{leanstore, + author = {Viktor Leis and Michael Haubenschild and Alfons Kemper and Thomas Neumann}, + title = {LeanStore: In-Memory Data Management beyond Main Memory}, + booktitle = {34th IEEE International Conference on Data Engineering (ICDE)}, + pages = {185--196}, + year = {2018} +} + +@inproceedings{bdb, + author = {Michael A. Olson and Keith Bostic and Margo Seltzer}, + title = {Berkeley DB}, + booktitle = {Proceedings of the FREENIX Track: 1999 USENIX Annual Technical Conference}, + pages = {183--191}, + year = {1999} +} + +@inproceedings{dietz-sleator, + author = {Paul Dietz and Daniel Sleator}, + title = {Two Algorithms for Maintaining Order in a List}, + booktitle = {Proceedings of the 19th Annual ACM Symposium on Theory of Computing (STOC)}, + pages = {365--372}, + year = {1987} +} + +@inproceedings{bender-order, + author = {Michael A. Bender and Richard Cole and Erik D. Demaine and Martin Farach-Colton and Jack Zito}, + title = {Two Simplified Algorithms for Maintaining Order in a List}, + booktitle = {Algorithms, ESA 2002}, + series = {Lecture Notes in Computer Science}, + volume = {2461}, + pages = {152--164}, + year = {2002} +} + +@inproceedings{ordpath, + author = {Patrick O'Neil and Elizabeth O'Neil and Shankar Pal and Istvan Cseri and Gideon Schaller and Nigel Westbury}, + title = {ORDPATHs: Insert-Friendly XML Node Labels}, + booktitle = {Proceedings of the 2004 ACM SIGMOD International Conference on Management of Data}, + pages = {903--908}, + year = {2004} +} + +@inproceedings{leapfrog, + author = {Todd L. Veldhuizen}, + title = {Leapfrog Triejoin: A Simple, Worst-Case Optimal Join Algorithm}, + booktitle = {Proceedings of the 17th International Conference on Database Theory (ICDT)}, + pages = {96--106}, + year = {2014} +} + +@inproceedings{multiset-hash, + author = {Dwaine Clarke and Srinivas Devadas and Marten van Dijk and Blaise Gassend and G. Edward Suh}, + title = {Incremental Multiset Hash Functions and Their Application to Memory Integrity Checking}, + booktitle = {Advances in Cryptology, ASIACRYPT 2003}, + series = {Lecture Notes in Computer Science}, + volume = {2894}, + pages = {188--207}, + year = {2003} +} + +@article{karp-rabin, + author = {Richard M. Karp and Michael O. Rabin}, + title = {Efficient Randomized Pattern-Matching Algorithms}, + journal = {IBM Journal of Research and Development}, + volume = {31}, + number = {2}, + pages = {249--260}, + year = {1987} +} + +@techreport{clock, + author = {Fernando J. Corbat{\'o}}, + title = {A Paging Experiment with the Multics System}, + institution = {MIT Project MAC}, + number = {MAC-M-384}, + year = {1968} +} + +@inproceedings{critique, + author = {Hal Berenson and Phil Bernstein and Jim Gray and Jim Melton and Elizabeth O'Neil and Patrick O'Neil}, + title = {A Critique of ANSI SQL Isolation Levels}, + booktitle = {Proceedings of the 1995 ACM SIGMOD International Conference on Management of Data}, + pages = {1--10}, + year = {1995} +} + +@inproceedings{fair-benchmarking, + author = {Mark Raasveldt and Pedro Holanda and Tim Gubner and Hannes M{\"u}hleisen}, + title = {Fair Benchmarking Considered Difficult: Common Pitfalls in Database Performance Testing}, + booktitle = {Proceedings of the Workshop on Testing Database Systems (DBTest)}, + articleno = {2}, + year = {2018} +} + +@inproceedings{ldbc, + author = {Orri Erling and Alex Averbuch and Josep Larriba-Pey and Hassan Chafi and Andrey Gubichev and Arnau Prat and Minh-Duc Pham and Peter Boncz}, + title = {The LDBC Social Network Benchmark: Interactive Workload}, + booktitle = {Proceedings of the 2015 ACM SIGMOD International Conference on Management of Data}, + pages = {619--630}, + year = {2015} +} diff --git a/paper/sections/abstract.tex b/paper/sections/abstract.tex new file mode 100644 index 0000000..48b6f9a --- /dev/null +++ b/paper/sections/abstract.tex @@ -0,0 +1,3 @@ +\begin{abstract} +A hyperedge relates any number of things at once, and many datasets are most naturally hypergraphs. Graph databases store them by reification, which hides each relation's size, members and identity from the storage engine. We describe HStore, an embedded storage engine built for hyperedges. Every structure in HStore, including each hyperedge's membership and the index from an atom to the hyperedges that contain it, is a copy-on-write B+tree over 64-bit keys whose child references carry entry counts and subtree summaries. Small memberships are stored inside the hyperedge's record. Commits log the keys they changed instead of the pages they rewrote, a background checkpoint writes each changed node once, and recovery always rebuilds a prefix of the commit order. Pages are reached through a page directory, so compaction moves them without rewriting any tree, generation or branch. We compare HStore with HyperGraphDB on \M{workloadCount} workloads with asynchronous and synchronous commits and with data larger than both systems' caches. HStore reads incidence sets \M{ratios4asyncreadincidence} to \M{ratios1asyncreadincidence} times faster, writes \M{writtens1asyncwriteupdatehs} per update against \M{writtens1asyncwriteupdatehg}, and ingests hyperedges \M{ratios4asyncingestedges} times faster once the data outgrows the cache. Its median single-commit latency under asynchronous durability is the one measurement where HyperGraphDB is ahead. +\end{abstract} diff --git a/paper/sections/conclusion.tex b/paper/sections/conclusion.tex new file mode 100644 index 0000000..b1bd0c6 --- /dev/null +++ b/paper/sections/conclusion.tex @@ -0,0 +1,12 @@ +\section{Conclusion} +\label{sec:conclusion} + +HStore stores a hypergraph as trees of a single kind. Because every tree is a counted, summarized copy-on-write B+tree, the same code answers cardinality, rank, overlap and difference questions for a hyperedge's members, an atom's incidence set and the catalog, and the same checkpoint, recovery and compaction machinery serves all of them. Logging keys instead of pages removes most of the write cost that copy-on-write usually carries, and addressing pages through a directory lets compaction work without touching the trees. Against HyperGraphDB the result is faster reads and writes, fewer bytes written and less space on disk, at the price of more heap. + +\paragraph{Limitations.} A database is opened by one process, and there is no replication. Commits are validated and appended to the log under one lock, so commit throughput is bounded by that short critical section even when writers change different trees. Retained history lives in memory, so after a restart time travel reaches back only to the last checkpoint and the commits replayed after it. Unwritten nodes and decoded nodes are both Java heap, and \cref{sec:eval-resources} shows that HStore keeps more of it than HyperGraphDB. At scale~4 the slowest single commit in a run is slower on HStore than on HyperGraphDB, and we have not yet found what causes these stalls. Decoding leaf records on demand roughly halved the rate of incidence lookups from eight threads at scale~4, a regression we have not yet traced either. For small databases most of the space left after deletes and compaction is the active log segment and the change feed rather than data pages, and their retention is not yet tuned for small stores. + +\paragraph{Future work.} We plan to compare HStore with a graph database that stores reified hyperedges, to run the evaluation with data larger than main memory, and to measure many concurrent writers on overlapping hyperedges, where member-level conflict detection should matter most. + +\begin{acks} +We thank Ujjwal Jain, who found that the first checkpoint after a recovery could record a log position that came before records recovery had discarded, so that a second crash would read them again, and contributed the fix together with the guard against reusing transaction ids described in \cref{sec:recovery}. +\end{acks} diff --git a/paper/sections/evaluation.tex b/paper/sections/evaluation.tex new file mode 100644 index 0000000..a70dc35 --- /dev/null +++ b/paper/sections/evaluation.tex @@ -0,0 +1,137 @@ +\section{Evaluation} +\label{sec:evaluation} + +We compare HStore with HyperGraphDB, the only other embedded store we know of whose atoms are hyperedges with a variable number of members. The evaluation asks four questions. How do the two systems compare on reads, writes and space when the data fits in the cache and when it does not (\cref{sec:eval-throughput,sec:eval-resources})? What do commits and reads cost one at a time, and how do reads behave while a writer is committing (\cref{sec:eval-latency})? How do the systems recover from a crash and reclaim space after deletes (\cref{sec:eval-space})? And how much does each of HStore's main design decisions contribute (\cref{sec:eval-ablation})? + +\subsection{Setup} +\label{sec:eval-setup} + +\paragraph{Dataset.} The dataset is generated from a fixed seed, so both systems load the same hypergraph. At scale $s$ it has $50{,}000\,s$ nodes and $100{,}000\,s$ hyperedges. A hyperedge starts with two members and gains each further member with probability 0.62, up to 32, for a mean cardinality of 3.6. Members are drawn as $\lfloor n u^{2.2}\rfloor$ for uniform $u\in[0,1)$ over $n$ nodes, so low-numbered nodes become hubs. At scale~1 half of the nodes are in at most 5 hyperedges, 370 are in more than 48, and the largest is in 2,645; at scale~4 the largest is in 5,714. Probe sets from the same seed select 100,000 random atoms, 20,000 pairs of nodes that share a hyperedge, and 20,000 node updates. A churn set selects 20\% of the hyperedges for deletion and 20,000 other hyperedges, each losing one member. + +\paragraph{Workloads.} \Cref{tab:workloads} lists the \M{workloadCount} workloads, which run in this order in one process per system and run. Each adapter uses the plain storage API of its system: long ids and \code{forEachIncidentEdge}, \code{forEachMemberId} and \code{Writer.set} for HStore, persistent handles and \code{getIncidenceSet}, \code{getTargetAt} and \code{graph.replace} for HyperGraphDB. We do not use HyperGraphDB's traversal framework, so that both sides measure storage. HyperGraphDB links are immutable, so removing a member replaces the link. Every read and delete workload returns a checksum, such as the number of ids visited, and both systems returned the same checksum in every run. + +\begin{table}[t] +\centering\footnotesize +\caption{Workloads, in execution order.} +\label{tab:workloads} +\begin{tabularx}{\columnwidth}{@{}lX@{}} +\toprule +Workload & Operation \\ +\midrule +\wl{ingest.nodes}, \wl{.edges} & insert all nodes, then all hyperedges, 1,000 per transaction \\ +\wl{read.incidence} & list the hyperedges that contain a node; 100,000 probes \\ +\wl{read.members} & list a hyperedge's members; 100,000 probes \\ +\wl{read.comembership} & count the hyperedges that contain both nodes of a pair \\ +\wl{read.twohop} & count distinct nodes that share a hyperedge with a node \\ +\wl{read.incidence.parallel} & \wl{read.incidence} from 8 threads \\ +\wl{latency.read} & one incidence lookup per read transaction, each timed \\ +\wl{write.update} & replace a node's value; 20,000 updates, 1,000 per transaction \\ +\wl{latency.commit} & one update per transaction, each timed; 5,000 commits \\ +\wl{mixed.read}, \wl{.write} & 7 reader threads for 10\,s beside a writer committing 10 updates per transaction on a fixed schedule of 1,000 updates/s \\ +\wl{large.*} & create one hyperedge that contains every node, scan it 400 times, probe it 100,000 times \\ +\wl{reopen} & close cleanly and open again \\ +\wl{read.incidence.cold} & \wl{read.incidence} right after the reopen \\ +\wl{churn.delete}, \wl{.remove} & delete 20\% of the hyperedges; remove one member from 20,000 others \\ +\wl{compaction} & single-update commits at 50/s while a full space reclamation runs \\ +\wl{disk}, \wl{.churned}, \wl{.compacted} & bytes on disk after load, after the deletes, after reclamation \\ +\wl{recover} & open a store whose ingest process was killed with SIGKILL \\ +\bottomrule +\end{tabularx} +\end{table} + +\paragraph{Measurement.} Throughput is the operation count divided by the elapsed time of the whole operation set. Each write workload ends with a flush outside the timed section (an HStore checkpoint or a JE \code{sync}), so bytes still in buffers are charged to the workload that produced them. Every read workload except \wl{read.incidence.cold} first runs untimed for at least 2\,s, so both systems are measured with their read paths compiled by the JIT. The latency workloads time every transaction; in \wl{mixed} and \wl{compaction} the writer follows a fixed schedule and its latency is measured from the scheduled start, so a stall is charged to every commit queued behind it~\cite{fair-benchmarking}. Both systems count their own file I/O: HStore its log and page bytes, including pages moved by compaction, and HyperGraphDB the bytes JE writes and reads, including its cleaner. Allocation per operation comes from the JVM's per-thread allocation counters and the retained heap from a full collection after ingest. + +\paragraph{Configurations.} We run three configurations. S1~async is scale~1 with asynchronous commits. S1~sync is scale~1 with synchronous commits. S4~async is scale~4 with asynchronous commits; there the files of both systems are larger than their 64\,MiB caches. Both caches get the same 64\,MiB budget. HStore's covers decoded nodes; JE's covers its B+tree nodes and records, and HyperGraphDB's atom cache comes on top and cannot be capped in bytes. HyperGraphDB~1.4 begins every JE transaction with \code{WRITE\_NO\_SYNC}, which overrides the environment's \code{COMMIT\_SYNC}; under S1~sync its adapter therefore forces JE's log after every commit, which is what \code{COMMIT\_SYNC} would do. + +\paragraph{Machine.} All runs used one Azure \code{Standard\_D8ds\_v5} virtual machine: four cores (eight hardware threads) of an Intel Xeon Platinum 8370C at 2.8\,GHz, 32\,GiB of memory, and Ubuntu 24.04 with Linux 6.17. Both systems kept their files on the machine's local 300\,GB temporary SSD, formatted as ext4, and ran on Oracle GraalVM 25.0.4 in JVM mode. HyperGraphDB is version 1.4 built from commit \code{99485a1} with Berkeley DB JE 5.0.73, the JE version its storage module is written against. Each system runs in its own JVM with a fixed 4\,GiB heap and the Parallel collector. Runs alternate between the two systems, so that a slow period on the machine affects both. We report medians over \M{runss1async}, \M{runss1sync} and \M{runss4async} runs per system for the three configurations. A ratio is oriented so that values above 1 favour HStore, and it is marked with $\dagger$ when the ranges of the two systems' runs overlap. + +\begin{table*}[t] +\centering\footnotesize +\caption{Median results. Rates are operations per second; \wl{disk} rows are bytes on disk; \wl{reopen} and \wl{recover} are times. A ratio above 1 favours HStore, and $\dagger$ marks a ratio whose run ranges overlap. The S1~sync column gives only the ratio; its rates differ from S1~async only for the commit-bound workloads discussed in the text.} +\label{tab:results} +\begin{tabular}{@{}lrrrrrrr@{}} +\toprule +& \multicolumn{3}{c}{S1 async} & S1 sync & \multicolumn{3}{c}{S4 async} \\ +\cmidrule(lr){2-4}\cmidrule(lr){5-5}\cmidrule(l){6-8} +Workload & HStore & HyperGraphDB & ratio & ratio & HStore & HyperGraphDB & ratio \\ +\midrule +\input{generated/table-all} +\end{tabular} +\end{table*} + +\begin{figure}[t] +\centering +\includegraphics[width=\columnwidth]{figures/ratios} +\caption{HStore's advantage per workload and configuration: the ratio of the medians, with a bar from the least to the most favourable pairing of runs. Workloads with a fixed rate are left out.} +\label{fig:ratios} +\end{figure} + +\subsection{Throughput} +\label{sec:eval-throughput} + +\Cref{tab:results} lists every median and \cref{fig:ratios} plots the ratios. Every read and delete workload returned the same checksum on both systems in every run. HStore is ahead on every workload whose rate the harness does not fix, with one exception: single-update commits under asynchronous durability at scale~1, where the two systems are within each other's range (\M{ratios1asynclatencycommit}). + +\paragraph{Reads.} A batch of incidence lookups is \M{ratios1asyncreadincidence} times faster at scale~1 and \M{ratios4asyncreadincidence} times faster at scale~4, and member lookups are \M{ratios1asyncreadmembers} and \M{ratios4asyncreadmembers} times faster. Counting the hyperedges two nodes share is \M{ratios1asyncreadcomembership} times faster at scale~1. HStore answers it by intersecting the two incidence trees and skipping every pair of subtrees whose key ranges do not overlap; HyperGraphDB evaluates the conjunction of two incidence conditions. From eight threads HStore reaches \M{hss1asyncreadincidenceparallel} incidence lookups per second at scale~1, while HyperGraphDB stays at \M{hgs1asyncreadincidenceparallel}, about its single-thread rate of \M{hgs1asyncreadincidence}. Right after a reopen the gap is widest: \M{ratios1asyncreadincidencecold} times at scale~1 and \M{ratios4asyncreadincidencecold} times at scale~4. HStore reads its segments through memory maps that the operating system's page cache still holds and decodes a leaf record only when it is read, while JE fills its own cache from its log one node at a time. + +\paragraph{Writes.} Node and hyperedge ingest are \M{ratios1asyncingestnodes} and \M{ratios1asyncingestedges} times faster at scale~1. At scale~4, where both systems' files outgrow their 64\,MiB caches, hyperedge ingest is \M{ratios4asyncingestedges} times faster, because HyperGraphDB drops from \M{hgs1asyncingestedges} to \M{hgs4asyncingestedges} hyperedges per second. Updates in batches of 1,000 are \M{ratios1asyncwriteupdate} and \M{ratios4asyncwriteupdate} times faster. Creating one hyperedge that holds every node is \M{ratios1asynclargeingest} times faster at scale~1 and \M{ratios4asynclargeingest} times at scale~4, and scanning it is \M{ratios1asynclargescan} times faster. Deletes are the closest. At scale~4 HStore deletes \M{hss4asyncchurndelete} hyperedges per second, \M{ratios4asyncchurndelete} times HyperGraphDB's rate, against \M{ratios1asyncchurndelete} times at scale~1. Deleting a hyperedge removes it from the reverse index of every member, and at scale~4 those postings are spread over many more pages than the cache holds. + +\paragraph{Opening a database.} A clean reopen takes \M{hss1asyncreopen} against \M{hgs1asyncreopen} at scale~1 (\M{ratios1asyncreopen} times faster). HStore loads the catalog image and maps the segments; nothing is replayed after a clean shutdown. + +\subsection{Latency} +\label{sec:eval-latency} + +\begin{figure*}[t] +\centering +\includegraphics[width=\textwidth]{figures/latency} +\caption{Latency percentiles, medians over runs. Read latencies are per transaction with one lookup; commit latencies include the wait for the group commit; in the mixed workload the writer's latency is measured from each transaction's scheduled start.} +\label{fig:latency} +\end{figure*} + +\Cref{fig:latency} shows the percentiles. A read transaction that looks up one incidence set takes \M{lats1asynclatencyreadhspfifty} at the median on HStore and \M{lats1asynclatencyreadhgpfifty} on HyperGraphDB, and \M{lats1asynclatencyreadhspninetyninenine} against \M{lats1asynclatencyreadhgpninetyninenine} at the 99.9th percentile. + +Single-update commits are where the systems are closest. Under asynchronous durability at scale~1, HyperGraphDB's median commit is faster (\M{lats1asynclatencycommithgpfifty} against \M{lats1asynclatencycommithspfifty}), but its tail is longer: \M{lats1asynclatencycommithgpninetynine} against \M{lats1asynclatencycommithspninetynine} at the 99th percentile and \M{lats1asynclatencycommithgpninetyninenine} against \M{lats1asynclatencycommithspninetyninenine} at the 99.9th. Under synchronous durability every commit waits for an fsync, and HStore's median is \M{lats1synclatencycommithspfifty} against \M{lats1synclatencycommithgpfifty}; a commit writes \M{writtens1synclatencycommiths} to HStore's log and data files and \M{writtens1synclatencycommithg} to JE's. At scale~4 HStore's commits are faster at every percentile up to the 99.9th (\M{lats4asynclatencycommithspninetyninenine} against \M{lats4asynclatencycommithgpninetyninenine}), but its slowest commit in a run is slower: \M{lats4asynclatencycommithsmax} at the median of the runs against \M{lats4asynclatencycommithgmax}. We have not yet traced these single stalls. + +The mixed workload runs seven readers for 10\,s beside a writer that commits 1,000 updates per second on a fixed schedule. Both writers kept the schedule. HStore's readers complete \M{ratios1asyncmixedread} times as many lookups, with a median latency of \M{lats1asyncmixedreadhspfifty} against \M{lats1asyncmixedreadhgpfifty} and a 99.9th percentile of \M{lats1asyncmixedreadhspninetyninenine} against \M{lats1asyncmixedreadhgpninetyninenine}. HStore readers never take a lock, so the writer does not slow them, and the writer in turn finishes its transactions sooner: its 99th percentile, measured from the scheduled start, is \M{lats1asyncmixedwritehspninetynine} against \M{lats1asyncmixedwritehgpninetynine}. + +\subsection{Resources} +\label{sec:eval-resources} + +\begin{figure*}[t] +\centering +\includegraphics[width=\textwidth]{figures/resources} +\caption{(a) Bytes written to the log and data files per operation, including JE's cleaner and HStore's compaction. (b) Heap bytes allocated per operation on the read workloads, over all threads. (c) Bytes on disk after the load, after the deletes and after reclamation, each measured after a clean shutdown.} +\label{fig:resources} +\end{figure*} + +\paragraph{Bytes written.} Logging keys instead of pages shows most clearly in the bytes written per change (\cref{fig:resources}a). An update in a batch writes \M{writtens1asyncwriteupdatehs} on HStore and \M{writtens1asyncwriteupdatehg} on HyperGraphDB, and a single-update commit \M{writtens1asynclatencycommiths} against \M{writtens1asynclatencycommithg}. At scale~4 hyperedge ingest writes \M{writtens4asyncingestedgeshs} per hyperedge against \M{writtens4asyncingestedgeshg}. Over a whole run at scale~4, HStore wrote \M{totalwrittens4asynchs} and HyperGraphDB \M{totalwrittens4asynchg}, \M{compactwrittens4asynchg} of it during the \wl{compaction} workload, while JE's cleaner copied live records out of old log files after the deletes. + +\paragraph{Allocation and heap.} Reads on HStore allocate almost nothing (\cref{fig:resources}b): \M{allocs1asyncreadincidencehs} per incidence lookup in a batch against \M{allocs1asyncreadincidencehg}, and \M{allocs1asynclatencyreadhs} per single-lookup transaction against \M{allocs1asynclatencyreadhg}. In the mixed workload, where the readers allocate \M{allocs1asyncmixedreadhs} and \M{allocs1asyncmixedreadhg} per lookup, the collector spent \M{gcmss1asyncmixedreadhs} on HStore and \M{gcmss1asyncmixedreadhg} on HyperGraphDB over the 10\,s. HStore keeps more heap after ingest, \M{retaineds1asynchs} against \M{retaineds1asynchg} at scale~1 and \M{retaineds4asynchs} against \M{retaineds4asynchg} at scale~4. Both its node cache and its write buffer of nodes that no checkpoint has written yet are on the heap. + +\subsection{Space and recovery} +\label{sec:eval-space} + +After the load HStore's files take \M{hss1asyncdisk} at scale~1 and \M{hss4asyncdisk} at scale~4, against \M{hgs1asyncdisk} and \M{hgs4asyncdisk} for HyperGraphDB (\cref{fig:resources}c). The deletes grow HStore's files to \M{hss4asyncdiskchurned} at scale~4, because a page that a delete replaced stays until a checkpoint releases it and compaction empties its segment. HStore gives that space back on its own. The \wl{compaction} workload starts 10\,s later, after ten seconds of single-update commits with the background compactor running, and by then the files are back to \M{diskbeforecompacts4asynchs}; the explicit compaction that follows takes \M{compactmss4asynchs}. JE's cleaner, run until it reports nothing left to clean, takes \M{compactmss4asynchg} at scale~4. At scale~1 it usually takes well under a second, but one of the five runs took \M{compactmsmaxs1asynchg}. Commits continued on both systems while space was reclaimed and kept their schedule of 50 per second. After reclamation HStore's files are \M{hss1asyncdiskcompacted} and \M{hss4asyncdiskcompacted}, and HyperGraphDB's \M{hgs1asyncdiskcompacted} and \M{hgs4asyncdiskcompacted}. + +In the \wl{recover} workload a child process ingests nodes in transactions of 1,000 and is killed with SIGKILL once half of them are acknowledged. No run of either system lost an acknowledged commit. Opening the killed store takes \M{hss1asyncrecover} on HStore and \M{hgs1asyncrecover} on HyperGraphDB at scale~1, and \M{hss4asyncrecover} against \M{hgs4asyncrecover} at scale~4. At scale~1 the child writes only a few megabytes of log before it is killed, so with the automatic threshold of \cref{sec:transactions} the open replays only the log written since the last background checkpoint. + +\subsection{What each design choice contributes} +\label{sec:eval-ablation} + +\begin{figure}[t] +\centering +\includegraphics[width=\columnwidth]{figures/ablation} +\caption{Effect of three design choices, each measured on HStore alone at the commit that introduced it and at the commit before it. Logged keys and inline member trees run at scale~1, records decoded on demand at scale~4.} +\label{fig:ablation} +\end{figure} + +To separate three of the decisions in \cref{sec:layout,sec:transactions}, we ran HStore alone at the commit that introduced each of them and at the commit just before it, with \M{ablrunslogical} runs of each build on the same machine (\cref{fig:ablation}). The two builds of a pair differ only in that change. Each pair comes from earlier in the project's history than the version measured above, so its absolute numbers are not comparable with \cref{tab:results}. + +\paragraph{Logging keys instead of pages.} Before this change a commit wrote every new node from each changed leaf to the root. An update in a batch wrote \M{abllogicalwriteupdatewrittenbefore} before it and \M{abllogicalwriteupdatewrittenafter} after it, and a single-update commit \M{abllogicallatencycommitwrittenbefore} and \M{abllogicallatencycommitwrittenafter}. Batched updates became \M{abllogicalwriteupdate} times faster and single-update commits \M{abllogicallatencycommit} times faster. The cost is recovery. The open now replays the logged keys into the trees instead of finding pages already written, and opening the killed store took \M{abllogicalrecoverafter} instead of \M{abllogicalrecoverbefore}. The automatic checkpoint threshold, added later, bounds how much log the open has to replay. Most read workloads were 5 to 17\% slower after the change, two-hop queries excepted, and we have not investigated why. + +\paragraph{Inline member trees.} Storing a small membership inside the hyperedge's record makes member lookups \M{ablinlinereadmembers} times faster and two-hop queries \M{ablinlinereadtwohop} times faster, because a lookup no longer follows a root reference to a tree of its own. It also removes a separate small leaf per hyperedge, and the files after reclamation shrink from \M{ablinlinediskcompactedbefore} to \M{ablinlinediskcompactedafter}. Single-lookup read transactions were slightly slower, at \M{ablinlinelatencyread} times their earlier rate. + +\paragraph{Records decoded on demand.} With data larger than the cache, decoding a leaf record only when it is read makes member lookups \M{abllazyreadmembers} times faster (\M{abllazyreadmembersbefore} to \M{abllazyreadmembersafter} per second) and two-hop queries \M{abllazyreadtwohop} times faster, since a lookup that misses the cache decodes one record instead of a whole page. Incidence lookups right after a reopen gain \M{abllazyreadincidencecold} times. The same change cost almost half of the incidence rate from eight threads, from \M{abllazyreadincidenceparallelbefore} to \M{abllazyreadincidenceparallelafter} lookups per second, and deletes ran at \M{abllazychurndelete} times their earlier rate. We have not yet found what the eight readers contend on. + +\subsection{Limits of this evaluation} + +Both systems run on the JVM, on one machine, with one synthetic dataset. The dataset's skewed membership resembles real hypergraphs, but its hyperedges carry no properties beyond a name, and we did not test workloads with large property values or with many concurrent writers. HyperGraphDB is the only system we compare with, because it is the only embedded store we know of with first-class hyperedges, and its storage layer, JE~5.0.73, is more than a decade old. A comparison with a graph database storing reified hyperedges would answer a different question and is left for future work. diff --git a/paper/sections/implementation.tex b/paper/sections/implementation.tex new file mode 100644 index 0000000..c07f1bb --- /dev/null +++ b/paper/sections/implementation.tex @@ -0,0 +1,10 @@ +\section{Implementation} +\label{sec:implementation} + +HStore is written in Java~25 as three modules. The storage engine (about 12,000 non-blank lines) depends only on the Java base module. The database layer (about 7,900 lines) adds schemas and typed properties, property indexes, tenants and users, evidence and valid-time queries, a three-way branch merge, an embedding index fed from the change feed, higher-order operators over incidence sets, and HQL, a query language with a cost-based planner. The server (about 2,600 lines) provides a command-line tool, a line-oriented TCP protocol and a web console. The same code runs on the JVM and as a GraalVM native image, which is how the server ships in its container image. + +The engine leans on recent additions to the Java platform. Segment maps and the page directory use the foreign memory API; each segment map has its own shared arena and is closed as soon as the segment is remapped or deleted, so the disk space of a deleted segment comes back at once instead of when the garbage collector finds the mapping. A per-query I/O meter, which enforces a page budget per query, is bound with scoped values rather than thread-locals. Server connections and feed subscribers run on virtual threads. Commits can therefore be issued from thousands of threads, and the group committer runs its sync on whichever committing thread leads the batch. + +A Java thread that is interrupted during a read or write on a \code{FileChannel} closes the channel for every thread. Before this was handled, one request that timed out during a commit closed the log and every later commit failed. All shared files are therefore accessed through a wrapper that clears the interrupt flag for the length of the call, restores it afterwards, and reopens the file and retries if the channel was closed anyway; every read and write is positional, so a retry touches the same bytes. + +\paragraph{Testing.} The engine's tests inject a crash at each of fourteen named points: the seven steps of a commit from the first page write to publication, two steps of compaction, four of a checkpoint and the force of the log. Each commit crash point is run with both log modes; the test asserts that the reopened store holds either the state before the commit or the state after it, never a mix, and that the forward and reverse indexes agree. A second set of tests models a power failure instead of a process crash. Every file the engine writes is opened through one wrapper, which lets a test record each write, each sync of a file or a memory map and each sync of a directory, cut the power at any of these events, and rebuild the directory as a disk could have kept it: only what was synced, the last unsynced write torn in half or with a flipped byte, or a random mix, with files whose directory was never synced possibly missing. The tests then check that the recovered commits are a prefix of the attempted ones, that every commit acknowledged under synchronous durability survived, that no aborted work appears and that the change feed holds exactly one event per recovered commit. They found five bugs, all of them in files outside the log: a format marker written without a sync, a segment directory that was never synced after a file was created in it, a page directory header that could keep an unsynced first page number, and two ways in which zeroed or damaged change-feed frames were read as valid. After random workloads, the suites replay the log against the generations in memory and compare them entry by entry, and a verifier checks every reachable page (checksums, key order, balance, summaries and reference counts), which the \code{hstore check} command also runs. Finally, we kill the native server with SIGKILL during a bulk load, reopen it and check the counts. diff --git a/paper/sections/introduction.tex b/paper/sections/introduction.tex new file mode 100644 index 0000000..1fbac29 --- /dev/null +++ b/paper/sections/introduction.tex @@ -0,0 +1,22 @@ +\section{Introduction} +\label{sec:intro} + +Many datasets are made of relations among more than two things. A medical claim involves a patient, a provider, a payer and a list of procedures. A paper has authors in a fixed order. A reaction has reactants, products and a catalyst, each in its own role. A hypergraph models each such relation as one \emph{hyperedge} that contains any number of members, where a member can play a role, carry a weight or hold only for a period of time. If hyperedges are objects in their own right, a hyperedge can also be a member of another one. Statements about statements, provenance and evidence are expressed this way~\cite{wikidata,battiston}. + +Graph databases store binary edges. The usual way to store an $n$-ary relation in one is reification: a node stands for the relation and $n$ binary edges connect it to its members~\cite{angles}. Queries still work, but the storage engine now sees $n+1$ unrelated objects. It cannot say how many members a relation has without visiting all $n$ edges or compare two relations without reading both, and a change to a membership becomes $n$ separate edge updates that a concurrent writer cannot merge as a unit. + +Several systems model hyperedges directly. HyperGraphDB~\cite{hgdb} stores each link as an array of target handles in Berkeley DB Java Edition~\cite{bdb}, with a separate index from every atom to the links that point at it. AtomSpace~\cite{opencog} and TypeDB~\cite{typeql} make $n$-ary relations first class in their data models, and parallel frameworks~\cite{hygra,mesh,hyperx} analyse hypergraphs held in memory. What is still missing is a storage engine whose physical structures are designed around hyperedges. Such an engine should make small and very large memberships equally cheap to read and change, answer membership, cardinality and overlap questions without scanning, let writers commit concurrently while readers see stable snapshots and past versions, and recover from a crash to a state that some prefix of the commits produced. + +This paper describes HStore, an embedded storage engine built to those requirements, and compares it with HyperGraphDB. Four ideas shape it. + +\paragraph{One tree for every structure.} Every structure HStore keeps is a copy-on-write B+tree over 64-bit keys, including each hyperedge's membership and the reverse index from an atom to the hyperedges that contain it. Each child reference in the tree carries the entry count and a summary of its subtree: the key range, the weight and time ranges, a role mask and a fingerprint that depends only on the subtree's contents. Counts give rank and select in logarithmic time. Summaries let a query skip subtrees it cannot match, and let two trees be compared, intersected or diffed in time that grows with how much they differ rather than with their size. The catalog is a tree of trees: a hyperedge's record holds the root of its membership tree, and holds the whole tree when it is small, as almost all are. + +\paragraph{Commits log keys, not pages.} A copy-on-write commit normally writes every node from each changed leaf up to the root. An HStore commit logs the keys it changed and publishes a generation whose new nodes are still in memory. A background checkpoint writes each of those nodes once, however many commits changed it. Recovery replays the logged keys from the last checkpoint in commit order and stops at the first commit whose pages did not reach the disk, so the recovered state is always a prefix of the commit order. + +\paragraph{Pages move without rewriting trees.} Trees refer to pages by permanent page numbers, and a memory-mapped page directory maps each number to the page's current place in an append-only segment file. Compaction copies a live page byte for byte and changes one directory entry. No tree, generation or branch is rewritten, so compaction does not conflict with commits and keeps old generations readable. Reference counts, updated only between consecutive checkpointed generations, tell compaction which pages are live. + +\paragraph{Leaves decode one record at a time.} Records in catalog and index leaves are prefixed by their length. A leaf read from disk keeps its bytes and decodes a record only when the record is first read, charging the decoded size to the node cache. When the data is larger than the cache, a lookup then decodes one record instead of a whole page. + +HStore is written in Java~25 and consists of the storage engine, a database layer with schemas, properties and a query language, and a server. We compare it with HyperGraphDB on a synthetic hypergraph with skewed degrees, using \M{workloadCount} workloads that cover ingest, reads, per-operation latency, reads during writes, deletes, space reclamation and crash recovery. We run them with asynchronous and synchronous commits, and with a dataset larger than both systems' caches. HStore is ahead on every workload whose rate the harness does not fix, with one exception: the median latency of a single commit under asynchronous durability, where HyperGraphDB is faster. HStore writes \M{writtens1asyncwriteupdatehs} per update where HyperGraphDB writes \M{writtens1asyncwriteupdatehg}, and its files after the load are \M{ratios1asyncdisk} to \M{ratios4asyncdisk} times smaller. It keeps more of the Java heap than HyperGraphDB does. + +\Cref{sec:model} defines the data model. \Cref{sec:overview} gives an overview of the engine, and \cref{sec:layout,sec:transactions,sec:space} describe the storage layout, transactions and recovery, and space reclamation. \Cref{sec:implementation} covers the implementation and its testing, and \cref{sec:evaluation} the evaluation. \Cref{sec:related} discusses related work, and \cref{sec:conclusion} concludes with the limitations we know of. diff --git a/paper/sections/layout.tex b/paper/sections/layout.tex new file mode 100644 index 0000000..7a689c8 --- /dev/null +++ b/paper/sections/layout.tex @@ -0,0 +1,57 @@ +\section{Trees and storage layout} +\label{sec:layout} + +\subsection{Counted, summarised copy-on-write trees} +\label{sec:tree} + +Every tree in HStore is a B+tree over signed 64-bit keys. A leaf holds sorted keys and their values; a branch holds separator keys and child references. Nodes are never changed once another version can see them. An update copies the path from the root to the changed leaf, and the new root shares every other subtree with the old one, as in other copy-on-write B-trees~\cite{lorie,rodeh-shadowing,lmdb}. Inside one transaction, a node that the transaction itself created may be changed in place: each node carries an owner token, and a write copies a node only if its token is not the transaction's. A transaction that makes $n$ changes under one root therefore allocates in proportion to $n$ plus the nodes it touches, not $n$ times the tree height. When a version escapes, for example to a stream handed to the caller, the token is replaced and every node created so far becomes immutable. + +Leaves are filled by bytes, not by entry count. A leaf tracks the exact size of its delta-encoded key stream and an upper bound on the size of its values, and splits when the total exceeds the page budget. With the default 16\,KiB page, a leaf of plain 8-byte keys holds thousands of entries and a branch holds up to 137 children. + +\paragraph{Summaries.} Each child reference stores the subtree's \emph{summary}, a monoid value made of the entry count, the minimum and maximum key, the sum and range of the entry weights, the range of the validity intervals, a 64-bit mask of the role sets present, and a fingerprint. Combining two summaries is component-wise: sums, minima, maxima and bitwise or. The count makes rank, select and range counts logarithmic, since they subtract or add child counts from the references without loading the children. The other fields let a cursor skip any subtree that cannot hold a match: a scan for members valid at time $t$ enters a child only if $t$ lies in the child's time range, and a scan by role only if the role's bit is set in the mask. The mask is a 64-bucket Bloom filter, so a set bit only means ``maybe'' and the scan checks the role exactly. + +\paragraph{Fingerprints.} Let $h(e)$ be a 64-bit hash of an entry. A tree whose order does not matter, such as the members of a set hyperedge, has the fingerprint $F(S)=\sum_{e\in S} h(e) \bmod 2^{64}$, an additive multiset hash~\cite{multiset-hash}. A sequence uses a polynomial hash~\cite{karp-rabin}, $F(e_1\ldots e_n)=\sum_i h(e_i)\,B^{\,n-i} \bmod 2^{64}$, whose concatenation rule $F(LR)=F(L)\,B^{|R|}+F(R)$ lets a branch combine its children's fingerprints. Both depend only on the contents, never on the shape of the tree or the order of insertion. Two hyperedges with different fingerprints differ, and the engine knows it after reading two references. All hashes are computed from explicit mixing functions, not from Java's object hash codes, so fingerprints stay the same across processes and across the native build. + +\paragraph{Algebra on shared structure.} Because versions share subtrees, comparing two of them can skip whatever they share. Each reference to a stored subtree is identified by its page number, and two equal references denote the same subtree. A diff walks two frontiers of subtrees and drops a pair of equal references without reading it, so the diff of two consecutive generations costs about twice the tree height in page reads. Counting the intersection of two trees descends both in step: disjoint key ranges contribute nothing, equal references contribute their stored count, and only the parts that differ are read. Intersecting $k$ incidence sets uses a leapfrog join~\cite{leapfrog} over $k$ cursors, each restricted by summaries to the key range common to all inputs. A union of two trees with disjoint key ranges is a concatenation that copies $O(1+\Delta h)$ nodes, where $\Delta h$ is the difference in height. + +\subsection{Hyperedges} +\label{sec:hyperedges} + +The members of a set hyperedge are a tree keyed by member atom id, whose values are incidences. Membership tests and the member at rank $i$ are logarithmic, and the cardinality is the count in the root reference. + +An ordered hyperedge is a sequence that can be edited at any position, so its keys are \emph{order-maintenance labels}~\cite{dietz-sleator,bender-order}: sparse integers in $[0,2^{62})$ whose order is the sequence order. The incidence stores the member id. An insertion between two members takes the midpoint of their labels; an append steps by $2^{24}$, so appending never relabels. When two neighbours have no free label between them, the engine relabels a window around the position, doubling its width until the free space reaches $2^8$ labels per member, which keeps the amortised cost of an insertion logarithmic. A second tree maps each member to its label, so membership tests stay logarithmic. Relabelling changes keys but not contents, so the fingerprint of an ordered hyperedge, which is computed from the incidences and not from their labels, does not change. + +Incidence leaves are encoded column by column. A flag byte says which of the six optional columns (roles, weight, start and end of validity, payload, qualifier) any row in the leaf uses. Each such column has a bitmap of the rows that use it, followed by their values as variable-length integers. A plain membership therefore costs one to three bytes, and a leaf whose rows use no optional column is decoded into nothing but an array of member ids. + +\begin{figure*}[t] +\centering +\includegraphics[width=\textwidth]{figures/layout} +\caption{(a) The catalog holds atom records. A hyperedge record holds its membership tree inline when the tree is one small leaf and points to its own pages otherwise. Every record in a catalog leaf is preceded by its length. (b) The reverse incidence index maps an atom to the hyperedges that contain it. Small posting sets are stored in the directory leaf, large ones in a tree of their own.} +\label{fig:layout} +\end{figure*} + +\subsection{The catalog: a tree of trees} + +The catalog maps an atom id to its record (\cref{fig:layout}a). A hyperedge's record holds references to the root of its membership tree and, for ordered hyperedges, of its label index. These are nested trees that the engine writes, counts and compacts like any other. + +Most hyperedges are small: in the dataset of \cref{sec:evaluation}, the mean cardinality is 3.6. Giving each membership a page of its own would cost a page write, a cache entry and a page read for every hyperedge read. A nested tree is therefore kept \emph{inline} in its record when it is a single leaf of at most 32 entries whose encoding fits in 108 bytes, the space a record already reserves for a reference to a tree that is still in memory. That rule keeps pages from overflowing. While a hyperedge is being changed, the leaf that holds its record is sized as if the reference took the full 108 bytes. When the leaf is written, the reference becomes either a stored or an inline one, both of which fit in that space, so the written leaf can only shrink. The decision is made again each time the tree is written, so a hyperedge that grows past the limit moves to its own pages at the next checkpoint and one that shrinks moves back. + +\subsection{The reverse incidence index} + +The reverse index maps an atom to the hyperedges that contain it (\cref{fig:layout}b). It is a two-level structure. A directory tree maps the atom to a posting set; a posting set maps a hyperedge id to the member's roles and its position key in that hyperedge. A posting set is stored inline in the directory leaf while it has at most 48 entries and at most half the largest value size, and is promoted to a tree of its own beyond that. It is demoted again when it shrinks to 24 entries, so a set that hovers at the limit does not move back and forth. The directory's summaries add up posting counts as weights, so the number of incidences of any range of atoms is read from the summaries alone. The index is a derived slot: a derivation applies every membership change in a transaction to it before the transaction commits, so the two directions always agree within a generation. + +\subsection{Node images, page numbers and segments} +\label{sec:pages} + +A node is stored as an \emph{image}: an 80-byte header followed by the encoded node. The header holds a magic number, the page type, the tree's schema id, the node's own page number, the generation that wrote it, the payload length, the entry count, the node's summary and a CRC-32C over everything except the checksum itself. Every read verifies the magic number, the format, the page number and the checksum. + +A page number is permanent. It has a 48-bit index and 16 bits reserved for reuse, and it says nothing about where the image is stored. The \emph{page directory} maps each index to an address made of a 24-bit segment number, a 24-bit offset in 64-byte units and a 16-bit length in units. The directory is a file of 8-byte entries, memory-mapped in 8\,MiB chunks, so a lookup is one load and takes no Java heap. Trees, the node cache and the log refer only to page numbers; only the page store resolves addresses. Page \code{\#1234}, stored in three units at unit 1234 of segment 1, is the directory entry at byte $64+8\cdot1234$, pointing to byte $64\cdot 1234$ of segment file \code{00000001.seg}. + +Images are packed back to back into append-only segment files and aligned to 64 bytes, rather than given a fixed slot of the page size. A hypergraph produces many small nodes, and on the example database that ships with HStore packing cuts the segment space from 17.6\,MB to 1.0\,MB. Each segment is mapped read-only, and a read copies the image out of the map into a heap array before decoding it. Decoding straight from the map was two to five times slower in a microbenchmark, because the JIT compiler generates its fastest code only when every byte buffer that reaches the decoder is of the same kind, and the log and the catalog are decoded from heap arrays. + +\subsection{Packed leaves and the node cache} +\label{sec:cache} + +Decoded nodes are cached on the Java heap in a node cache with 16 shards. Each shard is an open-addressing table keyed by page number with a CLOCK ring~\cite{clock} for eviction and a byte budget. Lookups are lock-free; only admission takes the shard's lock. A node is charged an estimate of its heap size, computed from its arrays and entries with constants measured against the retained heap at two dataset sizes. + +Catalog and index leaves hold variable-length records, and a fully decoded catalog leaf takes far more heap than its page. On our dataset a decoded catalog leaf of about 83 records, with their inline member lists, took about eleven times the size of its 1.5\,KiB image. With a cache smaller than the catalog, lookups missed the cache about half the time and each miss decoded every record of the page to return one. Leaves of codecs whose values are independent of each other therefore prefix every record with its length. A leaf read from a page is kept \emph{packed}: it holds the image, the decoded keys and the offset of every record, and decodes a record the first time it is read. The decoded record is published into the leaf with a compare-and-set, so concurrent readers see a whole record and keep whichever decoding finished first, and its estimated size is charged to the leaf's cache slot. A charge evicts other entries until the shard is back within its budget, and a charge for a slot that was evicted in the meantime is dropped. The length prefix costs about one byte per record; \cref{sec:eval-ablation} measures what it buys. diff --git a/paper/sections/model.tex b/paper/sections/model.tex new file mode 100644 index 0000000..a956909 --- /dev/null +++ b/paper/sections/model.tex @@ -0,0 +1,16 @@ +\section{Data model} +\label{sec:model} + +\paragraph{Atoms.} Everything HStore stores is an \emph{atom} with a 64-bit identifier, handed out in increasing order. An atom is a \emph{node} or a \emph{hyperedge}. Both have a type, both can have properties, and a node can also have a canonical key that is unique within its type, such as \code{Person:'alice'}. + +\paragraph{Hyperedges and incidences.} A hyperedge has any number of members. Each membership is an \emph{incidence} +\[ +(\mathit{member}, \mathit{roles}, \mathit{weight}, [\mathit{from}, \mathit{to}), \mathit{data}, \mathit{qualifier}), +\] +where $\mathit{member}$ is any atom, including another hyperedge; $\mathit{roles}$ is a set of role names (a member can be both buyer and approver); $\mathit{weight}$ is an exact fixed-point number with nine decimal places; $[\mathit{from}, \mathit{to})$ is the interval in which the membership holds; $\mathit{data}$ points to a payload and $\mathit{qualifier}$ to an atom that records evidence for it. All fields except the member have defaults. A \emph{set} hyperedge holds each atom at most once and has no order. An \emph{ordered} hyperedge is a sequence that can be edited at any position, and the same atom can appear in it only once. + +\paragraph{Generations, history and branches.} Every commit produces a new \emph{generation}, numbered consecutively. A reader opens a snapshot of a generation and sees it unchanged for as long as it keeps it open. The engine keeps a configurable number of recent generations (64 by default) for time travel, which can be addressed by number or by wall-clock time. A \emph{branch} is a named line of generations forked from another branch. Creating one copies nothing, and the database layer merges branches with a three-way merge against the fork point. + +\paragraph{Operations.} Writes create and delete atoms, change their records, and change memberships: add, update or remove a member by atom, insert, update or remove at a position in an ordered hyperedge, and replace a whole membership in one bulk load. Deleting an atom removes it from every hyperedge that contains it. Reads look up an atom, test and fetch a member, return a hyperedge's cardinality and the member at a given rank, scan members filtered by role, weight or validity time, list the hyperedges incident to an atom, intersect incidence sets (``hyperedges that contain all of $a_1,\dots,a_k$''), and compute differences between two hyperedges, two generations or two branches. + +\paragraph{Layers.} The storage engine knows only atoms, memberships and a set of keyed trees. Types, property values, tenants and users, the HQL query language, an embedding index and the higher-order operators are added by a database layer that stores its own data in additional trees inside the same generations (\cref{sec:implementation}). The rest of this paper is about the engine. diff --git a/paper/sections/overview.tex b/paper/sections/overview.tex new file mode 100644 index 0000000..06dae0e --- /dev/null +++ b/paper/sections/overview.tex @@ -0,0 +1,15 @@ +\section{Overview} +\label{sec:overview} + +\begin{figure*}[t] +\centering +\includegraphics[width=\textwidth]{figures/overview} +\caption{Engine overview. A commit appends the keys it changed to the write-ahead log and publishes a new root vector whose changed nodes (yellow) are still in memory, on top of stored pages (blue). Readers pin a generation and read it without locks. A background checkpoint writes the changed nodes, syncs them, publishes a catalog image and truncates the log.} +\label{fig:overview} +\end{figure*} + +\Cref{fig:overview} shows the main parts of the engine. The state of the database at one point in time is a \emph{generation}: a small immutable object that holds, for each branch, a \emph{root vector} that maps a slot number to the root of a tree. The engine defines seven slots: the \emph{catalog} of atoms, the reverse incidence index, an index from type to atoms, an index of canonical keys, two symbol tables for role names, and a table of request ids that makes retried commits idempotent. The database layer adds its own slots for schemas, properties, property indexes and the like. Slots are either primary, written by transactions, or derived, maintained from the primary slots inside the same transaction by \emph{derivations}. The reverse incidence index is derived from the catalog. + +All trees are copy-on-write. A transaction works on a private copy of the root vector, and its writes copy the paths they change. A commit publishes a new generation that shares every unchanged subtree with its predecessor. Readers pin a generation and never take a lock. Writers serialise only on a short section of the commit that assigns the generation number and appends to the log, and commits that reach the log while an earlier batch is being synced share one fsync. + +The tree nodes a commit creates are not written at commit time. The commit logs the keys it changed and publishes nodes that are still in memory; a background checkpoint later writes them to pages. Pages are packed into append-only segment files and found through a page directory, so that compaction can move them without changing any tree. The rest of the paper follows this structure: trees and the on-disk layout (\cref{sec:layout}), commits, checkpoints and recovery (\cref{sec:transactions}), and reclaiming space (\cref{sec:space}). diff --git a/paper/sections/related.tex b/paper/sections/related.tex new file mode 100644 index 0000000..28366bd --- /dev/null +++ b/paper/sections/related.tex @@ -0,0 +1,12 @@ +\section{Related work} +\label{sec:related} + +\paragraph{Hypergraph and n-ary data stores.} HyperGraphDB~\cite{hgdb} is the closest system and our baseline. Its atoms are identified by UUID handles, a link is an ordered array of target handles, and an index maps every atom to its incidence set; storage is delegated to Berkeley DB Java Edition. A link is immutable, so changing a membership replaces the link, and the incidence index has to be updated for every member. OpenCog's AtomSpace~\cite{opencog} stores typed atoms and links in memory for reasoning workloads. TypeDB~\cite{typeql} gives $n$-ary relations and their role players a type system and a query language, and stores them in a key-value engine. Property-graph databases and RDF stores represent $n$-ary relations by reification~\cite{angles}, and Wikidata attaches qualifiers to statements for the same purpose~\cite{wikidata}. HStore differs from all of them in that a hyperedge's membership is a storage structure of its own, versioned, counted and summarised like every other tree in the engine. + +\paragraph{Hypergraph processing.} Hygra~\cite{hygra}, MESH~\cite{mesh} and HyperX~\cite{hyperx} run analytics over hypergraphs held in memory, on one machine or a cluster. They assume a static input and optimise traversal and message passing. HStore is a storage engine for data that changes, and the analytic operators in its database layer read from its snapshots. + +\paragraph{Copy-on-write and shadow paging.} Shadow paging goes back to Lorie~\cite{lorie}. Rodeh showed how to make B-trees copy-on-write with reference counts so that snapshots and clones are cheap~\cite{rodeh-shadowing}, and Btrfs builds a file system on that design~\cite{btrfs}. LMDB~\cite{lmdb} uses a copy-on-write B+tree with a single writer and readers that pin a root, much like HStore's generations. These systems write the changed path at every commit. HStore defers those writes to checkpoints and logs keys instead, which is closer to how a log-structured store absorbs small writes, while keeping the property that a published version never changes. Making data structures persistent in the functional sense~\cite{persistent} and the owner tokens that let one transaction change its own fresh nodes in place follow the same idea at the level of single objects. + +\paragraph{Logging, recovery and log-structured storage.} ARIES~\cite{aries} logs page-level changes and redoes them in place. HStore never changes a page in place, so it logs logical key changes and replays them onto the last checkpoint's trees, and its only physical log records are page references for the rare commits that write pages. The rule that recovery stops at the first commit whose pages are missing addresses the reordering of writes by the file system that crash-consistency studies have catalogued~\cite{pillai,torturing}. Log-structured file systems~\cite{lfs} and LSM-trees~\cite{lsm} append all writes and reclaim space by cleaning or merging; Berkeley DB Java Edition, under HyperGraphDB, is a log-structured B+tree whose cleaner copies live records forward. HStore's compaction also copies live data forward, but because trees refer to pages by number through a directory, it copies pages without rewriting their parents. The Bw-tree~\cite{bwtree} uses a mapping table from logical page ids to physical addresses for a related reason, to install delta updates and relocate pages without changing references. LeanStore~\cite{leanstore} replaces the buffer pool's hash table with pointer swizzling; HStore's node cache stays a separate, budgeted table because its nodes are immutable and shared by every reader. + +\paragraph{Order maintenance and set algebra.} Ordered hyperedges use the order-maintenance labelling of Dietz and Sleator and its later simplifications~\cite{dietz-sleator,bender-order}, as ORDPATH labels do for XML~\cite{ordpath}. Intersections use a leapfrog join~\cite{leapfrog}. Additive multiset hashes~\cite{multiset-hash} and polynomial fingerprints~\cite{karp-rabin} give each tree a content fingerprint that is independent of its shape. diff --git a/paper/sections/space.tex b/paper/sections/space.tex new file mode 100644 index 0000000..6fa2b75 --- /dev/null +++ b/paper/sections/space.tex @@ -0,0 +1,27 @@ +\section{Reclaiming space} +\label{sec:space} + +Copy-on-write never overwrites a page, so every checkpoint leaves behind the images it replaced. They stay reachable while a retained generation refers to them and become garbage afterwards. Segments are append-only, so garbage is never reused piece by piece: HStore copies the live images out of mostly dead segments and deletes the files. This needs two things, knowing which images are live and moving them without touching the trees that point at them. + +\subsection{Reference counts between checkpoints} + +Every page number has a reference count in a memory-mapped file laid out like the directory. The count is the number of places that point at the page in the last checkpointed generation: a slot root, a child reference in a branch, or a nested tree's root inside a record. Inline trees have no page and are never counted. A negative entry marks a page that died in generation $d$ and is waiting until no reader can see a generation older than $d$. + +Counts change only at checkpoints, and only between two generations whose trees are fully written: the one the previous checkpoint wrote and the one the current checkpoint just wrote. Generations published in between are never counted. Their new nodes have no pages, and every page they reach was counted by the previous checkpoint or is \emph{provisional} (spilled by a bulk load or written by a large commit, and resolved by the checkpoint that covers it). For each branch whose roots changed, the counter first adds one to every new root, recursing into a page only when its count rises from zero, and then subtracts one from every old root, recursing only when a count reaches zero. When a node is replaced, its children are added by the new copy and subtracted by the old one, so they cancel and are never touched. The work is proportional to the pages that changed between the two checkpoints, not to the number of commits or the size of the trees. Most of the nodes it reads are in the node cache because the checkpoint has just written them. A header flag records whether a leaf refers to any page, so leaves that hold only plain records or inline trees, such as most catalog leaves, are never decoded. + +A page that died in generation $d$ is released at a checkpoint once $d$ is no newer than the oldest generation anyone can still read, the older of the oldest retained and the oldest pinned generation. Releasing clears its directory entry and subtracts its bytes from its segment's live total. The changed counts and the cleared entries are journaled with absolute values before the catalog image is published and applied afterwards, so a crash leaves the files as of one checkpoint or the next, never a mix, and applying a journal twice is harmless. + +\begin{figure}[t] +\centering +\includegraphics[width=\columnwidth]{figures/compaction} +\caption{Compaction copies the live images of a mostly dead segment to the active segment and changes their directory entries. Every tree, in every generation and branch, still refers to the same page numbers.} +\label{fig:compaction} +\end{figure} + +\subsection{Compaction by moving} + +A sealed segment whose live bytes fall below a threshold (half of the bytes written to it, by default) is a compaction victim. Compaction reads through the victim one 64-byte unit at a time (\cref{fig:compaction}). Where a header starts and the directory entry for that header's page number points at exactly this place, the image is live: it is verified and its bytes are appended to the active segment. Anything else, such as a released image or an older copy of a moved one, is skipped. The header holds the page number, not the address, so neither the header nor the checksum changes. After every 4\,MiB of copies the segments are forced, and only then are the directory entries pointed at the copies, so an entry never reaches the disk ahead of the bytes it points to. The victim is then retired, and its file is deleted after the next checkpoint has made the new entries durable and once no pinned reader started before the move. + +Nothing in this takes the commit lock or commits anything. Commits continue while pages move, cached nodes stay valid because they are keyed by page number, and old generations reach the moved pages through the same directory, so compaction never shortens the time-travel window. Moves are not logged. If the engine crashes before the checkpoint that follows a compaction, recovery restores the directory entries of the replayed commits to their original addresses, which are still intact because victims are deleted only after that checkpoint. The copies become unreferenced space that a later pass reclaims. The work is proportional to the size of the victims, and the only memory it needs is the list of pages moved in the current 4\,MiB. + +A background pass compacts the emptiest victim every 500\,ms if one exists; an explicit request compacts all of them. A new segment gets 8\,MiB, doubled as long as it stays within an eighth of the bytes in the other segments, up to 256\,MiB. A small database therefore has several sealed segments for compaction to choose from, and a large one has few files. The engine keeps at most 256 segment files open and closes the least recently used one, after forcing it if it has unsynced writes, so the number of open files does not grow with the database. diff --git a/paper/sections/transactions.tex b/paper/sections/transactions.tex new file mode 100644 index 0000000..1efa9cb --- /dev/null +++ b/paper/sections/transactions.tex @@ -0,0 +1,50 @@ +\section{Transactions and durability} +\label{sec:transactions} + +\subsection{Snapshots and isolation} + +The transaction manager keeps two generations: \emph{head}, the newest generation appended to the log, and \emph{current}, the newest one that is durable and published. New readers and transactions pin \emph{current}, so no one sees a commit that a crash could still lose. Pins are reference counts per generation. Old generations are trimmed to the history limit, except that a pinned generation is skipped rather than treated as a barrier, so one long-running reader keeps only its own generation alive. Reading an old generation costs the same as reading the newest one: copy-on-write never changes a page that a retained generation can reach, so time travel needs no undo log. + +Transactions run under snapshot isolation by default~\cite{critique}. Under the serializable level, a transaction records the value of every key and atom it reads as of its base generation, and a commit that has to rebase (below) checks that none of them changed. This rejects write skew, at key granularity and only when a slot the transaction read has moved. + +\subsection{Commit} + +A transaction keeps an \emph{operation log}: every operation it applied, stored as an intent such as ``insert member $m$ into hyperedge $e$'' or ``update key $k$ of slot $s$ if its value is still $v$''. The operations are also applied immediately to the transaction's private copy of the trees, and the derivations update the derived slots in the same copy. + +At commit, the transaction takes the commit lock and compares its base root vector with \emph{head}. If no slot it changed has moved, it takes the fast path: the new root vector is \emph{head}'s with the transaction's changed slots laid over it. Commits that write different slots therefore never wait for each other, however many commits land in between. Otherwise the commit replays its operation log against \emph{head}. Replay fails with a retryable conflict when a precondition no longer holds, with one exception that matters for hypergraphs. When the only change to a set hyperedge was other transactions adding or removing members, and every action of this transaction on it named a member, the commit diffs the hyperedge's old and new membership trees and conflicts only if a changed member is one it touched. Two transactions that add different members to the same hyperedge therefore both commit. Positional actions on ordered hyperedges and bulk loads conflict whenever the hyperedge moved. A commit can carry a request id. It is recorded in a slot under the commit lock, so a retried commit returns the original generation instead of applying twice. + +\subsection{Logging keys instead of pages} + +A copy-on-write commit that writes its new pages writes every node from each changed leaf up to the root of each changed tree. For one updated property, that is a few leaves and branches in the property tree, its index and the catalog, many kilobytes for a few bytes of change. HStore commits instead log the keys they changed and publish a generation whose new nodes are still in memory. + +The write-ahead log is a sequence of segment files addressed by a log sequence number (LSN), the byte offset since the log was created. Every record is a frame with a 25-byte header that holds the payload length, a CRC-32C, the frame's own LSN, the record type and the transaction id. Because the checksum covers the LSN, stale bytes left in a reused file can never pass for a valid frame. A commit appends, under the commit lock, a \code{Begin} record, one \code{Changes} record, a \code{Feed} record with the commit's logical events for the change feed, and then, in a separate append, the \code{Commit} record with the generation number and the next free atom and transaction ids. The \code{Commit} frame is the commit point. + +The \code{Changes} payload lists, for each slot whose root changed, the keys that differ between the base tree and the new one, found with the diff of \cref{sec:tree}. A changed value that holds nested trees, such as a hyperedge record, is followed by the changes to each nested tree, so a commit that adds one member to a hyperedge logs that member, not the hyperedge. A tree that changed in more than 4,096 places, as after a large bulk load, is written to pages at commit and logged by reference instead. Each such page gets a 47-byte \code{PageRef} record with its page number, address, length and CRC-32C, and the data files are forced before the log whenever a commit group contains such pages. Large bulk loads also \emph{spill} finished subtrees to pages while they run, so that a hyperedge with millions of members never has to fit in memory. + +Commits do not wait for the disk under the commit lock. The lock is released after the \code{Commit} frame is appended, and the committing thread then waits on a group committer. The group committer has no thread of its own: the first waiting committer becomes the leader, takes every queued commit as one batch, syncs once, publishes the batch in generation order and wakes the others. Under synchronous durability the batch forces the data files if any of its commits wrote pages and then the log; under asynchronous durability nothing is forced, but publication order is the same. Commits that arrive while a batch is syncing form the next batch, so the batch size grows with the number of concurrent writers. + +\subsection{Checkpoints} + +A checkpoint writes the trees of one published generation $g$ to pages and makes it the starting point of the next recovery. It walks the roots of $g$ and writes every node that is still only in memory, children before parents. Each written node is stamped with its stored reference and the checkpoint's \emph{epoch}; when the epoch is published, the next checkpoint reuses these pages and does not visit the subtrees below them. A node that many commits changed between two checkpoints is written once. The checkpoint then forces the data files and the page directory, updates the page reference counts (\cref{sec:space}), journals them, and publishes a catalog image that records $g$'s roots, the segment table and the checkpoint LSN, the end of $g$'s \code{Commit} frame. The image is written to a temporary file, forced, renamed and the directory forced. Last, the log is truncated before the checkpoint LSN. + +Commits continue during all of this. The log is forced outside the lock that appends to it, so a commit appending its records never waits for the checkpoint's sync. By the time the checkpoint publishes, \emph{head} may be several generations past $g$ and still refer to the in-memory nodes that the checkpoint wrote. The checkpoint swaps every node it wrote in \emph{head} for its stored reference, copying only the parents whose children changed. It does this in two passes. The first runs without any lock and remembers its result for every node it visits. The second runs under the commit lock over the newest \emph{head}, reuses those results and only walks what commits added in between, so the commit lock is held for the part of the tree that changed during the first pass. A transaction that started before the checkpoint still compares equal: an in-memory node stamped by a published epoch is treated as the same tree as the reference it was written as, so a finished checkpoint never pushes a transaction off the fast path. + +The heap held by unwritten nodes is capped (64\,MiB by default), and a checkpoint starts when half of the cap is used. It also starts when the log or the pages written since the last checkpoint pass a threshold, or when more than a million reference counts have changed. By default the threshold is a quarter of the live bytes in the data segments, but at least 2\,MiB and at most 256\,MiB, so that the log a crash leaves to replay stays small relative to the store while a large store does not checkpoint more often than a fixed 256\,MiB would. A database can fix the threshold with the statement \code{CHECKPOINT AT 64MB}, which is stored in the database, and \code{CHECKPOINT AT AUTO} returns to the default. A background thread checks these conditions every 500\,ms, and a commit that pushes the log past the threshold wakes it at once. A commit that finds the cap reached waits for a checkpoint to make room. + +\begin{figure*}[t] +\centering +\includegraphics[width=\textwidth]{figures/wal} +\caption{Recovery reads the log from the checkpoint LSN recorded in the newest catalog image. It replays every commit whose \code{Commit} frame is valid, stops at the first commit whose referenced pages do not verify, and drops the records of transactions that never committed.} +\label{fig:wal} +\end{figure*} + +\subsection{Recovery} +\label{sec:recovery} + +Opening a database (\cref{fig:wal}) loads the newest valid catalog image, cuts the log's last segment at the end of its last valid frame, and reads the log from the image's checkpoint LSN. Records are grouped by transaction id. For each \code{Commit} frame in log order whose generation is newer than the image, recovery first restores the directory entries of the pages the commit references, then checks that every page referenced by a \code{PageRef} reads back with a valid header and the logged checksum, and then applies the commit's \code{Changes} to the trees of the previous generation. The replayed generations live in memory, exactly as they did before the crash, and the checkpoint that ends every open writes them. + +Two rules make the recovered state a prefix of the commit order. First, a commit is part of the recovered state only if its \code{Commit} frame is in the log; records of transactions that never committed are dropped. Second, if one commit's pages fail verification, it and every later commit are dropped. The second rule matters after a power failure: the operating system may write the log to disk before the data pages it refers to, and a later commit's key changes apply to the trees of the commit before it, so replaying it on top of a lost commit would produce a state that never existed. Only commits that wrote pages can hit this rule, and none of them had been acknowledged, because acknowledgement comes after both syncs. + +Recovery also guards against reusing what the log still holds. Transaction ids are persisted only in \code{Commit} records, so the id of a transaction that died during its commit would otherwise be handed out again while its records were still in the log, and a second crash would let recovery group the dead records with the new transaction's. Recovery therefore sets the next transaction id above every id it saw in the log, and the checkpoint at the end of the open starts from the end of the log rather than from the old checkpoint LSN, so those records are never read again. + +Recovery writes nothing to the log, and the only state it leaves behind is published by the checkpoint at the end of the open, so a crash during recovery repeats the same work on the next open. History is not part of the catalog image. After a restart, time travel reaches the checkpointed generation and the generations replayed after it, and older states are available only through the change feed. From 9a1382fe0bbe23b0cfe125e7d7d1d1d73bf50569 Mon Sep 17 00:00:00 2001 From: venkat1701 Date: Wed, 14 Oct 2026 21:38:37 +0530 Subject: [PATCH 2/7] docs(paper): add the benchmark results the evaluation is built from Comparison runs of HStore at 2eb85c6 and HyperGraphDB 1.4 on one Azure Standard_D8ds_v5 machine: scale 1 with asynchronous and with synchronous commits (5 runs per system each) and scale 4 with asynchronous commits (3 runs per system), plus before and after runs of HStore for logged keys, inline member trees and records decoded on demand (3 runs each). environment.txt records the machine, disks and JVM. Every run exited cleanly and every query checksum matched between the two systems. --- paper/ablation/inline/after-1.json | 1 + paper/ablation/inline/after-2.json | 1 + paper/ablation/inline/after-3.json | 1 + paper/ablation/inline/before-1.json | 1 + paper/ablation/inline/before-2.json | 1 + paper/ablation/inline/before-3.json | 1 + paper/ablation/lazy/after-1.json | 1 + paper/ablation/lazy/after-2.json | 1 + paper/ablation/lazy/after-3.json | 1 + paper/ablation/lazy/before-1.json | 1 + paper/ablation/lazy/before-2.json | 1 + paper/ablation/lazy/before-3.json | 1 + paper/ablation/logical/after-1.json | 1 + paper/ablation/logical/after-2.json | 1 + paper/ablation/logical/after-3.json | 1 + paper/ablation/logical/before-1.json | 1 + paper/ablation/logical/before-2.json | 1 + paper/ablation/logical/before-3.json | 1 + paper/results/environment.txt | 73 ++++++++++++++++++++++ paper/results/s1-async/hstore-1.json | 1 + paper/results/s1-async/hstore-2.json | 1 + paper/results/s1-async/hstore-3.json | 1 + paper/results/s1-async/hstore-4.json | 1 + paper/results/s1-async/hstore-5.json | 1 + paper/results/s1-async/hypergraphdb-1.json | 1 + paper/results/s1-async/hypergraphdb-2.json | 1 + paper/results/s1-async/hypergraphdb-3.json | 1 + paper/results/s1-async/hypergraphdb-4.json | 1 + paper/results/s1-async/hypergraphdb-5.json | 1 + paper/results/s1-sync/hstore-1.json | 1 + paper/results/s1-sync/hstore-2.json | 1 + paper/results/s1-sync/hstore-3.json | 1 + paper/results/s1-sync/hstore-4.json | 1 + paper/results/s1-sync/hstore-5.json | 1 + paper/results/s1-sync/hypergraphdb-1.json | 1 + paper/results/s1-sync/hypergraphdb-2.json | 1 + paper/results/s1-sync/hypergraphdb-3.json | 1 + paper/results/s1-sync/hypergraphdb-4.json | 1 + paper/results/s1-sync/hypergraphdb-5.json | 1 + paper/results/s4-async/hstore-1.json | 1 + paper/results/s4-async/hstore-2.json | 1 + paper/results/s4-async/hstore-3.json | 1 + paper/results/s4-async/hypergraphdb-1.json | 1 + paper/results/s4-async/hypergraphdb-2.json | 1 + paper/results/s4-async/hypergraphdb-3.json | 1 + 45 files changed, 117 insertions(+) create mode 100644 paper/ablation/inline/after-1.json create mode 100644 paper/ablation/inline/after-2.json create mode 100644 paper/ablation/inline/after-3.json create mode 100644 paper/ablation/inline/before-1.json create mode 100644 paper/ablation/inline/before-2.json create mode 100644 paper/ablation/inline/before-3.json create mode 100644 paper/ablation/lazy/after-1.json create mode 100644 paper/ablation/lazy/after-2.json create mode 100644 paper/ablation/lazy/after-3.json create mode 100644 paper/ablation/lazy/before-1.json create mode 100644 paper/ablation/lazy/before-2.json create mode 100644 paper/ablation/lazy/before-3.json create mode 100644 paper/ablation/logical/after-1.json create mode 100644 paper/ablation/logical/after-2.json create mode 100644 paper/ablation/logical/after-3.json create mode 100644 paper/ablation/logical/before-1.json create mode 100644 paper/ablation/logical/before-2.json create mode 100644 paper/ablation/logical/before-3.json create mode 100644 paper/results/environment.txt create mode 100644 paper/results/s1-async/hstore-1.json create mode 100644 paper/results/s1-async/hstore-2.json create mode 100644 paper/results/s1-async/hstore-3.json create mode 100644 paper/results/s1-async/hstore-4.json create mode 100644 paper/results/s1-async/hstore-5.json create mode 100644 paper/results/s1-async/hypergraphdb-1.json create mode 100644 paper/results/s1-async/hypergraphdb-2.json create mode 100644 paper/results/s1-async/hypergraphdb-3.json create mode 100644 paper/results/s1-async/hypergraphdb-4.json create mode 100644 paper/results/s1-async/hypergraphdb-5.json create mode 100644 paper/results/s1-sync/hstore-1.json create mode 100644 paper/results/s1-sync/hstore-2.json create mode 100644 paper/results/s1-sync/hstore-3.json create mode 100644 paper/results/s1-sync/hstore-4.json create mode 100644 paper/results/s1-sync/hstore-5.json create mode 100644 paper/results/s1-sync/hypergraphdb-1.json create mode 100644 paper/results/s1-sync/hypergraphdb-2.json create mode 100644 paper/results/s1-sync/hypergraphdb-3.json create mode 100644 paper/results/s1-sync/hypergraphdb-4.json create mode 100644 paper/results/s1-sync/hypergraphdb-5.json create mode 100644 paper/results/s4-async/hstore-1.json create mode 100644 paper/results/s4-async/hstore-2.json create mode 100644 paper/results/s4-async/hstore-3.json create mode 100644 paper/results/s4-async/hypergraphdb-1.json create mode 100644 paper/results/s4-async/hypergraphdb-2.json create mode 100644 paper/results/s4-async/hypergraphdb-3.json diff --git a/paper/ablation/inline/after-1.json b/paper/ablation/inline/after-1.json new file mode 100644 index 0000000..18989bb --- /dev/null +++ b/paper/ablation/inline/after-1.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4253024256,"retainedHeap":40979504,"bytesWritten":570618646,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1755.110868,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":940987536,"bytesWritten":35473787,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":4215.146226,"checksum":362757,"gcCount":4,"gcMillis":52,"allocated":3512306136,"bytesWritten":134020427,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":130.714302,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":119416096,"bytesRead":65136,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":115.499216,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":49267472,"bytesRead":0,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":126.393832,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":84017760,"bytesRead":5306,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":115.588315,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":57985744,"bytesRead":0,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":243.516243,"checksum":5852224,"gcCount":1,"gcMillis":4,"allocated":942838336},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":168.043596,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":153253200,"latency":{"p50":1.565,"p99":3.373,"p99.9":10.236,"max":92.129}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":642.303887,"checksum":20000,"gcCount":1,"gcMillis":26,"allocated":645011824,"bytesWritten":37892497,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":992.402925,"checksum":5000,"gcCount":0,"gcMillis":0,"allocated":803532736,"latency":{"p50":193.149,"p99":355.741,"p99.9":540.115,"max":952.082},"bytesWritten":76525043,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":40883537,"millis":10000.147568,"checksum":0,"gcCount":43,"gcMillis":174,"allocated":54886135464,"latency":{"p50":1.283,"p99":5.279,"p99.9":17.107,"max":35271.845},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.147568,"checksum":0,"latency":{"p50":1738.693,"p99":11962.598,"p99.9":30770.037,"max":30770.037},"checked":false,"bytesWritten":100942027,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":97.280966,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":102865744,"bytesWritten":3317126,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after 40 warm-up passes)","operations":20000000,"millis":14.009687,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":154680,"bytesRead":845651,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":38.863486,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":23226192,"bytesRead":1380726,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":133.697346,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":42541408},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":110.544576,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":150048320,"bytesRead":2650766,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":152475107,"millis":1000.0,"checksum":152475107},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1471.230148,"checksum":20000,"gcCount":1,"gcMillis":24,"allocated":1401969200,"bytesWritten":83840998,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":1014.594324,"checksum":20000,"gcCount":1,"gcMillis":15,"allocated":789726328,"bytesWritten":72094251,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":91.821734,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":108250768,"bytesRead":108099,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":310932922,"millis":1000.0,"checksum":310932922},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.590712,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":103314832,"latency":{"p50":536.989,"p99":820.735,"p99.9":2003.566,"max":2003.566},"checked":false,"bytesWritten":7675093,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.381107,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":100104568,"latency":{"p50":524.527,"p99":787.108,"p99.9":859.192,"max":859.192},"checked":false,"bytesWritten":18835724,"logicalWritten":16000,"compactionMillis":12,"reclaimed":249416567},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":69295743,"millis":1000.0,"checksum":69295743},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":37.160074,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":80333912,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/ablation/inline/after-2.json b/paper/ablation/inline/after-2.json new file mode 100644 index 0000000..5c06d13 --- /dev/null +++ b/paper/ablation/inline/after-2.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4253024256,"retainedHeap":40995768,"bytesWritten":570618646,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1738.606208,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":936881472,"bytesWritten":35473787,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":4205.150408,"checksum":362757,"gcCount":4,"gcMillis":51,"allocated":3922521840,"bytesWritten":134020427,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":152.081251,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":120627816,"bytesRead":43331,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":108.12274,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":49160048,"bytesRead":0,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":132.41496,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":87061072,"bytesRead":3293,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":101.879083,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":55919504,"bytesRead":0,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":313.157323,"checksum":5852224,"gcCount":1,"gcMillis":4,"allocated":943591304},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":173.015909,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":155225552,"latency":{"p50":1.58,"p99":3.514,"p99.9":11.849,"max":108.832}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":642.663147,"checksum":20000,"gcCount":1,"gcMillis":26,"allocated":627795312,"bytesWritten":37892497,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":978.198146,"checksum":5000,"gcCount":0,"gcMillis":0,"allocated":832020488,"latency":{"p50":193.117,"p99":335.017,"p99.9":542.721,"max":1031.388},"bytesWritten":76525043,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":41342117,"millis":10000.184464,"checksum":0,"gcCount":43,"gcMillis":173,"allocated":55413540360,"latency":{"p50":1.241,"p99":5.412,"p99.9":19.506,"max":33695.675},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.184464,"checksum":0,"latency":{"p50":1875.52,"p99":12225.174,"p99.9":26847.775,"max":26847.775},"checked":false,"bytesWritten":100942027,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":108.566716,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":164119736,"bytesWritten":3317126,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after 40 warm-up passes)","operations":20000000,"millis":24.071272,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":154736,"bytesRead":1845883,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":38.178464,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":22532208,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":137.35848,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":40804344},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":110.318477,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":151646232,"bytesRead":2650766,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":152475107,"millis":1000.0,"checksum":152475107},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1531.933627,"checksum":20000,"gcCount":1,"gcMillis":24,"allocated":1474806360,"bytesWritten":83840998,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":1040.222716,"checksum":20000,"gcCount":1,"gcMillis":20,"allocated":773464992,"bytesWritten":72094251,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":79.999977,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":109794360,"bytesRead":102912,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":310932922,"millis":1000.0,"checksum":310932922},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.568862,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":106850240,"latency":{"p50":581.726,"p99":867.64,"p99.9":2038.48,"max":2038.48},"checked":false,"bytesWritten":7675093,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.535895,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":102801304,"latency":{"p50":550.433,"p99":801.565,"p99.9":2532.969,"max":2532.969},"checked":false,"bytesWritten":18835724,"logicalWritten":16000,"compactionMillis":11,"reclaimed":249416567},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":69295743,"millis":1000.0,"checksum":69295743},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":39.059691,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":79959200,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/ablation/inline/after-3.json b/paper/ablation/inline/after-3.json new file mode 100644 index 0000000..64fb618 --- /dev/null +++ b/paper/ablation/inline/after-3.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4182245376,"retainedHeap":40208560,"bytesWritten":570618646,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1733.02959,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":912856936,"bytesWritten":35473787,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":3961.339962,"checksum":362757,"gcCount":4,"gcMillis":53,"allocated":3557614224,"bytesWritten":134020427,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":148.655911,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":120212224,"bytesRead":70920,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":100.094661,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":49394552,"bytesRead":1324,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":131.23793,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":87526784,"bytesRead":3557,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":120.713857,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":63685800,"bytesRead":0,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":235.914057,"checksum":5852224,"gcCount":1,"gcMillis":4,"allocated":943587784},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":186.144876,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":155836264,"latency":{"p50":1.752,"p99":3.561,"p99.9":11.069,"max":105.625}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":632.80538,"checksum":20000,"gcCount":1,"gcMillis":28,"allocated":641496992,"bytesWritten":37892497,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":1022.531259,"checksum":5000,"gcCount":0,"gcMillis":0,"allocated":810461144,"latency":{"p50":199.893,"p99":365.531,"p99.9":538.221,"max":1013.681},"bytesWritten":76525043,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":37891160,"millis":10000.153456,"checksum":0,"gcCount":40,"gcMillis":168,"allocated":50967119768,"latency":{"p50":1.331,"p99":5.584,"p99.9":14.916,"max":29813.707},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.153456,"checksum":0,"latency":{"p50":1978.51,"p99":11396.481,"p99.9":22600.543,"max":22600.543},"checked":false,"bytesWritten":100942027,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":103.095928,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":104431776,"bytesWritten":3317126,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after 40 warm-up passes)","operations":20000000,"millis":14.876626,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":154736,"bytesRead":900458,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":33.749803,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":23225280,"bytesRead":1046547,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":134.932492,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":38233896},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":105.138471,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":152461656,"bytesRead":2650766,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":152475092,"millis":1000.0,"checksum":152475092},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1522.685701,"checksum":20000,"gcCount":1,"gcMillis":26,"allocated":1644724760,"bytesWritten":83840998,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":1017.596519,"checksum":20000,"gcCount":1,"gcMillis":20,"allocated":673232200,"bytesWritten":72094251,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":83.092566,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":110246304,"bytesRead":67586,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":310932903,"millis":1000.0,"checksum":310932903},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.57891,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":103573832,"latency":{"p50":544.625,"p99":779.762,"p99.9":2719.614,"max":2719.614},"checked":false,"bytesWritten":7675093,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.432443,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":99801576,"latency":{"p50":507.497,"p99":819.584,"p99.9":906.446,"max":906.446},"checked":false,"bytesWritten":18835724,"logicalWritten":16000,"compactionMillis":13,"reclaimed":249416567},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":69295743,"millis":1000.0,"checksum":69295743},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":38.194292,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":79124008,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/ablation/inline/before-1.json b/paper/ablation/inline/before-1.json new file mode 100644 index 0000000..c31bae3 --- /dev/null +++ b/paper/ablation/inline/before-1.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4170186752,"retainedHeap":55762824,"bytesWritten":696785040,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1749.258877,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":914935568,"bytesWritten":35461449,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":4517.676329,"checksum":362757,"gcCount":6,"gcMillis":82,"allocated":5671322080,"bytesWritten":159951565,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":133.836269,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":119336088,"bytesRead":41977,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":175.961233,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":102646400,"bytesRead":7199092,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":124.759581,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":83894272,"bytesRead":37502,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":145.519841,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":89689896,"bytesRead":3443456,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":258.768289,"checksum":5852224,"gcCount":1,"gcMillis":10,"allocated":943436488},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":138.245766,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":152856776,"latency":{"p50":1.24,"p99":2.971,"p99.9":11.681,"max":82.644}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":666.326932,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":680798376,"bytesWritten":37887157,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":984.815797,"checksum":5000,"gcCount":1,"gcMillis":12,"allocated":838761736,"latency":{"p50":185.846,"p99":369.926,"p99.9":591.514,"max":12212.072},"bytesWritten":76025139,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":42502690,"millis":10000.191785,"checksum":0,"gcCount":43,"gcMillis":126,"allocated":57103668448,"latency":{"p50":1.244,"p99":6.43,"p99.9":18.045,"max":20023.417},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.191785,"checksum":0,"latency":{"p50":1740.048,"p99":9270.008,"p99.9":18120.009,"max":18120.009},"checked":false,"bytesWritten":118404924,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":104.296018,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":101048264,"bytesWritten":3320237,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after 40 warm-up passes)","operations":20000000,"millis":14.047961,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":154176,"bytesRead":4933341,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":39.770912,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":16827104,"bytesRead":1342148,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":242.048139,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":48862224},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":118.965534,"checksum":831528,"gcCount":1,"gcMillis":17,"allocated":152445728,"bytesRead":2650154,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":206777062,"millis":1000.0,"checksum":206777062},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1290.931273,"checksum":20000,"gcCount":1,"gcMillis":18,"allocated":1452784376,"bytesWritten":125069240,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":1041.100444,"checksum":20000,"gcCount":1,"gcMillis":17,"allocated":1128577176,"bytesWritten":115082238,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":73.138439,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":110259320,"bytesRead":68724,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":451227980,"millis":1000.0,"checksum":451227980},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.530026,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":105931736,"latency":{"p50":530.848,"p99":776.548,"p99.9":2112.275,"max":2112.275},"checked":false,"bytesWritten":7625937,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.577305,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":145444984,"latency":{"p50":584.086,"p99":835.424,"p99.9":987.272,"max":987.272},"checked":false,"bytesWritten":17955485,"logicalWritten":16000,"compactionMillis":10,"reclaimed":247508575},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":211451864,"millis":1000.0,"checksum":211451864},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":38.779006,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":79494920,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/ablation/inline/before-2.json b/paper/ablation/inline/before-2.json new file mode 100644 index 0000000..6a6fba8 --- /dev/null +++ b/paper/ablation/inline/before-2.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4187488256,"retainedHeap":56980680,"bytesWritten":696785177,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1766.520859,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":939846952,"bytesWritten":35461449,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":4422.286745,"checksum":362757,"gcCount":6,"gcMillis":84,"allocated":5602681080,"bytesWritten":159951565,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":154.124304,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":120604424,"bytesRead":33352,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":201.821369,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":105677016,"bytesRead":7208861,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":127.345724,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":84377384,"bytesRead":50305,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":146.491392,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":89947120,"bytesRead":3413539,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":311.631553,"checksum":5852224,"gcCount":1,"gcMillis":7,"allocated":943997496},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":160.606602,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":155442448,"latency":{"p50":1.466,"p99":3.345,"p99.9":11.245,"max":91.993}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":626.545232,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":662562064,"bytesWritten":37887157,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":991.208787,"checksum":5000,"gcCount":1,"gcMillis":9,"allocated":771860208,"latency":{"p50":190.47,"p99":347.31,"p99.9":539.193,"max":9909.393},"bytesWritten":76025139,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":40760124,"millis":10000.149214,"checksum":0,"gcCount":42,"gcMillis":123,"allocated":54732748872,"latency":{"p50":1.248,"p99":6.833,"p99.9":14.901,"max":19022.352},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.149214,"checksum":0,"latency":{"p50":1801.862,"p99":8474.348,"p99.9":20675.777,"max":20675.777},"checked":false,"bytesWritten":118404924,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":101.762157,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":101235216,"bytesWritten":3320237,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after 40 warm-up passes)","operations":20000000,"millis":33.031907,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":154904,"bytesRead":6210259,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":31.245988,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":10491464,"bytesRead":820795,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":227.950656,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":39949128},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":106.133083,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":151645872,"bytesRead":2650154,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":206777087,"millis":1000.0,"checksum":206777087},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1312.567778,"checksum":20000,"gcCount":1,"gcMillis":26,"allocated":1493250800,"bytesWritten":125069240,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":1037.603985,"checksum":20000,"gcCount":1,"gcMillis":17,"allocated":1152902688,"bytesWritten":115082238,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":80.087016,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":109479008,"bytesRead":70858,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":451227980,"millis":1000.0,"checksum":451227980},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.582492,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":106397544,"latency":{"p50":520.777,"p99":756.176,"p99.9":2069.776,"max":2069.776},"checked":false,"bytesWritten":7625937,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.615983,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":137280048,"latency":{"p50":532.971,"p99":802.802,"p99.9":4051.345,"max":4051.345},"checked":false,"bytesWritten":17955622,"logicalWritten":16000,"compactionMillis":11,"reclaimed":247508575},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":211451864,"millis":1000.0,"checksum":211451864},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":38.439512,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":78731072,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/ablation/inline/before-3.json b/paper/ablation/inline/before-3.json new file mode 100644 index 0000000..797e591 --- /dev/null +++ b/paper/ablation/inline/before-3.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4222615552,"retainedHeap":56153288,"bytesWritten":696700537,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1863.355659,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":936975392,"bytesWritten":35461449,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":4384.330982,"checksum":362757,"gcCount":6,"gcMillis":81,"allocated":5781391864,"bytesWritten":159951565,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":152.460085,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":120410088,"bytesRead":62622,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":162.968633,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":98065480,"bytesRead":7338765,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":111.702657,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":82873960,"bytesRead":41765,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":142.803031,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":87553008,"bytesRead":3385636,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":257.907022,"checksum":5852224,"gcCount":1,"gcMillis":8,"allocated":944096648},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":152.109899,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":155085552,"latency":{"p50":1.365,"p99":3.249,"p99.9":12.045,"max":85.85}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":620.975538,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":677791296,"bytesWritten":37887157,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":954.411853,"checksum":5000,"gcCount":1,"gcMillis":14,"allocated":820558088,"latency":{"p50":177.48,"p99":363.568,"p99.9":595.901,"max":14787.112},"bytesWritten":76025139,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":40843302,"millis":10000.198306,"checksum":0,"gcCount":42,"gcMillis":126,"allocated":54853438968,"latency":{"p50":1.269,"p99":5.779,"p99.9":14.557,"max":20116.111},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.198306,"checksum":0,"latency":{"p50":1769.937,"p99":7645.328,"p99.9":16563.111,"max":16563.111},"checked":false,"bytesWritten":118404924,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":107.847194,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":166708904,"bytesWritten":3320237,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after 40 warm-up passes)","operations":20000000,"millis":32.073471,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":154904,"bytesRead":6532234,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":34.160825,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":13710368,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":224.884533,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":41944064},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":109.26643,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":151646472,"bytesRead":2650154,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":206777062,"millis":1000.0,"checksum":206777062},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1329.599571,"checksum":20000,"gcCount":1,"gcMillis":28,"allocated":1811108608,"bytesWritten":125069240,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":992.713028,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":1191090864,"bytesWritten":115082238,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":90.070761,"checksum":645087,"gcCount":1,"gcMillis":8,"allocated":109345024,"bytesRead":56818,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":451227984,"millis":1000.0,"checksum":451227984},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.536995,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":103303440,"latency":{"p50":544.23,"p99":780.874,"p99.9":2187.085,"max":2187.085},"checked":false,"bytesWritten":7625937,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.645101,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":142533112,"latency":{"p50":564.284,"p99":802.737,"p99.9":4297.716,"max":4297.716},"checked":false,"bytesWritten":17870982,"logicalWritten":16000,"compactionMillis":11,"reclaimed":247601946},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":211358488,"millis":1000.0,"checksum":211358488},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":41.751691,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":79739088,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/ablation/lazy/after-1.json b/paper/ablation/lazy/after-1.json new file mode 100644 index 0000000..c446334 --- /dev/null +++ b/paper/ablation/lazy/after-1.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":4,"durability":"async","threads":8,"nodes":200000,"edges":400000,"incidences":1453427,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4118282240,"retainedHeap":447220640,"bytesWritten":2269756578,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":200000,"millis":5202.802205,"checksum":200000,"gcCount":5,"gcMillis":277,"allocated":5492700944,"bytesWritten":64468111,"logicalWritten":3688890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":400000,"millis":21983.20013,"checksum":1453427,"gcCount":41,"gcMillis":1331,"allocated":42012000264,"bytesWritten":428414647,"logicalWritten":14827416},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":39.02856,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":146272,"bytesRead":0,"logicalRead":5757544},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":57.36028,"checksum":361142,"gcCount":0,"gcMillis":0,"allocated":4029552,"bytesRead":0,"logicalRead":2889136},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":85.04537,"checksum":20109,"gcCount":0,"gcMillis":0,"allocated":84326736,"bytesRead":0,"logicalRead":160872},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":60.50042,"checksum":280131,"gcCount":0,"gcMillis":0,"allocated":13204088,"bytesRead":3267225,"logicalRead":2241048},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":125.579115,"checksum":5757544,"gcCount":0,"gcMillis":0,"allocated":141014448},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":71.613733,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":26901888,"latency":{"p50":0.649,"p99":1.202,"p99.9":1.948,"max":14.732}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":688.175894,"checksum":20000,"gcCount":1,"gcMillis":18,"allocated":1053624504,"bytesWritten":10155587,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":473.183651,"checksum":5000,"gcCount":1,"gcMillis":30,"allocated":765440888,"latency":{"p50":81.482,"p99":213.131,"p99.9":268.605,"max":30907.994},"bytesWritten":8872968,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":51116587,"millis":10000.162451,"checksum":0,"gcCount":5,"gcMillis":93,"allocated":5341388416,"latency":{"p50":0.922,"p99":5.624,"p99.9":10.651,"max":31020.72},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.162451,"checksum":0,"latency":{"p50":1170.042,"p99":7103.74,"p99.9":29318.98,"max":29318.98},"checked":false,"bytesWritten":56060789,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 200,000 members","operations":200000,"millis":571.162275,"checksum":200000,"gcCount":1,"gcMillis":36,"allocated":827243496,"bytesWritten":14573475,"logicalWritten":1600008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":80000000,"millis":48.937233,"checksum":80000000,"gcCount":0,"gcMillis":0,"allocated":176520,"bytesRead":0,"logicalRead":640000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":18.905706,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":18808,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":89.727059,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":64730872},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":98.299139,"checksum":819693,"gcCount":1,"gcMillis":16,"allocated":59552104,"bytesRead":11309990,"logicalRead":6557544},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":172970040,"millis":1000.0,"checksum":172970040},{"workload":"churn.delete","description":"delete 80,000 hyperedges (20%) in transactions of 1,000","operations":80000,"millis":31703.906408,"checksum":80000,"gcCount":33,"gcMillis":397,"allocated":35668363840,"bytesWritten":1347845899,"logicalWritten":2970424},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":4603.593922,"checksum":20000,"gcCount":3,"gcMillis":83,"allocated":3951350592,"bytesWritten":297788367,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":37.491722,"checksum":665234,"gcCount":0,"gcMillis":0,"allocated":142120,"bytesRead":0,"logicalRead":5321872},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":1298591580,"millis":1000.0,"checksum":1298591580},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.518107,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":156327200,"latency":{"p50":484.828,"p99":845.699,"p99.9":2734.751,"max":2734.751},"checked":false,"bytesWritten":38346643,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.488135,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":138348448,"latency":{"p50":449.15,"p99":701.21,"p99.9":1356.89,"max":1356.89},"checked":false,"bytesWritten":3229400,"logicalWritten":16000,"compactionMillis":13,"reclaimed":-3302111},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":172446170,"millis":1000.0,"checksum":172446170},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":205.336907,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":204606472,"checked":false,"acknowledged":100000,"lost":0}]} \ No newline at end of file diff --git a/paper/ablation/lazy/after-2.json b/paper/ablation/lazy/after-2.json new file mode 100644 index 0000000..459fd8d --- /dev/null +++ b/paper/ablation/lazy/after-2.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":4,"durability":"async","threads":8,"nodes":200000,"edges":400000,"incidences":1453427,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4140826624,"retainedHeap":446083568,"bytesWritten":2283011658,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":200000,"millis":4855.024827,"checksum":200000,"gcCount":5,"gcMillis":249,"allocated":5360787416,"bytesWritten":65250318,"logicalWritten":3688890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":400000,"millis":22526.192347,"checksum":1453427,"gcCount":42,"gcMillis":1347,"allocated":42398788112,"bytesWritten":440748079,"logicalWritten":14827416},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":36.90838,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":146592,"bytesRead":0,"logicalRead":5757544},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":54.07152,"checksum":361142,"gcCount":0,"gcMillis":0,"allocated":4029696,"bytesRead":0,"logicalRead":2889136},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":73.203131,"checksum":20109,"gcCount":0,"gcMillis":0,"allocated":82510944,"bytesRead":0,"logicalRead":160872},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":68.708029,"checksum":280131,"gcCount":0,"gcMillis":0,"allocated":12917880,"bytesRead":3195556,"logicalRead":2241048},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":103.455159,"checksum":5757544,"gcCount":0,"gcMillis":0,"allocated":155900544},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":72.430548,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":26920416,"latency":{"p50":0.65,"p99":1.212,"p99.9":1.814,"max":21.897}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":793.09852,"checksum":20000,"gcCount":1,"gcMillis":57,"allocated":1045983272,"bytesWritten":10155587,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":582.238917,"checksum":5000,"gcCount":0,"gcMillis":0,"allocated":795499432,"latency":{"p50":112.899,"p99":235.114,"p99.9":315.677,"max":2340.504},"bytesWritten":8872968,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":58501297,"millis":10000.178001,"checksum":0,"gcCount":5,"gcMillis":131,"allocated":4940037384,"latency":{"p50":0.915,"p99":3.142,"p99.9":10.203,"max":56021.114},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.178001,"checksum":0,"latency":{"p50":1137.608,"p99":13404.166,"p99.9":56566.532,"max":56566.532},"checked":false,"bytesWritten":57916409,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 200,000 members","operations":200000,"millis":501.977373,"checksum":200000,"gcCount":1,"gcMillis":35,"allocated":586924792,"bytesWritten":14573264,"logicalWritten":1600008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":80000000,"millis":49.417353,"checksum":80000000,"gcCount":0,"gcMillis":0,"allocated":176136,"bytesRead":0,"logicalRead":640000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":19.328724,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":16240,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":86.611256,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":64696856},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":78.841266,"checksum":819693,"gcCount":0,"gcMillis":0,"allocated":59532528,"bytesRead":11309826,"logicalRead":6557544},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":174834473,"millis":1000.0,"checksum":174834473},{"workload":"churn.delete","description":"delete 80,000 hyperedges (20%) in transactions of 1,000","operations":80000,"millis":29668.780879,"checksum":80000,"gcCount":31,"gcMillis":377,"allocated":34397092792,"bytesWritten":1347959763,"logicalWritten":2970424},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":4404.790176,"checksum":20000,"gcCount":4,"gcMillis":86,"allocated":3833240304,"bytesWritten":295958703,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":37.327151,"checksum":665234,"gcCount":0,"gcMillis":0,"allocated":128448,"bytesRead":0,"logicalRead":5321872},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":1298696481,"millis":1000.0,"checksum":1298696481},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.534717,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":156650456,"latency":{"p50":464.104,"p99":772.129,"p99.9":2496.533,"max":2496.533},"checked":false,"bytesWritten":38346475,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.412281,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":138849192,"latency":{"p50":442.725,"p99":722.136,"p99.9":758.62,"max":758.62},"checked":false,"bytesWritten":3229400,"logicalWritten":16000,"compactionMillis":12,"reclaimed":-3302111},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":172504126,"millis":1000.0,"checksum":172504126},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":174.98881,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":173925672,"checked":false,"acknowledged":100000,"lost":0}]} \ No newline at end of file diff --git a/paper/ablation/lazy/after-3.json b/paper/ablation/lazy/after-3.json new file mode 100644 index 0000000..7f665b6 --- /dev/null +++ b/paper/ablation/lazy/after-3.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":4,"durability":"async","threads":8,"nodes":200000,"edges":400000,"incidences":1453427,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4145545216,"retainedHeap":439347416,"bytesWritten":2276226825,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":200000,"millis":4846.356412,"checksum":200000,"gcCount":5,"gcMillis":260,"allocated":5515609544,"bytesWritten":64687086,"logicalWritten":3688890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":400000,"millis":21523.394954,"checksum":1453427,"gcCount":41,"gcMillis":1296,"allocated":41266974136,"bytesWritten":421189700,"logicalWritten":14827416},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":35.732837,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":146600,"bytesRead":0,"logicalRead":5757544},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":45.474546,"checksum":361142,"gcCount":0,"gcMillis":0,"allocated":4029576,"bytesRead":0,"logicalRead":2889136},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":76.68319,"checksum":20109,"gcCount":1,"gcMillis":4,"allocated":82511208,"bytesRead":0,"logicalRead":160872},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":58.303677,"checksum":280131,"gcCount":0,"gcMillis":0,"allocated":12471696,"bytesRead":3184035,"logicalRead":2241048},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":124.402552,"checksum":5757544,"gcCount":0,"gcMillis":0,"allocated":146742376},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":70.671584,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":13320408,"latency":{"p50":0.636,"p99":1.157,"p99.9":1.761,"max":22.145}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":761.560025,"checksum":20000,"gcCount":1,"gcMillis":55,"allocated":1046462568,"bytesWritten":10155587,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":606.234056,"checksum":5000,"gcCount":0,"gcMillis":0,"allocated":799574560,"latency":{"p50":115.061,"p99":247.841,"p99.9":343.431,"max":2335.228},"bytesWritten":8872968,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":56708954,"millis":10000.15095,"checksum":0,"gcCount":8,"gcMillis":138,"allocated":7766794168,"latency":{"p50":0.876,"p99":3.429,"p99.9":10.449,"max":49607.292},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.15095,"checksum":0,"latency":{"p50":1316.998,"p99":10553.396,"p99.9":42052.963,"max":42052.963},"checked":false,"bytesWritten":58267190,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 200,000 members","operations":200000,"millis":486.000907,"checksum":200000,"gcCount":0,"gcMillis":0,"allocated":577157320,"bytesWritten":14573475,"logicalWritten":1600008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":80000000,"millis":49.164398,"checksum":80000000,"gcCount":0,"gcMillis":0,"allocated":185880,"bytesRead":0,"logicalRead":640000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":27.717924,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":15904,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":89.190985,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":64696536},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":75.44394,"checksum":819693,"gcCount":0,"gcMillis":0,"allocated":59551832,"bytesRead":11309990,"logicalRead":6557544},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":175187162,"millis":1000.0,"checksum":175187162},{"workload":"churn.delete","description":"delete 80,000 hyperedges (20%) in transactions of 1,000","operations":80000,"millis":30215.618075,"checksum":80000,"gcCount":31,"gcMillis":387,"allocated":34682115368,"bytesWritten":1361273880,"logicalWritten":2970424},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":4454.138028,"checksum":20000,"gcCount":4,"gcMillis":114,"allocated":3840891520,"bytesWritten":295630204,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":36.73486,"checksum":665234,"gcCount":0,"gcMillis":0,"allocated":141640,"bytesRead":0,"logicalRead":5321872},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":1312097963,"millis":1000.0,"checksum":1312097963},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.541538,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":156386376,"latency":{"p50":460.748,"p99":772.354,"p99.9":2371.071,"max":2371.071},"checked":false,"bytesWritten":38346643,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.475506,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":138756624,"latency":{"p50":453.866,"p99":687.767,"p99.9":800.059,"max":800.059},"checked":false,"bytesWritten":3229400,"logicalWritten":16000,"compactionMillis":12,"reclaimed":-3302109},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":172445699,"millis":1000.0,"checksum":172445699},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":181.622281,"checksum":1,"gcCount":1,"gcMillis":16,"allocated":168757568,"checked":false,"acknowledged":100000,"lost":0}]} \ No newline at end of file diff --git a/paper/ablation/lazy/before-1.json b/paper/ablation/lazy/before-1.json new file mode 100644 index 0000000..810c3f5 --- /dev/null +++ b/paper/ablation/lazy/before-1.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":4,"durability":"async","threads":8,"nodes":200000,"edges":400000,"incidences":1453427,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4097835008,"retainedHeap":449661488,"bytesWritten":2190056955,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":200000,"millis":4913.387702,"checksum":200000,"gcCount":5,"gcMillis":263,"allocated":5383046616,"bytesWritten":63365590,"logicalWritten":3688890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":400000,"millis":21831.934172,"checksum":1453427,"gcCount":44,"gcMillis":1257,"allocated":45732756408,"bytesWritten":436351373,"logicalWritten":14827416},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":37.578907,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":147304,"bytesRead":0,"logicalRead":5757544},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":552.726425,"checksum":361142,"gcCount":0,"gcMillis":0,"allocated":903815056,"bytesRead":77801497,"logicalRead":2889136},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":80.791442,"checksum":20109,"gcCount":0,"gcMillis":0,"allocated":83643448,"bytesRead":0,"logicalRead":160872},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":814.561435,"checksum":280131,"gcCount":1,"gcMillis":12,"allocated":1338114944,"bytesRead":124594771,"logicalRead":2241048},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":62.305449,"checksum":5757544,"gcCount":0,"gcMillis":0,"allocated":82304848},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":74.202835,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":26904672,"latency":{"p50":0.669,"p99":1.213,"p99.9":1.727,"max":30.243}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":725.608943,"checksum":20000,"gcCount":1,"gcMillis":35,"allocated":1049466392,"bytesWritten":9950206,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":545.830326,"checksum":5000,"gcCount":1,"gcMillis":34,"allocated":864354600,"latency":{"p50":98.654,"p99":196.915,"p99.9":298.724,"max":33782.129},"bytesWritten":8681341,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":56925997,"millis":10000.185467,"checksum":0,"gcCount":4,"gcMillis":85,"allocated":5095891712,"latency":{"p50":0.865,"p99":3.282,"p99.9":15.86,"max":35746.299},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.185467,"checksum":0,"latency":{"p50":1117.663,"p99":6327.708,"p99.9":31548.438,"max":31548.438},"checked":false,"bytesWritten":55399769,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 200,000 members","operations":200000,"millis":460.370332,"checksum":200000,"gcCount":1,"gcMillis":8,"allocated":519305672,"bytesWritten":14196352,"logicalWritten":1600008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":80000000,"millis":50.716376,"checksum":80000000,"gcCount":0,"gcMillis":0,"allocated":185040,"bytesRead":0,"logicalRead":640000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":18.997057,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":18064,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":90.582996,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":64716552},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":110.285028,"checksum":819693,"gcCount":0,"gcMillis":0,"allocated":102387856,"bytesRead":11044181,"logicalRead":6557544},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":171949799,"millis":1000.0,"checksum":171949799},{"workload":"churn.delete","description":"delete 80,000 hyperedges (20%) in transactions of 1,000","operations":80000,"millis":25804.797349,"checksum":80000,"gcCount":22,"gcMillis":278,"allocated":25477771600,"bytesWritten":1289892482,"logicalWritten":2970424},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":4380.320832,"checksum":20000,"gcCount":3,"gcMillis":106,"allocated":3280881736,"bytesWritten":287336077,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":41.134434,"checksum":665234,"gcCount":0,"gcMillis":0,"allocated":128016,"bytesRead":0,"logicalRead":5321872},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":1228995396,"millis":1000.0,"checksum":1228995396},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.649084,"checksum":0,"gcCount":1,"gcMillis":27,"allocated":118643304,"latency":{"p50":565.339,"p99":853.989,"p99.9":19765.841,"max":19765.841},"checked":false,"bytesWritten":21670379,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.66944,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":104841728,"latency":{"p50":516.243,"p99":851.671,"p99.9":993.982,"max":993.982},"checked":false,"bytesWritten":3212694,"logicalWritten":16000,"compactionMillis":13,"reclaimed":-3286043},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":180448871,"millis":1000.0,"checksum":180448871},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":183.294517,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":161450480,"checked":false,"acknowledged":100000,"lost":0}]} \ No newline at end of file diff --git a/paper/ablation/lazy/before-2.json b/paper/ablation/lazy/before-2.json new file mode 100644 index 0000000..28de6e7 --- /dev/null +++ b/paper/ablation/lazy/before-2.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":4,"durability":"async","threads":8,"nodes":200000,"edges":400000,"incidences":1453427,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4115660800,"retainedHeap":443431272,"bytesWritten":2189663993,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":200000,"millis":5029.407259,"checksum":200000,"gcCount":5,"gcMillis":261,"allocated":5348691632,"bytesWritten":63156998,"logicalWritten":3688890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":400000,"millis":21844.166199,"checksum":1453427,"gcCount":44,"gcMillis":1256,"allocated":46000243008,"bytesWritten":435230031,"logicalWritten":14827416},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":36.563909,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":147760,"bytesRead":0,"logicalRead":5757544},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":557.356616,"checksum":361142,"gcCount":0,"gcMillis":0,"allocated":905295472,"bytesRead":77928687,"logicalRead":2889136},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":84.130282,"checksum":20109,"gcCount":0,"gcMillis":0,"allocated":83758696,"bytesRead":0,"logicalRead":160872},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":834.590985,"checksum":280131,"gcCount":1,"gcMillis":13,"allocated":1341069368,"bytesRead":124788922,"logicalRead":2241048},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":68.322607,"checksum":5757544,"gcCount":0,"gcMillis":0,"allocated":80623816},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":75.792882,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":15705704,"latency":{"p50":0.677,"p99":1.251,"p99.9":2.078,"max":42.877}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":692.19338,"checksum":20000,"gcCount":1,"gcMillis":40,"allocated":1039267872,"bytesWritten":9950206,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":548.074596,"checksum":5000,"gcCount":1,"gcMillis":45,"allocated":828850688,"latency":{"p50":97.838,"p99":182.965,"p99.9":309.506,"max":44838.564},"bytesWritten":8681341,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":55685506,"millis":10000.612398,"checksum":0,"gcCount":2,"gcMillis":67,"allocated":2816869368,"latency":{"p50":0.943,"p99":3.013,"p99.9":9.738,"max":38402.951},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.612398,"checksum":0,"latency":{"p50":1265.416,"p99":7621.867,"p99.9":31118.694,"max":31118.694},"checked":false,"bytesWritten":54378942,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 200,000 members","operations":200000,"millis":465.440416,"checksum":200000,"gcCount":1,"gcMillis":21,"allocated":529558680,"bytesWritten":14196352,"logicalWritten":1600008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":80000000,"millis":50.865918,"checksum":80000000,"gcCount":0,"gcMillis":0,"allocated":186528,"bytesRead":0,"logicalRead":640000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":17.172562,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":16288,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":94.805742,"checksum":1,"gcCount":1,"gcMillis":2,"allocated":64698800},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":113.229589,"checksum":819693,"gcCount":0,"gcMillis":0,"allocated":102387184,"bytesRead":11044181,"logicalRead":6557544},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":170924391,"millis":1000.0,"checksum":170924391},{"workload":"churn.delete","description":"delete 80,000 hyperedges (20%) in transactions of 1,000","operations":80000,"millis":26236.687399,"checksum":80000,"gcCount":24,"gcMillis":318,"allocated":27025952536,"bytesWritten":1290913707,"logicalWritten":2970424},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":4225.388744,"checksum":20000,"gcCount":4,"gcMillis":140,"allocated":3576203264,"bytesWritten":288336475,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":38.391353,"checksum":665234,"gcCount":0,"gcMillis":0,"allocated":127968,"bytesRead":0,"logicalRead":5321872},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":1230010613,"millis":1000.0,"checksum":1230010613},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.563934,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":118267496,"latency":{"p50":514.826,"p99":734.633,"p99.9":2372.352,"max":2372.352},"checked":false,"bytesWritten":21606555,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.555313,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":103960112,"latency":{"p50":490.613,"p99":752.141,"p99.9":819.107,"max":819.107},"checked":false,"bytesWritten":3212694,"logicalWritten":16000,"compactionMillis":12,"reclaimed":-3286043},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":181387751,"millis":1000.0,"checksum":181387751},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":146.620647,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":125261488,"checked":false,"acknowledged":100000,"lost":0}]} \ No newline at end of file diff --git a/paper/ablation/lazy/before-3.json b/paper/ablation/lazy/before-3.json new file mode 100644 index 0000000..8bf58e3 --- /dev/null +++ b/paper/ablation/lazy/before-3.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":4,"durability":"async","threads":8,"nodes":200000,"edges":400000,"incidences":1453427,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4102029312,"retainedHeap":440774720,"bytesWritten":2192345871,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":200000,"millis":4794.917512,"checksum":200000,"gcCount":5,"gcMillis":260,"allocated":5344126256,"bytesWritten":63564840,"logicalWritten":3688890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":400000,"millis":21671.316665,"checksum":1453427,"gcCount":45,"gcMillis":1235,"allocated":46226583160,"bytesWritten":439049131,"logicalWritten":14827416},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":42.834022,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":147136,"bytesRead":0,"logicalRead":5757544},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":568.829485,"checksum":361142,"gcCount":1,"gcMillis":8,"allocated":903588392,"bytesRead":77782951,"logicalRead":2889136},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":68.084925,"checksum":20109,"gcCount":0,"gcMillis":0,"allocated":82421376,"bytesRead":0,"logicalRead":160872},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":848.20715,"checksum":280131,"gcCount":1,"gcMillis":11,"allocated":1338919368,"bytesRead":124681587,"logicalRead":2241048},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":81.873985,"checksum":5757544,"gcCount":1,"gcMillis":18,"allocated":87100736},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":70.346039,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":26913768,"latency":{"p50":0.629,"p99":1.194,"p99.9":1.947,"max":25.528}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":723.181449,"checksum":20000,"gcCount":1,"gcMillis":43,"allocated":1039908048,"bytesWritten":9950206,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":618.48036,"checksum":5000,"gcCount":1,"gcMillis":35,"allocated":863266816,"latency":{"p50":112.409,"p99":210.79,"p99.9":348.075,"max":35233.371},"bytesWritten":8681341,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":57286970,"millis":10000.141097,"checksum":0,"gcCount":7,"gcMillis":104,"allocated":7968663224,"latency":{"p50":0.858,"p99":3.479,"p99.9":12.135,"max":34346.663},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.141097,"checksum":0,"latency":{"p50":1359.947,"p99":7568.177,"p99.9":29168.176,"max":29168.176},"checked":false,"bytesWritten":56070601,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 200,000 members","operations":200000,"millis":462.431432,"checksum":200000,"gcCount":0,"gcMillis":0,"allocated":525176752,"bytesWritten":14196144,"logicalWritten":1600008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":80000000,"millis":49.966745,"checksum":80000000,"gcCount":0,"gcMillis":0,"allocated":185904,"bytesRead":0,"logicalRead":640000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":17.071208,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":18256,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":85.983982,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":64702256},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":110.738589,"checksum":819693,"gcCount":0,"gcMillis":0,"allocated":102396264,"bytesRead":11044020,"logicalRead":6557544},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":172623523,"millis":1000.0,"checksum":172623523},{"workload":"churn.delete","description":"delete 80,000 hyperedges (20%) in transactions of 1,000","operations":80000,"millis":25680.474285,"checksum":80000,"gcCount":24,"gcMillis":305,"allocated":25582576048,"bytesWritten":1289214002,"logicalWritten":2970424},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":4132.215154,"checksum":20000,"gcCount":3,"gcMillis":98,"allocated":3526271496,"bytesWritten":286673120,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":43.215943,"checksum":665234,"gcCount":0,"gcMillis":0,"allocated":142216,"bytesRead":0,"logicalRead":5321872},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":1228313069,"millis":1000.0,"checksum":1228313069},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.560381,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":118644968,"latency":{"p50":446.251,"p99":710.404,"p99.9":2383.359,"max":2383.359},"checked":false,"bytesWritten":21733100,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.500808,"checksum":0,"gcCount":1,"gcMillis":35,"allocated":104193728,"latency":{"p50":451.977,"p99":712.017,"p99.9":15784.181,"max":15784.181},"checked":false,"bytesWritten":3212694,"logicalWritten":16000,"compactionMillis":12,"reclaimed":-3286043},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":179823994,"millis":1000.0,"checksum":179823994},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":129.738634,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":123117168,"checked":false,"acknowledged":100000,"lost":0}]} \ No newline at end of file diff --git a/paper/ablation/logical/after-1.json b/paper/ablation/logical/after-1.json new file mode 100644 index 0000000..c3ee9c1 --- /dev/null +++ b/paper/ablation/logical/after-1.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4024434688,"retainedHeap":182992360,"bytesWritten":104588713,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1350.550482,"checksum":50000,"gcCount":1,"gcMillis":22,"allocated":994230088,"bytesWritten":12404341,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":3514.922258,"checksum":362757,"gcCount":3,"gcMillis":140,"allocated":3722854472,"bytesWritten":37576925,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":25.272876,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":134360,"bytesRead":0,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":37.59244,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4030272,"bytesRead":0,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":64.928247,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":78692608,"bytesRead":0,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":36.898749,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":4042624,"bytesRead":0,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":46.811643,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":1463640},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":56.596647,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":26903216,"latency":{"p50":0.511,"p99":0.932,"p99.9":1.316,"max":13.654}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":366.137359,"checksum":20000,"gcCount":1,"gcMillis":9,"allocated":418484024,"bytesWritten":4420453,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":576.498979,"checksum":5000,"gcCount":0,"gcMillis":0,"allocated":498269496,"latency":{"p50":112.696,"p99":242.472,"p99.9":420.462,"max":794.438},"bytesWritten":3243937,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":51127151,"millis":10000.190547,"checksum":0,"gcCount":6,"gcMillis":45,"allocated":5871240792,"latency":{"p50":0.839,"p99":7.154,"p99.9":15.53,"max":16802.556},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.190547,"checksum":0,"latency":{"p50":1018.44,"p99":5472.487,"p99.9":14389.621,"max":14389.621},"checked":false,"bytesWritten":3495619,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":117.610409,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":106096848,"bytesWritten":3319691,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":12.104255,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":185256,"bytesRead":0,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":14.447987,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":15616,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":67.538288,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":27419888},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":52.874374,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":26597936,"bytesRead":2650766,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":95244105,"millis":1000.0,"checksum":95244105},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1181.082104,"checksum":20000,"gcCount":1,"gcMillis":31,"allocated":1052859216,"bytesWritten":18487867,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":1007.705808,"checksum":20000,"gcCount":1,"gcMillis":47,"allocated":584044528,"bytesWritten":9607370,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":24.301042,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":139552,"bytesRead":0,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":125046679,"millis":1000.0,"checksum":125046679},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.549843,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":83703768,"latency":{"p50":460.15,"p99":801.856,"p99.9":2606.606,"max":2606.606},"checked":false,"bytesWritten":1760064,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.417765,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":79712944,"latency":{"p50":492.889,"p99":853.419,"p99.9":1071.343,"max":1071.343},"checked":false,"bytesWritten":10271754,"logicalWritten":16000,"compactionMillis":72,"reclaimed":31707546},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":95166917,"millis":1000.0,"checksum":95166917},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":104.562375,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":123886336,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/ablation/logical/after-2.json b/paper/ablation/logical/after-2.json new file mode 100644 index 0000000..f54c637 --- /dev/null +++ b/paper/ablation/logical/after-2.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4099932160,"retainedHeap":202359664,"bytesWritten":104919277,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1360.372729,"checksum":50000,"gcCount":1,"gcMillis":23,"allocated":992754800,"bytesWritten":12404341,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":3677.465551,"checksum":362757,"gcCount":3,"gcMillis":134,"allocated":3718820920,"bytesWritten":37557276,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":30.070991,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":145416,"bytesRead":0,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":40.16825,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4029696,"bytesRead":0,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":66.374512,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":80612728,"bytesRead":0,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":35.167021,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":3804712,"bytesRead":0,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":42.81062,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":1604920},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":58.347741,"checksum":731528,"gcCount":1,"gcMillis":2,"allocated":29301104,"latency":{"p50":0.505,"p99":0.937,"p99.9":1.334,"max":2189.227}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":420.659352,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":419347312,"bytesWritten":4420453,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":675.911863,"checksum":5000,"gcCount":1,"gcMillis":11,"allocated":504891120,"latency":{"p50":131.199,"p99":268.059,"p99.9":438.432,"max":11804.956},"bytesWritten":3243937,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":61544332,"millis":10000.185982,"checksum":0,"gcCount":6,"gcMillis":40,"allocated":6721856720,"latency":{"p50":0.845,"p99":3.103,"p99.9":16.958,"max":20905.227},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.185982,"checksum":0,"latency":{"p50":919.692,"p99":5256.614,"p99.9":24202.418,"max":24202.418},"checked":false,"bytesWritten":3495619,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":119.948139,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":105653360,"bytesWritten":3319691,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":12.315522,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":186888,"bytesRead":0,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":15.263106,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":15616,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":76.402288,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":25989368},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":52.725081,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":26591552,"bytesRead":2650766,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":95224137,"millis":1000.0,"checksum":95224137},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1350.979381,"checksum":20000,"gcCount":1,"gcMillis":28,"allocated":1092498896,"bytesWritten":18827829,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":936.813651,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":576879000,"bytesWritten":9616172,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":24.408138,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":139624,"bytesRead":0,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":125379479,"millis":1000.0,"checksum":125379479},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.39839,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":83904736,"latency":{"p50":445.225,"p99":1086.235,"p99.9":2560.046,"max":2560.046},"checked":false,"bytesWritten":1760064,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.527218,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":79468712,"latency":{"p50":465.754,"p99":778.736,"p99.9":840.804,"max":840.804},"checked":false,"bytesWritten":10273203,"logicalWritten":16000,"compactionMillis":70,"reclaimed":32038938},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":95168325,"millis":1000.0,"checksum":95168325},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":114.843286,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":121221912,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/ablation/logical/after-3.json b/paper/ablation/logical/after-3.json new file mode 100644 index 0000000..d0a7038 --- /dev/null +++ b/paper/ablation/logical/after-3.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4108845056,"retainedHeap":185957416,"bytesWritten":104756126,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1365.160281,"checksum":50000,"gcCount":1,"gcMillis":23,"allocated":992213336,"bytesWritten":12404341,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":3622.124024,"checksum":362757,"gcCount":3,"gcMillis":144,"allocated":3688829640,"bytesWritten":37460598,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":30.566897,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":148128,"bytesRead":0,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":40.566514,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4032144,"bytesRead":0,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":75.84271,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":80493360,"bytesRead":0,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":36.419724,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":3804928,"bytesRead":0,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":44.015542,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":1464304},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":58.639331,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":29300432,"latency":{"p50":0.524,"p99":0.977,"p99.9":1.358,"max":18.831}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":428.866676,"checksum":20000,"gcCount":1,"gcMillis":13,"allocated":422490864,"bytesWritten":4420453,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":536.948004,"checksum":5000,"gcCount":0,"gcMillis":0,"allocated":495604960,"latency":{"p50":105.615,"p99":225.518,"p99.9":376.823,"max":533.729},"bytesWritten":3243937,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":61525375,"millis":10000.126261,"checksum":0,"gcCount":8,"gcMillis":47,"allocated":7869024144,"latency":{"p50":0.826,"p99":2.638,"p99.9":9.537,"max":18440.298},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.126261,"checksum":0,"latency":{"p50":1102.892,"p99":5042.69,"p99.9":11181.628,"max":11181.628},"checked":false,"bytesWritten":3495619,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":118.791706,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":104442112,"bytesWritten":3319691,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":14.367979,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":185808,"bytesRead":0,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":14.964823,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":16024,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":83.565503,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":26839936},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":51.646362,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":26591384,"bytesRead":2650766,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":95126735,"millis":1000.0,"checksum":95126735},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1303.366752,"checksum":20000,"gcCount":1,"gcMillis":33,"allocated":1062330520,"bytesWritten":18771607,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":907.481573,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":572915544,"bytesWritten":9607370,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":23.468903,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":139168,"bytesRead":0,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":125216855,"millis":1000.0,"checksum":125216855},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.491794,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":84853976,"latency":{"p50":490.723,"p99":805.516,"p99.9":2617.838,"max":2617.838},"checked":false,"bytesWritten":1760064,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.547289,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":79636248,"latency":{"p50":423.318,"p99":757.281,"p99.9":883.582,"max":883.582},"checked":false,"bytesWritten":10271754,"logicalWritten":16000,"compactionMillis":58,"reclaimed":31877722},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":95166917,"millis":1000.0,"checksum":95166917},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":99.113153,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":121130856,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/ablation/logical/before-1.json b/paper/ablation/logical/before-1.json new file mode 100644 index 0000000..9124ffd --- /dev/null +++ b/paper/ablation/logical/before-1.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4164943872,"retainedHeap":40917784,"bytesWritten":570618646,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1675.092707,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":941629856,"bytesWritten":35473787,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":4078.493216,"checksum":362757,"gcCount":4,"gcMillis":51,"allocated":3457845608,"bytesWritten":134020427,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":26.382764,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":121240,"bytesRead":0,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":36.273343,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4031688,"bytesRead":0,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":57.088517,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":78406864,"bytesRead":0,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":35.612337,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":3804592,"bytesRead":0,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":41.861214,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":1592160},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":54.854072,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":15710584,"latency":{"p50":0.482,"p99":0.936,"p99.9":1.43,"max":20.547}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":575.035326,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":632335920,"bytesWritten":37892497,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":962.905254,"checksum":5000,"gcCount":0,"gcMillis":0,"allocated":802528960,"latency":{"p50":186.19,"p99":341.306,"p99.9":543.145,"max":941.918},"bytesWritten":76525043,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":61435265,"millis":10000.171819,"checksum":0,"gcCount":6,"gcMillis":71,"allocated":7527081200,"latency":{"p50":0.835,"p99":3.539,"p99.9":10.85,"max":27545.399},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.171819,"checksum":0,"latency":{"p50":1602.17,"p99":6136.0,"p99.9":17401.977,"max":17401.977},"checked":false,"bytesWritten":100942027,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":97.55451,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":102875312,"bytesWritten":3317126,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":12.039451,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":185424,"bytesRead":0,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":14.509341,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":15520,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":124.219194,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":35387344},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":46.400095,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":26531744,"bytesRead":2650766,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":152475107,"millis":1000.0,"checksum":152475107},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1491.068118,"checksum":20000,"gcCount":1,"gcMillis":20,"allocated":1390966224,"bytesWritten":83840998,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":1007.488908,"checksum":20000,"gcCount":1,"gcMillis":10,"allocated":794206672,"bytesWritten":72094251,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":26.497099,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":139504,"bytesRead":0,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":310932922,"millis":1000.0,"checksum":310932922},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.403544,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":105931800,"latency":{"p50":548.765,"p99":854.598,"p99.9":2554.154,"max":2554.154},"checked":false,"bytesWritten":7675093,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.527847,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":102627968,"latency":{"p50":515.056,"p99":775.795,"p99.9":840.069,"max":840.069},"checked":false,"bytesWritten":18835724,"logicalWritten":16000,"compactionMillis":9,"reclaimed":249416567},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":69295743,"millis":1000.0,"checksum":69295743},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":37.538878,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":79461912,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/ablation/logical/before-2.json b/paper/ablation/logical/before-2.json new file mode 100644 index 0000000..8c1e38d --- /dev/null +++ b/paper/ablation/logical/before-2.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4197449728,"retainedHeap":44729536,"bytesWritten":570618646,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1694.775589,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":926347312,"bytesWritten":35473787,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":4153.325737,"checksum":362757,"gcCount":4,"gcMillis":55,"allocated":3508099592,"bytesWritten":134020427,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":25.078621,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":120640,"bytesRead":0,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":38.732504,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4029672,"bytesRead":0,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":61.155057,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":78406912,"bytesRead":0,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":38.135315,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":3804616,"bytesRead":0,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":39.776404,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":1868744},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":58.017806,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":26901320,"latency":{"p50":0.514,"p99":0.974,"p99.9":1.439,"max":24.01}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":626.680224,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":655176456,"bytesWritten":37892497,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":1078.57344,"checksum":5000,"gcCount":1,"gcMillis":23,"allocated":825925600,"latency":{"p50":204.597,"p99":361.134,"p99.9":565.677,"max":23903.939},"bytesWritten":76525043,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":58886152,"millis":10000.169264,"checksum":0,"gcCount":7,"gcMillis":80,"allocated":8018946272,"latency":{"p50":0.797,"p99":4.263,"p99.9":20.066,"max":25792.762},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.169264,"checksum":0,"latency":{"p50":1635.347,"p99":8133.039,"p99.9":22545.832,"max":22545.832},"checked":false,"bytesWritten":100942027,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":105.886757,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":101768248,"bytesWritten":3317126,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":12.378152,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":185280,"bytesRead":0,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":14.692544,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":15952,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":128.759754,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":35470608},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":47.115469,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":26548128,"bytesRead":2650766,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":152475107,"millis":1000.0,"checksum":152475107},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1450.057116,"checksum":20000,"gcCount":1,"gcMillis":15,"allocated":1427368928,"bytesWritten":83840998,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":1006.577766,"checksum":20000,"gcCount":1,"gcMillis":18,"allocated":769995904,"bytesWritten":72094251,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":29.732807,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":125544,"bytesRead":0,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":310932922,"millis":1000.0,"checksum":310932922},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.529283,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":107983952,"latency":{"p50":583.186,"p99":837.54,"p99.9":2538.918,"max":2538.918},"checked":false,"bytesWritten":7675093,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.514285,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":104016888,"latency":{"p50":581.711,"p99":866.319,"p99.9":957.531,"max":957.531},"checked":false,"bytesWritten":18835724,"logicalWritten":16000,"compactionMillis":11,"reclaimed":249416567},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":69295743,"millis":1000.0,"checksum":69295743},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":38.226164,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":78786304,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/ablation/logical/before-3.json b/paper/ablation/logical/before-3.json new file mode 100644 index 0000000..cb715a3 --- /dev/null +++ b/paper/ablation/logical/before-3.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4189585408,"retainedHeap":40856344,"bytesWritten":570618646,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1705.084775,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":902444488,"bytesWritten":35473787,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":4041.659898,"checksum":362757,"gcCount":4,"gcMillis":53,"allocated":3495841328,"bytesWritten":134020427,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":23.991181,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":145656,"bytesRead":0,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":36.202764,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4031784,"bytesRead":0,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":56.300928,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":78407056,"bytesRead":0,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":36.969436,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":3804568,"bytesRead":0,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":47.269749,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":1711504},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":55.383123,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":29309912,"latency":{"p50":0.488,"p99":0.929,"p99.9":1.342,"max":19.778}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":592.195418,"checksum":20000,"gcCount":1,"gcMillis":17,"allocated":633808680,"bytesWritten":37892497,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":1040.612449,"checksum":5000,"gcCount":0,"gcMillis":0,"allocated":794813176,"latency":{"p50":203.833,"p99":350.873,"p99.9":578.416,"max":1446.921},"bytesWritten":76525043,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":62303756,"millis":10000.159113,"checksum":0,"gcCount":6,"gcMillis":78,"allocated":6404594688,"latency":{"p50":0.782,"p99":2.739,"p99.9":24.605,"max":27362.627},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.159113,"checksum":0,"latency":{"p50":1506.379,"p99":8123.436,"p99.9":27202.971,"max":27202.971},"checked":false,"bytesWritten":100942027,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":101.995342,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":101228968,"bytesWritten":3317126,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":12.105943,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":176736,"bytesRead":0,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":15.599359,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":15520,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":137.002393,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":40056736},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":46.995576,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":26534096,"bytesRead":2650766,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":152475107,"millis":1000.0,"checksum":152475107},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1450.46724,"checksum":20000,"gcCount":1,"gcMillis":17,"allocated":1433604160,"bytesWritten":83840998,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":1029.509383,"checksum":20000,"gcCount":1,"gcMillis":19,"allocated":777762624,"bytesWritten":72094251,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":29.546303,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":4144784,"bytesRead":0,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":310932922,"millis":1000.0,"checksum":310932922},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.706526,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":103217792,"latency":{"p50":590.41,"p99":896.789,"p99.9":3492.22,"max":3492.22},"checked":false,"bytesWritten":7675093,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.555623,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":99679344,"latency":{"p50":566.607,"p99":861.356,"p99.9":950.179,"max":950.179},"checked":false,"bytesWritten":18835724,"logicalWritten":16000,"compactionMillis":10,"reclaimed":249416567},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":69295743,"millis":1000.0,"checksum":69295743},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":36.860556,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":80389704,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/environment.txt b/paper/results/environment.txt new file mode 100644 index 0000000..4adb815 --- /dev/null +++ b/paper/results/environment.txt @@ -0,0 +1,73 @@ +== uname +Linux bench 6.17.0-1022-azure #22-Ubuntu SMP Mon Jul 27 17:24:03 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux +== lscpu +Architecture: x86_64 +CPU op-mode(s): 32-bit, 64-bit +Address sizes: 46 bits physical, 57 bits virtual +Byte Order: Little Endian +CPU(s): 8 +On-line CPU(s) list: 0-7 +Vendor ID: GenuineIntel +Model name: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz +CPU family: 6 +Model: 106 +Thread(s) per core: 2 +Core(s) per socket: 4 +Socket(s): 1 +Stepping: 6 +CPU(s) scaling MHz: 106% +CPU max MHz: 2800.0000 +CPU min MHz: 800.0000 +BogoMIPS: 5586.97 +Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology tsc_reliable nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch tpr_shadow ept vpid ept_ad fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves vnmi avx512vbmi umip avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg avx512_vpopcntdq la57 rdpid fsrm arch_capabilities +Virtualization: VT-x +Hypervisor vendor: Microsoft +Virtualization type: full +L1d cache: 192 KiB (4 instances) +L1i cache: 128 KiB (4 instances) +L2 cache: 5 MiB (4 instances) +L3 cache: 48 MiB (1 instance) +NUMA node(s): 1 +NUMA node0 CPU(s): 0-7 +Vulnerability Gather data sampling: Not affected +Vulnerability Ghostwrite: Not affected +Vulnerability Indirect target selection: Mitigation; Aligned branch/return thunks +Vulnerability Itlb multihit: Not affected +Vulnerability L1tf: Not affected +Vulnerability Mds: Not affected +Vulnerability Meltdown: Not affected +Vulnerability Mmio stale data: Vulnerable: Clear CPU buffers attempted, no microcode; SMT Host state unknown +Vulnerability Old microcode: Not affected +Vulnerability Reg file data sampling: Not affected +Vulnerability Retbleed: Vulnerable +Vulnerability Spec rstack overflow: Not affected +Vulnerability Spec store bypass: Vulnerable +Vulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization +Vulnerability Spectre v2: Mitigation; Retpolines; STIBP disabled; RSB filling; PBRSB-eIBRS Not affected; BHI Retpoline +Vulnerability Srbds: Not affected +Vulnerability Tsa: Not affected +Vulnerability Tsx async abort: Not affected +Vulnerability Vmscape: Not affected +== memory + total used free shared buff/cache available +Mem: 31 1 29 0 1 30 +Swap: 0 0 0 +== disks +NAME SIZE TYPE MOUNTPOINT MODEL +sda 30G disk Virtual Disk +├─sda1 29G part / +├─sda14 4M part +├─sda15 106M part /boot/efi +└─sda16 913M part /boot +sdb 300G disk Virtual Disk +└─sdb1 300G part /mnt +sr0 628K rom Virtual DVD-ROM +Filesystem Size Used Avail Use% Mounted on +/dev/sdb1 295G 889M 279G 1% /mnt +== mount +TARGET SOURCE FSTYPE OPTIONS +/mnt /dev/sdb1 ext4 rw,relatime +== java +java version "25.0.4" 2026-07-21 LTS +Java(TM) SE Runtime Environment Oracle GraalVM 25.0.4+7.1 (build 25.0.4+7-LTS-jvmci-b01) +Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 25.0.4+7.1 (build 25.0.4+7-LTS-jvmci-b01, mixed mode, sharing) diff --git a/paper/results/s1-async/hstore-1.json b/paper/results/s1-async/hstore-1.json new file mode 100644 index 0000000..18405d7 --- /dev/null +++ b/paper/results/s1-async/hstore-1.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4104126464,"retainedHeap":191882576,"bytesWritten":142348476,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1516.953211,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":722392336,"bytesWritten":15537408,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":3607.533975,"checksum":362757,"gcCount":2,"gcMillis":78,"allocated":2257500312,"bytesWritten":46571865,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":31.43611,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":121936,"bytesRead":0,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":43.601004,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4017128,"bytesRead":0,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":73.406049,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":67946192,"bytesRead":0,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":41.902372,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":3802304,"bytesRead":0,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":42.609266,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":1371424},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":48.833983,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":4907536,"latency":{"p50":0.429,"p99":0.867,"p99.9":1.414,"max":37.783}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":462.496192,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":241190256,"bytesWritten":4471900,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":718.808151,"checksum":5000,"gcCount":0,"gcMillis":0,"allocated":237674000,"latency":{"p50":143.299,"p99":228.153,"p99.9":337.946,"max":452.463},"bytesWritten":3295384,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":87258871,"millis":10000.153726,"checksum":0,"gcCount":4,"gcMillis":57,"allocated":4338660824,"latency":{"p50":0.649,"p99":1.307,"p99.9":5.467,"max":20428.411},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.153726,"checksum":0,"latency":{"p50":1122.254,"p99":5433.844,"p99.9":17227.371,"max":17227.371},"checked":false,"bytesWritten":15306480,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":123.691817,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":75817368,"bytesWritten":3411588,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":11.987787,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":126728,"bytesRead":0,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":15.155616,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":5128,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":79.092875,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":25595960},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":59.819973,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":31878528,"bytesRead":2737618,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":94380101,"millis":1000.0,"checksum":94380101},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1243.594329,"checksum":20000,"gcCount":1,"gcMillis":48,"allocated":808984056,"bytesWritten":23199304,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":864.909055,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":430031296,"bytesWritten":21737140,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":33.012085,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":4118256,"bytesRead":0,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":124403435,"millis":1000.0,"checksum":124403435},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.546827,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":80246936,"latency":{"p50":477.791,"p99":744.707,"p99.9":2872.604,"max":2872.604},"checked":false,"bytesWritten":6731175,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.471311,"checksum":0,"gcCount":1,"gcMillis":59,"allocated":76374600,"latency":{"p50":482.72,"p99":870.937,"p99.9":39821.152,"max":39821.152},"checked":false,"bytesWritten":2085540,"logicalWritten":16000,"compactionMillis":12,"reclaimed":-2153797},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":99845160,"millis":1000.0,"checksum":99845160},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":84.772001,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":68630728,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s1-async/hstore-2.json b/paper/results/s1-async/hstore-2.json new file mode 100644 index 0000000..221f71e --- /dev/null +++ b/paper/results/s1-async/hstore-2.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4088397824,"retainedHeap":187672944,"bytesWritten":132058841,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1516.5245,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":707326152,"bytesWritten":15537408,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":3495.105163,"checksum":362757,"gcCount":2,"gcMillis":86,"allocated":2247166544,"bytesWritten":48778847,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":34.625273,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":121936,"bytesRead":0,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":45.375066,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4017128,"bytesRead":0,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":74.146932,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":67466192,"bytesRead":0,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":42.655665,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":3802304,"bytesRead":0,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":56.935054,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":1395296},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":51.452813,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":4907536,"latency":{"p50":0.452,"p99":0.941,"p99.9":1.416,"max":26.788}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":468.923097,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":244677848,"bytesWritten":4471900,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":713.866829,"checksum":5000,"gcCount":0,"gcMillis":0,"allocated":236166704,"latency":{"p50":143.562,"p99":225.74,"p99.9":308.149,"max":563.581},"bytesWritten":3295384,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":85531784,"millis":10000.191415,"checksum":0,"gcCount":3,"gcMillis":45,"allocated":4214767464,"latency":{"p50":0.657,"p99":1.303,"p99.9":5.47,"max":18057.713},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.191415,"checksum":0,"latency":{"p50":947.075,"p99":5676.949,"p99.9":18150.232,"max":18150.232},"checked":false,"bytesWritten":13002698,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":120.924835,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":78007968,"bytesWritten":7320179,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":11.943295,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":126728,"bytesRead":0,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":15.245442,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":5128,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":74.476132,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":27018992},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":59.800557,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":29437608,"bytesRead":2737618,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":89864017,"millis":1000.0,"checksum":89864017},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1251.470485,"checksum":20000,"gcCount":1,"gcMillis":54,"allocated":778360392,"bytesWritten":19475127,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":826.509462,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":367455568,"bytesWritten":9909263,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":32.24851,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":4118256,"bytesRead":0,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":120964670,"millis":1000.0,"checksum":120964670},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.557948,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":81323848,"latency":{"p50":452.186,"p99":726.74,"p99.9":2658.428,"max":2658.428},"checked":false,"bytesWritten":8181803,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.534977,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":75800512,"latency":{"p50":501.498,"p99":753.686,"p99.9":895.661,"max":895.661},"checked":false,"bytesWritten":2085540,"logicalWritten":16000,"compactionMillis":15,"reclaimed":-2153805},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":97870169,"millis":1000.0,"checksum":97870169},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":79.979585,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":68316096,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s1-async/hstore-3.json b/paper/results/s1-async/hstore-3.json new file mode 100644 index 0000000..197dc43 --- /dev/null +++ b/paper/results/s1-async/hstore-3.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4142923776,"retainedHeap":186663880,"bytesWritten":132047370,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1475.160964,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":715820056,"bytesWritten":15537408,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":3456.792769,"checksum":362757,"gcCount":2,"gcMillis":87,"allocated":2237831312,"bytesWritten":48778847,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":32.230431,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":107536,"bytesRead":0,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":42.927436,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4017128,"bytesRead":0,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":74.375803,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":64517840,"bytesRead":0,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":39.518424,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":3802304,"bytesRead":0,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":102.793018,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":32689696},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":48.247215,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":9689376,"latency":{"p50":0.431,"p99":0.85,"p99.9":1.234,"max":13.082}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":489.165402,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":247294384,"bytesWritten":4471900,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":733.261867,"checksum":5000,"gcCount":0,"gcMillis":0,"allocated":232835360,"latency":{"p50":147.941,"p99":253.056,"p99.9":337.442,"max":504.73},"bytesWritten":3295384,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":88424183,"millis":10000.17328,"checksum":0,"gcCount":4,"gcMillis":58,"allocated":4429395912,"latency":{"p50":0.638,"p99":1.298,"p99.9":4.869,"max":19017.848},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.17328,"checksum":0,"latency":{"p50":1016.87,"p99":6187.986,"p99.9":18720.271,"max":18720.271},"checked":false,"bytesWritten":12967460,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":112.595592,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":75964232,"bytesWritten":7365318,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":12.323208,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":126728,"bytesRead":0,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":15.110524,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":5128,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":78.508977,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":25599040},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":53.823624,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":31819128,"bytesRead":2737618,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":89885779,"millis":1000.0,"checksum":89885779},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1242.227493,"checksum":20000,"gcCount":1,"gcMillis":48,"allocated":800702960,"bytesWritten":19883733,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":816.100941,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":332965208,"bytesWritten":9909263,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":30.461033,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":4118256,"bytesRead":0,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":121400537,"millis":1000.0,"checksum":121400537},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.624378,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":82524400,"latency":{"p50":454.789,"p99":747.737,"p99.9":2654.009,"max":2654.009},"checked":false,"bytesWritten":7751825,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.763919,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":77799392,"latency":{"p50":490.332,"p99":812.872,"p99.9":1016.62,"max":1016.62},"checked":false,"bytesWritten":2085540,"logicalWritten":16000,"compactionMillis":24,"reclaimed":-2153805},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":97870169,"millis":1000.0,"checksum":97870169},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":127.956484,"checksum":1,"gcCount":1,"gcMillis":53,"allocated":68469712,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s1-async/hstore-4.json b/paper/results/s1-async/hstore-4.json new file mode 100644 index 0000000..79e28ce --- /dev/null +++ b/paper/results/s1-async/hstore-4.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4137156608,"retainedHeap":186899232,"bytesWritten":134618195,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1500.317879,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":708391336,"bytesWritten":15537408,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":3456.785616,"checksum":362757,"gcCount":2,"gcMillis":81,"allocated":2265535776,"bytesWritten":48778847,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":33.146608,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":121936,"bytesRead":0,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":44.841605,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4017128,"bytesRead":0,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":71.511587,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":63557840,"bytesRead":0,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":41.084584,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":3802304,"bytesRead":0,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":42.995932,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":1341776},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":46.719404,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":2507536,"latency":{"p50":0.413,"p99":0.843,"p99.9":1.222,"max":18.132}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":512.028695,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":252382568,"bytesWritten":4471900,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":725.197552,"checksum":5000,"gcCount":0,"gcMillis":0,"allocated":235650688,"latency":{"p50":140.143,"p99":237.658,"p99.9":352.414,"max":450.688},"bytesWritten":3295384,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":87150337,"millis":10000.142462,"checksum":0,"gcCount":4,"gcMillis":59,"allocated":4427584920,"latency":{"p50":0.649,"p99":1.301,"p99.9":5.551,"max":18594.032},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.142462,"checksum":0,"latency":{"p50":1137.407,"p99":6955.866,"p99.9":18011.993,"max":18011.993},"checked":false,"bytesWritten":13088614,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":115.957255,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":74952032,"bytesWritten":7248822,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":11.999321,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":126728,"bytesRead":0,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":15.178396,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":5128,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":81.126269,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":25596456},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":57.765752,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":32910336,"bytesRead":2737618,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":89871383,"millis":1000.0,"checksum":89871383},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1297.222785,"checksum":20000,"gcCount":1,"gcMillis":53,"allocated":788763472,"bytesWritten":19575023,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":871.373434,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":412756520,"bytesWritten":13828248,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":32.767085,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":4118256,"bytesRead":0,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":125015625,"millis":1000.0,"checksum":125015625},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.535677,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":79427112,"latency":{"p50":422.476,"p99":729.037,"p99.9":2678.383,"max":2678.383},"checked":false,"bytesWritten":6707717,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.440565,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":73869672,"latency":{"p50":405.261,"p99":588.931,"p99.9":803.068,"max":803.068},"checked":false,"bytesWritten":2085540,"logicalWritten":16000,"compactionMillis":13,"reclaimed":-2153797},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":100432056,"millis":1000.0,"checksum":100432056},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":80.739174,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":68953552,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s1-async/hstore-5.json b/paper/results/s1-async/hstore-5.json new file mode 100644 index 0000000..2fb41e1 --- /dev/null +++ b/paper/results/s1-async/hstore-5.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4108320768,"retainedHeap":189244480,"bytesWritten":140371646,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1457.232649,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":716293488,"bytesWritten":15537408,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":3431.379777,"checksum":362757,"gcCount":2,"gcMillis":80,"allocated":2287220104,"bytesWritten":48778847,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":27.205358,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":109936,"bytesRead":0,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":43.016486,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4017128,"bytesRead":0,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":64.57484,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":63557840,"bytesRead":0,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":36.052685,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":3802304,"bytesRead":0,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":85.467211,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":31453944},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":43.075477,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":9689376,"latency":{"p50":0.368,"p99":0.782,"p99.9":1.126,"max":34.636}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":491.186685,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":250582376,"bytesWritten":4471900,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":698.388236,"checksum":5000,"gcCount":1,"gcMillis":14,"allocated":242702760,"latency":{"p50":136.238,"p99":227.956,"p99.9":382.649,"max":13976.528},"bytesWritten":3295384,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":89794592,"millis":10000.145662,"checksum":0,"gcCount":4,"gcMillis":48,"allocated":4725209776,"latency":{"p50":0.604,"p99":1.242,"p99.9":5.422,"max":18021.277},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.145662,"checksum":0,"latency":{"p50":1139.694,"p99":5487.951,"p99.9":17684.829,"max":17684.829},"checked":false,"bytesWritten":13543593,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":102.911007,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":77153856,"bytesWritten":6940343,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":11.95564,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":126728,"bytesRead":0,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":14.897336,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":5128,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":68.589719,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":26395224},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":56.61977,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":31389984,"bytesRead":2737618,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":90023515,"millis":1000.0,"checksum":90023515},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1234.093977,"checksum":20000,"gcCount":1,"gcMillis":31,"allocated":785894328,"bytesWritten":24057913,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":872.145415,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":330251904,"bytesWritten":13803514,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":31.834777,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":1718256,"bytesRead":0,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":121288555,"millis":1000.0,"checksum":121288555},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.35705,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":80303376,"latency":{"p50":475.058,"p99":717.683,"p99.9":3728.459,"max":3728.459},"checked":false,"bytesWritten":7856512,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.521586,"checksum":0,"gcCount":1,"gcMillis":8,"allocated":75051640,"latency":{"p50":456.194,"p99":733.071,"p99.9":1110.397,"max":1110.397},"checked":false,"bytesWritten":2085540,"logicalWritten":16000,"compactionMillis":13,"reclaimed":-2153805},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":97868889,"millis":1000.0,"checksum":97868889},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":93.730845,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":69971720,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s1-async/hypergraphdb-1.json b/paper/results/s1-async/hypergraphdb-1.json new file mode 100644 index 0000000..2977f70 --- /dev/null +++ b/paper/results/s1-async/hypergraphdb-1.json @@ -0,0 +1 @@ +{"store":"HyperGraphDB","version":"1.4 @ 99485a1 (Berkeley DB JE 5.0.73)","cache":"Berkeley DB JE cache of 64 MiB plus the HyperGraphDB atom cache","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4191158272,"retainedHeap":124102144,"bytesWritten":3820664626,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":2562.377783,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":929558632,"bytesWritten":53194576,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":4694.841067,"checksum":362757,"gcCount":2,"gcMillis":88,"allocated":2980074016,"bytesWritten":237287914,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":76.584391,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":11505048,"bytesRead":11050904,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":60.347745,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4947368,"bytesRead":17638234,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":360.8272,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":158152656,"bytesRead":114733530,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":108.464648,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":18426456,"bytesRead":34807784,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":654.177748,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":688146616},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":197.941574,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":488149880,"latency":{"p50":1.55,"p99":4.997,"p99.9":12.146,"max":37.756}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":2530.065235,"checksum":20000,"gcCount":4,"gcMillis":47,"allocated":4175970960,"bytesWritten":186878390,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":782.215816,"checksum":5000,"gcCount":1,"gcMillis":12,"allocated":1501210736,"latency":{"p50":102.873,"p99":847.361,"p99.9":3338.15,"max":14081.701},"bytesWritten":72580431,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":11327908,"millis":10001.206378,"checksum":0,"gcCount":18,"gcMillis":234,"allocated":22069366776,"latency":{"p50":3.865,"p99":7.499,"p99.9":95.734,"max":388908.33},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10001.206378,"checksum":0,"latency":{"p50":4364.164,"p99":33380.155,"p99.9":44898.307,"max":44898.307},"checked":false,"bytesWritten":337679357,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":1112.225915,"checksum":50000,"gcCount":1,"gcMillis":13,"allocated":1824592256,"bytesWritten":98228969,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":56.679777,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":469128,"bytesRead":17137820,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":91.830255,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":10938536,"bytesRead":42853109,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":1143.031464,"checksum":1,"gcCount":2,"gcMillis":18,"allocated":1780779928},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":1352.541061,"checksum":831528,"gcCount":1,"gcMillis":28,"allocated":638042640,"bytesRead":494421900,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":383810068,"millis":1000.0,"checksum":383810068},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":3995.393209,"checksum":20000,"gcCount":5,"gcMillis":60,"allocated":7005429192,"bytesWritten":288333633,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":1998.12305,"checksum":20000,"gcCount":3,"gcMillis":35,"allocated":3584298952,"bytesWritten":162000600,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":76.949028,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":10442424,"bytesRead":10079610,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":313474318,"millis":1000.0,"checksum":313474318},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.545507,"checksum":0,"gcCount":8,"gcMillis":79,"allocated":10000299560,"latency":{"p50":546.763,"p99":4409.356,"p99.9":10033.468,"max":10033.468},"checked":false,"bytesWritten":607076185,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.656393,"checksum":0,"gcCount":7,"gcMillis":69,"allocated":9824381520,"latency":{"p50":552.838,"p99":4980.005,"p99.9":8335.8,"max":8335.8},"checked":false,"bytesWritten":600639514,"logicalWritten":16000,"compactionMillis":78,"reclaimed":67875203},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":270441083,"millis":1000.0,"checksum":270441083},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":106.97855,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":79810624,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s1-async/hypergraphdb-2.json b/paper/results/s1-async/hypergraphdb-2.json new file mode 100644 index 0000000..54c140e --- /dev/null +++ b/paper/results/s1-async/hypergraphdb-2.json @@ -0,0 +1 @@ +{"store":"HyperGraphDB","version":"1.4 @ 99485a1 (Berkeley DB JE 5.0.73)","cache":"Berkeley DB JE cache of 64 MiB plus the HyperGraphDB atom cache","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4174381056,"retainedHeap":124194552,"bytesWritten":3234573921,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":2530.647895,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":930501480,"bytesWritten":52966500,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":4856.811283,"checksum":362757,"gcCount":2,"gcMillis":92,"allocated":3007622216,"bytesWritten":237549583,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":80.273232,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":11628728,"bytesRead":18448641,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":57.849118,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4947368,"bytesRead":7342017,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":596.444236,"checksum":20287,"gcCount":1,"gcMillis":77,"allocated":162806912,"bytesRead":108048550,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":138.927587,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":18494320,"bytesRead":41047916,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":622.402996,"checksum":5852224,"gcCount":1,"gcMillis":19,"allocated":704943176},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":205.005034,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":489750392,"latency":{"p50":1.611,"p99":4.211,"p99.9":10.774,"max":233.355}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":2753.339232,"checksum":20000,"gcCount":4,"gcMillis":47,"allocated":4564950832,"bytesWritten":201305391,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":681.68457,"checksum":5000,"gcCount":1,"gcMillis":13,"allocated":1232554344,"latency":{"p50":93.742,"p99":757.733,"p99.9":2000.212,"max":13251.927},"bytesWritten":58711611,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":11308807,"millis":10001.39968,"checksum":0,"gcCount":18,"gcMillis":280,"allocated":21924454744,"latency":{"p50":3.844,"p99":7.414,"p99.9":100.404,"max":56911.816},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10001.39968,"checksum":0,"latency":{"p50":4511.919,"p99":33544.183,"p99.9":60383.839,"max":60383.839},"checked":false,"bytesWritten":330371693,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":1049.794882,"checksum":50000,"gcCount":1,"gcMillis":13,"allocated":1654153464,"bytesWritten":92588387,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":60.803282,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":469160,"bytesRead":15642525,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":98.922499,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":11153640,"bytesRead":44004595,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":977.798677,"checksum":1,"gcCount":1,"gcMillis":10,"allocated":1584396544},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":1478.492196,"checksum":831528,"gcCount":2,"gcMillis":36,"allocated":650042000,"bytesRead":556696853,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":426749230,"millis":1000.0,"checksum":426749230},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":3838.713918,"checksum":20000,"gcCount":5,"gcMillis":77,"allocated":6471153928,"bytesWritten":255027005,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":1751.102896,"checksum":20000,"gcCount":3,"gcMillis":41,"allocated":3200884120,"bytesWritten":143479475,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":72.204534,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":11376976,"bytesRead":17816050,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":309139670,"millis":1000.0,"checksum":309139670},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.3594,"checksum":0,"gcCount":6,"gcMillis":76,"allocated":6758844936,"latency":{"p50":470.674,"p99":4811.436,"p99.9":18629.705,"max":18629.705},"checked":false,"bytesWritten":402394118,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.34784,"checksum":0,"gcCount":3,"gcMillis":36,"allocated":4217413280,"latency":{"p50":349.938,"p99":3767.865,"p99.9":6982.779,"max":6982.779},"checked":false,"bytesWritten":250582469,"logicalWritten":16000,"compactionMillis":57,"reclaimed":-8018621},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":229654339,"millis":1000.0,"checksum":229654339},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":114.475933,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":83348616,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s1-async/hypergraphdb-3.json b/paper/results/s1-async/hypergraphdb-3.json new file mode 100644 index 0000000..61c0f30 --- /dev/null +++ b/paper/results/s1-async/hypergraphdb-3.json @@ -0,0 +1 @@ +{"store":"HyperGraphDB","version":"1.4 @ 99485a1 (Berkeley DB JE 5.0.73)","cache":"Berkeley DB JE cache of 64 MiB plus the HyperGraphDB atom cache","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4179623936,"retainedHeap":124063320,"bytesWritten":3736417476,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":2541.255013,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":930710968,"bytesWritten":53077368,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":4785.735094,"checksum":362757,"gcCount":2,"gcMillis":88,"allocated":3019642864,"bytesWritten":238737588,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":71.673485,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":11467632,"bytesRead":15650180,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":67.693923,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4947368,"bytesRead":17868030,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":436.385538,"checksum":20287,"gcCount":1,"gcMillis":58,"allocated":160466240,"bytesRead":126836658,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":119.566231,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":18425944,"bytesRead":47399488,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":624.008698,"checksum":5852224,"gcCount":1,"gcMillis":20,"allocated":792756760},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":173.772208,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":393980848,"latency":{"p50":1.369,"p99":4.738,"p99.9":12.204,"max":26.895}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":2947.069933,"checksum":20000,"gcCount":4,"gcMillis":47,"allocated":4880585960,"bytesWritten":219449928,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":596.350621,"checksum":5000,"gcCount":1,"gcMillis":11,"allocated":1106344144,"latency":{"p50":81.395,"p99":755.982,"p99.9":1586.023,"max":12848.118},"bytesWritten":53885457,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":11528896,"millis":10000.561161,"checksum":0,"gcCount":19,"gcMillis":389,"allocated":22727228576,"latency":{"p50":3.579,"p99":6.98,"p99.9":59.239,"max":851393.534},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.561161,"checksum":0,"latency":{"p50":3957.673,"p99":27913.797,"p99.9":36278.786,"max":36278.786},"checked":false,"bytesWritten":373552744,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":871.838541,"checksum":50000,"gcCount":1,"gcMillis":12,"allocated":1386659648,"bytesWritten":80432774,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":55.466172,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":462728,"bytesRead":20539044,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":94.712025,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":10448368,"bytesRead":35898294,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":918.938378,"checksum":1,"gcCount":1,"gcMillis":9,"allocated":1356069688},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":1504.126575,"checksum":831528,"gcCount":2,"gcMillis":47,"allocated":647148400,"bytesRead":559165703,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":419014273,"millis":1000.0,"checksum":419014273},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":3861.885069,"checksum":20000,"gcCount":5,"gcMillis":65,"allocated":6679974824,"bytesWritten":270113824,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":1862.573755,"checksum":20000,"gcCount":2,"gcMillis":27,"allocated":3320776648,"bytesWritten":152637946,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":86.901954,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":10928728,"bytesRead":10832257,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":233309897,"millis":1000.0,"checksum":233309897},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.696348,"checksum":0,"gcCount":5,"gcMillis":50,"allocated":6713486880,"latency":{"p50":519.053,"p99":3028.676,"p99.9":6040.283,"max":6040.283},"checked":false,"bytesWritten":415199528,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.637288,"checksum":0,"gcCount":8,"gcMillis":98,"allocated":10200433104,"latency":{"p50":563.233,"p99":5169.761,"p99.9":19607.851,"max":19607.851},"checked":false,"bytesWritten":618312003,"logicalWritten":16000,"compactionMillis":66,"reclaimed":16328401},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":245352934,"millis":1000.0,"checksum":245352934},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":121.938475,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":83727024,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s1-async/hypergraphdb-4.json b/paper/results/s1-async/hypergraphdb-4.json new file mode 100644 index 0000000..0ed4f09 --- /dev/null +++ b/paper/results/s1-async/hypergraphdb-4.json @@ -0,0 +1 @@ +{"store":"HyperGraphDB","version":"1.4 @ 99485a1 (Berkeley DB JE 5.0.73)","cache":"Berkeley DB JE cache of 64 MiB plus the HyperGraphDB atom cache","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4167041024,"retainedHeap":124489384,"bytesWritten":3408446206,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":2574.708232,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":930941976,"bytesWritten":53027112,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":4679.285399,"checksum":362757,"gcCount":2,"gcMillis":87,"allocated":2902260536,"bytesWritten":232477068,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":118.689523,"checksum":731528,"gcCount":1,"gcMillis":24,"allocated":11693648,"bytesRead":12605968,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":57.948366,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4947368,"bytesRead":9364841,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":401.226451,"checksum":20287,"gcCount":1,"gcMillis":58,"allocated":160421360,"bytesRead":95448796,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":115.352749,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":18427816,"bytesRead":36174403,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":658.795626,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":740729008},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":249.537791,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":498240704,"latency":{"p50":1.85,"p99":6.133,"p99.9":15.599,"max":310.579}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":2760.075076,"checksum":20000,"gcCount":4,"gcMillis":43,"allocated":4121317984,"bytesWritten":184997794,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":710.195826,"checksum":5000,"gcCount":1,"gcMillis":13,"allocated":1150252912,"latency":{"p50":101.609,"p99":776.294,"p99.9":1782.042,"max":12811.44},"bytesWritten":57083913,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":11014871,"millis":10012.036509,"checksum":0,"gcCount":18,"gcMillis":241,"allocated":21658997680,"latency":{"p50":3.721,"p99":7.526,"p99.9":82.223,"max":359487.467},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10012.036509,"checksum":0,"latency":{"p50":4193.78,"p99":28513.717,"p99.9":54715.053,"max":54715.053},"checked":false,"bytesWritten":334762200,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":1124.425069,"checksum":50000,"gcCount":1,"gcMillis":15,"allocated":1992488040,"bytesWritten":104151399,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":58.11979,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":462728,"bytesRead":25904713,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":101.011876,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":10548840,"bytesRead":38003952,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":1132.230974,"checksum":1,"gcCount":2,"gcMillis":17,"allocated":1851496400},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":1484.556652,"checksum":831528,"gcCount":2,"gcMillis":56,"allocated":625240632,"bytesRead":557306303,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":443095915,"millis":1000.0,"checksum":443095915},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":3861.492069,"checksum":20000,"gcCount":6,"gcMillis":72,"allocated":6426895384,"bytesWritten":252540015,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":1862.243122,"checksum":20000,"gcCount":3,"gcMillis":44,"allocated":3374269592,"bytesWritten":150803362,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":79.858422,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":10232544,"bytesRead":12336934,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":307246281,"millis":1000.0,"checksum":307246281},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.571648,"checksum":0,"gcCount":9,"gcMillis":85,"allocated":10333792560,"latency":{"p50":581.5,"p99":3878.036,"p99.9":7742.619,"max":7742.619},"checked":false,"bytesWritten":622185356,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.526973,"checksum":0,"gcCount":3,"gcMillis":43,"allocated":3864311488,"latency":{"p50":454.591,"p99":1353.94,"p99.9":19265.653,"max":19265.653},"checked":false,"bytesWritten":221866373,"logicalWritten":16000,"compactionMillis":75,"reclaimed":78089239},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":272121984,"millis":1000.0,"checksum":272121984},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":113.100705,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":81902056,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s1-async/hypergraphdb-5.json b/paper/results/s1-async/hypergraphdb-5.json new file mode 100644 index 0000000..4348861 --- /dev/null +++ b/paper/results/s1-async/hypergraphdb-5.json @@ -0,0 +1 @@ +{"store":"HyperGraphDB","version":"1.4 @ 99485a1 (Berkeley DB JE 5.0.73)","cache":"Berkeley DB JE cache of 64 MiB plus the HyperGraphDB atom cache","scale":1,"durability":"async","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4209508352,"retainedHeap":124038880,"bytesWritten":48094887807,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":2552.856838,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":927593480,"bytesWritten":53056729,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":4705.457829,"checksum":362757,"gcCount":2,"gcMillis":86,"allocated":2947318648,"bytesWritten":235543699,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":104.4917,"checksum":731528,"gcCount":1,"gcMillis":21,"allocated":11589232,"bytesRead":10205074,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":83.692429,"checksum":363372,"gcCount":1,"gcMillis":22,"allocated":4947368,"bytesRead":14629862,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":333.599112,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":160374688,"bytesRead":115818206,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":127.110473,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":18420800,"bytesRead":39455529,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":594.768629,"checksum":5852224,"gcCount":1,"gcMillis":10,"allocated":723395168},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":188.417746,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":459690696,"latency":{"p50":1.503,"p99":4.5,"p99.9":11.507,"max":30.326}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":2581.125721,"checksum":20000,"gcCount":4,"gcMillis":45,"allocated":4041634168,"bytesWritten":182076761,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":642.975522,"checksum":5000,"gcCount":1,"gcMillis":10,"allocated":1113298824,"latency":{"p50":89.282,"p99":767.138,"p99.9":1728.799,"max":11480.24},"bytesWritten":54010168,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":11954299,"millis":10002.425901,"checksum":0,"gcCount":19,"gcMillis":227,"allocated":23055879152,"latency":{"p50":3.619,"p99":6.922,"p99.9":94.053,"max":92595.967},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10002.425901,"checksum":0,"latency":{"p50":4401.614,"p99":24580.448,"p99.9":34857.238,"max":34857.238},"checked":false,"bytesWritten":336942788,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":971.304887,"checksum":50000,"gcCount":1,"gcMillis":12,"allocated":1624810624,"bytesWritten":90261839,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":63.167829,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":469128,"bytesRead":26282225,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":105.127051,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":10901440,"bytesRead":30548469,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":819.798881,"checksum":1,"gcCount":1,"gcMillis":10,"allocated":1328599608},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":1448.665586,"checksum":831528,"gcCount":2,"gcMillis":47,"allocated":639620760,"bytesRead":552798696,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":382084065,"millis":1000.0,"checksum":382084065},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":3677.273539,"checksum":20000,"gcCount":5,"gcMillis":73,"allocated":6212982104,"bytesWritten":255530433,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":1798.887652,"checksum":20000,"gcCount":2,"gcMillis":25,"allocated":3418429512,"bytesWritten":152420528,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":73.084901,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":10299136,"bytesRead":22745781,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":283574352,"millis":1000.0,"checksum":283574352},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.381151,"checksum":0,"gcCount":2,"gcMillis":28,"allocated":2327698544,"latency":{"p50":343.588,"p99":1631.997,"p99.9":15873.605,"max":15873.605},"checked":false,"bytesWritten":127041280,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":38125,"millis":762480.41953,"checksum":0,"gcCount":579,"gcMillis":4805,"allocated":756699783032,"latency":{"p50":480.488,"p99":4897.633,"p99.9":9523.818,"max":14580.752},"checked":false,"bytesWritten":45366383938,"logicalWritten":1220000,"compactionMillis":761468,"reclaimed":-10383169},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":232505811,"millis":1000.0,"checksum":232505811},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":108.883676,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":80389272,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s1-sync/hstore-1.json b/paper/results/s1-sync/hstore-1.json new file mode 100644 index 0000000..e3f1eb4 --- /dev/null +++ b/paper/results/s1-sync/hstore-1.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"sync","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4074242048,"retainedHeap":184243472,"bytesWritten":140324788,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1473.431782,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":713991656,"bytesWritten":15537408,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":3590.873606,"checksum":362757,"gcCount":2,"gcMillis":80,"allocated":2256377584,"bytesWritten":48778847,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":26.918789,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":109936,"bytesRead":0,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":40.818601,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4017128,"bytesRead":0,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":75.146393,"checksum":20287,"gcCount":1,"gcMillis":2,"allocated":67946192,"bytesRead":0,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":39.184639,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":3802304,"bytesRead":0,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":130.206347,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":33106136},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":45.174542,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":9689808,"latency":{"p50":0.401,"p99":0.818,"p99.9":1.113,"max":12.159}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":480.546435,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":247696848,"bytesWritten":4471900,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":2462.192834,"checksum":5000,"gcCount":1,"gcMillis":13,"allocated":224829672,"latency":{"p50":471.796,"p99":848.396,"p99.9":1540.24,"max":13468.373},"bytesWritten":3295384,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":92275831,"millis":10000.21038,"checksum":0,"gcCount":4,"gcMillis":62,"allocated":4438835992,"latency":{"p50":0.613,"p99":1.221,"p99.9":4.865,"max":20921.498},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.21038,"checksum":0,"latency":{"p50":1400.892,"p99":6275.391,"p99.9":15128.866,"max":15128.866},"checked":false,"bytesWritten":13689175,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":122.468142,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":73620264,"bytesWritten":6675071,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":11.976906,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":126728,"bytesRead":0,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":14.868462,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":5128,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":79.44377,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":24956472},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":49.551104,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":30761400,"bytesRead":2737618,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":89915571,"millis":1000.0,"checksum":89915571},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1286.395825,"checksum":20000,"gcCount":1,"gcMillis":44,"allocated":825845448,"bytesWritten":24006047,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":821.351727,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":332320912,"bytesWritten":13803514,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":23.487477,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":1718256,"bytesRead":0,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":129498614,"millis":1000.0,"checksum":129498614},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.955858,"checksum":0,"gcCount":1,"gcMillis":63,"allocated":82001104,"latency":{"p50":1127.441,"p99":4077.573,"p99.9":45599.32,"max":45599.32},"checked":false,"bytesWritten":7981210,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9981.260537,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":75467384,"latency":{"p50":1050.623,"p99":1694.05,"p99.9":4194.8,"max":4194.8},"checked":false,"bytesWritten":2085540,"logicalWritten":16000,"compactionMillis":13,"reclaimed":-2153805},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":97803345,"millis":1000.0,"checksum":97803345},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":86.602517,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":67318424,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s1-sync/hstore-2.json b/paper/results/s1-sync/hstore-2.json new file mode 100644 index 0000000..40aa941 --- /dev/null +++ b/paper/results/s1-sync/hstore-2.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"sync","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4098883584,"retainedHeap":186440104,"bytesWritten":132057048,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1397.394261,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":704269008,"bytesWritten":15537408,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":3392.391594,"checksum":362757,"gcCount":2,"gcMillis":77,"allocated":2256796856,"bytesWritten":48778847,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":27.945453,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":121936,"bytesRead":0,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":36.957813,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4017128,"bytesRead":0,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":65.795296,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":62325104,"bytesRead":0,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":37.453349,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":3802304,"bytesRead":0,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":44.427418,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":1353912},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":37.321869,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":4907536,"latency":{"p50":0.319,"p99":0.662,"p99.9":0.891,"max":10.617}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":470.264008,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":257605000,"bytesWritten":4471900,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":2811.938252,"checksum":5000,"gcCount":0,"gcMillis":0,"allocated":226043904,"latency":{"p50":537.591,"p99":1000.999,"p99.9":1365.785,"max":2947.053},"bytesWritten":3295384,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":93245820,"millis":10000.16641,"checksum":0,"gcCount":5,"gcMillis":79,"allocated":4647884056,"latency":{"p50":0.606,"p99":1.223,"p99.9":4.946,"max":21320.472},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.16641,"checksum":0,"latency":{"p50":1369.998,"p99":7208.852,"p99.9":21797.084,"max":21797.084},"checked":false,"bytesWritten":13095504,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":123.678095,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":75505136,"bytesWritten":7195990,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":11.983876,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":126728,"bytesRead":0,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":15.110156,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":5128,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":77.9519,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":24953424},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":51.410654,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":31883016,"bytesRead":2737618,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":89828100,"millis":1000.0,"checksum":89828100},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1224.197624,"checksum":20000,"gcCount":1,"gcMillis":44,"allocated":806010832,"bytesWritten":19937284,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":847.639499,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":344776552,"bytesWritten":9909263,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":20.352251,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":4118256,"bytesRead":0,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":121395844,"millis":1000.0,"checksum":121395844},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9981.052555,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":81148304,"latency":{"p50":1121.162,"p99":1694.482,"p99.9":2933.596,"max":2933.596},"checked":false,"bytesWritten":7749236,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.947204,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":76642376,"latency":{"p50":928.433,"p99":1829.758,"p99.9":22168.065,"max":22168.065},"checked":false,"bytesWritten":2085540,"logicalWritten":16000,"compactionMillis":11,"reclaimed":-2153805},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":97870169,"millis":1000.0,"checksum":97870169},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":77.129961,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":68416776,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s1-sync/hstore-3.json b/paper/results/s1-sync/hstore-3.json new file mode 100644 index 0000000..fc0841a --- /dev/null +++ b/paper/results/s1-sync/hstore-3.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"sync","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4118806528,"retainedHeap":188750512,"bytesWritten":148864966,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1484.770584,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":710510976,"bytesWritten":15537408,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":3651.872478,"checksum":362757,"gcCount":2,"gcMillis":81,"allocated":2239599752,"bytesWritten":48778847,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":32.249285,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":109936,"bytesRead":0,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":44.13141,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4017128,"bytesRead":0,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":71.167865,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":62805104,"bytesRead":0,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":40.238097,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":3802304,"bytesRead":0,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":47.549842,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":1366320},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":46.331563,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":2507536,"latency":{"p50":0.41,"p99":0.837,"p99.9":1.227,"max":23.335}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":488.389082,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":245665408,"bytesWritten":4471900,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":2874.299149,"checksum":5000,"gcCount":0,"gcMillis":0,"allocated":230546120,"latency":{"p50":536.955,"p99":1037.477,"p99.9":1565.993,"max":41246.265},"bytesWritten":3295384,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":88001560,"millis":10000.164938,"checksum":0,"gcCount":4,"gcMillis":59,"allocated":4347548432,"latency":{"p50":0.647,"p99":1.315,"p99.9":6.137,"max":18240.614},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.164938,"checksum":0,"latency":{"p50":1435.589,"p99":9381.448,"p99.9":19231.158,"max":19231.158},"checked":false,"bytesWritten":14009921,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":121.595232,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":77203760,"bytesWritten":9269922,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":12.239518,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":126728,"bytesRead":0,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":14.618809,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":5128,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":86.046968,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":25738664},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":52.846053,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":31208760,"bytesRead":2737618,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":92841899,"millis":1000.0,"checksum":92841899},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1236.038195,"checksum":20000,"gcCount":1,"gcMillis":40,"allocated":811957328,"bytesWritten":24027153,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":918.724073,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":365303712,"bytesWritten":17525897,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":32.788026,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":4118256,"bytesRead":0,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":127816048,"millis":1000.0,"checksum":127816048},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9981.268554,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":83968584,"latency":{"p50":1164.746,"p99":2107.944,"p99.9":3604.939,"max":3604.939},"checked":false,"bytesWritten":9862302,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9981.063854,"checksum":0,"gcCount":1,"gcMillis":61,"allocated":76805984,"latency":{"p50":1141.737,"p99":2604.896,"p99.9":61710.86,"max":61710.86},"checked":false,"bytesWritten":2085540,"logicalWritten":16000,"compactionMillis":13,"reclaimed":-2153804},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":98018896,"millis":1000.0,"checksum":98018896},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":78.27176,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":67758608,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s1-sync/hstore-4.json b/paper/results/s1-sync/hstore-4.json new file mode 100644 index 0000000..8401ccd --- /dev/null +++ b/paper/results/s1-sync/hstore-4.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"sync","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4166516736,"retainedHeap":189945224,"bytesWritten":133246102,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1451.202731,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":705279248,"bytesWritten":15537408,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":3668.053799,"checksum":362757,"gcCount":2,"gcMillis":84,"allocated":2254307536,"bytesWritten":48778847,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":26.841586,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":109936,"bytesRead":0,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":39.753943,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4017128,"bytesRead":0,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":73.024463,"checksum":20287,"gcCount":1,"gcMillis":2,"allocated":67946192,"bytesRead":0,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":38.974505,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":3802304,"bytesRead":0,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":47.33773,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":1309584},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":46.206024,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":4907536,"latency":{"p50":0.409,"p99":0.825,"p99.9":1.183,"max":13.818}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":480.622682,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":249399072,"bytesWritten":4471900,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":2933.323063,"checksum":5000,"gcCount":1,"gcMillis":12,"allocated":228063816,"latency":{"p50":545.1,"p99":1159.685,"p99.9":2027.064,"max":16869.961},"bytesWritten":3295384,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":91007837,"millis":10000.179062,"checksum":0,"gcCount":4,"gcMillis":63,"allocated":4471804360,"latency":{"p50":0.62,"p99":1.253,"p99.9":5.464,"max":21688.128},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.179062,"checksum":0,"latency":{"p50":1474.976,"p99":9375.826,"p99.9":24242.221,"max":24242.221},"checked":false,"bytesWritten":13938840,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":115.507708,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":76979584,"bytesWritten":9280443,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":11.949208,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":126728,"bytesRead":0,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":15.323902,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":6405128,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":80.905308,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":25739040},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":51.040694,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":31204272,"bytesRead":2737618,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":92784623,"millis":1000.0,"checksum":92784623},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1188.291246,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":724028776,"bytesWritten":19228408,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":880.01942,"checksum":20000,"gcCount":1,"gcMillis":67,"allocated":310685168,"bytesWritten":9925897,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":29.12405,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":1718256,"bytesRead":0,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":123651631,"millis":1000.0,"checksum":123651631},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9981.276672,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":81253656,"latency":{"p50":1132.253,"p99":1699.477,"p99.9":3118.294,"max":3118.294},"checked":false,"bytesWritten":6702743,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9981.1515,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":76820072,"latency":{"p50":1023.475,"p99":1570.829,"p99.9":2507.753,"max":2507.753},"checked":false,"bytesWritten":2085540,"logicalWritten":16000,"compactionMillis":11,"reclaimed":-2153803},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":99058201,"millis":1000.0,"checksum":99058201},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":77.729401,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":66904416,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s1-sync/hstore-5.json b/paper/results/s1-sync/hstore-5.json new file mode 100644 index 0000000..313075e --- /dev/null +++ b/paper/results/s1-sync/hstore-5.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":1,"durability":"sync","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4059037696,"retainedHeap":188409336,"bytesWritten":140373759,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":1489.078548,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":706349792,"bytesWritten":15537408,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":3503.723916,"checksum":362757,"gcCount":2,"gcMillis":82,"allocated":2289384032,"bytesWritten":48778847,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":25.71552,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":121936,"bytesRead":0,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":41.955182,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4017128,"bytesRead":0,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":65.763314,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":64517840,"bytesRead":0,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":38.220357,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":3802304,"bytesRead":0,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":85.981565,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":32427480},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":43.112687,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":9689376,"latency":{"p50":0.369,"p99":0.812,"p99.9":1.2,"max":12.518}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":479.430259,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":251519096,"bytesWritten":4471900,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":2514.976569,"checksum":5000,"gcCount":0,"gcMillis":0,"allocated":229345208,"latency":{"p50":480.792,"p99":896.607,"p99.9":1375.085,"max":3716.273},"bytesWritten":3295384,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":91166668,"millis":10000.183375,"checksum":0,"gcCount":4,"gcMillis":49,"allocated":4487321016,"latency":{"p50":0.61,"p99":1.285,"p99.9":5.961,"max":16733.933},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.183375,"checksum":0,"latency":{"p50":1456.02,"p99":6452.818,"p99.9":18065.051,"max":18065.051},"checked":false,"bytesWritten":17019152,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":105.561584,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":78968904,"bytesWritten":3411588,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":12.305906,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":126728,"bytesRead":0,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":15.87852,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":6405128,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":80.418261,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":25616768},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":51.68707,"checksum":831528,"gcCount":0,"gcMillis":0,"allocated":28606192,"bytesRead":2737618,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":89972717,"millis":1000.0,"checksum":89972717},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":1215.582117,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":801463952,"bytesWritten":24023974,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":839.33301,"checksum":20000,"gcCount":1,"gcMillis":35,"allocated":406263808,"bytesWritten":13821655,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":29.080389,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":1718256,"bytesRead":0,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":121217151,"millis":1000.0,"checksum":121217151},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9981.57859,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":80280248,"latency":{"p50":1236.255,"p99":2233.143,"p99.9":4047.169,"max":4047.169},"checked":false,"bytesWritten":7927619,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9981.092803,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":75871392,"latency":{"p50":1167.261,"p99":1996.424,"p99.9":5307.529,"max":5307.529},"checked":false,"bytesWritten":2085540,"logicalWritten":16000,"compactionMillis":13,"reclaimed":-2153805},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":97870157,"millis":1000.0,"checksum":97870157},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":77.068474,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":70188608,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s1-sync/hypergraphdb-1.json b/paper/results/s1-sync/hypergraphdb-1.json new file mode 100644 index 0000000..287c1dd --- /dev/null +++ b/paper/results/s1-sync/hypergraphdb-1.json @@ -0,0 +1 @@ +{"store":"HyperGraphDB","version":"1.4 @ 99485a1 (Berkeley DB JE 5.0.73)","cache":"Berkeley DB JE cache of 64 MiB plus the HyperGraphDB atom cache","scale":1,"durability":"sync","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4193255424,"retainedHeap":124439136,"bytesWritten":3403659781,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":2475.706852,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":931325216,"bytesWritten":52911985,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":4643.115225,"checksum":362757,"gcCount":2,"gcMillis":84,"allocated":2966527456,"bytesWritten":235205749,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":84.651756,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":10637792,"bytesRead":9929215,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":60.926521,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4947368,"bytesRead":16330539,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":404.758383,"checksum":20287,"gcCount":1,"gcMillis":56,"allocated":160399976,"bytesRead":93322265,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":128.53909,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":18428848,"bytesRead":45975356,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":660.132127,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":716238376},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":162.073159,"checksum":731528,"gcCount":1,"gcMillis":10,"allocated":329376648,"latency":{"p50":1.162,"p99":4.162,"p99.9":9.633,"max":23.454}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":2768.455879,"checksum":20000,"gcCount":4,"gcMillis":45,"allocated":4811065632,"bytesWritten":219006071,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":3475.528977,"checksum":5000,"gcCount":5,"gcMillis":43,"allocated":6218594592,"latency":{"p50":628.189,"p99":1513.234,"p99.9":3700.841,"max":11086.323},"bytesWritten":294172318,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":11857959,"millis":10000.616779,"checksum":0,"gcCount":19,"gcMillis":216,"allocated":22663428424,"latency":{"p50":3.787,"p99":7.278,"p99.9":83.454,"max":20138.581},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.616779,"checksum":0,"latency":{"p50":4795.487,"p99":29540.157,"p99.9":36325.236,"max":36325.236},"checked":false,"bytesWritten":362561892,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":807.780565,"checksum":50000,"gcCount":1,"gcMillis":14,"allocated":1166422816,"bytesWritten":73188256,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":53.918481,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":469128,"bytesRead":29219118,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":106.582445,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":10744432,"bytesRead":33509639,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":1043.815455,"checksum":1,"gcCount":2,"gcMillis":18,"allocated":1700161664},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":1454.386441,"checksum":831528,"gcCount":2,"gcMillis":55,"allocated":642192872,"bytesRead":461509485,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":403459062,"millis":1000.0,"checksum":403459062},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":3484.739568,"checksum":20000,"gcCount":5,"gcMillis":63,"allocated":6271527048,"bytesWritten":258137259,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":1739.342121,"checksum":20000,"gcCount":2,"gcMillis":27,"allocated":3157854824,"bytesWritten":147411761,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":75.579821,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":12625880,"bytesRead":18006238,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":224754817,"millis":1000.0,"checksum":224754817},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9981.050179,"checksum":0,"gcCount":4,"gcMillis":55,"allocated":4610467784,"latency":{"p50":1126.863,"p99":3844.342,"p99.9":19435.976,"max":19435.976},"checked":false,"bytesWritten":284217307,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.778863,"checksum":0,"gcCount":2,"gcMillis":30,"allocated":3189273984,"latency":{"p50":1118.811,"p99":2593.571,"p99.9":12047.714,"max":12047.714},"checked":false,"bytesWritten":196940675,"logicalWritten":16000,"compactionMillis":42,"reclaimed":3018842},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":266763213,"millis":1000.0,"checksum":266763213},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":98.89641,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":68789064,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s1-sync/hypergraphdb-2.json b/paper/results/s1-sync/hypergraphdb-2.json new file mode 100644 index 0000000..1d56bb9 --- /dev/null +++ b/paper/results/s1-sync/hypergraphdb-2.json @@ -0,0 +1 @@ +{"store":"HyperGraphDB","version":"1.4 @ 99485a1 (Berkeley DB JE 5.0.73)","cache":"Berkeley DB JE cache of 64 MiB plus the HyperGraphDB atom cache","scale":1,"durability":"sync","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4152885248,"retainedHeap":124035560,"bytesWritten":3369071267,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":2480.41857,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":925516664,"bytesWritten":53085291,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":4811.715681,"checksum":362757,"gcCount":2,"gcMillis":91,"allocated":2986605208,"bytesWritten":237640961,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":98.293955,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":11192976,"bytesRead":22599085,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":67.994387,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4947368,"bytesRead":17274272,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":325.490192,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":158137504,"bytesRead":101726006,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":115.97422,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":18427616,"bytesRead":32475517,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":587.563521,"checksum":5852224,"gcCount":1,"gcMillis":18,"allocated":812924664},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":169.712851,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":378494832,"latency":{"p50":1.312,"p99":4.679,"p99.9":12.344,"max":30.589}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":2117.459486,"checksum":20000,"gcCount":3,"gcMillis":37,"allocated":3185240080,"bytesWritten":148526378,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":3651.996781,"checksum":5000,"gcCount":6,"gcMillis":50,"allocated":6469207144,"latency":{"p50":642.872,"p99":1829.342,"p99.9":8676.006,"max":32475.074},"bytesWritten":296903215,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":11440878,"millis":10013.522917,"checksum":0,"gcCount":18,"gcMillis":272,"allocated":22477828656,"latency":{"p50":3.722,"p99":7.921,"p99.9":99.78,"max":649602.575},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10013.522917,"checksum":0,"latency":{"p50":5180.36,"p99":28123.36,"p99.9":42165.195,"max":42165.195},"checked":false,"bytesWritten":367306620,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":901.846983,"checksum":50000,"gcCount":1,"gcMillis":13,"allocated":1232493352,"bytesWritten":72926277,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":56.985527,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":462728,"bytesRead":24424655,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":111.200601,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":10528512,"bytesRead":35309704,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":1055.650589,"checksum":1,"gcCount":1,"gcMillis":10,"allocated":1637648600},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":1585.598027,"checksum":831528,"gcCount":2,"gcMillis":54,"allocated":675573824,"bytesRead":519405683,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":351634735,"millis":1000.0,"checksum":351634735},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":3529.801522,"checksum":20000,"gcCount":5,"gcMillis":88,"allocated":5670679056,"bytesWritten":236437919,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":1713.49843,"checksum":20000,"gcCount":3,"gcMillis":41,"allocated":3047788656,"bytesWritten":138757417,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":78.319301,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":10580664,"bytesRead":17384975,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":244859084,"millis":1000.0,"checksum":244859084},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9981.08,"checksum":0,"gcCount":4,"gcMillis":53,"allocated":4472561896,"latency":{"p50":1270.74,"p99":3245.273,"p99.9":18739.539,"max":18739.539},"checked":false,"bytesWritten":272270281,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9981.841113,"checksum":0,"gcCount":4,"gcMillis":68,"allocated":4747617040,"latency":{"p50":1313.972,"p99":4766.099,"p99.9":18915.642,"max":18915.642},"checked":false,"bytesWritten":294167218,"logicalWritten":16000,"compactionMillis":49,"reclaimed":5790279},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":270531064,"millis":1000.0,"checksum":270531064},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":108.731449,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":80694280,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s1-sync/hypergraphdb-3.json b/paper/results/s1-sync/hypergraphdb-3.json new file mode 100644 index 0000000..d65db2d --- /dev/null +++ b/paper/results/s1-sync/hypergraphdb-3.json @@ -0,0 +1 @@ +{"store":"HyperGraphDB","version":"1.4 @ 99485a1 (Berkeley DB JE 5.0.73)","cache":"Berkeley DB JE cache of 64 MiB plus the HyperGraphDB atom cache","scale":1,"durability":"sync","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4197974016,"retainedHeap":124025720,"bytesWritten":3591999730,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":2550.185473,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":930359856,"bytesWritten":53117954,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":4765.538711,"checksum":362757,"gcCount":2,"gcMillis":85,"allocated":3027067592,"bytesWritten":239493553,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":94.504284,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":10937400,"bytesRead":15303974,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":67.800342,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4947368,"bytesRead":24479489,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":334.206624,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":163834056,"bytesRead":76411492,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":134.966383,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":18421152,"bytesRead":42609315,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":503.950551,"checksum":5852224,"gcCount":1,"gcMillis":22,"allocated":701284376},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":221.623031,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":430596416,"latency":{"p50":1.663,"p99":6.744,"p99.9":16.906,"max":420.946}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":2877.587528,"checksum":20000,"gcCount":4,"gcMillis":42,"allocated":4477598224,"bytesWritten":192018991,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":3779.355824,"checksum":5000,"gcCount":6,"gcMillis":53,"allocated":7002269520,"latency":{"p50":673.575,"p99":1861.633,"p99.9":7715.403,"max":14202.956},"bytesWritten":317080663,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":11671957,"millis":10000.301291,"checksum":0,"gcCount":18,"gcMillis":329,"allocated":23005696472,"latency":{"p50":3.642,"p99":7.246,"p99.9":66.926,"max":739712.926},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.301291,"checksum":0,"latency":{"p50":4933.292,"p99":32567.454,"p99.9":37702.25,"max":37702.25},"checked":false,"bytesWritten":362888826,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":813.149435,"checksum":50000,"gcCount":1,"gcMillis":12,"allocated":1154697864,"bytesWritten":69986096,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":49.592889,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":481928,"bytesRead":22991152,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":106.393062,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":10670776,"bytesRead":36505064,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":995.298029,"checksum":1,"gcCount":1,"gcMillis":9,"allocated":1678172936},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":1444.713723,"checksum":831528,"gcCount":2,"gcMillis":43,"allocated":631628480,"bytesRead":543529274,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":444222543,"millis":1000.0,"checksum":444222543},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":3654.89324,"checksum":20000,"gcCount":5,"gcMillis":72,"allocated":6271818888,"bytesWritten":249388373,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":1905.947967,"checksum":20000,"gcCount":3,"gcMillis":37,"allocated":3626505248,"bytesWritten":164137445,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":76.908041,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":10332008,"bytesRead":11226061,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":245762023,"millis":1000.0,"checksum":245762023},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9981.007318,"checksum":0,"gcCount":2,"gcMillis":24,"allocated":2767086288,"latency":{"p50":1242.089,"p99":3810.978,"p99.9":10952.869,"max":10952.869},"checked":false,"bytesWritten":164445439,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9982.089479,"checksum":0,"gcCount":8,"gcMillis":105,"allocated":9712135984,"latency":{"p50":1530.517,"p99":5853.99,"p99.9":18418.224,"max":18418.224},"checked":false,"bytesWritten":610156665,"logicalWritten":16000,"compactionMillis":48,"reclaimed":-69706257},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":214328576,"millis":1000.0,"checksum":214328576},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":119.959189,"checksum":1,"gcCount":1,"gcMillis":11,"allocated":81736168,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s1-sync/hypergraphdb-4.json b/paper/results/s1-sync/hypergraphdb-4.json new file mode 100644 index 0000000..c50a334 --- /dev/null +++ b/paper/results/s1-sync/hypergraphdb-4.json @@ -0,0 +1 @@ +{"store":"HyperGraphDB","version":"1.4 @ 99485a1 (Berkeley DB JE 5.0.73)","cache":"Berkeley DB JE cache of 64 MiB plus the HyperGraphDB atom cache","scale":1,"durability":"sync","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4195352576,"retainedHeap":124348952,"bytesWritten":3384268313,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":2594.68718,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":928940816,"bytesWritten":52930882,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":4970.467875,"checksum":362757,"gcCount":2,"gcMillis":89,"allocated":3026792664,"bytesWritten":238672760,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":81.061012,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":11697288,"bytesRead":18682003,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":63.434995,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4947368,"bytesRead":17806942,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":387.375558,"checksum":20287,"gcCount":1,"gcMillis":53,"allocated":160444968,"bytesRead":122850840,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":132.070999,"checksum":281832,"gcCount":1,"gcMillis":9,"allocated":18427080,"bytesRead":32535899,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":608.026696,"checksum":5852224,"gcCount":0,"gcMillis":0,"allocated":775942152},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":173.835714,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":360260768,"latency":{"p50":1.339,"p99":4.666,"p99.9":11.033,"max":33.938}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":2585.953933,"checksum":20000,"gcCount":4,"gcMillis":42,"allocated":4362884912,"bytesWritten":197303999,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":3325.18303,"checksum":5000,"gcCount":6,"gcMillis":51,"allocated":6096454608,"latency":{"p50":592.792,"p99":1639.974,"p99.9":7475.59,"max":11597.569},"bytesWritten":291057338,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":11175933,"millis":10000.218743,"checksum":0,"gcCount":18,"gcMillis":377,"allocated":22217968072,"latency":{"p50":3.706,"p99":7.722,"p99.9":99.914,"max":471023.414},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.218743,"checksum":0,"latency":{"p50":5233.624,"p99":45013.598,"p99.9":60139.203,"max":60139.203},"checked":false,"bytesWritten":356539013,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":895.520061,"checksum":50000,"gcCount":1,"gcMillis":16,"allocated":1464036920,"bytesWritten":88014816,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":44.584022,"checksum":20000000,"gcCount":0,"gcMillis":0,"allocated":481928,"bytesRead":15311901,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":108.383443,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":10908096,"bytesRead":32345171,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":915.190781,"checksum":1,"gcCount":1,"gcMillis":12,"allocated":1430300432},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":1333.237858,"checksum":831528,"gcCount":2,"gcMillis":52,"allocated":648634512,"bytesRead":486276913,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":381723328,"millis":1000.0,"checksum":381723328},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":3524.865979,"checksum":20000,"gcCount":5,"gcMillis":83,"allocated":5630784120,"bytesWritten":230904755,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":1774.434923,"checksum":20000,"gcCount":2,"gcMillis":28,"allocated":3248471528,"bytesWritten":148693666,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":62.081269,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":10147064,"bytesRead":14693027,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":271780935,"millis":1000.0,"checksum":271780935},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9981.042145,"checksum":0,"gcCount":3,"gcMillis":44,"allocated":4056095736,"latency":{"p50":1111.963,"p99":2863.946,"p99.9":21465.392,"max":21465.392},"checked":false,"bytesWritten":241871388,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9981.260644,"checksum":0,"gcCount":3,"gcMillis":35,"allocated":4782850128,"latency":{"p50":1271.195,"p99":3467.058,"p99.9":6366.104,"max":6366.104},"checked":false,"bytesWritten":297970950,"logicalWritten":16000,"compactionMillis":45,"reclaimed":1995328},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":270726076,"millis":1000.0,"checksum":270726076},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":113.282129,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":83280176,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s1-sync/hypergraphdb-5.json b/paper/results/s1-sync/hypergraphdb-5.json new file mode 100644 index 0000000..0e87dda --- /dev/null +++ b/paper/results/s1-sync/hypergraphdb-5.json @@ -0,0 +1 @@ +{"store":"HyperGraphDB","version":"1.4 @ 99485a1 (Berkeley DB JE 5.0.73)","cache":"Berkeley DB JE cache of 64 MiB plus the HyperGraphDB atom cache","scale":1,"durability":"sync","threads":8,"nodes":50000,"edges":100000,"incidences":362757,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4194828288,"retainedHeap":123853040,"bytesWritten":3561077564,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":50000,"millis":2671.195434,"checksum":50000,"gcCount":0,"gcMillis":0,"allocated":928671944,"bytesWritten":53208583,"logicalWritten":888890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":100000,"millis":5026.133513,"checksum":362757,"gcCount":4,"gcMillis":162,"allocated":3101421664,"bytesWritten":243535088,"logicalWritten":3702056},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":78.103353,"checksum":731528,"gcCount":0,"gcMillis":0,"allocated":11803608,"bytesRead":16701071,"logicalRead":5852224},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":61.968712,"checksum":363372,"gcCount":0,"gcMillis":0,"allocated":4947368,"bytesRead":7709684,"logicalRead":2906976},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":346.234958,"checksum":20287,"gcCount":0,"gcMillis":0,"allocated":163874896,"bytesRead":116431639,"logicalRead":162296},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":140.261699,"checksum":281832,"gcCount":0,"gcMillis":0,"allocated":18423016,"bytesRead":48203554,"logicalRead":2254656},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":610.242269,"checksum":5852224,"gcCount":1,"gcMillis":20,"allocated":765067880},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":229.41214,"checksum":731528,"gcCount":1,"gcMillis":9,"allocated":417130048,"latency":{"p50":1.665,"p99":5.862,"p99.9":14.874,"max":9072.416}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":3196.142539,"checksum":20000,"gcCount":4,"gcMillis":43,"allocated":5297978944,"bytesWritten":231428344,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":3226.587832,"checksum":5000,"gcCount":5,"gcMillis":40,"allocated":5872136624,"latency":{"p50":574.118,"p99":1534.873,"p99.9":4976.002,"max":9805.556},"bytesWritten":273484948,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":11248650,"millis":10006.542597,"checksum":0,"gcCount":18,"gcMillis":357,"allocated":22779416224,"latency":{"p50":3.711,"p99":7.5,"p99.9":78.927,"max":388223.47},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10006.542597,"checksum":0,"latency":{"p50":4941.447,"p99":28669.385,"p99.9":43786.293,"max":43786.293},"checked":false,"bytesWritten":364074401,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 50,000 members","operations":50000,"millis":1006.073329,"checksum":50000,"gcCount":2,"gcMillis":31,"allocated":1625127968,"bytesWritten":95485092,"logicalWritten":400008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":20000000,"millis":53.38675,"checksum":20000000,"gcCount":1,"gcMillis":7,"allocated":494728,"bytesRead":22963636,"logicalRead":160000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":110.050518,"checksum":100000,"gcCount":1,"gcMillis":10,"allocated":10957616,"bytesRead":26262139,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":1249.492011,"checksum":1,"gcCount":1,"gcMillis":7,"allocated":2006265008},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":1273.746731,"checksum":831528,"gcCount":2,"gcMillis":62,"allocated":603962816,"bytesRead":360379008,"logicalRead":6652224},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":389444929,"millis":1000.0,"checksum":389444929},{"workload":"churn.delete","description":"delete 20,000 hyperedges (20%) in transactions of 1,000","operations":20000,"millis":3637.710629,"checksum":20000,"gcCount":5,"gcMillis":69,"allocated":5929180896,"bytesWritten":242290945,"logicalWritten":739496},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":1894.944254,"checksum":20000,"gcCount":3,"gcMillis":40,"allocated":3529302280,"bytesWritten":164423886,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":81.818569,"checksum":645087,"gcCount":0,"gcMillis":0,"allocated":10429568,"bytesRead":20318662,"logicalRead":5160696},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":279812573,"millis":1000.0,"checksum":279812573},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9982.564406,"checksum":0,"gcCount":8,"gcMillis":88,"allocated":9898830312,"latency":{"p50":1432.651,"p99":4796.696,"p99.9":13547.567,"max":13547.567},"checked":false,"bytesWritten":606726831,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9981.037584,"checksum":0,"gcCount":1,"gcMillis":15,"allocated":1629747224,"latency":{"p50":1179.3,"p99":2756.245,"p99.9":8944.369,"max":8944.369},"checked":false,"bytesWritten":97078771,"logicalWritten":16000,"compactionMillis":42,"reclaimed":2883355},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":263761770,"millis":1000.0,"checksum":263761770},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":111.051405,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":78774352,"checked":false,"acknowledged":25000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s4-async/hstore-1.json b/paper/results/s4-async/hstore-1.json new file mode 100644 index 0000000..741f10d --- /dev/null +++ b/paper/results/s4-async/hstore-1.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":4,"durability":"async","threads":8,"nodes":200000,"edges":400000,"incidences":1453427,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4129816576,"retainedHeap":403054016,"bytesWritten":2212272838,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":200000,"millis":4884.970543,"checksum":200000,"gcCount":3,"gcMillis":189,"allocated":3126207304,"bytesWritten":79805212,"logicalWritten":3688890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":400000,"millis":18460.136155,"checksum":1453427,"gcCount":18,"gcMillis":1221,"allocated":13655652512,"bytesWritten":420458854,"logicalWritten":14827416},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":38.228143,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":124112,"bytesRead":0,"logicalRead":5757544},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":46.847818,"checksum":361142,"gcCount":0,"gcMillis":0,"allocated":4017128,"bytesRead":0,"logicalRead":2889136},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":70.092259,"checksum":20109,"gcCount":0,"gcMillis":0,"allocated":66742656,"bytesRead":0,"logicalRead":160872},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":58.295595,"checksum":280131,"gcCount":0,"gcMillis":0,"allocated":13718872,"bytesRead":3386329,"logicalRead":2241048},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":97.424624,"checksum":5757544,"gcCount":0,"gcMillis":0,"allocated":148033024},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":55.818166,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":4910144,"latency":{"p50":0.487,"p99":1.003,"p99.9":1.439,"max":18.235}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":632.31607,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":495156200,"bytesWritten":10155587,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":515.254934,"checksum":5000,"gcCount":1,"gcMillis":35,"allocated":277419112,"latency":{"p50":93.378,"p99":181.77,"p99.9":286.939,"max":35853.216},"bytesWritten":14533620,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":83653853,"millis":10000.148185,"checksum":0,"gcCount":5,"gcMillis":119,"allocated":4967953280,"latency":{"p50":0.673,"p99":1.33,"p99.9":2.78,"max":30177.268},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.148185,"checksum":0,"latency":{"p50":1466.507,"p99":9809.406,"p99.9":22249.687,"max":22249.687},"checked":false,"bytesWritten":91223320,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 200,000 members","operations":200000,"millis":400.818088,"checksum":200000,"gcCount":0,"gcMillis":0,"allocated":454378040,"bytesWritten":14573475,"logicalWritten":1600008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":80000000,"millis":50.518768,"checksum":80000000,"gcCount":0,"gcMillis":0,"allocated":136248,"bytesRead":0,"logicalRead":640000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":17.246162,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":5128,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":95.84908,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":64809040},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":81.00238,"checksum":819693,"gcCount":0,"gcMillis":0,"allocated":59520112,"bytesRead":11309990,"logicalRead":6557544},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":180060639,"millis":1000.0,"checksum":180060639},{"workload":"churn.delete","description":"delete 80,000 hyperedges (20%) in transactions of 1,000","operations":80000,"millis":29887.409443,"checksum":80000,"gcCount":29,"gcMillis":344,"allocated":30290698936,"bytesWritten":1298109186,"logicalWritten":2970424},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":5086.836018,"checksum":20000,"gcCount":4,"gcMillis":89,"allocated":4269958480,"bytesWritten":247428394,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":37.157111,"checksum":665234,"gcCount":0,"gcMillis":0,"allocated":117504,"bytesRead":0,"logicalRead":5321872},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":1223386938,"millis":1000.0,"checksum":1223386938},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.472207,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":141806992,"latency":{"p50":417.75,"p99":665.934,"p99.9":2552.919,"max":2552.919},"checked":false,"bytesWritten":9449528,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.459631,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":118291376,"latency":{"p50":393.272,"p99":592.824,"p99.9":692.039,"max":692.039},"checked":false,"bytesWritten":6995549,"logicalWritten":16000,"compactionMillis":9,"reclaimed":1301517},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":191530546,"millis":1000.0,"checksum":191530546},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":161.541574,"checksum":1,"gcCount":1,"gcMillis":13,"allocated":154890368,"checked":false,"acknowledged":100000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s4-async/hstore-2.json b/paper/results/s4-async/hstore-2.json new file mode 100644 index 0000000..0d7d909 --- /dev/null +++ b/paper/results/s4-async/hstore-2.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":4,"durability":"async","threads":8,"nodes":200000,"edges":400000,"incidences":1453427,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4149739520,"retainedHeap":410767080,"bytesWritten":2206137772,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":200000,"millis":4658.844967,"checksum":200000,"gcCount":2,"gcMillis":94,"allocated":3030545816,"bytesWritten":79805212,"logicalWritten":3688890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":400000,"millis":19422.902955,"checksum":1453427,"gcCount":17,"gcMillis":1147,"allocated":12817451136,"bytesWritten":424607311,"logicalWritten":14827416},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":39.127808,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":118512,"bytesRead":0,"logicalRead":5757544},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":58.214372,"checksum":361142,"gcCount":0,"gcMillis":0,"allocated":4017128,"bytesRead":0,"logicalRead":2889136},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":73.457402,"checksum":20109,"gcCount":0,"gcMillis":0,"allocated":66742656,"bytesRead":0,"logicalRead":160872},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":64.089615,"checksum":280131,"gcCount":0,"gcMillis":0,"allocated":18556592,"bytesRead":3295562,"logicalRead":2241048},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":96.718361,"checksum":5757544,"gcCount":0,"gcMillis":0,"allocated":128136576},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":55.059446,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":4909712,"latency":{"p50":0.483,"p99":1.009,"p99.9":1.528,"max":29.712}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":692.908755,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":500800616,"bytesWritten":10155587,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":495.247727,"checksum":5000,"gcCount":1,"gcMillis":34,"allocated":290607800,"latency":{"p50":90.955,"p99":168.099,"p99.9":293.163,"max":34884.106},"bytesWritten":14701066,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":86571713,"millis":10000.166042,"checksum":0,"gcCount":6,"gcMillis":142,"allocated":5133025112,"latency":{"p50":0.64,"p99":1.278,"p99.9":2.599,"max":30954.426},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.166042,"checksum":0,"latency":{"p50":1615.857,"p99":15196.904,"p99.9":26082.015,"max":26082.015},"checked":false,"bytesWritten":94400511,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 200,000 members","operations":200000,"millis":408.608886,"checksum":200000,"gcCount":0,"gcMillis":0,"allocated":434212320,"bytesWritten":17810598,"logicalWritten":1600008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":80000000,"millis":61.500735,"checksum":80000000,"gcCount":0,"gcMillis":0,"allocated":139528,"bytesRead":0,"logicalRead":640000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":17.815441,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":5128,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":92.872969,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":64970544},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":78.171283,"checksum":819693,"gcCount":0,"gcMillis":0,"allocated":59689480,"bytesRead":11309990,"logicalRead":6557544},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":173286174,"millis":1000.0,"checksum":173286174},{"workload":"churn.delete","description":"delete 80,000 hyperedges (20%) in transactions of 1,000","operations":80000,"millis":30297.467022,"checksum":80000,"gcCount":28,"gcMillis":323,"allocated":28319294384,"bytesWritten":1290931441,"logicalWritten":2970424},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":4869.469957,"checksum":20000,"gcCount":4,"gcMillis":76,"allocated":3953231192,"bytesWritten":243926026,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":31.906626,"checksum":665234,"gcCount":0,"gcMillis":0,"allocated":112704,"bytesRead":0,"logicalRead":5321872},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":1212625169,"millis":1000.0,"checksum":1212625169},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.489444,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":139260832,"latency":{"p50":442.977,"p99":772.913,"p99.9":2447.494,"max":2447.494},"checked":false,"bytesWritten":9431842,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.578085,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":114275936,"latency":{"p50":447.885,"p99":729.83,"p99.9":1001.892,"max":1001.892},"checked":false,"bytesWritten":3229400,"logicalWritten":16000,"compactionMillis":11,"reclaimed":-3302121},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":193729382,"millis":1000.0,"checksum":193729382},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":162.097453,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":151570688,"checked":false,"acknowledged":100000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s4-async/hstore-3.json b/paper/results/s4-async/hstore-3.json new file mode 100644 index 0000000..d7c8b9a --- /dev/null +++ b/paper/results/s4-async/hstore-3.json @@ -0,0 +1 @@ +{"store":"HStore","version":"0.1.0","cache":"node cache of 64 MiB and retains 64 generations of history","scale":4,"durability":"async","threads":8,"nodes":200000,"edges":400000,"incidences":1453427,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4107796480,"retainedHeap":410384504,"bytesWritten":2246379135,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":200000,"millis":4568.975978,"checksum":200000,"gcCount":3,"gcMillis":182,"allocated":3104537496,"bytesWritten":80436548,"logicalWritten":3688890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":400000,"millis":18562.703691,"checksum":1453427,"gcCount":18,"gcMillis":1139,"allocated":13322986048,"bytesWritten":438410312,"logicalWritten":14827416},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":36.645274,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":118512,"bytesRead":0,"logicalRead":5757544},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":45.819204,"checksum":361142,"gcCount":0,"gcMillis":0,"allocated":4017128,"bytesRead":0,"logicalRead":2889136},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":71.087985,"checksum":20109,"gcCount":0,"gcMillis":0,"allocated":66742656,"bytesRead":0,"logicalRead":160872},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":55.490417,"checksum":280131,"gcCount":0,"gcMillis":0,"allocated":12602632,"bytesRead":3139419,"logicalRead":2241048},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":139.049702,"checksum":5757544,"gcCount":0,"gcMillis":0,"allocated":143289312},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":57.640837,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":12090352,"latency":{"p50":0.502,"p99":1.021,"p99.9":1.491,"max":13.07}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":662.808017,"checksum":20000,"gcCount":0,"gcMillis":0,"allocated":499760512,"bytesWritten":10155587,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":461.290517,"checksum":5000,"gcCount":0,"gcMillis":0,"allocated":296263928,"latency":{"p50":90.64,"p99":172.429,"p99.9":283.944,"max":780.82},"bytesWritten":15778433,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":85500184,"millis":10000.164588,"checksum":0,"gcCount":6,"gcMillis":144,"allocated":5252534536,"latency":{"p50":0.653,"p99":1.272,"p99.9":2.633,"max":32959.669},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.164588,"checksum":0,"latency":{"p50":1490.998,"p99":14768.615,"p99.9":27720.992,"max":27720.992},"checked":false,"bytesWritten":45704251,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 200,000 members","operations":200000,"millis":417.707049,"checksum":200000,"gcCount":1,"gcMillis":22,"allocated":456011024,"bytesWritten":30122039,"logicalWritten":1600008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":80000000,"millis":50.545127,"checksum":80000000,"gcCount":0,"gcMillis":0,"allocated":126728,"bytesRead":0,"logicalRead":640000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":19.314309,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":4017128,"bytesRead":0,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":89.902861,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":67247792},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":83.207083,"checksum":819693,"gcCount":0,"gcMillis":0,"allocated":64788472,"bytesRead":11309990,"logicalRead":6557544},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":201469799,"millis":1000.0,"checksum":201469799},{"workload":"churn.delete","description":"delete 80,000 hyperedges (20%) in transactions of 1,000","operations":80000,"millis":31266.597281,"checksum":80000,"gcCount":30,"gcMillis":373,"allocated":31610176832,"bytesWritten":1349771894,"logicalWritten":2970424},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":4907.687897,"checksum":20000,"gcCount":4,"gcMillis":89,"allocated":4130535856,"bytesWritten":230231974,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":36.362771,"checksum":665234,"gcCount":0,"gcMillis":0,"allocated":4120704,"bytesRead":0,"logicalRead":5321872},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":1235011607,"millis":1000.0,"checksum":1235011607},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.504514,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":143988216,"latency":{"p50":488.615,"p99":742.427,"p99.9":2514.293,"max":2514.293},"checked":false,"bytesWritten":27571874,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":500,"millis":9980.468959,"checksum":0,"gcCount":0,"gcMillis":0,"allocated":116535168,"latency":{"p50":473.365,"p99":714.262,"p99.9":773.119,"max":773.119},"checked":false,"bytesWritten":3229400,"logicalWritten":16000,"compactionMillis":12,"reclaimed":-3302121},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":178642815,"millis":1000.0,"checksum":178642815},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":163.354384,"checksum":1,"gcCount":1,"gcMillis":12,"allocated":156144560,"checked":false,"acknowledged":100000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s4-async/hypergraphdb-1.json b/paper/results/s4-async/hypergraphdb-1.json new file mode 100644 index 0000000..48e4cb2 --- /dev/null +++ b/paper/results/s4-async/hypergraphdb-1.json @@ -0,0 +1 @@ +{"store":"HyperGraphDB","version":"1.4 @ 99485a1 (Berkeley DB JE 5.0.73)","cache":"Berkeley DB JE cache of 64 MiB plus the HyperGraphDB atom cache","scale":4,"durability":"async","threads":8,"nodes":200000,"edges":400000,"incidences":1453427,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4163371008,"retainedHeap":317225920,"bytesWritten":108805371012,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":200000,"millis":8305.96214,"checksum":200000,"gcCount":5,"gcMillis":202,"allocated":5339313792,"bytesWritten":322207868,"logicalWritten":3688890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":400000,"millis":148163.091658,"checksum":1453427,"gcCount":279,"gcMillis":2269,"allocated":360471738600,"bytesWritten":12101454681,"logicalWritten":14827416},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":96.612897,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":11406840,"bytesRead":59142003,"logicalRead":5757544},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":78.848687,"checksum":361142,"gcCount":1,"gcMillis":6,"allocated":4958696,"bytesRead":54826269,"logicalRead":2889136},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":803.439554,"checksum":20109,"gcCount":1,"gcMillis":22,"allocated":167808912,"bytesRead":495635240,"logicalRead":160872},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":120.555365,"checksum":280131,"gcCount":0,"gcMillis":0,"allocated":18457120,"bytesRead":78500021,"logicalRead":2241048},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":636.033282,"checksum":5757544,"gcCount":1,"gcMillis":26,"allocated":1232037176},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":212.794202,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":605858672,"latency":{"p50":1.614,"p99":5.757,"p99.9":13.863,"max":43.414}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":8087.321266,"checksum":20000,"gcCount":16,"gcMillis":137,"allocated":19502991576,"bytesWritten":647589677,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":2011.613491,"checksum":5000,"gcCount":3,"gcMillis":23,"allocated":4893680208,"latency":{"p50":250.238,"p99":1811.311,"p99.9":6435.447,"max":9306.697},"bytesWritten":167651382,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":10303775,"millis":10006.835109,"checksum":0,"gcCount":18,"gcMillis":415,"allocated":23876358664,"latency":{"p50":3.613,"p99":7.195,"p99.9":70.453,"max":664436.155},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10006.835109,"checksum":0,"latency":{"p50":9402.423,"p99":48851.043,"p99.9":59884.527,"max":59884.527},"checked":false,"bytesWritten":332313630,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 200,000 members","operations":200000,"millis":15029.719997,"checksum":200000,"gcCount":28,"gcMillis":278,"allocated":36112942672,"bytesWritten":1305146046,"logicalWritten":1600008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":80000000,"millis":223.590444,"checksum":80000000,"gcCount":0,"gcMillis":0,"allocated":462728,"bytesRead":142348928,"logicalRead":640000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":118.49108,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":11088856,"bytesRead":71676679,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":1278.916582,"checksum":1,"gcCount":2,"gcMillis":20,"allocated":2897339520},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":6612.750481,"checksum":819693,"gcCount":13,"gcMillis":165,"allocated":2405580976,"bytesRead":4580972515,"logicalRead":6557544},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":2500311769,"millis":1000.0,"checksum":2500311769},{"workload":"churn.delete","description":"delete 80,000 hyperedges (20%) in transactions of 1,000","operations":80000,"millis":40100.586852,"checksum":80000,"gcCount":81,"gcMillis":700,"allocated":105385597456,"bytesWritten":3301288349,"logicalWritten":2970424},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":5673.236896,"checksum":20000,"gcCount":11,"gcMillis":107,"allocated":14480669144,"bytesWritten":468241030,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":90.805308,"checksum":665234,"gcCount":0,"gcMillis":0,"allocated":10979504,"bytesRead":56583187,"logicalRead":5321872},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":1999448531,"millis":1000.0,"checksum":1999448531},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.653524,"checksum":0,"gcCount":20,"gcMillis":155,"allocated":25488943352,"latency":{"p50":629.936,"p99":4566.681,"p99.9":9825.257,"max":9825.257},"checked":false,"bytesWritten":850809268,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":38715,"millis":774281.367381,"checksum":0,"gcCount":1538,"gcMillis":10471,"allocated":2033525906048,"latency":{"p50":738.686,"p99":5881.183,"p99.9":8879.05,"max":169331.627},"checked":false,"bytesWritten":86691598213,"logicalWritten":1238880,"compactionMillis":773256,"reclaimed":690479372},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":1229695331,"millis":1000.0,"checksum":1229695331},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":445.838731,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":335698064,"checked":false,"acknowledged":100000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s4-async/hypergraphdb-2.json b/paper/results/s4-async/hypergraphdb-2.json new file mode 100644 index 0000000..c58bceb --- /dev/null +++ b/paper/results/s4-async/hypergraphdb-2.json @@ -0,0 +1 @@ +{"store":"HyperGraphDB","version":"1.4 @ 99485a1 (Berkeley DB JE 5.0.73)","cache":"Berkeley DB JE cache of 64 MiB plus the HyperGraphDB atom cache","scale":4,"durability":"async","threads":8,"nodes":200000,"edges":400000,"incidences":1453427,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4206362624,"retainedHeap":317168720,"bytesWritten":112600420107,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":200000,"millis":8339.563126,"checksum":200000,"gcCount":5,"gcMillis":198,"allocated":5318289912,"bytesWritten":318341650,"logicalWritten":3688890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":400000,"millis":147522.513329,"checksum":1453427,"gcCount":280,"gcMillis":2337,"allocated":362518173384,"bytesWritten":12245317980,"logicalWritten":14827416},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":80.243061,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":11085240,"bytesRead":40216449,"logicalRead":5757544},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":79.520258,"checksum":361142,"gcCount":1,"gcMillis":6,"allocated":4958696,"bytesRead":49672539,"logicalRead":2889136},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":482.572717,"checksum":20109,"gcCount":1,"gcMillis":33,"allocated":166750064,"bytesRead":290825425,"logicalRead":160872},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":123.54957,"checksum":280131,"gcCount":0,"gcMillis":0,"allocated":18454784,"bytesRead":80406016,"logicalRead":2241048},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":579.549129,"checksum":5757544,"gcCount":1,"gcMillis":27,"allocated":991977912},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":202.500682,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":456187704,"latency":{"p50":1.541,"p99":5.72,"p99.9":14.101,"max":413.467}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":7918.518537,"checksum":20000,"gcCount":15,"gcMillis":122,"allocated":19607362208,"bytesWritten":652446493,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":1965.650388,"checksum":5000,"gcCount":4,"gcMillis":32,"allocated":4780704352,"latency":{"p50":245.683,"p99":1900.117,"p99.9":7015.516,"max":10421.841},"bytesWritten":167205747,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":11065323,"millis":10000.22449,"checksum":0,"gcCount":19,"gcMillis":295,"allocated":23862296760,"latency":{"p50":3.836,"p99":7.139,"p99.9":173.546,"max":108721.815},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10000.22449,"checksum":0,"latency":{"p50":12700.048,"p99":61028.337,"p99.9":69763.77,"max":69763.77},"checked":false,"bytesWritten":284993484,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 200,000 members","operations":200000,"millis":14712.965233,"checksum":200000,"gcCount":27,"gcMillis":261,"allocated":35860614760,"bytesWritten":1297994531,"logicalWritten":1600008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":80000000,"millis":213.046337,"checksum":80000000,"gcCount":0,"gcMillis":0,"allocated":462728,"bytesRead":141346131,"logicalRead":640000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":108.963972,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":11018272,"bytesRead":69211534,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":1299.048459,"checksum":1,"gcCount":3,"gcMillis":33,"allocated":3137200016},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":6957.154762,"checksum":819693,"gcCount":13,"gcMillis":163,"allocated":2396533120,"bytesRead":4556911225,"logicalRead":6557544},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":2382481012,"millis":1000.0,"checksum":2382481012},{"workload":"churn.delete","description":"delete 80,000 hyperedges (20%) in transactions of 1,000","operations":80000,"millis":40261.024726,"checksum":80000,"gcCount":80,"gcMillis":692,"allocated":104366578392,"bytesWritten":3308501721,"logicalWritten":2970424},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":5672.134248,"checksum":20000,"gcCount":11,"gcMillis":107,"allocated":14064260752,"bytesWritten":451480154,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":94.928673,"checksum":665234,"gcCount":0,"gcMillis":0,"allocated":11158424,"bytesRead":52605303,"logicalRead":5321872},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":2070415173,"millis":1000.0,"checksum":2070415173},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.860681,"checksum":0,"gcCount":20,"gcMillis":153,"allocated":25427380104,"latency":{"p50":687.873,"p99":4917.983,"p99.9":10006.27,"max":10006.27},"checked":false,"bytesWritten":840160969,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":40286,"millis":805700.685892,"checksum":0,"gcCount":1597,"gcMillis":10966,"allocated":2110177615264,"latency":{"p50":742.366,"p99":5848.965,"p99.9":8503.168,"max":173734.422},"checked":false,"bytesWritten":90442102656,"logicalWritten":1289152,"compactionMillis":804688,"reclaimed":757545007},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":1128978398,"millis":1000.0,"checksum":1128978398},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":466.408684,"checksum":1,"gcCount":1,"gcMillis":10,"allocated":342017768,"checked":false,"acknowledged":100000,"lost":0}]} \ No newline at end of file diff --git a/paper/results/s4-async/hypergraphdb-3.json b/paper/results/s4-async/hypergraphdb-3.json new file mode 100644 index 0000000..33d15a1 --- /dev/null +++ b/paper/results/s4-async/hypergraphdb-3.json @@ -0,0 +1 @@ +{"store":"HyperGraphDB","version":"1.4 @ 99485a1 (Berkeley DB JE 5.0.73)","cache":"Berkeley DB JE cache of 64 MiB plus the HyperGraphDB atom cache","scale":4,"durability":"async","threads":8,"nodes":200000,"edges":400000,"incidences":1453427,"java":"Java HotSpot(TM) 64-Bit Server VM 25.0.4+7-LTS-jvmci-b01","os":"Linux 6.17.0-1022-azure amd64","processors":8,"maxHeap":4171759616,"retainedHeap":317445920,"bytesWritten":111141359470,"results":[{"workload":"ingest.nodes","description":"insert nodes in transactions of 1,000","operations":200000,"millis":8380.271476,"checksum":200000,"gcCount":5,"gcMillis":208,"allocated":5301552752,"bytesWritten":317290087,"logicalWritten":3688890},{"workload":"ingest.edges","description":"insert hyperedges (mean cardinality 3.6) in transactions of 1,000","operations":400000,"millis":144482.305983,"checksum":1453427,"gcCount":277,"gcMillis":2254,"allocated":358282371048,"bytesWritten":12047974515,"logicalWritten":14827416},{"workload":"read.incidence","description":"enumerate the incidence set of a node","operations":100000,"millis":89.919352,"checksum":719693,"gcCount":0,"gcMillis":0,"allocated":11094688,"bytesRead":58897225,"logicalRead":5757544},{"workload":"read.members","description":"enumerate the members of a hyperedge","operations":100000,"millis":72.001633,"checksum":361142,"gcCount":0,"gcMillis":0,"allocated":4958696,"bytesRead":48745614,"logicalRead":2889136},{"workload":"read.comembership","description":"count hyperedges containing both atoms of a pair","operations":20000,"millis":457.091212,"checksum":20109,"gcCount":1,"gcMillis":24,"allocated":166740328,"bytesRead":279967698,"logicalRead":160872},{"workload":"read.twohop","description":"count the distinct nodes that share a hyperedge with a node","operations":10000,"millis":130.674732,"checksum":280131,"gcCount":0,"gcMillis":0,"allocated":18453016,"bytesRead":83407223,"logicalRead":2241048},{"workload":"read.incidence.parallel","description":"incidence sets from 8 threads, 100,000 probes each","operations":800000,"millis":787.618423,"checksum":5757544,"gcCount":2,"gcMillis":40,"allocated":1427241464},{"workload":"latency.read","description":"one incidence lookup per read transaction","operations":100000,"millis":217.162638,"checksum":719693,"gcCount":1,"gcMillis":11,"allocated":569014552,"latency":{"p50":1.6,"p99":5.229,"p99.9":12.64,"max":11800.065}},{"workload":"write.update","description":"replace a node value in transactions of 1,000","operations":20000,"millis":8163.04332,"checksum":20000,"gcCount":15,"gcMillis":124,"allocated":19905875312,"bytesWritten":666840326,"logicalWritten":640000},{"workload":"latency.commit","description":"one node update per write transaction","operations":5000,"millis":1928.620846,"checksum":5000,"gcCount":3,"gcMillis":22,"allocated":4752506872,"latency":{"p50":239.618,"p99":1369.518,"p99.9":6219.195,"max":8412.06},"bytesWritten":156116246,"logicalWritten":160000},{"workload":"mixed.read","description":"single incidence lookups from 7 readers while one writer commits 10 updates at a time, targeting 1,000 updates/s","operations":11097393,"millis":10009.267636,"checksum":0,"gcCount":18,"gcMillis":305,"allocated":24055882216,"latency":{"p50":3.732,"p99":6.98,"p99.9":119.31,"max":281259.146},"checked":false},{"workload":"mixed.write","description":"updates committed by the writer alongside the readers","operations":10000,"millis":10009.267636,"checksum":0,"latency":{"p50":9575.281,"p99":41638.298,"p99.9":62664.09,"max":62664.09},"checked":false,"bytesWritten":313526182,"logicalWritten":320000},{"workload":"large.ingest","description":"create one hyperedge with 200,000 members","operations":200000,"millis":14737.884262,"checksum":200000,"gcCount":28,"gcMillis":282,"allocated":35902878408,"bytesWritten":1305492524,"logicalWritten":1600008},{"workload":"large.scan","description":"enumerate all members of the large hyperedge (x400, after a warm-up)","operations":80000000,"millis":228.363047,"checksum":80000000,"gcCount":0,"gcMillis":0,"allocated":456328,"bytesRead":150105222,"logicalRead":640000000},{"workload":"large.probe","description":"test whether a node belongs to the large hyperedge","operations":100000,"millis":124.590881,"checksum":100000,"gcCount":0,"gcMillis":0,"allocated":11156536,"bytesRead":78468624,"logicalRead":800000},{"workload":"reopen","description":"close and reopen the database, including recovery","operations":1,"millis":948.878192,"checksum":1,"gcCount":2,"gcMillis":21,"allocated":2071013080},{"workload":"read.incidence.cold","description":"incidence sets immediately after reopening","operations":100000,"millis":6573.234844,"checksum":819693,"gcCount":13,"gcMillis":161,"allocated":2389958376,"bytesRead":4565095429,"logicalRead":6557544},{"workload":"disk","description":"bytes on disk after a clean shutdown","operations":2466096022,"millis":1000.0,"checksum":2466096022},{"workload":"churn.delete","description":"delete 80,000 hyperedges (20%) in transactions of 1,000","operations":80000,"millis":41017.951857,"checksum":80000,"gcCount":81,"gcMillis":659,"allocated":106004597024,"bytesWritten":3351653847,"logicalWritten":2970424},{"workload":"churn.remove","description":"remove one member from each of 20,000 other hyperedges, 1,000 per transaction","operations":20000,"millis":5733.745786,"checksum":20000,"gcCount":11,"gcMillis":107,"allocated":14431746736,"bytesWritten":473471062,"logicalWritten":320000},{"workload":"read.incidence.churned","description":"enumerate incidence sets after the deletes","operations":100000,"millis":99.464452,"checksum":665234,"gcCount":0,"gcMillis":0,"allocated":11047864,"bytesRead":63147254,"logicalRead":5321872},{"workload":"disk.churned","description":"bytes on disk after the deletes and a clean shutdown","operations":2047694525,"millis":1000.0,"checksum":2047694525},{"workload":"compaction.baseline","description":"single-update commits at 50/s with no compaction, for comparison","operations":500,"millis":9980.692002,"checksum":0,"gcCount":19,"gcMillis":151,"allocated":24516449512,"latency":{"p50":701.764,"p99":5554.879,"p99.9":16862.767,"max":16862.767},"checked":false,"bytesWritten":831026303,"logicalWritten":16000},{"workload":"compaction","description":"single-update commits at 50/s while a full compaction runs","operations":39809,"millis":796161.359017,"checksum":0,"gcCount":1568,"gcMillis":10636,"allocated":2075047937376,"latency":{"p50":745.686,"p99":5820.25,"p99.9":8727.553,"max":172025.134},"checked":false,"bytesWritten":89081332458,"logicalWritten":1273888,"compactionMillis":795141,"reclaimed":821852843},{"workload":"disk.compacted","description":"bytes on disk after a full compaction and a clean shutdown","operations":1231612931,"millis":1000.0,"checksum":1231612931},{"workload":"recover","description":"open the store after killing the ingest process with SIGKILL","operations":1,"millis":448.508805,"checksum":1,"gcCount":0,"gcMillis":0,"allocated":339949760,"checked":false,"acknowledged":100000,"lost":0}]} \ No newline at end of file From 823818d00044bb6572fcd870a292a7af02b4591f Mon Sep 17 00:00:00 2001 From: venkat1701 Date: Wed, 14 Oct 2026 21:38:38 +0530 Subject: [PATCH 3/7] docs(paper): add the generated figures and the paper PDF Output of paper/build.sh for the results in the previous commit, so that the paper builds with tectonic alone and the PDF can be read from the repository. --- docs/hstore-paper.pdf | Bin 0 -> 316606 bytes paper/figures/ablation.pdf | Bin 0 -> 16941 bytes paper/figures/compaction.pdf | Bin 0 -> 19288 bytes paper/figures/latency.pdf | Bin 0 -> 20000 bytes paper/figures/layout.pdf | Bin 0 -> 20411 bytes paper/figures/overview.pdf | Bin 0 -> 22914 bytes paper/figures/ratios.pdf | Bin 0 -> 19235 bytes paper/figures/resources.pdf | Bin 0 -> 21994 bytes paper/figures/wal.pdf | Bin 0 -> 12053 bytes paper/generated/ablation.tex | 62 +++ paper/generated/numbers.tex | 715 ++++++++++++++++++++++++++++++++++ paper/generated/table-all.tex | 27 ++ 12 files changed, 804 insertions(+) create mode 100644 docs/hstore-paper.pdf create mode 100644 paper/figures/ablation.pdf create mode 100644 paper/figures/compaction.pdf create mode 100644 paper/figures/latency.pdf create mode 100644 paper/figures/layout.pdf create mode 100644 paper/figures/overview.pdf create mode 100644 paper/figures/ratios.pdf create mode 100644 paper/figures/resources.pdf create mode 100644 paper/figures/wal.pdf create mode 100644 paper/generated/ablation.tex create mode 100644 paper/generated/numbers.tex create mode 100644 paper/generated/table-all.tex diff --git a/docs/hstore-paper.pdf b/docs/hstore-paper.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c4ca21f93b13ce804346d197575776962d24b7a6 GIT binary patch literal 316606 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%0D{wWQBb(1KBS~~CB?^*RC{_at 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%0A!0WP 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%0Dna24+s-tJay2nU#IjvH^#N?)JS4?`tMz)e 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

buehwXfEp6UBiemk)2$KY<8xtE!fBCdk71-+k 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 literal 0 HcmV?d00001 diff --git a/paper/figures/latency.pdf b/paper/figures/latency.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3d5cfb87166835cad8204e08d7192ac55f6d7cf7 GIT binary patch literal 20000 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 literal 0 HcmV?d00001 diff --git a/paper/figures/layout.pdf b/paper/figures/layout.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1b35cb26f29aed69c5b1efddae77f119dbca52f4 GIT binary patch literal 20411 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 Op`itrs;aBM8y5gHIMiAI literal 0 HcmV?d00001 diff --git a/paper/figures/overview.pdf b/paper/figures/overview.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4ecdee70abe15fd1c47da84b1ed1ce22567b55bd GIT binary patch literal 22914 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 RLZMKYs2G5YOG!%^@L!4IC*=SD literal 0 HcmV?d00001 diff --git a/paper/figures/ratios.pdf b/paper/figures/ratios.pdf new file mode 100644 index 0000000000000000000000000000000000000000..47aec8b6412b258aa9dc4abf1a41883a863f0d85 GIT binary patch literal 19235 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 literal 0 HcmV?d00001 diff --git a/paper/figures/wal.pdf b/paper/figures/wal.pdf new file mode 100644 index 0000000000000000000000000000000000000000..55e93b20c6552bea3478c73d8e14cdf124ca1846 GIT binary patch literal 12053 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 literal 0 HcmV?d00001 diff --git a/paper/generated/ablation.tex b/paper/generated/ablation.tex new file mode 100644 index 0000000..1ab4bde --- /dev/null +++ b/paper/generated/ablation.tex @@ -0,0 +1,62 @@ +\makeatletter +\expandafter\def\csname m@abllogicalwriteupdate\endcsname{1.4} +\expandafter\def\csname m@abllogicalwriteupdatebefore\endcsname{33.8\,k} +\expandafter\def\csname m@abllogicalwriteupdateafter\endcsname{47.5\,k} +\expandafter\def\csname m@abllogicallatencycommit\endcsname{1.8} +\expandafter\def\csname m@abllogicallatencycommitbefore\endcsname{4.80\,k} +\expandafter\def\csname m@abllogicallatencycommitafter\endcsname{8.67\,k} +\expandafter\def\csname m@abllogicalingestedges\endcsname{1.1} +\expandafter\def\csname m@abllogicalingestedgesbefore\endcsname{24.5\,k} +\expandafter\def\csname m@abllogicalingestedgesafter\endcsname{27.6\,k} +\expandafter\def\csname m@abllogicalreadincidence\endcsname{0.83$^\dagger$} +\expandafter\def\csname m@abllogicalreadincidencebefore\endcsname{3.99\,M} +\expandafter\def\csname m@abllogicalreadincidenceafter\endcsname{3.33\,M} +\expandafter\def\csname m@abllogicalrecover\endcsname{0.36} +\expandafter\def\csname m@abllogicalrecoverbefore\endcsname{37.5\,ms} +\expandafter\def\csname m@abllogicalrecoverafter\endcsname{105\,ms} +\expandafter\def\csname m@abllogicalwriteupdatewritten\endcsname{8.6} +\expandafter\def\csname m@abllogicalwriteupdatewrittenbefore\endcsname{1.85\,KiB} +\expandafter\def\csname m@abllogicalwriteupdatewrittenafter\endcsname{221\,B} +\expandafter\def\csname m@abllogicallatencycommitwritten\endcsname{23.6} +\expandafter\def\csname m@abllogicallatencycommitwrittenbefore\endcsname{14.9\,KiB} +\expandafter\def\csname m@abllogicallatencycommitwrittenafter\endcsname{649\,B} +\expandafter\def\csname m@abllogicalingestedgeswritten\endcsname{3.6} +\expandafter\def\csname m@abllogicalingestedgeswrittenbefore\endcsname{1.31\,KiB} +\expandafter\def\csname m@abllogicalingestedgeswrittenafter\endcsname{376\,B} +\expandafter\def\csname m@ablinlinereadmembers\endcsname{1.6} +\expandafter\def\csname m@ablinlinereadmembersbefore\endcsname{568\,k} +\expandafter\def\csname m@ablinlinereadmembersafter\endcsname{925\,k} +\expandafter\def\csname m@ablinlinereadtwohop\endcsname{1.3} +\expandafter\def\csname m@ablinlinereadtwohopbefore\endcsname{68.7\,k} +\expandafter\def\csname m@ablinlinereadtwohopafter\endcsname{86.5\,k} +\expandafter\def\csname m@ablinlinelargescan\endcsname{2.2$^\dagger$} +\expandafter\def\csname m@ablinlinelargescanbefore\endcsname{624\,M} +\expandafter\def\csname m@ablinlinelargescanafter\endcsname{1,344\,M} +\expandafter\def\csname m@ablinlinelatencyread\endcsname{0.88} +\expandafter\def\csname m@ablinlinelatencyreadbefore\endcsname{657\,k} +\expandafter\def\csname m@ablinlinelatencyreadafter\endcsname{578\,k} +\expandafter\def\csname m@ablinlinediskcompacted\endcsname{3.1} +\expandafter\def\csname m@ablinlinediskcompactedbefore\endcsname{202\,MiB} +\expandafter\def\csname m@ablinlinediskcompactedafter\endcsname{66.1\,MiB} +\expandafter\def\csname m@abllazyreadmembers\endcsname{10.3} +\expandafter\def\csname m@abllazyreadmembersbefore\endcsname{179\,k} +\expandafter\def\csname m@abllazyreadmembersafter\endcsname{1.85\,M} +\expandafter\def\csname m@abllazyreadtwohop\endcsname{13.8} +\expandafter\def\csname m@abllazyreadtwohopbefore\endcsname{12.0\,k} +\expandafter\def\csname m@abllazyreadtwohopafter\endcsname{165\,k} +\expandafter\def\csname m@abllazyreadincidencecold\endcsname{1.4} +\expandafter\def\csname m@abllazyreadincidencecoldbefore\endcsname{903\,k} +\expandafter\def\csname m@abllazyreadincidencecoldafter\endcsname{1.27\,M} +\expandafter\def\csname m@abllazyreadincidenceparallel\endcsname{0.55} +\expandafter\def\csname m@abllazyreadincidenceparallelbefore\endcsname{11.7\,M} +\expandafter\def\csname m@abllazyreadincidenceparallelafter\endcsname{6.43\,M} +\expandafter\def\csname m@abllazychurndelete\endcsname{0.85} +\expandafter\def\csname m@abllazychurndeletebefore\endcsname{3.10\,k} +\expandafter\def\csname m@abllazychurndeleteafter\endcsname{2.65\,k} +\expandafter\def\csname m@abllazychurndeletewritten\endcsname{0.96} +\expandafter\def\csname m@abllazychurndeletewrittenbefore\endcsname{15.7\,KiB} +\expandafter\def\csname m@abllazychurndeletewrittenafter\endcsname{16.5\,KiB} +\expandafter\def\csname m@ablrunslogical\endcsname{3} +\expandafter\def\csname m@ablrunsinline\endcsname{3} +\expandafter\def\csname m@ablrunslazy\endcsname{3} +\makeatother diff --git a/paper/generated/numbers.tex b/paper/generated/numbers.tex new file mode 100644 index 0000000..004d032 --- /dev/null +++ b/paper/generated/numbers.tex @@ -0,0 +1,715 @@ +\makeatletter +\newcommand{\M}[1]{\@ifundefined{m@#1}{\textbf{??#1}}{\csname m@#1\endcsname}} +\expandafter\def\csname m@ratios1asyncingestnodes\endcsname{1.7} +\expandafter\def\csname m@hss1asyncingestnodes\endcsname{33.3\,k} +\expandafter\def\csname m@hgs1asyncingestnodes\endcsname{19.6\,k} +\expandafter\def\csname m@ratios1asyncingestedges\endcsname{1.4} +\expandafter\def\csname m@hss1asyncingestedges\endcsname{28.9\,k} +\expandafter\def\csname m@hgs1asyncingestedges\endcsname{21.3\,k} +\expandafter\def\csname m@ratios1asyncreadincidence\endcsname{2.5} +\expandafter\def\csname m@hss1asyncreadincidence\endcsname{3.10\,M} +\expandafter\def\csname m@hgs1asyncreadincidence\endcsname{1.25\,M} +\expandafter\def\csname m@ratios1asyncreadmembers\endcsname{1.4} +\expandafter\def\csname m@hss1asyncreadmembers\endcsname{2.29\,M} +\expandafter\def\csname m@hgs1asyncreadmembers\endcsname{1.66\,M} +\expandafter\def\csname m@ratios1asyncreadcomembership\endcsname{5.5} +\expandafter\def\csname m@hss1asyncreadcomembership\endcsname{272\,k} +\expandafter\def\csname m@hgs1asyncreadcomembership\endcsname{49.8\,k} +\expandafter\def\csname m@ratios1asyncreadtwohop\endcsname{2.9} +\expandafter\def\csname m@hss1asyncreadtwohop\endcsname{243\,k} +\expandafter\def\csname m@hgs1asyncreadtwohop\endcsname{83.6\,k} +\expandafter\def\csname m@ratios1asyncreadincidenceparallel\endcsname{11} +\expandafter\def\csname m@hss1asyncreadincidenceparallel\endcsname{14.1\,M} +\expandafter\def\csname m@hgs1asyncreadincidenceparallel\endcsname{1.28\,M} +\expandafter\def\csname m@ratios1asynclatencyread\endcsname{4.1} +\expandafter\def\csname m@hss1asynclatencyread\endcsname{2.07\,M} +\expandafter\def\csname m@hgs1asynclatencyread\endcsname{505\,k} +\expandafter\def\csname m@ratios1asyncwriteupdate\endcsname{5.6} +\expandafter\def\csname m@hss1asyncwriteupdate\endcsname{40.9\,k} +\expandafter\def\csname m@hgs1asyncwriteupdate\endcsname{7.26\,k} +\expandafter\def\csname m@ratios1asynclatencycommit\endcsname{0.95$^\dagger$} +\expandafter\def\csname m@hss1asynclatencycommit\endcsname{6.96\,k} +\expandafter\def\csname m@hgs1asynclatencycommit\endcsname{7.33\,k} +\expandafter\def\csname m@ratios1asyncmixedread\endcsname{7.7} +\expandafter\def\csname m@hss1asyncmixedread\endcsname{8.73\,M} +\expandafter\def\csname m@hgs1asyncmixedread\endcsname{1.13\,M} +\expandafter\def\csname m@ratios1asyncmixedwrite\endcsname{1.0} +\expandafter\def\csname m@hss1asyncmixedwrite\endcsname{1,000} +\expandafter\def\csname m@hgs1asyncmixedwrite\endcsname{1,000} +\expandafter\def\csname m@ratios1asynclargeingest\endcsname{9.1} +\expandafter\def\csname m@hss1asynclargeingest\endcsname{431\,k} +\expandafter\def\csname m@hgs1asynclargeingest\endcsname{47.6\,k} +\expandafter\def\csname m@ratios1asynclargescan\endcsname{4.8} +\expandafter\def\csname m@hss1asynclargescan\endcsname{1,668\,M} +\expandafter\def\csname m@hgs1asynclargescan\endcsname{344\,M} +\expandafter\def\csname m@ratios1asynclargeprobe\endcsname{6.5} +\expandafter\def\csname m@hss1asynclargeprobe\endcsname{6.60\,M} +\expandafter\def\csname m@hgs1asynclargeprobe\endcsname{1.01\,M} +\expandafter\def\csname m@ratios1asyncreopen\endcsname{12.5} +\expandafter\def\csname m@hss1asyncreopen\endcsname{78.5\,ms} +\expandafter\def\csname m@hgs1asyncreopen\endcsname{978\,ms} +\expandafter\def\csname m@ratios1asyncreadincidencecold\endcsname{25.6} +\expandafter\def\csname m@hss1asyncreadincidencecold\endcsname{1.73\,M} +\expandafter\def\csname m@hgs1asyncreadincidencecold\endcsname{67.6\,k} +\expandafter\def\csname m@ratios1asyncdisk\endcsname{4.7} +\expandafter\def\csname m@hss1asyncdisk\endcsname{85.7\,MiB} +\expandafter\def\csname m@hgs1asyncdisk\endcsname{400\,MiB} +\expandafter\def\csname m@ratios1asyncchurndelete\endcsname{3.1} +\expandafter\def\csname m@hss1asyncchurndelete\endcsname{16.1\,k} +\expandafter\def\csname m@hgs1asyncchurndelete\endcsname{5.18\,k} +\expandafter\def\csname m@ratios1asyncchurnremove\endcsname{2.2} +\expandafter\def\csname m@hss1asyncchurnremove\endcsname{23.1\,k} +\expandafter\def\csname m@hgs1asyncchurnremove\endcsname{10.7\,k} +\expandafter\def\csname m@ratios1asyncreadincidencechurned\endcsname{2.4} +\expandafter\def\csname m@hss1asyncreadincidencechurned\endcsname{3.10\,M} +\expandafter\def\csname m@hgs1asyncreadincidencechurned\endcsname{1.30\,M} +\expandafter\def\csname m@ratios1asyncdiskchurned\endcsname{2.5} +\expandafter\def\csname m@hss1asyncdiskchurned\endcsname{116\,MiB} +\expandafter\def\csname m@hgs1asyncdiskchurned\endcsname{293\,MiB} +\expandafter\def\csname m@ratios1asynccompactionbaseline\endcsname{1.0$^\dagger$} +\expandafter\def\csname m@hss1asynccompactionbaseline\endcsname{50.1} +\expandafter\def\csname m@hgs1asynccompactionbaseline\endcsname{50.1} +\expandafter\def\csname m@ratios1asynccompaction\endcsname{1.0$^\dagger$} +\expandafter\def\csname m@hss1asynccompaction\endcsname{50.1} +\expandafter\def\csname m@hgs1asynccompaction\endcsname{50.1} +\expandafter\def\csname m@ratios1asyncdiskcompacted\endcsname{2.5} +\expandafter\def\csname m@hss1asyncdiskcompacted\endcsname{93.3\,MiB} +\expandafter\def\csname m@hgs1asyncdiskcompacted\endcsname{234\,MiB} +\expandafter\def\csname m@ratios1asyncrecover\endcsname{1.3$^\dagger$} +\expandafter\def\csname m@hss1asyncrecover\endcsname{84.8\,ms} +\expandafter\def\csname m@hgs1asyncrecover\endcsname{113\,ms} +\expandafter\def\csname m@ratios1syncingestnodes\endcsname{1.7} +\expandafter\def\csname m@hss1syncingestnodes\endcsname{33.9\,k} +\expandafter\def\csname m@hgs1syncingestnodes\endcsname{19.6\,k} +\expandafter\def\csname m@ratios1syncingestedges\endcsname{1.3} +\expandafter\def\csname m@hss1syncingestedges\endcsname{27.8\,k} +\expandafter\def\csname m@hgs1syncingestedges\endcsname{20.8\,k} +\expandafter\def\csname m@ratios1syncreadincidence\endcsname{3.1} +\expandafter\def\csname m@hss1syncreadincidence\endcsname{3.71\,M} +\expandafter\def\csname m@hgs1syncreadincidence\endcsname{1.18\,M} +\expandafter\def\csname m@ratios1syncreadmembers\endcsname{1.6} +\expandafter\def\csname m@hss1syncreadmembers\endcsname{2.45\,M} +\expandafter\def\csname m@hgs1syncreadmembers\endcsname{1.58\,M} +\expandafter\def\csname m@ratios1syncreadcomembership\endcsname{4.9} +\expandafter\def\csname m@hss1syncreadcomembership\endcsname{281\,k} +\expandafter\def\csname m@hgs1syncreadcomembership\endcsname{57.8\,k} +\expandafter\def\csname m@ratios1syncreadtwohop\endcsname{3.4} +\expandafter\def\csname m@hss1syncreadtwohop\endcsname{257\,k} +\expandafter\def\csname m@hgs1syncreadtwohop\endcsname{75.7\,k} +\expandafter\def\csname m@ratios1syncreadincidenceparallel\endcsname{12.8} +\expandafter\def\csname m@hss1syncreadincidenceparallel\endcsname{16.8\,M} +\expandafter\def\csname m@hgs1syncreadincidenceparallel\endcsname{1.32\,M} +\expandafter\def\csname m@ratios1synclatencyread\endcsname{3.8} +\expandafter\def\csname m@hss1synclatencyread\endcsname{2.21\,M} +\expandafter\def\csname m@hgs1synclatencyread\endcsname{575\,k} +\expandafter\def\csname m@ratios1syncwriteupdate\endcsname{5.8} +\expandafter\def\csname m@hss1syncwriteupdate\endcsname{41.6\,k} +\expandafter\def\csname m@hgs1syncwriteupdate\endcsname{7.22\,k} +\expandafter\def\csname m@ratios1synclatencycommit\endcsname{1.2} +\expandafter\def\csname m@hss1synclatencycommit\endcsname{1.78\,k} +\expandafter\def\csname m@hgs1synclatencycommit\endcsname{1.44\,k} +\expandafter\def\csname m@ratios1syncmixedread\endcsname{8.0} +\expandafter\def\csname m@hss1syncmixedread\endcsname{9.12\,M} +\expandafter\def\csname m@hgs1syncmixedread\endcsname{1.14\,M} +\expandafter\def\csname m@ratios1syncmixedwrite\endcsname{1.0} +\expandafter\def\csname m@hss1syncmixedwrite\endcsname{1,000} +\expandafter\def\csname m@hgs1syncmixedwrite\endcsname{1,000} +\expandafter\def\csname m@ratios1synclargeingest\endcsname{7.4} +\expandafter\def\csname m@hss1synclargeingest\endcsname{411\,k} +\expandafter\def\csname m@hgs1synclargeingest\endcsname{55.8\,k} +\expandafter\def\csname m@ratios1synclargescan\endcsname{4.5} +\expandafter\def\csname m@hss1synclargescan\endcsname{1,669\,M} +\expandafter\def\csname m@hgs1synclargescan\endcsname{375\,M} +\expandafter\def\csname m@ratios1synclargeprobe\endcsname{7.2} +\expandafter\def\csname m@hss1synclargeprobe\endcsname{6.62\,M} +\expandafter\def\csname m@hgs1synclargeprobe\endcsname{923\,k} +\expandafter\def\csname m@ratios1syncreopen\endcsname{13} +\expandafter\def\csname m@hss1syncreopen\endcsname{80.4\,ms} +\expandafter\def\csname m@hgs1syncreopen\endcsname{1,044\,ms} +\expandafter\def\csname m@ratios1syncreadincidencecold\endcsname{28.1} +\expandafter\def\csname m@hss1syncreadincidencecold\endcsname{1.95\,M} +\expandafter\def\csname m@hgs1syncreadincidencecold\endcsname{69.2\,k} +\expandafter\def\csname m@ratios1syncdisk\endcsname{4.3} +\expandafter\def\csname m@hss1syncdisk\endcsname{85.8\,MiB} +\expandafter\def\csname m@hgs1syncdisk\endcsname{371\,MiB} +\expandafter\def\csname m@ratios1syncchurndelete\endcsname{2.9} +\expandafter\def\csname m@hss1syncchurndelete\endcsname{16.3\,k} +\expandafter\def\csname m@hgs1syncchurndelete\endcsname{5.67\,k} +\expandafter\def\csname m@ratios1syncchurnremove\endcsname{2.1} +\expandafter\def\csname m@hss1syncchurnremove\endcsname{23.6\,k} +\expandafter\def\csname m@hgs1syncchurnremove\endcsname{11.3\,k} +\expandafter\def\csname m@ratios1syncreadincidencechurned\endcsname{2.6} +\expandafter\def\csname m@hss1syncreadincidencechurned\endcsname{3.44\,M} +\expandafter\def\csname m@hgs1syncreadincidencechurned\endcsname{1.30\,M} +\expandafter\def\csname m@ratios1syncdiskchurned\endcsname{2.0} +\expandafter\def\csname m@hss1syncdiskchurned\endcsname{118\,MiB} +\expandafter\def\csname m@hgs1syncdiskchurned\endcsname{234\,MiB} +\expandafter\def\csname m@ratios1synccompactionbaseline\endcsname{1.0$^\dagger$} +\expandafter\def\csname m@hss1synccompactionbaseline\endcsname{50.1} +\expandafter\def\csname m@hgs1synccompactionbaseline\endcsname{50.1} +\expandafter\def\csname m@ratios1synccompaction\endcsname{1.0$^\dagger$} +\expandafter\def\csname m@hss1synccompaction\endcsname{50.1} +\expandafter\def\csname m@hgs1synccompaction\endcsname{50.1} +\expandafter\def\csname m@ratios1syncdiskcompacted\endcsname{2.7} +\expandafter\def\csname m@hss1syncdiskcompacted\endcsname{93.3\,MiB} +\expandafter\def\csname m@hgs1syncdiskcompacted\endcsname{254\,MiB} +\expandafter\def\csname m@ratios1syncrecover\endcsname{1.4} +\expandafter\def\csname m@hss1syncrecover\endcsname{77.7\,ms} +\expandafter\def\csname m@hgs1syncrecover\endcsname{111\,ms} +\expandafter\def\csname m@ratios4asyncingestnodes\endcsname{1.8} +\expandafter\def\csname m@hss4asyncingestnodes\endcsname{42.9\,k} +\expandafter\def\csname m@hgs4asyncingestnodes\endcsname{24.0\,k} +\expandafter\def\csname m@ratios4asyncingestedges\endcsname{7.9} +\expandafter\def\csname m@hss4asyncingestedges\endcsname{21.5\,k} +\expandafter\def\csname m@hgs4asyncingestedges\endcsname{2.71\,k} +\expandafter\def\csname m@ratios4asyncreadincidence\endcsname{2.4} +\expandafter\def\csname m@hss4asyncreadincidence\endcsname{2.62\,M} +\expandafter\def\csname m@hgs4asyncreadincidence\endcsname{1.11\,M} +\expandafter\def\csname m@ratios4asyncreadmembers\endcsname{1.7} +\expandafter\def\csname m@hss4asyncreadmembers\endcsname{2.13\,M} +\expandafter\def\csname m@hgs4asyncreadmembers\endcsname{1.27\,M} +\expandafter\def\csname m@ratios4asyncreadcomembership\endcsname{6.8} +\expandafter\def\csname m@hss4asyncreadcomembership\endcsname{281\,k} +\expandafter\def\csname m@hgs4asyncreadcomembership\endcsname{41.4\,k} +\expandafter\def\csname m@ratios4asyncreadtwohop\endcsname{2.1} +\expandafter\def\csname m@hss4asyncreadtwohop\endcsname{172\,k} +\expandafter\def\csname m@hgs4asyncreadtwohop\endcsname{80.9\,k} +\expandafter\def\csname m@ratios4asyncreadincidenceparallel\endcsname{6.5} +\expandafter\def\csname m@hss4asyncreadincidenceparallel\endcsname{8.21\,M} +\expandafter\def\csname m@hgs4asyncreadincidenceparallel\endcsname{1.26\,M} +\expandafter\def\csname m@ratios4asynclatencyread\endcsname{3.8} +\expandafter\def\csname m@hss4asynclatencyread\endcsname{1.79\,M} +\expandafter\def\csname m@hgs4asynclatencyread\endcsname{470\,k} +\expandafter\def\csname m@ratios4asyncwriteupdate\endcsname{12.2} +\expandafter\def\csname m@hss4asyncwriteupdate\endcsname{30.2\,k} +\expandafter\def\csname m@hgs4asyncwriteupdate\endcsname{2.47\,k} +\expandafter\def\csname m@ratios4asynclatencycommit\endcsname{4.0} +\expandafter\def\csname m@hss4asynclatencycommit\endcsname{10.1\,k} +\expandafter\def\csname m@hgs4asynclatencycommit\endcsname{2.54\,k} +\expandafter\def\csname m@ratios4asyncmixedread\endcsname{7.7} +\expandafter\def\csname m@hss4asyncmixedread\endcsname{8.55\,M} +\expandafter\def\csname m@hgs4asyncmixedread\endcsname{1.11\,M} +\expandafter\def\csname m@ratios4asyncmixedwrite\endcsname{1.0} +\expandafter\def\csname m@hss4asyncmixedwrite\endcsname{1,000} +\expandafter\def\csname m@hgs4asyncmixedwrite\endcsname{999} +\expandafter\def\csname m@ratios4asynclargeingest\endcsname{36.1} +\expandafter\def\csname m@hss4asynclargeingest\endcsname{489\,k} +\expandafter\def\csname m@hgs4asynclargeingest\endcsname{13.6\,k} +\expandafter\def\csname m@ratios4asynclargescan\endcsname{4.4} +\expandafter\def\csname m@hss4asynclargescan\endcsname{1,583\,M} +\expandafter\def\csname m@hgs4asynclargescan\endcsname{358\,M} +\expandafter\def\csname m@ratios4asynclargeprobe\endcsname{6.7} +\expandafter\def\csname m@hss4asynclargeprobe\endcsname{5.61\,M} +\expandafter\def\csname m@hgs4asynclargeprobe\endcsname{844\,k} +\expandafter\def\csname m@ratios4asyncreopen\endcsname{13.8} +\expandafter\def\csname m@hss4asyncreopen\endcsname{92.9\,ms} +\expandafter\def\csname m@hgs4asyncreopen\endcsname{1,279\,ms} +\expandafter\def\csname m@ratios4asyncreadincidencecold\endcsname{81.6} +\expandafter\def\csname m@hss4asyncreadincidencecold\endcsname{1.23\,M} +\expandafter\def\csname m@hgs4asyncreadincidencecold\endcsname{15.1\,k} +\expandafter\def\csname m@ratios4asyncdisk\endcsname{13.7} +\expandafter\def\csname m@hss4asyncdisk\endcsname{172\,MiB} +\expandafter\def\csname m@hgs4asyncdisk\endcsname{2.30\,GiB} +\expandafter\def\csname m@ratios4asyncchurndelete\endcsname{1.3} +\expandafter\def\csname m@hss4asyncchurndelete\endcsname{2.64\,k} +\expandafter\def\csname m@hgs4asyncchurndelete\endcsname{1.99\,k} +\expandafter\def\csname m@ratios4asyncchurnremove\endcsname{1.2} +\expandafter\def\csname m@hss4asyncchurnremove\endcsname{4.08\,k} +\expandafter\def\csname m@hgs4asyncchurnremove\endcsname{3.53\,k} +\expandafter\def\csname m@ratios4asyncreadincidencechurned\endcsname{2.6} +\expandafter\def\csname m@hss4asyncreadincidencechurned\endcsname{2.75\,M} +\expandafter\def\csname m@hgs4asyncreadincidencechurned\endcsname{1.05\,M} +\expandafter\def\csname m@ratios4asyncdiskchurned\endcsname{1.7} +\expandafter\def\csname m@hss4asyncdiskchurned\endcsname{1.14\,GiB} +\expandafter\def\csname m@hgs4asyncdiskchurned\endcsname{1.91\,GiB} +\expandafter\def\csname m@ratios4asynccompactionbaseline\endcsname{1.0} +\expandafter\def\csname m@hss4asynccompactionbaseline\endcsname{50.1} +\expandafter\def\csname m@hgs4asynccompactionbaseline\endcsname{50.1} +\expandafter\def\csname m@ratios4asynccompaction\endcsname{1.0} +\expandafter\def\csname m@hss4asynccompaction\endcsname{50.1} +\expandafter\def\csname m@hgs4asynccompaction\endcsname{50.0} +\expandafter\def\csname m@ratios4asyncdiskcompacted\endcsname{6.4} +\expandafter\def\csname m@hss4asyncdiskcompacted\endcsname{183\,MiB} +\expandafter\def\csname m@hgs4asyncdiskcompacted\endcsname{1.15\,GiB} +\expandafter\def\csname m@ratios4asyncrecover\endcsname{2.8} +\expandafter\def\csname m@hss4asyncrecover\endcsname{162\,ms} +\expandafter\def\csname m@hgs4asyncrecover\endcsname{449\,ms} +\expandafter\def\csname m@workloadCount\endcsname{26} +\expandafter\def\csname m@runss1async\endcsname{5} +\expandafter\def\csname m@runss1sync\endcsname{5} +\expandafter\def\csname m@runss4async\endcsname{3} +\expandafter\def\csname m@lats1asynclatencyreadhspfifty\endcsname{0.429\,\textmu{}s} +\expandafter\def\csname m@lats1asynclatencyreadhspninetynine\endcsname{0.850\,\textmu{}s} +\expandafter\def\csname m@lats1asynclatencyreadhspninetyninenine\endcsname{1.23\,\textmu{}s} +\expandafter\def\csname m@lats1asynclatencyreadhsmax\endcsname{26.8\,\textmu{}s} +\expandafter\def\csname m@lats1asynclatencyreadhsworst\endcsname{37.8\,\textmu{}s} +\expandafter\def\csname m@lats1asynclatencyreadhgpfifty\endcsname{1.55\,\textmu{}s} +\expandafter\def\csname m@lats1asynclatencyreadhgpninetynine\endcsname{4.74\,\textmu{}s} +\expandafter\def\csname m@lats1asynclatencyreadhgpninetyninenine\endcsname{12.1\,\textmu{}s} +\expandafter\def\csname m@lats1asynclatencyreadhgmax\endcsname{37.8\,\textmu{}s} +\expandafter\def\csname m@lats1asynclatencyreadhgworst\endcsname{311\,\textmu{}s} +\expandafter\def\csname m@lats1asynclatencycommithspfifty\endcsname{143\,\textmu{}s} +\expandafter\def\csname m@lats1asynclatencycommithspninetynine\endcsname{228\,\textmu{}s} +\expandafter\def\csname m@lats1asynclatencycommithspninetyninenine\endcsname{338\,\textmu{}s} +\expandafter\def\csname m@lats1asynclatencycommithsmax\endcsname{505\,\textmu{}s} +\expandafter\def\csname m@lats1asynclatencycommithsworst\endcsname{14.0\,ms} +\expandafter\def\csname m@lats1asynclatencycommithgpfifty\endcsname{93.7\,\textmu{}s} +\expandafter\def\csname m@lats1asynclatencycommithgpninetynine\endcsname{767\,\textmu{}s} +\expandafter\def\csname m@lats1asynclatencycommithgpninetyninenine\endcsname{1.78\,ms} +\expandafter\def\csname m@lats1asynclatencycommithgmax\endcsname{12.8\,ms} +\expandafter\def\csname m@lats1asynclatencycommithgworst\endcsname{14.1\,ms} +\expandafter\def\csname m@lats1asyncmixedreadhspfifty\endcsname{0.649\,\textmu{}s} +\expandafter\def\csname m@lats1asyncmixedreadhspninetynine\endcsname{1.30\,\textmu{}s} +\expandafter\def\csname m@lats1asyncmixedreadhspninetyninenine\endcsname{5.47\,\textmu{}s} +\expandafter\def\csname m@lats1asyncmixedreadhsmax\endcsname{18.6\,ms} +\expandafter\def\csname m@lats1asyncmixedreadhsworst\endcsname{20.4\,ms} +\expandafter\def\csname m@lats1asyncmixedreadhgpfifty\endcsname{3.72\,\textmu{}s} +\expandafter\def\csname m@lats1asyncmixedreadhgpninetynine\endcsname{7.41\,\textmu{}s} +\expandafter\def\csname m@lats1asyncmixedreadhgpninetyninenine\endcsname{94.1\,\textmu{}s} +\expandafter\def\csname m@lats1asyncmixedreadhgmax\endcsname{359\,ms} +\expandafter\def\csname m@lats1asyncmixedreadhgworst\endcsname{851\,ms} +\expandafter\def\csname m@lats1asyncmixedwritehspfifty\endcsname{1.12\,ms} +\expandafter\def\csname m@lats1asyncmixedwritehspninetynine\endcsname{5.68\,ms} +\expandafter\def\csname m@lats1asyncmixedwritehspninetyninenine\endcsname{18.0\,ms} +\expandafter\def\csname m@lats1asyncmixedwritehsmax\endcsname{18.0\,ms} +\expandafter\def\csname m@lats1asyncmixedwritehsworst\endcsname{18.7\,ms} +\expandafter\def\csname m@lats1asyncmixedwritehgpfifty\endcsname{4.36\,ms} +\expandafter\def\csname m@lats1asyncmixedwritehgpninetynine\endcsname{28.5\,ms} +\expandafter\def\csname m@lats1asyncmixedwritehgpninetyninenine\endcsname{44.9\,ms} +\expandafter\def\csname m@lats1asyncmixedwritehgmax\endcsname{44.9\,ms} +\expandafter\def\csname m@lats1asyncmixedwritehgworst\endcsname{60.4\,ms} +\expandafter\def\csname m@lats1asynccompactionbaselinehspfifty\endcsname{455\,\textmu{}s} +\expandafter\def\csname m@lats1asynccompactionbaselinehspninetynine\endcsname{729\,\textmu{}s} +\expandafter\def\csname m@lats1asynccompactionbaselinehspninetyninenine\endcsname{2.68\,ms} +\expandafter\def\csname m@lats1asynccompactionbaselinehsmax\endcsname{2.68\,ms} +\expandafter\def\csname m@lats1asynccompactionbaselinehsworst\endcsname{3.73\,ms} +\expandafter\def\csname m@lats1asynccompactionbaselinehgpfifty\endcsname{519\,\textmu{}s} +\expandafter\def\csname m@lats1asynccompactionbaselinehgpninetynine\endcsname{3.88\,ms} +\expandafter\def\csname m@lats1asynccompactionbaselinehgpninetyninenine\endcsname{10.0\,ms} +\expandafter\def\csname m@lats1asynccompactionbaselinehgmax\endcsname{10.0\,ms} +\expandafter\def\csname m@lats1asynccompactionbaselinehgworst\endcsname{18.6\,ms} +\expandafter\def\csname m@lats1asynccompactionhspfifty\endcsname{483\,\textmu{}s} +\expandafter\def\csname m@lats1asynccompactionhspninetynine\endcsname{754\,\textmu{}s} +\expandafter\def\csname m@lats1asynccompactionhspninetyninenine\endcsname{1.02\,ms} +\expandafter\def\csname m@lats1asynccompactionhsmax\endcsname{1.02\,ms} +\expandafter\def\csname m@lats1asynccompactionhsworst\endcsname{39.8\,ms} +\expandafter\def\csname m@lats1asynccompactionhgpfifty\endcsname{480\,\textmu{}s} +\expandafter\def\csname m@lats1asynccompactionhgpninetynine\endcsname{4.90\,ms} +\expandafter\def\csname m@lats1asynccompactionhgpninetyninenine\endcsname{9.52\,ms} +\expandafter\def\csname m@lats1asynccompactionhgmax\endcsname{14.6\,ms} +\expandafter\def\csname m@lats1asynccompactionhgworst\endcsname{19.6\,ms} +\expandafter\def\csname m@lats1synclatencyreadhspfifty\endcsname{0.401\,\textmu{}s} +\expandafter\def\csname m@lats1synclatencyreadhspninetynine\endcsname{0.818\,\textmu{}s} +\expandafter\def\csname m@lats1synclatencyreadhspninetyninenine\endcsname{1.18\,\textmu{}s} +\expandafter\def\csname m@lats1synclatencyreadhsmax\endcsname{12.5\,\textmu{}s} +\expandafter\def\csname m@lats1synclatencyreadhsworst\endcsname{23.3\,\textmu{}s} +\expandafter\def\csname m@lats1synclatencyreadhgpfifty\endcsname{1.34\,\textmu{}s} +\expandafter\def\csname m@lats1synclatencyreadhgpninetynine\endcsname{4.68\,\textmu{}s} +\expandafter\def\csname m@lats1synclatencyreadhgpninetyninenine\endcsname{12.3\,\textmu{}s} +\expandafter\def\csname m@lats1synclatencyreadhgmax\endcsname{33.9\,\textmu{}s} +\expandafter\def\csname m@lats1synclatencyreadhgworst\endcsname{9.07\,ms} +\expandafter\def\csname m@lats1synclatencycommithspfifty\endcsname{537\,\textmu{}s} +\expandafter\def\csname m@lats1synclatencycommithspninetynine\endcsname{1.00\,ms} +\expandafter\def\csname m@lats1synclatencycommithspninetyninenine\endcsname{1.54\,ms} +\expandafter\def\csname m@lats1synclatencycommithsmax\endcsname{13.5\,ms} +\expandafter\def\csname m@lats1synclatencycommithsworst\endcsname{41.2\,ms} +\expandafter\def\csname m@lats1synclatencycommithgpfifty\endcsname{628\,\textmu{}s} +\expandafter\def\csname m@lats1synclatencycommithgpninetynine\endcsname{1.64\,ms} +\expandafter\def\csname m@lats1synclatencycommithgpninetyninenine\endcsname{7.48\,ms} +\expandafter\def\csname m@lats1synclatencycommithgmax\endcsname{11.6\,ms} +\expandafter\def\csname m@lats1synclatencycommithgworst\endcsname{32.5\,ms} +\expandafter\def\csname m@lats1syncmixedreadhspfifty\endcsname{0.613\,\textmu{}s} +\expandafter\def\csname m@lats1syncmixedreadhspninetynine\endcsname{1.25\,\textmu{}s} +\expandafter\def\csname m@lats1syncmixedreadhspninetyninenine\endcsname{5.46\,\textmu{}s} +\expandafter\def\csname m@lats1syncmixedreadhsmax\endcsname{20.9\,ms} +\expandafter\def\csname m@lats1syncmixedreadhsworst\endcsname{21.7\,ms} +\expandafter\def\csname m@lats1syncmixedreadhgpfifty\endcsname{3.71\,\textmu{}s} +\expandafter\def\csname m@lats1syncmixedreadhgpninetynine\endcsname{7.50\,\textmu{}s} +\expandafter\def\csname m@lats1syncmixedreadhgpninetyninenine\endcsname{83.5\,\textmu{}s} +\expandafter\def\csname m@lats1syncmixedreadhgmax\endcsname{471\,ms} +\expandafter\def\csname m@lats1syncmixedreadhgworst\endcsname{740\,ms} +\expandafter\def\csname m@lats1syncmixedwritehspfifty\endcsname{1.44\,ms} +\expandafter\def\csname m@lats1syncmixedwritehspninetynine\endcsname{7.21\,ms} +\expandafter\def\csname m@lats1syncmixedwritehspninetyninenine\endcsname{19.2\,ms} +\expandafter\def\csname m@lats1syncmixedwritehsmax\endcsname{19.2\,ms} +\expandafter\def\csname m@lats1syncmixedwritehsworst\endcsname{24.2\,ms} +\expandafter\def\csname m@lats1syncmixedwritehgpfifty\endcsname{4.94\,ms} +\expandafter\def\csname m@lats1syncmixedwritehgpninetynine\endcsname{29.5\,ms} +\expandafter\def\csname m@lats1syncmixedwritehgpninetyninenine\endcsname{42.2\,ms} +\expandafter\def\csname m@lats1syncmixedwritehgmax\endcsname{42.2\,ms} +\expandafter\def\csname m@lats1syncmixedwritehgworst\endcsname{60.1\,ms} +\expandafter\def\csname m@lats1synccompactionbaselinehspfifty\endcsname{1.13\,ms} +\expandafter\def\csname m@lats1synccompactionbaselinehspninetynine\endcsname{2.11\,ms} +\expandafter\def\csname m@lats1synccompactionbaselinehspninetyninenine\endcsname{3.60\,ms} +\expandafter\def\csname m@lats1synccompactionbaselinehsmax\endcsname{3.60\,ms} +\expandafter\def\csname m@lats1synccompactionbaselinehsworst\endcsname{45.6\,ms} +\expandafter\def\csname m@lats1synccompactionbaselinehgpfifty\endcsname{1.24\,ms} +\expandafter\def\csname m@lats1synccompactionbaselinehgpninetynine\endcsname{3.81\,ms} +\expandafter\def\csname m@lats1synccompactionbaselinehgpninetyninenine\endcsname{18.7\,ms} +\expandafter\def\csname m@lats1synccompactionbaselinehgmax\endcsname{18.7\,ms} +\expandafter\def\csname m@lats1synccompactionbaselinehgworst\endcsname{21.5\,ms} +\expandafter\def\csname m@lats1synccompactionhspfifty\endcsname{1.05\,ms} +\expandafter\def\csname m@lats1synccompactionhspninetynine\endcsname{1.83\,ms} +\expandafter\def\csname m@lats1synccompactionhspninetyninenine\endcsname{5.31\,ms} +\expandafter\def\csname m@lats1synccompactionhsmax\endcsname{5.31\,ms} +\expandafter\def\csname m@lats1synccompactionhsworst\endcsname{61.7\,ms} +\expandafter\def\csname m@lats1synccompactionhgpfifty\endcsname{1.27\,ms} +\expandafter\def\csname m@lats1synccompactionhgpninetynine\endcsname{3.47\,ms} +\expandafter\def\csname m@lats1synccompactionhgpninetyninenine\endcsname{12.0\,ms} +\expandafter\def\csname m@lats1synccompactionhgmax\endcsname{12.0\,ms} +\expandafter\def\csname m@lats1synccompactionhgworst\endcsname{18.9\,ms} +\expandafter\def\csname m@lats4asynclatencyreadhspfifty\endcsname{0.487\,\textmu{}s} +\expandafter\def\csname m@lats4asynclatencyreadhspninetynine\endcsname{1.01\,\textmu{}s} +\expandafter\def\csname m@lats4asynclatencyreadhspninetyninenine\endcsname{1.49\,\textmu{}s} +\expandafter\def\csname m@lats4asynclatencyreadhsmax\endcsname{18.2\,\textmu{}s} +\expandafter\def\csname m@lats4asynclatencyreadhsworst\endcsname{29.7\,\textmu{}s} +\expandafter\def\csname m@lats4asynclatencyreadhgpfifty\endcsname{1.60\,\textmu{}s} +\expandafter\def\csname m@lats4asynclatencyreadhgpninetynine\endcsname{5.72\,\textmu{}s} +\expandafter\def\csname m@lats4asynclatencyreadhgpninetyninenine\endcsname{13.9\,\textmu{}s} +\expandafter\def\csname m@lats4asynclatencyreadhgmax\endcsname{413\,\textmu{}s} +\expandafter\def\csname m@lats4asynclatencyreadhgworst\endcsname{11.8\,ms} +\expandafter\def\csname m@lats4asynclatencycommithspfifty\endcsname{91.0\,\textmu{}s} +\expandafter\def\csname m@lats4asynclatencycommithspninetynine\endcsname{172\,\textmu{}s} +\expandafter\def\csname m@lats4asynclatencycommithspninetyninenine\endcsname{287\,\textmu{}s} +\expandafter\def\csname m@lats4asynclatencycommithsmax\endcsname{34.9\,ms} +\expandafter\def\csname m@lats4asynclatencycommithsworst\endcsname{35.9\,ms} +\expandafter\def\csname m@lats4asynclatencycommithgpfifty\endcsname{246\,\textmu{}s} +\expandafter\def\csname m@lats4asynclatencycommithgpninetynine\endcsname{1.81\,ms} +\expandafter\def\csname m@lats4asynclatencycommithgpninetyninenine\endcsname{6.44\,ms} +\expandafter\def\csname m@lats4asynclatencycommithgmax\endcsname{9.31\,ms} +\expandafter\def\csname m@lats4asynclatencycommithgworst\endcsname{10.4\,ms} +\expandafter\def\csname m@lats4asyncmixedreadhspfifty\endcsname{0.653\,\textmu{}s} +\expandafter\def\csname m@lats4asyncmixedreadhspninetynine\endcsname{1.28\,\textmu{}s} +\expandafter\def\csname m@lats4asyncmixedreadhspninetyninenine\endcsname{2.63\,\textmu{}s} +\expandafter\def\csname m@lats4asyncmixedreadhsmax\endcsname{31.0\,ms} +\expandafter\def\csname m@lats4asyncmixedreadhsworst\endcsname{33.0\,ms} +\expandafter\def\csname m@lats4asyncmixedreadhgpfifty\endcsname{3.73\,\textmu{}s} +\expandafter\def\csname m@lats4asyncmixedreadhgpninetynine\endcsname{7.14\,\textmu{}s} +\expandafter\def\csname m@lats4asyncmixedreadhgpninetyninenine\endcsname{119\,\textmu{}s} +\expandafter\def\csname m@lats4asyncmixedreadhgmax\endcsname{281\,ms} +\expandafter\def\csname m@lats4asyncmixedreadhgworst\endcsname{664\,ms} +\expandafter\def\csname m@lats4asyncmixedwritehspfifty\endcsname{1.49\,ms} +\expandafter\def\csname m@lats4asyncmixedwritehspninetynine\endcsname{14.8\,ms} +\expandafter\def\csname m@lats4asyncmixedwritehspninetyninenine\endcsname{26.1\,ms} +\expandafter\def\csname m@lats4asyncmixedwritehsmax\endcsname{26.1\,ms} +\expandafter\def\csname m@lats4asyncmixedwritehsworst\endcsname{27.7\,ms} +\expandafter\def\csname m@lats4asyncmixedwritehgpfifty\endcsname{9.58\,ms} +\expandafter\def\csname m@lats4asyncmixedwritehgpninetynine\endcsname{48.9\,ms} +\expandafter\def\csname m@lats4asyncmixedwritehgpninetyninenine\endcsname{62.7\,ms} +\expandafter\def\csname m@lats4asyncmixedwritehgmax\endcsname{62.7\,ms} +\expandafter\def\csname m@lats4asyncmixedwritehgworst\endcsname{69.8\,ms} +\expandafter\def\csname m@lats4asynccompactionbaselinehspfifty\endcsname{443\,\textmu{}s} +\expandafter\def\csname m@lats4asynccompactionbaselinehspninetynine\endcsname{742\,\textmu{}s} +\expandafter\def\csname m@lats4asynccompactionbaselinehspninetyninenine\endcsname{2.51\,ms} +\expandafter\def\csname m@lats4asynccompactionbaselinehsmax\endcsname{2.51\,ms} +\expandafter\def\csname m@lats4asynccompactionbaselinehsworst\endcsname{2.55\,ms} +\expandafter\def\csname m@lats4asynccompactionbaselinehgpfifty\endcsname{688\,\textmu{}s} +\expandafter\def\csname m@lats4asynccompactionbaselinehgpninetynine\endcsname{4.92\,ms} +\expandafter\def\csname m@lats4asynccompactionbaselinehgpninetyninenine\endcsname{10.0\,ms} +\expandafter\def\csname m@lats4asynccompactionbaselinehgmax\endcsname{10.0\,ms} +\expandafter\def\csname m@lats4asynccompactionbaselinehgworst\endcsname{16.9\,ms} +\expandafter\def\csname m@lats4asynccompactionhspfifty\endcsname{448\,\textmu{}s} +\expandafter\def\csname m@lats4asynccompactionhspninetynine\endcsname{714\,\textmu{}s} +\expandafter\def\csname m@lats4asynccompactionhspninetyninenine\endcsname{773\,\textmu{}s} +\expandafter\def\csname m@lats4asynccompactionhsmax\endcsname{773\,\textmu{}s} +\expandafter\def\csname m@lats4asynccompactionhsworst\endcsname{1.00\,ms} +\expandafter\def\csname m@lats4asynccompactionhgpfifty\endcsname{742\,\textmu{}s} +\expandafter\def\csname m@lats4asynccompactionhgpninetynine\endcsname{5.85\,ms} +\expandafter\def\csname m@lats4asynccompactionhgpninetyninenine\endcsname{8.73\,ms} +\expandafter\def\csname m@lats4asynccompactionhgmax\endcsname{172\,ms} +\expandafter\def\csname m@lats4asynccompactionhgworst\endcsname{174\,ms} +\expandafter\def\csname m@allocs1asyncingestnodeshs\endcsname{14.0\,KiB} +\expandafter\def\csname m@writtens1asyncingestnodeshs\endcsname{311\,B} +\expandafter\def\csname m@allocs1asyncingestnodeshg\endcsname{18.2\,KiB} +\expandafter\def\csname m@writtens1asyncingestnodeshg\endcsname{1.04\,KiB} +\expandafter\def\csname m@allocs1asyncingestedgeshs\endcsname{22.0\,KiB} +\expandafter\def\csname m@writtens1asyncingestedgeshs\endcsname{488\,B} +\expandafter\def\csname m@allocs1asyncingestedgeshg\endcsname{29.1\,KiB} +\expandafter\def\csname m@writtens1asyncingestedgeshg\endcsname{2.32\,KiB} +\expandafter\def\csname m@allocs1asyncreadincidencehs\endcsname{1\,B} +\expandafter\def\csname m@reads1asyncreadincidencehs\endcsname{0\,B} +\expandafter\def\csname m@allocs1asyncreadincidencehg\endcsname{116\,B} +\expandafter\def\csname m@reads1asyncreadincidencehg\endcsname{126\,B} +\expandafter\def\csname m@allocs1asyncreadmembershs\endcsname{40\,B} +\expandafter\def\csname m@reads1asyncreadmembershs\endcsname{0\,B} +\expandafter\def\csname m@allocs1asyncreadmembershg\endcsname{49\,B} +\expandafter\def\csname m@reads1asyncreadmembershg\endcsname{146\,B} +\expandafter\def\csname m@allocs1asyncreadcomembershiphs\endcsname{3.15\,KiB} +\expandafter\def\csname m@reads1asyncreadcomembershiphs\endcsname{0\,B} +\expandafter\def\csname m@allocs1asyncreadcomembershiphg\endcsname{7.83\,KiB} +\expandafter\def\csname m@reads1asyncreadcomembershiphg\endcsname{5.60\,KiB} +\expandafter\def\csname m@allocs1asyncreadtwohophs\endcsname{380\,B} +\expandafter\def\csname m@reads1asyncreadtwohophs\endcsname{0\,B} +\expandafter\def\csname m@allocs1asyncreadtwohophg\endcsname{1.80\,KiB} +\expandafter\def\csname m@reads1asyncreadtwohophg\endcsname{3.85\,KiB} +\expandafter\def\csname m@allocs1asyncreadincidenceparallelhs\endcsname{2\,B} +\expandafter\def\csname m@allocs1asyncreadincidenceparallelhg\endcsname{904\,B} +\expandafter\def\csname m@allocs1asynclatencyreadhs\endcsname{49\,B} +\expandafter\def\csname m@allocs1asynclatencyreadhg\endcsname{4.77\,KiB} +\expandafter\def\csname m@allocs1asyncwriteupdatehs\endcsname{12.1\,KiB} +\expandafter\def\csname m@writtens1asyncwriteupdatehs\endcsname{224\,B} +\expandafter\def\csname m@allocs1asyncwriteupdatehg\endcsname{204\,KiB} +\expandafter\def\csname m@writtens1asyncwriteupdatehg\endcsname{9.12\,KiB} +\expandafter\def\csname m@allocs1asynclatencycommiths\endcsname{46.1\,KiB} +\expandafter\def\csname m@writtens1asynclatencycommiths\endcsname{659\,B} +\expandafter\def\csname m@allocs1asynclatencycommithg\endcsname{225\,KiB} +\expandafter\def\csname m@writtens1asynclatencycommithg\endcsname{11.1\,KiB} +\expandafter\def\csname m@allocs1asyncmixedreadhs\endcsname{50\,B} +\expandafter\def\csname m@allocs1asyncmixedreadhg\endcsname{1.90\,KiB} +\expandafter\def\csname m@writtens1asyncmixedwritehs\endcsname{1.28\,KiB} +\expandafter\def\csname m@writtens1asyncmixedwritehg\endcsname{32.9\,KiB} +\expandafter\def\csname m@allocs1asynclargeingesths\endcsname{1.48\,KiB} +\expandafter\def\csname m@writtens1asynclargeingesths\endcsname{145\,B} +\expandafter\def\csname m@allocs1asynclargeingesthg\endcsname{32.3\,KiB} +\expandafter\def\csname m@writtens1asynclargeingesthg\endcsname{1.81\,KiB} +\expandafter\def\csname m@allocs1asynclargescanhs\endcsname{0\,B} +\expandafter\def\csname m@reads1asynclargescanhs\endcsname{0\,B} +\expandafter\def\csname m@allocs1asynclargescanhg\endcsname{0\,B} +\expandafter\def\csname m@reads1asynclargescanhg\endcsname{1\,B} +\expandafter\def\csname m@allocs1asynclargeprobehs\endcsname{0\,B} +\expandafter\def\csname m@reads1asynclargeprobehs\endcsname{0\,B} +\expandafter\def\csname m@allocs1asynclargeprobehg\endcsname{109\,B} +\expandafter\def\csname m@reads1asynclargeprobehg\endcsname{380\,B} +\expandafter\def\csname m@allocs1asyncreopenhs\endcsname{24.4\,MiB} +\expandafter\def\csname m@allocs1asyncreopenhg\endcsname{1.48\,GiB} +\expandafter\def\csname m@allocs1asyncreadincidencecoldhs\endcsname{318\,B} +\expandafter\def\csname m@reads1asyncreadincidencecoldhs\endcsname{27\,B} +\expandafter\def\csname m@allocs1asyncreadincidencecoldhg\endcsname{6.25\,KiB} +\expandafter\def\csname m@reads1asyncreadincidencecoldhg\endcsname{5.44\,KiB} +\expandafter\def\csname m@allocs1asyncchurndeletehs\endcsname{38.5\,KiB} +\expandafter\def\csname m@writtens1asyncchurndeletehs\endcsname{994\,B} +\expandafter\def\csname m@allocs1asyncchurndeletehg\endcsname{316\,KiB} +\expandafter\def\csname m@writtens1asyncchurndeletehg\endcsname{12.5\,KiB} +\expandafter\def\csname m@allocs1asyncchurnremovehs\endcsname{17.9\,KiB} +\expandafter\def\csname m@writtens1asyncchurnremovehs\endcsname{690\,B} +\expandafter\def\csname m@allocs1asyncchurnremovehg\endcsname{165\,KiB} +\expandafter\def\csname m@writtens1asyncchurnremovehg\endcsname{7.44\,KiB} +\expandafter\def\csname m@allocs1asyncreadincidencechurnedhs\endcsname{41\,B} +\expandafter\def\csname m@reads1asyncreadincidencechurnedhs\endcsname{0\,B} +\expandafter\def\csname m@allocs1asyncreadincidencechurnedhg\endcsname{104\,B} +\expandafter\def\csname m@reads1asyncreadincidencechurnedhg\endcsname{123\,B} +\expandafter\def\csname m@allocs1asynccompactionbaselinehs\endcsname{157\,KiB} +\expandafter\def\csname m@writtens1asynccompactionbaselinehs\endcsname{15.1\,KiB} +\expandafter\def\csname m@allocs1asynccompactionbaselinehg\endcsname{12.9\,MiB} +\expandafter\def\csname m@writtens1asynccompactionbaselinehg\endcsname{811\,KiB} +\expandafter\def\csname m@allocs1asynccompactionhs\endcsname{148\,KiB} +\expandafter\def\csname m@writtens1asynccompactionhs\endcsname{4.07\,KiB} +\expandafter\def\csname m@allocs1asynccompactionhg\endcsname{18.7\,MiB} +\expandafter\def\csname m@writtens1asynccompactionhg\endcsname{1.13\,MiB} +\expandafter\def\csname m@allocs1asyncrecoverhs\endcsname{65.5\,MiB} +\expandafter\def\csname m@allocs1asyncrecoverhg\endcsname{78.1\,MiB} +\expandafter\def\csname m@allocs1syncingestnodeshs\endcsname{13.8\,KiB} +\expandafter\def\csname m@writtens1syncingestnodeshs\endcsname{311\,B} +\expandafter\def\csname m@allocs1syncingestnodeshg\endcsname{18.1\,KiB} +\expandafter\def\csname m@writtens1syncingestnodeshg\endcsname{1.04\,KiB} +\expandafter\def\csname m@allocs1syncingestedgeshs\endcsname{22.0\,KiB} +\expandafter\def\csname m@writtens1syncingestedgeshs\endcsname{488\,B} +\expandafter\def\csname m@allocs1syncingestedgeshg\endcsname{29.6\,KiB} +\expandafter\def\csname m@writtens1syncingestedgeshg\endcsname{2.33\,KiB} +\expandafter\def\csname m@allocs1syncreadincidencehs\endcsname{1\,B} +\expandafter\def\csname m@reads1syncreadincidencehs\endcsname{0\,B} +\expandafter\def\csname m@allocs1syncreadincidencehg\endcsname{112\,B} +\expandafter\def\csname m@reads1syncreadincidencehg\endcsname{167\,B} +\expandafter\def\csname m@allocs1syncreadmembershs\endcsname{40\,B} +\expandafter\def\csname m@reads1syncreadmembershs\endcsname{0\,B} +\expandafter\def\csname m@allocs1syncreadmembershg\endcsname{49\,B} +\expandafter\def\csname m@reads1syncreadmembershg\endcsname{173\,B} +\expandafter\def\csname m@allocs1syncreadcomembershiphs\endcsname{3.15\,KiB} +\expandafter\def\csname m@reads1syncreadcomembershiphs\endcsname{0\,B} +\expandafter\def\csname m@allocs1syncreadcomembershiphg\endcsname{7.83\,KiB} +\expandafter\def\csname m@reads1syncreadcomembershiphg\endcsname{4.97\,KiB} +\expandafter\def\csname m@allocs1syncreadtwohophs\endcsname{380\,B} +\expandafter\def\csname m@reads1syncreadtwohophs\endcsname{0\,B} +\expandafter\def\csname m@allocs1syncreadtwohophg\endcsname{1.80\,KiB} +\expandafter\def\csname m@reads1syncreadtwohophg\endcsname{4.16\,KiB} +\expandafter\def\csname m@allocs1syncreadincidenceparallelhs\endcsname{2\,B} +\expandafter\def\csname m@allocs1syncreadincidenceparallelhg\endcsname{956\,B} +\expandafter\def\csname m@allocs1synclatencyreadhs\endcsname{49\,B} +\expandafter\def\csname m@allocs1synclatencyreadhg\endcsname{3.70\,KiB} +\expandafter\def\csname m@allocs1syncwriteupdatehs\endcsname{12.2\,KiB} +\expandafter\def\csname m@writtens1syncwriteupdatehs\endcsname{224\,B} +\expandafter\def\csname m@allocs1syncwriteupdatehg\endcsname{219\,KiB} +\expandafter\def\csname m@writtens1syncwriteupdatehg\endcsname{9.63\,KiB} +\expandafter\def\csname m@allocs1synclatencycommiths\endcsname{44.5\,KiB} +\expandafter\def\csname m@writtens1synclatencycommiths\endcsname{659\,B} +\expandafter\def\csname m@allocs1synclatencycommithg\endcsname{1.19\,MiB} +\expandafter\def\csname m@writtens1synclatencycommithg\endcsname{57.5\,KiB} +\expandafter\def\csname m@allocs1syncmixedreadhs\endcsname{49\,B} +\expandafter\def\csname m@allocs1syncmixedreadhg\endcsname{1.92\,KiB} +\expandafter\def\csname m@writtens1syncmixedwritehs\endcsname{1.36\,KiB} +\expandafter\def\csname m@writtens1syncmixedwritehg\endcsname{35.4\,KiB} +\expandafter\def\csname m@allocs1synclargeingesths\endcsname{1.50\,KiB} +\expandafter\def\csname m@writtens1synclargeingesths\endcsname{144\,B} +\expandafter\def\csname m@allocs1synclargeingesthg\endcsname{24.1\,KiB} +\expandafter\def\csname m@writtens1synclargeingesthg\endcsname{1.43\,KiB} +\expandafter\def\csname m@allocs1synclargescanhs\endcsname{0\,B} +\expandafter\def\csname m@reads1synclargescanhs\endcsname{0\,B} +\expandafter\def\csname m@allocs1synclargescanhg\endcsname{0\,B} +\expandafter\def\csname m@reads1synclargescanhg\endcsname{1\,B} +\expandafter\def\csname m@allocs1synclargeprobehs\endcsname{0\,B} +\expandafter\def\csname m@reads1synclargeprobehs\endcsname{0\,B} +\expandafter\def\csname m@allocs1synclargeprobehg\endcsname{107\,B} +\expandafter\def\csname m@reads1synclargeprobehg\endcsname{335\,B} +\expandafter\def\csname m@allocs1syncreopenhs\endcsname{24.4\,MiB} +\expandafter\def\csname m@allocs1syncreopenhg\endcsname{1.56\,GiB} +\expandafter\def\csname m@allocs1syncreadincidencecoldhs\endcsname{312\,B} +\expandafter\def\csname m@reads1syncreadincidencecoldhs\endcsname{27\,B} +\expandafter\def\csname m@allocs1syncreadincidencecoldhg\endcsname{6.27\,KiB} +\expandafter\def\csname m@reads1syncreadincidencecoldhg\endcsname{4.75\,KiB} +\expandafter\def\csname m@allocs1syncchurndeletehs\endcsname{39.4\,KiB} +\expandafter\def\csname m@writtens1syncchurndeletehs\endcsname{1.17\,KiB} +\expandafter\def\csname m@allocs1syncchurndeletehg\endcsname{290\,KiB} +\expandafter\def\csname m@writtens1syncchurndeletehg\endcsname{11.8\,KiB} +\expandafter\def\csname m@allocs1syncchurnremovehs\endcsname{16.8\,KiB} +\expandafter\def\csname m@writtens1syncchurnremovehs\endcsname{690\,B} +\expandafter\def\csname m@allocs1syncchurnremovehg\endcsname{159\,KiB} +\expandafter\def\csname m@writtens1syncchurnremovehg\endcsname{7.26\,KiB} +\expandafter\def\csname m@allocs1syncreadincidencechurnedhs\endcsname{17\,B} +\expandafter\def\csname m@reads1syncreadincidencechurnedhs\endcsname{0\,B} +\expandafter\def\csname m@allocs1syncreadincidencechurnedhg\endcsname{104\,B} +\expandafter\def\csname m@reads1syncreadincidencechurnedhg\endcsname{174\,B} +\expandafter\def\csname m@allocs1synccompactionbaselinehs\endcsname{159\,KiB} +\expandafter\def\csname m@writtens1synccompactionbaselinehs\endcsname{15.5\,KiB} +\expandafter\def\csname m@allocs1synccompactionbaselinehg\endcsname{8.53\,MiB} +\expandafter\def\csname m@writtens1synccompactionbaselinehg\endcsname{532\,KiB} +\expandafter\def\csname m@allocs1synccompactionhs\endcsname{150\,KiB} +\expandafter\def\csname m@writtens1synccompactionhs\endcsname{4.07\,KiB} +\expandafter\def\csname m@allocs1synccompactionhg\endcsname{9.06\,MiB} +\expandafter\def\csname m@writtens1synccompactionhg\endcsname{575\,KiB} +\expandafter\def\csname m@allocs1syncrecoverhs\endcsname{64.6\,MiB} +\expandafter\def\csname m@allocs1syncrecoverhg\endcsname{77.0\,MiB} +\expandafter\def\csname m@allocs4asyncingestnodeshs\endcsname{15.2\,KiB} +\expandafter\def\csname m@writtens4asyncingestnodeshs\endcsname{399\,B} +\expandafter\def\csname m@allocs4asyncingestnodeshg\endcsname{26.0\,KiB} +\expandafter\def\csname m@writtens4asyncingestnodeshg\endcsname{1.55\,KiB} +\expandafter\def\csname m@allocs4asyncingestedgeshs\endcsname{32.5\,KiB} +\expandafter\def\csname m@writtens4asyncingestedgeshs\endcsname{1.04\,KiB} +\expandafter\def\csname m@allocs4asyncingestedgeshg\endcsname{880\,KiB} +\expandafter\def\csname m@writtens4asyncingestedgeshg\endcsname{29.5\,KiB} +\expandafter\def\csname m@allocs4asyncreadincidencehs\endcsname{1\,B} +\expandafter\def\csname m@reads4asyncreadincidencehs\endcsname{0\,B} +\expandafter\def\csname m@allocs4asyncreadincidencehg\endcsname{111\,B} +\expandafter\def\csname m@reads4asyncreadincidencehg\endcsname{589\,B} +\expandafter\def\csname m@allocs4asyncreadmembershs\endcsname{40\,B} +\expandafter\def\csname m@reads4asyncreadmembershs\endcsname{0\,B} +\expandafter\def\csname m@allocs4asyncreadmembershg\endcsname{50\,B} +\expandafter\def\csname m@reads4asyncreadmembershg\endcsname{497\,B} +\expandafter\def\csname m@allocs4asyncreadcomembershiphs\endcsname{3.26\,KiB} +\expandafter\def\csname m@reads4asyncreadcomembershiphs\endcsname{0\,B} +\expandafter\def\csname m@allocs4asyncreadcomembershiphg\endcsname{8.14\,KiB} +\expandafter\def\csname m@reads4asyncreadcomembershiphg\endcsname{14.2\,KiB} +\expandafter\def\csname m@allocs4asyncreadtwohophs\endcsname{1.34\,KiB} +\expandafter\def\csname m@reads4asyncreadtwohophs\endcsname{330\,B} +\expandafter\def\csname m@allocs4asyncreadtwohophg\endcsname{1.80\,KiB} +\expandafter\def\csname m@reads4asyncreadtwohophg\endcsname{7.85\,KiB} +\expandafter\def\csname m@allocs4asyncreadincidenceparallelhs\endcsname{179\,B} +\expandafter\def\csname m@allocs4asyncreadincidenceparallelhg\endcsname{1.50\,KiB} +\expandafter\def\csname m@allocs4asynclatencyreadhs\endcsname{49\,B} +\expandafter\def\csname m@allocs4asynclatencyreadhg\endcsname{5.56\,KiB} +\expandafter\def\csname m@allocs4asyncwriteupdatehs\endcsname{24.4\,KiB} +\expandafter\def\csname m@writtens4asyncwriteupdatehs\endcsname{508\,B} +\expandafter\def\csname m@allocs4asyncwriteupdatehg\endcsname{957\,KiB} +\expandafter\def\csname m@writtens4asyncwriteupdatehg\endcsname{31.9\,KiB} +\expandafter\def\csname m@allocs4asynclatencycommiths\endcsname{56.8\,KiB} +\expandafter\def\csname m@writtens4asynclatencycommiths\endcsname{2.87\,KiB} +\expandafter\def\csname m@allocs4asynclatencycommithg\endcsname{934\,KiB} +\expandafter\def\csname m@writtens4asynclatencycommithg\endcsname{32.7\,KiB} +\expandafter\def\csname m@allocs4asyncmixedreadhs\endcsname{59\,B} +\expandafter\def\csname m@allocs4asyncmixedreadhg\endcsname{2.12\,KiB} +\expandafter\def\csname m@writtens4asyncmixedwritehs\endcsname{8.91\,KiB} +\expandafter\def\csname m@writtens4asyncmixedwritehg\endcsname{30.6\,KiB} +\expandafter\def\csname m@allocs4asynclargeingesths\endcsname{2.22\,KiB} +\expandafter\def\csname m@writtens4asynclargeingesths\endcsname{89\,B} +\expandafter\def\csname m@allocs4asynclargeingesthg\endcsname{175\,KiB} +\expandafter\def\csname m@writtens4asynclargeingesthg\endcsname{6.37\,KiB} +\expandafter\def\csname m@allocs4asynclargescanhs\endcsname{0\,B} +\expandafter\def\csname m@reads4asynclargescanhs\endcsname{0\,B} +\expandafter\def\csname m@allocs4asynclargescanhg\endcsname{0\,B} +\expandafter\def\csname m@reads4asynclargescanhg\endcsname{2\,B} +\expandafter\def\csname m@allocs4asynclargeprobehs\endcsname{0\,B} +\expandafter\def\csname m@reads4asynclargeprobehs\endcsname{0\,B} +\expandafter\def\csname m@allocs4asynclargeprobehg\endcsname{111\,B} +\expandafter\def\csname m@reads4asynclargeprobehg\endcsname{717\,B} +\expandafter\def\csname m@allocs4asyncreopenhs\endcsname{62.0\,MiB} +\expandafter\def\csname m@allocs4asyncreopenhg\endcsname{2.70\,GiB} +\expandafter\def\csname m@allocs4asyncreadincidencecoldhs\endcsname{597\,B} +\expandafter\def\csname m@reads4asyncreadincidencecoldhs\endcsname{113\,B} +\expandafter\def\csname m@allocs4asyncreadincidencecoldhg\endcsname{23.4\,KiB} +\expandafter\def\csname m@reads4asyncreadincidencecoldhg\endcsname{44.6\,KiB} +\expandafter\def\csname m@allocs4asyncchurndeletehs\endcsname{370\,KiB} +\expandafter\def\csname m@writtens4asyncchurndeletehs\endcsname{15.8\,KiB} +\expandafter\def\csname m@allocs4asyncchurndeletehg\endcsname{1.26\,MiB} +\expandafter\def\csname m@writtens4asyncchurndeletehg\endcsname{40.4\,KiB} +\expandafter\def\csname m@allocs4asyncchurnremovehs\endcsname{202\,KiB} +\expandafter\def\csname m@writtens4asyncchurnremovehs\endcsname{11.9\,KiB} +\expandafter\def\csname m@allocs4asyncchurnremovehg\endcsname{705\,KiB} +\expandafter\def\csname m@writtens4asyncchurnremovehg\endcsname{22.9\,KiB} +\expandafter\def\csname m@allocs4asyncreadincidencechurnedhs\endcsname{1\,B} +\expandafter\def\csname m@reads4asyncreadincidencechurnedhs\endcsname{0\,B} +\expandafter\def\csname m@allocs4asyncreadincidencechurnedhg\endcsname{110\,B} +\expandafter\def\csname m@reads4asyncreadincidencechurnedhg\endcsname{566\,B} +\expandafter\def\csname m@allocs4asynccompactionbaselinehs\endcsname{277\,KiB} +\expandafter\def\csname m@writtens4asynccompactionbaselinehs\endcsname{18.5\,KiB} +\expandafter\def\csname m@allocs4asynccompactionbaselinehg\endcsname{48.5\,MiB} +\expandafter\def\csname m@writtens4asynccompactionbaselinehg\endcsname{1.60\,MiB} +\expandafter\def\csname m@allocs4asynccompactionhs\endcsname{228\,KiB} +\expandafter\def\csname m@writtens4asynccompactionhs\endcsname{6.31\,KiB} +\expandafter\def\csname m@allocs4asynccompactionhg\endcsname{50.0\,MiB} +\expandafter\def\csname m@writtens4asynccompactionhg\endcsname{2.14\,MiB} +\expandafter\def\csname m@allocs4asyncrecoverhs\endcsname{148\,MiB} +\expandafter\def\csname m@allocs4asyncrecoverhg\endcsname{324\,MiB} +\expandafter\def\csname m@retaineds1asynchs\endcsname{179\,MiB} +\expandafter\def\csname m@retaineds1asynchg\endcsname{118\,MiB} +\expandafter\def\csname m@retaineds1synchs\endcsname{180\,MiB} +\expandafter\def\csname m@retaineds1synchg\endcsname{118\,MiB} +\expandafter\def\csname m@retaineds4asynchs\endcsname{391\,MiB} +\expandafter\def\csname m@retaineds4asynchg\endcsname{303\,MiB} +\expandafter\def\csname m@compactmss1asynchs\endcsname{13\,ms} +\expandafter\def\csname m@compactmsmaxs1asynchs\endcsname{24\,ms} +\expandafter\def\csname m@compactwrittens1asynchs\endcsname{1.99\,MiB} +\expandafter\def\csname m@diskbeforecompacts1asynchs\endcsname{91.3\,MiB} +\expandafter\def\csname m@totalwrittens1asynchs\endcsname{128\,MiB} +\expandafter\def\csname m@totalwrittenmaxs1asynchs\endcsname{136\,MiB} +\expandafter\def\csname m@gcmss1asyncmixedreadhs\endcsname{57\,ms} +\expandafter\def\csname m@gcmss1asyncingestedgeshs\endcsname{81\,ms} +\expandafter\def\csname m@compactmss1asynchg\endcsname{75\,ms} +\expandafter\def\csname m@compactmsmaxs1asynchg\endcsname{13\,min} +\expandafter\def\csname m@compactwrittens1asynchg\endcsname{573\,MiB} +\expandafter\def\csname m@diskbeforecompacts1asynchg\endcsname{250\,MiB} +\expandafter\def\csname m@totalwrittens1asynchg\endcsname{3.48\,GiB} +\expandafter\def\csname m@totalwrittenmaxs1asynchg\endcsname{44.8\,GiB} +\expandafter\def\csname m@gcmss1asyncmixedreadhg\endcsname{241\,ms} +\expandafter\def\csname m@gcmss1asyncingestedgeshg\endcsname{88\,ms} +\expandafter\def\csname m@compactmss1synchs\endcsname{13\,ms} +\expandafter\def\csname m@compactmsmaxs1synchs\endcsname{13\,ms} +\expandafter\def\csname m@compactwrittens1synchs\endcsname{1.99\,MiB} +\expandafter\def\csname m@diskbeforecompacts1synchs\endcsname{91.3\,MiB} +\expandafter\def\csname m@totalwrittens1synchs\endcsname{134\,MiB} +\expandafter\def\csname m@totalwrittenmaxs1synchs\endcsname{142\,MiB} +\expandafter\def\csname m@gcmss1syncmixedreadhs\endcsname{62\,ms} +\expandafter\def\csname m@gcmss1syncingestedgeshs\endcsname{81\,ms} +\expandafter\def\csname m@compactmss1synchg\endcsname{45\,ms} +\expandafter\def\csname m@compactmsmaxs1synchg\endcsname{49\,ms} +\expandafter\def\csname m@compactwrittens1synchg\endcsname{281\,MiB} +\expandafter\def\csname m@diskbeforecompacts1synchg\endcsname{257\,MiB} +\expandafter\def\csname m@totalwrittens1synchg\endcsname{3.17\,GiB} +\expandafter\def\csname m@totalwrittenmaxs1synchg\endcsname{3.35\,GiB} +\expandafter\def\csname m@gcmss1syncmixedreadhg\endcsname{329\,ms} +\expandafter\def\csname m@gcmss1syncingestedgeshg\endcsname{89\,ms} +\expandafter\def\csname m@compactmss4asynchs\endcsname{11\,ms} +\expandafter\def\csname m@compactmsmaxs4asynchs\endcsname{12\,ms} +\expandafter\def\csname m@compactwrittens4asynchs\endcsname{3.08\,MiB} +\expandafter\def\csname m@diskbeforecompacts4asynchs\endcsname{182\,MiB} +\expandafter\def\csname m@totalwrittens4asynchs\endcsname{2.06\,GiB} +\expandafter\def\csname m@totalwrittenmaxs4asynchs\endcsname{2.09\,GiB} +\expandafter\def\csname m@gcmss4asyncmixedreadhs\endcsname{142\,ms} +\expandafter\def\csname m@gcmss4asyncingestedgeshs\endcsname{1.1\,s} +\expandafter\def\csname m@compactmss4asynchg\endcsname{13\,min} +\expandafter\def\csname m@compactmsmaxs4asynchg\endcsname{13\,min} +\expandafter\def\csname m@compactwrittens4asynchg\endcsname{83.0\,GiB} +\expandafter\def\csname m@diskbeforecompacts4asynchg\endcsname{1.79\,GiB} +\expandafter\def\csname m@totalwrittens4asynchg\endcsname{104\,GiB} +\expandafter\def\csname m@totalwrittenmaxs4asynchg\endcsname{105\,GiB} +\expandafter\def\csname m@gcmss4asyncmixedreadhg\endcsname{305\,ms} +\expandafter\def\csname m@gcmss4asyncingestedgeshg\endcsname{2.3\,s} +\makeatother diff --git a/paper/generated/table-all.tex b/paper/generated/table-all.tex new file mode 100644 index 0000000..cd0e5fd --- /dev/null +++ b/paper/generated/table-all.tex @@ -0,0 +1,27 @@ +\wl{ingest.nodes} & 33.3\,k & 19.6\,k & 1.7 & 1.7 & 42.9\,k & 24.0\,k & 1.8 \\ +\wl{ingest.edges} & 28.9\,k & 21.3\,k & 1.4 & 1.3 & 21.5\,k & 2.71\,k & 7.9 \\ +\wl{read.incidence} & 3.10\,M & 1.25\,M & 2.5 & 3.1 & 2.62\,M & 1.11\,M & 2.4 \\ +\wl{read.members} & 2.29\,M & 1.66\,M & 1.4 & 1.6 & 2.13\,M & 1.27\,M & 1.7 \\ +\wl{read.comembership} & 272\,k & 49.8\,k & 5.5 & 4.9 & 281\,k & 41.4\,k & 6.8 \\ +\wl{read.twohop} & 243\,k & 83.6\,k & 2.9 & 3.4 & 172\,k & 80.9\,k & 2.1 \\ +\wl{read.incidence.parallel} & 14.1\,M & 1.28\,M & 11 & 12.8 & 8.21\,M & 1.26\,M & 6.5 \\ +\wl{latency.read} & 2.07\,M & 505\,k & 4.1 & 3.8 & 1.79\,M & 470\,k & 3.8 \\ +\wl{write.update} & 40.9\,k & 7.26\,k & 5.6 & 5.8 & 30.2\,k & 2.47\,k & 12.2 \\ +\wl{latency.commit} & 6.96\,k & 7.33\,k & 0.95$^\dagger$ & 1.2 & 10.1\,k & 2.54\,k & 4.0 \\ +\wl{mixed.read} & 8.73\,M & 1.13\,M & 7.7 & 8.0 & 8.55\,M & 1.11\,M & 7.7 \\ +\wl{mixed.write} & 1,000 & 1,000 & 1.0 & 1.0 & 1,000 & 999 & 1.0 \\ +\wl{large.ingest} & 431\,k & 47.6\,k & 9.1 & 7.4 & 489\,k & 13.6\,k & 36.1 \\ +\wl{large.scan} & 1,668\,M & 344\,M & 4.8 & 4.5 & 1,583\,M & 358\,M & 4.4 \\ +\wl{large.probe} & 6.60\,M & 1.01\,M & 6.5 & 7.2 & 5.61\,M & 844\,k & 6.7 \\ +\wl{reopen} & 78.5\,ms & 978\,ms & 12.5 & 13 & 92.9\,ms & 1,279\,ms & 13.8 \\ +\wl{read.incidence.cold} & 1.73\,M & 67.6\,k & 25.6 & 28.1 & 1.23\,M & 15.1\,k & 81.6 \\ +\wl{disk} & 85.7\,MiB & 400\,MiB & 4.7 & 4.3 & 172\,MiB & 2.30\,GiB & 13.7 \\ +\wl{churn.delete} & 16.1\,k & 5.18\,k & 3.1 & 2.9 & 2.64\,k & 1.99\,k & 1.3 \\ +\wl{churn.remove} & 23.1\,k & 10.7\,k & 2.2 & 2.1 & 4.08\,k & 3.53\,k & 1.2 \\ +\wl{read.incidence.churned} & 3.10\,M & 1.30\,M & 2.4 & 2.6 & 2.75\,M & 1.05\,M & 2.6 \\ +\wl{disk.churned} & 116\,MiB & 293\,MiB & 2.5 & 2.0 & 1.14\,GiB & 1.91\,GiB & 1.7 \\ +\wl{compaction.baseline} & 50.1 & 50.1 & 1.0$^\dagger$ & 1.0$^\dagger$ & 50.1 & 50.1 & 1.0 \\ +\wl{compaction} & 50.1 & 50.1 & 1.0$^\dagger$ & 1.0$^\dagger$ & 50.1 & 50.0 & 1.0 \\ +\wl{disk.compacted} & 93.3\,MiB & 234\,MiB & 2.5 & 2.7 & 183\,MiB & 1.15\,GiB & 6.4 \\ +\wl{recover} & 84.8\,ms & 113\,ms & 1.3$^\dagger$ & 1.4 & 162\,ms & 449\,ms & 2.8 \\ +\bottomrule From 2afce28a6f7cbe42326bbbdb51612817ccdfc8c8 Mon Sep 17 00:00:00 2001 From: venkat1701 Date: Wed, 14 Oct 2026 21:38:39 +0530 Subject: [PATCH 4/7] docs: link the paper and describe how to build it --- README.md | 3 +++ docs/development.md | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/README.md b/README.md index 940043b..ffbaf9c 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,8 @@ HyperGraphDB opens a store after a crash faster at scale 1, 76 ms against 128 ms single commits in both are bound by the cost of a forced write. The [benchmark report](docs/benchmark-report.pdf) (PDF) covers every workload, configuration and caveat, and [docs/benchmarks.md](docs/benchmarks.md) explains how to rerun it. +The [HStore paper](docs/hstore-paper.pdf) describes the design and evaluates the current code against +HyperGraphDB on a cloud machine. ## Quick start with Docker @@ -201,6 +203,7 @@ The full index is [docs/README.md](docs/README.md). | HStore Studio | [docs/operations/studio.md](docs/operations/studio.md) | | Benchmarks against HyperGraphDB | [docs/benchmarks.md](docs/benchmarks.md) | | Benchmark report (PDF) | [docs/benchmark-report.pdf](docs/benchmark-report.pdf) | +| Paper: design and evaluation (PDF) | [docs/hstore-paper.pdf](docs/hstore-paper.pdf) | | Development | [docs/development.md](docs/development.md) | ## Contributing diff --git a/docs/development.md b/docs/development.md index 41ef652..6f3d997 100644 --- a/docs/development.md +++ b/docs/development.md @@ -240,3 +240,21 @@ installs `org.hypergraphdb:hgdb` and `org.hypergraphdb:hgbdbje` version `1.4-994 generator, `SCALE` × 50,000 nodes and × 100,000 hyperedges), writes `benchmarks/results/scale-N-durability/*.json` and prints a Markdown report whose *Results agree* column cross-checks every query checksum between the two engines. Methodology and published numbers: [benchmarks.md](benchmarks.md). + +## Paper + +`paper/` holds the HStore paper: the LaTeX sources (ACM `acmart`, `sigconf` layout), the R scripts that draw every +figure and the result files the evaluation is built from. Nothing in the text is typed in by hand: `R/results.R` reads +`paper/results//*.json` and `paper/ablation//*.json`, the same files `Comparison run` writes, +and turns them into the plots, the tables and the `\M{...}` macros the text uses for every number. + +You need `tectonic` and R with `ggplot2`, `patchwork` and `jsonlite`. Then: + +``` +paper/build.sh # figures, numbers and docs/hstore-paper.pdf +paper/build.sh figures # only the figures and paper/generated/*.tex +``` + +The first run compiles the paper once so that tectonic downloads the Libertine and Inconsolata fonts, and the R +figures then use the same fonts as the text. To redo the evaluation with new numbers, replace the JSON files under +`paper/results` and `paper/ablation` and build again. From 4665476573627d03c1c18dbee197391d1dd230c9 Mon Sep 17 00:00:00 2001 From: venkat1701 Date: Wed, 14 Oct 2026 22:06:38 +0530 Subject: [PATCH 5/7] docs(paper): draw the example hypergraph and write README figures as SVG R/diagrams.R draws one hyperedge of each kind from the clinical claims example: claim 0 with its roles and weight, the chronic back pain care pathway in order, and the duplicate billing investigation over three claims. The paper shows it in the data model section. save_figure and save_plot write each figure as a PDF for the paper and, when PAPER_README_IMAGES is set, as an SVG for the README. The results script also writes a wide version of the ratio plot for the README. build.sh sets the variable to docs/images, so one build keeps the paper and the README figures in step. --- docs/hstore-paper.pdf | Bin 316606 -> 352034 bytes paper/R/diagrams.R | 65 ++++++++++++++++++++++++++++++++--- paper/R/results.R | 12 ++++--- paper/R/theme.R | 21 ++++++++++- paper/build.sh | 3 +- paper/figures/hypergraph.pdf | Bin 0 -> 38153 bytes paper/sections/model.tex | 9 +++++ 7 files changed, 100 insertions(+), 10 deletions(-) create mode 100644 paper/figures/hypergraph.pdf diff --git a/docs/hstore-paper.pdf b/docs/hstore-paper.pdf index c4ca21f93b13ce804346d197575776962d24b7a6..a275f6365f53e2d8ecbb66db2f93c5f6838f0361 100644 GIT binary patch delta 136748 zcmZVFLvSt(kS^fZwr$%uv7Hm!w)MrfZQHg^Y}>Y-``@YA&93)d)m8nx-Mtm4g}vzY zzgWO53CLssP8KdU0Rb3i7bjCgTNsaxW&ZJ46Dei)UXr-KVLorY`9z44{=@JUc5q?k z(PO10mNBK4!?%Y~9UU2rj3iY^D6Ce0N4GtocMsQxBUtVLs)`<;hA?)e@ihB3Ko?ZOjW8Bv zaLc)V$`9+geZmjCeceRl)&YdQi(c(L*uk}-ES(oo}nvYjj`o@!cWs1nL=TK0s&>N ztkDQS+w*XD5FDsrSFdDzw$`3Q5REGh!CpXbqw%_A#u#5$LDRHaB!gD~zTQn{by3Zt z&K2=MFP|0#Yy{ah9HPFGZ57M4N)x@5|z_t zghC}sx7F>sr{Rcf^Biq!sMX=*_zQ$Pp2rUmWSij$TD8QJx?Q4&3F1f%#Wm5_nxp)F zZP&I{c}=KXXODRp`+E=d~K~0jIS4@ z^cAL+1tpe#!%@^i(|!}h#6#0&Q^+KIE0=99?S&AZ&NUAifeUn}ZTXcGex8o6Ln{y9 zHxjAHbm$>?gQB(ev{FPg@uMw+7tc;6|S0rGJFx^w42I z;5(3Z{f9{&z<}VGinzAxzc889#<9M*|>}lET1n^)nt86Pq%9oXcj9^ z!v2+Zo-oP(=`^a_uOhLtwvXfa3jkw6pLtQ+ov?;b{ZK#VKlw)Y?^%73UKLS8RjBFV zh4iO9{!oJ}Z7R-1mJ-p&?f}f$5o!49IhoLy3{uk5@m(<*m2%Uhu6TMwcozf8+WoD& zUh4NgMqPl5Y)&~2)$lb3LaM)EmR*ms$?#k1(P9Cv@#45+jW{|JsL%NMd$h;?`%sr- zW6Vzwo#3Q&2^I?fQ!I z=Z#syiFdNmS#LX=r9LHr>f$~mlL{cN1V4TqY=hQ<7$B)O8)HBJ;D9uOU-*+}`gYXxkMpBrM*bKsK&d;M$Qpf|tx zNPjkpLm`-nfhrRpJ$ovp)Rq3KzcW8yxv?Aw?^fFi)+Bl1hk*$+ovtQ<69@qNCy5d; z00emwpsvMCkEkZuiPqA(!H~tEf|wO3ILJfNDkn`WI|?l*U*wLNQ@osc2-AI8?{Ljj zUajKB3oQ~DbzA8gGx#MA*y>`j$!O@QiYHC8#wvOAK@a6Nhsm%*Nh=J`w?r>5+YOdF zpt;eDr84{l=4h=!yS&yVnU>8`NR>5o0nEE@!cC-P!i-R)*IByujeG5PYv!Un8i7`e zl*nC`e_v}~FqcaiZlsI15QWpa1$>xjY|fO?8!K*HM1Xk~wB_U&<@|37CA^gt0)DN8 z70XzxnyXyqTRF*I0@qwR7bK}UAR*Z^IwodYrazVf1*(%KUYtL%Ttko7OE%F%0BHC^ zhTHHCS?5>CK1&U=Zne+H^9VUd%G}6UR$#E7rWDMK4MHKPY8+|?fR?!VH80im=!JhM=R&c47=YIV4JoDT3SWc0;+-kxG;h~h z+VZ*|V&tTn92-B`1;AryrQFu4?y*1|(y_lu=pt1Ulko_XFnI5|?a2@{X%*YVC|*cTJd%jz(9a|NB{To<5XYJ zujjXSCu*jY{@TxjF(|T96hwaTVGQ|a$(Y6V&$>uQ{`5Ne+#!R}!Z}=5{W6s)B+p8o zqG?fP)|JO{1&E}nl0fC&J+Ro!<4cnXS5pf+Uom`G1jEGhc8-{W`2koY4U?7gS@GR8 zjwQ0_Qi%6$%fiwlKyw!r(Zty`6%(8*(%bj~7kRhXBq>|b-bUDDpcBCiKSZ2Xv#|wY z`EX)MxJFzCjSW%)I*ImDa7tP;`uLzzkd9$kmd$bQ-lr9snsdK~BQpJYAJZ|u2%n=b zdH7bI9N>6cu0C_QaplW(gw4AuUMGvcmaz7@sWJ)AV{vE!0I{(QF_RoQ&PJFIh@f!~ z7IowgyZWUZW#VF5z;D)*53_5=xr!IRgyrWn+Nqyn8P96fmvpYv^$FyBB+ElC&zB){ z>5mQL`oq&MVuAcMbs~dA>smRb(yvSV?<#!-6i`rKiIkPs5L0XI5+{1Bwj z*b0N2%fnOz2nLW)6@DEyvOO>F4^QzJJ_+Yk*{0>9nIWF%=eJ(=^lNoT3z^D{j3Mzc zYn@4|_LF2>u3gc!Mfy#I%e0}pM)&V@o#k#BJZ#|HhfDRB!#?`QF6C{4$QmeN-HLNG zFn$((^@X!6(Fk%74BDi z{>49+P5oS3%#JedLn~qILt`m?a8ZWx(3)^A)$HXJchE^n^JdP4B7=gSZe|wlY0%aS z)KOe|87GJpftT&bA55Q}pd(Cgn6s=bIac(m{4)bluw@f%TOYXEz*vSLDACuTDJY(v z;qhz+*ck(W>bPQH>akGEy!iB1+p#N}jGEt{-4gR)hLMova+~el>?V=kARc;k^Ig07 zVBC~q96~V^B>tx65WYbztPQtEvxP~?E)=R?(9MkC?Ua|F*u`8ICP6YOv@-`P2NV7= zM=p0^{0hwO@4pq@XnI?6w%v=REegmWp%YaHoJ7|)&z6(o98%N*Fm&O}d08f7gQyxE z^f&e-D$Gi2Sj%+=D5paxY=>a4(ISR~N%lhXbxzK!IA;nBOly;Vp@Vy^?Kr$t3yMyJ z@S_w@$!`~K>Y?Fgxt1I%-_+7hnsyxp>m9NK9w} zHN>%*Wk7wwp)XQvX^o(ygwZu#hY`KQb=WUVU-21zn+eYzC&sgeOk=buV25_!)(*+@ zd;2i8CrI~Xf2!^*=X`0mawb7yvt*l0QwW3Ma8c}IYeVeN?#kCcPxoWL%L#5E7&dC4 za^v4WCOd(L(4j?(;2K`Y7w8^EnqN5q!U~|e+ibr){D!!k(&~DE8u_x(A_{5jYl)~M zn9sXTjvKd?xuv`_ZUi-GembLJdz&5Bu0OltF`n>Q{j|{x8~s<73+daXrE3Y9NxXs$ zF*~~Vs}XaIwYF%b>to!p=>j9{_nVr!duBz3Lu{(G2}xX#aU0()BK|^sP@?q!U6T=i zd-1WbUToqBTpXVI8&g^`z0P1{Hqvq;@f`Q7f&G=U6ySBg8g*<>(Q~i{KRVA9jvJA; z_WJB_GySXld=QHwh`X0jdzCQwkD6}DjqKP9^Y|4v>IjPG_~W%4Jkt<>fk9|3uAlyz zxEzy)s2beL6%RH#Wli`}FHr@6(KjgKkmVoHAMOy83F__^oCrwI*|}`NFw%P@buu{; zlp$alPFAjgis)ci+z`?A1-}a_+kMh~X9G9*_FnexQgW6)ldi~B1}?gz?VYfFtk%u7 z$y_wkn)|Rv`4&0_`jbD&HB?=x)zRFd4z-(-E*`Yv>3;*GqNoJv?^X=~pfq3-?86Vn z2sV~=n7M?>-9?>OBM}>ErU81BgD@TSmikhuiOw)P#zFX7h@6ok?4#~&1RkH=(-_rF zyA8Dae6GOvLI+7s0T3+9FGnUfP5+8rE19hhBilS1;x98kgSug*M8Cl+LUwU+ zkX5zUByel!!E)a3#e;|ep=mF$klq#!1=O0)X$7rDoyGq!nC_iJYcc*AH{*kfe;>|teKz*Tf@sgt2!mkqNOD>!c~MY<^dV;nahu!)+lMjtT_ zwj6j&sDL!0hyT;`NN05R&5b%2Z(O)0Tz+CD5!yV!dO*t5O15eZsI9=ToPIG88Z6w| z%yQ$tgo59gvvxc$z?>Ayzee_^Kgn)wvXy6!qO!gQT?K_07;HXbncLcIG+KPV&g)KE zm-=rtIiV`Xfgp!gC;5Dc-d%~attaw0dsMoFsDX;lv5j>hn|t z*~`}OcgJSch-h*FG*9_AX>lgK@l+RNe%tLC+#D1u9o7kP<;ce}e5e9cI|5a3|;s_m~KAT3ru0_2W)599MVx>JtK%dre zwxu*+aPahcJdd9)z?zU!LNm1isY!8Uh-48v%2X+gqz_jCvm)E2GzkGAJ`D0p*KLT04N! zL?^VZ1t8-BCKDZXD4muah!z%5l^L3-nfPInJOrXLhz1LBxZ>Whi!#wwXZW$7xa$VB z3RF45CO%yl^=vzdS&U+fw9fD19{d862%aUHQ*r1CO-5HRc)e-5@trGi+H~L13ns<0 zstfq?mS$;S&YPu7qjgF#*p88!Aki8!gPumO9-lD*v)EW{p({fSHP~46N;t=G^$zD6 zlUmyj<^RU9#Z3NAK23OXNxv;4y%m)%V8F-OF2=5HeMcj^@x|=7--$ot+Bww$6+quo{%)eM!pqCGzOtQ!@Z8%W9 zHBAc}3QgSvRJ<1NjarT}Ca9KRgf$P0>LnJNeqGQlo{CxP2LUzy=>7B#-qs&YVXr6M zVLeuSdjQGFx3Un!`bfntN!06Al+lbFfxr#m^1p5d&rz}d!z=Vn96NHjXiSs5L@t8^ z5Xyc999B-AwVPAj8&Zr*BxRuU+gKKI^9oaP`yLCJJS}ip4Y3&~BlE3`CX3jEWovt? z!B1v}zOTdz?;{qV=zs3QoI5DJh^`tzai$B}ZZ%qa7ahK*@8 z^OD!+Iu>|fd>amFBGch|<4qedbJ&&wn+)@sV3wFt53{I z=!G6#w3eB9BvD?RYJI61&s`bm7A2GB$;yQZRb)z)qd(AEY1KD7(RLN3957>tBX5SD zIu!?~x)tqE7{sXrYO$7$Q5I$cF2!2Y;Gf%42c~Cs^h<>bMRpSx@LbjHuotAq4ZxkP z`<#R=svlNTzIcXPA@16-o^+H}OOC~gX!f0Q9QX@ft4Vlfme{zxs;X8P#p&Tl2rDpF zBI9L?5g_x&ioje&MGMnut>TdcHGB@%V>iPS*tgF=a&=RuPk3^R<`r%M(ZI{VPatYu ze@9SHoJHotQ+cpDvBS%Nl{cjrg`<|63p}UNM(Sa<&T64=y1jBddM)s$7|Q$leprS@ z2EH`6X*Ro@N(^688$DF_-3lI)r1e&xfx>InFZP1@n}DMmKCCBa(-SWAvUKa%VB~1QR%CbatAkb>egQ=Nv&069Y^^n=PB@NGrwwFjhR2o~6d+VVP=- zi>76bQEoJQ7R#C`mbC6!@r#Y<>?zG}l1&zqkn6+k$Vn@g1tkbx;$vUX0Un9bB%n^Z z5@4;g_r1*uWWgA_(13>IB#!B%ad@U{qTvA*5t$p-&BiB%;rD*3*%CpMy&A)?<%}nJ z){;Ej_E>!#gXes}5zz+IE;&8qAK^{xO21~IQ43;>oq)ysaXe$E{W^1Jg(Fo^;aKyT z{JvM53WB9=KBc!+G|pK(%dRnXxo@qdpb$dVe5|YVzPM8U#4;b-AC{vhixW=1whhLf zsAw3fzP`BAoi+@r0`_m9K;qoW6XUt0a#iE3T>f94A5V5d)6#6m)>v8K2c!YXdu*^ZYN1@gi_4J=31=aw zrHzmR*ebE+00Dcb&fNsB)$=>9{QZisO}1~G*%u0QLTMXp-SA$v2fwvy_--6S<3{{eSz6h>AGJ!05-cZNg5O^x+m{}ECsA7^$xj?C z)U61eMz>xP)b`WFJR``g(gz4tfLJa*xOzkh5mud&+lh2=0p!jDKPp0w`7{czP$3lV zK)I~MRrxKA0_^}Fs74dsGno_~wBXRj?v_M3tsxY^77s}}TRcbn&|t|GiFuoM+f%HB z#gh|-adOD|2jW`LV2^qf1>VToPa*v^YMKu3R~&_cy7Hb`Z4 zKDW{u>Zp?BHJiB0@&}(LW5>hl=y@?8fayGy zTV=~m#pLl?@I>Oq;o^%an&*G+gB(AMJbq2G2dbHd9j5ylfRS(V5uVtQ;i0AX{OxVv zd(2$kH!sq3K?+lU*QOB<84A;h`i-bdIWqvnB8k)nvcFgp*VlhQ>OWuBg_Ioz<0+nrL=ifw#wpGmup6{DOk;PMdcc)tzL|ZE#kD~xU z+zwF2xsCWrzR7j4{Yl-wc$zSpr6pNjw9-lp`GtyVv&2K^a!Mdi&o$yS#{`-!fp1Hc z>Nn2YI`ki9K^tL9AFGIP=GomVD6k_OqAA^|p9eR-QAr(tgK;u0{ZBcd2j` zk*CHAu$9w$n>k7cQ&M|Gw@5pL){drJ&N>02rPi9>{f>FXLXfvVdZfk&)X@>CK>}V7 zqBSy@_XTbOorjFT{;rQlyqW?VP_&y{cX5teVaM#ndRl(X#%;k1mm^AlJfZ-#&9iBc z0oM=dWgmOf^RM9t7#bJa(FNdzl29bEsDM3H2KAxp16zkdAB@`c_waQbMX6F(RksMY^bluEhHZu*1M*M?{PEp%HkKB2-Q%hY!b2u1JpOefurc~Q(?+5)mxCZo1 zk-3G*jn#POKLo!`|JHI4nuc)(pN)|e+NZzOb8|-2647v8lG4*d0lgs9HV5%+NBDq z7qgU15Vc~xa^#}Ue0X+j($ew$tUXS=bc}hnxXF(}upZUndLGvP68Jzl1p&r#W>~Dmo_-6Op}<6$~FAqpYc&xr+r6J10|G!4xoBl7TWlz}-W2xpkK{X&lc? zn8^EDNLY%5NX&`~B$5jan3xUt+(427To^?dW~3jQeVn3zv;ayY9z%-?87f+N1jtAT z4NNs$2X?L2{0``}))i#uv-`EjyYIEf{kM~K{6l`-J7u@hn~sjiUz09%uYCBZHiB9z zVjLUw)7>-`Xfz!h@SFFtYWBl}0nn`yoI1e-ex1FzyjZIK-c@9o0#tHx7fMJwd5MZURddoC)pOb&9EB$X+QYegauQS0@d)Qhr!Ql$ zl2Ouf(Q{73+?aQc#&^aQc)St9BQ3TTv##W#II0aZ4PcSkK$$C#_E zvXP&AVqu*sN0+2gxdYB_4aG881Nb7gY%phdOe;GBJ3|6K^>mNF=k?&0K`h!CzpdJr)r|A^ zyS<)pde$;$JGBxP5>vdM?g_etA)H?3wheA78@F!l>YLZIJ&U(?b_VqVj(soTwtcN* z^zg<2s}Qd(rqPf}EzF*vM%NiGr~l$>LP}_*7G4?Kx?QaL#uOEpMKIvL#=A6{!jVE%>i4q z*>R;|_Fz^mRk{4kkL9k_NXb|5Nq1p~!Ng|fHh)hAzVu`EK#`NcJWjGz%LLt~(rjz7 z5~gj1ccF^&dCc~ByKl4M7f$Czvf;TVvbtGE<#O}(ox3CMXd6|0gCg3KT!hKLaLx2OSxY$iH*}h>QP=;@!yM*fLlWXZsAfZn3^;68M zQ&k*%qNqH3f+H)-$4Sa=Une7#)kJxUj+_y*ZJV5!Gh9%LMIg=`ivqLANBVBRCBtu0 z?E08)5>rdA2G!^#L~xyd8=Fs8VWJx~!&LM1_D1gvZl^kKc8O)8d3IKtVSf-1pv9k+ zns4hq>&hU?gE(Io!tnFMJLzgtU}_=Q>6|mb>lCXn^|VSY^5WB{rf^xe94zufqgBp3 zUx5i0?LH`jn(aU}j@_-1_qWou>uo9pmR!pTdbhHJU{%;PfO$z77C(R4AG8us-MX4{ z65O_CLWyT^-aenSAFQw}3s(fNgfKLJ+tQTRD3N!(cz!mvYro2nt}5jYYB9BD`R-w% z-#B}}0a0}m$lPX?In+u&hM@78{%!gsKP~KvCl;>E0;?q;16oqP%5n5ZGSE#;>CHoet|wYawZS#ihd^gd|9{ZGCr)bQ{7_zMz) z%a6E%+K7IuP6>nsfW)w_v|;?+js@KLaGa~aP>&pNmvi>u7`|x1!z~qZS?7W$eghS&i`6#;GkXXr;#bRqwptm2OSbi)G(0)We>ERM2PU#$ z^*$Nu=5m`mPc!$G>&OAm{$<4k5kmJI;5qp~yb{=VRATGo%C&wGlq&|?!pm$y&z6Tm zYD$hY3#DQg7Yn+fj&Uf(FgF}G^P`niwk<5a3H;=aqHfW$smyf>+ib3jvOz6$uludB z6j7lbdw{kR0&bvYh0$=< z>^>knKe>aN342b4Dit#Ys2^O5mdNAwewja=bP~%H%JF)f9-iZ|)*nC9jCIuu4j_}@> zd7A&gz1}f&)83ADJ(_zW?j*e)%--*GBgP&0dJ693A?|^`Kl&gMPKDiJz9|YsBc77J zNeV>9ofre&G=50pP7Xcb;*RwQ{vCRPC>$NWgXIoWKA7YVs=Slsj#56lXO7@9N&=ekgz7e^UYf`cB*4 zY<~ctzX`v?fRnyE!AJd$(eE#W-D+Efg6gD7s6P*W(hEUx=B8FISVaQA<;sX{~pvL=R;h~O5pbdK=T;XA0lEL>(z=;MVWFj!d zgJhCH-o`N9ZOf$L0=Cxd+Hh#m2e??i^cXn%<5g2e#! zSgHNW8W59);N5Vv1yE`ORvMtz`{){wmxiF-Fm(f$cMvwgoQ9}2q4f3WtwPK;Vfgi^ zZUc5y0sQrtF9Uv5A#Hm=c)=oy5MldJZ+o^Lkg<41;BN*gAoeciaG-fGP+0UVp}Y+I9rae30JItUJm#h~ALfJ@0n# zwtdJqWWT_?eatu3FBqJ+eS|Lvo~;mX2ST`kU@?slIWVX$C^UqEaGF7C9TG`Z^nt?6 zat2{AOrl_iD4YXiC6(Yvt-{uF(u+tYWCoJqqQcyAMx5|}q9XH>Y#4IGhlPL&3yRDr zjKUHNauPA?dGTiS>tWQwo--nzNXikF!XytZ7mQh`xHFQ@NV~!=549&Gelf=T>@)h0 zaH@IrC)Do|AZA5AMu><3qi_!)IP{@m2WH`Dw4z}PX7Olr#z+fh`QdPleRM|>J+g37 zW<6OXDWgJ33~G|UvM82DjgkONY!Vfd2x_Csbc)ibG||>{Vl$Y(N8y@At?7p!=6R4J z2}0YKnVw?TXJ%+GxQA7WHfp0`O9oi{J!Ufi$4aC6`6Ylr5r=V|V#&6RD?Yqh8I(k% z?^7+s3-OS8F-@&*dzUc3p|UgnOFh)VmqE11INiZ(K&@DZ!YPDvng@U{%JC)op@y1| zXm#&3T_=h63zA>9Ye!y2i3Bw3!cy*OIP{}94Yq9@{cW2_e}-Ly{lZH@3AI`#`tvWJ zO<0g40z1832!}1XGmS&Vde?NT?Ny=SD?ZM%z#p-gLJ}4~Xc{eh!1t^klLn>NFLX@i z$uj+dTm5=kSe7q$=@#JiWSKE#e8f$mZD3JLQml=LM5=f;m4m>x+U$Gp@eX$Zv!|@6 z(GytMjJEKc!~ai>jE!zH8w#W>9*d$2@(|{9h6Eyl_Z}_(EHVFM*DOIH-B`kpPpz!CF@#E|`Y-H#yBi)xng~GT50;w}9iUh_46P{U`Kp&vK?1>7|x7YH#5>Wv! zyR-`jXLMbWeS;}hz1+~!NoPNrd_pk(VFi%jwA^4g)4Fx7d`UlRf$@%-xkEIOW?PRy zo-5P^f5@_~oFsg%`|t-nvRWA~QA)Xv$GlKgvcf@yI=KJtyT&LbuN%XSdx+^P_+eG_ z3q6I5pI=vQAP68bYSxiZoTwcH)oe!A*upK`B4p>ZC`^w+dJs@HWjtwobZ}X$DChLa z{-B4id`-pdkfG!+?Up1*DLbR;bXxalGueijcD<`g^E$aICpJgfNRkaBxPLjHey-LLORjl|HPIZwH7=$E}fCp^ooRL zQzrWnZPm?R)2EE!j$)czF`8_vr+Y-S?^Bdg?Z;Y6rO_M*gfKVd|u;;Uncs_>LLHheGW5h^8@qh0z+@q{tm6nHkCI9G}N-QoS%^)!F& zI{@UA;i+&Kb(h=Fhl0c0hHNq_J$;F)0sb)QQ{O+~v#v9}s6gSAsPaBrVUnoqTFOr6Q$+A6NZKlEwqFiB zo13wqbX5Hp5CLXX4^TYIX|CI)xt({IVqc7SiZKT^$xX`OoTs4j;vt82B1ZBDA6b6Ls zvD_H?VPb4NrXDjUz3J8$8e}ADTX06dN)^ld-SgWdkLr=QPyZNm=t~Dz70`$eaGpu# zjIV&2s&GRYGQ5@$Ns{MQq#!W=$lfiJiTees(0D#xF|e-b3&TnkDO99kt23t*!oNWA zcgSzFmeEc>HQ&Qa{YH$Hkzq|P9|3Ge*y)W4a4c_raNOJ2HGDc4pAEIIgp0r~MeLlA z&e7D@Z{=+U`6z&E0} zLPLlp3{{gI_nIb>bkt@M2GQ@C;ypi zY)v1y(#0hU91?-slIQw{dnVtS9LL#U2`lyT!7&b#g8u_~tZbxFlL!3OKyLuuOzYLy ztH49>3u}A2-P``;?Uo}Lw65h+>j-jXrEC`9!mtof$?^w4t^PJ9c23QRA7;KAo0}?F z3De#tIfStFC@2w1TG|LSW$41WQ)Vf9Pl7Ez3Boia#G^FbU5jyzK|hA^r;pE_93+OZ zWASYu5F4+!)sfqv(+- ztBcllObDqo{0pl3!2_wA@uj+QjhNB=>0XWV%bawx_~s%+?QAo-#cfV`!97&HKEFhQ zIyDKtB&cbh0w^II87*n#XS1kGG4{XbPWd8QI3}g5XPhX%LheCZ?PGU;AQ*jF>Emb5 znE4(vtnV#0bZ7Y|rlk)1cStYc^0a1JZ3UzH)AC37vsr8rwsb8M_+A@cINn$_7& zvL@8$wAqL7nGm_sjdN4zRd-D&LOpz4Fp8$`NbUXP0r1>)Ox$6)G=XM%7^rTyhs@}@ z+>cIbT71Q(=9W5pfE*CrB`a3}iX9FAT$B#4Vj7K?l6)$r!jMHe5u)fiG<>LvrjCZj zsKJmX)1-Nt<-c#Ro#BvK*Ep#~OXuyI`875d>-at_UD-m{aw zv?Ak<9q>u#^-Ge$5-R&1&Lu|--&f4RM{NKd;Z zuM)jQmUdv-E%0tnlmG#C^T+60BgD%z%g`oHrHzQZ*F~8#GHS^*WaMNgrd^%8WSO^! z-%q?skk>shJ7iaty9 z$fc~zIyAvWq}Ve@!}{-#ZR-9(rgK9~T))6z-7+`+>;nG^jVouQBEW);I#*a>TK~WN zmk;$$&y>~Km>l|?u?cqeET$m>OW=FneauJwSkbs!h^ho-j_t59GTcgglb_)*J+KA zeiO9VfTuWwD3RddrO9zwikIxi@XNQ=|6onvK>=-;(%ULQXu_LIra?rHV1bW}lm5_zFn)u;wwwXQT=8IJTtd#Cz$6%OB2!0p+}Gi%0eAJLIE z(c_ODkDFUo;E869ZrO6s8_Czf2*I;<3B7>4sNKGu(@`9}no20!%h*Xxxc5?efG3sG zr=KQRSp;KhXY#+#J^xkzKM>$x{Xc!+NC z5f6j>0+IsRrRr13-wZVB-8|wYwy0q(TW<8wDsUO>MxcH$Qk~dTmNFB z5UkPgZ=zy}kPYkOrj=J8ic3_YO6fCs_Vd4x?`xk1sJT7QGpO%_Bu3q3WM(C2XJT*H z*m||q#7B!>YS*bV?(rL09uFQ_lT@4zyi1PY0FyDZ%7=fkW@uz*Wn*sRlM+#OS!Jea z@sg83HsPhlr{u;l$MI zp68kw_dzU4hh1*|V!u33J71+QZrs#C56X$Om_auGSC*Mo z0FG(dach%X=&n&pHv1bNv`x|V*5vEMMqBbtN|R5rR{G4z){&w)GS!6>0>Xo?QTGX4 zFsLtY&bjx2DI`m8@bS1&%+gYJ`;XyzVp44~E>!17$UY%S_XoUlIXyCbN%e&! z7gFD`$6^|XLdJ7Ro`egsR4z%(h1_mozyTC_w8KJFx9mp3Ofd(GjmFxdq3@u0a1GQa z%axah>Kp5RR?TwFb9LNWA&G7RcETg+Ds9D!-AloX)Jum_P0>P8WRbgQUZhmG5~LMx zklCK z{^vlxJ;U@SV3E-2T@a0IzM#$%QH|5xqreyHBs|Hk5L&6Wa_(la#~$WBVIPxZk3!hz z#u>(OAdP64*@qul67|5^XM!;A5rXA1Z0l5);`Qay22wF*W4fhKo z#KW6YUm2OHW#{W1O@xrfY{*XsSSa^zEtv#zf>?4Ax;XcD#r3g|eG?1-DDb=DQWG_;-)S+v7oH zu}>pgtK6&`zZ@>58{e9GNnZwb9#t2%eI)8JM?)v#%1CH~S%_W;U?R(ZAbv?Fb`aef z;QB4Ox;;V@9(MUGe_?C?^N zLoX)$V<$jDSJw{r6RI08CrMPsn1C3PW7RLuh^965GU8)*4q_Yo#o6`N{65CrbmQ4H z@OA)V%lCy_Bu9r1IPf=wV#aN!7YLLSO~~A6VXl8LPuq5n3zd-0Q$do= zq%p|}D1aj)F81UD9U#m!3xNh|02@&(x4?|05#9S!#Y0>E)qRCp5P2Q!G!O743@RS^ zK#7AzDe-oL6@Cs0+vDTR;76BqSxkdEaNA*ugrO*)sT%o{zsXR96(>@NFY)jV(H|+d zro$3#ZZL`t2zwPvzfUss2SSeD=6Q|yZ>ry46{DOKHw^YX9 z>4w>6hvM?0InwaE#t9!ts??gn{WIH&#p-1!RBs$Ga>WF`)~(924r_x^OnfDx6WaGh zD?}gy<0fP$iZi^-(aJnY4$ zM6ofNZm2TVo_I+GY;5SjB?*Lux2BUVS{O!p_Ag-<`H!cgECP|KPxv;psw&}2&Y*gJ z5X-unfw(*yDMfn1YcWlgawW!YN@Z%nz4nwd?(|j+M$?656Mwl&(YVh_^ZKH>9PhzP z+y<8q;62OUG?0H9vdEDP0|NIjVGp1wv$`@ObRPn*SbzMaK%!o}e1 zujoN1t0Nf|c;PGU0V>ELt8L_S&3y@~zmw$@Fpz$<4*o_5R{9suZXVmThNjX+;x5F5^{Xo6~T++h(be^9| zrFI4@*}TYY-ST>e_?Z$j6kr-x$oipH$<}xb=0)cS!=K9JD7m-(aE|aWp}LG5vl)Y5 zPR(rgpl@>zL^O8A?#wx*7u1W^OreF7=g&i^i z?CF5)?g%Wljts5{4P7GV=W(ad3&eH|XnwRHND_oKWO|6`RTNp4!8pJy{^yoF4Z5}^ zibGBmF-tOsNF;?2XehJl73;?UkjjYsC)PfWQEy|{DBfw7MyShLKDXO-BFX6~$FoOJ zl!)feNXySlV`;OC+>>(ducmq4b;|&xDlJpP`ZBxTx>ww|Rc-WrX7IkizM&?^=+o4q zJU7NeGrrwc-=>Tg@u;3Q@RcZd0;>$$0KN**NL*|-0YRVs=iiqEA#r#XzyxQYzrqQK zw3gRE*jP9w(k+viFuWG_xU$YLI17Ei%g3L;)SIek&kR;I)-d$fsr?JpW;QHHH7&rB zz8%X>kE82x^iJSiR#}YcS24RjdVut^ljaP<&=E)c4m2G3keSKq=ngK$P%=l_7b2+` z1Su^3s|=}hXe_bC4h3Wuz=Mrl4^}j+;Nk$9XBh8*`)Oyiiw{R8mxpG2&Rk1;W_ZR_ zTR;>Hu54I3SvPk@;numY#5?ULYt__YQ^f5>`iC2;;3{_b1FK?@HD4GhsXLN01gkV7 zN6(JIkuB@0IX!A7EbDVBv^!*52ZyX%rkrF6Qut6Yj6{Df(q&Q%0PF+Zb`ExrdtT`s zplbW~nR0K+v+R)?DHKD%ocKe{mqa{G1az-|%$cP)_>WS&9RnOEp?KyOOgCvv0t%$g z=tV%_QvXh!W39-?3&xq96sjtuMm^N|#j@L46;SHpCBz z=1=KYIv@1%mJE%2fNr4UKE7zVbSG~zh@_>e*A_34iTKV zf!`mLRdFK#Y=B5-C|huvarq=>0xQzCb^cMA4w70p45uc<#r2(?l2Iu7_4Mc&?M%00 zfElbz<_-T8Yk-L6OL|(=#B`PS&BlTEKDksH3-pOvysP{vAdN_-#z%e;mdy5qLV(Gk zQj0}F#SMgcu1dIkllTb;3@7~mvGtC@fdt&Pb}&gMn%EOfY}>YN+Y_^6Yhv5BolI=o zwv9XQIp?doU)}SoYyar3uHMyE-FrQ2?GZ0)bV0)eP<^i}M_P!xy<0jcmUe$M9 zc_p-$?zlO&X--TO};gM=jL1 z?_YmHJq)7u7dDXt8YEU8O5?rIsfX;RE*kSXj^q}~`;F~!7m7uCcwMbV@Flj?3hP?a@~92|a?@(lO4FLlvdgN=ipv^r!$s{y<3;^NGj5Hy zF_-zmW}Uqfy&Ap3+lB4)Pwn*Ays$9}hoY9@NRuJ>o|oUJ>NO9Ly^Pk04*Z*a^cc z2al}Wbo@Okk4$%t*>Unc)ho+Ka8}{baq~TwN0x35=qpdBIFQ3Pn|(ZWkMT;?DNHxF zb&LjhBRn=woHI zr_|93gP3M4%iiZchx!OLX%*<6u?wco>fD~83nmZC{S~~Pfh_v)8bpgJECw-kL+VP4 zkt}93>R^s_!i#Y{lbW?;%kdQ~R{dFqa`iydIabm@mdRADO9hW-ma{%xO>_l{=O1TN z+DGKGzP38s3a+zWk2>87HqX=t18)t!M;On<2eay0P-_CuOnAe96~v@*#gtJ+4Qweh zyP90;0C=NR>Ijqi9qN#SI_{(?7`?JCLDUim*uHM9&L#tP{ z&UKlxDXnvCv8M5yrzyJ93}^Yxn&_@p#+qrZZ*&F9nrdyZsUFvwZ0)a0J;DlJQ}Tt; z+Y0C-64x-VX~;6!IXzQKwn~lM3KH;$#WfmTJGJ8A;-6_;yln9Z!PVbotXEsT!gfy0 zHPmIYReN_123vErBJv3S_UB{3$F#dfZ-vAq^<%KAru-bcebSab9%4o2kqfp~>zuW{ z{~OtQU%wlB%(klS-XHB9m6lAg8*|;np=)*BD77PpjNgMC)xB4HPmWN4?-H=z_#Du| zTHU|*BGf@!J%oSw@Iur9YB!8?GuQzQB=8OX4-IxU^zN`3&exm0U+IqXi3+4O zA52{ne^LX{&3hLwcOBq>pX+|+b3_M|>rJv7#%7}H-o}43BAqW|9SB!rZ#QbsL-sNT=Hydx7bS>+V;(S$Nm!3a&o50&bkWc(!`Bj&NFI>~_;%&~+#IwzXbZ zyE3n~xn5|y(t+Wp>rOBHtto`-m}h}c2EGBlosibvj}CueH0FBhS-~d~n2fnYc_-%k zD|bitjP*(K6%I^v@0h)`l3yPj=hwE8-w``NWaBYMhK<7Ea6coP8I^wXvVj|9Ss<(e z2yYle2!a8~=PNBt%0_(J9^Z%aKEW)b{8ygzpa`pFzL{^ zZa#1%n!6}Z{+@QYv$7FlIH7XeAkiZeyqviI84je|uekEH1bJf=G zOg&AsU)%zmEh9hpNppN4|3Ks=1ol1v2#Cn>X)U)_-xmquZ$H78G0a~JI7HNCWIAwu zsm|~q!+&S^F*bc1DSgEd%NK61?TXbY%8Ii_R$cu%KqX?=_l++pWxx*8xgpNM4*6%L zO-Kj4MM`L3%)oeK*I4()JSA&_mE^p`gs~YP{ZJnw-YUop+)!j)6`YUNSeXhwFuq7j zusOky`U0JOxx@o8#&lFBt zk>{|nt;tEB2o+U)eJa$^`MpmrAdE|cRA9hQ17QnN0dxK34(&+OpF%0_X=Ye^I73eb zTax8jDbj=_8U%G1Aw+A$_-&b9Dbyr|IJBBD0}mRYD>+rxfC(f~L^i&e@@q7Ys1Q-> zCB)(pC0sD^`5ERdce=Tu{tRi^G$|snR$gp zSs77B1O;sHnqja{?%)>bQ^;R|43(755nxvTXoV>WPHV%wjrDCq9kjy!Y(5x+6EF6= zk({qzEm+7$AU7&1BuhlqO5U%=_W{eXp)~M;>@6G)MgLB58^p|ijVE|~hBIiJGB1F> z9zQ?t_noSs&eMMSP+Hj(5cOv@;EgPl8IRaZ3K>oRPI79K3g7!#)+P|23f>^cMZm)D z@0eydv%|A3$5pB2;nKxe=q79Co#s5z^-%t3po1!^Dqwmwz*wxeh&Q#f!&amIMH9XW zKknrtnD#+kPF+G%d~?Ee{)UO()|huDzzwT zNmLFiKWcF^Be&NMkgR2;DOEZCEAKM&&E$M|-Ln^bCG6k;MK!LfmK+#7+YBVoSQBM=rj~1 zhW&znBV@SdQojR#I{DSpw+yV&K8D2#B#t1Bm+C@O_>@>`DPG2a#Gnudb=%m&kf#}! z#=-d~;!y*>p5Dm0u8&DiMgMRvwO)#E<@hT6o<|@lF*~e$!+n^HH?Z0oVo#Lb&FZcd zyj@nGJMDOTz}Ky3;a`->5KGC|WtF!oJ?3<%)8Tfid!nv^(g-qhO@)t)N&S#<9sXOX zIza$z>TSa$GU0E|`E2bfqKpNyC5i|4e4d%co89Tpg(fVhDJl}Bp~qTP)d69UOn-i) z_V5D8kiDh2rAUp+7v|Em2;)9ZxfxacAnAAilZxjRK&A-Y!p?H<&{7KNmvO!EPoXIz zp>$=Gh2NP?zoY<}R5tHDwHi*>-kulm?NFiH93Hne&fjN7mN7K zKO&I0uC`QEN3$toX?u%**IX!!l2NS|drySOI{dInsIub@qa1LPI%<#ue!22JHuVqs z-7bKn18Kuuq|eH7hdbmt4+T{_g~aMnQ|suykOHrpCj+p2;H=6f6W<;$A`JyO4TKe- zHtbx9`@q{i@y`7RVNCp(2PY{NDfEwQuyw25Zuc|w!;w{Bcwf;aT|gANh-hH#l>~hc z7;aG&O)*wuY-#f!U6@PM@k+w3c}XjAIDf-S0iT0PIThqSX=SpIdS#vyX|uT1AnD{% zh|Y!BgOWZ{4=o@~ERyQfB{+ze2|6J=V#+Ejzs@oVz}lWP2-|l3UG0yOk|0CQ)Mx+4kn{oFjrF=31YSRKtfZ#$ z{Hmv96VSx3mJ ztAi;sus$QOnOUB8qb1Q>-h7nS+~>{#SgS@KK>uuv`stS$b>>q|MQIsnGu|@fpTzVE z^}<|?$OWE!W9K>+myw6^hzn_4Y3Q}Su65Q}1+p&yGd8zLgr^SI1mi|FxC$2juzs3&H1u z%*D?K=M%8df)6CxNDegwqIwhxL{R%A9f%i`L7<1dMMbbuK+O82tDD5N^4y1dBt>Kb zB8##Nya?}huoBz&l**(>#4Gt$1__p=QdOTcqkPLNnl#kRbKkfRV53gt(j0aV4;dFF>gR49%d})~T#jjL@NX zoT*W|I$GMV)XX)vjF{Y~V@yNs!l$$l+lA9g9`;sIUAJwuN{1Bj*sn*?zXA{_ zSi#UeT*Jkx*G@;+bu{QZI{tAk-~OqutFbT{&EO_hbh|as5;jW@iWaX@hnD0-jRdcW zdI^4!WG8KahK_pN{QkDRMGHv58Gku9d|mY~n{T4?z8Q#bU>1bF?y#n^w%l%1edh{F ziKRJ`7)TLd()F}?38uLqIs%Oo0{spU!?D#-GlP~Knj{XN8ZbBA-CrLcQ(qq#rQr)G z|BD>W@_)(E(EsgJV`5?bFD@V_3G7EaVD=sOIVWTcg*+#oR7lzRJRNfS2>zX#LNN-- z<;Uk+oppjF&oW&9x#gom=IasfbCBAV1tU21`inlw_#6w?wpq(_kBh&SUD8_R`$P#* z`S0tRN!UnldlV}zUGM!NcL}O3?v)cbgh)r-P7>IW5ZEoROvt=ot4Kb2L3Ou@wrDND zo?{~-y4vHLZsN9$-CeuhqRo#tC9f)^7V;-t4aWE&4oh%}5ZIcgDy~h=C5G>hTj}hI z!z-zFnd;^8noBSGHuY5O_^Dec-D02O|CDLJYfuJ6$a&aV*nQlaA1}erknW=^`mzQv zlVXGW0y$8H;??qUEfmjxu8juc?vWn=f9~)11QJ9FbLz8N193G2@5&KDG+ zMh862;-+8UIccnX6 z;F&8~HZ&m`VJwG&h-Kj#M1lkVk_dD5feDd9{0I$=43CV0KgUI7Cm^LPYt03$Q;2HJ zB8dp;XOOVbG1!TzX*qf62l330ssW=oBHSH6p1r<4FsPwrl(?aRAO{zt{+~AnH@I+} zkjr3t7ifpyBXCgA*a;YjDSw|=+oeO2ijfN2<3$H9^^-=!N63UmI(&4c#t9M)%EDmb3CGmgSrK?vlm(Yqu{u3wA;~$7A)>5&d`1YxOF1ZjG7yAr`oIt2Vu2DZNsu zyiZLq$1;;2mhblB7-rnmk7KP6zfF;|tV))`Pn04&&|HJ#UHKG?OY~$ukHhrU^ zxJzj|)%d3SnBOe&McvK6m zo|wRIseoZ<^M6UKR0ar(Q2S67Y3Q<*9D{g_EZR~ME7Kc24xQom%m=NeFk>={1 znPyQKO>3~I2^~d~QZDBygs)tvMxmRv(DKOj)B`lkYD@7RDMu$z^T=(9$zr{d1V!l; z6sqcT*0e6On>D`YY(p^w8&2XhbU?+h9|23J>cNZnp=q2Y zWxuyoVhvR>JzH{a>2Nc@Rj;b^>cmnZ!LF5F@ckC;z$YkE@1~zB=JvL=DT7?@=27fN zz-*vV#vcpQcPX+Kq$V{+s=n)TLr#GWpV6{paK*b=t!UT4T(G;a`sS z#k+VOLH<@`PQb^-_+j}_b~rS>nA{b~nC92RH^1tO5dP+!269g}E(*!Ri&wDE0#M7m z9PerIQCKzm$2#jEOzTUCbb5R7wfqFrJnqV557KT;$;yf`~Uxwm9kObAVNqKC3+QNV?2b0jgvet;Lk8 z%nr?nLRF%zWHNOo{4M88U?J?#hvU%{cIo1e3qPKuBFH(e@rzp04Xz>u=1%#-Tr?z2 zib==mS^w_z))7bhc=w^i9gIR=j9_o*&QYBy-}I- z^=p+nQDAf%xmpsOMu41B1({ilSisXb=76P(+&RQ-=*L8KdfZ2mYT6-(k%eu_-Ff(d zb3m!RNStzq)@rBL-Ek4~16L*Uu;VD>>~%1)rl^A`M27d3@yJzf>$^e3Z#VhNRx=5f zo{gU`K_*4L^9&Dx#*PxE$)fe3fBhW>kXb~TbRxI750CNgnbM%pFaNwYlkC`jp-Ml7iyOIF_I+yd(%nrHV8#d!i|X zT0py-b%|O5QcjC-RX==(EJit$@5%LdOJ5fC1^?qJ*DSeIS}(H{UUJ}~^5f2;8*Oe> z!&aO@Z1}f9In`pu=ARs7EbV1H&pmN}v(c)>Jvgt~@ao}==9 zz52nUAj0A6q}-U=dWYDX=-R&K=BwnQ`UN#LKKT#D2Pl@s#mI`6ME6+t8u!o_zn9z> zvOA)?sl%Z|GSiWB20oTA!=#C+@u>;AaTvsDUkq~r5L~waJmG6laLionXTTr2ObEUN z+7u*5-!C}_eIAm}4eOL&rv&N~5yVd(ADdsu4FX%h$Q-O%P{|y!TENi_*FOiMAy9Q1 zy8;o;j{iSyxEvlQU$z~Z(0;sGC@ju-I=S z^hl(=#wlP*2H4UeSg~NG^eCnR*yF(*^cWfcoN_$`D0KulhrM3vAg~5V)WJW8gGg#n zZwc^|dVi~f;`d9cLzEl9qxNY2GsNX0vhpKY2O2JaO9u>Kt%Gc8a9w<1UHWL3;XU=~ z&I3N|L3sTF?7#mIg8u2(-J`$`IkfXFBT#M!)eAB^07r6%Im5618X_a$P973t``17J zn>|F8AcuCq*)@q51lu;L7ku+J>$)GzGvs9-PYc3UpX)WxI|yGNxZ8KWUZQ6#ynd9} z9&ouGj96d?i#r4(M_!O+KEkq;-+4a$v{c-?#1GqonvF~)b4r)M+H_L` zu8kbmG~0<*1JQ*r*BosF)rDyL9NxXnYWyRR*LlL#fZ(0HYOc2$^H>ai%+DG6qe$pj zo-?vbY^%8ciBD+6Pe;In-kg$T1 z=ItEdRfAP5GH))GZs@>Q+|ykvz68%XM5iF_sh0_MxF_eo`%nB~yRu8rd%umjj-ovi z2%4`=tUL3v!Z7y6Y0u?cmPj6M9zU8v-6vYxLmY+2l&?wRdO?`I#T?L@jhP-5*=E#q z5yk77(qvr8c=FY5gw9Jy!%6<(1ZZlN)*c}+>7;hyEj&QtHGj1I?4oeFc+RjVWp&r7 zB1A}DYdP>xi~`AT0OY5L>v|FshYq<`v=_-r9nFW_9Q=fuT|dcMsZv|~qu>!@nI0;P z2B#YY42zV8VCvN>sGS&rO`+mUX};mA@Sh?2Riy6yw)mywZu?x0#b(z{m^ZCT zNJwSmo;H{KA|rxAH2rrOhpGx)+qfCGU~-ReIGhkTDyeMdK*s7t25-stBO3fFFW=6r zA2)IGi(Hqp)IrQrgexZJ+|7A>k1hqtJbe^p(LJ@o`?}kjM2y72FkGDBtB;ym`8v05 zYvD3B&gU0$ZT?60+ZQfJR@#>=+7(_$vc*D|==$QwNAAc#%aCAm;|8gO&a+N<2)LMd-%}TV zbn@}w(3xs0cuHYW9{+usWL!C=-IrAJfF(sqHfnTY_AKnK)Xizr=?IHb$eS(kii07_ zlkf&9t#31z_wtVMw)UR95aIlS1AjOwikr^MWwUsmQZOtra}It;Ziut8sghn@(MQ0P z2Z-s3ij{>R-SDvXRhQ82n~5Mix$cpxP|*Q2F`x)VnWGLD44lhMm-^uaMG{ViF+Bcn z%P8H28J`8wqreUJN2SgIoR(6WNn-_^l}oOsnJea=+HuDj z?Hy0Ea5_7i6II~WR9qY(Bb-UBu2oDz0G#A3i=>+?`Ptt#yzq{m&pw#sq;s^WS>%r& zORF)ix3#HG|I8eIlnJ}+Y-5K>R?Azqc!+<`&*GNCMO|_&QxHUTATpS^R@bd_Il)c8 z9^PH~==fw5XbTa|77$}r4#9q8ftjZ3(Ei-b?yNG)#awvb5E|!WjC)f(^I!RS44}qU zks2kn3wLT&ZC0)$Hq-gAq2Nol-Ff9PKx~<#)5m!;^UOvsT8t;#DI{opUm6R&Vl(8`68}6BqaqN*+EY@1<)xDn>P-WLK*K)&xk#LUy>&LxVwdQpR8R2f2{Z4 z_otsp`Fn^kk2P1%g#NzZigX2Bwuj!AX6d91-88ixIaY9(QZCw}oo#mqINPHwV&7*< zR=gdfBn4B;4o(rxAs(oxT2Zyy`YKfEE(-tpguI zxKdV~ju^DVAC&uMt&dbut0OWs!kNOTk)a0?_iwM1W$H;d`Z+qn4XZ{L&yY*bN6=r~ zZ(eJU{oIxuORqjJB9@w4z%7GjcNWay8Ld@QTJ{QPq*$Y7j@gnxFrVr&oAjhZ4YXnR zUdWnR;Qf_sK-;*pzHH=|{1V_F_^-5QOl+1V_H8MR@=%I>&` zMudnNYs_W+sTN$O6)oOwjKVxE@l@;r0=aI~@te=fy4w?y;+_@_fOg>M)%i2RIeFtx zkdkmd5l3I|FAZ@4Hx+VT2aT7RgteAyGh+wvY@d)F<(=g0$Sb_U*f14*E!$GU=g!K6 zbochkd(!5ADOu`-V+sKZ-|f`~92&+>V@e0;fYm|FtjgGf1=KzP_E|&Dw({Td^Y7e|MU_y0Luj_TMuw(76x~904pjPZWLC{09ReE+xC%o-vW8z@x<@DCp zGLOU8%52`o(8ihQ)3%MQ5)UaNs8u&wrUXBg>%RPZ1oXE((UnrpMlazhwsS=kO3nw1 zj$8H004k||>_+B_QcC!D_;8z;6;T^m|CR`CWD@+3-1v0?K*h{1G>M~uvQ-FVsYxn0 zuVuqF3!1kc@(XE5gR(i2QnrHK3Wv%x=2uLEp+UvaysNuK7)_{NcUO-7$Lq7d`q%RF z^D@XD;$#Yye&g+6-ySXQD_Pku_KO+^Pe0$r?b5F}H`yuL+wp4AQdgLl1RB+;%+jn> za0i4x?$I-PKrp(>ZOh%Jm?*ZIJxTax%P!b!J;v_IZtaQ)d?6*GlK7Kk%C**Mwz+8| zUU^`;)6g>6)vYO~*wmW+H`U&w#+y?tkMxox4z1F5HG${UqGf}8PzM=r76{GCv08j( z&wj{L3<=j0!-w(2J{JSTMYQ?1y_hmxq;b~ybBQYR z@JaHiTTGqu1;JdUsJaZDE;bbdo4+aX)lshO)qLzO)lx;;?r9#Ola-BepK(mPSL3HT zjtAl^;57JF|2ds(hC8+#V{ll$1#Fum*^M+|kUsv1?fkq+g7QcjN;0PAkl)p82?!Hg z{D^<^ncvE~{U>mS)cK)6J!HER81LyXCc|TLS+Y0xf5FY(TdNk8->ys2Pv`qU1bm3~ z^kg`CJuH4DSxuh=EO-Uek$wt#V`gnQZ{mYYd zR~PB_tpD(Zikt8hdQPy`YVly}l7bcjRD_}3F{l=BmVMUOmv1ZxmZqzaYq6F z{82R8jQEOw@wlhtB4ouPhlEjK0Y#eP;dStn+Tl?K`Kg40)AaFK6Nt8 zt4PX3X=U7+C4^j()pYhObc>nz=>0Y={AANhzUPIF_OFyem!LxJ@_Rx)+OBplFqa8! zjh)^{T0^l?d_YRJ4=HvqnDzzYC;~S*Xb4wx`Y_d@ZrD{b+J5q`6 zX(j98gHG8-$TQTM>AJ>{1)VNi{2RJdTG~W=>)c)=B%85iLvh;H%sx`j5c{x3!2e*_KI z|DVw@fc~G+(LMZUyAVXs;t6pevopqzxBOZj5aJ>sY(kj(>E>))wafH=u+~sG*rP zMtFe|1&kpBsN^wmVv|=S-DI@41E|U>yrf0^?o{q$FM_uacM8wL)OeDQ@}WMxuRx)B zQiVGrFMYr<_*sA(_@k-tR!tYE!8Y~{^f}7D_O@d#Ds8JSv&<|iu0HN@kY^PVLNE{J z3ClX{ZB)i!*U7P(>Z zf9VYiLHv0TH0=LGA~JEXG5pgtXaQ$6*aQ@nw5nLy(>V4@Tv=i=CsWF-1}@J4JTucN*^gpd%EVD`ucx=}FDkT|S-}$JGP~;2wb?DROW?|)xuL!7 zQnR7TsJ*dxL%2lqyTAO--P;3B=xbEjtLxE%o#IlpmEYi~$8JPK+SP9M3RU{WV|m)e zX1RmZdRY2PIR-PjZZ4^&GUdfv_Bf4Bhw;e4W|Q$r z9oOn&BZ5;?7M6{7vNPkom$kH-)hrZvY(M^v&>2GNbr7T5vw92Aj%4gbjs3g%yXX47eWdz`wv6`jR7l$&yn>ouV(mECjosEl|y$EvP=k zaxUdrwzitoAEHkn0~0MSQB68;a{H?6>U!?-&eu7&ivkb5R%gwNu9F*OJnUv{i)xg1 z6P3hTAvO;(E`Lq+=RMhlHj453SB18Tp_;O2q(uhC~$&i;D@ zC&<$)=TT#$${XGH2VNbk8C9USic=k!E_t`V-09CLNsKf-ReW$dr1wxBgMWTo#%l_> z{B0*hh5f`*rSvI+5+=yBJHtMZ4({)Jx!A;d$*0O^rM6J*spnncQ+;))t`j!MU#!c;rf9BX>j%f4U5@M5%DzJvbU!_M3}*UU7KJJ(~WJTJA?^1fj> z7@c!0U3_vgrTh)ac$kuH=wf%;4aPJ%@w^)Y&7p`c`><6wk?~c6M%dZM&F@ z)o3hdUCKNe%eZ^a=;oDK2UR){(Zl5Lin|c&(H@CTtIqO+qCE_L9Cxr%BbX4zz`YSY zAh7r{#E`}A@Mpw8W4^yNL{$xz4@PFlm;_eHhb9w1oDfnZ{E!mhi2V`nXH0N{p`IlG zhVnE3WDL{eI*L{5`_trJ`f>hv z*@cZ*VhjwBbILBR+N~G{8szDJ%;!l55S5PqBkUR45KVXn@a0lB9GX-9?_=g0WTT5A<7qy6^`lKlIRz5`InO#W%F~@QEbYYMjiTcV zFry{^ID$)_)P75uthow6Gp2G>EX|hh^isg$s8)@8xELIA9({<)xq%)p*&Dq=DE)l# zuY2)t`_%88Xps%!P~QTS3(r$jzK{bNUKwjy4JT>2DkqIJz1f>@be>ZgKOzS2v8MNF zP3cVS#gk`~r->5KwYTvsvmU3nV^hz7Lr#BOzauZJX~BbC(w1h26QqNqiSTm5VNQ5%SBF6@+~8`$`zFbwq9-kb-x} zfF)$4fE=PSdRfb)(>m(Y(;qV^G?7BV;dh9!j?$P(V8*EZ{hgOGSxll4_m^5VC#GJI zHOX&@s9l?AqY?L3R2_VSu%nk3NMAZJ;Kmz0+Kr8H4AGee2amH^W*zUqOckxPSA033 zSm5A3!aqq{)Sg~nc2g)!5oVT{RG=I@Mf|%K3{EJF>J`R1DTy2vUQDP5Af&}Zw@pi% zaq4<~zt(ISuPY3pAJa`!n6`lUw^k*8Cm^{hQz6>YAelXh=5VZ484rd4N`zD3j`Wy6 z%CR_6h}hT=i+9ZI8wbUXcp)-{LS!)kbXX`ovG8*&BEKO0Wds8Q=_w?RrFNPEFIm1) zuS1!j3XLLydM}<6{f{&k;O#sYIsM6a9ZRhbbQqL&^1!*4`NG+tbh#O3?nLL{4yCL= zWeMk04F@Q(ddO7eVh#-m5zN%QHN)jHXd z=>(m#`0>hNZ)agJ~AeNnhO*mlr9O7(-s0%88ZL^C`?cVO`W8SKFcK||QEjdg+nvR;`fG7s+6rM&EHd_GsJ8YI;$?~r9)92$tQinL^A2ila$<0N-CKb3RG z(SN#!EJIA?4nA|3kU_Wiqxfm&98%43aEeLT&ZOGkvL1(k0(`o6LjklA3o9`RzgB*x z#t`+}8LI!o&GU?bZv-B9Tb5c_tzCqb)DoA6jZp_+9Qj<;-RD7Y57#XEkvh3taf+&X z4u7>~gehtDZfFdJ>SL#fYJ`3<2PP3f3y+gI1!lGQKcl;Vt0Ai)siDAr2X}xsAg&_m zlF=6P3Teq|0p$vq_$Fc;ilq{B+I_UaJjG=9dz1Ge>J;}Bh<){aO?Z`h_-fEzscSq4 zJp3^sge@s$^<>F6{h1XRR~=g&SN*3t{%!bUAM_UfcN(|&C(#S(3;GMIdnmUw9$`$} z(D2?q^ewS_xL1f*at5JXyxDO5zUMy2EjNdhF2NQVU0m{T_UYGot!IF#Sb^gFzn3M%H1(pZ=!$Z>&;~iLV1Z^`i;b$Q978S<}b)>GI)P3c7|{B*jzQi zN4;4BhD3@3{xZWRPc6k8aZbpN#o8f8Y*+F(sb#F3e!m<9408N4BlW?n-qEQ0OJ64I z5YU>?=nSGGs-1?h0TNx=0;Lma%6LkWGHB%k*TE-WAe0DAAYZf7Xk7bp;>pA{bj<+j z{@YtB@8Efp#)ZpMPBVhqiS4oAbn5XRkHXJ)eXI!436{Y~CawS_dhigdw@vabu>J4rRm$!!WvD-IRM3Tt=$b z7Xti9z!6cf7BP_UCssK8-;mfYgjbIErTs=lm-e|s*4j>Kx+Ms$T%qH**MiNAQe!a^ z&nRr8q0abq)C|AoGEamY8c&wx(zdLj(t}7Y2(!M-B1Yw4iaN9{dwc3zl!ABVweert z)W{R)kM>IEDXx)KoDrA)JVp{b+Y`R`BW$g{e{61Kno*}X7Juwfo zYX%s`tL5ad-09eXrUx8jEcBRmaQr)k-YA&|1oj#{wtb*Qw7}23r`PM92d1C>GX`>Z z$?O5yx1=8ys&L}kkPg4u=g!H43*lK7Xfg+VrLD(ozTqqjx=^3X(gmTVy1e}4eEUa35nJhgwFi@s{D^ z-%~_d2&BAi0I$rjf8?&ci*C z#ixkDDPjqz(1Jt8{1i(9Nz78{j1UxKf!h^pS=xeda+Slel#IPkg)+^FC=xOdlSZ#^ zS}Wggaq|W0p*guXz{Rs8P>Bw58I_5MS}Kf&P(&;)zA3lBMcivd0`t(Ms|@_`@?2o) zy`a%0OqbzG9b)=58IZ#Jav{W#JL08}v-GpoD)Ui#EQi%9MKMhac7zYqV+{PDfDh+H zkw)s6Ai6POR75ht-WWBR=UiwaW-mCNK0A6$_#6G?h246M>dRDq)Y(~f{41=wL$3dl zdXLrk$ZwQ3FUGH^%|qNEzJ;}E;hMuQQ9GSqw9FkJR-HECmF4&+H_h7wJj3eiF6H^D z;VDlO%7InFY=_=@J~bnrRtr3RKqTW{FLa7;?SQz4aMixlfg%alFBx%^e;Q|izMOsd z#)!Vv4yFs7*4^QK4mbI|k)aSUjN0&8$qRL1u#Q*FwSC(zh$(D;QNT4T4mq!UYSuWOteq<>736`0oxKuTtn(9FEEjSu~PhQUygP_bMn14XFBwnJj6Eq)Z$g zbS4uTNJ;~_dWpT*{lgG1ZOOw})WeGdQIQ9X8EHcOiNzUGlk>5xfpsx3w4z-KH)Bdp zRCuHAZ$DKBzR!wb=Rr2zZ0z#?=C3={(NOcFeUa+gkw(@EH&9)i%ofAp7^+TL*OZT|9K}1dOnb_x% z_riI!PR(k?j7CtCx}J4xFLQE*wFRFu(N0RK8{AnJ;bngVF}~{6$6SYC-8za^alQKl zpv0VD_wy`za-y<5RX$~+zH3NsHj!2#jI~8s07!b}V&roj+i~~C_K%WA@|XU3lXsAo zRycl>?^;w(8M9j6DgyI$F}dz|A;S=kNUd>Udx$RsUg6ql0}i1#=Opg#`n>X9BR3>3 zJa0S{KXARK4U zSh8%?k_Fo(f(n6cgkZ_=8af=bI=quT?yTd2>Q*RXG{peieK2sp z7{fyM^`>`yHA~kmzwwp$c_nx9^{(e1J(ivjGuEvGn09lVwvBr+jka{O&)=Co{w_T$ zdhl>>c|WpsoMMAgxjkolA-|t2UiF>liG@H0OXfeTm5)YH()p+id z&DJ;pNZrDDuUD)*LQ!}xo|631SzKm0CHwI4h(huG^Ja@&nC>N?CVk?uZ-XLvq_A$B zU<^yj!~oKi>mnfCFP!A}#Ma6-oCA(;*94V zD`QlMV>TIPkgwxJ$R19zwVdeIXeAYbc9?gkx0BDykK!$n$6}|+#!b}MrK4x=Lz#Tw zT=z+u59}*)N_>xMbAA1XRV5r9$bDErfvRyun?$Bo(bU6)C5ZEZj1@>u@--(#Uw>aH zy#7o~=1MD4?d$5iseYCxF-5F(%?0Ts7m@mQR2luUN9%~Il=YIUDH(f5#r+DOdi8l$nHUYf%BKLC9|g1^g?mG3Oq`Z>*| z{?2l3p3z)eFEmfvI!<%7p3_{-8)*KNDleruS^X>ge*EzB{hPbTf4KZ|cmLztPxPfZ z|9=qMHJxku4BIOcFlQRl+=fL)9UFK6P-bVKbGr#R$roUN$Ke_xw~S;(s{W)h-w8Nr z3;@W?cLG*JF$a^402(F4AONTEoe+#mATmA)=tY2o`A)!@2{;z=C_r5Zpz@d!fU0&h zovb`hQ)b#%3CPTMEBB~60a(=tXu@}^J%1sE`EKnyimHfN;DB$C-AD|aqqrFpBW_qW zJ%Fj62zO2d)~F#1esTCOk|1CSms8X~no9~E>aFxse&GI5VW6^%i+ggk#E3GLh7!gA z0jE%(Mn|p;tW#Z<&Ni$R9jZ5lfhi)Ojm?;$Q!obs?!B?S2oScIMKQX24@P%JkP%MNqBqv`0n=gudV{Ku0ocff2@{CONmS>KCyfW0Hr(h*Oe&5Ym;# z>EmR8>{A(lYYCuWR!KmzOmP{5|9`S*dOmsHq!rAdAxD6HgT6MX(8BX60C5=z$W7*W zLOT5-t0#vv&6>ON*wI{A1CU@*or^UO^%2~3|0vw}Ja?h$mG5fN zXsR+utmfo+pQVSk4U-~m{JC`QRPz8RW7{tQfJgG+CI`^i&y+6l^hu*S=YO4n{tnjx z>7G$5Or&soi7)*3!8D;{%cufP+~?xoOS3z*nmTt#&vKfComUg9a|Os^)Wu*GcPOPR z$vN4jts?1zXhwFdJcE*#3LcW7OJ~0w0R6=+uW9ca%|L0)C_BB>U6TS5x?2}6QiFA< z%4iK~c#PpK!0-v}qv0kxE`RM$0A#GFfoQ;DI&}L{x~#el>|>t%_-mH@({GcS$`n%L zALM`>RDUwj;_>`+A^$%gZtvecpVB|SMbK}m$p!g5G`*CGPfx6c`Xc+v*NcDs_T7iS zy#I7r|3E*aA)w{>%ug-oCz$&DAG|$)3jdO*>u6y}OCtE~@7Ot_!GERc2X^S2qz6n2 zSBPd;PG?DDE=4+@NdT;!2pCy2ASb0|hCAWRA}L)!$wD-vbUCV|8+=Gw@vWf%dWh2c zJ#k(sE#ggSOc9i3s%x?y>>7~|slO+nF$eT}l*W{A1zrlR3G3VyqVzb1*O!t#?bcAT zvcPF;%d)SDIVdeNt$&&eX&#Yc-oyaQhL}Gj7ctR)E{zU^31@O)+#MkhN1rEXgRXtYFfx&s)e^vmQf&9uNd z%H})Lm@S;}0DrLJcgh1erKgGWNfCJBPI>_FkDT=k;3GzR28b#)@HCzFz_cvReEXnaTg`<0DOA45xUa>$ZYe!=yEmtES{ z0st5`E(YwX3*$u&0Em)_14y3z#O&#k!0VwhToiaQK!1O6RR91HFP71hukffvgLJm68zuj|H}$5-Fqy?^!LD-p-R9aUe=`LaG2N9|U022Z*gQpbA(g5+q&&pvi@0 zQxHPHejxT`&?z&b8Um#Ahq8`OL8!N?jbO_~h{}k4xl|*)mY#AcrX*6w3lQ-myd6cH zS!*aIRZ7ejgyfZz+K>%KkjjZ!6-YHZb6)`ADt}vdDUcXhHRS1#x$`;;ws9C>s&_1I zq_QF>J;RevjEJ5P0!vO0p$sqkFdSaizcCD5pZZa0J^`&|HxSY_mw#=+ z1jKAAR-eOcs{L{W;J{^P$>JVOU8?|@H|NRaipkL7R3OUb38!Q^@*$w>F9z>?5P)3< z0a__sGdaoyf;k0S7{l^l0w6$St`>&_--90YhyjCRtr4Dl;0!?rOoR7~Q;QV}^G^ zyiLzo^wP~x6f*0AH?-jIEex=yo1yu4$-p!Emnxf5pXWbR{AhvyMqJM-8wiJH5S+8H) ztk?23>$OTk`(5c2XfLhWtk-65+KXiZ?bUWd;iTprHIQ8UBLF8avp4JM7uce?%F^&P zXFcCaIRoo);NNFpJ+7SeNPE6=l9lyRF)`(){V8WjoAw0Yy3VFOfMT=013AjCAfcZ$ z&!)WrPJ1mzSf4^oHh=B4uABDSoK1UeF!O#}Bn959(KheJtbzAx_{jUG?0GTov0I*T ztnn4z*FVPl3Xg(Mbw9`Zxwv09?`eq;9GC|NuACeIb;Vg9XHq@#eqqTNXuo8G!g)_= z?n>wV;$?WCJx;Ppob(Bh(jBK@^9v9Mo#xr>mw%6L@@uJ^{8FzlZ0e&4q9;myw4ucbA5Dn< zKK?RhobZuZjxd$^1mqbfd;+kAu$e#Qo>7?ar`-M6ouI((C(W~&Z-6sjiis1x)?_nZ z>$;gQ%?Zqx_J8gPUk$Q}uO{2X7n5$@tI;FxpR(u0yoc%5i2}dO`}Pg)JYac?c8<&z zBc4yWjiqVzu$g(`^)XGf9PTa3L&cEN`DZJ>L>3~KHd0y{r2(0`}^0I?{8oK z`SR24{rf+5HzMO=KksqNkueDhu1)c_{q&8SgZX!jfN+cqzJve>)@MjNHS?`xAUdb& z1vMZ|_o6a!LW*bYNesa^0F<+R2shty8M?a+1Vb8#+z>3e$lXLj*f~l9@o~hEV>AbF z*MG8(mwkIj)7%DT^{Halb)5e$0_ z-+I&TIEEd(NSCE25V*Fp0l|!R{TpfPumdD8r4^}>h+kGVaUIX5NRf8PiRjSd1_IDx zAT)i6F@_%9;&I0mNN&ag0l{I`QVrnCrGI+tjI`Qa`X)JK{pWegsWP#V!6F|DB1B|C zE0Y)+J=RzbrK~|T-ijQfX_GNZqoZk4LKWGjieC;}D4xk=2$AGOlmTPN{eK}~36~8sds<<`B+TogGP2HL!=D5-v zv)R@hGwjwJ>kbzW?Xq+Qb@-W4sek0P(RD6q>hME>##2e!lEVjSIZ95+vV?HW0l)*^ zH3vwmQFDO6C)=6>1UK7Va{%C-ifIm~&lWYup*?449@m_WnC5svt~pwns5w^SGGl{W zbG*$iI&POOI%Yi=9XGIxj(0*3o#%Xe@qMsDen}gA#QPP|dEwoTE7gGusDGD0zoI&C z9$)=%_wN4H?VGz7YEB>WB4TUKk}F6-VSpS@k*;%tX%26GTxrgd$4fzT@Cu?{Y0f%% z_c3Y?L8C^=A%M@_x8y8Yx&_I>6AaZC5s$>s2qRY0TW~DT799Jo3yzkZqTp!#w%%A9 zTyLzITW`!1A~#7*$oATLV}C~7%3)oxmBYGAkfad2$)Hm5`sq5?(XR9cui4ZS!C#U< z;$pep@PoFfH+XH9Yt$RQn7vGJMC#$CN4@Et_h7c(5Fl=%>J8GfUCjlIq&Qz_o~<{I zxZYSnTW_>3qBbd3SoFpkwDrc?y!FQHB6_opmxA7yfw$gRCq%t@#(%XJ>kX|PNwJ^+ ze>1%~;r8kElCSB_kM|F+-hFtyec=MDti@L`w-IU`yt%wh#YnjVCU07~-dqwOuy*SW z5PtsUdIMytYb1J8D{f7mTW|0oT$2oX1E8*`H$eE!zv~Sn!NU?`cu|ZpItj$|)%zrLhZp3&|Zp^@2Zmbic z+&p92OXa5W^UM>MDF0S+Q*i@#{Fc@{xxD(DTR66dGsJ1Fawq_)sq6z(J0}Hn zORBg}PMrt75p6&7egDO&@2cLWXPJISuk@Q@CM)E0(%1EhUZa5|OVX#k^6u{4_jivU zFMqzf`|0xO?SI|wx-hvT&?0Jrb-J$4}cYTceL0N~yK$$uwe0t^Hw8T?-gEO`XB<^~d8 zlds%jo}&B6{?($J(O$0Y@Osto%r&Q2`>aP7-oC8sPq)CKTkmQl0J6ocW=ue~VcGPD z8rC~!19HLMv)~uQawG-d^aA0dPyjTGof2dL=_-#O51Y7f?zye;cj2EaN>Z0?dV8!Y0kg_?{{bb?72H*y=@2tlg!ltnK+>8rGw%0uFsoY*Sf zQ^h{%`}mjd|8)2I_r*2&q6jDe5%}V7GEPPKpnvo;N+A#TSC9%rwpIwzgIMq*drYm# znZQt9fh_WRKhOz)Ozg%uAbGIsX|&8o*1k370?~jxN^T%>;${5L)h9KI0A4Kx8X@PA1JQ5_-y;>5JcQk3 z#VPzbBcHK!SM3qXV|71zPzmn{19o3o9w4>%^aRq?jVctz!QoHf#tPahutDD{PfxwNOepYpcskjrHBQ|iYNkOxL& zD*3w?>+ zp5o#n&CBMa>+K~Vcvk~t=iztJ{DM`cT7g(z#S`4w4s$Q`)4Y37cG=i-;1eaQ-CBD4 z$Xc+b-f6N%F58|kJ0KpDEU&~=35c$*)SlQvaRZ|hmKgQH`{@eMa(Q|JGUPed{>k8& zGt*X6b@0v$D#FQA?zK*t>3@*s_g&N0JXpAwiMHy3jR4qk>09bn<$m2-de5*`-TpqX zjhYlOf30~Y7$$UsBi>b>i+EVd^@lo#bPR=c6Ai5nkhMyvFoq6xJkxFzAX#HbyBUzn za%LC|++zg8@z|D~H?=Jjpv++XO%f=>Q*ymn9uPaPH}MJ@t~J!wo`31XFZZ9`-+lb} z4Q>)P_(8?v!tmhEJ9-jEEE6xJb4(U3JH^%OB^Kt1rNSFkP@6!Oeh{n2>>2>cqkl~OQ>hgC9@ zd0Zv4sRvdvvxmq^PZ;#lyMzsa1iu_u>3_K=aR1@`AG$}_a0@{kjxR@8dh?f`9`0Y? ze!9DSfB*1s|Nh5sAT71a-Vtt}G~TY5O``h>KpilvxTn?DhV%=Zcma^b+3W~1m@ZwP z&ewVJ@|k_LI)63pXVE*hb&CFW+#&7?@HI`{_@hN4hE%S&{VEY20W^usB;gDJV2Oy^ z!!j5NK&+ECY?UiOLWGM`md2V#=dAtJ+Cml5NC20?^o+^2`EhcwdMplI;ft zmlk&q2ogF;^R%JcHx5h<)2O8&JdbXAYCXDZjMkJJeTKFmR)U;!YHNEDZC7*f^>rOR zYO!8*BY#Yd%At{?)tv=z(=+P4R8@%O*qP#f$Es=IwD8*nZL24TLWgdl{d@!Z`Q2oE z{&IXnC0RA7i0qE5f?zL*4<$`O0QAU^RfHFtM9YH68qM(XKtH0sch;-w#?@tq0m^26 zj$}$Bg!ku2CJECIs#Qi%S}g%Uc;F%%VVY-j8-M5eRRq;6p8A{LOne>D&sni(ueX+GyoZgC*J1{Dc_D2e6qF%3W_XHyc~Zzv%aI(qBK4km44!bpq$2qSQ!lhXx|&bUIRjC~@R zB$RJJ>^r(H#5N6&p=7+x9;MBwojG#Z41etB+YvMRCVV$%>4!u`aCzg}Uy*3A(LF)* z*X^+Ir}@TdwhwXnx#&wFuOmXhs&AwXK}=!QA8jn+U-LR6xkd8ff}=(wL_(UnWsha& zn${mcg0GSyA~F*)>4=w~1eZl(YnSM14Ds`?Ulo@27k@U zk>{{t?Li7)Xm!X`Eci-E$w6SOds2XQA6m9@n({j`Oc1oJB5xltIITWK{)a0T5h)pvxSx7(h^MTx?TC~O&r*8}5h;OSx#}S) z0bsYnLs9~O8{{D=8xEb+=arC@K(OZakdy#$_~9Wb0f5FHl9GYxu?{5}0#aHA4@haB zbg8pKJs_pkYX_vXs%t<>Ynlh7w8ncxO1009NU0VK5h=~;9)QyNCBw0>I9XN2J6qAa+(gOh?H6h4@ha1w1AY_j2)2D+G!Cf%@7`u(oAI$ zDb1E1k^FRVQ>$JJ0K#wfcyGgyA>XkSE}+(80S_7BDSuI}ym^M);|Fuo zg9k4(^Z)uqQmCqvb6t77p^?D!*1%lV4|5~H52_OT-7J-Df5Od)D}mDt%$)#4&Umz+ z3`lZbd6f$Y?i*d_k~$;!tDSP^TX04u9nT>In|s+A{* zQ0r>{10CKn4tLgL>#H67CN~jA?po1~wVA$|t%0l_`@@Mt4$CvbyLp5V8`wJ!QuQPF=4-&$i;czI*@a@%G`>?N1**y}f&V`w3_T{YU!$wkWBWq00ml z0yr|W3N~39lWLm`vu{wx0RlKUvp7-^6#_Xhvr1=$0RlNPlhJ664>&L&Fd$MdW-T!- zFd#TKldtk3vyW+79FuwH43Qfee={>QFg`vCb98cLVQmU{+Ra-_k0iGZzUNnTPM$q< zS)$&+Y#;J)fZPo1EzY5Ly4yg2g^~Y%2}>d=s!BBvV_{?mgXu0&l*Gr!hiXs%J=v4N zAA3r0O13Oz{dao#hR=S*-+$2WucyC!IsN#P4X3!2-ZXXjugg3B3#SwDFqvzLfp!xcZ@+av#2KVN*o z=PqCTN*)|Ozc%hZB9k^ctcN3jznLi7GO_WiPp|Y@MtzdKGJR=#!EK#+`;~L?7h`>Kr^ULMs<^u%x=_zH#wA-9>`L+DPv6Yx zZ@-;>#-Bkc;gpvWqf2qr34V%;cO@rQOQM6X2Z%~7c;dXC*g{hfWK>Yj*MTGo>8d?H z70yT;SOZl)IMK448(~%Ood>Eq3$Ia0QKkN-ly#+Nt7>nu6Q%;9f4K8<&^A+Tsu01Q zbavC{mZevX2A&!`J-xO$ooUF*0t;{V(CROCUBo)-g@hS(9l~yAcGv@LJmB`d;6X zfQesU^t$ytk^UljRBba@j7B6=d>04987onX&)4&Gos;uc=L^lG8abNO*;etnW>f7k zzf*sbY7p7 zVU?z@YIl`ZtgF!}|Lvw93i)xHvifl(*;bjmRAsIiF?NL{T4XtjHkI63%wtyKHGaGQ z2`MTXUi{MW`e5!Xh^A`@zJ%gU70PX1izJ&wX??mp1wt_aiC@SY<&{a%~FLL=`0e-K(9hW)bsVFW6oxT;iqD3nL*5a4u5 z`hHS;97#@Ael5n<@aM+xhtba!Q%>h#V8LaASj(+j>X;0iA=(L!teNh$#?=#q46s->311s$ldmc#!!vgUOn&PgS_@_y?$?E~ z#@`J_-DM}*U}HC7IZfOrAGOcZXgM|A;Y&aC;~hl{_=(`?DG9E98!}}GoMyoo9VFKV zzb&w3C23_09KDM4P4u$Pe!m>oLhq~4e~PMe;>S{h^{18_7>8XvJV-MbQgkZLbuF}> z-`Ht!kaw#UZFwZfAXdn8YHtfwU}G)PUK(F;!gJhj;id#+E_9(xe3B-MemUVAYOsfF zqL4!j@FKi-x$bdo!~Kjf17C^CUK`FpDV}V0cr~^ojzWSTBDMh1qjzm+^mw!o+UJ4K%I=a+ol8&NDEK4ZfIFhI1qW9hd;wS}Sy$w-5EC#X-s3eL^ zQ33NRgJh?B=MjB^B*2uPN6f4UoXk-wN2+@ zp~x}ARAfES&1B{LVzLF{f!5sCaPz0~=nh7VKjH4FY4;u#c z6%gYtk)p^q6J<-LA1Z7+USNLywg7RF zd%q@ZH(W_2}Wg{+y1FfBF9E7%=xJA=pWI zJiB6zyW}8#B>&LG^{YLgR(`XVpd+fdc-&p~MtFCA*ACK+yD>9k_oS6}Qu4EFbkupySwO=RXe9jQFkBOazl!&+i0`HVZ5rIf7^I}GvXNYUc2UjQl_C6L$+bCsD~*c00zcLsbn5(KZnI)qC{!; z(_cT$^3AwFF|nuS8tnJGs}-IxM?PDM4jVVhVvO|B(sZAxELa}rk8Sg|iD{+i+ex$Y z<5K3{qci%mO=&SMvEq~U z`8Iv5AmUZL4onGd?7j>3ucOlaR5@(F6tP)d=hA*;2U;$)JDtXYnW#;jG%7e`Yg~+V zu#sQ98zr0Te}E;eM7>+-`A<94W8ZlPW@8&+dt2~I2YZ%nw{2`*F5-)-n<~Cu>q$Vs z7;aN`7{jw!@Wf^JuGTwp?AIC;d2tbcdV``zx*1~Gu%zH25@h{iz!GX%I}nD&+YlMr zeu2bvBR_|zV|e)|Kj-BafFwl73#Le!(P|=Zjrz8ve}!|f{3cVVuT~uuU2U|#SJApO z?I{;sL0-;U&4#`mRI-wEH!_e7%wv3O$z$}wYN+g>cz-#24&V;oM!`YgMyyedZNHBA z%{4`1MDA4r>_LE*@(N;#%me1T#a~+KtrVc2qe>V!Vuao_??ySlBK*)R9TKj*kDC{1 zyx-Q;fAz^bE84l&fLWX`#fsZFcjPt^A=JLZZO{$H3!jesCKU*F?>8_yPFZp=nYn#t zB0rwNE(vp$^#xyaM(-O>X9KTYP6~e~@CLpF*m;WCC%DT;(1$;_G_wBb&f9Lpg`?Mz4PilrbH^7o30N^$t_*6~( zDf%h=;k1Zp-07@n#mIXbk(#OyP%$yY>5H0SY;@JX{q+&F&u7(IyeT4;3D^P?ByCUK z%MkQ7ePCzM2};8FA1$E7OyswkYtIMHnuJ;Kf zmH!$2I6VC@=eYV&irKxH`Q#;*3}NGydCM#$0QdcJxA7cD;F4^&?~l8|VBDB@m{lCw zuKqJez$IJ!A%;I3a06@TuD7$<$|7J{SwhN@?tTxgzqO|8w1}YAK3`zKiNBY ztEfbf1;;7d&Vma%Ev{3V7PBT{({} zyK&C_D<*L86ilnRlg3~I0hR%023}@6IB(93A_e~ciJD|pv5HG~pDRmvxO2L>FSUME z{q}!v>TN&%uik=w3o30X|L^VV@5i&h9sm6Y{P(xFzx@98=f5iV=C>3~wDIltpEqm$ zrj>sQ>dkG=CavCnfByH!zU%LOw|?K9JO0(jfA;u$KmLuM@7nFT#1r0_K|AX6J$!%Ezf1cL>z1kHC&wh*1MAhNRHn3zkA5d>xX~u z*jceO_y~Q~voKvrTgUTozH1ma@;KdIy>ujV4Lxt#<(cI}QQEAx1&(2@!`EAT!;flg z{nWRmk1yzXuSYB50MrN0or>x`)yj3pYV&-)n#K%0E)Jh7n-pM^Z0U=)6R4BOCxE8_ z?`#>B*7eTWCqAKbZR-tIA8lVP&V+v-fI0xWir=s=NUJ=Y8b{RwRj(DO3AmrBwor!k zfPuqOLJQyUBwepo>5VNxe*ut8nB9HgUe>22dqRW|N7?>&%Vd9`Dp&Z zmcU}eZnDnMovphn?l%q51MR7o)4g~tSbbn32c=yeF}enYxs*|ASbBO&jHrJtP-#A2 z0b2;EVlRPKuyaV1$%+>7O5W^a7;I@kv%L;M%}Y^wa0DO z-n(OOVW37H#4-SnTR?*ipN)US!%J~lsNj4a?WM!Tm@zv#(|PRgN`)=Oq|)k4K^W zMEiE;S6q`-{tyJ8KP8$^yvEhl(cXU46AI7qc&+;~Pm{?(kMqsRfMF!IdeEWO`gF;|rV@ z>xdQE8>564xzOj-g!&qy$>&>=;AGYET4Q@nG@`a5&a0mOI#x9-$(qM99@+MpQIcZ| zLSVO2SGoHRsldX5IaGfIz)8lScu(bo*Iw}4JV5qpItPtpwad`LOS=qpg!~I5EMn2E zTRn<{AbDV$O>Aj0fgO|v*YEf4gr;C8$G&!BrIaMZ7(eB%pm#*JDjxaaO!T7hS;p9% zc%#{!zFa`p79B~SsT`Fr2|bx9VTxokln;RN7s*X|(yOSUjwXM>(^0NR!MhgFw#`Re z7~JZ`xVca#*t8Hb`9kBcVaspPy<|U5@1ses6HxK^*ZYa3N*%F%U>AS}a3zzFOnqHd z^@r%_0UiATQ+YHM5jy%3JQpTm7~SA1YVs2U0!bG}XfSiC$BDPlMDS|rGv=|I*O^Cc z@!psR3qm7*@aBJVdp06AnQ@gh zN&B#z`h^R{6wN>XHA;!wxhHCUmY?S1VZMKaswAgq?51K=;q6`T`gk5= zgkIILvg&bC)#}Y@e~fadYQC{=w6qApd$u9kY$17NF80G}6K&fMQkUshHkl z@`9^0liI{Sc5ZYht3lO%k@VN9Q^|O+p1HTYG<(`(>^)5`Y))BYkSUbPnK@)BaW8u6 z%MO2s*`nkdZZ@Byhpv)C)4jH6M4np>@WNWIBx*96Xe;(=DN> zF_PMhKHtkGpXa@Sak-9Fi!q^4%gQF4mAZde$oY~1tyXd17+-Vo#UE!^p#k@|IKB9G z3;RLh+Qsjdv)V|WDAh@Uf@byIgp{(Qu{Xr4sQOi?WvuLyOUb%9aLV#Ns1gt-SP9Xn znra-pW~M}|nw_Ho{5XYX8?~7fP5dVfsi|4q)3FWuV2)jb8f?kU3p6@wcoRKe=a;?Q{y5aj`8F3Mao;)V5 z>nx8)ZvN8I_h#erUJy$0LXVtUI(}l>Ob9yA6`OA9@r+6Ay@`hI1Lv*Lq8_F@5@MfA zo|g1xquSerKh?yP_gk!rfjP*@z6XCxs+c{i7u0qz>*U6IAOo%Hxy?D1Z`sgaI<1$s zp!YE8&wN)i5Zh;NDxk&mjBV`Sp#7$>rGu%(sb1tepJ_f5#x^Q5l_;}rn@kf>bucTD zSUVd~aNDP{ojC-g-87+CyH#7xktgpr-3lFI-*GZcWdzEnL)5MPmWlr6^-6!N*ItD~ zKj(!{q+@4nb0f|eeO3f zeF@R~96w+UgKQMjFeC0l#kPM!;I?*QzN~LfXy-vQzNi>1YWr2}5fdO9bl4f8E6#w4 z($hPdNnhLp-RAqZRNIwGH(XNmWLm>{-o?BI!{s3?9gUmlX7=pft^Emd6_8l2D6-{G z-RhT%7;{O(RN}G=apJ89Ui>p^mZRqfNp%byLc{PK(J>VsiiNonRk?r0{1{Q)dw1*N z7S!`!H%|@sL!H6Qth&4I)Rd-byfMd6YPrBJBwfLZz4z=%Z^X#s$uY386D^wkBTk$LmKk~Mf*KgV8Ku2>nHtR1Jii?> zpBjk4ne>P&CzT0Yi4%YB)BqE0=@WCQCLki#Z!S9Jhu!;PN&uswhcq^5(xec4GfO+S z!!l(;r8qc>sa0SZti>Oyaf6LQy;t;PYCqesVHCa7XyxU}ZXFTpn>>cx~7W{w9J zFReN*a_EnX{SB*6R!6Cv1Q$5Nx$1MYxU@0!78iIUA&G2EXZwG#f1fNJ+b3OwLt{qz zDQ4P{rg!bh#E};E{aRw8T-NcEKbDFzbZKk;3cy~+Ps{HIx}2Zf1cELY6^dL@NKDb* zHeo=`mrNK52~9L}LW8Z6%5HDsjG^R++=VIe#f$c~#c^%f>kzAao9mOwP&(`?6K`vk zGx4?_i=7xOTW)`QGK%S0zGKw7o-AU!Y4nB)areKJRBR&9J_ z#%}mEEei^lN7`NfdJz0A%C-aoWNEBIGw5S*I(7%TcWL^;OH0adfw%J-<*;{xRzo8C zlL@ym?Ma@)X9qBcfj5Dt_wqc+VarLj0SjLp#RbHYt6YCZDZU;`cMbzOY|V;H@`x%4>SpU$xr(#9V2tS{__@=ljxVP=J3{&&lze?5!@S+Xs)m;C&}NvDGD+ zaUa=#k4~f#Ts~#NH~g0~48HpyL;(^7w_mFt+|~&v{2o%kS-TzjvFm{X7J&jWJ_M?P zgJ`tWABqnFX2o$4Gkd^fife??YsdrR&FMg?M5p~37QDcJF-QIJw8dLs8M=MmbZVcG z(T9I6G)u_)xts>ML5C&}xB=m^^6Z$+9KX`Bn=WqNIA!j6pu*;i%cl6gUY_>;Kq=0U z6t~ttxJSrs!GzHxBs`f_D$YO*is{oS-de3%4harMmem&0>rn(rsP1V9cH?b!UT=Jf z$2g^4@2^i@QsZd^ca0dj*&YiOH}ONT8hC$l(@k#TuS6sBu1V4~y%_|atc<~}0$J5t zuxj<-M7rmUd6+oSc}kd<{gKuXM%UK}{Y7w$gn4OB(kI}rm8F^DfP|sN4;tqL5q=uK zISJykcBqHa{?`y+`qQ(XPK2o%!MOtaEzO2{H@_Cxu6H{DZPnO&%Mbt{w-&a;*q%Gp@W>zj#X zKLDW2;O^tHxS5Rf3Z5u&2uwA?DhpCVKqGC5sYC#9kb)2xemkowJbevQhWHz>1$RL~ zy`8!zKlq-q2voDQ|6qjm8)6#GdxU^c6yHjXo1XtB3sa&UBLYO`ru(U z9G?%r7}vrnA}vNisdi9>Rq8T*uzV9wG)Ko1k1o^^)SJJVWlnK%5yDkX@XQ(`qA5Xe z*p8!UhA=0?4efYq>&P|z^&&Rk2~q*>JgyT6Yf4%>SLj|=0eV0txG8^ik>yCBPb=ke z;?+%eZdtMMO&7HRizD|){Lv$PldzG}c?|eV#(JigE*SL9JX~esU+cCh*$>{3y(4f~ zZbs66(5l~qmX^KAZCis`EO&AOp-g2VF29W(03TZEGUTC0(+id?->iQ`Zm`5{hbw*HZdit% zk?sl;E|$}|+d=azB`7jZz{NUoTgi75ZsE=Ml)G9!u3`_?y*Uv2k_xCCmf-N3OT5EC zm-!NSiZ@3QhD@8JllXOl6JA)FxcBMQCbqaU%o?>^$Cf{g&hyumPlKr@YT?sx3!g?i zXaFcC*UPA@lzR`wTde9lgf zj-BDPIH{wkcZ@pQv>ybkUv;JEV6#gkn>KygT(bKuPl^t43kP2bW4(Nc$&*q-$TblY z%|$>8T(8dsdYk*a`$JG9FulK=&<;mKJrV?DBG0-}&w+pXs|-I{&pd2ejU?=Nx&?b| z-aML<=`{rAs#ytka!scRWO_*T)2I@F*>d>8Kidkm(9hJO;lsH77vc^Zv2i?MS)2GJ zA2>0rHji6$9}BFK#3`Z(I*sgSR(p}x>t1Gmie4y@?f_+eNVHfoD3#m}{?vR7JFkUyswpR;4nqQqsrsvlzRfIl zkR-$NE1>%z59oEGvA~-dez~^E@yj|aq;e`PB=R=f3oL5r0#6cp4IPtp!O!>-scW1} zrMrKbom6r>@1vu-9-WLgI0d${@Y2Ivv>4kO@XPYv%z>ySf^>BLc*D_1#MpD!uW|d!DA}`634BW~ zmrg`?^4K{m;Vv?}*(fTJK6?fx6Dv`i%_9Gqa|fSLtOe7th%``MQ$MR-Zz=CW9T5OCo3DH;90{ zK^1PU4dgM1vxsYl_O0E>EkGM5hNgLOviI!4bGfeVw7g?qwCoiwcb|;5b^)3~^s+sJ zOia*K)1Hn|f5xgoq~-(r%Dihe{<2RJpYHnGZ7dnw_u!Zpp43RFr!b))n!0fKge+-n zODj~ed-Bu#bxF5yzQGxfec>*R<_YI1&la8GiV%~Qmi1qqLsHFGT^?48Az^iao-Dhh zBN~HF382~Qj|dDWxh~$(S`E^p&;QENPCZrqx^1F$@;g!$DOUxeh8H3MX_M@`+ zaC=S6Mg6g|XMW$hb5ztWj)j#$Tcx~&jZxZ;=1mFeMz6gK1-&jZTo3$aN49fnitNL; z<51AmAKb9x9*^z9JvcPr1onxsT4thG13IFDBXnK%Q+r(oZt%f#zNXD8MH6nXQoYS7 z<(8X}%7Rx&CyEjCz5S%ZG><=6?(|sb0OT6D6thB@VP~-0#u*yPrO3EU_LFN5#DHXj zj<})-Vo}*pNNFpHbwC)u!~Gw4pLIJ$Arg%=v;2=GILQw>@t@M#Si955Mt{??ymDli zz!)stss#mBnV$6XwI1V8UZwHw$e4V7_M;&t_+P=tU5lBH+Zfn^2BvUm!fN9tmR~_@ z!K|?(&4IVu;zZIb)O{OlkE@W;WZ@(wFOoc|w`w~r@K)hqxdnze(gmhLi)=HJ#@JUb z4~mf1&e>-fL*U$*bCg&96g5+={7m@7kR7BwCWnU(*}#b{1Ark$uWa zyvswm`-r&gpV`_~YNm%jv+b&Sb=fZ2a_Hi=Pey++XrNXS9(4{{12#QS(UKKw0Y6)5 zF?-`;oucr7P7gT8{X0*1%=M$f#qLr?Obs=PTZ&bUV7pK{$T?I+|5#2Zjw5`$}fh_la<8x{A%AO3{z4_uhk$Du=)V0Q`+S!z80rr z-=DGFV^nMhnx+mQCC@EbKk0ol)yB07`hydNVs&;&EP>*ZPm`#wg{_uC_Rv$?iHO01 z_-XFyP*j8qCt-NoAQ(=$v_nP8$j|z7B%-W$=zWt9)UP!$RkG;a#WqEVcgh(dl(f5L zgp&ZQ0rsAZ9~FIg3CmvdjBul&tg6tIQ~9HZ%@%M6)M_M;z*k3u{ze? zow!l{b1-_(7+5`gnlbvwNe_2=yx(W|Yc5FWae$vZcU?J_bpolIVvbAC43V|{=de3! zatboz$tH>qdAV~6JX`_sA`djHaV#nph9%SdK-p~;QV_+=p~VJHwR37g!Q`=%DMt6^ zQ~-1FnfO#5nZ}o6qd)-u`+5}pI=%nENy0Y8U7iZW5m!o+gIK{<@-pxOSrCjuoiszt z4jdtYi*E~N1sPN75QX>qSeAO%_eio=wL&Y|>bg~gOJqSB^x{@~XmBQ8(GF?O8|> zjwAbUOSykM$63S~TjabZ>Scf&s-%?;0vNGMxUl}}3)>C-)d~6p$wyFs{9vuBhe72{ zbnMOO3a|0h-}Zf{Vh@uNja_#2!FzVgoG;Y^K7Qj9&PWpJ?XIsTkQh}c+EP!2$J5*| z$m&hK`=F}Dtw!`Hq27Z(f+~g@V*6wIyl0~GPZQO!xbl35;3xveZ$xo>GL~P-0j{l& zqdPZb+(_tJ1-E3vmPIAV!WLZhOOIJJwpMPdpb6TW5=(qdtLufdJf(f`v5c!bi{jRY zp}47*W}BsQK~!}37VFj{A6{kkt~FG^8<~|vv@PB$&GFo|n}*riLTS>V53rzp)Mk%A z$X`?$01(-^i_;ghl2>xOjF*sk09Q9V_m!SuMaj@FL~*v~&<0baGRZ8ULs!R1Me;Ia zCF$T*=0I3=O!9@wRo4*-rKr^c9_@?SiSI^PU7m-=?N;C5-!Cy&>OGuh8b9Galtj%K z!*~r)?0KXSQ3Rof;U5 z#GXBJn&r&3B3(W_e4QCWeu7ZaseS*a2cm(pur_A5ETDt2u&_5eO-6&HHBo_}HzH2k z;-(o&{9DBwwSa)Kax{vaBtWGpDS@Ch9$(}C+xah%E9v{K5)li_|9Ul9SUCURxyeGz z!phoMcl!>Rc5DmsU*9G>4=2z6Dvu@j?XmRj3{RSF&-ijRmxI`H_1Co^mT+BDPD*^+ zjq?N7U;k7)l_lln<=LwOmTh%Zab)^+G;O9_Hj>+F?bE0&v{D`trdN6(?yz8Q8c-IVlqI^RdfD zzI}@0s!?|+7Tih3c*zQ~xE(CX^HAI+dPsPg*cFnKn{|I?Zf{>cc`+!!OAB0T-S#^9 zDU{fKJi#S;6rqm0p8?bsKrp4)O;mPZLVD9N@}#cXM_1)%9_ka~ukwg|>oo z0_8H6&pj~Kg+2BQQcP^^o1*N6J<@e8#33y0!-~D16%N4H>_zK+uP(YToUWUK?`qw6 zR*VhX2)GU=651@9lb!Z$3>!j81zd5qT(8)B{EK65*;;`-G~Ye7eGCY%R{k@=3c~?r zXe~-^G1myDjIrUe#uWcG&G(7^Z`q-+z>oVkIA=yXwciY@RpAyms@%@TZFknmTzye? zCULx8FIj8SupiuRwOL$$BK{;br3e8YS!_15V@`dj*^D#%*Dtjz*fSq|vj@*zUt`2oyp7t9>Jf*yt+7@)(?IiHSnTtF2JI-{U z=OlAE!>V5R$0@U>IO<`#FKChfz3{UhtcQ zcYjA)DX$h5k(qr%9W~;c3U(mpg|IRI#>IykP8ZJml_EN-ZBj(I3o-sJdb!2A-q`YT zscI9nV!GS6DAT~=I1&ELVr5a)T~+{Ql%f%%kMJirqpFd~a~NFtFAFG4P=NY|KPtld z30_A}yIb2jX;}9sJ6@ zWb1*(v|D4)v@oGLgC;ea$v~Ao<}(OoP)2*h+#SQs4^^K7sR~*ytKT~rK?SKANtlH8 z#<-YyjGd%9#-ZcAk%AzBPO@d@sjOj36|D!HdpyVX#WPl|paJFwG@{J?S^HNwQ@RjYK9 zE~we}jW-ep6}m&Gl0og(B~BhkkIPabZlue@KK#JaV?1W{AU?1TRu~qAUeum;v-1kP zUl+6b-&+E6Bp`%3~$+k3@Nd3fU@v&XX@JbazR@HX%A!-k^tFZ zGNxtg$7rU5FqF%Af{spXmti3m^s{gn1r| z_P#;SKL8(B$xcBWKNhbI`D=F;(p^oxElK90F3kReU*-&WF9)GH!}Nl~5t;RkASNum ziP}=>f{5~4dIsf5P7-G)&iUVENbEz+gWO`$)tlNan5s{nwcvz`N$2pe>8_pw=@?oW z8inI?`jqIx8cvA^5FB62en{LwfRzLtV9R6r<^ujOWgB$-=F1$pzg$YhPTzTh%5y^t zYk2R%Aq8l_hxsRn_ z(-akCMl|k)|IB=Zv}4Q5m3UhYYRB*HPN%&Kkbrvkzb*E_6v`Mmc8S!Uf98g8*Sv&@ z;Rx5m3JSIZITKeaTm+;4gwe@QX0LaX)7vWJrO*3^4&VnaM${&K8?{SGj z#tyCMGvPG@u)RXLuvoJ@b`fj`oD(2%m9zTT)_g60GH_OLD*CGv+Dy+)GSVm_VwW}B z_`+n{p-E6}{+O>||1D}({SyOA0VKpm!EQOpDraHq%(^$?!?FD##)Y+oBwO5ikkLvp^A40n>HN$Bxh6L~aqVa{IR^aqx;C20z^<=l%= zrEIH0d-Ls&QSMF(F?(^P%D+oj`iwwDX-*||zYnI$BDdY5cJrGEcrBv4*()z$XLGiH zj^GV;9NL)w#d^G8kd&37MxbIIE;Uctyv;tZ$U2ortg3Xsy@;f}qoc-%e0w>)PDaAN zOiBhdK?PrLp>IRSH&?_iLqAbp@A-IX(Gm^rJ8 zT)&>j!`_n?Z_OZX&Mdwwc{xl+^kJqJZvT}tD4pYvLiI-4GDZ-6BrdcWipJ5r+2t|8 zVUvs74OLqYGm)O#Heb`gPsaGTPs;nMt+^uZWTVRJ)gCpnBE~p!P7mlt)wcA@pNLa2 z`3j^X&j_e-F-%qFc0vXka&>rF*OB56;h=xo6r|i{A@+|Rihk!muW80@raTdN37CLi zuw#|h;C8j2BLtK`#EBj~VxACEhAo8nf1Y6o}%Ee{hz-nlsE`PVaD zn-7w+Py^_n&h_0ZElXHiaZjjjBm1^QXmQqIE>s#+G@>SMY$gWdR3yM_+53rTj7hgW z;KLZp9W|pcT`rceZ^9as@C2V1+0wk@6RUU#c*c%Kq87iGxC(SHP9GmDsXsK7 z4yq|23_hZ?L3UkKHVoz17}EKeQqE;G3p67(>o~Wo!K7>~r(DUV^J4+n$^ocQdYNklbAJo| zMAk62rAu=_2S|vE<>C*UkkrTG9xQg~n5w&MsmV1-OMH~p$T5OpF6TYEX3@D1nsR;g zRlDK%QOY)3FUolRF5%@s?AkwK@j_V735|yO0-2ax#h~*v(qZZ}xliMFu47z*{LLNB zBfoxEdk^d^(&ru=*%Z~nzt<->hO(!Q`r4&|H$qw0X~ciG2t?556qH*(o#E~y4Sv0^ z)b>5HibLx+jT?;}y$wu2sCGJ3l1~7HP|dQH@D+dtR0ir@k?#fUTPT0sV8K+joBPZo zy<^B>+ZA_ezQ>rJtefICEUJA^=YFdDP1|HbCk99a?P7(ez~fKM>AbER>QHOqWI0bg zbd-?$HdV)JjJ)iDal#A|dJJk)n@tc%9!{xPhvap6-zkgJ6Y$Wn~aOp)r=A7>`h zP_eCu>0v7rzmo2z1=C9Sk}Smj&XEkyfGY@DtDd$oiKw%Qs;hjs)D0y=^_3#H_q(Mb z$_1Do#l5SiGn|nemyO{mho+^8bgS+8+g#1)Kn^s*Ix;J7U^>i<+g#Rm+m3#9bNZm* z#CzEyDV~P-aU6Q=+ z`@=4yBsUJMb&wXsg;Gq4Q_(4`P`o^Tt^&&)!_(49rp+6t8pczHC z-m|nxO*u=tiq<-OrNq8zKo0ycMq`nqR4*tveDG-Tyiym?Wzj|I=2>BmOgTDq}34rdHin*0-SA9gngZmo(?-gB&|Q=zt9i?##^wPJvB8D>Z!(! zni93!tn6q}@MwZVd8x3w+y?Xrxn)07t9}y>1#`r$uXNox(Hkk0(|CCp$~8OB%}u?& zX%*0i{qnapBF<#uyQ-2O- zOu?`?%4^cWcd#(RZGD`>y0Vg)9(2R(&$Ft3O|>N+AE0n^G3Ae;>IQ&*x)i~CMpjaH zKXzXVKZRMH-a@CQX8MGcS?*qUIo={TCB>7?fcMg_DKi-L<2XmjI4G~u6EWa4`QqWJ6u?$?AFXx_-r{2S~LYV$IY_48z!YSB)6Aj)Gvju-%?5@jHu+$hbaL!KtttjhsnKb$> z&#~QGR+}Aav#n7ZdWy*MWaE28IT|gp7ouVvb$Df}5a?@BqX8taQZ#Q%PgPeeaBpj3 z4rVB#|1t8dZ|a9Xq_CJi1fO=Z%|N7gjJTPw&g!>$yg7`f3E_`MI)GFKagHww&V9-n z4moJ35l(RdzuUS(QM^Kcz8$B@>ftV{;-X5+h+0RCVyObFzJSWMdxh2tpbsei<#N6J z1`P^>>EqImi3#lUklmvhh{3NM;E7V`q_09WV?I*g@k?(#-JC;Y(huYgYxmTPGyW{@ z822{_$2BW{$zJYtdc(dM1S;D%3*+3{g5H$=y(E)Ljb(gVEB|T{y>DqLrm8lW`a8& zS))3K4!*|HInUgPqfzhP?Y=29y zQ=CirV&>%U(GFfJv&vR@Hu&_r(8=B9t<`Bt&3@#Uh4vCX@>2!kAFUWB=)j>&HqjW*?1CAC;)CQ&i|d$ zb?fuRG4MG2O9=2bh14#;fw1#3?{Vx+^-aS=Svowej|F`J`?QgTQjwLFi)`17jHQYx zJL1ZIe#JYVPx8GLA78HwnXTn_sc~Q3AD?+2>q3vf7vk6F&0}5f&gY}&#qL0AkvwDf zhffa=7H5$?u;dtU$B6gwcy`t+n9RB>)1IIF^af0S&RzgjAH64c+g|R;&%s^^i@1<|629$Ir~tw>hXa7B7Ezm zA_#o*hreMv2VNy{20NW!im)CKM~IAyd(;^aB;SFO-~PcotLyIJ4x+Xe+>oCQrZ#%P9kuKuYz!Q{7>FtsFSUY`H5>$OVJd1y= zTX3+l-^&-=1%sdQrLVOb1T4zUv74*@nA>085nDgd!&Qznv!h6uBJHmd<*ZHY<&dZj zKXB&U*MI3~Ha-Z^LcBLIca2)UJfFhRAtVFZdAwT*qsZC)M+wTr{N#C7RAtZe($j6f zmN$QS+s%Vow{Y19HRMVt1j5btR<)%+l_HUQ-`4cR+l@nl^IGXmJ(*LB?T=`~CP(}* zgEpkJ`{ki0 z`%s%bg03|CPhc91a@-Yn=Mup3mLhc|bF2J%pPTUey95$n_;5J+A^t+!KZ>eJ@OW@^f8bv5UJyZ4)B{2*6vqe)&CK zMBs^o*(T^XsU|hl7Y_3S34$J`_@6|q#F#KH_?us7LdfrYs{S57{_W)zNfT>j8Rb#6 z;zZxz-=iDhBgYb&>g?%c6DoiE(K>1uJ6jS#u7tN)(n~r?u(^saItPZG@!e=5-s0H4{h^6-p9l^Bac4|T z2!O4EN8uF^h}#IDr%NZhDx}bjrd^Y`pH8hHWh4r0r@25Qf(0S}@`C z^ca0r(5ir-Rd2y|6tjPXE}H1C@#Xoo8y%u?v|l{S@y1$)D3Im+L8Ha@mP~HDL7$UX z7dBy3jG;JEL*oVIA;a|d6p2~-K-i)UREne6Tu>nZl`@oU_%Pl+Ty_QYgil9<$y3}O zdxgdi;h=nY<3+e1|XwT~PzBNnwukwreMJoax**%>{;Nm=wwiN95S zoRe4V0}TJ9NuKPFXKMFSq!eAqrW%ctW-Qd}`D~6BIK~zIH0B?vmPNBaXztp@Y5jvL zP;IgqY^Y_j5ui>ySadFMHZ5^M)gO2%$`^(AFfMc7ntH4>w!;IgKL;(Z@^&NDQ$PIr zsl8rW(O;g~x8xOhs3J$#yVKVlCj#U`4_kGrI=j`XMuq3*U0Or}SQ1c=Ky(Q9ePelJsT3W|IE4SNCgl~uW4Od)>P zXg=p_XeeaIZwq;|OKTYH1-&+PWVFm<(jgroBNWGJ^LYjVJe4c#Sn$b5^l~lJ|3*DV zO!oJj>@8Yv;z^=TmK&1wq!jD(N=G`fOJrb&5hZ|XJPo~Wtg#l;d{CFezxF-5l_93GXlQvCccV@=Y&chTg9UeYFe4hI_1pb7LK)5zufRnfH-0 zxe>tVL(r;sC^#31jyX5$7?*}{QLwB(G^WTgG2TuOqcuIV*hZkzmF%pJf*X%CY%>B* z3PZr5#;`MDkDIn8Q=}ufhti?8%)MWkk~CY%z)+q=BJ`z+`&gQ4K7j7b#JiE^ur^9N z(1!hHiL+BuC$eG(+tOfe?`I0Tm+9RxOf#UZg=@MP+9Lie-|-j~A6!V1!LgW9@sCH^ zhUCx^s-KbWpBteeZ&`rre+_Aq+ZHf3@trE6t~*K5?3a(}Pv(A^fenO}f0biwaFmmw zM0fR#&#Jlxfe0c5SKqX-D+ME!u{>>TO*Vjslc6*tDlF3^6mBYbtG(=Nx4rCcPjrBb zfQ1+l@3x-!(y!@iOht>Wx7-f9Khw{fZk)e@E&Wa`he035m$cTz*yxP66GAuK z(bnB^&^e_kkA^Aw=2q8d$eMqO(Gr3zm=z@vfsQ;pgx{P z4v-jDFq=wp@}g+w3T5%^q(haFFLV@$S5_RVLa9Cw6ObQHo0zw2{OeY(rRdLZK79{M zA?|u8+Q)7N)0j|5O#_jT7BRo+;y)q^B~9UKIW!T?exc5w_8*D}S8f62Xmc`THGcNm z3$#|NqNX8~s<{f8@X7w@VJ=ag)z?i^R=MN(O{Y)z z(X_{ov3XARS4tVj>n6Aw=_Ui$6=}8vF9*%*kIQl1@cy>~_tpSJfo@wPfLfK-zM;Vg?1T!GfvUoj|-!7Q{PTF2(b`?vij zd9)xoWntRR2pgb{ol>N;%fH5q8pQh91H&*gX~dAsBjQ^RF}+jW1T(j6G0@KoC`@5SzT&N6M{%bee7 z=2uzXpk4T^2esO1WqNIyI!Lci5}B?{ivt7Km05AP*iJR!+}^kVwU2O%H*ZYYsD1!< z^NCoh7qqTFt1flj`O_I2ushBud6VQOzQ1w;mU(k<%YwFm2T}JPg0@zTa$LA11M()a zz3Kvs~th^xNSBUulMJ`kzsn^yz|OG+2Bz*Hd?rI>ap+#YYhK9-~}^ zm(YsxpK#N;hzwbEb6u(d8vmT{9shDI zg2Ge&z^qsWXaUqw)@=Nv6?%`U{m23MrQDFe{Vg@OdEYR?+TiB-`U!TtJom7>9Lt3H zD=`1HlyB?RKoA65e<7I&HZXJD@3r8_(I3EFJjNgn*y~#DIfR;%bG4N$Sqw0`NSC4g zDue`bnI%kgM|MC#_Hky+f5#(7Dt@c(7`1}4#jI{dqhJxPB)Jz7{>W%OS_ zzT+HQx9N)%3Rfko9-S&=Y5)DRqH9JqEQv+W>DiTIq5J_L-~PcXr=LwiTxK5- zgXrEPc+$?k*6QWvuO%7mX?0OAhsCZB_s$EI{!r_G4BtJByzEds7l##y31&0I>^5%Q zL^B+Xd@xb8$k63^-rX*dqW3V(zgDfuTFDpg{JlQg_+rQN!AsMqY@56QuPKL_C#kRe zViw_BO?SVd@;oP|$#`^w^*qyM_|+q@^a1f_a3#_S65h~&U)$xo;@FSlyYOTg(a7*F zQn*Hm4Iz=b+wI_9=AC+1?jLI08OT!1wlzMJx7$ki&N0kSg)s#`w_R@gvteS7Qfq@*}KGR4r8i3k!<+ z)cN~isDlV4d69L$u$WN7R&a(xy>*!EOEvICS+qg@QHP3k6Qo*SJ5lZ?3BJ;CuE`ARJe~K`t^}+`*f5fnVny4ET zU@Lp-umm=Xn^v~AE7qHUwVtP{>(t+=*_MZ>JG0@|>lSp7{Hgd3!SO&qW+NHiQ%s|i zqwG2bIvHHnsF>DM(D&sPbX%z~-geQ5#Tt`1M~sOq;=;UN+l|4vL%IQmpe>~u+vk=# zrf$l+kU=$f&1Xe{Cg%;*O$UDrE(xKX(qCY4468G+l;5)MH+VQvapTFU1J{}+Cs1-F2G&@ELmZF~ncwG*(VAtEIU#lvK z%oz%VfidEceTxB3XYE+Xvg((3^g?+-L4O^Hu{zn{^2II12RJ`OsDak@sD_Yz=N%dm z5`9I1ij8I~WL+iyrU4H(Pm@P(B8%Y9b(j#Gz81X`8~S%Gk>BT#WteigymZ4hYJa!iySQA%Sqb-(TVfSp<0x|#+jRr zD;vy7C27JjBbKzVL~oZ`o8eB1JrP+!r*lZ69XkA{Q8W3EQN!R{ADb^MT7B$D#jvXM zN$haH+DjcvRIwt?u(FBCxb*G^agC4SQWeW~E#W~qBRl7`TB9yl6F0n`KdMgr5@{%n zns;>pizqYDhu!tvMOU`gbHC+^1^^8$A-N2sR688i^)8BQY`Z0!IM$?Q-#PVMRk4o7 zkOIuKada)l_z&EIy8r~HN8v}{5gff8EB5Jy4_t2I679`;uAHgNM^+lY2?kGR|_b` zCD~MdE6<_+Y~V5)CLcbV#~7*qw*LwYPHm}MPP7C~$y+qHAtI)Z8O^rdEx+?22^N87 zMKaLaYx4`g^NR0o^wZEC+&Q4<4L8g5q>hYi_C_BuFfgIWDRE=Kc^j2&5(GEFA##KP z9iymVD>PaZ$AUgDDE9R=%T$HEZE7E9L&^bLiK~b7t zrNxbTLw9$wjj`D!^c?GyKt|FqmvD3$)Q1wt{yCjn3&id98eI3D- z@8R;{U3q2sFnGqVp%U{nCf!D8iL$q$%Ce%AsK--Qb(r8iL9nz-tjHz*{o zzLgBi0#|g1@bQaucaJf|IhKX%(us08#b26F5F+}66SLh5reh7r$KpCY^SGc4aCC57 zjSNOThO1n<+NKbn3sYcdZk>X^&$q_YAQ|aq4U-I?Oagwe(ltX?Q^Py_MP>umX4h!u z^SV6fl?>v7NZ4QNsZ6LzazDjA(}&-Y%0&*Cw>Y(QF>dc?a2D-%3V*VEfonP}|FtX5 zbs_;UaIVlKC14K8E5L~-m;S1&S(h~5ZqDD*wN^uLgrYO1XXGSCr<+eCv4#g3E&7F|`Gx7ZE-M@6V|gyq!Tfmem)&wiS76(XStKKAYUC1lS8@?JlP0N~ z6eO`(ye0?C4D7#Sd;XbOijMX=fD7HXC{h>d6*a|L5rtKSjMZPlw0J2j#@`Mu3CMB&9w$B6u5xnfB67aw(Q;f@x4P6= znP;kA3)#u2pO3HJS>OYZx{}bwL|GIWIYK%~zsQeEk3dW$d@*M@c86cF#IdF;N|KSM z7jg}$oP!-v+_hkld1FGvfd1WyC>ShE0V4DQqF4 z&!8_#AT|R5-)O^nRmxbRc65x=Uab^7RFQI)p6(z`4j(8 zU8uO>efuwvjM6<&%;BL2*^_mW}EMY+q`HsR~bqH|D^ z{jgY|bZhHru$cyrq*XUP#E%xsEzwl=lt&q|n zGEkr#tZ5>spcDWL3)lb3YBd6rvE=PPpFX1aF9}&G?^6TC2rbb!Db)Vz6wRxxp zufGgAMM-H?;>N~seU*-BL&c=ghq(?Xdl^rEIeb;f&ZXrqBtCxW2Yi^?zL~zg(7nGq zzg!We?FMLG?x&&u!*1RFac{3|J64Bqbq1mvrK=|6j=r{6)XUsCJoIxm16D3Zw+2`2 zJ~}G%o~l@Uu8OZTFIGOd;I@~x9f6L~$2U#uUv(c(o$|V!k)EBNo))$M`tgdR@PsDI z?xVP)5Q%0F3~lge{;}E)Q76}WJ@(2qtN$QcgV69;3?qo^NHxo_hk}k0Kod} zH1=BWlhD70?`5j`HLi!*Y*Xavwi;3{)lF-khJ5S%{`e*|bqIWVzid9{aie-h%HHmP zGbtWaR_mX)D8+@N8g0Ja3h*VrsZ%t5l;YC^Lrb3fuSx*O-#KOiiI-;hf{(EcgfGz1J=C{3uod47wY_mrY-rR~v9TdR(}AX$K~vu=pViApixzSyLN! z*JfaHLn!k%EJG(}RZ#kiw@tynKh^Cl-Y?JuPv|UBqvGhOL_XFc|E4DUX8D9Mx0<{8 zB#qGuK#mRYtm(tJp?lG01XmXeV3%==M+h9`%o{SLH^;(z_Ky+m!+=g*m($xEW0B4_gnoC}JEm z0E4S7>#Y9??el~0;I74#xboMvxhkH-Ia^3B>ne~ZCP)!h2s@w8~Sj_Zs zgF$qgZjLUM5PagwrQHmqI#ctedZ$tm)RHI zjESmY*JBI8O#w9<=MJ`Pi&F)xbKv#VSklr|nE3OPvNbmu<RxGpq(l__Z+J%erl&#wM*wzWJJBrmYWo%XIZJl9Q zWf5Is6A5OoySo-5aG*=-52>UYGL|Av=W#hY4C+N-XwTl!Q2-*dmVr+9M?=l<+!~u5 z!n4&n@f;$3ZVsVt+m>EAc1Y5Vk6|J!*`>#$R`L^AKsmoPH&W!q>#(yi2)Rx^ieb|d zP|A5wmqjYJKS+jgNtDxee=f?~1syk0VnjJJmrvu|PSL_<0g%x$VK#o&Vb~lwB9i zLVF*K75AF!IiP^2mPBQ@K|l*Xs@EYLrNVR*S~Yc_D2i>B?I)`nIrS`O>aXmM`Av83 ze8NHFGIkzD6e#)oCr{C2S2L&P1j#&`bD{inNm=;Ye6g|^Rm{G;ZDz{w^)ywRi3Bj# z2inQ6|zo%T&IF zOL0(sP*>rHU8K5uVLwr>29CM_at7~T-peRVxZ2Ro`0GRbqhDkg)$BbiVZ7mp;Vb{N zd<_OYUx;&!*Eb_s0~oZlaZ4qYCaSPTRQ7=K0BX8!8}pK@V!NQ_%0h$I)xn$31I&DH zl!`5SC?MJ+Sk!^GQn&Gle&)w_v4T!wStHdP(priw-jzT%^=>WMUE&we@al9NHIFw0 zoSczdZ$bH?OfZ8hdKNAZAotorIrk2!Vj3Hxp z>N*(`-F5e?pFs-0#kaxR*b`=1rsiI8$yBJUYk-2guJQ|{CDR04kvKC2nmGXsEXv}K zLh_npYQCbzktc%aK>I-q>DL34DO%_b8#1hEe41RjGIF@MmMVd@l3=p8S> zf1e8WB>q&_Cl>R7@F$aMmq^tlPB$eK(psd6Xk+p`=%PHFA;Na8k(GuRj%ln82~BNC z!vrpo6N-E_5L*~U_ED0B{TP`Gp2bp{H-6gbPzvN@Ky)`*v2vm*kTx~vb3<5R?o}Fs z@!b`Cq3%oZ$*eYwP&RpTj5G9Whm2`-?zdTVTBe=&YS}-XU-?XXl({I00{y+4Hg00} z=Bqw29i3W*z=)`vaNIW28%@@5*|9vDFpv%jD+xRJaat{?=HAl19qaup2Iss2I!WCt zz4}g&b9#;9#*6KSA0DKTC%t*IoNj}w`6uzd1fD%g!I3p!N*|Ci7)*!%F84o!aex zH&p&jlvezbWxAC(uw~=|mYN-<131gk9aDm4$Y1Z)th}jMNv$5GgO4jj$)fVV_2-;v zuQ2u#lL#9tH-H;87FxG|^otQ5*ts1`eAnjao63J=3KbC;im7XeXAqcsG59FdEt>mF zsP1A44e||X-)WiD+mj51U5l$lf&kL8O?i6{HkCv`Kx?QqPAOf2Q2^T$PoDa#!5pLGOj z=W|)~&PD}lfY@C)tV!Qh*Jxf3#K>%7K5-dn4H(?|mNo)&IKzblyS45pT4!KigCZ{j z|2?_}`!sme3Pla`hB6>I3;-eH(_6rDf*Z_c2fL}Ln~`D!g=Z>4cM1PZHs;Q8`Fkb9Da72;o>uj*Yw+Z@n_%3VLz zrrJX~y7#FaEqmxG{Iq?jdHG1y`7O9m+cF6VOJJ!VsN{VEeHW1HIsma!U2)}psu$bX zEzC}_JNlTc95N%+tKP_I{&XS%zf>3qW|nUoGe%}^FqYL-1>m#!2VPPj_ssl+qP}nU(R=L-8#Q^ zt^Ipft+}5$=NOz)Zvq&M)yL6x=0}Iql>QFENdn3tt!4T7TWCkYiD50Xy#knyfLARpiBp{lfIc7>;knK2fy1bcn&%^(z8;6Pho@gD1U6JxD$Ej1K2Yj98E$eKW zrd#o@WLbMhOSnscA6aUL`}s*)Mxk%1kPeUG{XVMr!B-n=05aMI7TYl@{>w$@^8tjF zbARSS?uN7jcArbgQ(KKrM^=<@#~N#GYsanWI}`4v$rjL>TsB|S9HyA_k|BUpGN`Vl zCh@ubRKr;jR+l)@on{KHAP>Edqk1*dA}!8Q^a0>6Q0Kx zz2%?)fW>s2V%|WX21NjC#xtCbV*A*)hY92~x7TremH`^}>Tg_Lnvf0!`^ujgoJOJ) zBe4-mr!W<$Hkd2!Unn7KPPGu>=;l5e_;)_IBy=~D-Ns^WjICvy;YJ};!j4XvEeCP< z7PcMsLTnn|V-u03ptyh8Pg;f<`r4I0^~fI%e)iKCn+;Y&&G6M9&SjK z<}&EtUi}$b1*u19b4|5E4HFshA(pQS31pJYGp!oTw}!yK`WqJb$HG`htM*Im_pj3D z&*7xp+u}qMUHtd9h~+>B1&!A=(MdFX3PO5u3l>|SArQ_rJTjX3`CMjq2g>A>UJfma z0lOAt`B5yqgU*Q3qDbmgPGsbdeeg${AKBQ#diX?N_Dt4asQo5mX8VqrXXVwi_0Oy) z{&hmpBa%U6d$6gH)kgZZ0|Z&lNVhMu-+!Ba?m%z0@|ILJ*C0 zOh$*ZmWbI}p?SAtEM+#BWngSw$;Aujl^A`lPyeDpyMy2WL;i+FnJ^Ob=qC;>kod6a zTZd#~EiLULqMv!L>MmtxG}j3qAY?3u3jD1@YGzngK}rxXGv@fkBKbWUGbo@+fYOj( zRxgUZ8wtm<*8NrjZ3n<;n?d9K80!%jZ;r*%Zd|)1MZ_kkkx_zD`}qE^Lu69T*hnW` zbfW1iXmm%R{2+@L(b`>vR}nN^*~E=mv~G}j3ZQKfafqWK5i&8_gthKjd0O5SaUQk-F7BfMj};8TN9;DmX-geT+x`U<-6ZHXM8R1B);q8qeXkfX7e?u_xSY{x2RPx1rB9+{rV?4C)y zf`}cmHudK!!@Mp-PSjl}5<+)SBY9(G z&_%*V&vsH9YLd^BWFa5}X7!dW_z{p5=ljJmA_WUxH_sBMXGelnwS{@j48~~JX)0l|4R+;rc*#jeC``Cnn!;U`kq$wN1UQ*v2A-X zz_K56Gth1pmJ`)YT(L0KjYc0SX)R8=H;BqE9G_DuwnrW*z~x?D)^;k4;x!mvD8LyE z663g>(SqfFut}(1IY}T$*W@~_78fLEf6aoOAJZD!~B#_-!Vilmn2|) zV}hMB9kA}$o;*;SCxOc>(QMaNA|@r$x?o54gYRm~LqU$;p9xeHjS0tMhzcHq`TRB> z8I40NxD&qtkwt_sy(Q>MIG~*FbxF)wWMU*MBAF_Koe_PuPiBrUR8?H~7#IyM|2{dw zNQJ_A5U%Y%3Be^{c%5wq1J#rvp{Ivn`!Rs|R7QdCc(z&p+3gJZkMk0w&PFyZJzzoi z(=zL{)&{fj^Sv}%d@IVqK9f3@5N=&i}A*4M3Ecx45$J}wauBDG**$3n_X%ST) zIpou|DE-3ybGR#I5b=WMGz99t<7)~J~6MfwnDWNzs{E(^tALf|OCdwS3+6HUSkE(Yig zlW~Rt@>P3n%vG**y}|H{B_EjlP%+r#6iG3c7>)2Snd+t{aFXcInT&F8RNHm9C8KW! zwp-k`LWlhuF64K5+XM6>#WIPq!M3)?=?*5^J7}=6e7Xvrkj49Zz&TVurn>3h6EviS z@ALs|&T_S5>h4Q_($W+2BSU%^q$Qw8*~EkZXuNo3y~cCgbz0LFYj1&frYGZQ3OKUL zNT3VF$V+Wn*Iby!MoFB)CY5+a!|P-V(o;`vIcN>8ZJTej?3-^xlYyfWW@D48)L1;{79DfG#LOrk?Fd&bbXS)=VhzFGP-6HG3p~k3!Yga9j2-bWE-_XB zpsQ>UWdpmB0=Jl~{mLd9)BNv#MSR*8w?fL<6Ef5=4ZU)o@J3a!1ghrdkvr90>A>!g z#}A!HqxZRozot%ix`ztDWF)H6KJe8v?$a+Yrjte# zKrK!rY=0R4`R##t<4oTi$&jY1p{$!R?bPr*Eq4v;UZW5>G;E31GzTh-e1FS4n4X=W zPMT(W;-EMDFs#c~V!qb_AN<%)%AWs88i84x736`3uzsGHmcTQ>z--N@R=}k&AZ)Cu zSf?PY%_DBWod01Y>fYV zVxs-eiTx+5Bx&x509O75!p`xZ1po$S=KoGAi*!a~Xt-@R->J_aZ2uhri!b!muKT&c zb!6{~Y>kcSvSNRIM++fK#A6fH>vo4mjzz_lhUatOQt^LX3js>^0iQ^dVhgV+;{XD^ zZ;qVL&zEPto9k!}hlSlT~gc|L^?& zu%6S0)3BM#hfHpFlv>e`AYf%b`u$^@|Lc99|NHO1o9o&3_1mqLC9xN8rPa(>t%yIT zbMt&5dR&`PbF=ulf*q~6$&{pDcguj5*zcF);q933LH7@_wnIc~SQCy8&j@y#%1MrV z_lHLXfT;aLUetu|kQdg$F}>O4tpowWPdx`C+aAX}xSxe$yR0ODad6Vig;9cvzm?_6(2f&F^ah7nub{l(Q6{J`ejY zg(}(?BUT%YNyP>}nHk^L52}UIAbOi5J5NkSfET}vJV6HIYdusniEf8hu)YoWb}i-U zrX`-gDXqf&!!K@Rzrr`&X&D?N;{5X<{uqSTryx%)-Fp?jv2Mw-xnd~m9f4saysVZw zvE7D=SWkQtMNzWf8N=s_XTLL_j2#TmNWf0=(^t{J`^m7+)^$s|{KIRqE%D5(v{s*6 z0qH_g{cd$`#nox!S@9j%SfeP^*at|S<*&s(B`zW$Nwf|5R~@5mEI6Y-sH^0;eMEe= ziVp=(Pp4UYLFk}i7)(&FcL86Xe}5gVC)e0@t8KTx8l!e2ZLC=(!bD?7bKkCKU7O$OAjd9 zCl8FL1MKNXFslOz<4+f{(vV6q;J4I^j$hrci`+dHR8QiRRc&Iz(yS-Gqg z%tg~SR)hY+3%)B2W*HETKaEwybBQ3E8LnR}LV9RscZD@^NxlzGT0RYlGhxir$(?4% zR~D$GT{S9i504#Qgf0#0;umrmfM(wadHi@aqY5Qd9Um<4faGv~>gD zDwn<(C`DrQh}VbO>+{dwyO%(AIRl$1B}~T#dlvCun%vq#-!9O)CDn=oK#IVj?cwo{ z?t*oqP9ws^+yS7UQ(7oygTl5(*P&qjD@#LWJ)ufj>CJ!}{{AveP>cHIR@-(iJ$^6B z`a@G2-tdx6cyfO1tjfEO}D*33i?yTq+QOj=Z!hv{8YXd6p}1Z0yzOvQEq%}gz{O=?i&ehO*IjUup6ed=gUA1Lb$1BodjDrnv35SH0e^@R;T*Dc%bITjV4_^)U4+D=6{D5b7mNIvlcs12?!TpI^h`=PN;z% zQ!1A%vffE8^Ujp#0f&0&Rqo^((ZcwRBity7D~(Tlbt%kdnNMl}1wv5#*fbL~uHsv9 zubs4c8k3GcQps|%zE)>t81{&kdGaTJ;w_R;A6srE@s&S>KR3MQmlSy(6RTJCg6Ca^ zOpv5Es`#c~W?kpAru=LR5@f_IIbOtum;?hTc(GPHa5E6+0L+9oik9pQm*hrx`9X#% zGG009;}t; z`JPMut&ps`8#)Od>U!}&FcY`KZ0b~1{Y7>|d2E0=r(ykf0qd=67Fv0^5+`_%G`(0y zteEfVQRrAcp-&S+5!ws(dt`t1spbe{ZY`eVt%~T&UmYZSC8ix9}9`KW7&K5OUfU3$Z6lSt*ZV~mXhHkJc z&B^beF)!c5F^4BGEkVroW>ft`Vm^q{(})_{Ty?M@OZBK?r8Ts2P-ctLtAytuRh?hP zfPa=Q=!I{1iAgZp(|Ngczxn5K=9yPsmZ%?(?;XE)x-dLTu2zEmNi`+0|Ciu)KHXG4 z380Fn8oTte6`}jWMd8bZ8B)H^u#8p#mA0T00@QNIrex9!2`!btnmpX%qPWLn!nl2G z{+Ne%Zf3WXa)Y|Z9SZkwGE#>f4Z@Ch$&*~Ayoo50D?ta@T!H^E98WiB+D-VRL! zwO8EBf-z9_5+(+L1tTZRmNLzI2Y0l+{ii2{*+%tCHfz*h4i!#B-|p*S)Ju9d8<5>r z2lMb`N#pi-8jvaX@?@aW=BuRRuMAbF2L*+#tkBgBcFMM9DIkQ>k5Vk+H{0lTkjr$f7RCm}WTN>qC$S#O`RI)zT9k10k)s z;Y$kZ{l@dt1S*LWI3;9f8-RV2o5^Fh&9Y~No6p-}qcg;DnGf?+OZOEg`$nUMWoLoI z>HJCuQ+s}H*BhE$;JfxFx>aJyRTA;O{GU$^EBJ01!JlGYI~=bjG4VA70PV zvQtL`PxOSw##o#iFgxul<>?B+&v>|Qp`CPpjhDI{WW`d!z{hzYKVaArN!te=IE)?X zV9CSz50hMki@}AQ57Db7$gW@+@)9s~pn@W6Tec@ca-_53U^_(iIn1Hih8cC;FQC>Q zxA#7jXshcFi6A5NC-AB@AY92mQr^^JGIH$uS4MTXp?+}wMcm*U{zv+UJxas99Eq7= zQjEucV)5r02Mp>wumO?BDOarmI6tMM^3E8$3)p7nqIo5s*@QED{Opi!o1 zEtG5=M@*w)O3``ap+_awx#d$RDqa6|9kUy<>-20bq1s*V5DRpt7NDMHDYAth-sroeXgVd`H~gTIo~SpX==qiLf;)>l#wQqcgM zPEl#ajlZwvmt)RWL9dqbg>?|M#^T9cGE8=%uKud(2+b5+TTWM!D42y7Y)CdF(r^X{ zv>?*jUHbUbq;#X6O|^KH%g37ybTxj%x+7X|OFFP&)qRUOjA`=YZZzn*%}Y8GEMp3dgnp`y z`cWQXn%zPiK{a>@FF#w)st{w9YV1zD%1*-J`d33%u zdThFn6CNyY?myS0kPVl&7&*aupOwgH-Gl%)OyZKdxph=IP*Tgs!ufly;B9$U%Dlb> ziDDXE`2F0Or~ z$!itk-RF>p`{VF+`4Fd?QcHWe4)iw2MMe2( zy7`_M%C=lH=M3|0PNE=G2ONEK0b)O{6ToL1lT@C~S!bvg?TctYJx+?DU8oFn)fM;! z-gA3%{YJ0Sw%ksjs?^IJk6nyKpH{#3)VCdZS~PKfH196Du(MlE4zoaBc}UyBvFk$( zD_owxC_6A}I=1!o=I%W5lSeK^vh#yzjL-VeFCMWKB({C3`_@(r6Q-5)!n3c=A4gWy z_!{{qmcarc1B3$T_&`I@8#NuIyb3DK=wpTCj zUKqy0%V9EdM@*E+Da3kV`Q%Pyo9}*8^zGja+FJ)bL;m@|B01N$cpzvLJTzetdsy<4 zhe02Fv*@3^#2ZwW;QoxZ9s@xTEPz0G4IUQD2Gh(;_1WH7-kCshNNBpVoKv{YKUFb) zhYRFmy#vvM>TWmz0IL2e9152#KE7Z>R@xjdIBGv#&f*N6Tsk3yT=Yo};+uurI`DQO z8ggS+uL3`7Z)Gx>;PtPDN>er8OZ|ZqqF|Dhc+vp0fS(&y?X-t@4+v+k9q>t>{SU(+ zbgj<%E16oY{)n<`v8_3=*S6Y382was6_$)qo)i#@m8}rd+%)$zydc2rK{}z&Rq*dY zpZy*dE>|1+88j$bBHm~P*&k*OxiId9QJ}>~?(p6|5?1Bau&uqMq?S1XY!Oo014^Q2 z1Ga`%2k+E3Wj+XU@1c4-5{xQ1Fql8)u#K2394pir%MKct|XWB0{ozP=X$B)1suex_6y<} zNap$Ar6TkEZ)#xswiYxbSD7vz9Ba2oajKp0KWc>u=IeCJ?M(9`WcHz(Nauw!U(AXv zsNT|ffyljQTUCwM1o1BN+|^q}nlp_ZbRbLsFa5Xws7dDL8Cg+u0!5(T`ppRDkpb_@ zA%U(RyUueJ5Qm8%Hvj_ZORK)P=^~_C6`b*VQ%4`8VwHtqcnpE*=SSFo1Lhw zA#B^)QO`5T6s*#}nYvvsbQc-!>I!6a9z<1e-S!uI1oWahMEzGKO`3l2+1WzRi(xoJ z0qy`bS`~ZXbqrBHKFR@BATVl=D|gUSBYXcLzUs?zCHwp#K0x{0zkaDwFkN`K0rqbW z57RtZ+k~5%GBI-4`vx`mHyN38M8!i2r2*PpsT`C0yVjLF@*hXBQn(U~W8;22ODZQ9 zR>q`HO1_QLCat4^g~5A*BTug{(6obt5ArRfD+*ul^j^URVoeZ>7D~sEfJ%a5S7XlI z`@Si8Vq&uSZva%&>A=Axvfx}^tkiQU98Np%mNdJaAVghe$J8+dRg0?;KZ)dpm#c-~5RJFxb^CW|NM^p%>|SQ&*0*k3JyJ z6D0n$v01mhb+8P;!P*cJa%q!cL1!w0*Dy*YlP7p=N#h$I@9CH+3&#Id6EMA!wXF?mtRW(A+D{od`haN!{hq4lL z>YK=TIT$xUyaz=2ES_l}hE_@b=-uxRt9CEKQ7BiiOmmy6YB|$0R*x6e{LXlavRZ?a zAI{^MBA{B2(Y!>eG`-(ps^}>YVxFmX@L9yR0S6fqO#8!2UIl+Xm`-W$@a{<}Z$fc| zMRpkBd6c(Wi3-EF07{`;iQ)u0mFww#R^gP^ax+P?=0&8r=|1ObH}|Uk+8G0Voolv5 z`!V;LN$)Q%)@7Nndf<(<+T_4(mqtCYInHTT3&4CBA~}4;r0)LFdZx%{j#|EJ#I)y0 zj6NYiI?PjN>UPPy_t?>7%ITU`$Dcl1i2S#4f;5P>%L!@283@#OrW z5a4NtqQh{T%FV}7{c!r4#!|WXA@^*SX7K=yx<|)Se6t$vI0SU~=R?k5>Rvcg#aq`Y zGm_Q~uBhO;>BG&c8no-a$sF#(=K!LgztO*Ao}GM&(4+tN&|6=~|4&r5V;Ao?!Vu44 z0gAZpO}Dd~RgiG+I|nZA-GcV@N3O2S5WppO6CtTFg65tFPHp){x_;2Et%oysc9-7a zONOJUMYuOM19uvNeV-MmZadGlOz?~+lY3ZbI?5P{Yk1wjsby=dO(;TdVUCXgD#C7W z$usDHs8__cYRVzrqMUq(eg>6Yp0=bCD<{mc_5;FX;sHhR#`kud%(R{@?`dX!3n18@ zwth`F*kId%TEnM+H4h<|2>iNASkyW{%#H#r%1YtH-NN$JP;jH$>T_7xwHP{?`k4Rq zx6JOW-9AfgYB2Fh?)=@IJEptv_)UbK1=?(^cy-jcu?x?ODy>L2PgTQ2$uy7ge4!2P zIX2w+j!D)dv$Ufx@h=dsUCnV{96++`bllx5Y<3>8d6N~z&l(y@?^Qa4043vYP}Q(! zD&6Xg22|mo;Ix@-2uf)+$&M_&FL7woTGDrKw1L;esq6J3Df66I?w>6DU5CldZr?}{ ze+qsx#*zzZBmYDF+)?fqC*pkez0exfD+OVq4HRv*J^5DWeF1P#l#WiGpR{n1RcX6$ z2@EP?yXCivu07%QULH9Hu+isa+ezOD>~5v6VsoHQeeO9ZGpt(@5Zu>#+)zelG$k&H zcE_qvaLG6{X(;gx zq)A51BviuKyhjo&UJSh1zk@s77%{>`4l2tNT69?SuGqnS>EZ{sCQI|%IR}Yh->Gu& zIa#n`;@@7L?^ZPLQXkI*FW2;PfRD#hy>Fcia<5+{9Zz!IzI?n=06##SEN^=M3DDi? z^7D5W6!0I&qF@HHFO=I{Plq~nEy9EI@dm{>s@`#C%=oW4b(yY}m-&tTZGs|kKykO8 zbJ*cn_lfdmsk$$Hl@$&SrCj^h9!l6Z&l1Jv%A77;=l=GCGB>tW6~UPLUTx0#jnjD7 zqrUNnU3rP#*YonX_Zy&D&!Tha`{%544)7*`eMdXFna2&)97I+uxlZQCBc zti+8^3CaX(oMOMcMOpIRm-_Mktmt_@W1tD?`tg&=Eu)z>5?>PI)Gj+^ZVzPpTyz2B zB_yMbik_^AhHqHqWqp2^$j8s?jk_SltSDCBTV4(j9SJ0MF$=h#`}TUPDdA5=Q<4e@ zEHSH!X>k=@CM_^=k8j?TJec+HI@!oAt%(@K?`QGJ(#TTq)LQoyUBep!H+sWTpv;^- zf*qv9a&oV!>UThj{z2m_w!F|BI+Rau(xGDGE=#BPzwYo%vMUOfu}2Bx?POUk-nh$S zd^Kirs2pa^Jpg?1e6d}1RE>zxfa6_>&fTaqWTBwgmq&1r#}cJu+fz~?Ffe*vz4siyygezYd2_S&!drj^M1@y{4xd8Er$8sEV7 z-~u-ZJ`ZpekSQmJu2GxGakp)3#)R@f-{p!U{`dU}++5y8^V#*;flkfxG%=V$Za8^Z zaZ+*}+^|_d25=g;_>VVH9+VaAd|e;^^V*fzxNi)H;#~3u2JO7N=CFACi74VuTbtSl zN1-Jr&pYk|C+v72Tm zY7uWa`7Dapn$3t-TNt$}_0}jiBAP146Pg5=ecIU?Cj8m14qr`1ZxKSHjmgCYX zJyG7^1va@bubGKL12C5}*EP+8Gn?0F-HS}{9uEKi9asjGZYER?Y|8+$C*e=_m* zJ_0n?6yYc3jy~ZtZ8k@9&o96B{^@YiZ$^JAG{4}4g7=;7DMUM1B)z~73aKmbG_fl2 zAPe})tql$xx-D1S!o7y+!himb6KNf$ksR&!jN9dw+}-P_ZezHc;d9jVRC{YgH1%<6 z#G6OJ;{NxOyE;n5D;9JZGdEALUfQ7AasyJNqW@I!$i=$Vt@P{rQJ**A;ZA4*^O%6r zPmlEmWYj${vCiXc*09WfEb}tf=LDU=>6~_v*G^o`U=FUiJ}w7X_!xcN^4?}E-A)-} zPG7}iKv~%DJ;KbH%ehC7w~(5>dbJ?=a>PAr4B8QN$FgqS|V=IcVM6FkXmT zKZfp_vc{n}%u@BJp4$XWH=`(V`1%q_>qz+;^2r)5x3Uq4b<61O+Idx_fkWwDp=U&3@(hYJs8E@>|zSkTvIXveg6q=i!*41G&fn2nm!cBa*n`Op*k0v)B z5G#%CvW=GpnxyvBzG-uM-Jt~+>IQUytn9wg3Z>{y<}P}~Q=?Cd$LU6i$CIX!!cn&E z@V2x*u#jf#xU`mYM-}|(qyyldK%hns*fRO_NFr;5T5PiztV&nmCikgQoo2zX9ka5U zCSe^b;{6xUlwTY{G257MQQzrwZ!|Bx!adp8wh{OX%ugM{P{+N$dwZV$Xh5g6sJBfB zhE(u+&}MKjdcE~Q<#kpFl*8M@rz^Ba5q6uK6k14U-6hf~o zUHH{=s6#KE(tBsX6$_*X9%a-!!XH^Y2Ze)q>vhepdxeH}58NVb%s=AuY(h$*7b;jr((SGdDfE8m z<<%t~Qr5X9qlBf2LmR;V+bkzp(cx)M#z!c@AgE;#YtK{tu43Vzj$A;U37VIrJG9$? zSB5@m4;YYsj)%}pv_lLuJnf&%F_nNaPrEvE8?8d@XUi~&+Nd!G?D0#H1ka`0&0xRc z5r~X0%?ySa`QfsF^^vV}eQAT5rpcn*DwPg5vc+R}7%Hg_FN%1Sb5{ker$JTDbdpH+_QY_651+@ z_`umVxX-}gjk(u{!2o?l{EN_vd%Ho=H!wqYrB>u4kUZoY5{CY2hH|J3`GeK`TA+0f zA-=v@aw9P?LleN4Q`Z6^>>P#zxfO?Dhw@A3n4m1&Yp2VugDVHrYk6kttzNM+- z+V5QF+*r=ovyy#N3rW9}+|WvkX+0~$OI z6&2k;-)!G%wIev{rJlvgbV5;VE<jOKSK;V|R@f5rCw{Kpy)pa& zA-eGGpp(;A?n|ngI2xyA*CO&Hr=YT4%^nIj4{mMxRE(e{?2q1+J@v$Hhc5 zMD$Sq#{=N58l92Qf71a&7%o`3-i()dqbhJ+D#kCZQB`hy?$ypfSpOSLK@AIPkn!Sd z_)YN+3d7?wu zOlVDh@sWi|ovwzn5L%Imx7yOrU;!x9WXzQpdk{dtmWlE0?L3$qh!3VfMw+Y_CR*xS zZ)`YsQj$BX4jNg)#%7M^y*5RIaw?J-UW>gZ*_apI+&fCP!{s?E>cEiXqg(=4zZuWT`~QyWXtL%uBy*6%D5WOZHBu<tqCOzPYII~@uLfCU{ZPm1H{4!?QptA;3-VgUn`cjq>c(XtWjtF?Je$Jk z4Vspjd8SXYbtyf(ktuKa7_sGoz2P3;1$K_ldzpxAIACM1;Pe+7&Lk|DOF;s0-32fT zRMg37okWEPGl!&Rn7lMpdf+h=z{$hrph!-}jq}J;b;!d4MP8%fGLQ+X?^`u|LadP< zF6bmd1}Qepd%G8Epfwal$F`=s{@P?I0dsp6;&=@n#;XRrIWEMB1$KglQi@6iXUF?} zHX^oW1rOxy5_B%XowlCA8O?RPQ3Gh~+we^1K2+7`fx5Jrmo~-gsd%u(TDBy<1OYxH z8Krb~OwUYg5zYpFm0*)e<=U`<;#^_=8|r0z`|21hsr4d5brrYu9?^7}Je+oP)(8NUe0Sc`uR6dm28(EDjReXk94{>eL)3K*e z@n&FZL1f3Oze{NeG;kuRim7ulvBl7^JEFJNoCK&2NkIj$J_3q4_YE%GeRK9uq!%VS ztoX*GI61QoXs82s_18JNT~Q$0hi%kuK*ZAPQwq_qL%`qaqPUd8Tl@Q zF|k1Ow)jBG@Pr9lwREIygB0)5TBO_(A6r?r-@(gYBrBR3E@xyWhR^h+oA3O^mdc#4 zz^y9tV>eZh21W_#<81}g3}y#Am*6A{kbGlA3YhsF=p^9@F()kOb;~k^?j(m{ zwIJ#*!x1pye2xf@Iz5+E(OVTr+qM)lT1TIGnDa+an161cv4W%i0XoXvrotxhP^<^h zs9jW@B98~`5lt+t3B+}{TMVhMMCZ+qG9B@4djS|kC5ilKr?z48=dw~9Nzvqa>0~K& z6XS{K({ad(Iq7>7K}}9Qc~p8Z?WfWXl$@zBG?>v+M?_h|@cZQ)Lz14DVEn8jbyd7P zE8!;ez%}))Yxn~fW3x_ZQXl$;DG1>So%3gU+^gyyPa^xcEj`X2sy28Z;G8Y@D2W?8 zlmO+?&^)*V6z?5f@9P@vH@+LG?NFG!c3$Bwxh%g;GUngmWUh-QC4`B~Ck+*XGDi>L zc4h*v?yZ{pD6DU&&`5U7R|hO+HES(9y%y}9<>lfEf~d-FlfR88a2+fNX_{@^-Z7hI z2gec@qy6R9{3m+4mD8qiL^_Tw{n%EG9{>}pG*YL!A45oW#37`~!Cq9mA>i|*R^>bD z1*srcIRo4VC8jitfi@GXWi^&|g=tBIh~b+{F+XJU)gQqSwv!52{;>jiaivSao{~@d`)mAd3Np>K6A=9fsdkxdqiW6OUv1Heg0x zca}M7Bz^6=7*Z)<<^_(-VxwIh*-z|D7edCZ`u{e!Rx^fP(!)O0rdNSoDp z7lh(~gvdwsxd%a`KV*iMx_zOkLclbI+CHk2RYx%6nHAp*K2K+O^_n?3Ck?zejaWSO zHi!(DDG207z0Wue;L6Sf4UEc}}y;s#X%nEd% zd7d}kzgR%rxnl-e>#uHkC9r9z)UWwk>ggo{QQmr+KfBXPC7V$e8;b+UP#akxk!qm+ z`^?U`Gk+SKVy0uxq#MQ`)w$=DH!dsYIUHno)6(nPrY08jDmwegIoj{6SOM*Kg-xu3 zjnPS6vqk4bJGF_5maWJlV0B1)seRER>c8BtHDTD_%n%h-fMx&25}D!$J#` z2&2@?KUBf#J5-d02d?W*bpjL^_m-tbnc})(T#4GXAji>t(ShS%Hym$0aalEv$e>9R z2L!!^yu>D{$ud&3L^q`UNamEZl*jCU2X@w7XK8CWg6A4ldEtd^TL8pz7hxO5&$<)s zrcvQ!ph}!@GYGSEN_^h=G!ZMZw16dx%EOZM^dvq)>?Y6`z`!YGo5wZt<4BF;+xwo3 z72Hu|8NczglxvD$Csgn56wi@@lH+`EE^{&C$szy9bXc+xi1Jma01EGUyLmIO{v$%Ob$o=Bu@Er(gS^-orsFo zVfcpanjy&&e$q&aJbr^zlx_in#{oB=y)L}t`)TQp@DTXAZKu{mjztdoo%j2JHMYWk zC)~y>RZ+=J61VX=qcb6FC8&P*ohwK$5`v6O!&po>&anaw2Y}M@2#q?PkaZUwSj90O zs~)E;@NUcu$FYp;JJG^eS&HoiI{lOd=s+wUJuX;v0mHjB1de+}c8JH$n14ryqQ9Jk z>(njLxq9{>z>pgZcPZ;zI1jT=kLoYlvu9s*(yT)}h*$WHt^Svk|l=jMC*@movx%6>v{m+k!(jgG4(g}w$M{gz-R zn3m_KB;ntO;SqswLiJsE_7X*vH4JaGSGa7dfr&~N1~5L-Lm_k{>+! zzatT97R|~j*>a5Sw~g&#LyG^pu=c=1X&Knk*xYdw$O2Gu6`}qlq{EG=^XZ4vUEx|A zcLjJ*LTT@I>ahvQNha}z+`dK-=uimI1YazP>LJf|x!8WHw>3>G{VcWG8h-LE(ssXO zbMZ>)*j}Tw_w)&;$(W~8A8w|yUNR_1q^4vRPsOp3DAs=tlg&@&9Ma!|Boi?xd0#q8$We1NfKPg-{ESV;a zt#DRV6|lWAhR;RJz{mp6fA0B9a;%u{a}o1T_WLVn;Vq4b{=WzUH6g@*d#o$_sfDWD znjt(ELMx_((}keT1p~YX0q)rnuo3Z=J}wod2mtX>kYTHS~MS+ShvDo|4#ee%VY=jrKvp8D?}tjIa?jrS(aMdXxWaD zauzbe5K=6BxYs=@n?S_t>*(?i#<&aY7l(#Cuji-fffiUS{5PJqzCYdMEMaAu{oE}t0)&@MxjObLK& z1qNXJwoK2gaZkACXEs5o{duoY-yOylSwL0v^rNNUEZTv7)Qdi4{&~r{w$#c%bryH? zC?besatlgbG-3JF7s`~XtloagSmKch-R;N!9PWoNyX2S^KMH*TBiMF?Ap6ZpGMnkI?w zd!)|87@rUxJhBuV5o*39OK;cEqMpYr@bu34Vy@%a8cF1qS1U@hhfIRSrG-i0Ur%HP z**DEGIcU#$g1u}{+P%_ZR_@kz4d7ROr7MwQqfB26m-UUR54)P+l;^of#MPoI0oPqw z$Qzf}^k7WEmC5mQ$|~|s058H$)~zDkl)(6?;B@z=Bd|LtwSI> zbIonwBatQZbr{CZKhq320if8M=iheiH9&)!h~a`BZW$-?Ee+y*39IiQQ2>5+C&m>x zt;;<^)n41*)!^;XSR>5_UR4Frt$V*z-BxisAu}S2Zh$x_+B4;lgG2G>f+i#BqfZPO zzytRX%6irdx$0E=&~{^tO!?mzen;?qaFBJVUKqtb&dp1AQY;@JOZEPm@f104_?-y6 z_O%w?yZy2R;_CJVT&v-z?6@$1hnN}N3K;M2g4--O0@>~rnAtu)v;*ESFQM`@H(vQVu z8c4LM9;EUSFLF7#b6mPN|+upV{QBL!}%T?AYa(SiJWx(v&@uK=hYzV_C@KxW&6 z@13R6{mJq@t=~$`{saGueNKrwQch@*9S{lxm@Zv4GeuG1B z;YN*o!yIb=6?E13?IOT2p|kMg>Nxu_AbfQGSAb$pA@sqQ*@uX$;yRqq7s%RNVFytu zy1l$0@jnWY`QLP`z3pcws5CB6(ZPryhI6(IB(x0$~M%C49p;$%0<8E$LyJe;fVWA!nFq8=!Ucvxww4_byw>&s!z2*kQ zySqGFo&{b0ot|Af{oZ7KNnhk6Fm0^GmT-F|9h`ZI5fJ-RH?NaqsVovA@C0;u*1EYk z9o})?Vto@N_@U<))l$2|y_jUjmG;N4aOy3oLF+xhp3&CNgsKi-9_boT+Ijj?MJcD~ z-97E9MpF7si`tJ6hDt@|Fv>@GovGT+EYj3uv8LGGLzH|Gwh~I(NB%@ z(!pk8haTcS>1DeKeLWjFpq=Dch(6y4zg;MVGYA_U>-qKl@YsnmjTZfP5zcoBbAPu%d zAMelU@4N5wkA>#{&tc+Z{2#ay3oGM)_ckweIAck;9e;Y8V@Xl6q_I1|EJKLDq2iin z+ykOE%FbLGhcpAeI^Biida0Q!o;#BZo@dgkX~?i(MZKdUFNXE-_v%8w2m8lD(R}Z3 zyN7G|L(Krt{NEA$0MC#4>0$n_NWak44i(w<;pv*tB~w76pvJ8qTx06q?fol3?mL~{ zd-Y@&Xb`~UWp?+O_v75xTYSYRlH9kTkNs^J@b%F=%>PYe^!Qy|x4X+`7gbLN|4Fz} z+{w!Hal{U$>Vd1>i*U(j^~?ot($}LKQbNRo1c=IYCVUtUjlLwVgXnq|p%wTP*Be?L z&`8@b$O345bd-cp!B^Z>SWK0%y2R%wvM=z|gZ_%a&HR5+Psd9rOc**)2|ZQItoy?cN8?Qi$G|AKX$>%5NRei_Mh8SA>lPCv(*6I_2gvH_(V z)ug|kqcTy}Vab0k0GMvZ{?_&mH zHRqwvPg+6G{ub(ba@05VLr12Ig!%|;CQ+*yB!W;BF@4%KjZ35w4osy$DX!V)D#C*95xMqN%ttXmXK1n!&G%^g<&T$zGQDsY@zS|DWWEdgk^& z9i|A_b$keMv|e)@k9*?Je56-%rB@^W%Gn$`+NbnlRVnv|y__kB2JpYi4#6h|a?T+` z_wFRsl^FS5^_Iq02>QU_K&Z%^L(ewi1B~Vznb!Dzc=#V!?jT<@SRFkz!%#Nuqx}g5 zGJW)xUDZe$Ns}iat6EgkLXZ8z1xQ(ugj#Kj5nM4^G2$=CEyIF$EvZ>FTeRLw-)MF> zeI3?m8-b4#{Ud1pP_Vh&xdk3u&dgP ziu#RNPaKw26TynrJ^&4LK#Z#T02mZL{+XFGj%>8?Sdvl!Jx!a7q>nWsamT^)ccH6= z1g_KsG637R(;2f_9J{p5WngVJ*4T0P2F!yd{<<%YsWw|@N9(0dUW<5lkR!}Wb$i84 z6&wQD+85B-TCpODece6Ak~lDU{|)$w`{NoV=qFTB`!l5VG@mI6@95*N0M_c4KwEo_ zf*y*;fBfYv4Z2-%_1}h8V~hU;tIy6RB&t)=rGa6k?oe6um&N3n(hUm*+Z7<{O)Q>q zei7rvfY(7u9uGbKJsYKp>C&*>Il3oZe~iX&R%h%oV?iGZhj~6`yj9xTztzo;X&tqC_`$wLnX{Tn z=SA33iM<`OuGfsu%ALyheWa(`deBQLA_KNmvR*~$*^8WW?XUs?FsU1ok@OC7s#BQ? z)>gbXF67$y5`mq+I?Y|6pcec>NlTJ1K_&9QG??YwLrt_*lu#ft%(98YJ{hH%xO1BQ zQiI_5T*kMI=qKEJzTG~jpRUkq2;4DIi^)s_TBE6tNp()HEUU6mJ#hd&OUYyOXsXey zO{&59y>6~v3D#9WqJv0_gBl)vfLx%(vGhD#q|YGQbXz<@4onqL->dYva1AGKMY44Z zBx!xoXyDxrG7T)husLZ=&Py&$M}KpWV)lfgWNYiniBiWr>)DJ2CT)IK z;qb3RMqm#avEQ*53U6}W`OAqF5x=~*X=1oVQ!>)$BN3kZ^5hIF*w<&WUz}ijPT6m+ zFPv;IChyDQp<$qWij>?`Y?{g&eita!h{0plyObf@?E6g?U zY}}%^9{m88kUr;^#Ct2(#4#4UH4Y}N7dlwkj#Umk*b!ZAAp*5{S1&%>_#WFF=t`}8 z1#^9tC|j#3Yg7e|)N+EyHtUSe3wN-Qf&0j&CZ^IpgIb-09LQKjL4y$qlmwPSP;JAr zlpB#ONH`FFt#q_^U2yi(*-x1oM8xDHx<`$C4R3%LcPadvwP+2ZJOK}a`#8GH#9AFT zai8@&zFo$U43=@8{qo05$J%z~E&8t)gZoeO&#kuEa2#e;Z%fYKgoiMK4 z%?<#PdR)nXj>co3?g2K7nNGXuP5C|d4S4FpPMhS0EA)^)P1tb%Rbr4pyV*&O>hHml zBulgNF<8$H4+1q`_5ANZ>(WlzkO&=y`!@Z`C{$jH_9k+_e5+jHYTuE3Z4dx@IL?B| z0T1bJ!V{)BZMmQc`WQq3t^l{NjXRj1lMW!|Afd2ha)q2SbqJs5i#F_ym1hBoMeyU# zr>3@@H?{Y~xzXZ@8X$ zi-{ik@-esE-xJ`Wd#^zZbxl%Ry#mANXJtg!q{WqaYeQ{z+fIWms-~IlW2(>61jej| zkH$af{PtCqWKxP3{RXBs8-dCZTBf`uFVN?dcB;@1B`oT5WWml=ccrgZX| z>*F8|q7PQQx0b*elv!OlGjZ2J)M|iE+mh;mr{-+Q zAPD2kX=fW7h^+`j6p`f1(1imuxN%)vY|J4r<>g=MwTG7AZPj5rbo4kyr$1n%_eQ`R zk|8y;rht3E0W`6i!>1j4Kp-q>vV=WA`Zq?3mhi!EiV@A~1_x1g4?T<3Kc4C5m8DPS zbkE+~Nr-6g40|^$xLATL4cTUjX~%ZJJi&JRPx7?Zjn2~@?fjLZB-YAtb9}93jflnJ zR<%l=wY<@_WPZ3jQgg$t#ZJ}#ree&bl zn=h#mslpPJ$#drfW|^>RppsFwY_dF+hsRUl0KOb;@>*ZIfNT zMJUXp6HXmnyduY{?u`@uLsrq8r-H;y*#SD5kC8(j*r9mgI+ox>q5=IT!G*t~x55|8 z$4n`>Ed%dgeXcUs)fm=@k?JXo~4uqSPm0`)m4h+h2-U{Q0K{kF&?VOEHR#x zpX0!B7NjUTv?cPiS_XhTMAA<`r1k)3Pz4VRkVbTfbCvGxtQH#mr!+DX0^rX@ti=5! z%X&Tg`$R7W`){#9(&***n!F$kG}rmN$~+{)q~y-P!wY=Ucxs zImI>hx#vS>yb9=%Fw=7Qwi=l73n`jBD`E2b8(@}6;I7WC&*OJwi)h+Up<%fDGwu(+ z;p4hP89u3CcK_8Z`%~58n$A#2gS4)o=mUK?IMGs}|0t>aH6;I$vf~|3kdCMDOgXDX zT%hn>9)>iYoVcm_xERgd<%*%ka;G-DxX5mV_4DB^Rsv8fir8}%5;qkRkOOUo)ju;m z=ZfkQ?thyuAJ&Ceq&r*6f~KmC^O0ugj9NLDyjZK+vyQ4Nx+4ZTM+iTUD!JUD5!WS~ z>$-fgo7i3{BymzHYEeqm9E)XFq4J8qy%R?~0GTG#-{DpE2}|0^XQ6wXH5b0#*EJs7 z9Q}_zECJ2_Xaa-!&M(&@fA*a;|8(+o#GhuU=pp^+g9UgWs`Ny)eOS>p>m?`A9LMb9 zfn*r8ja1H(=KEK>ao{UM)|2Zr5BOWoo(%aiiN4FpUu5T}LL!VU8n+Sv$ zsQA%AWJt$f;Uf!2W5>kKRjP=Ud!h8lH&%?^@Osw3=^ll>ewLqIOv`mme}$iU(gm^7 zQEQ(Nr`i_DQLr|YY5WT(G$LKu*LhlgD!b28_h=c@$!J$?czR=)7rz7lFy@^;t5+-2 z95Mx62+5Xp?xgH|OK*m?2y@(kXM-4m{=5`JSIt7t9G|KG@jm^XSl z!Xa$p5x-9F4OywQcDw9s;w66dTmJ2wV9|)OnwoEqa9*x1R_RZKST2aDR@CXhbQjFwa}L7q>{e*lp|%`%}HZQ+`R+u?ia|m z639-6kb0g}s#TjwM?WI4^7X6huo_XZ{G(YA!AHfEnX<~HOKkq6ga=@oQ%~OGqINp3 zzzLPvq;#{sMK(aCa08l)h_kS|o`HS+Htv1EqyfsADNY+qY^~gW$EB`|<&z~*SDZ)P zoa7LefsPd_dsQ7fI^Iz9<2R)2x=Yn$O$Tgwt3`c(Eu5+IXYdZElHs)7Eb%UdfvCsd zmaR4Q_KpSG*@aJz;ZuOYCS&IB{q~D3!~V2fVU~>7d)gfYV`#pEPqJ*N&Zyy5J##3(v5hbz4IPZNlO{Q z=EAV$(`0rz9ZThHA!?I=buf(VN$UI8JRiB&s${r_X6)}9(+ofbc77*BC?w!`sp}6D zVOmaZ8dIa8ewH@wQ)H2^g0&lRLW)7V7e~fX>az9rHiAz5uUC4xDe9yY1?vJ>izLdX zdYk5|>~|S4dGl0F=8g&pZP70%#t70{_2ajld9$I~#=Nk(>K{7P8>H`#=Dzh1;K2Kz zPs}B;iLs#Y8s~tAY8(-`%fz+M^4`TFK|c@(hb=PJZpY=j8%HrpfeA#ZMk;J4J@;71 zT>0Fj=aQEl3ycW6w^K1I;13v7q|xfdLGPnXvsvhi(+S7Lua9~hT=0B;04<5|ctr~y z8c^~;BeTw4(Sp-Lmx*8^LFg~rqs39s({`IZ(te4Ml*JjI*7hN$-RAYES<%wU zF4_&pokqCLeyszFr^=0DJnD`go4};~I2K<+zwD-YJl;PIjeIXTkGNZo$m6KOM-+@? z#bZCJiFW|KQL!e*xcW%+S5N=Xq}dIEtwps3Q8b}6)nh&>hYS`pIvRL&XAxE1Tvfu4 z>KGPUwK)R028^e#atJmST_sds6|r9gVQH&e<}P{3CuqJuQGHKiP2#}ofqF{{b;})5 z{t`PuoVFlys&(yIAKI|He4S3CXdDVq4Y7AYE4Bc~8m)9;Sonqa2O2B7G@SV4&mA$~ zhyA>3A0E{Hi6wakOMmgNK-D8@k1Drjl0}JwP)d_0E`X zxnLUkNYk3f&gBvs&ZG+J&Ap!0gFB(%Q2pT?kEb;YS|2L37|%E^)Hv?iRO-+X!+Mu^ z@CSZ{T=F;>SsIYRZmWW+gPUm?D(Y@_xfpQab;4xmU*;+QFGkt#eR5CQ=QMcVQ%94f zH9Od#PLSrY#GO~U|I1RA1W)2>&r^>kMs8N>WZz5yUrxQyDQpo}V=Q|;dv&Y6S`ncD zq_m)wc4-Qcq@tH_QqAXCS~k@n_d_JI=W}w!6LjRytUH{6U)gzYt=#f3(bp9KR0iys zA@SxG9gK$)n9%`xhXlsM4UCxp)dvMVnL}{vS9MD>L&qj*1MZc?PRK)cR zDSaRkr{ixAzMzmMrY3om1qJ^3PlDXeY5xdCoo!QEjXRq?L2@p|LbCgFTVY%6)o{C@ zRU$i9?_ay`S7Fj;=f@}4*XQRGk&r#$qwJFbpJ(l0?sE9~QlYe;n&5I0K(u96=paP+ z@4Y%{R93q*>G@D8S?C=_t`1K2G?&O>>HAja(}7cS#`I_LL5e!|%fJsH68~P^Eu_bI z$m!dnv$?L~2YtqfPI}XPUem#H$Yg|YLJ88T;XSZt5!dl6N>sOdHMcBdk zZ^`>=-$Cf>_{s3Q?E2sU*u7ES!h`b}+Ws@Pl~h{PShXRzynAq(>2~GFo03e!@%3^~ z^!1ecuj8}nW4kK6yO`|HFO!qhgGne4>SMJM^>FTM-Y;T};!5dix&pFlC3nrp7o)NB zoBM`I+)PgU

l2VE-*l9i(1>%ciWVxD4fZkZxcT94Jh->Gq%iph(Vh=}>ppMa&^w zU|cU{jHazrmU;?bnGN+20%~Wrx<63v=j8{dWUk+2uJKmuzVWs(d0MLuEluRHIzR3- z%h;aF7f;Pggr z*&QH}&O`mZo&4knOgXZLliw~j?k@8R!c_aJc9NnScWv<0D%5QU42ODcyji^uTeKSE z4UK#{Mj+1<(8kG)ye8qRn>@X6#z${hTC6Ktte2(rUrwgG4iqK!gPzVcF$OK0DY*Vs zS=dpF4pA_dFMk|6a5ec=Wq3YR&A4dt1f=?fBji=r;k=s%IBc~zo5+}oOQa?f=!iCp zVRjbmGBnn0x%DKi$|0H}TH~`w$CQgl`s~_9q~cn0AK`{u%PVm@u$af%z5TUn;CYCY z8nHsiDMnDmZY|jG#)#$8KD9lX0;r=qbbrd?zAlTF zvXKcgJnBgWaCgrsT?~i*dmN7--it=jy12d+^SQ*RGk#Q1zLgcL&NC#gGfvzJ9kwZr z&oxiz)i4x83np71=l524CtC$nlm8>zYrUni6cHj}4?f#9-`Sj0*p@M@=MvYn#BTH$ zU2Jfn&mCZwTH>lj&_Lu-Hl~T`ua}-f*1AH?gW=K#2G2ad#FcKUWv)$&R|P?R*vk8%upT|OCOL5}kh(7FyBFoA6qyVEFQH&FKck1&ay-q2 zyb{`p@&!w~KH))t#-~AthR%Bh{jpJ_?V;*Afi7>5Y8_TKdjs-#w}SHlgDCh5*r{9} z-)kxd(7OS(wv5H4TogJQES-_wUg&O>Tf+lC>rxwc_`~U!GTdDN*|7lDsbD){Ig5j~ z#b*&}8E-KIL76p&rN|dIAHdF%>#xCBj2+c*RXMcyyR==X_{!iCwFtNkt3W7-D~F^T z{HMDSJUK<@-N{-pqYycuxVe{rRtjf0*|8H;Wgo*Hm5%UPndPs*f4V9{W_r3{dCIf*eS3vsqN=qRjRyAOQd$9} z&*{dQG7(+3Nl|8kU?!cA%0*H3fWGrBX_GNTeWP$CHfnI}Sn%%4Egvowote-N^E{sD z%0i_-kT^@g-kgCE?G?Wqs@6vjAqk{80CBnHp2NU4Pxl2vII}?u-+54T#?E7vo=6G@ z-?^7fNkaUggPZAKk{tNg(~%f=f`>+fTj*E;q3hz5ej;IC{~5vZJ^J75b&)-K8K)zE zNIH|YTGe%HUQ8S217nR`N?$6y%8c4X4OSB2Gf2H30?jI`j2k$!$vhGz>N!690O6Ez z*|D8kOFS@!q=o&}5TJTQR@DpfE?-izI|-RE4%z#gs{CdUTstz}k|`=4l6M>X8VK$U zb^U{^DJ<=U4#h%Ew2?hDwXgte4OrFoV$+JxgGDp*cBJ1_rax=%n4tAi_;S6w<`Qu!|l9_s3Y4DpnEq!b~ze4+Cweyz3T{;F$s{V_{b>=5!k((EJd>_%Y&ryf9UFWvn&5ST0b{Q(CII>YEC+ z({sM+>q)T3>BhUIxifMCAZtmgd=LR=kn|A>5xWQyrjjo;!O9C)szvRSSb<3%$%^S` zWnr9s=7e_S+;%Q>l7*t zY_`p@UDa_Iiod57?IRco@<^zBgKdMHcCe#Mo}0cDKC5Z|eUH`!AOTUDA;tDQ(ljO8 zfh~jw!>#)x7rX#cp{Ar!R%<-_TpR=g0yUQLEP#d_fyAkX{(t(16SK#%G4M zp~)oG!twlp7KS@QnOw(+ZH#r89Q}Lejz+#w%TQ%f`yjJ&(36mIT51PRiYn0K=X)bc zJ-a)FY!C*4c7$lIukvtvSdk^4=k*IEOPC17F^_mU5HvUoQ0sJUQV*u|*X3=YeZ@Tk zUz(#lluv@X4Lttc6o#m1o)$diMtp@^1*h=4E4kjVt!5L5KLK_4%iZTw_DMQ~bN<{f zUD>IaR9)xqhzrk|fF(bnGa{g>SPRbExTxxI_0=o+ z;C^bB43bhA!TMTJ*YDJOl7MhDqev-dSrocmdTJ z{^w9XKoy$lLtazMkB|}+hatr%_E>RhSG3N7tBY=kB~h2=@=eYKGqzmM)ris^ZfV?6 zgbUAu9H=Au)k_O+2`r>5DQjQ~f7F5e)^FYYhtT{v2E`hhPssCc;o4T%=lstL6Z>o& z8I>QMP^l7V6PVRN|BX)k}uLX z0Xfd`L35`P$!;(Bk*VSD9CQ??G_h{V1DYF~PiXG9Lw{a72`zvAb(Xrd)5CnR`JGCC z=t%|bmz$h=0?(!^D$OE{h^E;&NbBWcfQG@R7D4Zx{L4iJgKedd-omT=T|58Xk>lvX z$k&R!H0cJxrye&_ruD_MimB)CqMfr|!gY0=$d7MWbagvnfJ!BAm0Qp{_vt|A;$9S{ zmkX-0a~6g!R|lK9p0Q^)gj>m*{9xDfAJ>O`m>kE>bm)Vj`=cm`&LNUOw~L_zz(G|V z61dtt`{E({`g$&y0KZ)BUz1X^iR!9`S-4Bsh4R<1LcAN^WfAU`=K&fDVsWeGU%8g< ziuZa$uxhoWiUzXMiQ${h>2G*EE5Nl#fY@KP$xW0gQDGm z?MA}GZBW(RAh<4ljuz8Bq`~P@!svHDlQ{B~vrPs4!@cqi(T?;kfRPj`1S|{mJhCAeyKU!>0+r#M4|z^g%Y0{rt2+R?Si*&~Or?J|LcxOkxD{7^kzcHG8TK1dALj zelDAA3WjO*OabER^2xJQBbekWiHrZxX>Hv+985PZAkrQ_<6kuv$k1{~EvPq>^KQA< zp|^pK&zhb`5H}$(bnR-82e_Bw(jSsY&L8f(KKqtrl5kke(mH`ptaO_H$fi7GY3r2F z$HCTi$Y<$|WjVbWN{(kx6;vYfpHQX{8#|XDQ5o%M=p(_x(`96J)Q4+f9Kdwrr2c8f zNI7l(134LVPTGzp?`XkPMnuK|cJ`wp&pj@{E5kc8cr{W!Le;?E5ipM*u+YBFC339^ zVc_gftm;o3rAZd|(L_NWqD_U-U7Ter0>54yrmNhplyyBo2BB8j2w0XZ&w>{`{ZM#UM;aY~fMPW)6 z3P+6BP<2ix>BOHo9Kb2#(w!}be%GK^5ZA8oxo+}@A4zs2k;m%YzjokCA4}KCH(|J< zY?nW5DJNR5sM$ZeRukteuTLS6(x!%A$G$pJrj|CT0F{&wPCae^gsjU^X)EGp#b0A5 z&~3IQIaC7Gbeswi6A-|i)w*4bK_s*}_()_|vfVCj3l{uD9fHWdry1&F0OdhGpz6-51jEv*} zpN~PF$fPR4lc9n07HLN|8*V=wC2U4D_p5+LKyd2 zxo7_tYM;gk`l*>=`40iY5UoZ`useX+Pe&$n3|s=Uj*sewOHtT|bxBo`CyE7}g{Elw z{Y$(S+S0Oj_goo9B{|*F?h?QFtYAd|x9`1UuZb#ezYorE|Ldns<}7o=n(zByiU)nmde4TJ9Hh3XaVdw_x8w)71B6^#T=?j zQ+QEj14~0;#bp=ujxzmJ_21ix7{bl%0IPoir#6%$e#Ai5fv3z1lBmEa*Z0a$y2Ocj zKnV)h;IzCZgMa0Q8EaI+=CyP6dy>CdOMk^HnfWVLCHnOqit(?%I9&+~R7SD6f5F)2 zV=;a+CoP`r?c*z&PUK42A+giB48%EeU#6k#35}xS!KVsByeE7hhiVU6Qc^Ecw|`ZG z)pYIrk*=IIo6-2g!OZ3(8P|ZZ3L)o30=Sabs7YtEO6Co%ns>aUJG^>|O*qw|anLJD z@@Q7}wx2YA+~D+fXA#dGg7!-=vSK@w%M7>Ao!;iP0xs)$XqQbJUhkeV35M@u{nqny zZ`fr#l*-L{7$EDH{Vivg-QqBS5bW*V+>F=ZW!|2Ce-3GKhnZ>pa(JYGUIr|~f@pUT2>L)nZX5ilj=4*3tB2MxCSY_)D$SDM4%bIzP9C!aNt(b*OGAN7`{VY< z6b+nfjw_xUe;DMi$>|Xs;KjW|9)R374nd-D3gUEY*HJa!tn;(QhsAFJ{pMOiPy%r; zMi^L6@YU6qMW8?bpxH>H{`r9}M;W0x9{VeOdTl`7;TBbqg&7&Z&sR%@U1NIC%i=k zyv4xYdBwlq6wyq!pg$+-=LC}?K`L>1@dcw8KZ-7Fvp{i1K4>u{tscN z7{4`!zLnuw)727Mwc;IQ4GsGV*U@~(EHr5AG(8%=|6i^aw2ZQ*`t%heltYPZ5p~2~ zRomw^r32|FlY_x#N0ijWzfHlf#GKCzzb{0g?yax8{ipfqxvdS9PDIKLKcCGgr#}g6 z{`}yFx2KXh-yp75s`jzmH)z&uz+^Xdj zjFJBiCRFVx zV_uYky-XcmSjkUNc9e& zh>jwj32BH((~8k`0i|f=4$aL07h;P|rc!BvN#^v`x~V=wUz7zwbsI~Ornv?QH=e7O z6csMHNi0l`?2;%QWpa8_Cmnmd1>QK;QMF-g0TIhFGWe@GxVIUBON>(z1{uP3Fk z0RmfS-8`+b8p7(ga3CrfEJw~bCm;lHq``!w@wr255Js`z6g%5jR1C0R!C0f2TFUDQ za#An2pqKu+)PED48}??(bDn2$X4-;C!M^6nzmTrIHh$h5>|Jkr-($#v2z)uXe<&R7v zwPW@RY0T)2co9Sg+aS)2v!ef}#%*nvj3mpCTr6kl(&0QP_il;9MFh~D67d_@`Laiu zX;gn$%VvC`rC1Ni014mXXh@f87;)YkH}W_B(^9I-0C7+5+Ws81Mshen`5Rewjo2ahYX8{{3gVCbtvn!_C4{P4 zEUoK?90;p$sQb|CH?q9Ht$n1F72VKTDmzAP5kNBo@@3guxfs;=QRz+>roMqbVMLp^ zzh_`2LQ`>F0YIY*CK3e*VDHZ&;Pj{2uw^|!y!C0jHID3(sxZ$HYS5fBt9bqlj++M? zTa+e|DI2d2XugSB$Uwa2)h)g7#|VqHH{UMRo$KJ8jXzSqmG-L}F#8*=3Pd%z{1~}? zJD?lKNl!eo>OEJyx;<54NL1FBU{r||E9n`evJxcwg3Q#FnGpbthpq<7;a%Sk#quY@ z7B*Vc&f-t;?OSMl%GiqVxQVS81S`t8K@cTvq(}F0v3a_QWOGA4GHeTCGf7`KMO_79 z+-DV5S0anSp0$iCs_rbQjI3-i<-P!UrHvMMQ}9WN&jxX$a#<$a%P&0#_q}zdT;N~zg&qjF^;7@$GG4sY z(KcJg?656#{S%Y@54PN$?%2eN4${K~5v+d_jA-*BHwu!7Zg49Mtr_@Cmgka6~ z7-s@NYnK4?;O)rjW|uo(NJ3^Dx2ML+?#sDPAX8BgRrLq&oBwU)h_wP#!@ zp*KBb>rUClQ$o7*jqy?N0O zbc%TW<(|y*&@u+Y+Z+LpHQ*{=COymZ&$x1=evB*@3C}ilD&81H*2c~Abh1)IUNaI9 z&}fRHQ1r983u?p4(|+#gGoS~_Zu~jXu_$cjN1@( zW(^)YrQ=ga0y=Tr>Xe;#X@%8v7>hec9?()|V}xZ!9Ml%kaRgbQ`~%m%anOZfG(wK; zU3P5&)~!e^abo&;zGUvT4*v(-&M9Ai=Y<_2dy80DoM1YK-ECL&I`o7_y>T1Y@OO19szT`<4SX#y?|RJ%8`$)B*b zT?&HJBP+_-5>6ZzzMt&%rkl*>b3>sC6A4DI7aS~6#-A>9^PqMD^W--Dw>*|*Q&1{9 zf1ADGC9_-T-GtftB3eqBqHEXAJ$%O52$~YDZY+&(g0{g-G*2f}Ooh$?X!wZjGJY{l z+D*}RfuDkzWkh`jIrjKwgL?<%Ie-+&`PZWE3?XB~GA+FJON^cn_)XKsz7V({Oq8r+ zu7(Pawl-_E>L(JlI(utf73gY`r$JqZzfPppN_J2#%1O-K^E)gLr&^h)xv*m-CChrG z3pcQBn99J((JpL+glPeQzwE8#Qo^~DJ3zLb4~b4VO77xGwtC}VJTOG!4i%mqqo##w z^A?=?n#E?eNkl*n{LYQhi^AVxSg(5G2CSF{b&;? zUsHOa(#82<6}^r0j+xroR?v6GP6Bg{W(_q=iZQ)G_Tu5+Iy7b3@UE40@X!Ai!!b1f zuGj%){PA)xsJEd2R65++OFKqpLtIo2qch#4)ubwR#IRZ!q9meKMe`TTHJj83g+%{( znjOb!&i4FX%nc^jvS3h}2I^;$i6_$`qUo3FRwr^evHrzS7?4;l)%hc!lj}oIc`6pc zzBx84pbE!(ELVQ_x&pPRlP*!H>#H-z9r3o9UR+=dCNix6Xh49I<1H`FWiF~(7!w2k zIm-GoO4=ot)LxBtoqW_{d~cz7szufkU7`Nj;(nrXEc__BW1*Mn++|9O%|-ubrbvtWSe$pQisV}G#R zvV91t-G<`42L1;wA2;vpPt`vJOUka(Hde~cC40?*u6;6_5esHiZXQtZE}g`MoqPlr z20x;Sp#rn0WlmW{967jjRg3#UdVpDJvr@e zF0$!us$K5TI9s`p!-gyU1uf7MX^`9{Pe0$S4LZ-SaS9A{;!dyGm!5bCKfeP24Gx`q z1ip~dtC74emIl(o79=x;AWe71b$n;)vmkk=@yvK0M|fVzO^Tq>zF$IPZy$N4%YH;LFa^BA9vqHUtPNBH2gJq_0G(^=e9d2MAgqix2L zNlu~QDP|@SBJ7X)-gpDQ$yt+rsRZ>pC0{G{sRqF)i_%}`?E35J%@qY^nQ<4O0un)$ zSYUz`3&%c7HVe-i8;YCU{uW!1*F2y|N^0 zj(&=y8a#n=+9ajR?0j?_?uBZI3}!!v4HdXr@oR=s%H>oo!vjMp>vW=Is|2;tqle*B z0cg(33sAw1VFa7z_=qg-r)uO>G3AAF>2kVl49i!T@ZqN^#Hl7KdLE$lS? zNPeY&6Ll=S(zIr%>C6-o{m%aBK(~MD*m->idHk|BjxUPO{OEmgU zLJ>^M2CE^buSAy-C3U}0Uimm z8met(m5ja#dBKOt*=9gCUcq7+uT)+TR1SxR9Lp1x8fJ43qj9EE2Gi+0FXa0^U#mGfQ;EmOwOP@tF zhGcoaj9DN2x^=T0x5o*!3)~$$ptRMpg?$WPkN}CT-ob$ozvm&O8#TH9qvu)L?D@!*2N=nI}9!Fh;gOi^9 z%rBnEA8-b>&@K1X=}>^sW5~1I*d3G8{rSDA@U3XP7#nU-C$^||4e-|j{1rECT&tno z-!IN+lq{**Vd}Tgi9!xdn-L3}a5)Stu1#3GIPlZo#yc=kH z#sA{-A%cxPhs)Ikz1^-*;2x68#Wz&(KX5nL%oDni195keiz8tSTm#6|{E7*Fyf7h( zZK_>OtQOsefU{QEZezZ3w$sq6#NLA6?#n;F4{lXH)@;i;Rb@*8z^&;sh^2o`IUI46 zcuUG7dNA*-7zj7-4y5c6Y`RDhhlvGeX}PNqNlGj?wT7zB#DO#}vDqrfGF9wW*z}uP zYidSeJ*S|I@7)Kv3V5gXffR{xk5|jgw4Q5qVA~WT?)UAL&qR{M{4j~CEIV&x zx4*3BzI7NpiHytzJnnnPGazU54T+L_IMEVZfC)TmYskl}uI=V1bq=yTb}5<){$YG; zZk`WxEA1BT;GT3FSp0PFxsQf`#s-3wLXCG+xc!lnTBi0OcMv#Q^2+ux*pJ?)S}=TQ z<*w?;FdB!J8=|nUS&QA~Bv>;svi>sLZv?K^O;rgozOL{h^LTi#-o|o&z5e+Jo)dO@ z_rGBu2M6%n4=f4`jDrj4l>$}(no5rZ4iBVC1KS_~<75LuHiMmje(N;-$B|h5T}Z5H0dqqI<6=uS+Wamga>tCeIP#c?EyhstaIBf(Tz4DT5&N~FpyHHy@|FRq&y z+XmINpGngtyeMPgqhe^ZfvqUCSB#*mAUN)IqV8&BRwy z8>bNyVL{8RR}P2CslN60gP8gb5w}k|_8c;p1$y<$EoZgAFA+@PP!}-0!ds zds55;EY<5lObe(R_=|Y{q4aoI`Ky_mL%=FyL>jPFI5g{u%C{%cWl6GW5bApUZ0WW% zhZV%DBQ7dQz#Q-;=C@+{ptk!8vDi~tA}dCJuM<_5%!?nNOCJCGzD+YW+!iXEjB2U7 zw^Uik+hFP1t@(@h>y}05&H+!QCqUSRuq}%nj$6yg*EmLH9JH}>@$ao*DFH0m1#(JX zAuB+I0hzMU+&`OKzi?Q1Wk-HZyb!|54J(p54Qem6wW#Ra^OiL6R!yboxQ}Y~yZQJ-_+qP}zjqR-1wrzXGw(S-BWS{+CoWCzdb#>Le8*@}w zJ<@M~F=WMc=dDK$6^f3qiu91umdA|*u;}Gmv1#S=?^B;J<;!j8JvU%P)xF9$)f){h zTDvdAFsY4o!|Dtr=7Q4XaoWL}2x#?%+_8S=xBpOAbUI=V^zn+-ahQ^u>lSLFou?I8 z!(XrU%_j?K*$vAF>WSu0u`hf%9#IDe>u!fc_NsYj{kjOh>4wLvpp&!c(*mpgl4bpv zzUEz{jx~>4vl#L9rTuWP_30YTJ?1y+8EBPmMjG33?PPd6Zc+{CT)f*V@XYkg1?w?1 z$b7im#1ZQ;9&Mh6C@twkuFb3Kv_e+(G88Ziik^!TQ{jp2)opjs%>O><2(QlHZltME zCe=SZSlcyr$!KN4I{Bg~m`k+*wsojY@)J`?)NhHan%~bO)y^#`PQw#35oD;H^L#~% z`svb^meJj8J5J3U8JOMJX=_9xy4P=Qph;hda$JGa(k$( z5fX!5|E2?Hb&NaXitxM#%Pu*2xx?d zb;dZZH}VQ{zhE zm}%haSHn4ZY1`OZSE_Y;NE`p6DH(W4q}u(^a1?ntm;fiC{Th z!*~?>b+6=}3273pAtxvY6j7loiy}cA#4Y-3YASV_;$+XP1jSJc$VV~ssokhXvZ9K6 zJ}}=%>4ZUNak#;cMH%+v%uZAKa*lA=1^DU?;qmd($69|kled-__5~45xpPMb0R}0v zhE8My5qkY_p{oB2M3I77$;(87(U97IiFMkF-9}d1=DPJ$bq7TQpb0_NX+xO)GaK;J zPtE2Hj+0L({XdMhwYCpuUrOdxB4R0g<#?8FpVFAShxt|BSEVm~ELW80 z1e;Pi#m~?MBOCEuaq=jMRHQnU=l0Ty-W1=6!uv(wyixN#^&^}~MPq~gfT;vheuIpn zfLEPdlT%swo&GlnfETe8`VfYgyU<0te$wsQU`o@jPwYV2oONYJGyzx6S4lvc8&ic* z-d|G9^-eJWC=H3<7t&#vF2*1cnk0}{0Ob_eOS*6ZlLj}GfQzxCP#bXD|6$lp8|YHc zoEC>GLLu1S-mP=W4eJuJYY1{b&9}O}JOn`&f3TCxS_Q}g`e&F6uYf)Y|CVMEie&)z zB2HtUMhD15`h!eE|F`B%JIMF_uSeEZb@2luEyOu|s#4TO=L`|=Unb>1ut*5HV9-vP ztfiNV_@Awi=H>{P(4INttjXhsLb=u0Eok$49UYJp<9v$-9{9kW#LL$f>A`uyEVK>r zKa_syH>?O!fLs<-Oa~!x#6C~Npaou z-dC{AM=yprekk&b^!veU^PHY`nh;9kCS6$YUMhE)<9)IG* ziLe$VzJc+;s-u+VBA^NRn=neW-GIaRj@kBVgW<1>wDcBgDe}v7oNVN0%_t=i{27)1 z9>d#v0GgB4GNS9D+v#|Cpp(}*G1X}{?qFZBmc)&zE9p-YE%ZHx0~)>cVTwPtH#t-C zsAS*yU9`O)s0EG7xLy^wjkybzcmD!+Qv-e1+&E4^&Z)dZIh44HF*F~*2{w~FFK1$) zqLjs^JsW0m4F&?f4m39ry^$KP$kr5il>C;T0JE2Gp>W?LD~L<)u-K;su7haaz>H5( zV&9+2{cFjFyCE(Lp%MxPr96BB$MCegDrEA&+8ia(zWMM%I`}Wg>A*$u#k5nF)92fV zNcy4JEol(44v3w9Qk_?a7gz9e@6laSi|%RKO`0Ovzy}wdX#C$hA8eo}LmW&s79Cw^ z0SuzkuRIvmdpy1bu%3%kXsfsSaUGS6h=)BzbFWn(B_cVz%C?*^%d$p185Ko7`E*@y zI3*4)9502AkFpEVTm+sKm?I*BVVBvm6MkShj0Ri#9ZzzJxnlx8iP1$^*zb%Cs@?(| zg#n5d7vitA8u{;*d6>`F3$%P$W2Ju*$vcE!9wz1V3Ha(QCE43=@$q7m zWlgU{Il;Cq|N2HcLKNtbY)c4Bai&P6 zl(K~Cewc`NT1_8tf76?>GRVka22yCxLfx4Jq~%hBd-Jy?>4jc(9=83BmC8>LLsk|X zrtQa{U-7q|@1tN?0^|?-5PcdP0T-3>e`N6lT>OwRT&og%{BjIQGj-TA32d&aZwOx8 z>jcK*B?yQNH|p5ELsl;$u(7+}{{-JEcSQboBj@C5%Uc2QL;>MqYWvNww+9B{Vrz@M z04cx$;o@kc0|%Y|opAl`<6LQ+kf1I|oE-n}KF-DR3%rxH?LdOcLxONK{}1ra#mdd~ z|L)_<{J)9y9Zntqv7de!at{>C$ANmYeokN)R^RcP$^|K=&mT;eNGS1yzZ>Rcn>fw- zYUHf#qrG>BeS%A4xj!m|LIALoR@Lv9`-isAO@oKszJXl>!SA=Wc)>5N4#d6^!@^j? zzHNc(rz~}fUu(fO?yTnb*Xw`3&QG;PrIf50&t6CyMhyWmxk?{tTXO?8p7vuDnJc+pM z@uu#-DiH7FFl*D*2!xQgLK)bbA|?$|OgZ<230Y8a+g6N3M|jlQ#q~Fe`v&T z_WnwD{}!Oxim7k7PO7b$ijpJp#y+^f#}jrX)3V!HI05q**x3{ zvD(jHo_}9=c#R%4i@6&!FR;_Q%6qrLKTx`-6=WI;$)~PXUB`XDI;YN!zhv6tlf{D9 zIq-LGm<1Wa*1StD3YOV86Xri`%}e7+eHT4<&jl20&y}Q1ojQU=-h~q%#KCgV=?8Dc zar=sFRnhiq)babdU)g~wlX2qti0T=6-}qq+gVn{F*K@za9# zb0BwoAsw`F0rD*P#L3n7!a}Y#^LenP2j7C38k&%2iVP0>gGCKZTA-cFD6dpKgu3pI z002D2P_;QU<4C$VUA6rZaE?prOhWHLT~!C9o7IK>&gnZbp`Xp4>cpYKSsuYMx#=36 zu0e-rU{KccS5V#w7tK@Ji1}0r1g>V(y{;qTHWCS=s37`ZiONv6%GpNm4Zypv&38dg z$9GsK2;w)C5!t{L{~V%w6ZwD4|M&;W#6uRhiAh$G^1VBjBbnjXXpt!tjpi8x1l z_2u}Kq~lK&v4=ItE!J~^PD-M9pRTtk*f+M!L9g#r_0zk-4?{5UW;YmPsPA`jl67Fe z2=F%e!q2aJ4}k*OmnTRD7FHer*OKn>uyvteh45`Nn1MEs?jc~ah@{+Szdlxms(=F8 zu=9FF9o-qO2tzX7>}gPpS-#-ZnR_*yyM_jG)AwuKG48g(j!ANS81XiAjb^;$EozGS zWGN&vbuig_mL8%E{Sz;W>+{1jCnpzX*bmuv_ulx#d!nu``9SUXSO^gfQi~QXS|}dI zYlM0^e|9ND7;`Wkdk;RS(3v&|S^!<9xSIscsF4eecs;vc)RiaAym`L*N6XA}+SDTJ zOor4XOLo$6&c;jVW42hF&xb@EbDZl{IIOasWh~7ljf+ZzC+xQIC^{Ah9f$8F37JnE z8c-*w7bg?&Kok3cG7^pu3xLA z{h#?XvK{7{-2$+=3b)PEBLEw3j(w^QMbMSNq~UY(7*{#5`X;?tas=5Wqe^L!otZR` zif#_)#1W`g4LAjdoZ3gJ``OxG;inIH+zw%)5h!#1aon0oAlYxM78lsg90@KX{e6&Q zDIo+E^|P+8WxaX3*$tJiX{V-~lxMJ6X`!ZP*n6SfdE^a*W>qQcJwSn8Nh&;bea;~W z+~!-Q6jiAf9zODZjS$VSft4(N@P4~p26B2chw9()^!+sjB6JF8yLdwGY0Z%70KIrmC;c#3xT2PGbnY9Lu{1hS4n~C!R$ou38uG@4SNKlohYg;3s$sT zF*IFiyen|0(LYR1;N2TbRb4NL01IjTRm`&x*d|PZf!@Xt89;KFqhrG8&av?+ngMl_ zS54A1n&8EBMLD0WEINxj?az*nK^8rB(c$O!V)x9o{btdW36Q!;fJ5jrqhBBTH)Nlj zJRBC@OPZ;(wmXf(GGo~mMiQ*$3ajAsuvM+Xz!9fS9_9T4 zpfxg)>I7SD15hDmYU$486rZ#1z%;f*T>hy@{VHRa?uro?jry2)1qEDTc4%p+VnmAd zNb1R=v#a67JQ(FLE(Vr^ zQYR%N14&Kn`q=xhGN=a;O4t;|02%)|ApCr^y7MF^v5m9pqvMyAL%A3~H0Zv91KUyQ zc4g>~5MO(PAZv5GAYrC#F6neDI%P_yq_!b74Jf=ppcvO=LTq*deL;x=nrmW3$d}DbcIAk2>=Z*r`oKu;-ZJ;QS1FWjSIG55h?C<$ragLmpl#} zWBwt;14g1HYOgr!m-3fA8IDKE%)InHj+s@pc1SHHOH<#3Uh2QOY|S6V+Z&l=htd|@ z9zfvshb)ke!>YYK>F7!sdOEZGOP~hN@F=%aX!+5)1Di7Su{qA$v|$=`C`o3PgU|r# z3`4on5;M`on)LftTC7}b)Hv@2?WlW{JcXsX{n25a#KyskN7Kkk9Tv%ivSqp@&S3>G8hQ>g*L4;9eDkQ^z zj|NPnsMTUJ>aVvS=E;}-sn6H46w5;H`*20;c>Z@|yq5h;?Bsl^Pw4@QmD9OC(+L=c z+ORBbMVZ$*oD3P?a<1NY1kd(5K~C6B#K7Adc=;#~Ve0Cs$-}s=lby#ZM`<=>`6UV5 zST>3m^_5TC&33t;|C7lgfaFT(_>!eU7Dpp-S6 z-}uLPk+zK%&ZF-m5p346cQ15E4F_oE>rm_pzWzEMepuAbUAyyXmJRn5E{ICli;c{c z;&v&|(Cf(Iwh}8MfrTN%E)FE*kbdpK`4??Qi6gf1=DZUTvc^H(Jc1cjI|1B{#_3QM zdX>(l*ophTL0L_F|D9|nVfDw13C#@58cA}>t)4m5~<(Y!hZvjy8CdEerp1+{$0T$o9?4XQ4$ zA6Qlc=#VV?XJIGyL`a0WjI7C%*F>3uAtVS*y4XJPd-H!Y7fi905GoxqNYgOvq@MWQ7dznegQi}hpdXC6iHSP5D7N| zV;CpC2G?b7ozaTJ~@KptgJ9Z~a@@2^Js=AkVXt^b0)LCvZU}8p*~QCn09a9ad=mtb zI0H|<;9eJ>6e;Uw2ZC^yP=ez5K?WLKW1~dXssOYK3Uaut*LCEyV|<+^@a9|xx}!p! zHt>t<7>s7Ph$xQwg(#B2I#}1ol_->k&Iz0R7c)$oA{k&>ps;U!-5n{zQe?>hgBANC z$}7yZrKC zxXzog5KP1nr@kjXI;o2^M*vl9d~obk>*A4!o7OZ`Ez8kyNyAcmzZ)%kMx+|87s889 zah02H`{ff6ipnv;s%0eVjVa1t1@%+W9n zeOesg4Kqw;7!Y9WN&OTnv!1gm<>Vme9Og?QFc>*R#&|oc)pM~Vb{)-6-X+4p#Ws|p zFk#9Rkuka$HHbCiK-?N9yx)oB3Q*`GMH_vQ{I6Y+t{@_Sjj4_2omqWb3HAEzF%e@9 ztrwtm1_3W6Ny1NId2+Pc3nZ*s&kq6X`+e8Je|`^r_edumsDoSyD`AQ*nKWI4XE6Z% zHuq{M!r7jvZ1R=l@I3#b9-A_RO8wS^5jtF8@#mQ2e&4eR+`^9#esWum^$Dxaj5^9_ z3sZDa`k9m_(mGR7tW(@F%o3EExBl||(k_YY*9%sYDC)7|K#tDU1~%Mw83 zk!?$3FK%}76kdN%X8O%G@o7hcl`@9Hwl@JQP}@A^jNLaWo4qVFOAIfUHJ%V5P2i*4 z=EWJ~j_5vQ`SWfMw8hUJE}3Y8lvi0>mloJ{ELEbg{LXpQx{E61r=QKCYagn zXJh>heaacTPd&x@AjQXmZ>{J)BLZOg>?OC$)+(1btNjfX>Z)(LbNv)RivkuBDe}?U zym;)R($7dcOZ?8_Jo^EX5iRsXoDb!cJ(-sZGbCbnD5!_F)BSS^{vK3oCm)uFdd1EVIwdh@F}GUwix>)ivU1kE&y^LMMXQ` zkU~h%{zFBzx*nIp{kC>pprAlGoc#Ht9>>eyZiFS0>;NUh#V3>p&ucA!7M=2+40sx1 zESX^l0_?1$tO^97NLHkKaPK$OQ`u94EZ+6R??0(WZWK&^6@x!vjO|LW>~GB~&btSi zip4r`7ukVbc{+NS7jkDz6%O!DnZ73Z6RanzvBImvNmDNmD5&X7N{A zrzW}WdQXl0beJ2pHM7CxB#T+L$}e2?gg7;rIdbwDUYWbU@T}oRP5v*^pp>?sHPhZl zzCrKlB$kKYnw+6Pu}@r*W2TNE`!bX_SFiS3s>E#@ek3qo!*ajLC<%aFn}jRt6htj; zZEa_dr#a(l)kZ60R&ZUz35Ozk%dgta{lOdY9nU7&57Q>uM~$oHx6O%_fqL{lfRwcF z@59k_k`g4W!c&!}FFQqo`RV;U?W;9r zQ@AHcg%vVDD@d&`SToKUy_3O4h?iG9&({ubJIlPqDyGL(7SmZ}-xV)Qq32Da?^>T) z=)D#iq1H}P)69ce`nL}-s&pzcS1|F*tYVX zLC~YXY9Ob`*;gA&USQ*3HCIwm)_>!e=2HO8{vmGYSGu7;DQ*}*G1@x*x{#yDUV`#E z?PxLiQpks|0SwSB;`c3zQQ&8}jWk+UE9gSyOFl0;&Y`7(IC+i$vJOY38#Sp{_%!6?c5KISmW1qa<~>#yb|dd`4_00cvlgM|wnW_=fh~We6RLhoeZ%@7Y2Pk2<)yIRo48{m!)Q(Zy)U+hBqA_@ZNGI@@yX3eF^gnRxcd)xUlYM_puK?khug%w5tjres z0Ou$zvKp>xMx|uFztguovJD&#qJQPB1Tz>L}uf-^&WECF^YWehs!23f5fTI zp=4A9QVTYe7hZQN6SOhpHlhl&2{N0I3(N z+?_5B+MK8qIa$^f{_ql$I;PeM8suBF@m8Hwv(gaH8^&x{Q)GX{QgDrIBy)H9T#Cx| zjJ!*TT;;oYCaPL{jwdf*J)8nG?BR~07h8zu?~0)XY>(EJL@A78Micfo8`t5`EOK;9 zuBAR%nq9&pdD)(P%IbE0_znWn;G$X^-GnD;k`dHZ=KF<9#TJJVV@m)jsRD>AdlY08P-Kw4;F5 zEtWyBo!s7;DjJi%uP?F54>cIvn$h~>!BMeMrhhR7E6P_3#E*3POGn|m0F=N{C_1ve z&L{}(Pmd%=_ZINe1syFe{w(;wn3*+dISF-8DV0owoqHj0?glE0{gX%%PjO#x6xC@F z3i(UPTchDgl#6XqA{WLQhm01=LI43RkBk@Xx*WDm*ni;yL#k@fR^@XJhBa+E7_L3I z4bQP_d(bP}(rhO}Em7-K(R)=;_^A%2y` z(*Zh%wNS1mV6s_bJqer9ieofvlSH!IYBWg=-tzGgJa^zh5fkVQn>lhV=F9g#DQ1E* z9j%R73e>;(ojcAlN}da-TaN##v21pHbM;Mxe$7Y*sm3h0ujhz20NUjpB^ix*RGKI3 zF)<(JjqPaSF}|eQE=3quTi}WO% z^jJIzlsj4iIR91kYifOGVWp(B{ZXngyU|jgMLS+-BW~>ASqN%>4~WDIL&t6n&dUcE zj;697x4g%Y`A{Rc091~Evu+TXKo!a<_9Q8tsGsPlUX#I@88H7tuXP5EHw$W4%v6Wv zNbq{kjsOMzgYj%+Yy12YVMH*u3UFbQF(7w7QtR8LC<|N&It3 zSCU7wek0|)h%O^?;E-CL6T@eqPI0j?prSW#lB^cwz@3eJC87iw7iOe#_y@-6Rr0;4 z9kc>>^j!ySA24&%nBQz&%(ay5oaKh7w_dQ7`5=N$eYe$yP?kNzK|Zwfc8f8!xpDER zyL+nX&O<;mMU!oc0K2N)YlKO2gR^%3@AVRY5v-S!Y`n$0{xh?)9|rgSLo^%rXg;8k zJtZ+jN&T1sOZCd(RgNm5C(EzAi}nGr987gCUQ(-%13)ep*t8AFz@UyDg}!@J(yGkt z`ei(rBuU5faC<)Zfzsy)q%7c5k^Plxe6>WI!Vq@pzD)9!bjnN;epAHPLda)Cez?*) zvb|A7^4RQskY6oRUBjrozKFS^$b3f4H*<&(v#~@l-B|vI^sDI9yMwbMcTtBxA%=9- zhm^xR1VCP`D`v6=p4Ly|Q((d!LiYrulXQ|XHzF$!Ph#e!7iLS_U7i1Q>CLR)gXhdtaf+^pTi zbl#>q3EpD#5r{$FdL; z8YQSXn=4!DVlV&76c0ikL+yk@{e>JkH3~s+ZB+*AcCiql|SIM{D4g?`(e(??rM^=)cv5vC^;n~N3a$A5Y{#*-bAkEJP*P1CXV$2W-Th;VRJ)=F6sXWWe#j>p8z{iWh>@cF8w2teH+~_-J zVK$}aPyzc3;&tf1;NA?;v%vZm5z}G@5kQJtsR(33=|4TN^U2}p9CG4zM-&(=JpE+l zI&$_s?M6C_C=hTtMnyN*l$|Fys)rac-|5*hVg?nJHQSa}Y1`$$i{{Bqa zS6_3GzcCDYQ_o`6+^JZ>AMX&ObPgx1w}Bv>f8V3%PXXO( z!xbln#dtG>xwcl%#4uPTNL5a-gd()Rotkk(5X@Q12BjsL6z z@EHp#G;Tii%hI+rMiHuREFS8%)ka>X$urQsH`?YGp&pwrGM4y0#Q7%bSQ3k6&B3cY z>7U#UBaO(bKYffdX*md1I=`BejVlie~kDFAkdUIVyy-Cs*Drypaq!$U%q(v;m-sh2|4Gmly^qYTl%4Nz}# z!GMyl$uHU`nsC@1o*^ARlLhM<dOS@eQM=B z7r-4GKVH=RFQOdqZxln|HNcR>@oNUdJz@g-`Ruz#U{Cq>aGh*RJ)Vr8Znk0U3$b%* zB08O2aHQHxA1CJT#rJh3|F@b#EvA}}uea?^1@ED31z+)4kC$SWcOu@Rv~(V>56f7~ ze9ePNTtR<{H{+tcmspM;T2TDiGJXG5C%i@B=+({@Hh09c!UIktg!{35i4wU1Av00#rPL4)r3>*_&!ix z49#k9Dm{1`8aq1WQP0e%m4(vd4U5H+Ud2u!)^Wzfdj+jbC_`EAq!QhA-gD65hzFHB z8|I27eSUt2hu@_c*Ft|z8mBtf&YXa2BlKtNTp}0W;sz^VWAQ%IEc3gvv0re!>n3_B z&6mri_JM}A6j~+3C5Ne#?mUf6A=QB@~nj_Lsepc7Ftl3*cbp`u`E7m-Vz< zHb)!%`}#oQSNKczuVj`hRJ~%ax!g&3TTRjkEi)RtimoGE$+`Q!{dWVVfWWAgK~OtX z(S!^G^vnLI3S7x)&1g&XN_Eg)(VG`_&fIiOKKqWMiepe({QpJ0JxPf^Ows<#u4CG)U=5h9db+!GCrv zTKY&rbB1K1NhsW~$kY{N{kQ@I*~7@hI4~(Ji5z=^CB*oS>VJaaJOfxnd9-(gL;)xf zYU(I~AuEO%lOXD;l4d9a6o#|3aT=(e&|09;vdN?ZVcx(TH283yLKkiaezvgu`)bA~ zY_&lz0q`@Gdr-K1ih-J@bRtByh%v$>0*WZ$=Tw(#49dHFoA=%Dxf+q2DWXEif08q= zS$5`d!1t*GN(c@zW|BOlP#yje-2)I5e5HD#=OF1LIY)|#b&u)Y61$)0@1Z>2z+%`+ z2&lkoB5J}STuVn3qp6n+`QzcJM;=<7ixFR~oEe6NtnUNR_=K^h*-&d3D^1QB}?K#QWA(1c^Eh`_~aGJpu&r5@$D( zXehnFxKL#Kk+}zJi`F&FLPXhps*0^IWvL&@vQX#X=-5B#RO4Gg38A1*@vLU}9FIg! zfQ_m|b@?jF5Uj#^9Rt;Y2qWM%Ed67CKQ+R2R$8>i9&*o6o^lT{!8@t}?Lb>&NRUZv zh7cg<-Vr*Km|n^-m#Cc30N_%A@7xkSNsGu>CR=)u-HYF{Cu!&fEeC?NL?`HvZU(1t z4RRxXfM*T6Kq$;~?(w@$avk8K-0Us#Pbb_DBgX_Tvkc?@V;&~YhgA)042~K~MGmfJ zJY(orI+##L)_E3!5dJBp9>hS>WGJpU&|Tk4A+7 zJHp?(d7bU`Af&FE%JM%hIpPHg9O_%ci05zNY z9UhOkoFXF+@$(>s0gj?kKyjq7@yg!{R>71QJwOtkGE#>@He?RISP=Beg4`1R-5kEZ-aeK)AGdAZpk4G-;C}&?@S#D1OizVEg@ zeikwB1V{Vg1>wtv$ZZe7y_y5;a+p2>`1n42Su*MN2E`-B1xjlI3J-K5MX|9c4Rzl` zK93*D;$_6!w+-OS$0snQTiOSIDE`bB+XJpNsi7CnG7RS5BvQmfG^ie#|_Wq zT3L+F){9g(qaTaT@UGti)28>`5s>Ape#oucZU$8S0{Z%3HV;SvGwcDYPReK94fr_w zw4G#xqXBYa^8_2~5C}NcCY-aWjz4=?mRMiUz+W)g2N3UlyL$P5If*595rJQSazU=fR-Bi=3_D%^~s)LS5jZ4 zAm15c8d~+mY@lj(q1B1K1j_7N3Z4Dor9N}zNy0atb@VghjM-!A2)GQ+hwUM3H<~cd z0yCFS0l>-!EW1vDiCgXMGwBxR?vDz0=O-ULse5)RX~Vo`G4v~cD5YQ^WRteP5*} z*QaSS?(x9IhoSb^4C(PAYK5GW18@@9Up^62?xA;X6j+j30ugC$+O5BAnMt7z> zeAtA$$IazQ!ClFR^Xtt~69^ID@rW%?!5>4>V@3C;jElajd&jP>@10RBgnTDL;%2@q zLG;k<_wY#=D5u!$?VQ;$|IY0jN7ItezZi#PWPKoK!LhSuxSOd8Gyvw=GkhYM;zt{qbApjFKroAEU{ccDkMK6>zfsMHN_lZqP$rNBs3a zcZYnVM0$c++T%ipcy;#(7n#d6kj61Zh_Uw}%mxG*k4ASFpJ`3ZmW2Ba_`+ukRc#)( zy`TG5B0vi6tF$6L##>p5vFV>T0PD~!4(k+7UQ0DjrA_OU)zx3CMnc_;kzd4avdq4P z@8WhA;=cg#jHA0)lj#{tz1DFzL)MiIbSBziFszzUoIS@482Y3*&MSLzBBu{lqSRB zN=2HJ%#-kga*v}`vNw1eAlO?^Xaz@X(M}B3omOl!A4ypqFl(TmNGrhExu95AU*i4s z{yu;C;o;D8J~`^Evwcx)rL%~>?50Pr1vm+#t-Cx6Gtx@0v4_8psyZ|(rFRd0JNWO! z)-UdIa1)!kw%gWX6i>s52Tp6wd-;!8S4l0u@5@715n(U*s=z2dV5ugn+TKsaNo;oz zK73N(#}_Wzg#6*k9yc#{M>S1@k@NNOO@Eb1TdK9)|1c%0j&kwdl#TzBg)Wt@dTDS~ z1~So}tn?AMN0^$@)Y)%lA3&(DkEf3y7?)-fKf|-1p}`zH)1PkYFAVBE_UXrLXCQl2 zrzvdc9-V=|L9@OBDDLSPy?Y)R`vLV1@q)?of_P9>le+amH}*R+W9xpsZq(H^xg%c@ zO5-wc4LrPUHo2=<9T}d-#vwe>$+WTkC2EpT1lz1YO;ACjNl)qr>*b9WodXal4S{V% zk!uhKnbmCK0){w0mRgY4C@QsUF}MbLdo`z9q?kI6-m5wQI=>TmE@qFUY{UIIvkWe< zfg+LX9D5VLxPRQZ;E>|bXS(7MgT}8NJV&k9#)RH9;cUwn_tAH{b%CvE61#nVuU~CU zIJ7O%FROB^I4=sV;U*_Somt_DH>Fa|nHF63qrWsy`MH9KngSdykkvq;(24q=f?&fH~u_7 zTs&CadsvVuoexK-b9f3rJU|K2(aH1F4XIe%8=Zg(oA|qFpErRiXo5n{@1bxx{6iQr zOmBXPgS-0}r@XK|DEq8#4K2dBOl3rV-tRHW)3H9x33MUJqV#EMzNX3y$bLR~uGqwD=dXeW(Jj(;p>kWeM4@I3KQX>G zWW9jv=~A2;ZcvrwMZu)H=A$n3O38cIAp2l=^`-MqgkBs^}CB*Q3AmY}!k zNn`i18W8c<9rd40|BD5M(jW;69vN^?Ea(^v>VbbWp^-9cVh1Bhj%9Zr4n3(K%nRrY|PM!kIpVdfPHQoWU+gs*ZQk_^AeSOMEz zgke4$s}8G*V^K{&&%SBaOe#*Yu>Dy=lfbB~ko^*p_8Yx74kyuibMGp>MbyLhDocmz z#F~$T@8{>!{1Bl%z+sE}tuVQ~#^*3@0<#76_VC8On@$~a%^H*PyAw8x^Ewz`CJSJF znH}>X==XEA9ltxcQMy4*e+bjLLI>ZDKE25zbXci2R=YgZtHCi<)@oGSYPq|r-J_~w zq0iUjar@TAxhslfQ+5??-?>61uc?-edupI*0QbTHI2m)kw=sY{exPeGJCmNtjtQmK zsU=}Yvmmc2tfS6hP*y0B+{)vH6$h|Bu{j9euw!il*+*Z^QlW5`%>-VOQC0DS7*MF` zAW9cyDA?1L&d1<9@^)GEyN`5YbH=UHSP#Gt&sY(6;EI{h;5u+MSaGYT>csu*ci57K z<^SiRUk*2T6nntqFwj8bh-;$IUp5p^DI=(nHEKVR;2~jCt9Y`Vq}y?XzzQhx-nM?) zboBLlb#it8Ja+Yb^C7*|(%IkF@KiZX>*8w)9cfkeGtgZ_E985NWEXrNM~L)*3dst`;~FF}q|mTYPsn2*v` zHq5&WEM*Ikr{na}M#R0^%mVOnMw&D**6+PUMR@0|^!PkIFgo-_R(q#>BKRwF>ggz4 zCv`Ohe{qr{(&Uw;P9O7kG`6R0x*yHfP2_4&+w-dNdOv-2Z4zS6Ij5Bz$QQP%5zv49 zMf(#Qa#HJhI(-j>(R}V+>L8^mFVodlu4|N8gi=jzk{l3?k|P<2E)GDkVYu?syu(Vh z(}t54I*o$m?>eE?`7wms^AG-VOn9qtWuOxZ=YDGIZs}ZPHflb+f%QD1+W;;B^1T_I zBU-(Q*R2U*+z;w$@MyOq{vh$0>wnt&#%K>o_nN0&O_J9NQo(q>jzsBJs2&A>9y%xT zR3B^1)QY*_={2-@9|CBL_If}b4IE0u?+UzO;33txLoc~5wme}K9>g{Qrj32nSS4LR zEru>~bQ8_%N5y(ZQU!K&c*)~@?y~G7S2l0ryxbqBw#yjp`*aFD)^Qi5RNJIS)KV5& zA=^yd3JTAoTpdjAwAh0(JIK;Eba&|!*Qu>;do#=C^p0cx<^oi@h<_4hcQ)k8eP*4l zFtnYOj)DvlM`|>cCt+t7Y^jY69Y5&2hjEk{R@Z~aid?i^O#_*O6BjD|F!-bL6U9!` zcN1U}rI58C5F_$6ZX2>OauCDxv~HmNveb0YqUps8KBh0U=!qb-Bc>1x2cXTaX~G|&p>TzCek94crus? z78fm$8LF6(CicM5w%QXH#sHZVXmb>9424G!e7GLov>qbig(sa>JMXv6 z;)rUqtbxL&dSaS7=5!qRjK`hH$ogu?uM}?0aCr)?5eXf4OlO+^Y3C&^OJx-Tj ziHZf^yYx)dNkgno98UT-ZS3zPvAt5%9Clus$FpM0ow2Vo3m#($9#Ev2jZixrvBj|$ zhMLJ+`yX$7<{8E^14fzURxF~9kb0mQ6diNIdIgvfjvZ+2ORZ&$p-xdN#wTlvG8tv~ z=+bj=RlwA=1s&-Y?@~NKmQf-U`0(GBZ5nRX5jLaC`!T`fLrzSX1*)W%swf2$OxdwA z@q6nSP{)Vzeu`FIN3s2_%CQ9E&iDK4n1gZUm3zj@|J)qa^>uyD6I)iT+RHs#LA@KJ zsVj~q^A4QxRr^i&AB9^1!1LqtD$Tt9brQoOKx}Cx^Y}Oy$p^btcEJm6`6& zA9v`THqyyw-MflRoNl7<>Q1Zu0TncQdgQoB(fo(k0o|9m2Ih4#LieD@P^ia7>hzfb4B$Q|L(%w#+=*n7AAXd*bTl+^xzUK0OtKGyvJebwACPaS5lF*->#1V zpmBMN9~hVOJ~=07%92oZn)Mf0iJe3H{OiOE`*2uxy6I;)c2%m5men_wO0X*Dr7!Jp zBsm;$r~8{iH?4k(Va~p@mB4V&uJYb#JIOEW;G>arKYvOl()qGySOMVg^T7#zZt1Zh zvn8~&B8?`u>|jJP^yO&df#i_pem8pyAlo_0675T~HPoP!V1>ER0>XsIau8O6E()Ev z6+%vrcs8tXk^K3U(X79^^5t~*J?wqH-u*t4-27Ce_Jj~uma$WvwU~=go|m1Dve<$P zZY!!E*EpT>TiU%bfo@A_l+tzbt5y=^Jk@0rb^~%tQ)|McqFw#Hwni5*+0L+l`ih4@ zZC=w@Iw(6HUpJiP`A%QeUP&`2?z%oKtpq)Zzi%h$2dd(0ro0{W>;G3F!}&#L%7dgK{>0Ek{5{LyacGFnEoEKRY_~#L zwza%)dpSW#o(FGmSzS8|S|Z5>Si1^c(H&X33OVp@*trV5vnc=e-*7I;lqM1yt~KBp zf-!<}JFDU^RDH)(fYqw6H+Tsf&o<4Qb4gZf7KizTC5)0HEN{KWm-3=|_+7~*H*$iz z9#K7w1tIIk*8@!s8eonWI ze^=O$PlI=#WqeF-UYF|*`l}-jh6a@X&H96$dc)ph*&tIF zTq;g+*T$E4<<&1h7^i^$bnq>xX9D|q{;FhyraZN_q429nU~{~rLvXu6{!I~&`zJH> z&jY{iFC*M$KMws=cnQKuzE}=G#~51v6~lu~$-zk?8I}IV(vhUOy=WkE?f@ZyS;%2< z8?8KxVX45`ZGPzht-K<-4de7bIZGwW0I%O8!Yf)BbQz8w1|IOp+DZlHU&_$d5r?Cr zXyOOS-e3M49j%g2(Mr|)e~$z?TP4eZoVCI^6!Bo-||Q4KiZdn9tawQ$E(*h zews#+0n%9j>UL|hU~)DQbq=l|0td5TLPZx^+^c{}&2>WvO>?tg%)Pi2cy%CBT24oh zW=@%eY8vWH&E>N(rWyB>w3f-VwG59HF8Bj;2JJ&Os_YJ{*hM0jlWKPPV0CnLgHkC3I|gUcMeV{#?%15zww;Ncnb@{5v2(|^ZF^$dwryJzo;>e+ zzN+v1+10z&Uc0Nif2`iCF1WZHRkOpTp>lUE6Y8i-eCLmG%z{WsKP2kS?E=Qw9_YtgE1x&O57zQ+wC-wpD)Vj@77} zzx&6z(Gcd>k$gfR&9iWwHW*1N{A->JMEdhTP^{Nxxn(WQCc^Ec!MB6zE)Tv<5{u zKFEBF)8=GsE>b0R+_q*!VyaU;9qOCWs{~i=*RTkITcYA-fc~nhh}=J7OmeT{(YO7l zQ7IrB!&~H94#`V{@HRPrs(us7J`?}o#@;jFKYqE(6FHOAcBzrh6WMyL1UxWkP;1iU z^hQ8pZEi+TFPgS?9zz|m6XG9Sl4cYs$MnjqsT#ON;J)V4_ISb?f-6jND#3p5) z>%1rm^ZV3$YtTQ_WA~P*fDU!uP9#KxuJ?DzdC85Vu?JI^-Dd#0Vm;yiy!mgxzi%FH zvtt#&9W-U=`THxN)&M*}QwUxF7%6mJ0OIDpTEHb7fSrlue*|=zmpcH0px?6DDY^Rq zw&vemfFrQ)AV*5xK7h5^q8FeJmBOM4PSt!m0x$;sj{MK|PGf+C?+G*0f6LgK`6mED zuqozV;MC0*O8`#Lluzt^}qGJKxU@@*VC}k z3&!i$^7vZ5O1Y#1xv+3-s55Ha za;c_Pmbs>~OhxHYiKR`W*+cQvm;2N&MV*JoPyVlE3AyWyR>vvF?8i60=~m@J1Ce~i zvUJEG2}od&986R;8UZ%XyL$)5iS@ZxrpI}f#~xd0<|jhtC0`~zj?4X1ttV#(Q1M@z zO$A4{!sC8mDZd@8QNYZRO{cg=bI3Sm*Yj1V>(=d+C>ug(xMU&BY}`^grLs`D>xLB{ zCMrAmLsIO_2=}hz-s|(#`Z_q2G5X2kg^z(tz`ZEI#KX1#R8Hihba8N^`h|&y!_DjT zlq=2{1$}q@s%UO({%~;mNqQukMnItbY{U7ra>H%FByo_bn|JRoVm1X66aJ8chrK7j zhYa+27|wT|eztuOb~-uW&LgfS+;jC)m{k(_Xb+xDV|A3z;pa+85 zNsm7oNHLd!)AyFS!?F;2m$aG-ZXmyuf&$LPIgw;ZVa_Evk#0&M%_TgLbV?DT3cjL} zGRJ)$z_9qjlLd_2A3)rZU`vCI${d*7!MZ1Pi2IM68)IS1ipO$}P_d+UNDamQJ)mca z?zn8#)1=Vo5O?d`1&t38@FPQZ*2l^_2&7SHRC%-y=z%13)3z8{p#8Z$3vMA@)C$xk z)(wg>#OXfYT<~;G!1NAg$DeyhF>TLiwzXYqTD-Ec7a!J4=1*Ru*}ir-AK-vnlXZVj z%?ks5xm2xJUCgxg|BF`o{!?M8w~DBazDj6Qd!9IHEP3AJF9CF2FOR=;SO|TUf<{4Z z5wcyD$;vU}zmKyXnc2nUB~6_t(Ezb{RXvn>u1{8wO=iX+qfpo&s?`stzEVEXnY`S`B$YJPJynKZNCQtm+VBLL( zVr8B&m(^T}$^;&l?up_m54IYzIn06ASnk5jp>{h%s?4?~-d|51&`&+5jt-D#enATC z3hd9*2+$sP_sB^a3E=V})B_Wu*;y#F-D*M>hooq|s_A`pacy!-z_ zuu|{82d15PC;p||%e16izv|_vgWha=#DMrGbDs}C20op7LVZ68aeIzX+wEp5e`%KW z^NDaV=*M*Jx=gt1RX7zaB4P~m>|5YK3U6~#MYuW?M{479uepbZ+0QdvuFhw5y8EEd&-2uNv~x$QtXIp%DnuxE zOgYVr6yagfWI;m-P7Q2tT#%)u+g87;J6(IZn8n^_J%t#h49s?9V7RY(hv3*GX%O~opZnLu;GuI6O|P|N zyEtFDkeRrVn3;IUmQ%f7*jZqSB-vwLXhlT@sN1R51EuU5Nd{K18)UMvKkdKs*fuh6 zwId(o8a$ZHpdV~uZ+uX?b&uJ`XJZvYR_CG?`oI7CjaU7$s%R>mhBB3`T-DiTcpQF~ zNg7d)#&SH<$|yFKDM?;bWG2o`86}UeSwQewaCH(T9+n^!U5>Q4ww^iAhiVLYCX0!# zN2>v8xqVyTy8;AAwFEpki{^Pj5lZ25N8Z<%w1PLln9Xa#aS0f5_FCeDd3M?gF6viY z(p7If7ieW3?6NZZG=UV)^Jt{YCtS4{!tq{w2yk7R)mej})$S)F7MSAoRXmzY3B0b- zjj{z%%)dO4uZ}Mn*GM)iNO?X7%)?>WiQOwUSVQMA;{tzRrrX>vk2&!~Wr!Wmr@jYS zP4ey`GHl6Joc^;(8ZOGmw|bf(eOL%Y1JwCls;=KHs%qsGI_G~p^#2}ZXhrT^6nCB7 zte2zl$hCm*N{4^zq#BRQ)DwxXCY8I|UBp;NFrFc67>k5s^-X8N~nbI_uo6Oa4bKMb_<;DqP%I#^4p3#j@`qQ-zPBJZ@MqF&e zd46e?g>wqL$DVO*q^9|?q0J@HxSbI{?Lg)?W0M($Bv*<>{`Deu&O%-Xw4u`Lax47q zsDzN_MfOkQ?DPxO~`^~4C4x9j4rtER8AbAQ(n&a=njy-5z%J_;0-^i921O!6pcmMA8jb$ zLva!u`~oxVwHCCanRPR?9}!gKS^R}R@$VPYzYB8Ly9LTsR>HcgU&9=dVXb4X%J@K8 zrTaY=rP81|^l>-G=OUw`OX{=6V;P60yuG3ItiyG08TEPoO6v2z!tBblCz+e45~m!K zsBFXBgyi3mp-DqF;Kxp=D%(guF-1C0^x0;s=C%&o`Dg1DHl0d_@j_14eO}-K9-YX* z1s2lnW^y|GHSaOpTG&k+pQNW@jD~>o#EK!bMybgVng4EOe*T1MH{M#4sc1jt~(&dt9J8>|n2H!w+cz@5xs=}v4m^_I1ZN}}6ND13#!ygiZHIo!9BKV?UIG-qf zn3d$q$tBk_$XTGmMF}SLP?`9`Z0G;s zvtoMfR3N3jwJZ`$E94!4Kdbb=_~leVdTLt+*{fg1>zWDpME6~f z+st$HrKXJ9=rvS_v-^Seo7w4Hmtr4O)1wFi&kMHiWrpfsyUY|ti#MX{KSXlxOJ#XU z)o*{5K&stvCDw7LAtqY#f=Y&aFcrE9OU5-Ey1YuA*^g1om&-gLeq3#mUUJBs;#{H; zRx=8SBF$LlF7CEW{6pJ88uHsgT8}F06Y=*n=-dGo~QNX z?~G661qP*cakkNs?Hv5n;GZ5vt%zdhVES2w)$#W$+*qEo9cEyaYa}k~ zp?A(3CS+?Y-CQkQ@sPfpZ`7Tna@-wCpXK;`CdNsuV6;h-8{4n?SY1BpVU$;IvOD^r z!yn#BHARm0)+8I)(}lVu(jIkKJH%sVH<=ez;aY2NmDDSZbf_Zs_{#d4SFf7M22K;@ z?DG1%93S0`Zoo*^A4Q^3lpR4d3+JMAO|1)oq*G8e4}^N2qO#K9lXB8D*JM-oQ z@0mMO6IEd<{HZqZ4!SvZ`>R2i*Eh?#+$mrMH~SopvvL`z_wept4Wok#Z3|$3=DY8@Fg9rw^Kv)38iK*w{KQ+Z3`0X|T6oczmNPVuBexg+7>& zBREr)mg02=t}$AmPZ)-kxZHPLE0y(Xrl~Z(gRC$L3g?SAJN+KedH@jsrPynXrjf$M zed`-gn3e~Y)gN!TTXA5kZ!D)94O|RVvGK0gZGy?e=O*3UGc~a$u<27qiiNGt zTNvgivhYysn(PcHGMz7as(%uCtu*R*CXgHOFg;Ay7u%MIIpJg63yS*!JT&uJ66mWn zHWLsH^B5p~kl;7CPN(4?K5+rWmbtFi2AuSrendb}f_P*ihjwcGA);YGWYxoht{axo zS8V;y%U?K#jdpY{oT>>M`ja7@;4>Z;)NiF5uDIvD3`}2t+Z$y|c6H5kIM?hvcFq}* zkWOVVgx{`CbUuc{IHxB&Wi&*_Bu6O;hmI+PG)b5l5jJhd*E2z*jYSMy5>5Qc6UQEs z8p42*%1$nOP@}jB7PW;=^P-{?(NJhOzqXA5R90e)7+xwK`pdl{R){2E$7H%EulJ@b z#v)(OirX@Jaar=&%B>gZFLiP|70m10daz$mb#OwmPu>%X`KaQ~{{K9=1RScDs6oeI ze&pt1a+nc}{kddcxdX!zW%6dA=epdk%!>xfl$^D)@sPr%4GjH78*7p9Tv|PyU3yXo z78?4O6yb$*1XCzL!yVH#Fg|u;^t`7Z<&B&`Q(FYRN6n?|WnfX9g#iN+K(@6Z z>I&GEh+`!D@ziO51`4-FHl$#^^#+{p+8^31saf;|&*b=aD4aO*gn6O5^I!#WgTP=^ z3&#w^pmW*4{#idJ4b?6?w6cffdGz#zdU^_U z>~N$ZYYD4+$CF&L#Ldka81nRKvz-*`BwC!wKv=dQHMmX#eqC;907FUpnWO*sr7%Ub z9;<=Oz4e-d1?KbBEZMH{{Jq%R2Vwg&4+eGFDgy~Mj`8gKZEX3PQt(5fl=mPubeAnwv*J$(Pkh#L6APUx-H@wXm z%6ktJ+LTcr=*4BmIVD(vlp|38qemoX%zQy_HydZMD7cXP>I!wNnsbXcunsqj=MAB) z@an{w5sLdsR2h6;VP`{@r<|hqU3{PEW1Q_q-g@%=;-3^;{AvC8@WHr*z6^rpfx0Xm zLnksMrZ3JWp4oZu8gbnr;s|Cy>C2vqod7LA;%vMjFtj185It0It6!Ak7Wbtq|NaXIcykTR)#5111R(Ymj!3hpQ zPJu5Tm<^e@G35xYf@2b7S~$0$Y$=tEB{0Ot&)7Os=U>gQ*91B@^pRcUe#azI^#d)w zutf3m#z~MYavJu{yLyV|?B}Ku_I>@CK3j0zxZq9=BGM1q+GP6k@koIUr=m@0BX;Am zT(A>XcMP{#9!~F#pw2`coHcx`U_=Kb7O9p);QdGoacP#B!pi0XGvd5Gy9-!R9+G`9YVx1AEdVCAT} zKY4p4@JlfzSLDt<&OFOa;y#{sXP671?N{-*j&eHr4oh5@JhGaL8W7C6DsDV@?VIa4 zKu}RHTFF-E!e4m>^TwPoyr9#M!lW%BLU++jV72OEHC)8CX;RR~&69<~7DHD;UR@D* zC}+zs++YSKIi3)!bAza0tTE*|?rL>^tfX>B*zZKc#FkVA>7GQFHc`pd|I%EQhK;~` z2g=+)_K4x+A6bch=q8gBnk8Cgbo3�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 LF$yImMNdWwXqyhO diff --git a/paper/R/diagrams.R b/paper/R/diagrams.R index 8e1760c..2b1409c 100644 --- a/paper/R/diagrams.R +++ b/paper/R/diagrams.R @@ -18,6 +18,62 @@ disk_shape <- function(x, y, w, h, label, size = 6.6) { label(label, x + w / 2, y - e / 4, size = size) } +spoke <- function(x1, y1, x2, y2, text = NULL, at = 0.5, col = hs, lwd = 0.7, lty = "solid") { + grid.lines(mm(c(x1, x2)), mm(c(y1, y2)), gp = gpar(col = col, lwd = lwd, lty = lty)) + if (!is.null(text)) { + lx <- x1 + (x2 - x1) * at + ly <- y1 + (y2 - y1) * at + w <- 1.2 + 1.05 * nchar(text) + grid.roundrect(mm(lx), mm(ly), mm(w), mm(3.2), r = unit(0.8, "mm"), gp = gpar(fill = "white", col = NA)) + label(text, lx, ly, size = 5.4, col = hs, face = "italic") + } +} + +atom <- function(x, y, type, name, w = 21, size = 6) { + box(x, y, w, 7.4, NULL, fill = "white", col = rule, lwd = 0.5) + label(type, x, y + 1.7, size = 4.9, col = rule) + label(name, x, y - 1.3, size = size, family = mono) +} + +hub <- function(x, y, title, detail = NULL, w = 22, h = 9) { + box(x, y, w, h, NULL, fill = hs_light, col = hs, lwd = 0.7, r = 2) + if (is.null(detail)) label(title, x, y, size = 6.6, face = "bold", col = hs) + else { + label(title, x, y + 1.6, size = 6.6, face = "bold", col = hs) + label(detail, x, y - 1.9, size = 5.3, col = ink) + } +} + +hypergraph_figure <- function() { + label("(a) A set hyperedge with roles", 30, 51, size = 7, face = "bold") + spoke(30, 26, 13, 41, "patient") + spoke(30, 26, 47, 41, "provider, weight 0.88") + spoke(30, 26, 30, 8, "pharmacy") + hub(30, 26, "Claim", "amount 9,281.80") + atom(13, 41, "Patient", "kavya-iyer") + atom(47, 41, "Provider", "dr-ben-osei") + atom(30, 8, "Pharmacy", "lakeview-drugs", w = 24) + + label("(b) An ordered hyperedge", 90, 51, size = 7, face = "bold") + xs <- c(67.5, 82.5, 97.5, 112.5) + people <- list(c("Patient", "pedro-alvarez"), c("Provider", "dr-femi-ade"), c("Provider", "dr-gil-moran"), c("Provider", "dr-ben-osei")) + for (i in seq_along(xs)) spoke(90, 34, xs[i], 13, as.character(i), at = 0.55) + hub(90, 34, "CarePathway", "chronic back pain", w = 26) + for (i in seq_along(xs)) atom(xs[i], 13, people[[i]][1], people[[i]][2], w = 14.6, size = 5.1) + arrow_line(c(xs[1] - 5, xs[4] + 5), c(6.2, 6.2), col = rule, lwd = 0.45, length = 1.1) + label("members keep their order", 90, 3, size = 5.2, col = rule) + + label("(c) A hyperedge over hyperedges", 149, 51, size = 7, face = "bold") + claims <- c(40, 26, 12) + for (j in seq_along(claims)) spoke(152, 26, 130, claims[j], if (j == 2) NULL else "subject", at = 0.42) + spoke(152, 26, 165, 41, "investigator", at = 0.5) + spoke(152, 26, 164, 11, "witness", at = 0.5) + hub(152, 26, "Investigation", "duplicate billing", w = 24) + for (j in seq_along(claims)) hub(130, claims[j], "Claim", c("claim 0", "claim 6", "claim 9")[j], w = 15, h = 8) + atom(165, 41, "Provider", "dr-clara-voss", w = 21) + atom(164, 11, "Pharmacy", "central-apothecary", w = 26) +} + overview <- function() { W <- textwidth * 25.4 grid.lines(mm(c(12, W - 2)), mm(c(22.5, 22.5)), gp = gpar(col = rule, lwd = 0.5, lty = "22")) @@ -92,7 +148,8 @@ overview <- function() { label("stored page", rx - 4, 27.4, size = 5.6, hjust = 0) } -save_grid(file.path(out, "overview.pdf"), textwidth, 70 / 25.4, overview) +save_figure("overview", textwidth, 70 / 25.4, overview) +save_figure("hypergraph", textwidth, 55 / 25.4, hypergraph_figure) cell <- function(x, y, w, h, text, fill = "white", size = 5.6, family = sans, col = rule) { rect(x, y, w, h, fill = fill, col = col, lwd = 0.4) @@ -154,7 +211,7 @@ layout_figure <- function() { label("summaries count the postings\nunder any range of atoms", ox, 13.5, size = 5.4, col = rule, hjust = 0) } -save_grid(file.path(out, "layout.pdf"), textwidth, 57 / 25.4, layout_figure) +save_figure("layout", textwidth, 57 / 25.4, layout_figure) compaction_figure <- function() { live <- hs_light @@ -199,7 +256,7 @@ compaction_figure <- function() { label("released", 74.2, 32.2, size = 5.2, hjust = 0) } -save_grid(file.path(out, "compaction.pdf"), column, 55 / 25.4, compaction_figure) +save_figure("compaction", column, 55 / 25.4, compaction_figure) wal_figure <- function() { y <- 17 @@ -253,4 +310,4 @@ wal_figure <- function() { x0, 3.2, size = 5.4, hjust = 0, col = rule) } -save_grid(file.path(out, "wal.pdf"), textwidth, 40 / 25.4, wal_figure) +save_figure("wal", textwidth, 40 / 25.4, wal_figure) diff --git a/paper/R/results.R b/paper/R/results.R index b837b36..8289014 100644 --- a/paper/R/results.R +++ b/paper/R/results.R @@ -192,7 +192,11 @@ ratio_plot <- ggplot(plotted, aes(x = ratio, y = label, colour = Configuration)) labs(x = "HStore advantage (log scale; above 1 favours HStore)", y = NULL) + theme_paper(7) + theme(strip.text.y = element_text(angle = 0, hjust = 0), panel.spacing = unit(1.2, "mm")) -ggsave(file.path(figures, "ratios.pdf"), ratio_plot, device = cairo_pdf, width = column, height = 4.6) +save_plot("ratios", ratio_plot, column, 4.6, readme = FALSE) +if (nzchar(readme_images)) { + wide <- ratio_plot + facet_wrap(~ group, ncol = 2, scales = "free_y") + theme(legend.position = "top") + ggsave(file.path(readme_images, "ratios-wide.svg"), wide, device = svg, width = textwidth, height = 3.6, bg = "white") +} lat_workloads <- c(latency.read = "single lookup txn", mixed.read = "reads during writes", latency.commit = "single-update commit", mixed.write = "writer during reads") @@ -211,7 +215,7 @@ latency_plot <- ggplot(lat_med, aes(x = percentile, y = micros, colour = engine, facet_grid(config ~ workload) + labs(x = NULL, y = "latency (log scale)") + theme_paper(7) -ggsave(file.path(figures, "latency.pdf"), latency_plot, device = cairo_pdf, width = textwidth, height = 2.9) +save_plot("latency", latency_plot, textwidth, 2.9, readme = FALSE) write_workloads <- c(ingest.nodes = "ingest nodes", ingest.edges = "ingest hyperedges", write.update = "update (1,000 per txn)", latency.commit = "single-update commit", churn.delete = "delete hyperedge", churn.remove = "remove member") @@ -260,7 +264,7 @@ disk_plot <- ggplot(dk_med, aes(x = step, y = checksum / 2^20, colour = engine, theme_paper(7) + theme(plot.title = element_text(size = 7.5, face = "bold"), legend.position = "none") resources <- written_plot / alloc_plot / disk_plot + plot_layout(heights = c(1.15, 1, 0.9)) -ggsave(file.path(figures, "resources.pdf"), resources, device = cairo_pdf, width = textwidth, height = 5.2) +save_plot("resources", resources, textwidth, 5.2) combined_rows <- sapply(workload_order, function(w) { get <- function(cfg) cells[cells$config == cfg & cells$workload == w, ] @@ -341,7 +345,7 @@ if (!is.null(abl)) { labs(x = "with the change / without it (log scale; above 1 is better)", y = NULL) + theme_paper(7) + theme(strip.text.y = element_text(angle = 0, hjust = 0), panel.spacing = unit(1.2, "mm")) - ggsave(file.path(figures, "ablation.pdf"), ablation_plot, device = cairo_pdf, width = column, height = 2.6) + save_plot("ablation", ablation_plot, column, 2.6, readme = FALSE) } else { writeLines(character(), file.path(generated, "ablation.tex")) } diff --git a/paper/R/theme.R b/paper/R/theme.R index 57c1fe1..777bec2 100644 --- a/paper/R/theme.R +++ b/paper/R/theme.R @@ -22,8 +22,15 @@ disk <- "#e3ecf3" column <- 3.33 textwidth <- 7.0 +readme_images <- Sys.getenv("PAPER_README_IMAGES", "") + +open_device <- function(file, width, height) { + if (grepl("\\.svg$", file)) svg(file, width = width, height = height, family = sans, bg = "white") + else cairo_pdf(file, width = width, height = height, family = sans) +} + save_grid <- function(file, width, height, draw) { - cairo_pdf(file, width = width, height = height, family = sans) + open_device(file, width, height) on.exit(dev.off()) grid.newpage() pushViewport(viewport(xscale = c(0, width * 25.4), yscale = c(0, height * 25.4))) @@ -84,3 +91,15 @@ theme_paper <- function(size = 7.5) { } engine_colours <- c(HStore = hs, HyperGraphDB = hg) + +save_figure <- function(name, width, height, draw) { + save_grid(file.path(Sys.getenv("PAPER_FIGURES", "figures"), paste0(name, ".pdf")), width, height, draw) + if (nzchar(readme_images)) save_grid(file.path(readme_images, paste0(name, ".svg")), width, height, draw) +} + +save_plot <- function(name, plot, width, height, readme = TRUE) { + ggsave(file.path(Sys.getenv("PAPER_FIGURES", "figures"), paste0(name, ".pdf")), plot, device = cairo_pdf, + width = width, height = height) + if (readme && nzchar(readme_images)) ggsave(file.path(readme_images, paste0(name, ".svg")), plot, device = svg, + width = width, height = height, bg = "white") +} diff --git a/paper/build.sh b/paper/build.sh index 5de0f62..b193604 100755 --- a/paper/build.sh +++ b/paper/build.sh @@ -42,9 +42,10 @@ export PAPER_FIGURES=$here/figures export PAPER_RESULTS=$here/results export PAPER_ABLATION=$here/ablation export PAPER_GENERATED=$here/generated +export PAPER_README_IMAGES=$here/../docs/images cd "$here" -mkdir -p generated +mkdir -p generated "$PAPER_README_IMAGES" for script in diagrams results; do [ -f "R/$script.R" ] && Rscript "R/$script.R" done diff --git a/paper/figures/hypergraph.pdf b/paper/figures/hypergraph.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c0f70501ea0b0dd7715b30897377adcaddacc266 GIT binary patch literal 38153 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 literal 0 HcmV?d00001 diff --git a/paper/sections/model.tex b/paper/sections/model.tex index a956909..647643d 100644 --- a/paper/sections/model.tex +++ b/paper/sections/model.tex @@ -9,6 +9,15 @@ \section{Data model} \] where $\mathit{member}$ is any atom, including another hyperedge; $\mathit{roles}$ is a set of role names (a member can be both buyer and approver); $\mathit{weight}$ is an exact fixed-point number with nine decimal places; $[\mathit{from}, \mathit{to})$ is the interval in which the membership holds; $\mathit{data}$ points to a payload and $\mathit{qualifier}$ to an atom that records evidence for it. All fields except the member have defaults. A \emph{set} hyperedge holds each atom at most once and has no order. An \emph{ordered} hyperedge is a sequence that can be edited at any position, and the same atom can appear in it only once. +\begin{figure*}[t] +\centering +\includegraphics[width=\textwidth]{figures/hypergraph} +\caption{Three hyperedges from the clinical claims example that ships with HStore. (a) A claim relates a patient, a provider and a pharmacy, each in its own role; the provider's membership carries a weight. (b) A care pathway lists a patient and the providers who saw them, in order. (c) An investigation has three claims as its subjects, so its members are themselves hyperedges.} +\label{fig:hypergraph} +\end{figure*} + +\Cref{fig:hypergraph} shows one hyperedge of each kind from the example dataset that ships with HStore. + \paragraph{Generations, history and branches.} Every commit produces a new \emph{generation}, numbered consecutively. A reader opens a snapshot of a generation and sees it unchanged for as long as it keeps it open. The engine keeps a configurable number of recent generations (64 by default) for time travel, which can be addressed by number or by wall-clock time. A \emph{branch} is a named line of generations forked from another branch. Creating one copies nothing, and the database layer merges branches with a three-way merge against the fork point. \paragraph{Operations.} Writes create and delete atoms, change their records, and change memberships: add, update or remove a member by atom, insert, update or remove at a position in an ordered hyperedge, and replace a whole membership in one bulk load. Deleting an atom removes it from every hyperedge that contains it. Reads look up an atom, test and fetch a member, return a hyperedge's cardinality and the member at a given rank, scan members filtered by role, weight or validity time, list the hyperedges incident to an atom, intersect incidence sets (``hyperedges that contain all of $a_1,\dots,a_k$''), and compute differences between two hyperedges, two generations or two branches. From d85d9af4130d58097d7603e2d67710f99532ecdc Mon Sep 17 00:00:00 2001 From: venkat1701 Date: Wed, 14 Oct 2026 22:06:38 +0530 Subject: [PATCH 6/7] docs(readme): show the design and the benchmark results as figures The README now opens with the example hypergraph, gains a "How it works" section with the engine overview, the tree-of-trees layout, recovery and compaction diagrams, and shows the benchmark ratios and resource plots. The performance section now quotes the Azure runs the paper is built from instead of the earlier laptop runs, and says where HStore is not ahead: the median async commit latency, retained heap, and the slowest single commit at scale 4. The earlier claim that HyperGraphDB opens a crashed store faster no longer holds and is gone. --- README.md | 105 ++- docs/images/compaction.svg | 653 ++++++++++++++ docs/images/hypergraph.svg | 1093 +++++++++++++++++++++++ docs/images/layout.svg | 998 +++++++++++++++++++++ docs/images/overview.svg | 1136 ++++++++++++++++++++++++ docs/images/ratios-wide.svg | 1199 +++++++++++++++++++++++++ docs/images/resources.svg | 1678 +++++++++++++++++++++++++++++++++++ docs/images/wal.svg | 926 +++++++++++++++++++ 8 files changed, 7771 insertions(+), 17 deletions(-) create mode 100644 docs/images/compaction.svg create mode 100644 docs/images/hypergraph.svg create mode 100644 docs/images/layout.svg create mode 100644 docs/images/overview.svg create mode 100644 docs/images/ratios-wide.svg create mode 100644 docs/images/resources.svg create mode 100644 docs/images/wal.svg diff --git a/README.md b/README.md index ffbaf9c..58dd438 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,15 @@ query language (HQL), hypergraph relational operators, a semantic plane, multi-t It is written in Java 25 and ships as one GraalVM native executable, `hstore`. +

+ Three hyperedges from the clinical claims example: a claim whose members have roles, an ordered care pathway, and an investigation whose members are claims +

+ +The three kinds of hyperedge HStore stores, taken from the example dataset in +[`examples/clinical-claims.hql`](examples/clinical-claims.hql): a set hyperedge whose members have roles and weights, +an ordered hyperedge, and a hyperedge whose members are other hyperedges. + ## Features * **Native hypergraph topology.** Set and ordered hyperedges of any cardinality, including giant edges with @@ -44,28 +53,90 @@ It is written in Java 25 and ships as one GraalVM native executable, `hstore`. spokes, hulls, ordered chains, time-travel slider), a schema browser, a live engine dashboard and access management. +## How it works + +

+ Writers commit through a commit lock, which publishes new root vectors; a checkpoint writes changed nodes to segments; readers pin published generations +

+ +Every structure is a copy-on-write B+tree over 64-bit keys, and the state of the database at one point in time is a +*generation*: an immutable root vector with one tree per slot (the catalog, the reverse incidence index, type and +canonical-key indexes, symbol tables, request ids). A commit logs the keys it changed and publishes a new generation +whose changed nodes are still in memory (yellow). A background checkpoint later writes those nodes to append-only +segment files, once for all the commits since the last checkpoint. Readers pin a generation and never take a lock. + +

+ The catalog is a tree of trees: each hyperedge record holds its member tree, inline when small; the reverse index maps each atom to the hyperedges that contain it +

+ +The catalog is a tree of trees. A hyperedge's record holds the root of its membership tree, and holds the whole tree +when it has up to 32 small members, which is the common case. The reverse index maps every atom to the set of +hyperedges that contain it. Every child reference carries the subtree's entry count and a summary (key range, weight +and time ranges, a role mask and a content fingerprint), so cardinality, rank, overlap and diff queries skip whole +subtrees. + +

+ Recovery replays commits from the checkpoint LSN, stops at the first commit whose pages do not verify, and drops transactions that never committed +

+ +Recovery reads the log from the checkpoint recorded in the newest catalog image and replays every commit whose +`Commit` record is intact. It stops at the first commit whose referenced pages fail their checksum and drops +transactions that never committed, so the recovered state is always a prefix of the commit order. + +

+ Compaction copies live page images out of a mostly dead segment and repoints their directory entries; no tree changes +

+ +Trees refer to pages by permanent page numbers, and a memory-mapped page directory maps each number to its current +place in a segment. Compaction copies the live images out of a mostly dead segment and changes only their directory +entries, so no tree, generation or branch is rewritten and commits keep running while it works. + +The [paper](docs/hstore-paper.pdf) and [docs/architecture/overview.md](docs/architecture/overview.md) cover each part +in depth. + ## Performance -HStore against HyperGraphDB 1.4 on Berkeley DB JE, both with 64 MiB caches, at scale 1 (50,000 nodes, 100,000 -hyperedges) with `async` durability. Each figure is the median of 5 runs on one laptop: +HStore against HyperGraphDB 1.4 on Berkeley DB JE, both with 64 MiB caches, on one Azure `Standard_D8ds_v5` +machine (8 vCPUs, 32 GiB, local SSD). Scale 1 is 50,000 nodes and 100,000 hyperedges with `async` durability; +each figure is the median of 5 runs per system: | Workload | HStore | HyperGraphDB | | |---|---:|---:|---:| -| Incidence set of a node | 6.26 M/s | 1.49 M/s | 4.2× faster | -| Hyperedges shared by two nodes | 610 k/s | 53.9 k/s | 11.3× faster | -| Value updates, 1,000 per transaction | 69.9 k/s | 13.0 k/s | 5.4× faster | -| Bytes written per single-update commit | 659 B | 6.9 KiB | 10.7× fewer | -| Commit latency, p99 | 296 µs | 466 µs | 1.6× lower | -| Disk after loading | 92 MiB | 346 MiB | 3.7× smaller | - -At scale 4 (200,000 nodes, 400,000 hyperedges), where the files of both stores outgrow their caches, the -leads widen: incidence sets 11.4×, value updates 33×, and listing a hyperedge's members 3.2× faster. -HyperGraphDB opens a store after a crash faster at scale 1, 76 ms against 128 ms. With `sync` durability, -single commits in both are bound by the cost of a forced write. The -[benchmark report](docs/benchmark-report.pdf) (PDF) covers every workload, configuration and caveat, and -[docs/benchmarks.md](docs/benchmarks.md) explains how to rerun it. -The [HStore paper](docs/hstore-paper.pdf) describes the design and evaluates the current code against -HyperGraphDB on a cloud machine. +| Incidence set of a node | 3.10 M/s | 1.25 M/s | 2.5× faster | +| Incidence sets from 8 threads | 14.1 M/s | 1.28 M/s | 11× faster | +| Hyperedges shared by two nodes | 272 k/s | 49.8 k/s | 5.5× faster | +| Value updates, 1,000 per transaction | 40.9 k/s | 7.26 k/s | 5.6× faster | +| Bytes written per single-update commit | 659 B | 11.1 KiB | 17× fewer | +| Single-update commit latency, p99 | 228 µs | 767 µs | 3.4× lower | +| Reader latency during writes, p99.9 | 5.47 µs | 94.1 µs | 17× lower | +| Disk after loading | 85.7 MiB | 400 MiB | 4.7× smaller | +| Clean reopen | 78.5 ms | 978 ms | 12.5× faster | + +

+ HStore's advantage over HyperGraphDB for every workload in three configurations, on a log scale +

+ +At scale 4 (200,000 nodes, 400,000 hyperedges), where the files of both stores outgrow their caches, the leads +widen: hyperedge ingest 7.9×, value updates 12×, incidence sets read right after a reopen 82×, and 13.7× less disk. +Opening a store whose ingest was killed with SIGKILL takes 162 ms against 449 ms, and no acknowledged commit was lost +in any run of either system. Over a whole scale-4 run HStore writes 2.06 GiB to disk and HyperGraphDB 104 GiB, most of +it while JE's cleaner reclaims space after the deletes. + +

+ Bytes written per operation, heap bytes allocated per read, and bytes on disk through the load, the deletes and reclamation +

+ +Where HStore is not ahead: the median latency of a single commit under `async` durability is 143 µs against +HyperGraphDB's 93.7 µs, although HStore's tail is much shorter. HStore keeps more heap after ingest (179 MiB against +118 MiB at scale 1). At scale 4 its slowest single commit in a run is slower than HyperGraphDB's. The +[paper](docs/hstore-paper.pdf) has every number, the latency percentiles, the before and after runs for three design +choices, and the caveats; [docs/benchmarks.md](docs/benchmarks.md) explains how to rerun the comparison. ## Quick start with Docker diff --git a/docs/images/compaction.svg b/docs/images/compaction.svg new file mode 100644 index 0000000..3cdab69 --- /dev/null +++ b/docs/images/compaction.svg @@ -0,0 +1,653 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/images/hypergraph.svg b/docs/images/hypergraph.svg new file mode 100644 index 0000000..081cd6b --- /dev/null +++ b/docs/images/hypergraph.svg @@ -0,0 +1,1093 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/images/layout.svg b/docs/images/layout.svg new file mode 100644 index 0000000..29e2180 --- /dev/null +++ b/docs/images/layout.svg @@ -0,0 +1,998 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/images/overview.svg b/docs/images/overview.svg new file mode 100644 index 0000000..0ad9edd --- /dev/null +++ b/docs/images/overview.svg @@ -0,0 +1,1136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/images/ratios-wide.svg b/docs/images/ratios-wide.svg new file mode 100644 index 0000000..d9eaef9 --- /dev/null +++ b/docs/images/ratios-wide.svg @@ -0,0 +1,1199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/images/resources.svg b/docs/images/resources.svg new file mode 100644 index 0000000..2bd950c --- /dev/null +++ b/docs/images/resources.svg @@ -0,0 +1,1678 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/images/wal.svg b/docs/images/wal.svg new file mode 100644 index 0000000..0565acd --- /dev/null +++ b/docs/images/wal.svg @@ -0,0 +1,926 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 7861a509d90d6f91e12bc092abd60cc1d0e511f1 Mon Sep 17 00:00:00 2001 From: venkat1701 Date: Wed, 14 Oct 2026 22:07:38 +0530 Subject: [PATCH 7/7] docs(paper): credit MetaCognition as the author --- docs/hstore-paper.pdf | Bin 352034 -> 351945 bytes paper/hstore.tex | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/hstore-paper.pdf b/docs/hstore-paper.pdf index a275f6365f53e2d8ecbb66db2f93c5f6838f0361..67bf3a849327a1fd99657290ccc951a935e75540 100644 GIT binary patch delta 60532 zcmV(sK<&Sxz7@&66_7W7FgZRx3UhRFWnpa!c-pN!Igc~RZn=NOgm$2I-3K5~@BrI@ zGXtC14zwfbMGpM`lUH3uvRGGlYo2#8_@wSSSuEb9zW(n^eu?zI{POC{%eck;zptPF zP0#+C{{9{Q{yO~omp{J#`QPN1^qZ2_82RdR22o;6U zMhI)upGbfD+o#9I2_gUdz9|#;Mk;->V*g~Inf!L?t9_);uky&e_s`$CgAU(jZ*FyZ z{wSjxhr_k=r8g@51!z&Gab>*x^Z}pgt?{&0Y#+;7(z0&2{5*1~Ggz7a-P@V(|M}xT z5`^@Zlv}h`y0AlkNJg8$g6v^9X=2eG($Qyr<~cxcbnAe z>jrcBzi(_MHm$X{<9G-y=wnoF|F3_{vBZ8!u|*L@$S}Ccuqh#Zf zXQ$KHT4%J-8jwO;+H**Ic6x_i8gSE6hcukjn~T9|8t(glX7r8>W_omhgx|Lv%ko|T zKT0QtrRE98YoV{9kyQbOebAHr+ummfdO{v4>V!8_Fm{Krr+I8yAmLzu33A&qEwzO^ zklyVp-5-f(zZPSu^Q&3m4m^TYIuaWqfXZ05!Tn!TF=k&&!U9}N1sgnst7%PHC_H`F z0j*R0T?acwo)@j}IiNh$^et!FBhff-@ zXO784;RYx*Na*Cf-9Sb}TPaS4TxsQL`FW`?d{MzIPEQU*X}U0e7|joAtZNynzP} zPg}ty8BQ(^uVUF(V$A;HS(JtZ4g;HajE7~AQOoXnDX%_eBP!h?x^Bvg^BYw!{5}KB z$?j8G8@~|HhVx@rgr>NF+<48DaurY0w{T~qo7#jsKH=YJ9i`W&2r~=?%ucD?$5d)b zlz;ruEEC8`KH~bs)NRnGGnulG;ZByEf^e5m#1G zO&y?+t_TX1qUn!^&~6ASj?C;zHga0)={wR1LT0M?N>lxwGRC zr1l6VzU+XNVy&}4H%0=W`3ys6#FWH|(hu);CXFs>))S-N+$$k?9ns}^^V9+h!%={@QN&?~G2 zpg?ok$(&^gDAG^Pt`bCI6*i!VY*7hGM|=u7n%fNKikp&E7afqr;QL;MgQtOAk62-l zd9qwx^ww-b;-j>kRiMs1GBdmj&?_*u%yi~)udZUv9BP_r2k(0PJ37e_J3i&7Jefh7 ztyqR|C~8B47MAI0T$|2-+p3A8uk0>o;nHy9<(t&I2!%u2Q1Mm+B}J~J=yLB+x@}s^ zY|U!k0}lF^Y_#@BSx>xtCNq4@8ZM( zq4Z4c)`2@Ykc??Apo8t?)G!XS5NBn^p)A*x`CkJMDqVW+sK|e_L-GlKIJ$f2)NXSJ zjmm0?UfpLT5>IMn>P`#Eqc=#?eZ6PTL0*QoG%HDjw%SUk0i; zPvo_wx8bur8Ur#m<0_+WIuZ>i3~TN1BJ@yZSS{%;9L(LlC;L+FpMBS=S$WTW6_)!y1nD$zjQ(syJvIW$wEAIXSI%_j@;%;>JKc zbGv}N?fd}-8@DI#=;ZCabF-l-fQg@FN;k3XL;nZLweH@Ty2?U9tqj=A-dkSvWageX z;$ykCM{Z8>TCnYzbJOUmDYbVO=m81FGeh@M17v0WbY2z8${|Jn@zBONN$4Jmk_K?#MVsT@2cAviSOEYu07* z{2ac-6r$?QS`UCr)FahWQL=!kdL(e}k?=0+&!c9_S{h7@nj2;fh(VS9Z*GQYOd4}%KpPZLlnc!`7PnfM)}6(4nAU#;;<$QbFAWB~sq~nLO|835b+!v< zddBF$xacNASKD=r=~;v+pi5cyX7O*b^q5W(v7(c8tIkp_^!P;oG#X1w_pM8G-|r$^ z+QGIDhzpbYpj&F|jhAukmcV_`&7?0$Vw}vDwkYL6SFg9-79+>5`c>uoAUCU{8U*|a zzgK^kgPD{+a6rN^n&}*>r|I7J;U`^GM{W@<>c(Y0$D|5SKi~~NV()qEz=f467Ty@z zP`?B;tz;|C|Kq>>(@b74djmt#f_P2#t;JOtNN6r3icSVfPYlz|%eN1L!S*m%m_pH~ znMbV&0;<;@r_~*Ig!bIoDJ}(y6 zSB0POR~bYn_Tiyac1o=t{2SsVf7gt85&#Fy4yl(kb_+6?ouEXug+NiXQXO`STMRzo zZ{H1QNtrv^S1anYK(S1h!?*`{GrCQHEZ(FGn+(zVsaFa8Vs;1tvhgH7t+X)9uxo$j zMlM1NO~aXsW6{+e-pROm>x1erFHz)%Om9N%B2{Vh-^vSY*OBv0Dxo8^lM6IX+jo`7 zP}IvRc9?~O*l;QV0_n|=Q5Yp;Vjge7Ai!+C8o(AO_ieG>2-LRU61eoU(UzAjv(+9)ffnv!Sn2C!I16pJ+dMZgFF7hC9 z1ZKAfZhv)Ioo+%VOP3*>mOC-l^dtC9Ij`&qI!F_=tv4Q}Fv%RM+^JTUG$4Ns>FG;{ z9BPkd79iPa^9}bi)jz^d_+2SP+&Q$@X66eYyp7fKFsC`4qojJ2xsQT-EJzPVN5Oy%qd0iq*y;D75qYtP zvWJp#(=G=4b+a}kT4!Z-^<;mq@loHzOhvF^?5kfu?X=&b6k5(0%_P^W;6Rv#S3ALs z_ZcUC=qX|keaoz)zGJa2nO!-aVgujoB-+8!D6ti#(f`S2eehX#4>zIS43vF^fnaRFG_hKM^)JE0j-HC*9=D+H{XdRX$N(RT6(PjkI#?ngz}$ z&ff=_@UTX6fgYAt^N4kPImW1KrSJ3G&*K12fy@(T8A)O z5{RrC`|1}?-emaXt!RJyZNk0MG4!$^{zI!n%yn)HBKXOoA4lDMIu##wS@&SUDA4{e z-$Kj!wM@dkweFDhUoa>Xx~OatB=p28-a5z*BsjY>$l~JDHT=d}*|~O$>5bk1nJV9A zR$*IMa2KZny_bHaa{r+fJAIg^yXlzXhg=o1WxKLeQ=gvf+NFWVtgviCdaOahC`LmL#h}SGn#|0TBjMM|8z#3zQ{eXc${&k z_VJ*rNusV5W-?>GHnKVC&YPOaP-*d5Ml|b1EYs4{-Oh6__zO>%nwjf_#rA(sEF=(a|6-v8rq_(zFj8TG?!*QHZ5K9>8nWLf`oJ5>fNmzSAMN}{ ziFLU2t3Cjp8u?(U<2(^Sx^}Q3kKw=*ewtR8NCf(4xD#9Q`oK23jPf^KknR&gUf%g_$?-p1x) zYzr(GrK(_O<^&pG*yqAB5G%=BCW~e44h@)$^dDLZDA8Gl#?}4ZL{%~3*CZ^S#gcIw9GIH0a!R|W;^lmBgT*qe&&Gdibp!ZdSMt?u;Kq(>G`U(W;EFdU zoO@%&Y5~Q5IE7pF@ixg;O}=uMPL&Ud=;7law3@|E$^O=qQ4h`PNHNTv(=9hKXq3hO z(kurKn>?`cj9}}7LI##cnDZM%_ewJIX2pFlnWB*22H_=zHYo@>aw4h4n+~A{ByiWY zQp=NG5at2`dy_^Hh=1XeRW4K=r;JrGFb4b2W4ouI)TcFN_MA)EYtI35mmr0cYxm8S z4z%MR7P3H3PcCvz5+(UHs3Wg@dHZ52oTxwM~psQ;kJZOCEirWwq`+${F#t+|vs^JGxZbP=9_s^XWnFWqPlk1U4Py zJF}Q9kH^T(p30kfVH)N2ut&`QHuugQ8;7@j8l#`Ne9IiuqyujjMFro`jYSZfRo0fk zN^Cr&7QU$uFpx+9aM4N-rpQ`&CCICa=uZUNeE(I|B_xN(RhNjoHAyfyLLb5l`)Dm4 zcEy4<)2a2HT$jsjq6T#n>1S3(XJ-xo4E^Rs>dF+Y zNEQ|*qP?}6#m_r)=Du*35Zjr~{!*T3-9*zYEEI>tO$pZ;X4>pwyc~n}FI=ya4VTfa zZnj%gqdk~~JKEsshe!v#Fq~8PHT7ENjgF-i5`VKFv?)7OYsLbi*4(+fY#@gFlOgmA zdaVepHLC)#)+}mU!iY#e>KsjEw^`K^++XS|r4KD5wLe_4qI}?$0C>?08u~h`R?PjE z>jFBHvXMiu`v1T0k{2CX*Xy_>ESf!N%^OR>kF#o#B>DGX#CJy-BS{kds1TwdwPm4f zt$zed9X6#Rs~n;2w}cX&VPau`iKa$nz6wEmn8L=^TK{Lx{og0G%+Zgk!CEuD_Jb%G(_dEqTwQ#N`U#|WzRb?KDg4I{M%3@|$ z(TZ{U+5VbA*4@;_La9bI76{pzHx2nI;L~$3@ET=jbzqgF3sea%JmtSEaMbR^OE4FZ zuoQ0SGP28)53xA)iU%H`8g^O&IY6W=osLZ+#`+Hw3K$WAR<<%N>Pky~Tq(>{sDJi1 zs{#^tdo?a8hj|Ohn6nk?gDSkx+A>KS&ZmsZWs7d)cf##ZBU(!fIk7&DE9%8*XmN&3 zE608a_qG&Gd2;ROaE!PJUu(nBYPG051xoUagZY_Tw5bqlXT?Oy9u8`KlGQuJ`!(9M z(`2d`-1-GLOU~FU1}9T*sCNu-jDNO>&o#;ZS5nkRX9bs2P#GOpb!qbn?w?f{?tb5= z3YDW=E@tI|;*=VHWKp!rZr%o?&|=4|OFX1zM_?=OT~L{sRHLv%84Rm0nY(qZTyC*f zjy<%;KD$v`R9leR)U2FxhuXYfCS0@4p^e1q6GsFtk6An{4~oGw7HQPxy?-0izq=rj zHUf77eI+M0AJx}YtZGQ7|49D3R3+qX>a3BPF9S$dMuBW8`$V&>C_-kn!M3pLbbQ5R=v;?DMO zgRx+&YNN=TdMa5_askhG@qc|Rk`Cemfv8+YjDA5jYRMrG^EqZ^aC|&2ja<6w9_mNi zVEJ%5h!crwQ9k{qRh-pI*TdG-(FUH>K+&gXg+fNLpUU6+;nDURucEr{OCQ5F&XG~Y zzvGu!1{2HLu5askxlnwj;=Rf=n)B*uFmvL$Y6p|Sx0XLH;8GC)L_?oEPCS{!ino9A#=nINfI`2$N|T>m-)w#;a4sF*e7v+}+e@9tI=Y^+%2q74ziR-h4a{S^T9-#ocBX~kX)z>r>E`0!5+BM~qF z`Fme^9!%V@6`M>gcG=ps_r{WwY^PJO58J|-m-7qcK>6o0n>X0TNw$*7VS79w5+#n2{ODaw(TG?L~c(S=u7*L4wkyl2nU=2@7wD8 zn}%o>o?NX@zhZwyD421)B=xCiv*B0(rPzo_B`Tag2qC|pY~@~m`G%EO#H!W;FmZP$ z5qscbmGg19V4r@$m27{NBWPDKzzh!CE$g-y2 z3(L2fpqZnSNDcpGdgOA?zMOFv@YInvcDP2~{~rNNg|ofYxAK|+mHt(Ek9mIuVDGiP z()Ezl#8YeU&H>;_xxN*H=`5*dMAFb#M(!W98wggPmmHZ2nea&q3lIB?m}!oRrFGt( z!5--;F5rLKu01TczA;_EDBHQsxK&41a3O2ILUkQECrL*wEQRA=9i-6)vaAM|@e94<*R zdBF6i@*z4HGNJ5AH+OiWjhedwy{y>!K@MMr5&nPW371gt>778J(fu1BN8uJfyklwP zk?=LFwro!O`9nFM1o?T-jg9&@%7>No7lJGm04LI~hbsfjHnb4{h4a!95wVAHA(|z3 zM9dZ!!Yc#eg6=I|8sUi};VIqD0b6#q2a-33imt#`%R^}&e1ok$=@#T6(x$@P4QS22 zYfOJ#m63iiqd)8B4~=_d%RInrb?gU;$hTI)gsc|7Z9(@j(%sJR~(X9U&T zx*%cQ2^NJFX~R3^Vmj>9aYY~+%&OCsvn(5g!ZB`a+Kv75bR4{f`}r7!I&o# zo07sy)n&4@Tv4=ZdrE?Rluj7JI=O*M-kS1jU`arL&4eaV=Bf(UgRgOqu zb;W$!3C)g>2)!VTv~PC3$%5m;W1kV}U zsIZ|+Rmi5g(+vgaNN+VYy)*&3iyrMsJq7-&2|=C8sL`&{Mcdwx*b8FQ=}IG|*c=?x zWacVA*EZ`@3;M85D%;QPW7HXzXP0hQ6jF2qg>^T;ZKktF@KMJ;+qu@4M>}+qOXWmh zs1Ypemzl)8#0C{kSlL*Cp>BVcJwUd=Y=xev^S)tWXxbNFGtmaZg$TKP_&_bR9}g!i znt3;d<=GsSl9~|Wx_ukwU_wY_YhRphYh&2;enrTw1mqh~jx>^1cD)ODk%usF<;>wsFM!qu{q|Z8>%67nO`;*=YN7h6aBiQ<&zgQQbKL z*eE&vPgV@ADlbDiEGuy2d*V_Ws9dIY-{HJ`e!fI?rw;E-QpO0XKgFfIJfcxvom=ym z)?ta4Bf-lUKj0lap|;(DI->=A&jh8=hf9)BCl{G5!_c2uCG7;qlb+DKlJN}Me88dJ znYLPqTkXUw2{I8-?}~qz!SBhPs3Clu?v$ybk8;#)gXXJ812h~imNiSAH}LC(Su1mR z?+9ccA63I>$?+&=w2Q@-<_=@6F97)Rr-W8tp+{gnbRy`+0K@t6+x@riUti;w``1_b z<#*`8JE(ZbV6B86e^ScsMo!9(Ya{>uHGKKYpYQ*<95by|sn~z^|MZyuoyNTX`pbX( zv0kV-L{x6IP!6=*&fuU4RC+hLvc?0C{qj+E^xJMfUS%x&+N%czf(Y#vD zn$$~YrTXNgx9cC*^(Ji6?o}|K9Ph9Hb^Y_NAHUvzU++a{)0TEWyq7^mRU!c=VR_^T zf9f%rHlXaGT+n~!>=Nj47cuE{hF#cdl(GXI>rbe%QO!+uyy{c|q_QXiMkii3hT|I?Ia! z9L2pc^^J&cQnE=-s5dqtvS3{YvyMWel`Pp>gX(c*YN3Btqa_NOgQJAWmGvKHr7XsB zaoryl7h)!wIOupj+k}*x@Kzf|%=++)ILOfsn_o)ecc+rSxOdbm=XGuNJ{-xSZ0~zP1`S|xz{c}!JB!K&j?h|B@#Md$3q+-9o!+b2!3XBBMV7_LXv^J zn+y_5R0cY4G<6yq)AYLfTsDWu!bfceTqIa zoiKW#&egU{PYSb#bWl*+^IP&mv<#(HI+S{uYf|$$N^@gVdR?(;U>)vC?`cr2AcC=^Xm+*uri|_=DCw-g~ zL!EyWvK#7F@K4fQ79^z|O=!c2fr0aFO;K>H6@miBmluuWQ_l z)LAjw{CYddPX%I#h$c_kH#@gw2z-!6a9I$j_K~7-ccOvaseCoM2aL1L= zz)TSqqAPPoSK4RP5sh&Z*FTFchO-@+Wye7jS-3B4@S{{S)7BYOuHcjA!W@zBg?4|6 z#9<*3a6?co^Yqml=TNXR*UA3`Lf0wi8n{rLN^L{)a?E9aL0aB4|f9>?N$U&$b9`}-GJeW1fo%fSo;!bmiZyt z`x~LBfv#?vf1RGNjT@yaufJBOQ{zz+rHuBYMRJ9GcwHNJJ8Nj_PxKrItAu|Z7BS*C zHt(5Tpl_qbyoOES6-F0rVD>a=%x+Ut>`2YYouAl7@2>dkMCcdSHVV^hSM z?W`_vv(d0&8YLJ8#*-dc^sgS=;G&Y#1Pc!(>KCJ~9@fTf!moZwVO!i9g0LZWPGKXsJ0 z@R9I2FuMj^-x^-i5}9AJUBzn`92W9!@568m+imP+Pl~eE_``XpT9&64b0ErAlwC_! z#vCFz*KH&^ycHwND#67?l%E#(>#zY8f}A<1yNffh*c`V9dUp-VK|F!GM2R+PKgA96WPyj7$rL z)Lrf?l8W|IVj9w?Ic;i1I;i89owO@i?n8YvLInm@9j;yoOOf-ZRoYQ^w5jtAkg-Ry%uv$ z+u1g!m_?Me_JM!v0fS&+T5=g^?rmAI>H79h-pTBwcDGw|6jBX?l7uUfeR;-j>%?xe zn_Pj9c29_c#Ubilx9cpmdRxt9khinc645w9|;{FnKfbSyFbC9Q7ljOojWbQww=O8R1NOfza2{qL48baMog zeXpctB7b*TLvO^50SoPiW-v<^sh21K(4yrvxB(T$$Xo2dh>c~*IIa`9YB&&S=?N*9 z*%X)_g-JZ0#Y_-kQ4O3&{ESh}3M%KG4Emf`VXc2qDw{*)bB&@`n{J4VnB%BcI{c%& zpWviN{SmFDM#~48v9-m{o(gZroT|ocSAIq4ve71MD9|zYwPk=y+i?V=I5a4pk_0pb>kzEBtnd?;vy=BPpv@Vs~Zv z;3S!@aYF2lqGT|OzzrDX6HKL!BjQhF_ZlA#??RRoqRlbnIy{q2Z-P3aE}`c`w<0rq zvX7f8e<4GCJ-VN_?0}^3h~wMGsq= zXwHt%Nlst64;j5Qj@mHI7-a-cHW7d2&>I2gR-RSEvZi6awWCn@L#V{p{f&1#vFc4GibTfFt1P_eraTU>9?w1DJzdCPvf~NQMY&lBz;I+4aeo zE9dQ*m#~ktJA;_kC}|KTkLhVKA$1fIh3g2>hb1ocyj%jnldQ}Q816J2g)D!%O>DY} zm-IUEheHytIJ^x$Y>SWCiAvaT0tL%i1iC(K+%fA;39M&aD4s=s*l<<^%f=o@GgypG zn`rry7H17wa0O z9QkBwIt)tHOhT=YUs2P7rIlOR9jz3P$v}+QHawRj4WzOg^)>-}oD$TUIYmAZ zFB(+|m+OS<3B6|((Q&4x$%{X#>tJ?4{r&ZqAs!0m&+1m$-jyp2v$vGRqYAeRou5?l zx~>O6Y|T~&C+wLGV2ssYTYkn=4oub>!M_GGCS++u?NOTWwiK};vD*{yxAummupg6f zA)Mn?Z8X!gbbMAmP})B!AM`Z26=TI=NKTw>0b{LNhRG@ZMlOF#d9SdL1%M4f13Qg$ zE2%w9iJ_h;Eg#sQv|11iEm>S4N($mm5|8eyqQ{tp0VC&dc#Zk8&*CEVn9J1FC9~4) zumS8OHwX#&D;uCqn`IeEMOIMLImt5}Lp{{AdYLXem0h$`0Y|IOs!UtC+k~8!t*EJ_ z#YdV&TRzAp#*KfNv|bM_bYTF=xXUkq)7 zlZT;x&ZU2wZrT7e$)zd0@ zN!6Q`v}QHrQI0eWgpRYh zy^Ba)#v0N<9*jJbLWju5rr{`Fynnv;l15?BSeD#VPjB0s>Eg)CP;q`p)q6VUre(Ow;_f^Iv$U8$)uPlC38Scy%RN`dVLb7`vKmVQl$&77QZTRU%$G$X zJ1HoPB|`;E%cR^)xS>TnbKh&fBQcblX+Kt{ zt7#4At|IN2DZ_697BrL8aA4&2+Mfk0=$?N!UDI${Ug+pa=RxFX;P5n#M)%bJ9wd(| zmfugl0kk$R5VP%*a2`PIo>8!Nm{rkr9%xhMMpN(eGK^$J?Z>bm+4j*zY{wKax zqJud?47m!{*sq1a!s;J<)vvdDo>FgMT#ZyZms-fdxz8lKou{l6Y3t{pE7c*BN}PX7 zZ|Hb<<1qk5y3>B{P{A8J_e1d7DP`3@`o;*U>5q53`?0|_*+?Se^kJfms-rYU64|QGmoEb3z#)uz%63HcQNAt!PxAhAWGQ5smTu~; zC`Gw|ib7dEhYY7TMG4T?w;HLGdt`sr3gT0rT)EG6bG7K74r(7#>t8=GoN@A6ODq)I z5LNO{l%VUNP+Mw+{k#p7dQz8k@yXDvlj1Jgn!N_2Elp9ZP0v2gXIZ^0%&~%w`QY9k z%(bQy zSvDQ|sf`|{vC0BP+UlU&nF7Z}?#j;anhGs~WCd!MCB5AFe0C}MxiMoPE|Q3*)(;doRl@`u$9VQYHZ*=Ax2grHoU_)8v1G{VG^B_Y=1V zqMnS-uI5t@zIv9c(%FP|{aPp$yxB)S@w9q{<}r1S~q$0!;ed&MUt zm*~gHo}l(bE%c^tclm!Bx6sSVk$MAFcwWE>VS6%&ny zCphd(CQh9%6OSXGKk{2N@+%Krz`znufAzc~zuXyXYxukkK_^>JAM3d*0;LAn7opTM zT1=ei#W$sva)rD4<3uR|NSzP*c~<@x8{M$6XJh2|GV0JlpWp>q9col zzG33S=G-K@f~efAkFagUjBMRbGdOpk^|b*~&w+(4qA027Dk^(gN}Wb5B6)IyX?;o* zPd}8fr=Txo?r9lx+4Yn9(Y%R{I(_CLbDCC5ahhC@{-LQM?2?Q~N_U4j%|VA&@$=d3 ztiC?J+0xD<==6VuYjnM=M0cIZbc#{Nxl*Sl*_%~r3RsbPp+=1Af;QA-jF={eZ-U=& zU|K}eJTB`C6ZBFM!|Kccmo^ACJ^8$##{8{5^dRczFKg(yWPH1?!rx{`0ILQ$(qYN6 znZ|FWu4*G81TQ#N4h{;z-YKdMkOIg>$56SKKBM&bc5mKXs%0=RgW zJ{SQZfBpmh{q5~9zrX$YugbmoEd>*8eEa?9&04)#8=`r0o3lx)x8I-t{ju-*d*7|! zcju1(>f^UP{@#zj~1u&v*4v2T%r+@|$=(u@2f% zpYP$L{$1L4Sho)P`1d^ieqcSA3YIBt=Gyqg+E&xK)-H|hNhA0v^?Yt7e8vx)*JV$6 z8TVtU_AR-XU^{Z#<-O)}`g}LL#M? zk<2ypylIzbmJdZ~vuqz8!&-;0xAuk~)!6!}Z%ZFv(DPo8R>T3Q51cy{)qARy>yFjt z`Fu5v8G2kCK36s=z$V$!7jGv}Cy`G8e@_A4*)l4v>z%Vtd_w2i)*Gxo+P+$x2|oaJ z0CW|EtK6$@0F&sV?}LaNwHpcU*K5@oWYMZA(X`xpjW8qjR7 z10B{{CGSi*6c0FNuG|S=nT1sb$tn*{Y0{qF-jmr(NYNr=#`^>7Us}#{Yaoe@`?$}!xsF4S;48Y?S&|t%7Bk}N3Tox)g zpGSM?a4}}gj?Q!*`@2$MOEKv*+})0*)Xv16e|N@@G|?HyxM3?&k4e47^(ihz-XSPw zfvf||gQtNb{cKiVOvw~cE3z|b;n$};Hw zG2{3~l9xNY)l_N$<8*LkN+X#bSIYPT=fyf=MfS!hp+zqAIW?iahG_EnmLxb?wY=8Y zUK5R|t%&ogr@xL>4NJ1-f3b{5wtZ%l9l2{Fb`xhv=$k*$hHemE1oXndA2b|>CwcBd~F(6vQJ(q}41f8|R;Pi9J(BH0Y( z1EBmxa#No4Dr%^sN$_-(>rwEo1yF-`zPm8E)r)a+p-!-AA!G_m01O+p{1)9y_T%(E zn&dhG6_0jl6(H}6CM^h1@qc6d8VG@SX4X&al zKQSPXbYX-BGpBl-e|QT`1h1w(V;;MCoq5z2?~Qq|AT;s^Z_e31+~vtJ-D&uoAUE>` zv*TQ97f_1{ckTX*;cL{L%v`l+BVv;oS6P#^56h`vxKK>d{PSO@0qg`3hCw)l8Q6^tLR|JPn=`w1e9flr23u+G_wW~4=g3B zKx#jjh2}Bzf`Urxlkq8MF8EZfb>9%VWHDN+aRCqQ|AfUrm52DH=`TjcNg?OgUyqEu z*6eAbY_Htsc3!5mDx`xhm_5SX_*b|aN_Ce*x#W?cfBlaR3d?mjelyluFg5(9=8d_{ zhSt&!g|sZ>v-87fEO(HLKh4JPHj_yMmePwZ?eTXozV)i7G~gJS@|w|rpQQ<|TsN)a zruOLFaNlBMwe37kC#v11j1Kl!XWCOSy~pGQS7|1-iGA$c=uTFHs{JDAuT`g#@nAi3 zZ+U6oU+CsQz(@)bI4NSUi8$L9S*Za$v50=K1B~*C5NVaZPAE4w;JGu zwOmQmWHixM@MC)S%CK`KH_9to8`;ak(xOLd9(%J*Era}}_O_mLn_-g*?e~IKf~1l; zqDnhE`l!U^fxw&4cmtg`o8PK&`YNVdLQ!KRf3+EXzL!lt&wB&oaviG{V?v>pl}$J+ zb+M51B?DTm;=nP!=HiP#&aOfO?r(8=@$DA&gT%Fq-z{ggkvy5Nmi$L_`F>zgIc|3CSmyW(S8<+QjP>L6N{-2_wu4zGH`W6gXjRW`&Z&IMhW^rNy|e|rhe?0tyPAR6K66t6Ev9E|WB&&2H-#-7 zOf63JBH#H;^O-QVQJJYknRVM_nt-Zj+1FBBTzmaqHgWCO!POeS7N>PDjfPbFMJ{$J7b$0amMKDx-Eby+6bqR=?&Dn zdB!g2)mb+VJsqXHCh4&qJvFkF1LM^eLpg>c+GjA70o~QT2ilk``QRwBb0I2|Sfe@b zXzx$aJJgxzplQfl8E)z5n=lB6@7-XZEh8b}eDz+5@x3vrN zWqor(I}e)iMa5uI+pl7em;lkB!_Ej@aRyA3p5D<+`r;nwHs8Oc+OAZ(;gX^!(;Ck6 zF6K2DE)QYpXxv0MvuF2i?N5-afW&e|ku87fR=-@tm`fU_5|>?w6K_56f8w7}vm8A? zNUCGt5E_Q>h>of7P%O-qsLD0w$B63QyIU8xpq~G_d1|;H>I`OP)!lWcrZiRKjX8!= z%LR5R|8SAJ-iE<;VD&4KnMFr4wQLxs>kP5Qm z``LyKqv)MRJGUdmr8Q@M3BDOoFQ&XOb3C|sY1MI&Lw{WCZ&-b@e>zI#B)GsC&Q+hI z#ifm*x46I?2}xvQI@^!^`()|ZKItMH8Z**QG1HDTy=zY*2?J`rWWq>DXrh@D8f=wRc6$?N3?)b8 zE=-9pUbMF@j%&+ae}`D*+gzVahSFhInRr{PoQb#fSnR}L*>c;HQB2SB9i!GAFSQT7 zV>w7w$%l!5-uI3N>3LzsBroXdlQ~MWYU3j_cEhh}Sx~q<((dxtgWzvbwj~fCOJfz9 zK_7$Du{+ScOVbZtT2h7!yq(u5hrJWD8WPc;Ot_6{Px2f-e>;FV47>?Ey_e@n4qHyL z4OsZmSLrFq{=>e>zy6eDZC_ozs3e$J7zqWzG3z1ajj4rSP`s9ksz<89v4XcICpj_WgA4*9W z)^p*YVt67;ILXjqGBi_bJXnFBQkx^h+ioZDJ!ykPT#`lN)X-5+Zd<0-UXj9jaOi+O z16CiKSUO*^DO%Gij{eFwz-kT>5qj?ocv*@|s>>*of9*YUP+rr!{;JjPC+13H)$-uN zJKvW^g95aAPLAhfZ*@W4K6vZ}?>pg%tuD!o`^f%#bRw1D@+k|x;lG?=@ZAR?3Xmwc z{aXFtwoW+V_mBe4+U?MfT@Mtn2o#9%Ay5q*M5CqtP<#k5D~^kp*#jn1TqBHLLmn7! zP6tXQe>&~Yu;2y$i#h6#r!C$B%h2ufrc?Wjj6Q6kSwh~=`baC^>DRa*Q6*gyFHpTb#^0fB{N^ypyxV8SlJwk2^CX5~-;mNF0aRy>gOrK8i z)@s#qNN_N+thSI|k0MAybx%XE8*j7odgDtxe*kJgmA}R*^?HAO@{$@)Be-kC(9QN( zsJMwAg4Mv2n{ILweCGVUWMvF)709aIf>o;rC(=D<%)`Wq&Qrp??2ojD zFuJ}*=r4j}B+N^5l0E@{tt`zH2P6zFe$Y54i15?+%}EfSwL?9W_P>Vs(x0C7bRtaE z2+kGQZ+~ev)Vuk$z;?ac323Xv-dlzM0J*iW9VYi-&tg~Vdnb8oFMRDLBJS#ML^3Qf%nz3b=<86S$V0jOj4cV-lN_WH#EmWBZ&+eKMPthJ(PR z)tcO$LMtPx-bvAn*-cN)E)FguIJ^F#n9EH zK5n*xF&*Ppipc+X6Bau8%oCwju2fIDmw!xGvOW$jv8a++IOT(eAOmkC0gy&$XqA%? zPd;=1N;o&4fAh<*8QvF@2MA_!(iO{X;`Y`D53}L;eE7w<7ETdqF$zkxgDR|2m+6D$ zn|Pu*I-YoRp^l*5{LL(Lii?X7u4;m3)))~@34+6R97QvPIT>zf$6H%RuIaBAv48na zkP2|;ah*U|Q_|YGLie%?&;v5TO{t44M*@9XDVGzkZn|^Jij8l&s0~;gxkuuU9^spW zjg-z~z+W=fGre@dpl{~kDii-&w@t}@@P_Oifx~h$lJ`iXl8q8w3lM@Ji z%03C4ah0`3-=uksAVt#ywL>4p=YNGS)prO7G}=XqLW%Z9f)MT~rpnxjypSwdO?Z+T z#(2VqD&i?0hGtAApbEhTvDeGW3jeSD0|IoX*`2nrA6Nk#Pbp)`{Cn zzMF6hZ@#D8)$(x_d$8`!fzX#!K;^Imhu2)<9R|A0m%vlJIf^i3+9aLCuM?c`!qUXO zPp3Aq#hqc+sO37g{9$ySzkjZL8ca1&3!jEt_%zx{3xmYe6at%WrV@}2BVopTHHOmJ z+rx8a*(tsp&~8q+qb7lgI0ABdxk0qDzi8ugc6xN|46nsW9Ywuk)Y+!}AXxpXD@6yJ zT_V}E>C@(t-EVnPbckCx_(~Y-HXz| zb~qa9ksu%wdDe}34%A;|_|baiVbf|PVaL-g*kkkN(VR@LAuw0XO0bh_I!z$cL#m%f zl>p3^!x#S9R;Y!3rWOq!#_hilci4!H;|a^!#4q{4iD9*Q+@kwfV3j0J5k=5>M>iu0wSVI4phuF6i?y(ZM4a#LIt#HEIc6U`0q$j9KYb>ed&3uCk{$O~ zZYH$ai@aX?0-pugJwM~v+ z)?p!)Q)wZQw}07QU{OOCc#_a-=$Nbve#VzbUE^db-OcQzlH++F9o6;dWW2#Cu$6_E z9_FIO*w%nwmiJ~3L@g1dL()ldfVp)HtQB~S7f|@~x*W4>mT9dPHJdEQdmsT=da#;9 z(o|>HVCTM$iB0Biwy(sKYxS10VqnpuS!bbZB|TblG=GkUXEW&1dN%4$nQxwrL>7?4 zWn+tkR*6Tiu5B-jgm@vwp1XdH+h0b>o`p)_TXMN{BD#~u&RGd}k=e~g$(f8ffY0O( zhcL)-#@_l=#S3GCw7Ff@x5k`-tpveV!eI0aVG`pTZqU#^IV{Wi`)nzSDatAY#*Sx_ zMhKHEynn>Aq45Q0xS7NDw&llYw*?oi?oB_w<-Pi0S@Iozc|llhzI#&~M`jH`iUtHe z&2zOfr&$J3|L$YcruL%u%_tL1Z#Al_e2H)vldI7iq_*l#a#E$a<4G}>!!(PF&q#L6 z$1z>ZIm|)j6mq^nBuYwJ>br)1m;#-uE~a7(k$;gxSUz=M`9Maf^h*H`Mg%+zfhQH` zx`!=>II&yY2((hc&G!j8PASlYqu@_w2aQd9mQYXAUwk);*G3HGDq6V~72(BUmYunF zRuN?4+dXO3&7lbzZ#o(^V8i+>#Tw{FM`q=OF0(-%O?|6e<61nOA1QR89MEDrhaDOzHrd$A@Hi zh29@C&lR)s2hqAvNhX?595*08>zr~#oqzbKNs|t5=io=_rTaLF2qLspXpn?vlnun8 zTQ_mlEYn@-lsF-xi8_8p5JI?8)R>fY@!gCLW`4Pe*QxX}&|*f%>eF-ma^D4tW&aqV zpR_SQ@}k!mJmC=8_s;MLPc)XS=EWueSXpzWkfkAs`i_8=fKBrNO^~~mk;vlo3V$%1 z`L^> zJva64o_l0lE=MOm!qPtMMOAvJ$U833I?ybfYP;!Z#_+6a_8c#lR_Rnv!4miAtRl!@ zk$o;Y-D~<}VMSFUUvh0F$X2*w04;g>3C|ioJ-2W#0nPz`zkGvG!3dN|XAqk62ZEw* zpUuE96RnTKV7)WbJXqf&8dlrMw+tYGrjkfeAvjRV6XCh0OeqypuBK)5Eb&Jh#v&E$ z{yoEytE(-_y|FF2R72%=8r?^i&?z>lgq9-kFA7y-MHQW?g;f+&OtW)TcER=0nI7dg&!DW_~>h zs>f?YUnmKB0(*g{!Y_txh_-m7%OgT`Bj9DTw2M}y)jnUAFR71J&ubo*4@#^?BWBQ6YA$$ zB+mdTt)1!D?8JKgB`$a?DS}xTsGuyfebus!x-8n_8Qj8@O9b)@1U;%}^nQ~3sg}Qh zCFpj4_56uaeG<0J{K06AEly8;mKJNMFTTO2XWw!)iy+lWGC$odEjXzo_d)APa(yLo zpef{|{FAw@w}*()TQi1LjSz zVvqiWRxSWadXj6DKlR;5PNzUk7}jZ`^1f>8=GB|(#a9>vXEqR^XA*n@%yub$c5T zvQFsR2lx8=|Mf5b0551&ESKSS0TZ{~GXd~c0W_D+iUD|kXEx_zvTuI#E*t&!>+8Qh zlrrB+xuBHy`+v>;+wFg={qMB@d+z@p@a_T6pP&Ez>p$N9?HBLOziG8)l~pRez3a3Y zrK5d&H+l;$?fusN^xl`++tu##UGIM$L--^IPy~?LipYLTrummQRC5WYs*uK#B z@xp(QFX)a{z~Zj2NhOWiSZ(+yRsQ-S^<%5+L-|bYm#;(Wze>BIwSj~Bd=D@<@3FX| z4gZ;;mSNPcj+eE$&x52@-C$~5OA}!<_8@-!(TS}L-Wf7gTyN7!5BslmHCz9qQov6O z!+U&KmXEK#u+l)8^{K-hc?`iBd>$DE!b9?jc5;dzoz!;D^Ffx)V~Z9@v%P5xjP*2f z0$hmxUB$(`H+>+b#vmlurzcz+oV?ACIs z<15SRfYfR`&ta=(k$D5n__j~Ux2aWd#ewwP7Z!iekvI@K+;=BD?LP?5sZ4N}ae@hM zShVb)?KI7cqf512k@@GhK@FcDo;=!dmtleH^R`TdL=1eGK=@F=l0fP(CI{sbnd}qJ z^P~L3$Ic8(&jGogum5m$VSim6VLz3c-sSbd-EO=?a`D5w>$^MigSt<6d(7teT#85n zwXt3LE3(|Nea#^RJ%CYpKQg#FFvd5q++NRzzJ%qV>4SYpgA>|jQ}vDd4T^m8PIPR^ z>CqWr2OM0g@^2IP@kOMec4!O-hU4t4@O?{9&&r7no)D3odf)9_aDQzgZQ1f%Q(KU- zzl9~PW!bJEpRu+-p7L0yEa(?d=VBS@r?AQpq0`gzsO`s60)+x#nyrn4c&xH*N0zdO zeqwF??=eH|>Ws^8EI*GzSWmN;3}0Wc|5O#JfC*M^1zl2_{=#XoF6^C8zFe^KiJIJY zd?p>ovq7hk&hZHqj(@!CGU;>*=%y+lF_$OCl5?sF9f6z?i@v)cM(X|sZWTbN$C7Pn zsSW|8ucO%hu)RHr%0i&>FHC}~ z5#hQ|jl7)GSnUU-p{l~`$aHue?WR*OX(t+(qXTjF==+b-rlkBEzqycd#Cliz8b)I? z*U7|Dz3ZH|eOk^;U!ciN7Fx;hDZMyK>o&iy@ynxh@np@c-;&DF_9aWOWRXm1ST4Qo zT8|e2UwJP*~YAF)6`&8O<-!g#BwR7m0xe*-p8OnPlRH$-KjV_ z*D1wA&rkSwY%rN(-h1tln_tsT2omjtiFV49yZVt0@qbFhg$C(&T6IczeQqNEVDln& z1k!TTd5?p0>TfMP+&%ugBG#C7d)hQA@mueFH10prPd>HD+b*C*gLOr*)>9P>bX6wN zpPdm+YX&7o5&hryQ!kq>JLkeem6T5qzwPoz^lajqn;S5V9i&O<=d#- zY!8pB6r!e5_a@tygR!i2DI=3zupyjZ< zz>gZJw6A6^cdc#(zFhm0$V?OEmvvlXmz_Jssei-C+3)g{HplsBoZWl~!8M@JHISZ3*GiP5X*h?F|4UH|m3;UFw-hH~D25%TW*0_rv%P|NSX zau-$mQ!M>OBzu?^l(E2JjuOA|DU&f+zYp3kv7qO}3XJC_x<-n}w9jd9A>-(qBqSSG z#Vw{LsalWf+{pTC3C@Oy;Wpv|Qbmtj>(?$KIF3rIW{|F+uZf%MX(+9O1Z0I)_`aO;;C(RkF*j~y)n+bpurm}Y4FD8(GzO3ur$V| z3vG+=n{@3JAq7Q4GHa$QQ}4lSaUa}l3%fEg`#ce?n$AKs`rr-JJaPSym4{9uUwbE? z$Yk}#8exK!gtZ&2sR&(X7EG24KY!+7XYr@DyZ{@5I^F@WFjRdKqb}~$*2J{`>eGoY z!A>s5CL?f87|_5u;pxCRd+#W2I$}T^HsoPJ-1%tVk)^O^eo@&lf;IW_R+4#AXE5i9 zI$OFj_C#F8!ob#bb_=!+XYU_#r>@HXdKlO7p!GGA>7~Cp5!0UT5e&*Q?y$72ac_;4Y%+t{pC{whfKq~ zv(XMx2E{QATp6lP!koQfSbxoWOZ$>c>ri&Hw=o8<+-G3igaWs8b247P}V;1FWXms8EiM zXA%>!*{ZCl7=^JJsVnSWB?@9P2AQxDd0MP#AVc{N)cJkSa!8kjMLuR!)AiXM$ExYk@b zkjY9oO9Yn(0jYAMPCzS-wDPrONvoh;3ylq$OnEwKGEnwW7|JQ$vBJ|ble8x7(dP@i zry&5q&Rh{rwzOAFRtIQkI7Y^&I3!}7(7#)Il0ainRlFd9C4Z$2q*3MEyQBf7pPZ^G z|Ai6{*7}*!*(7>Lbf+r6y9K9UIA*ewp@zJZK?z{vVi?_wh(HnMqFxbzjTm=PpEj)# z5vH+YUNLfF)Q?(KBmikE_P~ukgpo*CBn3-Zb>x%RX4_Xk z<}vii_t2*mgl^%^{z<%2g_*w8(NW8tMFpjCKiYMq1gp|y%`~}7lDm{Nhz+=6Wberg zb;Z(TqtRNcP_?Ch4*w#pYuZ!}`*u(iZc&Xs`&nnUlz-i9J`_)!s>U)vr=igsRJN>d znh-dt#PvM|KDLk*#x829#pi{$ZIdkekeG;GdK=GVVN{N4ee+<$NCe9G`zEwFFN3v! z-ZIf`BnohG-?d6#e1D@u3|*t9Hs5?2H<#nJf?#u61j#|;qw6u#BLm6^As1xsPmop~ zw04oB>wf@=RjDcIKI}Uqq#&sXv(*Xlp2%Sy#J^7Y>rv3$F;_c=8Xs9SHSJo-N#o3k zORLrqm)uc_qyA#(;%|=8?r27P*YZeJYpY26!wR5z-@fSEGLvJ%P6jorUOo;GY$;j0 zwRc;J*>r2S3$!89L6*%{YO~f8(CHyk!}_Gbu79(d&UugTI{JMlyBx(&(iMqYrw?ex zlgr0UNN*Ip@()g6vqqqcQY!`Q2X$Zb3Do$@;xTbPU7;Q4_3R z#rs~0T9`8n22Ytf05%$G`XTkVPbac8IF;0B$-uA@oQb%W!g>TeH|Pizf;*PxQkx08$R(Xl$ch?x!WfBd8G8!^h-WyLg+o3BU3)GJyDfO@@tDT| z3>eW$6o=!|Om;#}2P(f*4ZXh?0sQk)D@i}U-Z@;Xl$PR4M-;eU&T zHdq&?;jgt7A2+khI_W20NJjPV`;G?syx?X`d)44i{fvm`GnyOGgO+P z@P$SSj06G~*NK7kJ*O=sb-<9v&=b@*kU0~#JWw9`MZCIaC^dc*;h)?gi%w%d+oUJ0 z-0Rm*m{#jztOztfs0_46W-$+iMSoe7WFV)(DxMxPQic+L2h{|IIx$Y^sjhptz zND3Xb1Y>#-lV!kC)P_$j@=+6*(V@=QCq0)2`xcL`59>(q4y_%Q>4K(ffnVnUv);82 zouRiFqS}oV`tbtLVnB@;hAugcHl=tGf?RoYx`p?Sy*JmWlB>R%2b=XuMt^nZFm4Ez zGpybFt{(3S?6jLCbc41NCT9{Dwf(sPptU#nDJt5=LM(YPHZA(a{qWtMy1!t2*g6r; zfZ@xFCrfVV37HUm{*Y2hDDjY2WMS4w`zPpCzFY7Y#v67HhmZ;<69NfltyOPXz8i`o zjuGZwlrgliTTVWhQz0X6*?&c^Wt(VNnj}M9nz9I-q#4(B+>dFK;(2xnn(Rk?pJU|q z;^`!*jTHmXhNl5rd6haK9aMd zeuqdmE7|NX^nKAfj>ZHb;L~zL(TS~|7hDB@V#(&x=~j@@o;b{<8QPU&SRgwYx0VUq zdcq72`PN6`vMvW5`SvDcnyyLLh%{PcqBKXBQ}G8{W46IsN0Myd4dIVEja+a57Uuz1 ztTB}wikL8P9tF{iqklLvvL6;UAHMZJL1dw6jNCGVBi;S=*K7bL=%}MaR|3_Ka8h!_@WP&O0wOO!#nEGczou&Pvrnssl z231~0Jk}2G1ZP93m4chpG%O{uXeBWE%HTD)cY0fQvtSIpRv zatE4Kg2iA4QhyYrgX+-JA40l6*rf-q8=7k2t--t^V4JWK7l*O0o#`j(MG;)uV}oyE zg&@Rt?II?y)e2&rpiELaz&@a{8b{6!7)7ah8rXcR$=iqkGBbb2m{6J0Sxm4_6wz8) zWoE3h%)-v7-=Ag+bNc=Oy7+>KZYk!kM&0Bc_T8vBq9}M{h2LhWD}M;hpSLWKtPt9NCr+# zW9N|?(l4$akxIbTcWQ8CNQc7z;SU#ROXrlz=~lZI^~l@Y^kB|raV$GQb#^* zU|``|BYzBHbTi|Z+6b}hd8EDwqBo@VT(0;81>~#(_GoCa)*nNvnP^g)nuX2MHM33xLpd>ZMXNj{tFU-{ z_KI>GEOvMwcxF#w0@l$uwRkEi-LW{BD*rV`k$?0lqc}=TEIH}BAEZ_9iF!4r+tq^{ z)rH2UnQC@xfEI^=t4~4;l3JuNg({CVG)4#p7=w36ZfnW)PTclA?hhCMnSHi`{;q_XruXE_XKS_Ro`dgqWJ z5iyY9p=XH@6EgU-{gtt4t;HeG*7BHr}qKUo4X?$;OE9>YNR_sCVOxS2hR&VK@2j0mEWTBWRmzu#{k$)0& z)AIl^qdg1fn(t!$i=vC>)KW@_W@%3^PHjalEvAUwuA55B21KUl3QOJ1CSF4aGc{ryn;mF=#86hiEapr5Q$HaH}OT zg$wY3pOb@{VnS;Ac^AA|s3<}dOguxdc5{^2GbLj%@lSjQXkGXY(C&Z= z?IZ4^88DvzUzd!DY6Z)J08!fymQ0q>ND#6B0&Uz2`x>Y)ynm#&u~fE`U>MHtn_SU1 zU@NY#tEMrSw#ARK%hc(G>VxOLTpVDR;BRJcX~bgVnE2Gj8y5pYJt+%{O$3lt-IQ3K z-s%fCDaBP1!!}%M{1xvS_yPXjT6X0J&5~_TEyewsKMD!)uYIV}dk;pk;R3S{CD^%u zW2t8X$>`f~A%9WGla1FJF5*5A!YS$0c%6O!u!98@fUapmR;D1FtD_)=+0_zFuFGx_ z`EGA%z@Ndu5`H%0n`tC0v^ueSSW*y@s>9P;DUyX?>O6%|WHIgQ^0EMv9o+4~D_d1l;RkO5qX=$v1{)eXtBGYbGrQhnSh4ouqLAuT|I% zbcU%Ub&uks8#>ZfBHWKU~Bo8QN{rjx5%Xd$9n-VmyjU>I|9PZ zm(3vpA%FWX`1||EzyI;^m%nQN5pFr!pd&Brap zpmgbLAH^@7Zbs>7k53`qT#m|=5`X#YKitQE{D1S~Z^!>)ME)b)atJntG9X?(#hW(P zW*k#&{VikgWo-5{-pepQe>rQ9Px^SMf0u9J&W3zUh1YEwoSTMyl=gRcqoCviCeM|( z?hbV_wpGhNfl6eZC`D`KZ)h%YLZw=5G!hX*pT41a?BGG(KkAyOV<|o|`ttMnu;Me;glj?Fsd^yymNXlz){{rA-sqz=4hM~JG>_M%)Im1w$>PM+Nea+KGk>!y42DfK)VIA(eFGC;JJmYQ*0!?mb2EpQ zhVNqUOkFXTIU{*BGLk1&G{__LRP#-NPwR>VC|hPl-FcIBX*QCnN)Icg$00myR{5j! z^yZ>HgcJym7cd6)_JRC(Y(eGNnze7dT;0C?X&J*8+t_N75RD#_KlSg?b_%?GwwLiE z0v7>Uw+SQy+yMdTm*yn`-~qRn$0hRory_oT6>>Z%bBxH`?nh> z0=fZzllV~k>GX!$@86KR;2MLd1;jWDO_fzjLy+^JeA7u5vWkJ(V zNG|GCUooMZ*Rtj}`WL}+4E+qG8b(l;Ze13CV}k-?(MIg=ogJ5Ea+%j!(;~JOM`gqK#p-}lVl{nz;c(A18tgEO?+;OnmP#<>A@E%o=$xneR6fG(XZm1G!FU^Kb>g?MQPPx^=OUnt>}fX zgW{)yVW_$db6v5TfJxnD2!LB|GgTIhps*xaQ+bSACne5P7V~|MRv+52e)eW<2~Q!u zbJ#$SjvTAeC~(u!&QsY+)eVvKndE|ha7*e@NT|Au+0)x^)^w73MH1Fi_k@41e2Kn0 z*GaqBFD$)`*ZenW%0-e+W>wN#Ajq;Y9`$)r{Va{c?(~#r7WYMxxz2?mk7<%q(9s$$ z109W$<7(4}8-a@Bw)#HOBAt95k7Cmf{N@ZqppXfZJ3~75{Czk%04F8Rxe#W5wMR4} zz))~v(z#?7x^E!o7H|7CgrTcK;KZ36_(aiA1oq}npS;Hu-r1=eyFhPmb^^V<71HrD zE(A~wFB#na@M#PTnZCQ~3_gblq~WNn$O7^$def=vMUOk*cfmv!%f+@WN+Uo&tVSJg zJQAQ^fsgFTRW@SWNMbOm?x(MR9kQgfaS(}P;Y@b+mx7%?;u1;}`%H7h2bH(n(xIn{ zE2z?5QJ~-0ShVY{t|AAVxYi2i4?Z`E33WJsfH;-`Far^vS0u%sU8A9$d4wcYz6MK@-EbteNM&w`Zmx znKMX1=+(XH-jT@**Hr^X-tpm!g4(C(2 z0s4o9Z_G`ywo`(bSGDbXtuY8s{iu#I^fkZLqZ9DhX40$<6Ycv zybHK#$xlhg{(xO)^&)*^8h+iwdO}#W9wp{qAN)C1i{R>W2td4vAh*t=3zB(KtP5j* z>J!OV69^Ydm9P#_7>tst(e2cGs9dCzD&9TlTwf?Z<33x7B>>0;zS|d`Xk2^ePa+(% zus3Mc2H;Q%TH;%OIcj>k8FwFxELe&;4|?>Njv)?< z&C^&sw{*`1+6bRzrUF;KsVnH-tj3eQQrmj-gKA#ie2lSVNdmj4TglA&CgkV1|YrS5dH8T zo@>D1o9QWY?e}v&jy^*h&)BuSH6n9hk>177{~NPt${5(9M_MjKiS&*>HyhtbEQCS} zl&+2HYzVDhWUiU#oQz?seP}o)sk`j&=bPJ|gT7I&0{9A$-NI01YhwXBYv(^P}D(d%z&!L%6(aeR61CFf9$X zH*t|k(=&$${D0CM*pu{o!83k1v^t4-q)>Mv5QkCZBB35NPn_A z!TU69T|jz(>pgZ@e&7L0MeeD})qCQ{q#r*Wn~M7Zf(+xI>22%8=NXtf;e(`#V!Xd) zT`qMf357Qut=2tqQ(-=Q6D^W`NA1L_TZo5AfZ7Q;$(=fJk{7i+JfE0s9PV-qJqMPH@OHKpS6vGr#Sm!W*+8W$2Zk|k z)zcg|6EOxL@a7Me4mRf?VlB^7e9A+AvzaF-P5?spvy?}uFZpJsYAL8^muXJy!Rq`?732Za#A8^lWMyf9&hTce=R zNq7pH!eLEa;4mS944}l*R&ydn#5u5LX=qT8mN0csR_0lxtgBVZE<0~m`CYwi9&$6)pFxs;F?xo#aH1qCbH7?{ zyKqRMQwpu#-a5?(FC`r|YKLO9-fdJV_J)IHyx-nhGS#72-(OfRIiSPn%^SR%Qqt1l_=(!_e{0#O|(*p8)NuII%;)4j8*T1VAN@#Me%z# ztE_xUB;S+I?06}E7WFJ}3jmD2o|pf?AMW(p zEpuY(;`tAMbG<$P0Zejo{uA#AcN9Oq%wVC}5iNl<+!Q%OLDmmbJF=Ycd0}U$kr9*W z|Ag9fV)AAQA?eV^rF+zdjokomrkf~`65{Ou1M-FvUQ15V4d~YdR1NQ5p31w!yDq~O z@9-Y_#j_T-(3o95PrJ1Fw?ICSpGlwv4OiT=W;xS;L-x#2XLmWb`aXesW|F{`N6z@* zSO%DYLaqbFC(LF1j_LuE!4nj6!UUMeaj%0D4V&NHEx9Gg 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%0A)#$m)32d*LcvnI>} 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